Fixed SWIG octave wrappers and added octave port of example_sprinkler
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 14 Oct 2009 09:26:28 +0000 (11:26 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 14 Oct 2009 09:26:28 +0000 (11:26 +0200)
Makefile.CYGWIN
Makefile.LINUX
Makefile.MACOSX
Makefile.WINDOWS
Makefile.conf [new symlink]
swig/Makefile
swig/dai.i
swig/example_sprinkler.m [new file with mode: 0644]
swig/test.py [deleted file]

index 014362f..47ec495 100644 (file)
@@ -82,7 +82,7 @@ MEXFLAGS=CXX\#$(CC) CXXFLAGS\#'$(CCFLAGS)'
 
 # SWIG PYTHON INTERFACE
 # The following should resolve to the SWIG command
-SWIG=swig -classic
+SWIG=swig
 # Location of Python header files
 INCLUDE_PYTHON=/usr/include/python2.5
 # Location of Boost C++ library header files
index ae01cbc..11bab16 100644 (file)
@@ -81,7 +81,7 @@ MEXFLAGS=CXX\#$(CC) CXXFLAGS\#'$(CCFLAGS)'
 
 # SWIG PYTHON INTERFACE
 # The following should resolve to the SWIG command
-SWIG=swig -classic
+SWIG=swig
 # Location of Python header files
 INCLUDE_PYTHON=/usr/include/python2.5
 # Location of Boost C++ library header files
index d8b923a..2fb813d 100644 (file)
@@ -81,7 +81,7 @@ MEXFLAGS=CXX\#$(CC) CXXFLAGS\#'$(CCFLAGS)'
 
 # SWIG PYTHON INTERFACE
 # The following should resolve to the SWIG command
-SWIG=swig -classic
+SWIG=swig
 # Location of Python header files
 INCLUDE_PYTHON=/usr/include/python2.5
 # Location of Boost C++ library header files
index 22a9707..986c086 100644 (file)
@@ -83,7 +83,7 @@ MEXFLAGS=CXX\#$(CC) CXXFLAGS\#"$(CCFLAGS)"
 
 # SWIG PYTHON INTERFACE
 # The following should resolve to the SWIG command
-SWIG=swig -classic
+SWIG=swig
 # Location of Python header files
 INCLUDE_PYTHON=C:\python2.5
 # Location of Boost C++ library header files
diff --git a/Makefile.conf b/Makefile.conf
new file mode 120000 (symlink)
index 0000000..697a022
--- /dev/null
@@ -0,0 +1 @@
+Makefile.LINUX
\ No newline at end of file
index 316148d..5baced3 100644 (file)
@@ -11,16 +11,16 @@ include ../Makefile.conf
 
 .PHONY:        all
 
-all:                   _dai.so
+all:                   _dai.so dai.oct
 
 _dai.so:               ../lib/libdai.a dai.i
-                       $(SWIG) -python -c++ dai.i
+                       $(SWIG) -python -classic -c++ dai.i
                        g++ -Wall -c -O3 -g -fPIC dai_wrap.cxx -I$(INCLUDE_PYTHON) -I$(INCLUDE_BOOST) -I../include
                        g++ -shared dai_wrap.o -o _dai.so ../lib/libdai.a
 
 dai.oct:               ../lib/libdai.a dai.i
                        $(SWIG) -octave -c++ -o dai_wrap.cpp dai.i
-                       mkoctfile -I$(INCLUDE_PYTHON) -I$(INCLUDE_BOOST) -I../include -l../lib/libdai.a dai_wrap.cpp
+                       mkoctfile -I$(INCLUDE_PYTHON) -I$(INCLUDE_BOOST) -I../include -o dai.oct dai_wrap.cpp ../lib/libdai.a
 
 .PHONY: clean
 
index cfdfe85..0ff6357 100644 (file)
@@ -5,6 +5,7 @@
  *  warranty. See the file COPYING for more details.
  *
  *  Copyright (C) 2009  Patrick Pletscher  [pletscher at inf dot ethz dot ch]
+ *                2009  Joris Mooij        [joris dot mooij at libdai dot org]
  */
 
 
 %template(SmallSetVar) dai::SmallSet< dai::Var >;
 %include "../include/dai/varset.h"
 %extend dai::VarSet {
-        inline void append(const dai::Var &v) { (*self) |= v; }
+        inline void append(const dai::Var &v) { (*self) |= v; }   /* for python, octave */
 };
 
 %include "../include/dai/prob.h"
 %template(Prob) dai::TProb<Real>;
 %extend dai::TProb<Real> {
-        inline Real __getitem__(int i) const {return (*self)[i];}
-        inline void __setitem__(int i,Real d) {(*self)[i] = d;}
-        %template(TProbRealConstructor) TProb<double *>;
-        %template(TProbIntConstructor)  TProb<size_t *>;
+        inline Real __getitem__(int i) const {return (*self)[i];} /* for python */
+        inline void __setitem__(int i,Real d) {(*self)[i] = d;}   /* for python */
+        inline Real __paren(int i) const {return (*self)[i];}     /* for octave */
+        inline void __paren_asgn(int i,Real d) {(*self)[i] = d;}  /* for octave */
 };
 %include "../include/dai/factor.h"
 %extend dai::TFactor<Real> {
-        inline Real __getitem__(int i) const {return (*self)[i];}
-        inline void __setitem__(int i,Real d) {(*self)[i] = d;}
+        inline Real __getitem__(int i) const {return (*self)[i];} /* for python */
+        inline void __setitem__(int i,Real d) {(*self)[i] = d;}   /* for python */
+        inline Real __paren(int i) const {return (*self)[i];}     /* for octave */
+        inline void __paren_asgn(int i,Real d) {(*self)[i] = d;}  /* for octave */
 };
 
 %template(Factor) dai::TFactor<Real>;
diff --git a/swig/example_sprinkler.m b/swig/example_sprinkler.m
new file mode 100644 (file)
index 0000000..eee31b6
--- /dev/null
@@ -0,0 +1,70 @@
+% This file is part of libDAI - http://www.libdai.org/
+%
+% libDAI is licensed under the terms of the GNU General Public License version
+% 2, or (at your option) any later version. libDAI is distributed without any
+% warranty. See the file COPYING for more details.
+%
+% Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
+
+
+% This example program illustrates how to construct a factorgraph
+% by means of the sprinkler network example discussed at
+% http://www.cs.ubc.ca/~murphyk/Bayes/bnintro.html
+% using the SWIG octave wrapper of libDAI
+
+dai
+
+C = dai.Var(0, 2);  % Define binary variable Cloudy (with label 0)
+S = dai.Var(1, 2);  % Define binary variable Sprinkler (with label 1)
+R = dai.Var(2, 2);  % Define binary variable Rain (with label 2)
+W = dai.Var(3, 2);  % Define binary variable Wetgrass (with label 3)
+
+% Define probability distribution for C
+P_C = dai.Factor(C);
+P_C(0) = 0.5;            % C = 0
+P_C(1) = 0.5;            % C = 1
+
+% Define conditional probability of S given C
+P_S_given_C = dai.Factor(dai.VarSet(S,C));
+P_S_given_C(0) = 0.5;    % C = 0, S = 0
+P_S_given_C(1) = 0.9;    % C = 1, S = 0
+P_S_given_C(2) = 0.5;    % C = 0, S = 1
+P_S_given_C(3) = 0.1;    % C = 1, S = 1
+
+% Define conditional probability of R given C
+P_R_given_C = dai.Factor(dai.VarSet(R,C));
+P_R_given_C(0) = 0.8;    % C = 0, R = 0
+P_R_given_C(1) = 0.2;    % C = 1, R = 0
+P_R_given_C(2) = 0.2;    % C = 0, R = 1
+P_R_given_C(3) = 0.8;    % C = 1, R = 1
+
+% Define conditional probability of W given S and R
+SRW = dai.VarSet(S,R);
+SRW.append(W);
+P_W_given_S_R = dai.Factor(SRW);
+P_W_given_S_R(0) = 1.0;  % S = 0, R = 0, W = 0
+P_W_given_S_R(1) = 0.1;  % S = 1, R = 0, W = 0
+P_W_given_S_R(2) = 0.1;  % S = 0, R = 1, W = 0
+P_W_given_S_R(3) = 0.01; % S = 1, R = 1, W = 0
+P_W_given_S_R(4) = 0.0;  % S = 0, R = 0, W = 1
+P_W_given_S_R(5) = 0.9;  % S = 1, R = 0, W = 1
+P_W_given_S_R(6) = 0.9;  % S = 0, R = 1, W = 1
+P_W_given_S_R(7) = 0.99; % S = 1, R = 1, W = 1
+
+% Build factor graph consisting of those four factors
+SprinklerFactors = dai.VecFactor();
+SprinklerFactors.append(P_C);
+SprinklerFactors.append(P_R_given_C);
+SprinklerFactors.append(P_S_given_C);
+SprinklerFactors.append(P_W_given_S_R);
+SprinklerNetwork = dai.FactorGraph(SprinklerFactors);
+
+% Write factorgraph to a file
+SprinklerNetwork.WriteToFile('sprinkler.fg');
+
+% Reread the factorgraph from the file
+SprinklerNetwork.ReadFromFile('sprinkler.fg');
+
+% Output some information about the factorgraph
+fprintf('%d variables\n', SprinklerNetwork.nrVars());
+fprintf('%d factors\n', SprinklerNetwork.nrFactors());
diff --git a/swig/test.py b/swig/test.py
deleted file mode 100644 (file)
index 970efdc..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-import dai
-
-v1 = dai.Var(0,4)
-v2 = dai.Var(1,3)
-vs = dai.VarSet(v1,v2)
-f = dai.Factor(vs)
-fVec = dai.VecFactor()
-fVec.append(f)
-fg = dai.FactorGraph(fVec)