JavaScriptを有効にしてください

PyomoのImplicitly replacing the Component attribute警告について

 ·   2 min read

はじめに

Pythonの最適化モデリングツールPyomoで、WARNING: Implicitly replacing the Component attribute <variable>という警告が表示される場合、Pyomoのモデルに重複した変数名や制約名が定義されています。異なる変数名や制約名にすることで、警告が表示されなくなります。

検証環境は以下の通りです。

バージョン
Python 3.7.9
Pyomo 6.4.1

重複した変数・制約

2つの変数を持つPyomoモデルを考えます。まず、誤った例として、以下のようにx1が2回定義されたコードを実行します。

1
2
3
4
5
6
import pyomo.environ as pyo

model = pyo.ConcreteModel()

model.x1 = pyo.Var(domain=pyo.Reals)
model.x1 = pyo.Var(domain=pyo.Reals)

これを実行すると、以下の警告が表示されます。原因となる行番号が表示されないため、大規模なコードでは発生個所の特定に苦労しそうです。また、同じ名前の変数を重複して定義すると、後のものに置き換えられる仕様です。

WARNING: Implicitly replacing the Component attribute x1 (type=<class
    'pyomo.core.base.var.ScalarVar'>) on block unknown with a new Component
    (type=<class 'pyomo.core.base.var.AbstractScalarVar'>). This is usually
    indicative of a modelling error. To avoid this warning, use
    block.del_component() and block.add_component().

正しいコードでは、x1, x2などと異なる変数名にします。

1
2
3
4
5
6
import pyomo.environ as pyo

model = pyo.ConcreteModel()

model.x1 = pyo.Var(domain=pyo.Reals)
model.x2 = pyo.Var(domain=pyo.Reals)

制約についても同様に、異なる変数名を定義します。重複した制約名を定義すると、変数の場合と似た警告が表示されます。

WARNING: Implicitly replacing the Component attribute const1 (type=<class
    'pyomo.core.base.constraint.ScalarConstraint'>) on block unknown with a
    new Component (type=<class
    'pyomo.core.base.constraint.AbstractScalarConstraint'>). This is usually
    indicative of a modelling error. To avoid this warning, use
    block.del_component() and block.add_component().

参考

pyomo Implicitly replacing the Component attribute - Stack Overflow

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索