Skip to content

Commit 83066f8

Browse files
authored
Merge pull request #3276 from jsiirola/nlv2-presolve-defined-vars
NLv2 presolver: resolve constant defined vars/external functions
2 parents ffaea5e + 956c201 commit 83066f8

File tree

4 files changed

+738
-118
lines changed

4 files changed

+738
-118
lines changed

pyomo/contrib/incidence_analysis/config.py

-2
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ def get_config_from_kwds(**kwds):
130130
and kwds.get("_ampl_repn_visitor", None) is None
131131
):
132132
subexpression_cache = {}
133-
subexpression_order = []
134133
external_functions = {}
135134
var_map = {}
136135
used_named_expressions = set()
@@ -143,7 +142,6 @@ def get_config_from_kwds(**kwds):
143142
amplvisitor = AMPLRepnVisitor(
144143
text_nl_template,
145144
subexpression_cache,
146-
subexpression_order,
147145
external_functions,
148146
var_map,
149147
used_named_expressions,

pyomo/contrib/incidence_analysis/incidence.py

+16-5
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ def _get_incident_via_standard_repn(
8383

8484

8585
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+
8697
var_map = visitor.var_map
8798
orig_activevisitor = AMPLRepn.ActiveVisitor
8899
AMPLRepn.ActiveVisitor = visitor
@@ -91,13 +102,13 @@ def _get_incident_via_ampl_repn(expr, linear_only, visitor):
91102
finally:
92103
AMPLRepn.ActiveVisitor = orig_activevisitor
93104

94-
nonlinear_var_ids = [] if repn.nonlinear is None else repn.nonlinear[1]
95105
nonlinear_var_id_set = set()
96106
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)
101112

102113
nonlinear_vars = [var_map[v_id] for v_id in unique_nonlinear_var_ids]
103114
linear_only_vars = [

0 commit comments

Comments
 (0)