OMMX Python SDK 2.9.x#

Static Badge Static Badge Static Badge Static Badge

詳細な変更点は上の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 バージョンと プラットフォームに対応したソルバーおよび依存パッケージが必要です。