@@ -100,46 +100,48 @@ fn det_zero_nonsquare() {
100100
101101#[ test]
102102fn det ( ) {
103- macro_rules! det {
104- ( $elem : ty , $shape : expr , $rtol : expr ) => {
105- let a : Array2 <$elem> = random ( $shape ) ;
106- println! ( "a = \n {:?}" , a ) ;
107- let det = det_naive ( & a ) ;
108- let sign = det . div_real ( det . abs ( ) ) ;
109- let ln_det = det. abs ( ) . ln ( ) ;
110- assert_rclose! ( a . factorize ( ) . unwrap ( ) . det ( ) . unwrap ( ) , det , $rtol ) ;
111- {
112- let result = a . factorize ( ) . unwrap ( ) . sln_det ( ) . unwrap ( ) ;
113- assert_rclose! ( result . 0 , sign , $rtol ) ;
114- assert_rclose!( result. 1 , ln_det , $ rtol) ;
115- }
116- assert_rclose! ( a . factorize ( ) . unwrap ( ) . det_into ( ) . unwrap ( ) , det , $rtol ) ;
117- {
118- let result = a . factorize ( ) . unwrap ( ) . sln_det_into ( ) . unwrap ( ) ;
119- assert_rclose! ( result . 0 , sign , $rtol ) ;
120- assert_rclose!( result. 1 , ln_det , $ rtol) ;
121- }
122- assert_rclose! ( a . det ( ) . unwrap ( ) , det , $rtol ) ;
123- {
124- let result = a . sln_det ( ) . unwrap ( ) ;
125- assert_rclose! ( result . 0 , sign , $rtol ) ;
126- assert_rclose!( result. 1 , ln_det , $ rtol) ;
127- }
128- assert_rclose! ( a . clone ( ) . det_into ( ) . unwrap ( ) , det , $rtol ) ;
129- {
130- let result = a . sln_det_into ( ) . unwrap ( ) ;
131- assert_rclose! ( result . 0 , sign , $rtol ) ;
132- assert_rclose!( result. 1 , ln_det , $ rtol) ;
133- }
134- } ;
103+ fn det_impl < A , Tol > ( a : Array2 < A > , rtol : Tol )
104+ where
105+ A : Scalar < Real = Tol > ,
106+ Tol : RealScalar < Real = Tol > ,
107+ {
108+ let det = det_naive ( & a ) ;
109+ let sign = det. div_real ( det . abs ( ) ) ;
110+ let ln_det = det . abs ( ) . ln ( ) ;
111+ assert_rclose ! ( a . factorize ( ) . unwrap ( ) . det ( ) . unwrap ( ) , det , rtol ) ;
112+ {
113+ let result = a . factorize ( ) . unwrap ( ) . sln_det ( ) . unwrap ( ) ;
114+ assert_rclose ! ( result. 0 , sign , rtol) ;
115+ assert_rclose ! ( result . 1 , ln_det , rtol ) ;
116+ }
117+ assert_rclose ! ( a . factorize ( ) . unwrap ( ) . det_into ( ) . unwrap ( ) , det , rtol ) ;
118+ {
119+ let result = a . factorize ( ) . unwrap ( ) . sln_det_into ( ) . unwrap ( ) ;
120+ assert_rclose ! ( result. 0 , sign , rtol) ;
121+ assert_rclose ! ( result . 1 , ln_det , rtol ) ;
122+ }
123+ assert_rclose ! ( a . det ( ) . unwrap ( ) , det , rtol ) ;
124+ {
125+ let result = a . sln_det ( ) . unwrap ( ) ;
126+ assert_rclose ! ( result. 0 , sign , rtol) ;
127+ assert_rclose ! ( result . 1 , ln_det , rtol ) ;
128+ }
129+ assert_rclose ! ( a . clone ( ) . det_into ( ) . unwrap ( ) , det , rtol ) ;
130+ {
131+ let result = a . sln_det_into ( ) . unwrap ( ) ;
132+ assert_rclose ! ( result. 0 , sign , rtol) ;
133+ assert_rclose ! ( result . 1 , ln_det , rtol ) ;
134+ }
135135 }
136136 for rows in 1 ..5 {
137- for & shape in & [ ( rows, rows) . into_shape ( ) , ( rows, rows) . f ( ) ] {
138- det ! ( f64 , shape, 1e-9 ) ;
139- det ! ( f32 , shape, 1e-4 ) ;
140- det ! ( c64, shape, 1e-9 ) ;
141- det ! ( c32, shape, 1e-4 ) ;
142- }
137+ det_impl ( random_regular :: < f64 > ( rows) , 1e-9 ) ;
138+ det_impl ( random_regular :: < f32 > ( rows) , 1e-4 ) ;
139+ det_impl ( random_regular :: < c64 > ( rows) , 1e-9 ) ;
140+ det_impl ( random_regular :: < c32 > ( rows) , 1e-4 ) ;
141+ det_impl ( random_regular :: < f64 > ( rows) . t ( ) . to_owned ( ) , 1e-9 ) ;
142+ det_impl ( random_regular :: < f32 > ( rows) . t ( ) . to_owned ( ) , 1e-4 ) ;
143+ det_impl ( random_regular :: < c64 > ( rows) . t ( ) . to_owned ( ) , 1e-9 ) ;
144+ det_impl ( random_regular :: < c32 > ( rows) . t ( ) . to_owned ( ) , 1e-4 ) ;
143145 }
144146}
145147
0 commit comments