Как найти ограничение по номеру в модели Pyomo? - PullRequest
1 голос
/ 31 марта 2020

Мы пытаемся отладить модель Pyomo. Ipopt с halt_on_ampl_error True сообщает Error evaluating constraint 30. Есть ли простой способ программно найти ограничение в модели Pyomo по его номеру (используя нумерацию Ipopt)?

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Вы можете просто изменить свой вызов, чтобы немного решить:

opt = SolverFactory('ipopt')
res = opt.solve(model, symbolic_solver_labels=True)

Затем вы должны увидеть более полезное сообщение об ошибке в выводе ipopt.

Позвольте мне расширить этот ответ на адрес другая часть вопроса о поиске ограничения по его номеру. Поскольку переменные и ограничения Pyomo не имеют индексов, это очень сильно зависит от интерфейса c. Для 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
1 голос
/ 02 апреля 2020

Я предполагаю, что вы используете интерфейс PyomoNLP в PyNumero. Если вы используете интерфейс asl, это немного сложнее. С интерфейсом PyomoNLP в PyNumero есть несколько методов, которые должны быть в состоянии сделать то, что вам нужно. Посмотрите на комментарии в pyomo_nlp.py. Обратите внимание, что этот материал довольно новый и API может быть изменен.

...