HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: SCIPオプティマイザのためのGoバインディング

Show HN: Go Bindings for SCIP Optimizer (github.com)

3 pointsby generalist_dev0 コメント

要約

SCIPオプティマイザ(混合整数計画法および混合整数非線形計画法の高速ソルバー)のためのGoバインディング「scipgo」が公開されました。このライブラリは、Rust版のAPIに近く、変数、制約、プラグインなどをGoから利用可能にします。インストールや使用方法、ドキュメントについても説明されています。

全文翻訳

scipgo

[画像: Go Reference] [画像: CI] [画像: Go Report Card] [画像: License: MIT]

SCIP の Go バインディングです。SCIP は、混合整数計画法 (MIP) および混合整数非線形計画法 (MINLP) における最速の非商用ソルバーの 1 つです。scipgo は Rust クレート russcip のポートであり、その API を密接に踏襲しているため、両者の間で移行するのは容易です。

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 の並列ポートフォリオ。
    EnableExactSolving と *big.Rat 結果によるエンドツーエンドの有理数演算。

インストール

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 のマッピング

例

examples/ ディレクトリの下に 11 個の完全なプログラムがあります。それぞれが実際の問題を解き、その答えを確認します。最初の MIP、ナップサック問題、カスタムブランチング、ノード選択、イベント処理、丸めヒューリスティック、クリックスパレータ、部分ツアー除去付き TSP、ブランチ・アンド・プライスによるカッティングストックおよびビンパッキング、並列ソルブが含まれます。
go run . で各ディレクトリから実行できます。

リポジトリレイアウト

パス内容
scip/ライブラリ、単一の Go パッケージ。cgo グルー、Model API、ビルダー、プラグインコールバックは一緒に配置されます。これは、cgo のエクスポートされたトランポリンが C ヘルパーを所有するパッケージに配置される必要があるためです。
examples/サンプルプログラム
docs/ガイド
data/test/テストおよびサンプルで使用される小さな LP および MPS インスタンス

ステータス

scipgo は 1.0 未満です。API の形状は安定しており、リネームは非推奨のエイリアスとともに提供され、次のメジャーバージョンまで維持されます。変更履歴はこちらを参照してください。
macOS および Linux 上で、プッシュごとに SCIP 10 に対してテストされています。

貢献

バグレポート、質問、プルリクエストを歓迎します。
貢献ガイドでは、開発セットアップ、テストスイート、コードが従う規約について説明しています。

ライセンス

scipgo は MIT ライセンスの下でライセンスされています。Copyright (c) 2026 Egoisuto Labs。

これは Mohammed Ghannam および貢献者による russcip のポートであり、Apache License 2.0 の下でライセンスされています。
派生部分(API デザイン、テスト、例、data/test)は、そのライセンスを維持します。LICENSE-russcip および NOTICE を参照し、再配布時には両方のファイルを保持してください。
SCIP 自体は Apache-2.0 であり、バンドルではなくリンクされています。