@@ -37,16 +37,20 @@ def _convert_matmul(expr, children, var_dict, n_vars, param_dict):
3737
3838 if left_arg .is_constant ():
3939 A = left_arg .value
40- param_node = (convert_expr (left_arg , var_dict , n_vars , param_dict )
41- if param_dict else None )
40+ if isinstance (left_arg , Parameter ):
41+ param_node = param_dict [left_arg .id ]
42+ else :
43+ param_node = None
4244 if sparse .issparse (A ):
4345 return _make_sparse_left_matmul (param_node , children [1 ], A )
4446 return _make_dense_left_matmul (param_node , children [1 ], A )
4547
4648 elif right_arg .is_constant ():
4749 A = right_arg .value
48- param_node = (convert_expr (right_arg , var_dict , n_vars , param_dict )
49- if param_dict else None )
50+ if isinstance (right_arg , Parameter ):
51+ param_node = param_dict [right_arg .id ]
52+ else :
53+ param_node = None
5054 if sparse .issparse (A ):
5155 return _make_sparse_right_matmul (param_node , children [0 ], A )
5256 return _make_dense_right_matmul (param_node , children [0 ], A )
@@ -60,44 +64,18 @@ def _convert_multiply(expr, children, var_dict, n_vars, param_dict):
6064 left_arg , right_arg = expr .args
6165
6266 if left_arg .is_constant ():
63- if param_dict and left_arg .parameters ():
64- param_node = convert_expr (left_arg , var_dict , n_vars , param_dict )
65- if left_arg .size == 1 :
66- return _diffengine .make_param_scalar_mult (
67- param_node , children [1 ])
68- return _diffengine .make_param_vector_mult (
69- param_node , children [1 ])
70-
71- a = _to_dense_float (left_arg .value )
72- if a .size == 1 :
73- scalar = float (a .flat [0 ])
74- if scalar == 1.0 :
75- return children [1 ]
76- return _diffengine .make_const_scalar_mult (children [1 ], scalar )
77- return _diffengine .make_const_vector_mult (
78- children [1 ], a .flatten (order = 'F' ))
79-
67+ if left_arg .size == 1 :
68+ return _diffengine .make_param_scalar_mult (children [0 ], children [1 ])
69+ else :
70+ return _diffengine .make_param_vector_mult (children [0 ], children [1 ])
8071 elif right_arg .is_constant ():
81- if param_dict and right_arg .parameters ():
82- param_node = convert_expr (right_arg , var_dict , n_vars , param_dict )
83- if right_arg .size == 1 :
84- return _diffengine .make_param_scalar_mult (
85- param_node , children [0 ])
86- return _diffengine .make_param_vector_mult (
87- param_node , children [0 ])
88-
89- a = _to_dense_float (right_arg .value )
90- if a .size == 1 :
91- scalar = float (a .flat [0 ])
92- if scalar == 1.0 :
93- return children [0 ]
94- return _diffengine .make_const_scalar_mult (children [0 ], scalar )
95- return _diffengine .make_const_vector_mult (
96- children [0 ], a .flatten (order = 'F' ))
97-
98- # Neither is constant, use general multiply
99- return _diffengine .make_multiply (children [0 ], children [1 ])
100-
72+ # TODO is this correct? Do we need to swap the arguments?
73+ if right_arg .size == 1 :
74+ return _diffengine .make_param_scalar_mult (children [0 ], children [1 ])
75+ else :
76+ return _diffengine .make_param_vector_mult (children [0 ], children [1 ])
77+ else :
78+ return _diffengine .make_multiply (children [0 ], children [1 ])
10179
10280
10381def convert_expr (expr , var_dict , n_vars , param_dict = None ):
@@ -121,7 +99,7 @@ def convert_expr(expr, var_dict, n_vars, param_dict=None):
12199 if isinstance (expr , cp .Constant ):
122100 c = _to_dense_float (expr .value )
123101 d1 , d2 = normalize_shape (expr .shape )
124- return _diffengine .make_constant (d1 , d2 , n_vars , c .flatten (order = 'F' ))
102+ return _diffengine .make_parameter (d1 , d2 , - 1 , n_vars , c .flatten (order = 'F' ))
125103
126104 # Recursive case: atoms
127105 atom_name = type (expr ).__name__
0 commit comments