miniBDD を試す
miniBDD(a Minimalistic BDD Library) は、Oxford 大学において教育目的に作られた軽量のBDD(Binary Decision Diagram)ライブラリである。
miniBDD – a Minimalistic BDD Library
miniBDD is a very lightweight BDD library for teaching purposes. It's not very efficient (the nodes use too much memory), and it is missing a lot of features (e.g., dynamic variable reordering). The main point is that miniBDD is only about 600 lines of C++ code, and does not make use of any low-level programming. All data structures are instances of STL templates.
以下は sample code。
// sample_miniBDD #include <iostream> #include "miniBDD.h" void sample(){ miniBDD_mgr mgr; BDD x=mgr.Var("x"); BDD y=mgr.Var("y"); BDD z=mgr.Var("z"); BDD f=(x&y&z)|(!x&!y&z); y.clear(); x.clear(); z.clear(); mgr.DumpDot(std::cout); mgr.DumpTikZ(std::cout); mgr.DumpTable(std::cout); } int main(){ sample(); }
つまり、この例では、(x&y&z)|(!x&!y&z) のBDDを作る。
これを付属の MakeFile でmake すれば良い。
// Makefile 例 CPLUSFLAGS = -g >> all: miniBDD.o sample_miniBDD miniBDD.h: miniBDD.cpp: miniBDD.o: miniBDD.cpp miniBDD.inc miniBDD.h g++ $(CPLUSFLAGS) -c miniBDD.cpp -o miniBDD.o sample_miniBDD.o: miniBDD.inc miniBDD.h sample_miniBDD.cpp g++ $(CPLUSFLAGS) -c sample_miniBDD.cpp -o sample_miniBDD.o sample_miniBDD: miniBDD.o sample_miniBDD.o g++ $(CPLUSFLAGS) miniBDD.o sample_miniBDD.o -o sample_miniBDD clean: rm -f miniBDD.o sample_miniBDD.o sample_miniBDD miniBDD.tgz: miniBDD.cpp miniBDD.inc miniBDD.h sample_miniBDD.cpp Makefile tar cvfz miniBDD.tgz miniBDD.cpp miniBDD.inc \ miniBDD.h sample_miniBDD.cpp Makefile
コンパイルされた結果、出力された実行ファイルを実行すると、tex 形式のファイルが出力される。
このtex ファイルは、tikzパッケージを使用しているので、以下をTexファイルに追加し、Texコンパイルを行えば良い。これをTexコンパイルし、dvipdfmxを通じて、PDFにするとグラフィカルなBDD表現が表示される。(dvi ファイルでは表示されないので、注意が必要。)
\usepackage[dvipdfmx]{graphicx}%
%\def\pgfsysdriver{pgfsys-dvipdfmx.def}%(graphicxパッケージを使用しない場合はこの行を有効に)
\usepackage{tikz}%(これで、pgfとpgfforが読み込まれます。)
全体としては、以下の様なTexファイルになる。
\documentclass{article}
\usepackage[dvipdfmx]{graphicx}
\usepackage{tikz}\begin{document}
\begin{tikzpicture}[node distance=1cm]
\tikzstyle{BDDnode}=[circle,draw=black,inner sep=0pt,minimum size=5mm]
\node[] (vx) {$\mathit{x}$};
\node[xshift=0cm, BDDnode, right of=vx] (n13) {\small $13$};\node[below of=vx] (vy) {$\mathit{y}$};
\node[xshift=0cm, BDDnode, right of=vy] (n8) {\small $8$};
\node[xshift=0cm, BDDnode, right of=n8] (n11) {\small $11$};\node[below of=vy] (vz) {$\mathit{z}$};
\node[xshift=0cm, BDDnode, right of=vz] (n4) {\small $4$};
% terminals
\node[draw=black, style=rectangle, below of=vz, xshift=1cm] (n1) {$1$};
\node[draw=black, style=rectangle, left of=n1] (n0) {$0$};% edges
\draw[->,dashed] (n4) -> (n0);
\draw[->] (n4) -> (n1);
\draw[->,dashed] (n8) -> (n4);
\draw[->] (n8) -> (n0);
\draw[->,dashed] (n11) -> (n0);
\draw[->] (n11) -> (n4);
\draw[->,dashed] (n13) -> (n8);
\draw[->] (n13) -> (n11);\end{tikzpicture}
\end{document}