| 
									
										
										
										
											2015-11-18 15:06:25 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @file   matlab.yap | 
					
						
							|  |  |  |  * @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan> | 
					
						
							|  |  |  |  * @date   Tue Nov 17 22:51:48 2015 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @brief  YAP Matlab interface. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- module(matlab, | 
					
						
							|  |  |  | 	  [start_matlab/1, | 
					
						
							|  |  |  | 	   close_matlab/0, | 
					
						
							|  |  |  | 	   matlab_on/0, | 
					
						
							|  |  |  | 	   matlab_eval_string/1, | 
					
						
							|  |  |  | 	   matlab_eval_string/2, | 
					
						
							|  |  |  | 	   matlab_cells/2, | 
					
						
							|  |  |  | 	   matlab_cells/3, | 
					
						
							|  |  |  | 	   matlab_initialized_cells/4, | 
					
						
							|  |  |  | 	   matlab_zeros/2, | 
					
						
							|  |  |  | 	   matlab_zeros/3, | 
					
						
							|  |  |  | 	   matlab_zeros/4, | 
					
						
							|  |  |  | 	   matlab_matrix/4, | 
					
						
							|  |  |  | 	   matlab_vector/2, | 
					
						
							|  |  |  | 	   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, | 
					
						
							|  |  |  | 	   matlab_call/2]). | 
					
						
							| 
									
										
										
										
											2007-05-24 15:11:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-18 15:06:25 +00:00
										 |  |  | /** @defgroup matlab MATLAB Package Interface | 
					
						
							| 
									
										
										
										
											2015-01-04 23:58:23 +00:00
										 |  |  | @ingroup library | 
					
						
							| 
									
										
										
										
											2014-09-11 14:06:57 -05:00
										 |  |  | @{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The MathWorks MATLAB is a widely used package for array | 
					
						
							|  |  |  | processing. YAP now includes a straightforward interface to MATLAB. To | 
					
						
							|  |  |  | actually use it, you need to install YAP calling `configure` with | 
					
						
							|  |  |  | the `--with-matlab=DIR` option, and you need to call | 
					
						
							|  |  |  | `use_module(library(lists))` command. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Accessing the matlab dynamic libraries can be complicated. In Linux | 
					
						
							|  |  |  | machines, to use this interface, you may have to set the environment | 
					
						
							|  |  |  | variable <tt>LD_LIBRARY_PATH</tt>. Next, follows an example using bash in a | 
					
						
							|  |  |  | 64-bit Linux PC: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~~~ | 
					
						
							|  |  |  | export LD_LIBRARY_PATH=''$MATLAB_HOME"/sys/os/glnxa64:''$MATLAB_HOME"/bin/glnxa64:''$LD_LIBRARY_PATH" | 
					
						
							|  |  |  | ~~~~~ | 
					
						
							|  |  |  | where `MATLAB_HOME` is the directory where matlab is installed | 
					
						
							|  |  |  | at. Please replace `ax64` for `x86` on a 32-bit PC. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-18 15:06:25 +00:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-09-11 14:06:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-18 15:06:25 +00:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2014-09-11 14:06:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |  @pred start_matlab(+ _Options_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Start a matlab session. The argument  _Options_ may either be the | 
					
						
							|  |  |  | empty string/atom or the command to call matlab. The command may fail. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @pred close_matlab  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Stop the current matlab session. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_cells(+ _SizeX_, + _SizeY_, ? _Array_) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create an empty array of cells of size  _SizeX_ and | 
					
						
							|  |  |  |  _SizeY_, and if  _Array_ is bound to an atom, store the array | 
					
						
							|  |  |  | in the matlab variable with name  _Array_.  Corresponds to the | 
					
						
							|  |  |  | MATLAB command `cells`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_cells(+ _Size_, ? _Array_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create an empty vector of cells of size  _Size_, and if | 
					
						
							|  |  |  |  _Array_ is bound to an atom, store the array in the matlab | 
					
						
							|  |  |  | variable with name  _Array_. Corresponds to the MATLAB command `cells`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_eval_string(+ _Command_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Holds if matlab evaluated successfully the command  _Command_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_eval_string(+ _Command_, - _Answer_) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will evaluate the command  _Command_ and unify  _Answer_ | 
					
						
							|  |  |  | with a string reporting the result. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_get_variable(+ _MatVar_, - _List_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Unify MATLAB variable  _MatVar_ with the List  _List_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_initialized_cells(+ _SizeX_, + _SizeY_, + _List_, ? _Array_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create an array of cells of size  _SizeX_ and | 
					
						
							|  |  |  |  _SizeY_, initialized from the list  _List_, and if  _Array_ | 
					
						
							|  |  |  | is bound to an atom, store the array in the matlab variable with name | 
					
						
							|  |  |  |  _Array_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_item(+ _MatVar_, + _X_, + _Y_, ? _Val_) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Read or set MATLAB  _MatVar_( _X_, _Y_) from/to  _Val_. Use | 
					
						
							|  |  |  | `C` notation for matrix access (ie, starting from 0). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_item(+ _MatVar_, + _X_, ? _Val_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Read or set MATLAB  _MatVar_( _X_) from/to  _Val_. Use | 
					
						
							|  |  |  | `C` notation for matrix access (ie, starting from 0). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_item1(+ _MatVar_, + _X_, + _Y_, ? _Val_) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Read or set MATLAB  _MatVar_( _X_, _Y_) from/to  _Val_. Use | 
					
						
							|  |  |  | MATLAB notation for matrix access (ie, starting from 1). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_item1(+ _MatVar_, + _X_, ? _Val_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Read or set MATLAB  _MatVar_( _X_) from/to  _Val_. Use | 
					
						
							|  |  |  | MATLAB notation for matrix access (ie, starting from 1). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_matrix(+ _SizeX_, + _SizeY_, + _List_, ? _Array_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create an array of floats of size  _SizeX_ and  _SizeY_, | 
					
						
							|  |  |  | initialized from the list  _List_, and if  _Array_ is bound to | 
					
						
							|  |  |  | an atom, store the array in the matlab variable with name  _Array_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_on  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Holds if a matlab session is on. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_sequence(+ _Min_, + _Max_, ? _Array_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create a sequence going from  _Min_ to  _Max_, and | 
					
						
							|  |  |  | if  _Array_ is bound to an atom, store the sequence in the matlab | 
					
						
							|  |  |  | variable with name  _Array_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_set(+ _MatVar_, + _X_, + _Y_, + _Value_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Call MATLAB to set element  _MatVar_( _X_,  _Y_) to | 
					
						
							|  |  |  |  _Value_. Notice that this command uses the MATLAB array access | 
					
						
							|  |  |  | convention. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_vector(+ _Size_, + _List_, ? _Array_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create a vector of floats of size  _Size_, initialized | 
					
						
							|  |  |  | from the list  _List_, and if  _Array_ is bound to an atom, | 
					
						
							|  |  |  | store the array in the matlab variable with name  _Array_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_zeros(+ _SizeX_, + _SizeY_, + _SizeZ_, ? _Array_) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create an array of zeros of size  _SizeX_,  _SizeY_, | 
					
						
							|  |  |  | and  _SizeZ_. If  _Array_ is bound to an atom, store the array | 
					
						
							|  |  |  | in the matlab variable with name  _Array_.  Corresponds to the | 
					
						
							|  |  |  | MATLAB command `zeros`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | /** @pred matlab_zeros(+ _SizeX_, + _SizeY_, ? _Array_) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create an array of zeros of size  _SizeX_ and | 
					
						
							|  |  |  |  _SizeY_, and if  _Array_ is bound to an atom, store the array | 
					
						
							|  |  |  | in the matlab variable with name  _Array_.  Corresponds to the | 
					
						
							|  |  |  | MATLAB command `zeros`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** @pred matlab_zeros(+ _Size_, ? _Array_)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATLAB will create a vector of zeros of size  _Size_, and if | 
					
						
							|  |  |  |  _Array_ is bound to an atom, store the array in the matlab | 
					
						
							|  |  |  | variable with name  _Array_. Corresponds to the MATLAB command | 
					
						
							|  |  |  | `zeros`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2007-05-24 15:11:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | :- ensure_loaded(library(lists)). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-22 21:42:11 +00:00
										 |  |  | tell_warning :- | 
					
						
							|  |  |  | 	print_message(warning,functionality(matlab)). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- ( catch(load_foreign_files([matlab], ['eng','mx','ut'], init_matlab),_,fail) -> true ; tell_warning). | 
					
						
							| 
									
										
										
										
											2007-05-24 15:11:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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).	 | 
					
						
							| 
									
										
										
										
											2007-07-07 01:52:57 +00:00
										 |  |  | build_args([Arg],Lf,L0) :- !, | 
					
						
							| 
									
										
										
										
											2007-05-24 15:11:46 +00:00
										 |  |  | 	build_arg(Arg,Lf,[')'|L0]). | 
					
						
							|  |  |  | build_args([Arg|Args],L,L0) :- | 
					
						
							|  |  |  | 	build_arg(Arg,L,[', '|L1]), | 
					
						
							|  |  |  | 	build_args(Args,L1,L0). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-07 01:52:57 +00:00
										 |  |  | build_arg(V,_,_) :- var(V), !, | 
					
						
							|  |  |  | 	throw(error(instantiation_error)). | 
					
						
							| 
									
										
										
										
											2007-05-24 15:11:46 +00:00
										 |  |  | 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) :- | 
					
						
							| 
									
										
										
										
											2007-07-07 01:52:57 +00:00
										 |  |  | 	F=..[N|As], | 
					
						
							|  |  |  | 	build_args(As,L,L0). | 
					
						
							| 
									
										
										
										
											2007-05-24 15:11:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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]). |