3.8.3. index 属性の便利な使い方

添字付きオブジェクトである Parameter, Variable, Expression, Constraint などは index 属性を持っています. この index 属性を活用すると,添字の次元を抽象化した記述をすることができます. 以下では添字なしの変数 x と一次元の添字をもつ変数 xi に対して添字を抽象化して __getitem__ を利用しています.:

>>> i = Element(value=[1, 2], name='i')
>>> x = Variable(name='x')
>>> xi = Variable(index=i, name='xi')
>>> x[x.index]    # x と同じ
x:
x
>>> xi[xi.index]  # xi[i] と同じ
xi:
xi[1]
xi[2]

変数に 1 を加えた式を作成したい場合,通常ではそれぞれ x+1, x[i]+1 と記述する必要がありますが, index 属性を利用することで, x[x.index]+1 などと,添字の有無や次元を意識せず記述することができるようになります.

__getitem__ に似たメソッドとしてバージョン 1.5.0 で追加された get メソッドがあります. get メソッドは引数に可変長位置引数をとるため index 属性を展開して渡す必要があります.:

>>> x.get(*x.index)    # x.get() と同じ
x.get():
x.get()
>>> xi.get(*xi.index)  # xi.get(i) と同じ
xi.get(i):
xi.get(i)[1]
xi.get(i)[2]

同様に __setitem__ でも index 属性を利用することができます. 特に添字を持たない変数 x では x=1 と記述することはできないため, index 属性を利用する明確なメリットがあります.:

>>> x[x.index] = 1    # x = 1 とは書けないので注意
>>> x.val
x.val=1
>>> xi[xi.index] = 1  # xi[i] = 1 と同じ
>>> xi.val
xi[1].val=1
xi[2].val=1

最後に宣言時の index 引数にも利用できることを記しておきましょう. ある変数の類似物を作成するときなど,添字を気にしなくて済むため便利な場合があります.:

>>> xval = Parameter(index=x.index, value=x.val, name='xval')
>>> xval
xval=1
>>> xival = Parameter(index=xi.index, value=xi.val, name='xival')
>>> xival
xival[1]=1
xival[2]=1

常に添字を抽象化する必要はありませんが,添字の次元が異なる変数を一括して処理したい場合など, 有効な場面もあるでしょう.