Ocaml <> Matlab interface

Jan Kybic
 Maurice.Bremond@i...
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:  20090205 (14:49) 
From:  Maurice.Bremond@i... 
Subject:  Re: [Camllist] Ocaml <> Matlab interface 
Hello, >I am posting below the relevant excerpts >from my code in case somebody can spot the problem. Unfortunately, if I try one of the two tests (*1*) and (*2*) below, I cannot reproduce your segfault (ocamlmex 2.1.0 and my Matlab version is 7.7.0.471 (R2008b)) What you can do is :  run these two tests (simply replace example/camlp5o/hello.ml by each of them) for (*1*) at the Matlab prompt : >> for i = 1:10000; hello(hello(hello(hello(single([1:1000,1:1000])))));end (the goal is to trigger the caml gc several times without calling it explicitly) (*2*) : >> for i = 1:1000; hello; end  if you have not already ran the test suite : make test and at Matlab prompt : >> cd <ocamlmexdir>/test >> api('check') Everything should be ok.  put some Gc.full_major() in your MEXfiles to see if a crash occurs (it should not!). Other hints :  if you use Matlab callbacks (Mex.mexCallMATLAB) you can have some segmentation violations if you call Matlab function with a wrong number of arguments (I think this is a Matlab problem that cannot be prevented) see (*3*)  any interruption during Mex.mexCallMATLAB may be fatal to the Matlab session.  if you do not use specific Matlab callbacks, maybe have a try with Octave (>=3.0) (./configure BASE=OCTAVE; make ; make install)  I had segv problems with an old version of Matlab (<= ~R2006x). Please, mail me directly about this (there is no ocamlmex user list) and if you can, send me a full segv example. >Matlab and Ocaml run as separate processes and communicate using Unix >named pipes (created using mkfifo) This sounds like the Matlab engine api : http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_external/f29148.html A limited binding to the Matlab engine api is in ocamlmex, under src/eng. It has not really been tested and maybe it can be improved. Maurice Bremond Examples: (*1*) open Bigarray let _ = Mex.mexRegister (function  a when Array.length(a) > 1  Array.length(a) = 0 > [ ]  a > let speedm = a.(0) in match Mex.mxGetData speedm with  Mex.FLOAT32 s > (try let x = array2_of_genarray s in let dims = Mex.mxGetDimensions speedm in let r = Mex.mxCreateNumericArray [ dims.(0) ; dims.(1) ] Mex.SINGLE_CLASS Mex.REAL in Mex.mxSetData r (Mex.FLOAT32 s); [ r ] with Invalid_argument _ > failwith "Input is not a 2D array.")  _ > failwith "Input is not float32 (class single).") (*2*) open Bigarray let _ = Mex.mexRegister (function  [ ] > let n,m = 1000,1000 in let r = Mex.mxCreateNumericArray [ n ; m ] Mex.DOUBLE_CLASS Mex.REAL in let a = Array2.create float64 fortran_layout n m in for j = 1 to m do for i = 1 to n do a.{i,j} < float_of_int (i+j) ; done ; done ; Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ; [ r ]  _ > failwith "bad args") (*3*) (* segmentation violation *) let _ = mexRegister (function [ a; b; c ] > mexCallMATLAB 3 [ (mexCallMATLAB 4 [ a; ] "plus").(0); c ] "mtimes"  _ > raise (Failure "bad args"))