Version française
Home     About     Download     Resources     Contact us    
Browse thread
Ocaml <-> Matlab interface
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Maurice.Bremond@i...
Subject: Re: [Caml-list] 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 MEX-files 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"))