caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Ocaml <-> Matlab interface
@ 2009-02-04 12:41 Jan Kybic
  2009-02-05 14:48 ` [Caml-list] " Maurice Bremond
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Kybic @ 2009-02-04 12:41 UTC (permalink / raw)
  To: caml-list

Good afternoon,
                I was using Ocamlmex (by Maurice Bremond)
for interfacing between Matlab and Ocaml. This interface is very
elegant, nice to work with and very complete. Unfortunately, I was
getting quite frequent "segmentation faults" from Matlab when trying
to pass matrices there and back. Probably some issues with memory
management between Ocaml and Matlab. I am posting below the relevant excerpts
from my code in case somebody can spot the problem.

Anyway, I have created an alternative Ocaml<->Matlab interface. Matlab
and Ocaml run as separate processes and communicate using Unix named
pipes (created using mkfifo). This is slower and less complete than
Ocamlmex solution but it is nevertheless usable and also quite stable
(no segfaults). The code is very 'alpha' at the moment but if somebody
is interested in using or improving it, just send me an email. I plan
to release the source code when it matures a little.

Yours,

Jan Kybic


-- 
-------------------------------------------------------------------------
Jan Kybic <kybic@fel.cvut.cz>                       tel. +420 2 2435 5721
http://cmp.felk.cvut.cz/~kybic                      ICQ 200569450

To get an array from Matlab:

  let speed_f = match Mex.mxGetData speedm with
        | Mex.FLOAT32 s -> (
            try
              array2_of_genarray s
            with Invalid_argument _ ->
              failwith "Input is not a 2D array." )
        | _ ->  failwith "Input is not float32 (class single)." in

To pass an array to Matlab:

let mxArray_of_floatarray f =
  let n,m = (Array2.dim1 f, Array2.dim2 f) 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} <- f.{i-1,j-1} ;
   done ;
 done ;
 Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ;
 r


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] Ocaml <-> Matlab interface
  2009-02-04 12:41 Ocaml <-> Matlab interface Jan Kybic
@ 2009-02-05 14:48 ` Maurice Bremond
  0 siblings, 0 replies; 2+ messages in thread
From: Maurice Bremond @ 2009-02-05 14:48 UTC (permalink / raw)
  To: Jan Kybic; +Cc: caml-list



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"))






^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-02-05 14:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-04 12:41 Ocaml <-> Matlab interface Jan Kybic
2009-02-05 14:48 ` [Caml-list] " Maurice Bremond

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).