11use egg:: RecExpr ;
22use num:: rational:: Ratio ;
3- use num_traits:: { One , Zero } ;
3+ use num_traits:: One ;
44
55use super :: { Monomial , Polynomial , Rise } ;
66use crate :: rewrite_system:: rise:: Index ;
@@ -11,43 +11,45 @@ use crate::rewrite_system::rise::Index;
1111
1212impl From < & Polynomial > for RecExpr < Rise > {
1313 fn from ( p : & Polynomial ) -> Self {
14- let mut expr = RecExpr :: default ( ) ;
15-
1614 if p. is_zero ( ) {
15+ let mut expr = RecExpr :: default ( ) ;
1716 expr. add ( Rise :: Integer ( 0 ) ) ;
1817 return expr;
1918 }
2019
21- let mut result_id = None ;
22-
23- for ( monomial, coeff) in p. sorted_monomials ( ) {
24- // Get the monomial expression
25- let monomial_id = monomial. append_to_expr ( & mut expr) ;
20+ p. sorted_monomials ( )
21+ . iter ( )
22+ . fold ( RecExpr :: default ( ) , |mut expr, ( monomial, coeff) | {
23+ let prev_id = expr. ids ( ) . last ( ) ;
2624
27- // Handle rational coefficients
28- let term_id = if coeff. is_one ( ) {
29- monomial_id
30- } else if coeff. is_integer ( ) {
31- // Integer coefficient
32- let coeff_id = expr. add ( Rise :: Integer ( * coeff. numer ( ) ) ) ;
33- expr. add ( Rise :: NatMul ( [ coeff_id, monomial_id] ) )
34- } else {
35- // Rational coefficient: represent as (numer/denom) * monomial
36- let numer_id = expr. add ( Rise :: Integer ( * coeff. numer ( ) ) ) ;
37- let denom_id = expr. add ( Rise :: Integer ( * coeff. denom ( ) ) ) ;
38- let frac_id = expr. add ( Rise :: NatDiv ( [ numer_id, denom_id] ) ) ;
39- expr. add ( Rise :: NatMul ( [ frac_id, monomial_id] ) )
40- } ;
41-
42- // Add to running sum
43- result_id = Some ( match result_id {
44- None => term_id,
45- Some ( prev_id) => expr. add ( Rise :: NatAdd ( [ prev_id, term_id] ) ) ,
46- } ) ;
47- }
25+ let term_id = if monomial. is_constant ( ) {
26+ // Handle constant
27+ expr. add ( Rise :: Integer ( * coeff. numer ( ) ) )
28+ } else {
29+ // Get the monomial expression
30+ let monomial_id = monomial. append_to_expr ( & mut expr) ;
31+ if coeff. is_one ( ) {
32+ monomial_id
33+ } else if coeff. is_integer ( ) {
34+ // Integer coefficient
35+ let coeff_id = expr. add ( Rise :: Integer ( * coeff. numer ( ) ) ) ;
36+ expr. add ( Rise :: NatMul ( [ coeff_id, monomial_id] ) )
37+ } else {
38+ // Rational coefficient: represent as (numer/denom) * monomial
39+ let numer_id = expr. add ( Rise :: Integer ( * coeff. numer ( ) ) ) ;
40+ let denom_id = expr. add ( Rise :: Integer ( * coeff. denom ( ) ) ) ;
41+ let frac_id = expr. add ( Rise :: NatDiv ( [ numer_id, denom_id] ) ) ;
42+ expr. add ( Rise :: NatMul ( [ frac_id, monomial_id] ) )
43+ }
44+ } ;
4845
49- // result_id.unwrap();
50- expr
46+ // Add to running sum
47+ match prev_id {
48+ None => term_id,
49+ Some ( id) => expr. add ( Rise :: NatAdd ( [ id, term_id] ) ) ,
50+ } ;
51+ expr
52+ } )
5153 }
5254}
5355
0 commit comments