kimchi_stubs/
linearization.rs

1use kimchi::{
2    circuits::{
3        constraints::FeatureFlags,
4        expr::Linearization,
5        lookup::lookups::{LookupFeatures, LookupPatterns},
6    },
7    linearization::{constraints_expr, linearization_columns},
8};
9
10/// Converts the linearization of the kimchi circuit polynomial into a printable string.
11pub 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    // HashMap deliberately uses an unstable order; here we sort to ensure that
48    // the output is consistent when printing.
49    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}