JijModeling 1.12.1 リリースノート#

機能強化#

Interpreter エラーの可読性向上#

Interpreter で評価エラーが発生した場合、より可読性の高いエラーが表示されるようになりました。例:

import jijmodeling as jm

D = jm.Placeholder("D", dtype=jm.DataType.INTEGER)
T = jm.Placeholder("T", dtype=jm.DataType.INTEGER)
N = jm.Placeholder("N", dtype=jm.DataType.INTEGER)
H = jm.Placeholder("H", shape=(D, T, N))
R = jm.Placeholder("R", shape=(D, N))

x = jm.BinaryVar("x", shape=(D, T, N))
d = jm.Element("d", belong_to=(0, D))
t = jm.Element("t", belong_to=(0, T))
i = jm.Element("i", belong_to=(0, N))

problem = jm.Problem(name="shift_optimization")
problem += jm.Constraint("night_shift", R[d+1, i] <= x[d, T-1, i], forall=[d, i])
problem += jm.sum([d, t, i], x[d, t, i])

problem
\[\begin{split}\begin{array}{cccc}\text{Problem:} & \text{shift\_optimization} & & \\& & \min \quad \displaystyle \sum_{d = 0}^{D - 1} \sum_{t = 0}^{T - 1} \sum_{i = 0}^{N - 1} x_{d, t, i} & \\\text{{s.t.}} & & & \\ & \text{night\_shift} & \displaystyle R_{d + 1, i} \leq x_{d, T - 1, i} & \forall d \in \left\{0,\ldots,D - 1\right\} \forall i \in \left\{0,\ldots,N - 1\right\} \\\text{{where}} & & & \\& x & 3\text{-dim binary variable}\\\end{array}\end{split}\]
num_days = 7
num_times = 3
num_people = 5

data = problem.generate_random_dataset(
    options={
        "D": {"value": num_days},
        "T": {"value": num_times},
        
        "N": {"value": num_people},
    }
)
interp = jm.Interpreter(data)

try:
    interp.eval_problem(problem)
except Exception as e:
    print(e)
Traceback (most recent last):
    while evaluating Problem `shift_optimization',
        defeind at File "/tmp/ipykernel_2125/2988517098.py", line 14, col 11-48
    while evaluating constraint: `night_shift',
        defeind at File "/tmp/ipykernel_2125/2988517098.py", line 15, col 12-82
    while evaluating expression `R[d + 1, i] - x[d, T - 1, i]',
        defeind at File "/tmp/ipykernel_2125/2988517098.py", line 15, col 41-66
    while evaluating expression `R[d + 1, i]',
        defeind at File "/tmp/ipykernel_2125/2988517098.py", line 15, col 41-50

File "/tmp/ipykernel_2125/2988517098.py", line 15, col 41-50:

    15  |  problem += jm.Constraint("night_shift", R[d+1, i] <= x[d, T-1, i], forall=[d, i])
                                                   ^^^^^^^^^

IndexError: Index (7,0) is out of range for shape (7,5)

バグ修正#

Interpreter.eval_* のパフォーマンスバグを修正#

以前は、Interpreter での式の評価に意図したよりも多くの時間がかかっていました。 これは、OMMX の Function に対する演算を繰り返し呼び出していたためで、中間形式との相互変換とメモリの再割り当てが行われていた結果、一部の総和演算で二次関数的にパフォーマンス低下が発生していました。

今リリースから、JijModeling は専用の中間形式を使用するようになり、こうした評価時のオーバーヘッドが大幅に抑えられるようになりました。