Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import math

def get_continuous_operations():
"""
Returns the MiniZinc code required for continuous correlation propagation.
Expand Down Expand Up @@ -55,4 +57,40 @@ def get_continuous_operations():
int: n = length(int_var);
} in
array1d(0..n-1, [if int_var[i] = 0 then -1.0 else 1.0 endif|i in 0..n-1]);
"""
"""


def active_bit_correlation_expression(mask_expr, correlation_expr):
"""Return the masked active-bit expression used in continuous correlation products."""
return (
f"if {mask_expr} = 0 then 1.0 "
f"else {mask_expr} * abs({correlation_expr}) endif"
)


def piecewise_log2_approximation_expression(correlation_expr, scale=1.0, else_value="0.0"):
"""Return the shared piecewise linear approximation of -log2(correlation)."""
scale_prefix = "" if math.isclose(scale, 1.0) else f"{scale} * "
return (
f"{scale_prefix}(\n"
f"if {correlation_expr} <= 0.001021453702391378 then\n"
f"-19931.57001201849*{correlation_expr}+29.89737278555626\n"
f"elseif {correlation_expr} <= 0.004151650554233785 /\\ {correlation_expr} > 0.001021453702391378 then\n"
f"-584.962260272084*{correlation_expr}+10.13570866882117\n"
f"elseif {correlation_expr} <= 0.01359667098324998 /\\ {correlation_expr} > 0.004151650554233785 then\n"
f"-192.6450521799878*{correlation_expr}+8.506944714410169\n"
f"elseif {correlation_expr} <= 0.05399137458004444 /\\ {correlation_expr} > 0.01359667098324998 then\n"
f"-50.62607129324977*{correlation_expr}+6.575959357916722\n"
f"elseif {correlation_expr} <= 0.1420480516058986 /\\ {correlation_expr} > 0.05399137458004444 then\n"
f"-11.87410019056137*{correlation_expr}+4.483687170396419\n"
f"elseif {correlation_expr} <= 0.2463455066216964 /\\ {correlation_expr} > 0.1420480516058986 then\n"
f"-8.613130253286352*{correlation_expr}+4.020472744461092\n"
f"elseif {correlation_expr} <= 0.595815289564374 /\\ {correlation_expr} > 0.2463455066216964 then\n"
f"-3.761918786389538*{correlation_expr}+2.825398597919413\n"
f"elseif {correlation_expr} <= 0.998000001 /\\ {correlation_expr} > 0.595815289564374 then\n"
f"-1.444862453710759*{correlation_expr}+1.44486100812744\n"
f"else\n"
f"{else_value}\n"
f"endif\n"
")"
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import time
from minizinc import Instance, Model, Solver, Status
from claasp.cipher_modules.models.cp.mzn_model import MznModel
from claasp.cipher_modules.models.cp.minizinc_utils.mzn_continuous_predicates import get_continuous_operations
from claasp.cipher_modules.models.cp.minizinc_utils.mzn_continuous_predicates import (
active_bit_correlation_expression,
get_continuous_operations,
piecewise_log2_approximation_expression,
)
from claasp.name_mappings import CONSTANT, INTERMEDIATE_OUTPUT, CIPHER_OUTPUT, WORD_OPERATION

class MznDifferentialLinearContinuousModel(MznModel):
Expand Down Expand Up @@ -117,8 +121,7 @@ def _build_linear_mask_correlation_constraints(self):
cipher_output_id = self._get_cipher_output_id()

active_bit_correlations_entries = ", ".join([
f"if output_mask[{i}] = 0 then 1.0 "
f"else output_mask[{i}] * abs({cipher_output_id}[{i}]) endif"
active_bit_correlation_expression(f"output_mask[{i}]", f"{cipher_output_id}[{i}]")
for i in range(block_size)
])

Expand All @@ -141,28 +144,10 @@ def _build_difflin_corr_constraints(self):
self._model_constraints.append(
"constraint sum(array1d(output_mask)) >= 1;"
)
self._model_constraints.append("""
constraint correlation_log2_approximation =
if differential_linear_correlation <= 0.001021453702391378 then
-19931.57001201849*differential_linear_correlation+29.89737278555626
elseif differential_linear_correlation <= 0.004151650554233785 /\\ differential_linear_correlation > 0.001021453702391378 then
-584.962260272084*differential_linear_correlation+10.13570866882117
elseif differential_linear_correlation <= 0.01359667098324998 /\\ differential_linear_correlation > 0.004151650554233785 then
-192.6450521799878*differential_linear_correlation+8.506944714410169
elseif differential_linear_correlation <= 0.05399137458004444 /\\ differential_linear_correlation > 0.01359667098324998 then
-50.62607129324977*differential_linear_correlation+6.575959357916722
elseif differential_linear_correlation <= 0.1420480516058986 /\\ differential_linear_correlation > 0.05399137458004444 then
-11.87410019056137*differential_linear_correlation+4.483687170396419
elseif differential_linear_correlation <= 0.2463455066216964 /\\ differential_linear_correlation > 0.1420480516058986 then
-8.613130253286352*differential_linear_correlation+4.020472744461092
elseif differential_linear_correlation <= 0.595815289564374 /\\ differential_linear_correlation > 0.2463455066216964 then
-3.761918786389538*differential_linear_correlation+2.825398597919413
elseif differential_linear_correlation <= 0.998000001 /\\ differential_linear_correlation > 0.595815289564374 then
-1.444862453710759*differential_linear_correlation+1.44486100812744
else
1=1
endif;
""")
self._model_constraints.append(
"constraint correlation_log2_approximation = "
f"{piecewise_log2_approximation_expression('differential_linear_correlation')};"
)

def find_lowest_continuous_correlation(self, fixed_values=[], solver_name="scip"):
self.build_differential_linear_continuous_trail_model(fixed_values=fixed_values)
Expand Down
Loading
Loading