22#if defined(__MINGW32__) || _MSC_VER
30#define MAT_ACCESS(I,J,ROWS,COLS) ((I)+((J)*(ROWS)))
35void init_matlab(
void);
37static YAP_Functor MatlabAddress;
38static Engine *Meng = NULL;
41matlab_getvar(YAP_Term t)
43 return engGetVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(t)));
47address2term(mxArray *mat)
51 t[0] = YAP_MkIntTerm((YAP_Int)mat);
52 return YAP_MkApplTerm(MatlabAddress,1,t);
56cp_back(YAP_Term vart, mxArray *mat)
58 if (!YAP_IsAtomTerm(vart)) {
62 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(vart)), mat);
70 YAP_Term topts = YAP_ARG1;
74 if (YAP_IsAtomTerm(topts))
75 ptr = YAP_AtomName(YAP_AtomOfTerm(topts));
79 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-1));
83 if (!(Meng = engOpen(
"\0"))) {
84 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-2));
87 if (!(Meng = engOpen(ptr))) {
88 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-2));
91 engOutputBuffer(Meng, NULL, 0);
108 return engClose(eng);
117 YAP_Term tcom = YAP_ARG1;
120 if (YAP_IsAtomTerm(tcom))
121 comd = YAP_AtomName(YAP_AtomOfTerm(tcom));
124 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-1));
127 return !engEvalString(Meng, comd);
134 YAP_Term tcom = YAP_ARG1;
140 if (YAP_IsAtomTerm(tcom))
141 comd = YAP_AtomName(YAP_AtomOfTerm(tcom));
144 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(-1));
147 engOutputBuffer(Meng, buf, OBUFSIZE);
148 out = !engEvalString(Meng, comd);
149 engOutputBuffer(Meng, NULL, 0);
150 return YAP_Unify(YAP_ARG2, YAP_BufferToString(buf));
154p_create_cell_vector(
void)
159 dims[0] = YAP_IntOfTerm(YAP_ARG1);
160 if (!(mat = mxCreateCellArray(1, dims)))
162 if (YAP_IsAtomTerm(YAP_ARG2)) {
163 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), mat);
165 return YAP_Unify(YAP_ARG2,address2term(mat));
169p_create_cell_array(
void)
174 rows = YAP_IntOfTerm(YAP_ARG1);
175 cols = YAP_IntOfTerm(YAP_ARG2);
176 if (!(mat = mxCreateCellMatrix(rows, cols)))
178 if (YAP_IsAtomTerm(YAP_ARG3)) {
179 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), mat);
181 return YAP_Unify(YAP_ARG3,address2term(mat));
185p_create_double_vector(
void)
190 dims[0] = YAP_IntOfTerm(YAP_ARG1);
191 if (!(mat = mxCreateNumericArray(1, dims, mxDOUBLE_CLASS, mxREAL)))
193 if (YAP_IsAtomTerm(YAP_ARG2)) {
194 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), mat);
196 return YAP_Unify(YAP_ARG2,address2term(mat));
200p_create_double_array(
void)
205 rows = YAP_IntOfTerm(YAP_ARG1);
206 cols = YAP_IntOfTerm(YAP_ARG2);
207 if (!(mat = mxCreateDoubleMatrix(rows, cols, mxREAL)))
209 if (YAP_IsAtomTerm(YAP_ARG3)) {
210 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), mat);
212 return YAP_Unify(YAP_ARG3,address2term(mat));
216p_create_double_array3(
void)
221 dims[0] = YAP_IntOfTerm(YAP_ARG1);
222 dims[1] = YAP_IntOfTerm(YAP_ARG2);
223 dims[2] = YAP_IntOfTerm(YAP_ARG3);
224 if (!(mat = mxCreateNumericArray(3, dims, mxDOUBLE_CLASS, mxREAL)))
226 if (YAP_IsAtomTerm(YAP_ARG3)) {
227 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
229 return YAP_Unify(YAP_ARG3,address2term(mat));
235 int rows, cols, i = 0, j = 0;
238 YAP_Term tl = YAP_ARG4;
240 mat = matlab_getvar(YAP_ARG1);
241 rows = YAP_IntOfTerm(YAP_ARG2);
242 cols = YAP_IntOfTerm(YAP_ARG3);
243 input = (YAP_Int *)mxGetPr(mat);
245 for (i = 0; i < rows*cols; i++) {
248 if (!YAP_IsPairTerm(tl)) {
251 th = YAP_HeadOfTerm(tl);
252 if (!YAP_IsIntTerm(th)) {
256 input[MAT_ACCESS(i++,j,rows,cols)] = YAP_IntOfTerm(th);
261 tl = YAP_TailOfTerm(tl);
263 if (YAP_IsAtomTerm(YAP_ARG4)) {
264 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
266 return YAP_Unify(YAP_ARG4,address2term(mat));
270p_set_float_array(
void)
272 int rows, cols, i = 0, j = 0;
275 YAP_Term tl = YAP_ARG3;
277 rows = YAP_IntOfTerm(YAP_ARG1);
278 cols = YAP_IntOfTerm(YAP_ARG2);
279 if (!(mat = mxCreateDoubleMatrix(rows, cols, mxREAL)))
281 input = mxGetPr(mat);
283 for (i = 0; i < rows; i++) {
284 for (j = 0; j < cols; j++) {
287 if (!YAP_IsPairTerm(tl)) {
290 th = YAP_HeadOfTerm(tl);
291 if (YAP_IsIntTerm(th)) {
292 input[MAT_ACCESS(i,j,rows,cols)] = YAP_IntOfTerm(th);
293 }
else if (YAP_IsFloatTerm(th)) {
294 input[MAT_ACCESS(i,j,rows,cols)] = YAP_FloatOfTerm(th);
299 tl = YAP_TailOfTerm(tl);
302 if (YAP_IsAtomTerm(YAP_ARG4)) {
303 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
305 return YAP_Unify(YAP_ARG4,address2term(mat));
309p_set_float_vector(
void)
315 YAP_Term tl = YAP_ARG2;
317 len[0] = YAP_IntOfTerm(YAP_ARG1);
318 if (!(mat = mxCreateNumericArray(1,len, mxDOUBLE_CLASS, mxREAL)))
320 input = mxGetPr(mat);
322 for (i = 0; i < len[0]; i++) {
325 if (!YAP_IsPairTerm(tl)) {
328 th = YAP_HeadOfTerm(tl);
329 if (YAP_IsIntTerm(th)) {
330 input[i] = YAP_IntOfTerm(th);
331 }
else if (YAP_IsFloatTerm(th)) {
332 input[i] = YAP_FloatOfTerm(th);
337 tl = YAP_TailOfTerm(tl);
339 if (YAP_IsAtomTerm(YAP_ARG3)) {
340 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), mat);
342 return YAP_Unify(YAP_ARG3,address2term(mat));
348 int rows, cols, i, j;
352 mat = matlab_getvar(YAP_ARG1);
353 i = YAP_IntOfTerm(YAP_ARG2);
354 j = YAP_IntOfTerm(YAP_ARG3);
355 input = (YAP_Int *)mxGetPr(mat);
358 input[MAT_ACCESS(i-1,j-1,rows,cols)] = YAP_IntOfTerm(YAP_ARG4);
365 int rows, cols, i, j;
368 YAP_Term t = YAP_ARG4;
370 mat = matlab_getvar(YAP_ARG1);
371 i = YAP_IntOfTerm(YAP_ARG2);
372 j = YAP_IntOfTerm(YAP_ARG3);
373 input = mxGetPr(mat);
376 if (YAP_IsIntTerm(t))
377 input[MAT_ACCESS(i-1,j-1,rows,cols)] = YAP_IntOfTerm(t);
379 input[MAT_ACCESS(i-1,j-1,rows,cols)] = YAP_FloatOfTerm(t);
385cp_ints32(
int ndims,
int *dims, INT32_T *input,
int factor,
int base, YAP_Term t)
390 for (i=dims[0]; i>0; i--) {
391 t = YAP_MkPairTerm(YAP_MkIntTerm(input[base+factor*(i-1)]),t);
394 for (i=dims[0]; i>0; i--) {
395 t = cp_ints32(ndims-1, dims+1, input, factor*dims[0], base+factor*(i-1),t);
401cp_ints64(
int ndims,
int *dims, INT64_T *input,
int factor,
int base, YAP_Term t)
406 for (i=dims[0]; i>0; i--) {
407 t = YAP_MkPairTerm(YAP_MkIntTerm(input[base+factor*(i-1)]),t);
410 for (i=dims[0]; i>0; i--) {
411 t = cp_ints64(ndims-1, dims+1, input, factor*dims[0], base+factor*(i-1),t);
417cp_cells(
int ndims,
int *dims, mxArray *mat,
int factor,
int base, YAP_Term t)
422 for (i=dims[0]; i>0; i--) {
423 t = YAP_MkPairTerm(YAP_MkIntTerm((YAP_Int)mxGetCell(mat,base+factor*(i-1))),t);
426 for (i=dims[0]; i>0; i--) {
427 t = cp_cells(ndims-1, dims+1, mat, factor*dims[0], base+factor*(i-1),t);
434cp_floats(
int ndims,
int *dims,
double *input,
int factor,
int base, YAP_Term t)
439 for (i=dims[0]; i>0; i--) {
440 t = YAP_MkPairTerm(YAP_MkFloatTerm(input[base+factor*(i-1)]),t);
443 for (i=dims[0]; i>0; i--) {
444 t = cp_floats(ndims-1, dims+1, input, factor*dims[0], base+factor*(i-1),t);
451get_array(YAP_Term ti)
453 if (YAP_IsIntTerm(ti)) {
454 return mxCreateDoubleScalar(YAP_IntOfTerm(ti));
455 }
else if (YAP_IsFloatTerm(ti)) {
456 return mxCreateDoubleScalar(YAP_FloatOfTerm(ti));
457 }
else if (YAP_IsAtomTerm(ti)) {
458 return matlab_getvar(ti);
459 }
else if (YAP_IsPairTerm(ti)) {
460 YAP_Term tv = YAP_HeadOfTerm(ti);
461 YAP_Term tf = YAP_TailOfTerm(ti);
464 if (!YAP_IsAtomTerm(tv)) {
468 return mxCreateString(s);
470 mout = matlab_getvar(tv);
473 if (YAP_IsIntTerm(tf)) {
474 return mxGetFieldByNumber(mout, 0, YAP_IntOfTerm(tf));
475 }
else if (YAP_IsAtomTerm(tf)) {
476 const char *s=YAP_AtomName(YAP_AtomOfTerm(tf));
477 return mxGetField(mout, 0, s);
482 return (mxArray *)YAP_IntOfTerm(YAP_ArgOfTerm(1,ti));
494 mat = get_array(YAP_ARG1);
497 dims = mxGetDimensions(mat);
498 ndims = mxGetNumberOfDimensions(mat);
499 if (mxIsInt32(mat)) {
500 INT32_T *input = (INT32_T *)mxGetPr(mat);
501 t = cp_ints32(ndims, (
int *)dims, input, 1, 0, YAP_TermNil());
502 }
else if (mxIsInt64(mat)) {
503 INT64_T *input = (INT64_T *)mxGetPr(mat);
504 t = cp_ints64(ndims, (
int *)dims, input, 1, 0, YAP_TermNil());
505 }
else if (mxIsInt32(mat) || mxIsInt64(mat) || mxIsCell(mat)) {
506 t = cp_cells(ndims, (
int *)dims, mat, 1, 0, YAP_TermNil());
507 }
else if (mxIsDouble(mat)) {
508 double *input = mxGetPr(mat);
509 t = cp_floats(ndims, (
int *)dims, input, 1, 0, YAP_TermNil());
513 return YAP_Unify(YAP_ARG2, t);
518item1(YAP_Term tvar, YAP_Term titem,
int off)
521 mat = get_array(tvar);
524 if (mxIsInt32(mat)) {
525 INT32_T *input = (INT32_T *)mxGetPr(mat);
526 if (YAP_IsIntTerm(titem)) {
527 input[off] = YAP_IntOfTerm(titem);
528 }
else if (YAP_IsFloatTerm(titem)) {
529 input[off] = YAP_FloatOfTerm(titem);
530 }
else if (YAP_IsVarTerm(titem)) {
531 return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
534 }
else if (mxIsInt64(mat)) {
535 INT64_T *input = (INT64_T *)mxGetPr(mat);
536 if (YAP_IsIntTerm(titem)) {
537 input[off] = YAP_IntOfTerm(titem);
538 }
else if (YAP_IsFloatTerm(titem)) {
539 input[off] = YAP_FloatOfTerm(titem);
540 }
else if (YAP_IsVarTerm(titem)) {
541 return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
544 }
else if (mxIsCell(mat)) {
545 if (YAP_IsVarTerm(titem)) {
546 return YAP_Unify(titem, YAP_MkIntTerm((YAP_Int)mxGetCell(mat,off)));
548 mxArray *mat2 = get_array(titem);
549 mxSetCell(mat,off, mat2);
551 }
else if (mxIsDouble(mat)) {
552 double *input = mxGetPr(mat);
553 if (YAP_IsFloatTerm(titem)) {
554 input[off] = YAP_FloatOfTerm(titem);
555 }
else if (YAP_IsIntTerm(titem)) {
556 input[off] = YAP_IntOfTerm(titem);
558 return YAP_Unify(titem, YAP_MkFloatTerm(input[off]));
562 return cp_back(tvar, mat);
569 int off = YAP_IntOfTerm(YAP_ARG2);
572 return item1(YAP_ARG1,titem,off);
579 int off = YAP_IntOfTerm(YAP_ARG2)-1;
582 return item1(YAP_ARG1,titem,off);
587item2(YAP_Term tvar, YAP_Term titem,
int offx,
int offy)
594 mat = get_array(tvar);
597 off = MAT_ACCESS(offx,offy,rows,cols);
600 if (mxIsInt32(mat)) {
601 INT32_T *input = (INT32_T *)mxGetPr(mat);
602 if (YAP_IsIntTerm(titem)) {
603 input[off] = YAP_IntOfTerm(titem);
604 }
else if (YAP_IsFloatTerm(titem)) {
605 input[off] = YAP_FloatOfTerm(titem);
606 }
else if (YAP_IsVarTerm(titem)) {
607 return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
610 }
else if (mxIsInt64(mat)) {
611 INT64_T *input = (INT64_T *)mxGetPr(mat);
612 if (YAP_IsIntTerm(titem)) {
613 input[off] = YAP_IntOfTerm(titem);
614 }
else if (YAP_IsFloatTerm(titem)) {
615 input[off] = YAP_FloatOfTerm(titem);
616 }
else if (YAP_IsVarTerm(titem)) {
617 return YAP_Unify(titem, YAP_MkIntTerm(input[off]));
620 }
else if (mxIsCell(mat)) {
621 if (YAP_IsVarTerm(titem)) {
622 return YAP_Unify(titem, YAP_MkIntTerm((YAP_Int)mxGetCell(mat,off)));
624 mxArray *mat2 = get_array(titem);
625 mxSetCell(mat,off, mat2);
627 }
else if (mxIsDouble(mat)) {
628 double *input = mxGetPr(mat);
629 if (YAP_IsFloatTerm(titem)) {
630 input[off] = YAP_FloatOfTerm(titem);
631 }
else if (YAP_IsIntTerm(titem)) {
632 input[off] = YAP_IntOfTerm(titem);
634 return YAP_Unify(titem, YAP_MkFloatTerm(input[off]));
638 return cp_back(tvar, mat);
645 int x = YAP_IntOfTerm(YAP_ARG2);
646 int y = YAP_IntOfTerm(YAP_ARG3);
649 return item2(YAP_ARG1,titem,x,y);
656 int offx = YAP_IntOfTerm(YAP_ARG2)-1;
657 int offy = YAP_IntOfTerm(YAP_ARG3)-1;
660 return item2(YAP_ARG1,titem,offx,offy);
666 YAP_Term tlength = YAP_ARG2,
672 mxArray *inps[50], *outs[50];
674 int olength = YAP_IntOfTerm(tolength);
676 if (!YAP_IsAtomTerm(tname))
678 name = YAP_AtomName(YAP_AtomOfTerm(tname));
679 if (!YAP_IsIntTerm(tlength))
681 while (YAP_IsPairTerm(tl)) {
682 inps[i] = get_array(YAP_HeadOfTerm(tl));
684 tl = YAP_TailOfTerm(tl);
686 if (mexCallMATLAB(olength, outs, i, inps, name))
689 if (YAP_IsPairTerm(tout)) {
690 for (i=0; i<olength; i++) {
691 YAP_Term ti = YAP_HeadOfTerm(tout);
692 if (YAP_IsAtomTerm(ti)) {
693 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(ti)), outs[i]);
695 return YAP_Unify(ti,address2term(outs[i]));
699 YAP_Term to = YAP_MkAtomTerm(YAP_LookupAtom(
"[]"));
700 for (i=olength; i>0; i--) {
701 to = YAP_MkPairTerm(address2term(outs[i-1]),to);
708p_create_cell_matrix_and_copy1(
void)
712 YAP_Term tl = YAP_ARG3;
714 rows = YAP_IntOfTerm(YAP_ARG1);
715 cols = YAP_IntOfTerm(YAP_ARG2);
716 if (!(mat = mxCreateCellMatrix(rows, cols)))
718 while (YAP_IsPairTerm(tl)) {
719 YAP_Term th = YAP_HeadOfTerm(tl);
720 int off = MAT_ACCESS(YAP_IntOfTerm(YAP_ArgOfTerm(1,th))-1,
721 YAP_IntOfTerm(YAP_ArgOfTerm(2,th))-1,
723 mxArray *mat2 = get_array(YAP_ArgOfTerm(3,th));
724 mxSetCell(mat,off, mat2);
725 tl = YAP_TailOfTerm(tl);
727 if (YAP_IsAtomTerm(YAP_ARG4)) {
728 return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG4)), mat);
730 return YAP_Unify(YAP_ARG4,address2term(mat));
736 MatlabAddress = YAP_MkFunctor(YAP_LookupAtom(
"MATLAB"),1);
737 YAP_UserCPredicate(
"start_matlab", p_startmatlab, 1);
738 YAP_UserCPredicate(
"close_matlab", p_closematlab, 0);
739 YAP_UserCPredicate(
"matlab_on", p_matlabon, 0);
740 YAP_UserCPredicate(
"matlab_eval_string", p_evalstring2, 1);
741 YAP_UserCPredicate(
"matlab_eval_string", p_evalstring3, 2);
742 YAP_UserCPredicate(
"matlab_cells", p_create_cell_vector, 2);
743 YAP_UserCPredicate(
"matlab_cells", p_create_cell_array, 3);
744 YAP_UserCPredicate(
"matlab_initialized_cells", p_create_cell_matrix_and_copy1, 4);
745 YAP_UserCPredicate(
"matlab_zeros", p_create_double_vector, 2);
746 YAP_UserCPredicate(
"matlab_zeros", p_create_double_array, 3);
747 YAP_UserCPredicate(
"matlab_zeros", p_create_double_array3, 4);
748 YAP_UserCPredicate(
"matlab_int_array", p_set_int_array, 4);
749 YAP_UserCPredicate(
"matlab_vector", p_set_float_vector, 3);
750 YAP_UserCPredicate(
"matlab_matrix", p_set_float_array, 4);
751 YAP_UserCPredicate(
"matlab_set_int", p_set_int, 4);
752 YAP_UserCPredicate(
"matlab_set", p_set_float, 4);
753 YAP_UserCPredicate(
"matlab_get_variable", p_get_variable, 2);
754 YAP_UserCPredicate(
"matlab_item", p_item, 3);
755 YAP_UserCPredicate(
"matlab_item", p_item2, 4);
756 YAP_UserCPredicate(
"matlab_item1", p_item_1, 3);
757 YAP_UserCPredicate(
"matlab_item1", p_item2_1, 4);
758 YAP_UserCPredicate(
"matlab_call_matlab", p_call_matlab, 5);
763int WINAPI win_matlab(HANDLE, DWORD, LPVOID);
765int WINAPI win_matlab(HANDLE hinst, DWORD reason, LPVOID reserved)
769 case DLL_PROCESS_ATTACH:
771 case DLL_PROCESS_DETACH:
773 case DLL_THREAD_ATTACH:
775 case DLL_THREAD_DETACH:
X_API char * YAP_StringToBuffer(Term t, char *buf, unsigned int bufsize)
copy a string to a buffer, the buffer must have been malloced