自作ソルバ(toysolver)の一部として書いていたOPB/PBOの入出力ライブラリをpseudo-booleanという別パッケージに切り出した。 OPB/PBOは過去の Pseudo Boolean Competition で使われていたファイル形式で、今年の Pseudo-Boolean Evaluation でも使われるもの。

汎用性のあるコードは出来るだけ独立したライブラリに切り出していきたいと思っているが、いざ切り出そうとすると、インターフェースをある程度固める必要もあって、こんな小さなライブラリであってもちょっと悩ましかった。

今残っている悩みは、制約のリストとは別に制約数を持っていることで、これはリストのlengthはO(n)で遅いからだけれど、同じ情報を別途持っていると整合性がとれない状態があり得て気持ち悪い。 Data.Sequenceなどのサイズ計算がO(1)である列のデータ型を使えば良いのだけれど、それはそれでリストの手軽さが失われてしまってうーんという感じ。

Input/Output Format and Solver Requirements for the Competitions of Pseudo-Boolean Solvers
http://www.cril.univ-artois.fr/PB12/format.pdf

bseudo-booleanパッケージ
https://hackage.haskell.org/package/pseudo-boolean
https://github.com/msakai/pseudo-boolean

toysolverパッケージ
https://hackage.haskell.org/package/toysolver
https://github.com/msakai/toysolver