@@ -7,10 +7,10 @@ use ff_ext::{BabyBearExt4, SmallField};
7
7
use openvm_native_compiler:: prelude:: * ;
8
8
use openvm_native_compiler_derive:: iter_zip;
9
9
use openvm_native_recursion:: challenger:: ChallengerVariable ;
10
- use p3_field:: { FieldAlgebra , FieldExtensionAlgebra } ;
11
10
use openvm_native_recursion:: challenger:: {
12
11
duplex:: DuplexChallengerVariable , CanObserveVariable , FeltChallenger ,
13
12
} ;
13
+ use p3_field:: { FieldAlgebra , FieldExtensionAlgebra } ;
14
14
type E = BabyBearExt4 ;
15
15
const HASH_RATE : usize = 8 ;
16
16
@@ -35,8 +35,14 @@ pub fn _print_usize_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Usiz
35
35
} ) ;
36
36
}
37
37
38
- pub unsafe fn exts_to_felts < C : Config > ( builder : & mut Builder < C > , exts : & Array < C , Ext < C :: F , C :: EF > > ) -> Array < C , Felt < C :: F > > {
39
- assert ! ( matches!( exts, Array :: Dyn ( _, _) ) , "Expected dynamic array of Exts" ) ;
38
+ pub unsafe fn exts_to_felts < C : Config > (
39
+ builder : & mut Builder < C > ,
40
+ exts : & Array < C , Ext < C :: F , C :: EF > > ,
41
+ ) -> Array < C , Felt < C :: F > > {
42
+ assert ! (
43
+ matches!( exts, Array :: Dyn ( _, _) ) ,
44
+ "Expected dynamic array of Exts"
45
+ ) ;
40
46
let f_len: Usize < C :: N > = builder. eval ( exts. len ( ) * Usize :: from ( C :: EF :: D ) ) ;
41
47
let f_arr: Array < C , Felt < C :: F > > = Array :: Dyn ( exts. ptr ( ) , f_len) ;
42
48
f_arr
@@ -45,15 +51,22 @@ pub unsafe fn exts_to_felts<C: Config>(builder: &mut Builder<C>, exts: &Array<C,
45
51
pub fn challenger_multi_observe < C : Config > (
46
52
builder : & mut Builder < C > ,
47
53
challenger : & mut DuplexChallengerVariable < C > ,
48
- arr : & Array < C , Felt < C :: F > >
54
+ arr : & Array < C , Felt < C :: F > > ,
49
55
) {
50
- let next_input_ptr = builder. poseidon2_multi_observe ( & challenger. sponge_state , challenger. input_ptr , & arr) ;
51
- builder. assign ( & challenger. input_ptr , challenger. io_empty_ptr + next_input_ptr. clone ( ) ) ;
52
- builder. if_ne ( next_input_ptr, Usize :: from ( 0 ) ) . then_or_else ( |builder| {
53
- builder. assign ( & challenger. output_ptr , challenger. io_empty_ptr ) ;
54
- } , |builder| {
55
- builder. assign ( & challenger. output_ptr , challenger. io_full_ptr ) ;
56
- } ) ;
56
+ let next_input_ptr =
57
+ builder. poseidon2_multi_observe ( & challenger. sponge_state , challenger. input_ptr , & arr) ;
58
+ builder. assign (
59
+ & challenger. input_ptr ,
60
+ challenger. io_empty_ptr + next_input_ptr. clone ( ) ,
61
+ ) ;
62
+ builder. if_ne ( next_input_ptr, Usize :: from ( 0 ) ) . then_or_else (
63
+ |builder| {
64
+ builder. assign ( & challenger. output_ptr , challenger. io_empty_ptr ) ;
65
+ } ,
66
+ |builder| {
67
+ builder. assign ( & challenger. output_ptr , challenger. io_full_ptr ) ;
68
+ } ,
69
+ ) ;
57
70
}
58
71
59
72
pub fn is_smaller_than < C : Config > (
@@ -685,7 +698,7 @@ pub fn max_usize_arr<C: Config>(
685
698
}
686
699
687
700
pub struct UniPolyExtrapolator < C : Config > {
688
- constants : [ Ext < C :: F , C :: EF > ; 12 ] , // 0, 1, 2, 3, 4, -1, 1/2, -1/2, 1/6, -1/6, 1/4, 1/24
701
+ constants : [ Ext < C :: F , C :: EF > ; 12 ] , // 0, 1, 2, 3, 4, -1, 1/2, -1/2, 1/6, -1/6, 1/4, 1/24
689
702
}
690
703
691
704
impl < C : Config > UniPolyExtrapolator < C > {
@@ -719,39 +732,62 @@ impl<C: Config> UniPolyExtrapolator<C> {
719
732
neg_six_inverse,
720
733
four_inverse,
721
734
twenty_four_inverse,
722
- ]
735
+ ] ,
723
736
}
724
737
}
725
738
726
- pub fn extrapolate_uni_poly ( & mut self , builder : & mut Builder < C > , p_i : & Array < C , Ext < C :: F , C :: EF > > , eval_at : Ext < C :: F , C :: EF > ) -> Ext < C :: F , C :: EF > {
739
+ pub fn extrapolate_uni_poly (
740
+ & mut self ,
741
+ builder : & mut Builder < C > ,
742
+ p_i : & Array < C , Ext < C :: F , C :: EF > > ,
743
+ eval_at : Ext < C :: F , C :: EF > ,
744
+ ) -> Ext < C :: F , C :: EF > {
727
745
let res: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 0 ] + self . constants [ 0 ] ) ;
728
746
729
- builder. if_eq ( p_i. len ( ) , Usize :: from ( 4 ) ) . then_or_else ( |builder| {
730
- let ext = self . extrapolate_uni_poly_deg_3 ( builder, p_i, eval_at) ;
731
- builder. assign ( & res, ext) ;
732
- } , |builder| {
733
- builder. if_eq ( p_i. len ( ) , Usize :: from ( 3 ) ) . then_or_else ( |builder| {
734
- let ext = self . extrapolate_uni_poly_deg_2 ( builder, p_i, eval_at) ;
747
+ builder. if_eq ( p_i. len ( ) , Usize :: from ( 4 ) ) . then_or_else (
748
+ |builder| {
749
+ let ext = self . extrapolate_uni_poly_deg_3 ( builder, p_i, eval_at) ;
735
750
builder. assign ( & res, ext) ;
736
- } , |builder| {
737
- builder. if_eq ( p_i. len ( ) , Usize :: from ( 2 ) ) . then_or_else ( |builder| {
738
- let ext = self . extrapolate_uni_poly_deg_1 ( builder, p_i, eval_at) ;
739
- builder. assign ( & res, ext) ;
740
- } , |builder| {
741
- builder. if_eq ( p_i. len ( ) , Usize :: from ( 5 ) ) . then_or_else ( |builder| {
742
- let ext = self . extrapolate_uni_poly_deg_4 ( builder, p_i, eval_at) ;
751
+ } ,
752
+ |builder| {
753
+ builder. if_eq ( p_i. len ( ) , Usize :: from ( 3 ) ) . then_or_else (
754
+ |builder| {
755
+ let ext = self . extrapolate_uni_poly_deg_2 ( builder, p_i, eval_at) ;
743
756
builder. assign ( & res, ext) ;
744
- } , |builder| {
745
- builder. error ( ) ;
746
- } ) ;
747
- } ) ;
748
- } ) ;
749
- } ) ;
757
+ } ,
758
+ |builder| {
759
+ builder. if_eq ( p_i. len ( ) , Usize :: from ( 2 ) ) . then_or_else (
760
+ |builder| {
761
+ let ext = self . extrapolate_uni_poly_deg_1 ( builder, p_i, eval_at) ;
762
+ builder. assign ( & res, ext) ;
763
+ } ,
764
+ |builder| {
765
+ builder. if_eq ( p_i. len ( ) , Usize :: from ( 5 ) ) . then_or_else (
766
+ |builder| {
767
+ let ext =
768
+ self . extrapolate_uni_poly_deg_4 ( builder, p_i, eval_at) ;
769
+ builder. assign ( & res, ext) ;
770
+ } ,
771
+ |builder| {
772
+ builder. error ( ) ;
773
+ } ,
774
+ ) ;
775
+ } ,
776
+ ) ;
777
+ } ,
778
+ ) ;
779
+ } ,
780
+ ) ;
750
781
751
782
res
752
783
}
753
784
754
- fn extrapolate_uni_poly_deg_1 ( & self , builder : & mut Builder < C > , p_i : & Array < C , Ext < C :: F , C :: EF > > , eval_at : Ext < C :: F , C :: EF > ) -> Ext < C :: F , C :: EF > {
785
+ fn extrapolate_uni_poly_deg_1 (
786
+ & self ,
787
+ builder : & mut Builder < C > ,
788
+ p_i : & Array < C , Ext < C :: F , C :: EF > > ,
789
+ eval_at : Ext < C :: F , C :: EF > ,
790
+ ) -> Ext < C :: F , C :: EF > {
755
791
// w0 = 1 / (0−1) = -1
756
792
// w1 = 1 / (1−0) = 1
757
793
let d0: Ext < C :: F , C :: EF > = builder. eval ( eval_at - self . constants [ 0 ] ) ;
@@ -767,7 +803,12 @@ impl<C: Config> UniPolyExtrapolator<C> {
767
803
builder. eval ( l * ( t0 + t1) )
768
804
}
769
805
770
- fn extrapolate_uni_poly_deg_2 ( & self , builder : & mut Builder < C > , p_i : & Array < C , Ext < C :: F , C :: EF > > , eval_at : Ext < C :: F , C :: EF > ) -> Ext < C :: F , C :: EF > {
806
+ fn extrapolate_uni_poly_deg_2 (
807
+ & self ,
808
+ builder : & mut Builder < C > ,
809
+ p_i : & Array < C , Ext < C :: F , C :: EF > > ,
810
+ eval_at : Ext < C :: F , C :: EF > ,
811
+ ) -> Ext < C :: F , C :: EF > {
771
812
// w0 = 1 / ((0−1)(0−2)) = 1/2
772
813
// w1 = 1 / ((1−0)(1−2)) = -1
773
814
// w2 = 1 / ((2−0)(2−1)) = 1/2
@@ -788,7 +829,12 @@ impl<C: Config> UniPolyExtrapolator<C> {
788
829
builder. eval ( l * ( t0 + t1 + t2) )
789
830
}
790
831
791
- fn extrapolate_uni_poly_deg_3 ( & self , builder : & mut Builder < C > , p_i : & Array < C , Ext < C :: F , C :: EF > > , eval_at : Ext < C :: F , C :: EF > ) -> Ext < C :: F , C :: EF > {
832
+ fn extrapolate_uni_poly_deg_3 (
833
+ & self ,
834
+ builder : & mut Builder < C > ,
835
+ p_i : & Array < C , Ext < C :: F , C :: EF > > ,
836
+ eval_at : Ext < C :: F , C :: EF > ,
837
+ ) -> Ext < C :: F , C :: EF > {
792
838
// w0 = 1 / ((0−1)(0−2)(0−3)) = -1/6
793
839
// w1 = 1 / ((1−0)(1−2)(1−3)) = 1/2
794
840
// w2 = 1 / ((2−0)(2−1)(2−3)) = -1/2
@@ -813,7 +859,12 @@ impl<C: Config> UniPolyExtrapolator<C> {
813
859
builder. eval ( l * ( t0 + t1 + t2 + t3) )
814
860
}
815
861
816
- fn extrapolate_uni_poly_deg_4 ( & self , builder : & mut Builder < C > , p_i : & Array < C , Ext < C :: F , C :: EF > > , eval_at : Ext < C :: F , C :: EF > ) -> Ext < C :: F , C :: EF > {
862
+ fn extrapolate_uni_poly_deg_4 (
863
+ & self ,
864
+ builder : & mut Builder < C > ,
865
+ p_i : & Array < C , Ext < C :: F , C :: EF > > ,
866
+ eval_at : Ext < C :: F , C :: EF > ,
867
+ ) -> Ext < C :: F , C :: EF > {
817
868
// w0 = 1 / ((0−1)(0−2)(0−3)(0−4)) = 1/24
818
869
// w1 = 1 / ((1−0)(1−2)(1−3)(1−4)) = -1/6
819
870
// w2 = 1 / ((2−0)(2−1)(2−3)(2−4)) = 1/4
0 commit comments