1- use lean_compiler:: * ;
2- use lean_prover:: {
3- prove_execution:: prove_execution, whir_config_builder,
4- } ;
5- use lean_vm:: * ;
1+ use lean_compiler:: compile_program;
2+ use lean_vm:: { F , DIMENSION , PUBLIC_INPUT_START } ;
3+ use lean_prover:: { whir_config_builder, prove_execution:: prove_execution} ;
4+ use whir_p3:: WhirConfigBuilder ;
65use p3_field:: PrimeCharacteristicRing ;
76use std:: collections:: BTreeSet ;
87use rand:: Rng ;
98use rand_chacha:: ChaCha20Rng ;
109use rand_chacha:: rand_core:: SeedableRng ;
11- use rayon:: iter:: { IntoParallelRefIterator , ParallelIterator } ;
1210
1311const NO_VEC_RUNTIME_MEMORY : usize = 1 << 20 ;
1412
15- fn critical_test_cases ( ) -> ( BTreeSet < ( usize , usize ) > , BTreeSet < ( usize , usize ) > ) {
16- let mut happy_test_cases = BTreeSet :: < ( usize , usize ) > :: new ( ) ;
17- let mut sad_test_cases = BTreeSet :: < ( usize , usize ) > :: new ( ) ;
18-
19- for t in 69 ..70 {
20- for v in 0 ..t {
21- if v < t {
22- happy_test_cases. insert ( ( v, t) ) ;
23- } else {
24- sad_test_cases. insert ( ( v, t) ) ;
25- }
26- }
27- //for v in 16777215..16777300 {
28- //if v < t {
29- //happy_test_cases.insert((v, t));
30- //} else {
31- //sad_test_cases.insert((v, t));
32- //}
33- //}
34- }
13+ fn range_check_program ( value : usize , max : usize ) -> String {
14+ let program = format ! ( r#"
15+ fn func() {{
16+ x = 1;
17+ y = {value};
18+ value = x * y;
19+ range_check(value, {max});
20+ return;
21+ }}
22+
23+ fn main() {{
24+ x = 1;
25+ y = {value};
26+ value = x * y;
27+ range_check(value, {max});
3528
36- ( happy_test_cases, sad_test_cases)
29+ func();
30+
31+ if 0 == 0 {{
32+ a = 1;
33+ b = {value};
34+ c = a * b;
35+ range_check(c, {max});
36+ }}
37+ return;
38+ }}
39+ "# ) ;
40+ program. to_string ( )
3741}
3842
3943fn random_test_cases ( num_test_cases : usize ) -> BTreeSet < ( usize , usize ) > {
@@ -62,43 +66,7 @@ fn random_test_cases(num_test_cases: usize) -> BTreeSet<(usize, usize)> {
6266 test_cases
6367}
6468
65- fn range_check_program ( value : usize , max : usize ) -> String {
66- let program = format ! ( r#"
67- const DIM = 5;
68- const SECOND_POINT = 2;
69- const SECOND_N_VARS = 7;
70- const COMPRESSION = 1;
71- const PERMUTATION = 0;
72-
73- fn main() {{
74- x = 1;
75- y = {value};
76- value = x * y;
77- range_check(value, {max});
78-
79- // Need to add the following to avoid a "TODO small GKR, no packing" error
80-
81- for i in 10..50 {{
82- x = malloc_vec(6);
83- poseidon16(i + 3, i, x, PERMUTATION);
84- poseidon24(i + 3, i, x + 2);
85- dot_product(i*2, i, (x + 3) * 8, 1);
86- dot_product(i*3, i + 7, (x + 4) * 8, 2);
87- }}
88-
89- for i in 0..1000 {{
90- assert i != 1000;
91- }}
92-
93- return;
94- }}
95- "# ) ;
96- program. to_string ( )
97- }
98-
99- fn do_test_range_check ( v : usize , t : usize ) {
100- let program_str = range_check_program ( v, t) ;
101-
69+ fn prepare_inputs ( ) -> ( Vec < F > , Vec < F > ) {
10270 const SECOND_POINT : usize = 2 ;
10371 const SECOND_N_VARS : usize = 7 ;
10472
@@ -117,61 +85,48 @@ fn do_test_range_check(v: usize, t: usize) {
11785 let private_input = ( 0 ..1 << 13 )
11886 . map ( |i| F :: from_usize ( i) . square ( ) )
11987 . collect :: < Vec < _ > > ( ) ;
88+
89+ ( public_input, private_input)
90+ }
91+
92+ fn do_test_range_check (
93+ v : usize ,
94+ t : usize ,
95+ whir_config_builder : & WhirConfigBuilder ,
96+ public_input : & Vec < F > ,
97+ private_input : & Vec < F >
98+ ) {
99+ let program_str = range_check_program ( v, t) ;
120100
121101 let bytecode = compile_program ( program_str) ;
122- let _proof_data = prove_execution (
102+
103+ let r = prove_execution (
123104 & bytecode,
124- ( & public_input, & private_input) ,
125- whir_config_builder ( ) ,
105+ ( public_input, private_input) ,
106+ whir_config_builder. clone ( ) ,
126107 NO_VEC_RUNTIME_MEMORY ,
127108 false ,
128109 ( & vec ! [ ] , & vec ! [ ] ) ,
129110 ) ;
130- }
131-
132- #[ test]
133- fn test_prove_range_check_happy ( ) {
134- let ( happy_test_cases, _sad_test_cases) = critical_test_cases ( ) ;
135- println ! ( "Running {} test cases:" , happy_test_cases. len( ) ) ;
136- //happy_test_cases.par_iter().for_each(|(v, t)| {
137- //do_test_range_check(*v, *t);
138- //});
139- for ( v, t) in happy_test_cases {
140- do_test_range_check ( v, t) ;
111+
112+ if v < t {
113+ assert ! ( r. is_ok( ) , "Proof generation should work for v < t" ) ;
114+ } else {
115+ assert ! ( r. is_err( ) , "Proof generation should fail for v >= t" ) ;
141116 }
142- }
143-
144- //#[test]
145- //fn test_prove_range_check_sad() {
146- //let (_happy_test_cases, sad_test_cases) = critical_test_cases();
147- //for (v, t) in sad_test_cases {
148- //let result = std::panic::catch_unwind(|| {
149- //do_test_range_check(v, t);
150- //});
151- //assert!(result.is_err(), "Expected panic for test case v={}, t={}", v, t);
152- //}
153- //}
154117
155- #[ test]
156- #[ should_panic]
157- fn test_prove_range_check_sad_1 ( ) {
158- do_test_range_check ( 0 , 0 ) ;
159118}
160119
161120#[ test]
162- #[ should_panic]
163- fn test_prove_range_check_sad_2 ( ) {
164- do_test_range_check ( 1 , 0 ) ;
165- }
121+ fn test_range_check ( ) {
122+ let ( public_input, private_input) = prepare_inputs ( ) ;
123+ let whir_config_builder = whir_config_builder ( ) ;
166124
167- #[ test]
168- #[ should_panic]
169- fn test_prove_range_check_sad_3 ( ) {
170- do_test_range_check ( 2 , 1 ) ;
171- }
125+ let test_cases = random_test_cases ( 500 ) ;
172126
173- #[ test]
174- #[ should_panic]
175- fn test_prove_range_check_sad_4 ( ) {
176- do_test_range_check ( 69 , 65 ) ;
127+ println ! ( "Running {} random test cases" , test_cases. len( ) ) ;
128+
129+ for ( v, t) in test_cases {
130+ do_test_range_check ( v, t, & whir_config_builder, & public_input, & private_input) ;
131+ }
177132}
0 commit comments