@@ -37,3 +37,64 @@ const char *test_wsum_hess_exp_sum_mult(void)
3737 free_expr (exp_sum_xy );
3838 return 0 ;
3939}
40+
41+ const char * test_wsum_hess_exp_sum_matmul (void )
42+ {
43+ /* exp(sum(X @ Y)) where X is 2x3, Y is 3x2
44+ * n_vars = 6 + 6 = 12 */
45+ double u_vals [12 ] = {1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 0.5 , 1.5 , 2.5 , 0.1 , 0.2 , 0.3 };
46+ double w = 1.0 ;
47+
48+ expr * X = new_variable (2 , 3 , 0 , 12 );
49+ expr * Y = new_variable (3 , 2 , 6 , 12 );
50+ expr * XY = new_matmul (X , Y );
51+ expr * sum_XY = new_sum (XY , -1 );
52+ expr * exp_sum_XY = new_exp (sum_XY );
53+
54+ mu_assert ("check_wsum_hess failed" ,
55+ check_wsum_hess (exp_sum_XY , u_vals , & w , NUMERICAL_DIFF_DEFAULT_H ));
56+
57+ free_expr (exp_sum_XY );
58+ return 0 ;
59+ }
60+
61+ const char * test_wsum_hess_sin_sum_axis0_matmul (void )
62+ {
63+ /* sin(sum(X @ Y, axis=0)) where X is 2x3, Y is 3x2
64+ * X@Y is 2x2, sum(axis=0) gives 1x2, sin gives 1x2
65+ * n_vars = 6 + 6 = 12 */
66+ double u_vals [12 ] = {1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 0.5 , 1.5 , 2.5 , 0.1 , 0.2 , 0.3 };
67+ double w [2 ] = {1.0 , 1.0 };
68+
69+ expr * X = new_variable (2 , 3 , 0 , 12 );
70+ expr * Y = new_variable (3 , 2 , 6 , 12 );
71+ expr * XY = new_matmul (X , Y );
72+ expr * sum_XY = new_sum (XY , 0 );
73+ expr * sin_sum_XY = new_sin (sum_XY );
74+
75+ mu_assert ("check_wsum_hess failed" ,
76+ check_wsum_hess (sin_sum_XY , u_vals , w , NUMERICAL_DIFF_DEFAULT_H ));
77+
78+ free_expr (sin_sum_XY );
79+ return 0 ;
80+ }
81+
82+ const char * test_wsum_hess_logistic_sum_axis0_matmul (void )
83+ {
84+ /* logistic(sum(X @ Y, axis=0)) where X is 2x3, Y is 3x2
85+ * n_vars = 6 + 6 = 12 */
86+ double u_vals [12 ] = {1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 0.5 , 1.5 , 2.5 , 0.1 , 0.2 , 0.3 };
87+ double w [2 ] = {1.0 , 1.0 };
88+
89+ expr * X = new_variable (2 , 3 , 0 , 12 );
90+ expr * Y = new_variable (3 , 2 , 6 , 12 );
91+ expr * XY = new_matmul (X , Y );
92+ expr * sum_XY = new_sum (XY , 0 );
93+ expr * logistic_sum_XY = new_logistic (sum_XY );
94+
95+ mu_assert ("check_wsum_hess failed" ,
96+ check_wsum_hess (logistic_sum_XY , u_vals , w , NUMERICAL_DIFF_DEFAULT_H ));
97+
98+ free_expr (logistic_sum_XY );
99+ return 0 ;
100+ }
0 commit comments