@@ -83,6 +83,17 @@ def _get_incident_via_standard_repn(
83
83
84
84
85
85
def _get_incident_via_ampl_repn (expr , linear_only , visitor ):
86
+ def _nonlinear_var_id_collector (idlist ):
87
+ for _id in idlist :
88
+ if _id in visitor .subexpression_cache :
89
+ info = visitor .subexpression_cache [_id ][1 ]
90
+ if info .nonlinear :
91
+ yield from _nonlinear_var_id_collector (info .nonlinear [1 ])
92
+ if info .linear :
93
+ yield from _nonlinear_var_id_collector (info .linear )
94
+ else :
95
+ yield _id
96
+
86
97
var_map = visitor .var_map
87
98
orig_activevisitor = AMPLRepn .ActiveVisitor
88
99
AMPLRepn .ActiveVisitor = visitor
@@ -91,13 +102,13 @@ def _get_incident_via_ampl_repn(expr, linear_only, visitor):
91
102
finally :
92
103
AMPLRepn .ActiveVisitor = orig_activevisitor
93
104
94
- nonlinear_var_ids = [] if repn .nonlinear is None else repn .nonlinear [1 ]
95
105
nonlinear_var_id_set = set ()
96
106
unique_nonlinear_var_ids = []
97
- for v_id in nonlinear_var_ids :
98
- if v_id not in nonlinear_var_id_set :
99
- nonlinear_var_id_set .add (v_id )
100
- unique_nonlinear_var_ids .append (v_id )
107
+ if repn .nonlinear :
108
+ for v_id in _nonlinear_var_id_collector (repn .nonlinear [1 ]):
109
+ if v_id not in nonlinear_var_id_set :
110
+ nonlinear_var_id_set .add (v_id )
111
+ unique_nonlinear_var_ids .append (v_id )
101
112
102
113
nonlinear_vars = [var_map [v_id ] for v_id in unique_nonlinear_var_ids ]
103
114
linear_only_vars = [
0 commit comments