matlab interface.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1887 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
5affad32b6
commit
244d4128cf
@ -2,24 +2,9 @@
|
|||||||
:- module(bnt, [dump_as_bnt/2,
|
:- module(bnt, [dump_as_bnt/2,
|
||||||
check_if_bnt_done/1]).
|
check_if_bnt_done/1]).
|
||||||
|
|
||||||
:- use_module(library(terms), [term_variables/2
|
:- use_module(library(matlab), [start_matlab/2,
|
||||||
]).
|
close_matlab/1,
|
||||||
|
eval_string/2
|
||||||
:- use_module(library(ordsets), [ord_subtract/3,
|
|
||||||
ord_add_element/3
|
|
||||||
]).
|
|
||||||
|
|
||||||
:- use_module(library(lists), [reverse/2
|
|
||||||
]).
|
|
||||||
|
|
||||||
:- use_module(library(atts)).
|
|
||||||
|
|
||||||
:- use_module(library(heaps), [empty_heap/1,
|
|
||||||
add_to_heap/4,
|
|
||||||
heap_to_list/2
|
|
||||||
]).
|
|
||||||
|
|
||||||
:- use_module(library(system), [exec/3
|
|
||||||
]).
|
]).
|
||||||
|
|
||||||
:- attribute topord/1, map/1.
|
:- attribute topord/1, map/1.
|
||||||
@ -28,10 +13,20 @@ check_if_bnt_done(Var) :-
|
|||||||
get_atts(Var, [map(_)]).
|
get_atts(Var, [map(_)]).
|
||||||
|
|
||||||
dump_as_bnt(GVars, [_|_]) :-
|
dump_as_bnt(GVars, [_|_]) :-
|
||||||
exec('matlab -nojvm -nosplash',[pipe(CommandStream),pipe(Answer),pipe(Answer)],_),
|
start_matlab(´-nojvm -nosplash',MatEnv),
|
||||||
wait_for_matlab_prompt(Answer),
|
|
||||||
get_value(clpbn_key, Key),
|
get_value(clpbn_key, Key),
|
||||||
send_command(CommandStream, Answer, 'cd /u/vitor/sw/BNT;~n', []),
|
eval_string(MatEnv, 'cd /u/vitor/sw/BNT'),
|
||||||
|
eval_string(MatEnv, 'add_BNT_to_path'),
|
||||||
|
extract_graph(GVars, Graph),
|
||||||
|
dgraph_top_sort(Graph, SortedGraph),
|
||||||
|
number_graph(SortedGraph),
|
||||||
|
zeros(MatEnv, GLength, GLength, dag),
|
||||||
|
build_dag(SortedGraph),
|
||||||
|
dump_cpts(SortedGraph).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% send_command(CommandStream, Answer, 'cd /home/vitor/Yap/CLPBN/BNT;~n', []),
|
% send_command(CommandStream, Answer, 'cd /home/vitor/Yap/CLPBN/BNT;~n', []),
|
||||||
send_command(CommandStream, Answer, 'add_BNT_to_path;~n', []),
|
send_command(CommandStream, Answer, 'add_BNT_to_path;~n', []),
|
||||||
send_command(CommandStream, Answer, '~w = ~w;~n', ['$VAR'(Key), Key]),
|
send_command(CommandStream, Answer, '~w = ~w;~n', ['$VAR'(Key), Key]),
|
||||||
|
@ -556,6 +556,7 @@ all: startup
|
|||||||
@INSTALL_DLLS@ (cd library/tries; make)
|
@INSTALL_DLLS@ (cd library/tries; make)
|
||||||
@INSTALL_DLLS@ (cd library/lammpi; make)
|
@INSTALL_DLLS@ (cd library/lammpi; make)
|
||||||
@INSTALL_DLLS@ (cd library/matrix; make)
|
@INSTALL_DLLS@ (cd library/matrix; make)
|
||||||
|
@INSTALL_MATLAB@ (cd library/matlab; make)
|
||||||
@ENABLE_JPL@ @INSTALL_DLLS@ (cd LGPL/JPL/src; make)
|
@ENABLE_JPL@ @INSTALL_DLLS@ (cd LGPL/JPL/src; make)
|
||||||
|
|
||||||
startup: yap@EXEC_SUFFIX@ $(PL_SOURCES)
|
startup: yap@EXEC_SUFFIX@ $(PL_SOURCES)
|
||||||
@ -593,6 +594,7 @@ install_unix: startup libYap.a
|
|||||||
@INSTALL_DLLS@ (cd library/tries; make install)
|
@INSTALL_DLLS@ (cd library/tries; make install)
|
||||||
@INSTALL_DLLS@ (cd library/lammpi; make install)
|
@INSTALL_DLLS@ (cd library/lammpi; make install)
|
||||||
@INSTALL_DLLS@ (cd library/matrix; make install)
|
@INSTALL_DLLS@ (cd library/matrix; make install)
|
||||||
|
@INSTALL_MATLAB@ (cd library/matlab; make install)
|
||||||
@ENABLE_JPL@ @INSTALL_DLLS@ (cd LGPL/JPL/src; make install)
|
@ENABLE_JPL@ @INSTALL_DLLS@ (cd LGPL/JPL/src; make install)
|
||||||
mkdir -p $(DESTDIR)$(INCLUDEDIR)
|
mkdir -p $(DESTDIR)$(INCLUDEDIR)
|
||||||
for h in $(INTERFACE_HEADERS); do $(INSTALL) $$h $(DESTDIR)$(INCLUDEDIR); done
|
for h in $(INTERFACE_HEADERS); do $(INSTALL) $$h $(DESTDIR)$(INCLUDEDIR); done
|
||||||
@ -617,7 +619,8 @@ install_win32: startup
|
|||||||
(cd library/regex; make install)
|
(cd library/regex; make install)
|
||||||
(cd library/system; make install)
|
(cd library/system; make install)
|
||||||
(cd library/yap2swi; make install)
|
(cd library/yap2swi; make install)
|
||||||
@# (cd library/tries; make install)
|
@INSTALL_MATLAB@ (cd library/matlab; make install)
|
||||||
|
(cd library/tries; make install)
|
||||||
|
|
||||||
install_library: @YAPLIB@
|
install_library: @YAPLIB@
|
||||||
mkdir -p $(DESTDIR)$(INCLUDEDIR)
|
mkdir -p $(DESTDIR)$(INCLUDEDIR)
|
||||||
@ -658,6 +661,7 @@ clean: clean_docs
|
|||||||
@INSTALL_DLLS@ (cd library/yap2swi; make clean)
|
@INSTALL_DLLS@ (cd library/yap2swi; make clean)
|
||||||
@INSTALL_DLLS@ (cd library/tries; make clean)
|
@INSTALL_DLLS@ (cd library/tries; make clean)
|
||||||
@INSTALL_DLLS@ (cd library/lammpi; make clean)
|
@INSTALL_DLLS@ (cd library/lammpi; make clean)
|
||||||
|
@INSTALL_MATLAB@ (cd library/matlab; make clean)
|
||||||
@ENABLE_JPL@ @INSTALL_DLLS@ (cd LGPL/JPL/src; make clean)
|
@ENABLE_JPL@ @INSTALL_DLLS@ (cd LGPL/JPL/src; make clean)
|
||||||
|
|
||||||
|
|
||||||
|
39
configure.in
39
configure.in
@ -150,6 +150,18 @@ AC_ARG_WITH(readline,
|
|||||||
fi,
|
fi,
|
||||||
[yap_cv_readline=yes])
|
[yap_cv_readline=yes])
|
||||||
|
|
||||||
|
AC_ARG_WITH(matlab,
|
||||||
|
[ --with-matlab[=DIR] use MATLAB package in DIR],
|
||||||
|
if test "$withval" = yes; then
|
||||||
|
yap_cv_matlab=yes
|
||||||
|
elif test "$withval" = no; then
|
||||||
|
yap_cv_matlab=no
|
||||||
|
else
|
||||||
|
yap_cv_matlab=$with_matlab
|
||||||
|
MATLAB_INCLUDE="-I${yap_cv_matlab}/extern/include"
|
||||||
|
fi,
|
||||||
|
[yap_cv_matlab=no])
|
||||||
|
|
||||||
AC_ARG_WITH(mpi,
|
AC_ARG_WITH(mpi,
|
||||||
[ --with-mpi[=DIR] use MPI library in DIR],
|
[ --with-mpi[=DIR] use MPI library in DIR],
|
||||||
if test "$withval" = yes; then
|
if test "$withval" = yes; then
|
||||||
@ -262,6 +274,28 @@ eval "AC_DEFINE(MAX_WORKERS,$yap_cv_max_workers)"
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl condor does not like dynamic linking on Linux, DEC, and HP-UX platforms.
|
||||||
|
if test "$yap_cv_matlab" = no
|
||||||
|
then
|
||||||
|
INSTALL_MATLAB="# "
|
||||||
|
elif test "$yap_cv_matlab" = yes
|
||||||
|
then
|
||||||
|
INSTALL_MATLAB=""
|
||||||
|
else
|
||||||
|
case "$target_cpu" in
|
||||||
|
i*86*)
|
||||||
|
LDFLAGS="$LDFLAGS -L${yap_cv_matlab}/bin/glnx86"
|
||||||
|
;;
|
||||||
|
x86*)
|
||||||
|
LDFLAGS="$LDFLAGS -L${yap_cv_matlab}/bin/glnxa64"
|
||||||
|
;;
|
||||||
|
sparc*)
|
||||||
|
LDFLAGS="$LDFLAGS -L${yap_cv_matlab}/bin/sol2"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
INSTALL_MATLAB=""
|
||||||
|
fi
|
||||||
|
|
||||||
dnl condor does not like dynamic linking on Linux, DEC, and HP-UX platforms.
|
dnl condor does not like dynamic linking on Linux, DEC, and HP-UX platforms.
|
||||||
if test "$use_condor" = yes
|
if test "$use_condor" = yes
|
||||||
then
|
then
|
||||||
@ -1039,6 +1073,8 @@ AC_SUBST(LAMOBJS)
|
|||||||
AC_SUBST(MAX_WORKERS)
|
AC_SUBST(MAX_WORKERS)
|
||||||
AC_SUBST(STATIC_MODE)
|
AC_SUBST(STATIC_MODE)
|
||||||
|
|
||||||
|
AC_SUBST(INSTALL_MATLAB)
|
||||||
|
AC_SUBST(MATLAB_INCLUDE)
|
||||||
|
|
||||||
dnl check for threaded code
|
dnl check for threaded code
|
||||||
AC_MSG_CHECKING(for gcc threaded code)
|
AC_MSG_CHECKING(for gcc threaded code)
|
||||||
@ -1309,6 +1345,7 @@ AC_DEFINE(USE_DL_MALLOC,1)
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p library/matrix
|
mkdir -p library/matrix
|
||||||
|
mkdir -p library/matlab
|
||||||
mkdir -p library/mpi
|
mkdir -p library/mpi
|
||||||
mkdir -p library/random
|
mkdir -p library/random
|
||||||
mkdir -p library/regex
|
mkdir -p library/regex
|
||||||
@ -1329,7 +1366,7 @@ mkdir -p LGPL/clp
|
|||||||
mkdir -p LGPL/clpr
|
mkdir -p LGPL/clpr
|
||||||
mkdir -p LGPL/chr
|
mkdir -p LGPL/chr
|
||||||
|
|
||||||
AC_OUTPUT(Makefile library/matrix/Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/yap2swi/Makefile library/mpi/Makefile .depend library/Makefile LGPL/chr/Makefile LGPL/chr/chr_swi_bootstrap.yap CLPBN/Makefile LGPL/clp/Makefile LGPL/clpr/Makefile library/lammpi/Makefile library/tries/Makefile LGPL/JPL/Makefile LGPL/JPL/src/Makefile LGPL/JPL/java/Makefile LGPL/JPL/jpl_paths.yap)
|
AC_OUTPUT(Makefile library/matrix/Makefile library/matlab/Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/yap2swi/Makefile library/mpi/Makefile .depend library/Makefile LGPL/chr/Makefile LGPL/chr/chr_swi_bootstrap.yap CLPBN/Makefile LGPL/clp/Makefile LGPL/clpr/Makefile library/lammpi/Makefile library/tries/Makefile LGPL/JPL/Makefile LGPL/JPL/src/Makefile LGPL/JPL/java/Makefile LGPL/JPL/jpl_paths.yap)
|
||||||
|
|
||||||
make depend
|
make depend
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ PROGRAMS= $(srcdir)/apply_macros.yap \
|
|||||||
$(srcdir)/logtalk.yap \
|
$(srcdir)/logtalk.yap \
|
||||||
$(srcdir)/nb.yap \
|
$(srcdir)/nb.yap \
|
||||||
$(srcdir)/ordsets.yap \
|
$(srcdir)/ordsets.yap \
|
||||||
|
$(srcdir)/matlab.yap \
|
||||||
$(srcdir)/matrix.yap \
|
$(srcdir)/matrix.yap \
|
||||||
$(srcdir)/prandom.yap \
|
$(srcdir)/prandom.yap \
|
||||||
$(srcdir)/queues.yap \
|
$(srcdir)/queues.yap \
|
||||||
|
119
library/matlab.yap
Normal file
119
library/matlab.yap
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
|
||||||
|
:- module(matlab,
|
||||||
|
[start_matlab/1,
|
||||||
|
close_matlab/0,
|
||||||
|
matlab_on/0,
|
||||||
|
matlab_eval_string/1,
|
||||||
|
matlab_eval_string/2,
|
||||||
|
matlab_eval_sequence/1,
|
||||||
|
matlab_eval_sequence/2,
|
||||||
|
matlab_call/2,
|
||||||
|
matlab_call/3,
|
||||||
|
matlab_cells/2,
|
||||||
|
matlab_cells/3,
|
||||||
|
matlab_initialized_cells/4,
|
||||||
|
matlab_zeros/2,
|
||||||
|
matlab_zeros/3,
|
||||||
|
matlab_zeros/4,
|
||||||
|
matlab_matrix/4,
|
||||||
|
matlab_vector/3,
|
||||||
|
matlab_vector/3,
|
||||||
|
matlab_set/4,
|
||||||
|
matlab_get_variable/2,
|
||||||
|
matlab_item/3,
|
||||||
|
matlab_item/4,
|
||||||
|
matlab_item1/3,
|
||||||
|
matlab_item1/4,
|
||||||
|
matlab_sequence/3]).
|
||||||
|
|
||||||
|
:- ensure_loaded(library(lists)).
|
||||||
|
|
||||||
|
:- load_foreign_files([matlab], ['/s/pkg/matlab/7r14sp3/bin/glnx86/libeng.so','/s/pkg/matlab/7r14sp3/bin/glnx86/libmx.so','/s/pkg/matlab/7r14sp3/bin/glnx86/libut.so'], init_matlab).
|
||||||
|
|
||||||
|
matlab_eval_sequence(S) :-
|
||||||
|
atomic_concat(S,S1),
|
||||||
|
matlab_eval_string(S1).
|
||||||
|
|
||||||
|
matlab_eval_sequence(S,O) :-
|
||||||
|
atomic_concat(S,S1),
|
||||||
|
matlab_eval_string(S1,O).
|
||||||
|
|
||||||
|
matlab_vector( Vec, L) :-
|
||||||
|
length(Vec, LV),
|
||||||
|
matlab_vector(LV, Vec, L).
|
||||||
|
|
||||||
|
matlab_sequence(Min,Max,L) :-
|
||||||
|
mksequence(Min,Max,Vector),
|
||||||
|
Dim is (Max-Min)+1,
|
||||||
|
matlab_matrix(1,Dim,Vector,L).
|
||||||
|
|
||||||
|
mksequence(Min,Min,[Min]) :- !.
|
||||||
|
mksequence(Min,Max,[Min|Vector]) :-
|
||||||
|
Min1 is Min+1,
|
||||||
|
mksequence(Min1,Max,Vector).
|
||||||
|
|
||||||
|
matlab_call(S,Out) :-
|
||||||
|
S=..[Func|Args],
|
||||||
|
build_args(Args,L0,[]),
|
||||||
|
process_arg_entry(L0,L),
|
||||||
|
build_output(Out,Lf,['= ',Func|L]),
|
||||||
|
atomic_concat(Lf,Command),
|
||||||
|
matlab_eval_string(Command).
|
||||||
|
|
||||||
|
matlab_call(S,Out,Result) :-
|
||||||
|
S=..[Func|Args],
|
||||||
|
build_args(Args,L0,[]),
|
||||||
|
process_arg_entry(L0,L),
|
||||||
|
build_output(Out,Lf,[' = ',Func|L]),
|
||||||
|
atomic_concat(Lf,Command),
|
||||||
|
matlab_eval_string(Command,Result).
|
||||||
|
|
||||||
|
build_output(Out,['[ '|L],L0) :-
|
||||||
|
is_list(Out), !,
|
||||||
|
build_outputs(Out,L,[']'|L0]).
|
||||||
|
build_output(Out,Lf,L0) :-
|
||||||
|
build_arg(Out,Lf,L0).
|
||||||
|
|
||||||
|
build_outputs([],L,L).
|
||||||
|
build_outputs([Out|Outs],[Out,' '|L],L0) :-
|
||||||
|
build_outputs(Outs,L,L0).
|
||||||
|
|
||||||
|
build_args([],L,L).
|
||||||
|
build_args([Arg],Lf,L0) :-
|
||||||
|
build_arg(Arg,Lf,[')'|L0]).
|
||||||
|
build_args([Arg|Args],L,L0) :-
|
||||||
|
build_arg(Arg,L,[', '|L1]),
|
||||||
|
build_args(Args,L1,L0).
|
||||||
|
|
||||||
|
build_arg(Arg,[Arg|L],L) :- atomic(Arg), !.
|
||||||
|
build_arg(\S0,['\'',S0,'\''|L],L) :-
|
||||||
|
atom(S0), !.
|
||||||
|
build_arg([S1|S2],['['|L],L0) :-
|
||||||
|
is_list(S2), !,
|
||||||
|
build_arglist([S1|S2],L,L0).
|
||||||
|
build_arg([S1|S2],L,L0) :- !,
|
||||||
|
build_arg(S1,L,['.'|L1]),
|
||||||
|
build_arg(S2,L1,L0).
|
||||||
|
build_arg(S1:S2,L,L0) :- !,
|
||||||
|
build_arg(S1,L,[':'|L1]),
|
||||||
|
build_arg(S2,L1,L0).
|
||||||
|
build_arg(F,[N,'{'|L],L0) :- %N({A}) = N{A}
|
||||||
|
F=..[N,{A}], !,
|
||||||
|
build_arg(A,L,['}'|L0]).
|
||||||
|
build_arg(F,[N,'('|L],L0) :-
|
||||||
|
build_args(A,L,L0).
|
||||||
|
|
||||||
|
build_arglist([A],L,L0) :- !,
|
||||||
|
build_arg(A,L,[' ]'|L0]).
|
||||||
|
build_arglist([A|As],L,L0) :-
|
||||||
|
build_arg(A,L,[' ,'|L1]),
|
||||||
|
build_arglist(As,L1,L0).
|
||||||
|
|
||||||
|
build_string([],['\''|L],L).
|
||||||
|
build_string([S0|S],[C|Lf],L0) :-
|
||||||
|
char_code(C,S0),
|
||||||
|
build_string(S,Lf,L0).
|
||||||
|
|
||||||
|
|
||||||
|
process_arg_entry([],[]) :- !.
|
||||||
|
process_arg_entry(L,['('|L]).
|
58
library/matlab/Makefile.in
Normal file
58
library/matlab/Makefile.in
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#
|
||||||
|
# default base directory for YAP installation
|
||||||
|
# (EROOT for architecture-dependent files)
|
||||||
|
#
|
||||||
|
prefix = @prefix@
|
||||||
|
ROOTDIR = $(prefix)
|
||||||
|
EROOTDIR = @exec_prefix@
|
||||||
|
#
|
||||||
|
# where the binary should be
|
||||||
|
#
|
||||||
|
BINDIR = $(EROOTDIR)/bin
|
||||||
|
#
|
||||||
|
# where YAP should look for libraries
|
||||||
|
#
|
||||||
|
LIBDIR=$(EROOTDIR)/lib/Yap
|
||||||
|
#
|
||||||
|
#
|
||||||
|
CC=@CC@
|
||||||
|
CFLAGS= @CFLAGS@ $(YAP_EXTRAS) $(DEFS) -I$(srcdir) -I../.. -I$(srcdir)/../../include @MATLAB_INCLUDE@
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# You shouldn't need to change what follows.
|
||||||
|
#
|
||||||
|
INSTALL=@INSTALL@
|
||||||
|
INSTALL_DATA=@INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM=@INSTALL_PROGRAM@
|
||||||
|
SHELL=/bin/sh
|
||||||
|
RANLIB=@RANLIB@
|
||||||
|
srcdir=@srcdir@
|
||||||
|
SHLIB_CFLAGS=@SHLIB_CFLAGS@
|
||||||
|
SHLIB_SUFFIX=@SHLIB_SUFFIX@
|
||||||
|
#4.1VPATH=@srcdir@:@srcdir@/OPTYap
|
||||||
|
CWD=$(PWD)
|
||||||
|
#
|
||||||
|
|
||||||
|
OBJS=matlab.o
|
||||||
|
SOBJS=matlab@SHLIB_SUFFIX@
|
||||||
|
|
||||||
|
#in some systems we just create a single object, in others we need to
|
||||||
|
# create a libray
|
||||||
|
|
||||||
|
all: $(SOBJS)
|
||||||
|
|
||||||
|
matlab.o: $(srcdir)/matlab.c
|
||||||
|
$(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/matlab.c -o matlab.o
|
||||||
|
|
||||||
|
@DO_SECOND_LD@%@SHLIB_SUFFIX@: %.o
|
||||||
|
@DO_SECOND_LD@ @SHLIB_LD@ -o $@ $<
|
||||||
|
|
||||||
|
@DO_SECOND_LD@matlab@SHLIB_SUFFIX@: matlab.o
|
||||||
|
@DO_SECOND_LD@ @SHLIB_LD@ -o matlab@SHLIB_SUFFIX@ matlab.o
|
||||||
|
|
||||||
|
install: all
|
||||||
|
$(INSTALL_PROGRAM) $(SOBJS) $(DESTDIR)$(LIBDIR)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *~ $(OBJS) $(SOBJS) *.BAK
|
||||||
|
|
109
library/matlab/bnt_example.yap
Normal file
109
library/matlab/bnt_example.yap
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
add_BNT_to_path
|
||||||
|
N = 4;
|
||||||
|
dag = zeros(N,N);
|
||||||
|
C = 1; S = 2; R = 3; W = 4;
|
||||||
|
dag(C,[R S]) = 1;
|
||||||
|
dag(R,W) = 1;
|
||||||
|
dag(S,W)=1;
|
||||||
|
discrete_nodes = 1:N;
|
||||||
|
node_sizes = 2*ones(1,N);
|
||||||
|
bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes);
|
||||||
|
bnet.CPD{W} = tabular_CPD(bnet, W, 'CPT', [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);
|
||||||
|
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);
|
||||||
|
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
|
||||||
|
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
|
||||||
|
engine = jtree_inf_engine(bnet);
|
||||||
|
evidence = cell(1,N);
|
||||||
|
evidence{W} = 2;
|
||||||
|
[engine, loglik] = enter_evidence(engine, evidence);
|
||||||
|
marg = marginal_nodes(engine, S);
|
||||||
|
marg.T
|
||||||
|
*/
|
||||||
|
|
||||||
|
:- ensure_loaded(library(matlab)).
|
||||||
|
|
||||||
|
:- yap_flag(write_strings, on).
|
||||||
|
|
||||||
|
% syntactic sugar for matlab_call.
|
||||||
|
:- op(800,yfx,<--).
|
||||||
|
|
||||||
|
G <-- Y :-
|
||||||
|
matlab_call(Y,G).
|
||||||
|
|
||||||
|
do(Out,Out2) :-
|
||||||
|
init_bnt,
|
||||||
|
N = 4,
|
||||||
|
C = 1, S = 2, R = 3, W = 4,
|
||||||
|
mkdag(N,[C-R,C-S,R-W,S-W]),
|
||||||
|
matlab_sequence(1,N,discrete_nodes),
|
||||||
|
mk2s(N,L), % domain has size 2
|
||||||
|
matlab_matrix(1,N,L,node_sizes),
|
||||||
|
bnet <-- mk_bnet(dag, node_sizes, \discrete, discrete_nodes),
|
||||||
|
mkcpt(bnet,W,[1, 0.1, 0.1, 0.01, 0, 0.9, 0.9, 0.99]),
|
||||||
|
mkcpt(bnet,C,[0.5, 0.5]),
|
||||||
|
mkcpt(bnet,R,[0.8, 0.2, 0.2, 0.8]),
|
||||||
|
mkcpt(bnet,S,[0.5, 0.9, 0.5, 0.1]),
|
||||||
|
engine <-- jtree_inf_engine(bnet),
|
||||||
|
mkevidence(N,[W-2]),
|
||||||
|
marg <-- marginal_nodes(engine, S),
|
||||||
|
matlab_get_variable( marg.'T', Out),
|
||||||
|
add_evidence([R-2]),
|
||||||
|
marg <-- marginal_nodes(engine, S),
|
||||||
|
matlab_get_variable( marg.'T', Out2).
|
||||||
|
|
||||||
|
init_bnt :-
|
||||||
|
matlab_on, !.
|
||||||
|
init_bnt :-
|
||||||
|
getcwd(D),
|
||||||
|
cd('~/Yap/CLPBN/FullBNT/BNT'),
|
||||||
|
start_matlab('matlab -nojvm -nosplash'),
|
||||||
|
matlab_eval_string("add_BNT_to_path",_),
|
||||||
|
cd(D).
|
||||||
|
|
||||||
|
mk2s(0, []) :- !.
|
||||||
|
mk2s(I, [2|L]) :-
|
||||||
|
I0 is I-1,
|
||||||
|
mk2s(I0, L).
|
||||||
|
|
||||||
|
mkdag(N,Els) :-
|
||||||
|
Tot is N*N,
|
||||||
|
functor(Dag,dag,Tot),
|
||||||
|
add_els(Els,N,Dag),
|
||||||
|
Dag=..[_|L],
|
||||||
|
addzeros(L),
|
||||||
|
matlab_matrix(N,N,L,dag).
|
||||||
|
|
||||||
|
add_els([],_,_).
|
||||||
|
add_els([X-Y|Els],N,Dag) :-
|
||||||
|
Pos is (X-1)*N+Y,
|
||||||
|
arg(Pos,Dag,1),
|
||||||
|
add_els(Els,N,Dag).
|
||||||
|
|
||||||
|
addzeros([]).
|
||||||
|
addzeros([0|L]) :- !,
|
||||||
|
addzeros(L).
|
||||||
|
addzeros([1|L]) :-
|
||||||
|
addzeros(L).
|
||||||
|
|
||||||
|
mkcpt(BayesNet, V, Tab) :-
|
||||||
|
(BayesNet.'CPD'({V})) <-- tabular_CPD(BayesNet,V,Tab).
|
||||||
|
|
||||||
|
mkevidence(N,L) :-
|
||||||
|
mkeventries(L,LN),
|
||||||
|
matlab_initialized_cells( 1, N, LN, evidence),
|
||||||
|
[engine, loglik] <-- enter_evidence(engine, evidence).
|
||||||
|
|
||||||
|
mkeventries([],[]).
|
||||||
|
mkeventries([A-V|L],[ev(1,A,V)|LN]) :-
|
||||||
|
mkeventries(L,LN).
|
||||||
|
|
||||||
|
add_evidence(L) :-
|
||||||
|
add_to_evidence(L),
|
||||||
|
[engine, loglik] <-- enter_evidence(engine, evidence).
|
||||||
|
|
||||||
|
add_to_evidence([]).
|
||||||
|
add_to_evidence([Pos-Val|L]) :-
|
||||||
|
matlab_item1(evidence,Pos,Val),
|
||||||
|
add_to_evidence(L).
|
||||||
|
|
780
library/matlab/matlab.c
Normal file
780
library/matlab/matlab.c
Normal file
@ -0,0 +1,780 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* YAP Prolog *
|
||||||
|
* *
|
||||||
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||||
|
* *
|
||||||
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||||
|
* *
|
||||||
|
**************************************************************************
|
||||||
|
* *
|
||||||
|
* File: random.c *
|
||||||
|
* Last rev: *
|
||||||
|
* mods: *
|
||||||
|
* comments: regular expression interpreter *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "YapInterface.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#if defined(__MINGW32__) || _MSC_VER
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <mex.h>
|
||||||
|
#include <engine.h>
|
||||||
|
#include <matrix.h>
|
||||||
|
|
||||||
|
#define MAT_ACCESS(I,J,ROWS,COLS) ((I)+((J)*(ROWS)))
|
||||||
|
|
||||||
|
#define BUFSIZE 512
|
||||||
|
#define OBUFSIZE 2048
|
||||||
|
|
||||||
|
void PROTO(init_matlab, (void));
|
||||||
|
|
||||||
|
static YAP_Functor MatlabAddress;
|
||||||
|
static Engine *Meng = NULL;
|
||||||
|
|
||||||
|
static mxArray *
|
||||||
|
matlab_getvar(YAP_Term t)
|
||||||
|
{
|
||||||
|
return engGetVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(t)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static YAP_Term
|
||||||
|
address2term(mxArray *mat)
|
||||||
|
{
|
||||||
|
YAP_Term t[1];
|
||||||
|
|
||||||
|
t[0] = YAP_MkIntTerm((YAP_Int)mat);
|
||||||
|
return YAP_MkApplTerm(MatlabAddress,1,t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cp_back(YAP_Term vart, mxArray *mat)
|
||||||
|
{
|
||||||
|
if (!YAP_IsAtomTerm(vart)) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
/* save back to matlab */
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(vart)), mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_startmatlab(void)
|
||||||
|
{
|
||||||
|
char opts[BUFSIZE];
|
||||||
|
const char *ptr;
|
||||||
|
YAP_Term topts = YAP_ARG1;
|
||||||
|
|
||||||
|
if (Meng)
|
||||||
|
return TRUE;
|
||||||
|
if (YAP_IsAtomTerm(topts))
|
||||||
|
ptr = YAP_AtomName(YAP_AtomOfTerm(topts));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!YAP_StringToBuffer(topts,opts, BUFSIZE))
|
||||||
|
return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-1));
|
||||||
|
ptr = opts;
|
||||||
|
}
|
||||||
|
if (!strlen(ptr)) {
|
||||||
|
if (!(Meng = engOpen("\0"))) {
|
||||||
|
return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-2));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!(Meng = engOpen(ptr))) {
|
||||||
|
return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
engOutputBuffer(Meng, NULL, 0);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_matlabon(void)
|
||||||
|
{
|
||||||
|
return Meng != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_closematlab(void)
|
||||||
|
{
|
||||||
|
Engine *eng = Meng;
|
||||||
|
|
||||||
|
Meng = NULL;
|
||||||
|
if (Meng)
|
||||||
|
return engClose(eng);
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_evalstring2(void)
|
||||||
|
{
|
||||||
|
char com[BUFSIZE];
|
||||||
|
YAP_Term tcom = YAP_ARG1;
|
||||||
|
const char *comd;
|
||||||
|
|
||||||
|
if (YAP_IsAtomTerm(tcom))
|
||||||
|
comd = YAP_AtomName(YAP_AtomOfTerm(tcom));
|
||||||
|
else {
|
||||||
|
if (!YAP_StringToBuffer(tcom, com, BUFSIZE))
|
||||||
|
return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-1));
|
||||||
|
comd = com;
|
||||||
|
}
|
||||||
|
return !engEvalString(Meng, comd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_evalstring3(void)
|
||||||
|
{
|
||||||
|
int out;
|
||||||
|
YAP_Term tcom = YAP_ARG1;
|
||||||
|
const char *comd;
|
||||||
|
char com[BUFSIZE];
|
||||||
|
char buf[OBUFSIZE];
|
||||||
|
|
||||||
|
buf[0] = '\0';
|
||||||
|
if (YAP_IsAtomTerm(tcom))
|
||||||
|
comd = YAP_AtomName(YAP_AtomOfTerm(tcom));
|
||||||
|
else {
|
||||||
|
if (!YAP_StringToBuffer(tcom, com, BUFSIZE))
|
||||||
|
return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-1));
|
||||||
|
comd = com;
|
||||||
|
}
|
||||||
|
engOutputBuffer(Meng, buf, OBUFSIZE);
|
||||||
|
out = !engEvalString(Meng, comd);
|
||||||
|
engOutputBuffer(Meng, NULL, 0);
|
||||||
|
return YAP_Unify(YAP_ARG2, YAP_BufferToString(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_create_cell_vector(void)
|
||||||
|
{
|
||||||
|
int dims[1];
|
||||||
|
mxArray *mat;
|
||||||
|
|
||||||
|
dims[0] = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
if (!(mat = mxCreateCellArray(1, dims)))
|
||||||
|
return FALSE;
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG2)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG2,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_create_cell_array(void)
|
||||||
|
{
|
||||||
|
int rows, cols;
|
||||||
|
mxArray *mat;
|
||||||
|
|
||||||
|
rows = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
cols = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
if (!(mat = mxCreateCellMatrix(rows, cols)))
|
||||||
|
return FALSE;
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG3)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG3,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_create_double_vector(void)
|
||||||
|
{
|
||||||
|
int dims[1];
|
||||||
|
mxArray *mat;
|
||||||
|
|
||||||
|
dims[0] = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
if (!(mat = mxCreateNumericArray(1, dims, mxDOUBLE_CLASS, mxREAL)))
|
||||||
|
return FALSE;
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG2)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG2,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_create_double_array(void)
|
||||||
|
{
|
||||||
|
int rows, cols;
|
||||||
|
mxArray *mat;
|
||||||
|
|
||||||
|
rows = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
cols = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
if (!(mat = mxCreateDoubleMatrix(rows, cols, mxREAL)))
|
||||||
|
return FALSE;
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG3)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG3,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_create_double_array3(void)
|
||||||
|
{
|
||||||
|
int dims[3];
|
||||||
|
mxArray *mat;
|
||||||
|
|
||||||
|
dims[0] = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
dims[1] = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
dims[2] = YAP_IntOfTerm(YAP_ARG3);
|
||||||
|
if (!(mat = mxCreateNumericArray(3, dims, mxDOUBLE_CLASS, mxREAL)))
|
||||||
|
return FALSE;
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG3)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG3,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_set_int_array(void)
|
||||||
|
{
|
||||||
|
int rows, cols, i = 0, j = 0;
|
||||||
|
YAP_Int *input;
|
||||||
|
mxArray *mat;
|
||||||
|
YAP_Term tl = YAP_ARG4;
|
||||||
|
|
||||||
|
mat = matlab_getvar(YAP_ARG1);
|
||||||
|
rows = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
cols = YAP_IntOfTerm(YAP_ARG3);
|
||||||
|
input = (YAP_Int *)mxGetPr(mat);
|
||||||
|
/* copy ints to matrix. */
|
||||||
|
for (i = 0; i < rows*cols; i++) {
|
||||||
|
YAP_Term th;
|
||||||
|
|
||||||
|
if (!YAP_IsPairTerm(tl)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
th = YAP_HeadOfTerm(tl);
|
||||||
|
if (!YAP_IsIntTerm(th)) {
|
||||||
|
/* ERROR */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
input[MAT_ACCESS(i++,j,rows,cols)] = YAP_IntOfTerm(th);
|
||||||
|
if (i == rows) {
|
||||||
|
i = 0;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
tl = YAP_TailOfTerm(tl);
|
||||||
|
}
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG4)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG4,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_set_float_array(void)
|
||||||
|
{
|
||||||
|
int rows, cols, i = 0, j = 0;
|
||||||
|
double *input;
|
||||||
|
mxArray *mat;
|
||||||
|
YAP_Term tl = YAP_ARG3;
|
||||||
|
|
||||||
|
rows = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
cols = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
if (!(mat = mxCreateDoubleMatrix(rows, cols, mxREAL)))
|
||||||
|
return FALSE;
|
||||||
|
input = mxGetPr(mat);
|
||||||
|
/* copy ints to matrix. */
|
||||||
|
for (i = 0; i < rows; i++) {
|
||||||
|
for (j = 0; j < cols; j++) {
|
||||||
|
YAP_Term th;
|
||||||
|
|
||||||
|
if (!YAP_IsPairTerm(tl)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
th = YAP_HeadOfTerm(tl);
|
||||||
|
if (YAP_IsIntTerm(th)) {
|
||||||
|
input[MAT_ACCESS(i,j,rows,cols)] = YAP_IntOfTerm(th);
|
||||||
|
} else if (YAP_IsFloatTerm(th)) {
|
||||||
|
input[MAT_ACCESS(i,j,rows,cols)] = YAP_FloatOfTerm(th);
|
||||||
|
} else {
|
||||||
|
/* ERROR */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
tl = YAP_TailOfTerm(tl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG4)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG4,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_set_float_vector(void)
|
||||||
|
{
|
||||||
|
int len, i = 0;
|
||||||
|
double *input;
|
||||||
|
mxArray *mat;
|
||||||
|
YAP_Term tl = YAP_ARG2;
|
||||||
|
|
||||||
|
len = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
if (!(mat = mxCreateNumericArray(1,&len, mxDOUBLE_CLASS, mxREAL)))
|
||||||
|
return FALSE;
|
||||||
|
input = mxGetPr(mat);
|
||||||
|
/* copy ints to matrix. */
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
YAP_Term th;
|
||||||
|
|
||||||
|
if (!YAP_IsPairTerm(tl)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
th = YAP_HeadOfTerm(tl);
|
||||||
|
if (YAP_IsIntTerm(th)) {
|
||||||
|
input[i] = YAP_IntOfTerm(th);
|
||||||
|
} else if (YAP_IsFloatTerm(th)) {
|
||||||
|
input[i] = YAP_FloatOfTerm(th);
|
||||||
|
} else {
|
||||||
|
/* ERROR */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
tl = YAP_TailOfTerm(tl);
|
||||||
|
}
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG3)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG3,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_set_int(void)
|
||||||
|
{
|
||||||
|
int rows, cols, i, j;
|
||||||
|
YAP_Int *input;
|
||||||
|
mxArray *mat;
|
||||||
|
|
||||||
|
mat = matlab_getvar(YAP_ARG1);
|
||||||
|
i = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
j = YAP_IntOfTerm(YAP_ARG3);
|
||||||
|
input = (YAP_Int *)mxGetPr(mat);
|
||||||
|
rows = mxGetM(mat);
|
||||||
|
cols = mxGetN(mat);
|
||||||
|
input[MAT_ACCESS(i-1,j-1,rows,cols)] = YAP_IntOfTerm(YAP_ARG4);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_set_float(void)
|
||||||
|
{
|
||||||
|
int rows, cols, i, j;
|
||||||
|
double *input;
|
||||||
|
mxArray *mat;
|
||||||
|
YAP_Term t = YAP_ARG4;
|
||||||
|
|
||||||
|
mat = matlab_getvar(YAP_ARG1);
|
||||||
|
i = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
j = YAP_IntOfTerm(YAP_ARG3);
|
||||||
|
input = mxGetPr(mat);
|
||||||
|
rows = mxGetM(mat);
|
||||||
|
cols = mxGetN(mat);
|
||||||
|
if (YAP_IsIntTerm(t))
|
||||||
|
input[MAT_ACCESS(i-1,j-1,rows,cols)] = YAP_IntOfTerm(t);
|
||||||
|
else
|
||||||
|
input[MAT_ACCESS(i-1,j-1,rows,cols)] = YAP_FloatOfTerm(t);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this has to be done carefully because we all need to transpose the matrix */
|
||||||
|
static YAP_Term
|
||||||
|
cp_ints32(int ndims, int *dims, INT32_T *input, int factor, int base, YAP_Term t)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (ndims == 1)
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = YAP_MkPairTerm(YAP_MkIntTerm(input[base+factor*(i-1)]),t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = cp_ints32(ndims-1, dims+1, input, factor*dims[0], base+factor*(i-1),t);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static YAP_Term
|
||||||
|
cp_ints64(int ndims, int *dims, INT64_T *input, int factor, int base, YAP_Term t)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (ndims == 1)
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = YAP_MkPairTerm(YAP_MkIntTerm(input[base+factor*(i-1)]),t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = cp_ints64(ndims-1, dims+1, input, factor*dims[0], base+factor*(i-1),t);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static YAP_Term
|
||||||
|
cp_cells(int ndims, int *dims, mxArray *mat, int factor, int base, YAP_Term t)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (ndims == 1)
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = YAP_MkPairTerm(YAP_MkIntTerm((YAP_Int)mxGetCell(mat,base+factor*(i-1))),t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = cp_cells(ndims-1, dims+1, mat, factor*dims[0], base+factor*(i-1),t);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this has to be done carefully because we all need to transpose the matrix */
|
||||||
|
static YAP_Term
|
||||||
|
cp_floats(int ndims, int *dims, double *input, int factor, int base, YAP_Term t)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (ndims == 1)
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = YAP_MkPairTerm(YAP_MkFloatTerm(input[base+factor*(i-1)]),t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (i=dims[0]; i>0; i--) {
|
||||||
|
t = cp_floats(ndims-1, dims+1, input, factor*dims[0], base+factor*(i-1),t);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static mxArray*
|
||||||
|
get_array(YAP_Term ti)
|
||||||
|
{
|
||||||
|
if (YAP_IsIntTerm(ti)) {
|
||||||
|
return mxCreateDoubleScalar(YAP_IntOfTerm(ti));
|
||||||
|
} else if (YAP_IsFloatTerm(ti)) {
|
||||||
|
return mxCreateDoubleScalar(YAP_FloatOfTerm(ti));
|
||||||
|
} else if (YAP_IsAtomTerm(ti)) {
|
||||||
|
return matlab_getvar(ti);
|
||||||
|
} else if (YAP_IsPairTerm(ti)) {
|
||||||
|
YAP_Term tv = YAP_HeadOfTerm(ti);
|
||||||
|
YAP_Term tf = YAP_TailOfTerm(ti);
|
||||||
|
const mxArray *mout;
|
||||||
|
|
||||||
|
if (!YAP_IsAtomTerm(tv)) {
|
||||||
|
char s[BUFSIZE];
|
||||||
|
if (!YAP_StringToBuffer(ti, s, BUFSIZE))
|
||||||
|
return FALSE;
|
||||||
|
return mxCreateString(s);
|
||||||
|
}
|
||||||
|
mout = matlab_getvar(tv);
|
||||||
|
if (!mout)
|
||||||
|
return FALSE;
|
||||||
|
if (YAP_IsIntTerm(tf)) {
|
||||||
|
return mxGetFieldByNumber(mout, 0, YAP_IntOfTerm(tf));
|
||||||
|
} else if (YAP_IsAtomTerm(tf)) {
|
||||||
|
const char *s=YAP_AtomName(YAP_AtomOfTerm(tf));
|
||||||
|
return mxGetField(mout, 0, s);
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return (mxArray *)YAP_IntOfTerm(YAP_ArgOfTerm(1,ti));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_get_variable(void)
|
||||||
|
{
|
||||||
|
YAP_Term t;
|
||||||
|
mxArray *mat;
|
||||||
|
const int *dims;
|
||||||
|
int ndims;
|
||||||
|
|
||||||
|
mat = get_array(YAP_ARG1);
|
||||||
|
if (!mat)
|
||||||
|
return FALSE;
|
||||||
|
dims = mxGetDimensions(mat);
|
||||||
|
ndims = mxGetNumberOfDimensions(mat);
|
||||||
|
if (mxIsInt32(mat)) {
|
||||||
|
INT32_T *input = (INT32_T *)mxGetPr(mat);
|
||||||
|
t = cp_ints32(ndims, (int *)dims, input, 1, 0, YAP_TermNil());
|
||||||
|
} else if (mxIsInt64(mat)) {
|
||||||
|
INT64_T *input = (INT64_T *)mxGetPr(mat);
|
||||||
|
t = cp_ints64(ndims, (int *)dims, input, 1, 0, YAP_TermNil());
|
||||||
|
} else if (mxIsInt32(mat) || mxIsInt64(mat) || mxIsCell(mat)) {
|
||||||
|
t = cp_cells(ndims, (int *)dims, mat, 1, 0, YAP_TermNil());
|
||||||
|
} else if (mxIsDouble(mat)) {
|
||||||
|
double *input = mxGetPr(mat);
|
||||||
|
t = cp_floats(ndims, (int *)dims, input, 1, 0, YAP_TermNil());
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG2, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
item1(YAP_Term tvar, YAP_Term titem, int off)
|
||||||
|
{
|
||||||
|
mxArray *mat;
|
||||||
|
mat = get_array(tvar);
|
||||||
|
if (!mat)
|
||||||
|
return FALSE;
|
||||||
|
if (mxIsInt32(mat)) {
|
||||||
|
INT32_T *input = (INT32_T *)mxGetPr(mat);
|
||||||
|
if (YAP_IsIntTerm(titem)) {
|
||||||
|
input[off] = YAP_IntOfTerm(titem);
|
||||||
|
} else if (YAP_IsFloatTerm(titem)) {
|
||||||
|
input[off] = YAP_FloatOfTerm(titem);
|
||||||
|
} else if (YAP_IsVarTerm(titem)) {
|
||||||
|
return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
} else if (mxIsInt64(mat)) {
|
||||||
|
INT64_T *input = (INT64_T *)mxGetPr(mat);
|
||||||
|
if (YAP_IsIntTerm(titem)) {
|
||||||
|
input[off] = YAP_IntOfTerm(titem);
|
||||||
|
} else if (YAP_IsFloatTerm(titem)) {
|
||||||
|
input[off] = YAP_FloatOfTerm(titem);
|
||||||
|
} else if (YAP_IsVarTerm(titem)) {
|
||||||
|
return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
} else if (mxIsCell(mat)) {
|
||||||
|
if (YAP_IsVarTerm(titem)) {
|
||||||
|
return YAP_Unify(titem, YAP_MkIntTerm((YAP_Int)mxGetCell(mat,off)));
|
||||||
|
} else {
|
||||||
|
mxArray *mat2 = get_array(titem);
|
||||||
|
mxSetCell(mat,off, mat2);
|
||||||
|
}
|
||||||
|
} else if (mxIsDouble(mat)) {
|
||||||
|
double *input = mxGetPr(mat);
|
||||||
|
if (YAP_IsFloatTerm(titem)) {
|
||||||
|
input[off] = YAP_FloatOfTerm(titem);
|
||||||
|
} else if (YAP_IsIntTerm(titem)) {
|
||||||
|
input[off] = YAP_IntOfTerm(titem);
|
||||||
|
} else {
|
||||||
|
return YAP_Unify(titem, YAP_MkFloatTerm(input[off]));
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
return cp_back(tvar, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_item(void)
|
||||||
|
{
|
||||||
|
YAP_Term titem;
|
||||||
|
int off = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
|
||||||
|
titem = YAP_ARG3;
|
||||||
|
return item1(YAP_ARG1,titem,off);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_item_1(void)
|
||||||
|
{
|
||||||
|
YAP_Term titem;
|
||||||
|
int off = YAP_IntOfTerm(YAP_ARG2)-1;
|
||||||
|
|
||||||
|
titem = YAP_ARG3;
|
||||||
|
return item1(YAP_ARG1,titem,off);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
item2(YAP_Term tvar, YAP_Term titem, int offx, int offy)
|
||||||
|
{
|
||||||
|
mxArray *mat;
|
||||||
|
int rows;
|
||||||
|
int cols;
|
||||||
|
int off;
|
||||||
|
|
||||||
|
mat = get_array(tvar);
|
||||||
|
rows = mxGetM(mat);
|
||||||
|
cols = mxGetN(mat);
|
||||||
|
off = MAT_ACCESS(offx,offy,rows,cols);
|
||||||
|
if (!mat)
|
||||||
|
return FALSE;
|
||||||
|
if (mxIsInt32(mat)) {
|
||||||
|
INT32_T *input = (INT32_T *)mxGetPr(mat);
|
||||||
|
if (YAP_IsIntTerm(titem)) {
|
||||||
|
input[off] = YAP_IntOfTerm(titem);
|
||||||
|
} else if (YAP_IsFloatTerm(titem)) {
|
||||||
|
input[off] = YAP_FloatOfTerm(titem);
|
||||||
|
} else if (YAP_IsVarTerm(titem)) {
|
||||||
|
return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
} else if (mxIsInt64(mat)) {
|
||||||
|
INT64_T *input = (INT64_T *)mxGetPr(mat);
|
||||||
|
if (YAP_IsIntTerm(titem)) {
|
||||||
|
input[off] = YAP_IntOfTerm(titem);
|
||||||
|
} else if (YAP_IsFloatTerm(titem)) {
|
||||||
|
input[off] = YAP_FloatOfTerm(titem);
|
||||||
|
} else if (YAP_IsVarTerm(titem)) {
|
||||||
|
return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
} else if (mxIsCell(mat)) {
|
||||||
|
if (YAP_IsVarTerm(titem)) {
|
||||||
|
return YAP_Unify(titem, YAP_MkIntTerm((YAP_Int)mxGetCell(mat,off)));
|
||||||
|
} else {
|
||||||
|
mxArray *mat2 = get_array(titem);
|
||||||
|
mxSetCell(mat,off, mat2);
|
||||||
|
}
|
||||||
|
} else if (mxIsDouble(mat)) {
|
||||||
|
double *input = mxGetPr(mat);
|
||||||
|
if (YAP_IsFloatTerm(titem)) {
|
||||||
|
input[off] = YAP_FloatOfTerm(titem);
|
||||||
|
} else if (YAP_IsIntTerm(titem)) {
|
||||||
|
input[off] = YAP_IntOfTerm(titem);
|
||||||
|
} else {
|
||||||
|
return YAP_Unify(titem, YAP_MkFloatTerm(input[off]));
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
return cp_back(tvar, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_item2(void)
|
||||||
|
{
|
||||||
|
YAP_Term titem;
|
||||||
|
int x = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
int y = YAP_IntOfTerm(YAP_ARG3);
|
||||||
|
|
||||||
|
titem = YAP_ARG4;
|
||||||
|
return item2(YAP_ARG1,titem,x,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_item2_1(void)
|
||||||
|
{
|
||||||
|
YAP_Term titem;
|
||||||
|
int offx = YAP_IntOfTerm(YAP_ARG2)-1;
|
||||||
|
int offy = YAP_IntOfTerm(YAP_ARG3)-1;
|
||||||
|
|
||||||
|
titem = YAP_ARG4;
|
||||||
|
return item2(YAP_ARG1,titem,offx,offy);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_call_matlab(void)
|
||||||
|
{
|
||||||
|
YAP_Term tlength = YAP_ARG2,
|
||||||
|
tl = YAP_ARG3,
|
||||||
|
tname = YAP_ARG1,
|
||||||
|
tolength = YAP_ARG4,
|
||||||
|
tout = YAP_ARG5;
|
||||||
|
int i = 0;
|
||||||
|
mxArray *inps[50], *outs[50];
|
||||||
|
const char *name;
|
||||||
|
int olength = YAP_IntOfTerm(tolength);
|
||||||
|
|
||||||
|
if (!YAP_IsAtomTerm(tname))
|
||||||
|
return FALSE;
|
||||||
|
name = YAP_AtomName(YAP_AtomOfTerm(tname));
|
||||||
|
if (!YAP_IsIntTerm(tlength))
|
||||||
|
return FALSE;
|
||||||
|
while (YAP_IsPairTerm(tl)) {
|
||||||
|
inps[i] = get_array(YAP_HeadOfTerm(tl));
|
||||||
|
i++;
|
||||||
|
tl = YAP_TailOfTerm(tl);
|
||||||
|
}
|
||||||
|
if (mexCallMATLAB(olength, outs, i, inps, name))
|
||||||
|
return FALSE;
|
||||||
|
/* output arguments */
|
||||||
|
if (YAP_IsPairTerm(tout)) {
|
||||||
|
for (i=0; i<olength; i++) {
|
||||||
|
YAP_Term ti = YAP_HeadOfTerm(tout);
|
||||||
|
if (YAP_IsAtomTerm(ti)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(ti)), outs[i]);
|
||||||
|
} else {
|
||||||
|
return YAP_Unify(ti,address2term(outs[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
YAP_Term to = YAP_MkAtomTerm(YAP_LookupAtom("[]"));
|
||||||
|
for (i=olength; i>0; i--) {
|
||||||
|
to = YAP_MkPairTerm(address2term(outs[i-1]),to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
p_create_cell_matrix_and_copy1(void)
|
||||||
|
{
|
||||||
|
int rows, cols;
|
||||||
|
mxArray *mat;
|
||||||
|
YAP_Term tl = YAP_ARG3;
|
||||||
|
|
||||||
|
rows = YAP_IntOfTerm(YAP_ARG1);
|
||||||
|
cols = YAP_IntOfTerm(YAP_ARG2);
|
||||||
|
if (!(mat = mxCreateCellMatrix(rows, cols)))
|
||||||
|
return FALSE;
|
||||||
|
while (YAP_IsPairTerm(tl)) {
|
||||||
|
YAP_Term th = YAP_HeadOfTerm(tl);
|
||||||
|
int off = MAT_ACCESS(YAP_IntOfTerm(YAP_ArgOfTerm(1,th))-1,
|
||||||
|
YAP_IntOfTerm(YAP_ArgOfTerm(2,th))-1,
|
||||||
|
rows,cols);
|
||||||
|
mxArray *mat2 = get_array(YAP_ArgOfTerm(3,th));
|
||||||
|
mxSetCell(mat,off, mat2);
|
||||||
|
tl = YAP_TailOfTerm(tl);
|
||||||
|
}
|
||||||
|
if (YAP_IsAtomTerm(YAP_ARG4)) {
|
||||||
|
return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
|
||||||
|
}
|
||||||
|
return YAP_Unify(YAP_ARG4,address2term(mat));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_matlab(void)
|
||||||
|
{
|
||||||
|
MatlabAddress = YAP_MkFunctor(YAP_LookupAtom("MATLAB"),1);
|
||||||
|
YAP_UserCPredicate("start_matlab", p_startmatlab, 1);
|
||||||
|
YAP_UserCPredicate("close_matlab", p_closematlab, 0);
|
||||||
|
YAP_UserCPredicate("matlab_on", p_matlabon, 0);
|
||||||
|
YAP_UserCPredicate("matlab_eval_string", p_evalstring2, 1);
|
||||||
|
YAP_UserCPredicate("matlab_eval_string", p_evalstring3, 2);
|
||||||
|
YAP_UserCPredicate("matlab_cells", p_create_cell_vector, 2);
|
||||||
|
YAP_UserCPredicate("matlab_cells", p_create_cell_array, 3);
|
||||||
|
YAP_UserCPredicate("matlab_initialized_cells", p_create_cell_matrix_and_copy1, 4);
|
||||||
|
YAP_UserCPredicate("matlab_zeros", p_create_double_vector, 2);
|
||||||
|
YAP_UserCPredicate("matlab_zeros", p_create_double_array, 3);
|
||||||
|
YAP_UserCPredicate("matlab_zeros", p_create_double_array3, 4);
|
||||||
|
YAP_UserCPredicate("matlab_int_array", p_set_int_array, 4);
|
||||||
|
YAP_UserCPredicate("matlab_vector", p_set_float_vector, 3);
|
||||||
|
YAP_UserCPredicate("matlab_matrix", p_set_float_array, 4);
|
||||||
|
YAP_UserCPredicate("matlab_set_int", p_set_int, 4);
|
||||||
|
YAP_UserCPredicate("matlab_set", p_set_float, 4);
|
||||||
|
YAP_UserCPredicate("matlab_get_variable", p_get_variable, 2);
|
||||||
|
YAP_UserCPredicate("matlab_item", p_item, 3);
|
||||||
|
YAP_UserCPredicate("matlab_item", p_item2, 4);
|
||||||
|
YAP_UserCPredicate("matlab_item1", p_item_1, 3);
|
||||||
|
YAP_UserCPredicate("matlab_item1", p_item2_1, 4);
|
||||||
|
YAP_UserCPredicate("matlab_call_matlab", p_call_matlab, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
int WINAPI PROTO(win_matlab, (HANDLE, DWORD, LPVOID));
|
||||||
|
|
||||||
|
int WINAPI win_matlab(HANDLE hinst, DWORD reason, LPVOID reserved)
|
||||||
|
{
|
||||||
|
switch (reason)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
break;
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
break;
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
break;
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Reference in New Issue
Block a user