Skip to content

Commit a0c074e

Browse files
committed
OPTIMIZER_REPORTS_NODES
1 parent 2b368ed commit a0c074e

11 files changed

Lines changed: 41 additions & 9 deletions

File tree

compilers/concrete-optimizer/concrete-optimizer-cpp/src/concrete-optimizer.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ fn convert_to_circuit_solution(sol: &ffi::DagSolution, dag: &OperationDag) -> ff
318318
global_p_error: sol.global_p_error,
319319
is_feasible,
320320
error_msg,
321+
error_nodes: vec![],
321322
}
322323
}
323324

@@ -332,6 +333,7 @@ impl From<CircuitSolution> for ffi::CircuitSolution {
332333
global_p_error: v.global_p_error,
333334
is_feasible: v.is_feasible,
334335
error_msg: v.error_msg,
336+
error_nodes: v.error_nodes,
335337
}
336338
}
337339
}
@@ -950,6 +952,7 @@ mod ffi {
950952
pub global_p_error: f64,
951953
pub is_feasible: bool,
952954
pub error_msg: String,
955+
pub error_nodes: Vec<usize>,
953956
}
954957
}
955958

compilers/concrete-optimizer/concrete-optimizer-cpp/src/cpp/concrete-optimizer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,7 @@ struct CircuitSolution final {
12411241
double global_p_error;
12421242
bool is_feasible;
12431243
::rust::String error_msg;
1244+
::rust::Vec<::std::size_t> error_nodes;
12441245

12451246
::rust::String dump() const noexcept;
12461247
::rust::String short_dump() const noexcept;

compilers/concrete-optimizer/concrete-optimizer-cpp/src/cpp/concrete-optimizer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,6 +1222,7 @@ struct CircuitSolution final {
12221222
double global_p_error;
12231223
bool is_feasible;
12241224
::rust::String error_msg;
1225+
::rust::Vec<::std::size_t> error_nodes;
12251226

12261227
::rust::String dump() const noexcept;
12271228
::rust::String short_dump() const noexcept;

compilers/concrete-optimizer/concrete-optimizer/src/optimization/dag/multi_parameters/analyze.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ fn variance_constraint(
330330
nb_constraints,
331331
safe_variance_bound,
332332
variance,
333+
nodes: vec![op_i],
333334
}
334335
}
335336

compilers/concrete-optimizer/concrete-optimizer/src/optimization/dag/multi_parameters/feasible.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ impl Feasible {
213213
}
214214
let compress = |c: &VarianceConstraint| VarianceConstraint {
215215
variance: c.variance.compress(&detect_used),
216-
..(*c)
216+
..c.clone()
217217
};
218218
let constraints = self.constraints.iter().map(compress).collect();
219219
let undominated_constraints = self.undominated_constraints.iter().map(compress).collect();

compilers/concrete-optimizer/concrete-optimizer/src/optimization/dag/multi_parameters/keys_spec.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,18 @@ pub struct CircuitSolution {
117117
pub crt_decomposition: Vec<u64>, // empty in native case
118118
pub is_feasible: bool,
119119
pub error_msg: String,
120+
pub error_nodes: Vec<usize>
120121
}
121122

122123
impl CircuitSolution {
123-
pub fn no_solution(error_msg: impl Into<String>) -> Self {
124+
pub fn no_solution(error_msg: impl Into<String>, error_nodes: Vec<usize>) -> Self {
124125
Self {
125126
is_feasible: false,
126127
complexity: f64::INFINITY,
127128
p_error: 1.0,
128129
global_p_error: 1.0,
129130
error_msg: error_msg.into(),
131+
error_nodes: error_nodes,
130132
..Self::default()
131133
}
132134
}
@@ -216,6 +218,7 @@ impl CircuitSolution {
216218
crt_decomposition: sol.crt_decomposition,
217219
is_feasible: true,
218220
error_msg,
221+
error_nodes: vec![],
219222
}
220223
}
221224

@@ -260,6 +263,7 @@ impl CircuitSolution {
260263
global_p_error: sol.global_p_error,
261264
is_feasible,
262265
error_msg,
266+
error_nodes: vec![],
263267
};
264268
}
265269
let small_key = SecretLweKey {
@@ -315,6 +319,7 @@ impl CircuitSolution {
315319
global_p_error: sol.global_p_error,
316320
is_feasible,
317321
error_msg,
322+
error_nodes: vec![],
318323
}
319324
}
320325
}

compilers/concrete-optimizer/concrete-optimizer/src/optimization/dag/multi_parameters/optimize/mod.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ pub struct Parameters {
6060
pub p_error: f64,
6161
pub global_p_error: f64,
6262
pub complexity: f64,
63+
pub worst_nodes: Vec<usize>,
6364
}
6465

6566
#[derive(Debug, Clone)]
@@ -778,6 +779,8 @@ fn optimize_macro(
778779
continue;
779780
}
780781
best_partition_p_error = partition_p_error;
782+
// retain non satisfied constraint
783+
let (_, _, worst_constraint) = feasible.worst_constraint(&operations.variance);
781784
let p_error = feasible.p_error(&operations.variance);
782785
let global_p_error = feasible.global_p_error(&operations.variance);
783786
let mut pbs = init_parameters.micro_params.pbs.clone();
@@ -795,6 +798,7 @@ fn optimize_macro(
795798
macro_params,
796799
is_lower_bound: true,
797800
is_feasible: false,
801+
worst_nodes: worst_constraint.nodes.clone(),
798802
};
799803
continue;
800804
}
@@ -880,6 +884,7 @@ fn optimize_macro(
880884
macro_params,
881885
is_lower_bound,
882886
is_feasible: true,
887+
worst_nodes: vec![],
883888
};
884889
} else {
885890
// the macro parameters are feasible
@@ -941,6 +946,7 @@ pub fn optimize(
941946
p_error: 1.0,
942947
global_p_error: 1.0,
943948
complexity: f64::INFINITY,
949+
worst_nodes: vec![],
944950
};
945951

946952
let mut params = init_parameters;
@@ -973,7 +979,7 @@ pub fn optimize(
973979
params = new_params;
974980
if !params.is_feasible {
975981
if nb_partitions == 1 {
976-
return Err(NoParametersFound);
982+
return Err(NoParametersFound(params.worst_nodes));
977983
}
978984
if DEBUG {
979985
eprintln!(
@@ -1021,7 +1027,7 @@ pub fn optimize(
10211027
fix_point = params.clone();
10221028
}
10231029
if best_params.is_none() {
1024-
return Err(NoParametersFound);
1030+
return Err(NoParametersFound(params.worst_nodes));
10251031
}
10261032
let best_params = best_params.unwrap();
10271033
sanity_check(
@@ -1167,14 +1173,16 @@ pub fn optimize_to_circuit_solution(
11671173
if config.composable {
11681174
return keys_spec::CircuitSolution::no_solution(
11691175
NotComposable("No luts in the circuit.".into()).to_string(),
1176+
vec![],
11701177
);
11711178
}
11721179
let nb_instr = dag.operators.len();
11731180
if let Some(sol) = optimize_mono(dag, config, search_space, persistent_caches).best_solution
11741181
{
11751182
return keys_spec::CircuitSolution::from_native_solution(sol, nb_instr);
11761183
}
1177-
return keys_spec::CircuitSolution::no_solution(NoParametersFound.to_string());
1184+
let err = NoParametersFound(vec![]);
1185+
return keys_spec::CircuitSolution::no_solution(err.to_string(), err.error_nodes());
11781186
}
11791187
let default_partition = 0;
11801188
let dag_and_params = optimize(
@@ -1187,7 +1195,7 @@ pub fn optimize_to_circuit_solution(
11871195
);
11881196
#[allow(clippy::option_if_let_else)]
11891197
match dag_and_params {
1190-
Err(e) => keys_spec::CircuitSolution::no_solution(e.to_string()),
1198+
Err(e) => keys_spec::CircuitSolution::no_solution(e.to_string(), e.error_nodes()),
11911199
Ok((dag, params)) => {
11921200
let ext_keys = keys_spec::ExpandedCircuitKeys::of(&params);
11931201
let instructions_keys = analyze::original_instrs_partition(&dag, &ext_keys);
@@ -1209,6 +1217,7 @@ pub fn optimize_to_circuit_solution(
12091217
global_p_error: params.global_p_error,
12101218
is_feasible: true,
12111219
error_msg: String::default(),
1220+
error_nodes: vec![],
12121221
}
12131222
}
12141223
}

compilers/concrete-optimizer/concrete-optimizer/src/optimization/dag/multi_parameters/optimize_generic.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ fn crt_optimize(
3535
if analyze::has_round(dag) || analyze::has_unsafe_cast(dag) {
3636
return CircuitSolution::no_solution(
3737
"Crt does not support round/reinterpret_precision operator",
38+
vec![], // TODO: report round and reinterpret
3839
);
3940
} // TODO: dag to params
4041
let max_precision = max_precision(dag);

compilers/concrete-optimizer/concrete-optimizer/src/optimization/dag/multi_parameters/variance_constraint.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub struct VarianceConstraint {
1111
pub nb_constraints: u64,
1212
pub safe_variance_bound: f64,
1313
pub variance: SymbolicVariance,
14+
pub nodes: Vec<usize>,
1415
}
1516

1617
impl fmt::Display for VarianceConstraint {

compilers/concrete-optimizer/concrete-optimizer/src/optimization/mod.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,23 @@ pub mod wop_atomic_pattern;
77
#[derive(Clone, Debug, PartialEq, Eq)]
88
pub enum Err {
99
NotComposable(String),
10-
NoParametersFound,
10+
NoParametersFound(Vec<usize>),
11+
}
12+
13+
impl Err {
14+
fn error_nodes(&self) -> Vec<usize> {
15+
match self {
16+
Self::NotComposable(_details) => vec![],
17+
Self::NoParametersFound(nodes) => nodes.clone(),
18+
}
19+
}
1120
}
1221

1322
impl std::fmt::Display for Err {
1423
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1524
match self {
1625
Self::NotComposable(details) => write!(f, "Program can not be composed: {details}"),
17-
Self::NoParametersFound => write!(f, "No crypto parameters could be found"),
26+
Self::NoParametersFound(_) => write!(f, "No crypto parameters could be found"),
1827
}
1928
}
2029
}

0 commit comments

Comments
 (0)