5.10.2 自動代入の禁止 lock()/unlock()
lock(); unlock();
集合の自動代入は集合のデータを明示的に与える必要が省かれ効率的に記述ができますが,一方で誤ったデータを与えた際,集合に予期せぬ変更が加わる場合があります.
例えば以下のように,モデルにとって悪影響を与える場合があります.
Set S = "1 2 3"; Element i(set = S); Parameter c(index = i); c = "[1] 7.2 [2] 8.2 [5] 1.2"; // 誤って添字 5 を与える // これにより S の内容は "1 2 3 5" となってしまう Variable x(index = i); sum(x[i], i) >= 5; // 和の取られる範囲は "1 2 3" ではなく "1 2 5" となる.
そのような場合に有効なのが集合に対するlock()
という操作です.集合に対してlock()
を呼び出すと,以降の自動代入による要素の追加を禁じます.
例えば上記の例でlock()
を記述するとlock()
以降で集合に要素が追加されるとエラーとなります.
Set S = "1 2 3"; S.lock(); // 集合をロック Element i(set = S); Parameter c(index = i); c = "[1] 7.2 [2] 8.2 [5] 1.2"; // 誤って添字 5 を与える // ここで S は "1 2 3 5" となってしまうのでエラーとなる
上記の様にデータのチェックが容易となるため特にモデル開発時に役立ちます.
操作lock()
の逆操作(自動代入を許す)としてunlock()
という操作があります.以下利用例です.
Set S = "1 2 3"; S.lock(); // 集合をロック Element i(set = S); Parameter c(index = i); S.unlock(); c = "[1] 7.2 [2] 8.2 [5] 1.2"; // 誤って添字 5 を与える // ここで S は "1 2 3 5" となってしまうが unlock() により許容される.
上に戻る