StructEngine

StructEngine は内部に SAT ソルバを持つ. 基本的にはコンストラクタで与えられた network 内のノードの入出力 関係を表すCNFをそのSATソルバに追加することになるが, 無駄なCNFを追加する必要はないのでどのノードを使用するかを指定する必要がある.

void
add_cur_node(
  const TpgNode& node
);

void
add_cur_node_list(
  const TpgNodeList& node_list
);

void
add_prev_node(
  const TpgNode& node
);

void
add_prev_node_list(
  const TpgNodeList& node_list
);

add_cur_node()add_cur_node_list() では指定されたノードの推移的ファンアウトの推移的ファンインを 対象のノードに追加する. もちろん重複した追加は無視される.

add_prev_node()add_prev_node_list() では指定されたノードの推移的ファンインを1時刻前のノードの 対象に追加する. もちろん重複した追加は無視される. こちらは遷移故障の1時刻前の条件に用いられる.

これらの関数は処理を行うべきノードのリストに追加しているだけで 実際の処理は行わない. 未処理のノードは SATソルバを起動する時には処理されるようになっているが, 明示的に処理済みにするためには以下の関数を呼び出す.

void
update();
class StructEngine

DTPG 用の基本的なエンコードを行うクラス

SATソルバとノード用の変数マップを持つ. 具体的な仕事は SubEnc の継承クラスを登録することで行う.

Subclassed by BdEngine

Public Functions

StructEngine(const TpgNetwork &network, const JsonValue &option = JsonValue{})

コンストラクタ

パラメータ:
  • network -- [in] 対象のネットワーク

  • option -- [in] 初期化オプション "sat_param": JsonValue SATソルバの初期化パラメータ "justifier": string Justifier の初期化パラメータ

~StructEngine()

デストラクタ

保持している SubEnc はここで開放される.

void add_subenc(std::unique_ptr<SubEnc> &&enc)

SubEnc を追加する.

void add_cur_node(const TpgNode &node)

現時刻で考慮するノードを追加する.

実際にはこのノードのTFOのTFIを対象にする.

inline void add_cur_node_list(const TpgNodeList &node_list)

現時刻で考慮するノードのリストを追加する.

実際にはこのノードのTFOのTFIを対象にする.

void add_prev_node(const TpgNode &node)

1時刻前で考慮するノードを追加する.

実際にはこのノードのTFIを対象にする.

inline void add_prev_node_list(const TpgNodeList &node_list)

1時刻前で考慮するノードのリストを追加する.

実際にはこのノードのTFIを対象にする.

inline void update()

未処理のノードを処理する.

AssignList justify(const AssignList &assign_list)

与えられた割り当てを満足する外部入力の割り当てを求める.

  • 事前にSAT問題の充足解が求められている必要がある.

  • 必要な値割り当てのみが記録される.

パラメータ:

assign_list -- [in] 値割り当てのリスト

戻り値:

外部入力の割り当てリストを返す.

AssignList get_pi_assign()

現在の外部入力の割当を得る.

  • 事前にSAT問題の充足解が求められている必要がある.

  • すべての外部入力になんらかの値が入る

戻り値:

外部入力の割り当てリストを返す.

SatLiteral conv_to_literal(Assign assign)

値割り当てを対応するリテラルに変換する.

パラメータ:

assign -- [in] 値割り当て

std::vector<SatLiteral> conv_to_literal_list(const AssignList &assign_list)

値割り当てのリストを対応するリテラルのリストに変換する.

パラメータ:

assign_list -- [in] 値割り当てのリスト

std::vector<SatLiteral> expr_to_cnf(const Expr &expr)

与えられた論理式を充足させるCNF式を作る.

論理式中の変数番号は TpgNode->id() * 2 + time に対応している.

パラメータ:

expr -- [in] 論理式

戻り値:

条件を表すリテラルのリストを返す.

inline const TpgNetwork &network() const

対象のネットワークを得る.

inline const TpgNodeList &cur_node_list() const

関連するノードのリスト

inline const TpgNodeList &prev_node_list() const

1時刻前の値に関連するノードのリスト

SatLiteral new_variable(bool decision = false)

変数を作る.

パラメータ:

decision -- [in] 決定変数のときに true とする.

SatBool3 solve(const std::vector<SatLiteral> &assumptions = {})

SAT問題を解く

パラメータ:

assumptions -- [in] アサートするリテラルのリスト

SatStats get_stats() const

現在の内部状態を得る.

inline SatSolver &solver()

SATソルバを返す.

inline SatLiteral gvar(const TpgNode &node)

ノードの値を表す変数を返す.

パラメータ:

node -- [in] 対象のノード

inline const VidMap &gvar_map()

ノードの値を表す変数の辞書を返す.

inline SatLiteral hvar(const TpgNode &node)

ノードの1時刻前の値を表す変数を返す.

パラメータ:

node -- [in] 対象のノード

bool val(const TpgNode &node, int time)

値を返す.

直前に solver().solve() を呼んでいる必要がある.

パラメータ:
  • node -- [in] 対象のノード

  • time -- [in] 時刻(0 or 1)

inline double cnf_time() const

CNF の生成時間を返す.