プログラミング
Show HN: SCIPオプティマイザのためのGoバインディング
Show HN: Go Bindings for SCIP Optimizer (github.com)
要約
SCIPオプティマイザ(混合整数計画法および混合整数非線形計画法の高速ソルバー)のためのGoバインディング「scipgo」が公開されました。このライブラリは、Rust版のAPIに近く、変数、制約、プラグインなどをGoから利用可能にします。インストールや使用方法、ドキュメントについても説明されています。
全文翻訳
SCIPのためのGoバインディング、scipgoです。SCIPは、混合整数計画法(MIP)および混合整数非線形計画法(MINLP)のための、最も高速な非商用ソルバーの1つです。scipgoはRustクレートであるrusscipのポートであり、そのAPIに密接に従っているため、両者の間での移行は容易です。
```go
model := scip.DefaultModel().HideOutput().Maximize()
x := scip.NewVar().Name("x").Int().Obj(3).AddTo(model)
y := scip.NewVar().Name("y").Int().Obj(4).AddTo(model)
model.Add(
scip.NewCons().Coef(x, 2).Coef(y, 1).Le(100),
scip.NewCons().Coef(x, 1).Coef(y, 2).Le(80),
)
solved := model.Solve()
sol, _ := solved.BestSol()
fmt.Println(solved.Status(), sol.ObjVal(), sol.Val(x), sol.Val(y))
// Optimal 200 40 20
```
機能
モデリングの全表面。連続変数、整数変数、バイナリ変数、暗黙的整数変数。線形制約、集合分割制約、パッキング制約、カバリング制約、カーディナリティ制約、SOS1制約、指標制約、二次制約、一般非線形制約。式ツリーとSCIP独自の式構文。LP、MPS、およびSCIPが認識するその他のフォーマットの読み書き。
Goでのプラグイン。分岐ルール、プライマルヒューリスティック、セパレーター、プライサー、制約ハンドラー、イベントハンドラー、ノードセレクターはGoインターフェースであり、ビルダーで登録されます。コールバックでのパニックはキャプチャされ、プロセスをクラッシュさせる代わりにSolveから再発生します。
安全な設計。SCIPに対して失敗する可能性のあるメソッドは、パニックする形式とエラーを返す形式があり、呼び出しサイトごとに選択できます。すべてのクエリは、ソルバーステージとモデルの有効性をチェックし、SCIPに触れる前にハンドルをチェックするため、間違ったステージでの呼び出し、解放されたモデルでの呼び出し、または解放または置換された問題のハンドルでの呼び出しは、未定義の動作ではなくGoのエラーを生成します。
Goサービスへの適合。ソルブはcontext.Contextで停止します。SCIPのログはio.Writer、*slog.Logger、またはコールバックにルーティングされます。メモリはFreeまたはファイナライザーによって明示的に解放されます。
並列および正確なソルブ。SolveConcurrentによるSCIPの並列ポートフォリオ、および*big.Ratの結果によるEnableExactSolvingによるエンドツーエンドの有理数演算。
インストール
scipgoは、インストール済みのSCIP 10にcgoを介してリンクします。何もバンドルされていません。
# macOS
brew install scip
# Ubuntu 22.04(他のディストリビューション用のパッケージはSCIPリリースページにあります)
wget https://github.com/scipopt/scip/releases/download/v10.0.2/scipoptsuite_10.0.2-1+jammy_amd64.deb
sudo apt-get install -y ./scipoptsuite_10.0.2-1+jammy_amd64.deb
go get github.com/egoisutolabs/scipgo/scip
Go 1.25以降とCコンパイラが必要です。カスタムロケーションのSCIP、Dockerイメージ、ビルドエラーについては、インストールガイドを参照してください。
ドキュメント
ドキュメントは、最初のモデルからブランチアンドプライスまでのバインディングを説明しています。APIリファレンスはすべてのメソッドを文書化しています。
ガイド
はじめに
最初のモデル、ビルダー、ファイルの読み込み、ソルブの制御
モデリング
変数、すべての制約の種類、非線形式、ファイルI/O
ソルブ
ステータス、制限、ソルブの停止、統計、再ソルブ、並列および正確モード
ソリューション
ソリューションの読み込み、MIPスタート、部分ソリューション
パラメータ
パラメータAPIと知っておくべきパラメータ
ロギング
SCIPのログとエラー出力のルーティング
エラー
Tryおよびパニック形式、エラータイプ、有効性
モデルライフサイクル
ステージ、ハンドル、メモリ、ゴルーチン
プラグイン
ブランチルール、ヒューリスティック、セパレーター、プライサー、制約ハンドラー、イベントハンドラー、ノードセレクターの記述
russcipからの移行
Rust APIとこのAPIのマッピング
例
11個の完全なプログラムがexamples/下にあります。それぞれが実際の問題を解決し、その答えをチェックします。最初のMIP、ナップサック問題、カスタムブランチ、ノード選択、イベントハンドリング、丸めヒューリスティック、クリップセパレーター、サブツアー排除付きTSP、ブランチアンドプライスによるカッティングストックおよびビンパッキング、並列ソルブです。ディレクトリからgo run ..で実行できます。
リポジトリレイアウト
パス
内容
scip/
ライブラリ、単一のGoパッケージ。cgoグルー、Model API、ビルダー、プラグインコールバックは、cgoのエクスポートされたトランポリンがCヘルパーを所有するパッケージに配置する必要があるため、ここにあります。
examples/
サンプルプログラム
docs/
ガイド
data/test/
テストと例で使用される小さなLPおよびMPSインスタンス
ステータス
scipgoは1.0未満です。APIの形状は安定しており、リネームは次のメジャーバージョンまで非推奨のエイリアスとともに提供されます。チェンジログを参照してください。SCIP 10に対して、すべてのプッシュでmacOSおよびLinuxでテストされています。
貢献
バグレポート、質問、プルリクエストを歓迎します。貢献ガイドには、開発セットアップ、テストスイート、コードが従う規約が記載されています。
ライセンス
scipgoはMITライセンス、Copyright (c) 2026 Egoisuto Labsの下でライセンスされています。これはMohammed Ghannamおよび貢献者によるrusscipのポートであり、Apache License 2.0の下でライセンスされています。派生部分(APIデザイン、テスト、例、data/test)はこのライセンスを維持します。LICENSE-russcipおよびNOTICEを参照し、再配布時には両方のファイルを含めてください。SCIP自体はApache-2.0であり、バンドルではなくリンクされています。