mk_gomory_cut(row const & r)
ファイル内のメソッドではsrc/smt/theory_arith_int.h
、Simplex r
tableau の行です。さらに、基本変数x_i
は整数ですが、整数以外の値に割り当てられています。
イテレータit
は、行エントリをトラバースするために使用されます。各エントリは基本的に と のペアa_ij
です。は数値で、x_j
は(理論) 変数です。a_ij
x_j
theory_arith は、ファイルで定義されたソルバーのプラグインですsrc/smt/smt_context.h
。このソルバーは、theory_arith などの多くの理論プラグインを組み合わせています。式から理論変数へのマッピングを維持します。このマッピングは、 というオブジェクトに格納されますenode
。
このメソッドget_enode(v)
は、理論変数に関連付けられた e ノードを取得しますv
。さらに、get_enode(v)->get_owner()
理論変数 に関連付けられた式を返しますv
。
ここで、理論変数v
がスラックかどうかをテストしたいとします。まず、次を使用して関連する式を取得できます。
app * t = to_app(get_enode(v)->get_owner())
を使用しto_app
たのは、理論プラグインが基底項のみを処理する (つまり、自由変数を含まない) ためです。またはなどの複合算術項の場合、変数v
はスラックです。つまり、スラックは基本的に複合算術用語の「名前」です。以下を使用してこれをテストできます。t
(+ a b)
(* a b c)
t->get_family_id() == get_id()
この式が に評価される場合true
、t
は複合算術項であり、結果としてv
スラックです。
備考:get_id()
の方法ですtheory_arith
。実際、すべての理論プラグインにはこのメソッドがあります。