kimchi_stubs/
linearization.rs1use kimchi::{
2 circuits::{
3 constraints::FeatureFlags,
4 expr::Linearization,
5 lookup::lookups::{LookupFeatures, LookupPatterns},
6 },
7 linearization::{constraints_expr, linearization_columns},
8};
9
10pub fn linearization_strings<F: ark_ff::PrimeField>(
12 uses_custom_gates: bool,
13) -> (String, Vec<(String, String)>)
14where
15 num_bigint::BigUint: From<F::BigInt>,
16{
17 let features = if uses_custom_gates {
18 None
19 } else {
20 Some(FeatureFlags {
21 range_check0: false,
22 range_check1: false,
23 foreign_field_add: false,
24 foreign_field_mul: false,
25 xor: false,
26 rot: false,
27 lookup_features: LookupFeatures {
28 patterns: LookupPatterns {
29 xor: false,
30 lookup: false,
31 range_check: false,
32 foreign_field_mul: false,
33 },
34 joint_lookup_used: false,
35 uses_runtime_tables: false,
36 },
37 })
38 };
39 let evaluated_cols = linearization_columns::<F>(features.as_ref());
40 let (linearization, _powers_of_alpha) = constraints_expr::<F>(features.as_ref(), true);
41
42 let Linearization {
43 constant_term,
44 mut index_terms,
45 } = linearization.linearize(evaluated_cols).unwrap();
46
47 index_terms.sort_by(|(x, _), (y, _)| x.cmp(y));
50
51 let constant = constant_term.ocaml_str();
52 let other_terms = index_terms
53 .iter()
54 .map(|(col, expr)| (format!("{:?}", col), expr.ocaml_str()))
55 .collect();
56
57 (constant, other_terms)
58}
59
60#[ocaml::func]
61pub fn fp_linearization_strings() -> (String, Vec<(String, String)>) {
62 linearization_strings::<mina_curves::pasta::Fp>(true)
63}
64
65#[ocaml::func]
66pub fn fq_linearization_strings() -> (String, Vec<(String, String)>) {
67 linearization_strings::<mina_curves::pasta::Fq>(false)
68}