OMMX Python SDK 2.9.x#
詳細な変更点は上のGitHub Releaseをご覧ください。以下に主な変更点をまとめます。
新機能#
名前と添字による SCIP 初期解の指定 (2.9.3, #1274)#
NamedState で変数の名前と添字をキーとする初期値を指定できます。
SCIP の initial_state に直接渡せるほか、Instance.state_from_named_values()
で State に明示的に変換することもできます。
initial_values: NamedState = {"x": {(0,): 1.0, (1,): 4.0}}
solution = OMMXPySCIPOptAdapter.solve(instance, initial_state=initial_values)
state = instance.state_from_named_values(initial_values)
対象インスタンスの変数 ID に変換するため、モデルの再生成で ID が変わっても値を再利用できます。
見つからないキーは KeyError、複数の変数に一致する名前・添字は ValueError になります。
文字列・整数への正規化でキーが重複する入力も ValueError になります。
詳しい利用例は 名前と添字で初期値を指定する を参照してください。
2.9.3のソルバーアダプターパッケージは、v2系のOMMX 2.9.3以降を必要とします。
Rust SDK v3からV1 Bridgeでモデルを受信 (2.9.0, #1226)#
Rust側でProtobufV1を選択し、既存のPython SDK 2.xのクラスへモデルを
転送できるようになりました。通常制約による定式化と、従来のソルバー
アダプター向けのConstraintHintsを保持します。受信側SDKがデータを検証し、
未対応の関数表現はエラーにします。
Bridgeが扱う7型をトップレベルからもインポートできます。
ommx.Function、Constraint、DecisionVariable、Instance、
ParametricInstance、Solution、SampleSetは、それぞれommx.v1の
同名クラスと同じクラスです。既存のインポートやソルバーAPIは引き続き使えます。
Bridgeのプロトコル・データ検証の失敗はommx.BridgeErrorで通知します。
このSDKが受信できるのはProtobufV1です。送信側が転送前に数学的な表現を選び、 Bridge自体は制約のloweringや昇格を行いません。
バグ修正#
SCIP の二次目的関数に対する初期解を修正 (2.9.3, #1274)#
SCIP の目的関数用補助変数にも、指定した初期値から計算した値を設定するようになりました。
元の問題で実行可能な初期値が、補助変数の未設定により実行不能になる問題を修正します。
State、ID キー辞書、NamedState に適用され、省略した初期値はゼロとして目的値を計算します。
protobufシリアライズ時のアノテーション消失を修正 (2.9.3, #1262)#
Instance、ParametricInstance、Solution、SampleSet のユーザーアノテーションと
メタデータが、to_bytes() / from_bytes() の往復で保持されるようになりました。
Instanceのタイトル、説明、作成ツール名、ライセンス、データセット、著者、作成日時はprotobufのDescriptionに、
求解・サンプリングの来歴はProcessMetadataに保存されます。
既存の変更可能な annotations 辞書とアノテーション用メソッドは引き続き使えます。
authors プロパティは、カンマを含む名前や空の名前を含めてprotobufの各要素を保持し、
アノテーション辞書への編集も反映します。
著者リストの明示的な変更は dataclasses.replace() による複製でも保持します。
dataclassの複製では、アノテーション辞書の編集と削除を保持し、
rawモデルのメタデータを復活させたり原本を書き換えたりしません。
from ommx import Instance
instance = Instance.empty()
instance.title = "My model"
instance.add_user_annotation("source", "python")
restored = Instance.from_bytes(instance.to_bytes())
assert restored.title == "My model"
assert restored.get_user_annotation("source") == "python"
モデル変換、部分評価、パラメータの具体化、サンプルからSolutionへの取り出しでも アノテーションを保持します。Artifactの読み込みでは、旧形式のdescriptorにのみ保存された アノテーションを補完し、同じキーが両方にある場合はprotobuf側の値を優先します。 optionalな文字列フィールドに明示的な空文字がある場合も、protobuf側の値を優先します。 変数数と制約数は引き続きArtifactのdescriptorアノテーションとして扱います。
予約されていないアノテーションのキーと値には、任意の文字列を保存できます。
org.ommx.v1.* はOMMXのメタデータ用に予約されており、この名前空間の未知のキーは
Python側のシリアライズ時に拒否されます。追加したprotobufフィールドはSDK v3と同じフィールド番号を使い、
format_version = 0 を維持します。旧SDKでも数理モデルは読み込めますが、デコードして
再エンコードすると追加のメタデータが消失する場合があります。
Rust側のprotobuf変換は、拡張アノテーションのmapから予約キーを除外します。
公開mapへ直接書き込んだ場合も、to_bytes() は戻り値の Vec<u8> を維持し、
予約キーによるpanicは発生しません。外部protobufの拡張mapに予約キーがある場合は、
読み込み時に引き続きエラーを返します。
ommx.v1 のprotobuf定義は、Function.Expression の定義を含めてSDK v3と共通です。
SDK 2.xではこの関数表現は引き続き未対応であり、V1 Bridgeを含めてRust側の関数・モデルへ
変換する時点で拒否します。ParametricInstance.from_bytes() は従来どおり検証を遅延します。
旧Rust v1の検証、QUBO/HUBO書き出し、整数slack変換も、未対応のExpressionに対して
panicせずエラーを返します。
penalty構築前の整数エンコードと一括置換 (2.9.2, #1254)#
Instance.log_encode() は、指定された整数変数をまとめてエンコードします。
すべての変数のboundを検証してからInstanceを書き換えます。非循環の置換は、
置換同士の依存関係を先に解決し、各多項式の項を一度走査して処理します。
to_qubo() と to_hubo() は、slack変換の後、制約を二乗してpenaltyを構築する
前に整数エンコードを実行します。penaltyによって除去された制約には
エンコード後の式が保存されますが、制約値と実行可能性は引き続き復元された
決定変数を使って評価されます。別の順序で変換する場合は、個々の変換メソッドを
明示的に呼び出してください。
HiGHS のモデル構築を高速化 (2.9.0, #1239)#
HiGHS Adapter で項数の多い線形目的関数や制約を変換する際、加算のたびに
蓄積済みの式全体をコピーしないようにしました。
OMMXHighsAdapter(instance) はモデル構築のみを行い、制約追加前に求解を
実行しなくなります。変換から求解・解の復元まで行う場合は
OMMXHighsAdapter.solve(instance) を、構築済みモデルを求解する場合は
adapter.solver_input.run() を使ってください。
定数目的関数についても、定数値と最小化・最大化の方向を HiGHS モデルに保持します。
改善#
ソルバーアダプターの Python バージョン上限を撤廃 (2.9.1, #1246)#
HiGHS、PySCIPOpt、OpenJij の各アダプターの Python 要件を
requires-python = ">=3.10" に変更し、従来の <3.14 という上限を撤廃しました。
アダプター自身のパッケージメタデータによって Python 3.14 へのインストールが
制限されなくなります。インストールには引き続き、使用する Python バージョンと
プラットフォームに対応したソルバーおよび依存パッケージが必要です。