3.5.2. print 関数

print 関数は,Python の組み込み関数です. PySIMPLE では print 関数により PySIMPLE のさまざまなオブジェクトに関する情報を, 決まったフォーマットで出力させる機能を有しています.

print 関数を用いてオブジェクトの情報を出力するには以下のように記述します.

print(出力対象)

集合の値を出力するには,次のように記述します.:

S = Set(value=[1, 2, 3])
print(S)

定数の値を出力するには,次のように記述します.:

i = Element(value=[1, 2, 3])
a = Parameter(index=i)
print(a)
print(a[i])

変数を出力するには,次のように記述します.:

i = Element(value=[1, 2, 3])
x = Variable(index=i)
print(x)
print(x[i])

変数の現在値を出力するには,次のように記述します.:

print(x.val)
print(x[i].val)

整数変数の下限値を出力するには,次のように記述します.:

z = IntegerVariable(index=i, lb=0)
print(z.lb)
print(z[i].lb)

式の初期値を出力するには,次のように記述します.:

g = a[i] + x[i]
print(g.init)
print(g[i].init)

制約式の双対変数値を出力するには,次のように記述します.:

cons = x[i] >= a[i]
print(cons.dual)
print(cons[i].dual)

問題に登録された情報を出力するには,次のように記述します.:

p = Problem()
x = Variable()
p += 2*x     # 目的関数
p += x >= 0  # 制約式
print(p)

求解関数 solve の前に print 関数を記述すると,求解前の初期状態の情報が記述されます. 例えば,次のモデルに対する出力は以下のようになります.:

p = Problem(type=min)
i = Element(value=[1, 2, 3])
x = Variable(index=i)
p += Sum(2*x[i])
p += x[i] >= 5
x[i] = 10
print(x.val)  # 10
p.solve(silent=True)
print(x.val)  # 5

出力:

x[1].val=10
x[2].val=10
x[3].val=10
x[1].val=5.000000020802062
x[2].val=5.000000020802062
x[3].val=5.000000020802062

次の例は求解結果を表す要素 result の情報を出力させています. 一覧は pysimple.problem.Result を確認してください.:

x = Variable()
y = Variable()
p = Problem()
p += 2*x + 3*y
p += x + 2*y == 15
p += x >= 0
p += y >= 0
p.solve(silent=True)
print(p.result)

出力:

errorMessage          : ''
method                : 'higher'
optValue              : 22.50000000376254
errorCode             : 0
nvars                 : 2
nfunc                 : 4
iters                 : 6
elapseTime            : 0.0020000040531158447
peakPhysicalMemoryUsed: 44
peakVirtualMemoryUsed : 1518
fevals                : 9
factCount             : 7
tolerance             : 1e-08
residual              : 3.762538162000488e-09
infeasibility         : 3.552713678800501e-15
consInfeasibility     : 0.0
varInfeasibility      : 0.0
hardPenalty           : 0.0
semiHardPenalty       : 0.0
softPenalty           : 0.0
IIS                   : no IIS

出力範囲を,条件式で制限する事も可能です. 以下のようにした場合,変数 x[1], x[2] の現在値のみが出力されます.:

print(x[i<3].val)

正の値を持つ添字のみの現在値を出力するには次のようにします.:

print(x[x[i].val>0].val)

要素や値が文字列の場合,print 関数だけでは引用符は表示されません. 引用符まで表示させるには repr 関数を用います.:

j = Element(value=['p', 'q'])
a = Parameter(index=j, value={'p': 'pair', 'q': 'queue'})
print(a)
print(repr(a))

この出力は次のようになります.:

a[p]=pair
a[q]=queue
a['p']='pair'
a['q']='queue'

インタプリタでは repr の表示がデフォルトとなります.:

>>> j = Element(value=['p', 'q'], name='i')
>>> a = Parameter(index=j, value={'p': 'pair', 'q': 'queue'}, name='a')
>>> a
a['p']='pair'
a['q']='queue'
>>> print(a)
a[p]=pair
a[q]=queue

添字なしの一部オブジェクトにはフォーマット指定が可能です.:

a = Parameter(value=3.14)
x = Variable(init=2.72)
print(f'{a} {a:.1f} {x.val} {x.val:.1f}')  # a=3.14 a=3.1 x.val=2.72 x.val=2.7