如何在 Pyomo 模型中按数字查找约束?
How to look-up constraint by number in a Pyomo model?
我们正在尝试调试 Pyomo 模型。 Ipopt with halt_on_ampl_error
True
显示 Error evaluating constraint 30
。有没有一种简单的方法可以通过编号(使用 Ipopt 的编号)以编程方式在 Pyomo 模型中查找约束?
你可以稍微修改你的调用来解决:
opt = SolverFactory('ipopt')
res = opt.solve(model, symbolic_solver_labels=True)
然后,您应该会在 ipopt 输出中看到更有用的错误消息。
让我扩展这个答案来解决问题的另一部分,即按编号查找约束。因为 Pyomo 变量和约束没有索引,所以这是非常特定于求解器界面的。对于 Pynumero,您有几个选择。假设您有以下 ConcreteModel
称为 m
和 PyomoNLP
称为 nlp
.
import pyomo.environ as pyo
from pyomo.contrib.pynumero.interfaces.pyomo_nlp import PyomoNLP
m = pyo.ConcreteModel()
m.x = pyo.Var()
m.y = pyo.Var()
m.obj = pyo.Objective(expr=m.y)
m.c1 = pyo.Constraint(expr=m.y >= m.x)
m.c2 = pyo.Constraint(expr=m.y >= -m.x)
nlp = PyomoNLP(m)
如果只想得到几个变量或约束的索引,可以使用
var_indices = nlp.get_primal_indices([m.x, m.y])
con_indices = nlp.get_constraint_indices([m.c1, m.c2])
如果你想要两个方向的完整地图,你可以使用
con_to_index = dict()
index_to_con = dict()
var_to_index = pyo.ComponentMap()
index_to-var = dict()
for ndx, var in enumerate(nlp.get_pyomo_variables()):
var_to_index[var] = ndx
index_to_var[ndx] = var
for ndx, con in enumerate(nlp.get_pyomo_constraints()):
con_to_index[con] = ndx
index_to_con[ndx] = con
我假设您正在使用 PyNumero 中的 PyomoNLP 界面。如果您使用的是 asl 接口,这会有点困难。使用 PyNumero 中的 PyomoNLP 接口,有几种方法应该能够满足您的需要。看看 pyomo_nlp.py 中的评论。请注意,这些内容非常新,API 可能会发生变化。
我们正在尝试调试 Pyomo 模型。 Ipopt with halt_on_ampl_error
True
显示 Error evaluating constraint 30
。有没有一种简单的方法可以通过编号(使用 Ipopt 的编号)以编程方式在 Pyomo 模型中查找约束?
你可以稍微修改你的调用来解决:
opt = SolverFactory('ipopt')
res = opt.solve(model, symbolic_solver_labels=True)
然后,您应该会在 ipopt 输出中看到更有用的错误消息。
让我扩展这个答案来解决问题的另一部分,即按编号查找约束。因为 Pyomo 变量和约束没有索引,所以这是非常特定于求解器界面的。对于 Pynumero,您有几个选择。假设您有以下 ConcreteModel
称为 m
和 PyomoNLP
称为 nlp
.
import pyomo.environ as pyo
from pyomo.contrib.pynumero.interfaces.pyomo_nlp import PyomoNLP
m = pyo.ConcreteModel()
m.x = pyo.Var()
m.y = pyo.Var()
m.obj = pyo.Objective(expr=m.y)
m.c1 = pyo.Constraint(expr=m.y >= m.x)
m.c2 = pyo.Constraint(expr=m.y >= -m.x)
nlp = PyomoNLP(m)
如果只想得到几个变量或约束的索引,可以使用
var_indices = nlp.get_primal_indices([m.x, m.y])
con_indices = nlp.get_constraint_indices([m.c1, m.c2])
如果你想要两个方向的完整地图,你可以使用
con_to_index = dict()
index_to_con = dict()
var_to_index = pyo.ComponentMap()
index_to-var = dict()
for ndx, var in enumerate(nlp.get_pyomo_variables()):
var_to_index[var] = ndx
index_to_var[ndx] = var
for ndx, con in enumerate(nlp.get_pyomo_constraints()):
con_to_index[con] = ndx
index_to_con[ndx] = con
我假设您正在使用 PyNumero 中的 PyomoNLP 界面。如果您使用的是 asl 接口,这会有点困难。使用 PyNumero 中的 PyomoNLP 接口,有几种方法应该能够满足您的需要。看看 pyomo_nlp.py 中的评论。请注意,这些内容非常新,API 可能会发生变化。