Как передать внешние данные в правило ограничения Pyomo

Классический способ создания ограничения или списка ограничений в Pyomo - использовать правило

E.g.

def ConSatisfyDemand(model,p):

    return sum(model.OutQty[pl,r] for (pl,r) in model.OutputTypeIndex if pl==p) == DemandQty[p]

Однако, если DemandQty - это внешние данные, например Для серии Pandas его необходимо каким-то образом передать функции или объявить как глобальную, чтобы она попала в область видимости. Кажется, нет удобного способа сделать первое согласно Почему поведение Pyomo меняется при передаче параметров в функцию ограничения?

Глобальное объявление допустимо в сценарии, но нецелесообразно в производственном приложении.

Альтернативой является загрузка данных DemandQty в качестве параметра модели, чтобы иметь к ней доступ. Но это может не масштабировать производительность, и может быть неудобно поддерживать вторую копию данных только для Pyomo. Есть ли способ получить доступ к этим «внешним данным» в функции правила ограничения?


person John Curry    schedule 21.11.2020    source источник
comment
Если вас беспокоит глобальный доступ к DemandQty, почему бы вам просто не сделать его параметром модели, который можно легко инициализировать из серии pandas?   -  person AirSquid    schedule 21.11.2020
comment
Да, это то, что я сделал в качестве обходного пути, см. Выше. Но по мере того как данные становятся довольно большими. Документы Pyomo советуют, что прямой доступ к данным предпочтительнее. Ситуация кажется забавной, поскольку имеется множество примеров использования внешних данных в функциях правил ограничений, но никто не упомянул о проблемах определения области видимости. Возможно, большая часть работы выполняется в открытом коде, то есть в сценариях.   -  person John Curry    schedule 22.11.2020
comment
Можете ли вы предоставить указатель на раздел dox, который способствует прямому доступу? Насколько я понимаю, это прямой доступ, поскольку данные хранятся в объекте модели, и здесь не должно быть никаких проблем с размером ... даже для больших моделей.   -  person AirSquid    schedule 25.11.2020
comment
Я не могу! Не знаю, где я это видел. Я исправил свой вопрос соответствующим образом.   -  person John Curry    schedule 20.12.2020