19#if defined(__MINGW32__) || _MSC_VER
45typedef enum { INT_MATRIX, FLOAT_MATRIX } mat_data_type;
87static YAP_Functor MFunctorM, MFunctorFloats;
88static YAP_Term MTermTrue, MTermFalse, MTermFail;
89static YAP_Atom MAtomC;
91static YAP_Int *matrix_long_data(intptr_t *mat, intptr_t ndims) {
92 return (YAP_Int *)(mat + (MAT_DIMS + ndims));
95static double *matrix_double_data(intptr_t *mat, intptr_t ndims) {
96 return (
double *)(mat + (MAT_DIMS + ndims));
99static intptr_t matrix_get_offset(intptr_t *mat, intptr_t *indx) {
100 intptr_t i, pos = mat[MAT_SIZE], off = 0;
103 for (i = 0; i < mat[MAT_NDIMS]; i++) {
105 pos /= mat[MAT_DIMS + i];
106 v = indx[i] - mat[MAT_BASE];
107 if (v >= mat[MAT_DIMS + i]) {
115static void matrix_get_index(intptr_t *mat, intptr_t offset, intptr_t *indx) {
116 intptr_t i, pos = mat[MAT_SIZE];
119 for (i = 0; i < mat[MAT_NDIMS]; i++) {
120 pos /= mat[MAT_DIMS + i];
121 indx[i] = offset / pos;
122 offset = offset % pos;
126static size_t GET_OFFSET(YAP_Term t,
M *mat, intptr_t *poffset) {
127 intptr_t i, off = 0, pos = mat->sz;
128 if (YAP_IsIntTerm(t)) {
129 *poffset = YAP_IntOfTerm(t);
133 for (i = 0; i < mat->ndims; i++) {
135 if (!YAP_IsPairTerm(t))
136 YAP_Error(TYPE_ERROR, t, NULL);
137 v = YAP_IntOfTerm(YAP_HeadOfTerm(t)) - mat->base;
140 t = YAP_TailOfTerm(t);
147static YAP_Bool GET_INDEX(
M *mat, intptr_t off, YAP_Term *tf) {
148 intptr_t i, pos = mat->sz;
153 for (i = 0; i < mat->ndims; i++) {
154 t = YAP_MkNewPairTerm();
158 YAP_Unify(YAP_HeadOfTerm(t),YAP_MkIntTerm(off/pos));
160 *tf = YAP_TailOfTerm(t);
162 return YAP_Unify(t,YAP_ARG3);
165static void matrix_next_index(intptr_t *dims, intptr_t ndims, intptr_t *indx) {
169 for (i = ndims; i > 0;) {
172 if (indx[i] != dims[i])
178static int GET_MATRIX(YAP_Term inp,
M *o) {
183 if ((mat = YAP_BlobOfTerm(inp))) {
184 o->type = mat[MAT_TYPE] == FLOAT_MATRIX ?
'f' :
'i';
186 o->sz = mat[MAT_SIZE];
187 o->ndims = mat[MAT_NDIMS];
188 o->data = (
double *)(mat + (MAT_DIMS + o->ndims));
189 o->dims = mat + MAT_DIMS;
191 }
else if (YAP_IsAtomTerm(inp)) {
192 if ((o->data = YAP_FetchArray(inp, &o->sz, &o->type))) {
201 }
else if (YAP_IsApplTerm(inp)) {
202 YAP_Functor f = YAP_FunctorOfTerm(inp);
203 const char *name=YAP_AtomName(YAP_NameOfFunctor(f));
208 YAP_Term bases = YAP_IntOfTerm(YAP_ArgOfTerm(4,inp));
209 o->sz = YAP_IntOfTerm(YAP_ArgOfTerm(3,inp));
210 if (YAP_IsIntTerm(bases))
211 o->base = YAP_IntOfTerm(bases);
213 o->base = YAP_IntOfTerm(YAP_HeadOfTerm(bases));
214 o->c_ord = o->base == 0;
215 o->ndims = YAP_IntOfTerm(YAP_ArgOfTerm(2,inp));
216 o->dims = malloc(o->ndims*
sizeof(intptr_t));
217 YAP_Term l = YAP_ArgOfTerm(1,inp);
218 intptr_t *d = o->dims;
219 while(YAP_IsPairTerm(l)) {
220 *d++ = YAP_IntOfTerm(YAP_HeadOfTerm(l));
221 l = YAP_TailOfTerm(l);
223 o->terms=YAP_ArgsOfTerm(YAP_ArgOfTerm(inp,5))+1;
227 o->sz = YAP_IntOfTerm(YAP_ArgOfTerm(2, inp));
232 o->data = (
double *)YAP_IntOfTerm(YAP_ArgOfTerm(1, inp));
239static bool IS_MATRIX(YAP_Term inp) {
241 if ((mat = YAP_BlobOfTerm(inp))) {
243 mat[MAT_TYPE] == FLOAT_MATRIX ||
244 mat[MAT_TYPE] == INT_MATRIX;
245 }
else if (YAP_IsAtomTerm(inp)) {
248 if (YAP_FetchArray(inp, &size, &type)) {
253 YAP_Functor f = YAP_FunctorOfTerm(inp);
261static YAP_Bool is_matrix(
void) {
262 return IS_MATRIX(YAP_ARG1);
266static YAP_Term new_int_matrix(intptr_t ndims, intptr_t dims[],
269 intptr_t i, nelems = 1;
277 for (i = 0; i < ndims; i++) {
281 sz = ((MAT_DIMS + 1) *
sizeof(
int) + ndims *
sizeof(int) +
282 nelems *
sizeof(YAP_Int)) /
285 blob = YAP_MkBlobTerm(sz);
286 if (blob == YAP_TermNil()) {
289 mat = (intptr_t *)YAP_BlobOfTerm(blob);
290 mat[MAT_TYPE] = INT_MATRIX;
292 mat[MAT_NDIMS] = ndims;
293 mat[MAT_SIZE] = nelems;
294 for (i = 0; i < ndims; i++) {
295 mat[MAT_DIMS + i] = idims[i];
297 bdata = matrix_long_data(mat, ndims);
299 memmove((
void *)bdata, (
void *)data,
sizeof(
double) * nelems);
303static YAP_Term new_float_matrix(intptr_t ndims, intptr_t dims[],
306 intptr_t i, nelems = 1;
314 for (i = 0; i < ndims; i++) {
318 sz = ((MAT_DIMS + 1) *
sizeof(
int) + ndims *
sizeof(int) +
319 (nelems + 1) *
sizeof(double) + (
sizeof(YAP_CELL) - 1)) /
321 blob = YAP_MkBlobTerm(sz);
322 if (blob == YAP_TermNil())
324 mat = YAP_BlobOfTerm(blob);
325 mat[MAT_TYPE] = FLOAT_MATRIX;
327 mat[MAT_NDIMS] = ndims;
328 mat[MAT_SIZE] = nelems;
329 for (i = 0; i < ndims; i++) {
330 mat[MAT_DIMS + i] = idims[i];
332 bdata = matrix_double_data(mat, ndims);
334 memmove((
void *)bdata, (
void *)data,
sizeof(
double) * nelems);
338static YAP_Bool scan_dims(intptr_t ndims, YAP_Term tl,
339 intptr_t dims[MAX_DIMS]) {
342 for (i = 0; i < ndims; i++) {
346 if (!YAP_IsPairTerm(tl)) {
349 th = YAP_HeadOfTerm(tl);
350 if (!YAP_IsIntTerm(th)) {
354 d = YAP_IntOfTerm(th);
360 tl = YAP_TailOfTerm(tl);
362 if (tl != YAP_TermNil()) {
369static YAP_Bool cp_int_matrix(YAP_Term tl, YAP_Term matrix) {
370 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(matrix);
371 int i, nelems = mat[MAT_SIZE];
372 YAP_Int *j = matrix_long_data(mat, mat[MAT_NDIMS]);
374 for (i = 0; i < nelems; i++) {
378 if (!YAP_IsPairTerm(tl)) {
381 th = YAP_HeadOfTerm(tl);
382 if (!YAP_IsIntTerm(th)) {
386 d = YAP_IntOfTerm(th);
388 tl = YAP_TailOfTerm(tl);
390 if (tl != YAP_TermNil()) {
397static YAP_Bool cp_float_matrix(YAP_Term tl, YAP_Term matrix) {
398 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(matrix);
399 intptr_t i, nelems = mat[MAT_SIZE];
400 double *j = matrix_double_data(mat, mat[MAT_NDIMS]);
402 for (i = 0; i < nelems; i++) {
406 if (!YAP_IsPairTerm(tl)) {
409 th = YAP_HeadOfTerm(tl);
410 if (YAP_IsIntTerm(th)) {
411 d = YAP_IntOfTerm(th);
412 }
else if (!YAP_IsFloatTerm(th)) {
416 d = YAP_FloatOfTerm(th);
419 tl = YAP_TailOfTerm(tl);
421 if (tl != YAP_TermNil()) {
428static YAP_Bool set_int_matrix(YAP_Term matrix, YAP_Int set) {
429 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(matrix);
430 int i, nelems = mat[MAT_SIZE];
431 YAP_Int *j = matrix_long_data(mat, mat[MAT_NDIMS]);
433 for (i = 0; i < nelems; i++) {
439static YAP_Bool set_float_matrix(YAP_Term matrix,
double set) {
440 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(matrix);
441 int i, nelems = mat[MAT_SIZE];
442 double *j = matrix_double_data(mat, mat[MAT_NDIMS]);
444 for (i = 0; i < nelems; i++) {
450static YAP_Bool new_ints_matrix(
void) {
451 intptr_t ndims = YAP_IntOfTerm(YAP_ARG1);
452 YAP_Term tl = YAP_ARG2, out;
453 intptr_t dims[MAX_DIMS];
456 if (!scan_dims(ndims, tl, dims))
458 out = new_int_matrix(ndims, dims, NULL);
459 if (out == YAP_TermNil())
462 if (!YAP_IsVarTerm(data) && !cp_int_matrix(data, out))
464 return YAP_Unify(YAP_ARG4, out);
467static YAP_Bool new_ints_matrix_set(
void) {
468 intptr_t ndims = YAP_IntOfTerm(YAP_ARG1);
469 YAP_Term tl = YAP_ARG2, out, tset = YAP_ARG3;
470 intptr_t dims[MAX_DIMS];
473 if (!YAP_IsIntTerm(tset)) {
476 set = YAP_IntOfTerm(tset);
477 if (!scan_dims(ndims, tl, dims))
480 for (i = 0; i < ndims; i++)
482 if (YAP_RequiresExtraStack(sz *
sizeof(YAP_CELL))<0)
484 out = new_int_matrix(ndims, dims, NULL);
485 return set_int_matrix(out, set) && YAP_Unify(YAP_ARG4, out);
488static YAP_Bool new_floats_matrix(
void) {
489 intptr_t ndims = YAP_IntOfTerm(YAP_ARG1);
490 YAP_Term tl = YAP_ARG2, out, data = YAP_ARG3;
491 intptr_t dims[MAX_DIMS];
492 if (!scan_dims(ndims, tl, dims))
494 out = new_float_matrix(ndims, dims, NULL);
495 if (out == YAP_TermNil())
497 if (!YAP_IsVarTerm(data) && !cp_float_matrix(data, out))
499 return YAP_Unify(YAP_ARG4, out);
502 static YAP_Bool new_floats_matrix_set(
void) {
503 intptr_t ndims = YAP_IntOfTerm(YAP_ARG1);
504 YAP_Term tl = YAP_ARG2, out, tset = YAP_ARG3;
505 intptr_t dims[MAX_DIMS];
508 if (!YAP_IsFloatTerm(tset)) {
511 set = YAP_FloatOfTerm(tset);
512 if (!scan_dims(ndims, tl, dims))
514 out = new_float_matrix(ndims, dims, NULL);
515 if (!set_float_matrix(out, set))
517 return YAP_Unify(YAP_ARG4, out);
520static YAP_Term mk_int_list(intptr_t nelems, intptr_t *data) {
521 YAP_Term tn = YAP_TermNil();
525 for (i = nelems - 1; i >= 0; i--) {
526 tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i]), tf);
535static YAP_Term mk_int_list2(intptr_t nelems,
int base, intptr_t *data) {
536 YAP_Term tn = YAP_TermNil();
540 for (i = nelems - 1; i >= 0; i--) {
541 tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i] + base), tf);
550static YAP_Term mk_rep_int_list(intptr_t nelems,
int data) {
551 YAP_Term tn = YAP_TermNil();
555 for (i = nelems - 1; i >= 0; i--) {
556 tf = YAP_MkPairTerm(YAP_MkIntTerm(data), tf);
565static void matrix_float_set(intptr_t *mat, intptr_t *indx,
double nval) {
568 off = matrix_get_offset(mat, indx);
569 (matrix_double_data(mat, mat[MAT_NDIMS]))[off] = nval;
572static void matrix_long_set(intptr_t *mat, intptr_t *indx, YAP_Int nval) {
573 intptr_t off = matrix_get_offset(mat, indx);
574 (matrix_long_data(mat, mat[MAT_NDIMS]))[off] = nval;
578static YAP_Bool matrix_get_one(
void) {
582 if (GET_MATRIX(YAP_ARG1, &mat)>=0 && GET_OFFSET(YAP_ARG2, &mat, &offset)) {
585 tf = YAP_MkFloatTerm(mat.data[offset]);
586 return YAP_Unify(YAP_ARG3, tf);
588 tf = YAP_MkIntTerm(mat.ls[offset]);
589 return YAP_Unify(YAP_ARG3, tf);
592 return YAP_Unify(YAP_ARG3, (mat.bools[offset] ? MTermTrue : MTermFalse));
595 return YAP_Unify(YAP_ARG3, mat.terms[offset]);
604static YAP_Bool matrix_set_one(
void) {
607 if (GET_MATRIX(YAP_ARG1, &mat)<0 || !(GET_OFFSET(YAP_ARG2, &mat, &offset))) {
613 if (YAP_IsIntTerm(YAP_ARG3)) {
614 mat.data[offset] = YAP_IntOfTerm(YAP_ARG3);
615 }
else if (YAP_IsFloatTerm(YAP_ARG3)) {
616 mat.data[offset] = YAP_FloatOfTerm(YAP_ARG3);
620 if (YAP_IsIntTerm(YAP_ARG3))
621 mat.ls[offset] = YAP_IntOfTerm(YAP_ARG3);
622 else if (YAP_IsFloatTerm(YAP_ARG3))
623 mat.ls[offset] = YAP_FloatOfTerm(YAP_ARG3);
626 if (YAP_ARG3 == MTermTrue || YAP_ARG3 == YAP_MkIntTerm(1)) {
627 mat.bools[offset] =
true;
629 }
else if (YAP_ARG3 == MTermFalse || YAP_ARG3 == YAP_MkIntTerm(0)) {
630 mat.bools[offset] =
false;
636 mat.terms[offset] = YAP_ARG3;
643static YAP_Term flist(YAP_Term t,
double *f) {
644 YAP_Term hd = YAP_HeadOfTerm(t);
645 if (YAP_IsIntTerm(hd)) {
646 *f = YAP_IntOfTerm(hd);
647 }
else if (YAP_IsFloatTerm(hd)) {
648 *f = YAP_FloatOfTerm(hd);
652 return YAP_TailOfTerm(t);
655static YAP_Term ilist(YAP_Term t, YAP_Int *f) {
656 YAP_Term hd = YAP_HeadOfTerm(t);
657 if (YAP_IsIntTerm(hd)) {
658 *f = YAP_IntOfTerm(hd);
659 }
else if (YAP_IsFloatTerm(hd)) {
660 *f = YAP_FloatOfTerm(hd);
664 return YAP_TailOfTerm(t);
667static YAP_Term blist(YAP_Term t, YAP_Bool *f) {
668 YAP_Term hd = YAP_HeadOfTerm(t);
669 if (hd == MTermTrue || hd == YAP_MkIntTerm(1)) {
671 }
else if (hd == MTermFalse || hd == YAP_MkIntTerm(0)) {
676 return YAP_TailOfTerm(t);
680static YAP_Bool matrix_set_all(
void) {
682 intptr_t offset, sz ;
683 if (GET_MATRIX(YAP_ARG1, &mat)<0) {
691 if (YAP_IsIntTerm(YAP_ARG2)) {
692 d = YAP_IntOfTerm(YAP_ARG2);
693 }
else if (YAP_IsFloatTerm(YAP_ARG2)) {
694 d = YAP_FloatOfTerm(YAP_ARG2);
696 YAP_Term t = YAP_ARG2;
697 for (offset = 0; offset < sz; offset++)
698 t = flist(t, mat.data + offset);
701 for (offset = 0; offset < sz; offset++)
702 mat.data[offset] = d;
707 if (YAP_ARG2 == MTermTrue || YAP_ARG2 == YAP_MkIntTerm(1)) {
710 }
else if (YAP_ARG2 == MTermFalse || YAP_ARG2 == YAP_MkIntTerm(0)) {
713 YAP_Term t = YAP_ARG2;
714 for (offset = 0; offset < sz; offset++)
715 t = blist(t, mat.bools+offset);
718 for (offset = 0; offset < sz; offset++)
719 mat.bools[offset] = d;
725 if (YAP_IsIntTerm(YAP_ARG2)) {
726 d = YAP_IntOfTerm(YAP_ARG2);
727 }
else if (YAP_IsFloatTerm(YAP_ARG2)) {
728 d = YAP_FloatOfTerm(YAP_ARG2 );
730 YAP_Term t = YAP_ARG2;
731 for (offset = 0; offset < sz; offset++)
732 t = ilist(t, mat.ls+offset);
735 for (offset = 0; offset < sz; offset++)
740 YAP_Term d = YAP_ARG2;
741 for (offset = 0; offset < sz; offset++)
742 mat.terms[offset] = d;
751static YAP_Bool matrix_add_to_all(
void) {
754 if (GET_MATRIX(YAP_ARG1, &mat)<0) {
762 if (YAP_IsIntTerm(YAP_ARG3)) {
763 f = YAP_IntOfTerm(YAP_ARG3);
764 }
else if (YAP_IsFloatTerm(YAP_ARG3)) {
765 f = YAP_FloatOfTerm(YAP_ARG3);
769 for (offset = 0; offset < sz; offset++) {
770 mat.data[offset] += f;
776 if (YAP_IsIntTerm(YAP_ARG3)) {
777 i = YAP_IntOfTerm(YAP_ARG3);
778 }
else if (YAP_IsFloatTerm(YAP_ARG3)) {
779 i = YAP_FloatOfTerm(YAP_ARG3);
783 for (offset = 0; offset < sz; offset++) {
800static YAP_Bool matrix_inc(
void) {
803 if (GET_MATRIX(YAP_ARG1, &mat)<0 || !(GET_OFFSET(YAP_ARG2, &mat, &offset))) {
809 mat.data[offset] += 1.0;
822static YAP_Bool matrix_inc3(
void) {
825 if (GET_MATRIX(YAP_ARG1, &mat)<0 || !(GET_OFFSET(YAP_ARG2, &mat, &offset))) {
831 mat.data[offset] += 1.0;
832 return YAP_Unify(YAP_MkFloatTerm(mat.data[offset]), YAP_ARG3);
835 return YAP_Unify(YAP_MkIntTerm(mat.data[offset]), YAP_ARG3);
843static YAP_Bool matrix_dec(
void) {
846 if (GET_MATRIX(YAP_ARG1, &mat)<0 || !(GET_OFFSET(YAP_ARG2, &mat, &offset))) {
852 mat.data[offset] -= 1.0;
865static YAP_Bool matrix_dec3(
void) {
868 if (GET_MATRIX(YAP_ARG1, &mat)<0 || !(GET_OFFSET(YAP_ARG2, &mat, &offset))) {
874 mat.data[offset] -= 1.0;
875 return YAP_Unify(YAP_MkFloatTerm(mat.data[offset]), YAP_ARG3);
878 return YAP_Unify(YAP_MkIntTerm(mat.ls[offset]), YAP_ARG3);
887static YAP_Bool matrix_min(
void) {
889 if (GET_MATRIX(YAP_ARG1, &mat)<0) {
895 intptr_t i, sz = mat.sz;
896 double max = mat.data[0];
897 for (i = 1; i < sz; i++) {
898 if (mat.data[i] < max) {
902 return YAP_Unify(YAP_MkFloatTerm(max), YAP_ARG2);
905 intptr_t i, sz = mat.sz;
906 YAP_Int max = mat.ls[0];
907 for (i = 1; i < sz; i++) {
908 if (mat.ls[i] < max) {
912 return YAP_Unify(YAP_MkIntTerm(max), YAP_ARG2);
922static YAP_Bool matrix_minarg(
void) {
924 if (GET_MATRIX(YAP_ARG1, &mat)<0) {
928 intptr_t i, off = 0, sz = mat.sz;
931 double max = mat.data[0];
932 for (i = 1; i < sz; i++) {
933 if (mat.data[i] < max) {
940 YAP_Int max = mat.ls[0];
941 for (i = 1; i < sz; i++) {
942 if (mat.ls[i] < max) {
953 YAP_Term t = 0, tf = YAP_ARG3;
954 if (GET_INDEX(&mat, off, &t) &&
961static YAP_Bool matrix_max(
void) {
963 if (GET_MATRIX(YAP_ARG1, &mat)<0) {
969 intptr_t i, sz = mat.sz;
970 double max = mat.data[0];
971 for (i = 1; i < sz; i++) {
972 if (mat.data[i] > max) {
976 return YAP_Unify(YAP_MkFloatTerm(max), YAP_ARG2);
979 intptr_t i, sz = mat.sz;
980 YAP_Int max = mat.ls[0];
981 for (i = 1; i < sz; i++) {
982 if (mat.ls[i] > max) {
986 return YAP_Unify(YAP_MkIntTerm(max), YAP_ARG2);
996static YAP_Bool matrix_maxarg(
void) {
998 if (GET_MATRIX(YAP_ARG1, &mat)<0) {
1002 intptr_t i, off = 0, sz = mat.sz;
1005 double max = mat.data[0];
1006 for (i = 1; i < sz; i++) {
1007 if (mat.data[i] > max) {
1012 return YAP_Unify(YAP_MkIntTerm(off), YAP_ARG2);
1015 YAP_Int max = mat.ls[0];
1016 for (i = 1; i < sz; i++) {
1017 if (mat.ls[i] > max) {
1022 return YAP_Unify(YAP_MkIntTerm(off), YAP_ARG2);
1032static YAP_Bool matrix_dims(
void) {
1037 int rc = GET_MATRIX(YAP_ARG1, mat);
1042 tf = mk_int_list(mat->ndims, mat->dims);
1043 return YAP_Unify(YAP_ARG2, tf);
1055static YAP_Bool matrix_to_list(
void) {
1058 int rc = GET_MATRIX(YAP_ARG1, &mat);
1063 YAP_Term t = YAP_TermNil();
1068 if (YAP_RequiresExtraStack(mat.sz*5+4096) < 0)
1073 t = YAP_MkPairTerm(YAP_MkIntTerm(mat.ls[i]),t);
1079 if (YAP_RequiresExtraStack(mat.sz*5+4096) < 0)
1084 t = YAP_MkPairTerm(YAP_MkFloatTerm(mat.ls[i]),t);
1090 if (YAP_RequiresExtraStack(mat.sz*2+4096) < 0)
1095 t = YAP_MkPairTerm((mat.bools[i] ? MTermTrue : MTermFalse),t);
1101 if (YAP_RequiresExtraStack(mat.sz*2+4096) < 0)
1106 t = YAP_MkPairTerm(mat.terms[i],t);
1113 return YAP_Unify(YAP_ARG2, t);
1116static YAP_Bool matrix_set_base(
void) {
1119 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1124 mat[MAT_BASE] = YAP_IntOfTerm(YAP_ARG2);
1128static YAP_Bool matrix_dims3(
void) {
1132 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1137 tf = mk_int_list(mat[MAT_NDIMS], mat + MAT_DIMS);
1138 tof = mk_rep_int_list(mat[MAT_NDIMS], mat[MAT_BASE]);
1139 return YAP_Unify(YAP_ARG2, tf) && YAP_Unify(YAP_ARG3, tof);
1150static YAP_Bool matrix_size(
void) {
1153 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1158 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(mat[MAT_SIZE]));
1161static YAP_Bool matrix_ndims(
void) {
1164 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1169 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(mat[MAT_NDIMS]));
1172static YAP_Bool matrix_type(
void) {
1176 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1181 if (mat[MAT_TYPE] == INT_MATRIX) {
1182 tf = YAP_MkIntTerm(0);
1184 tf = YAP_MkIntTerm(1);
1186 return YAP_Unify(YAP_ARG2, tf);
1189static YAP_Bool matrix_arg_to_offset(
void) {
1192 if (GET_MATRIX(YAP_ARG1, &mat)<0)
1194 if (!GET_OFFSET(YAP_ARG2, &mat, &off))
1196 return YAP_Unify(YAP_ARG3, YAP_MkIntTerm(off));
1199static YAP_Bool matrix_offset_to_arg(
void) {
1200 intptr_t indx[MAX_DIMS];
1203 if (GET_MATRIX(YAP_ARG1, &mat)<0)
1205 if (!GET_INDEX(&mat, YAP_ARG2, &off))
1207 return YAP_Unify(YAP_ARG3, YAP_MkIntTerm(off));
1208 YAP_Term tf = mk_int_list2(mat.ndims, mat.base, indx);
1209 return YAP_Unify(YAP_ARG3, tf);
1213static YAP_Bool matrix_log_all(
void) {
1216 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1221 if (mat[MAT_TYPE] == INT_MATRIX) {
1224 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1227 for (i = 0; i < mat[MAT_SIZE]; i++) {
1228 data[i] = log(data[i]);
1234static YAP_Bool matrix_log_all2(
void) {
1237 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1242 if (mat[MAT_TYPE] == INT_MATRIX) {
1244 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1249 if (!YAP_IsVarTerm(YAP_ARG2)) {
1252 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1253 if (out == YAP_TermNil())
1256 nmat = (intptr_t *)YAP_BlobOfTerm(out);
1257 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1258 for (i = 0; i < mat[MAT_SIZE]; i++) {
1259 ndata[i] = log((
double)data[i]);
1261 if (YAP_IsVarTerm(YAP_ARG2)) {
1262 return YAP_Unify(YAP_ARG2, out);
1266 double *data = matrix_double_data(mat, mat[MAT_NDIMS]), *ndata;
1270 if (!YAP_IsVarTerm(YAP_ARG2)) {
1273 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1274 if (out == YAP_TermNil())
1277 nmat = (intptr_t *)YAP_BlobOfTerm(out);
1278 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1279 for (i = 0; i < mat[MAT_SIZE]; i++) {
1280 ndata[i] = log(data[i]);
1282 if (YAP_IsVarTerm(YAP_ARG2)) {
1283 return YAP_Unify(YAP_ARG2, out);
1289static YAP_Bool matrix_exp_all(
void) {
1292 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1297 if (mat[MAT_TYPE] == INT_MATRIX) {
1300 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1303 for (i = 0; i < mat[MAT_SIZE]; i++) {
1304 data[i] = exp(data[i]);
1310static YAP_Bool matrix_exp2_all(
void) {
1313 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1318 if (mat[MAT_TYPE] == INT_MATRIX) {
1321 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1323 double max = data[0];
1325 for (i = 1; i < mat[MAT_SIZE]; i++) {
1330 for (i = 0; i < mat[MAT_SIZE]; i++) {
1331 data[i] = exp(data[i] - max);
1337static YAP_Bool matrix_exp_all2(
void) {
1340 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1345 if (mat[MAT_TYPE] == INT_MATRIX) {
1347 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1352 if (!YAP_IsVarTerm(YAP_ARG2)) {
1355 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1356 if (out == YAP_TermNil())
1359 nmat = (intptr_t *)YAP_BlobOfTerm(out);
1360 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1361 for (i = 0; i < mat[MAT_SIZE]; i++) {
1362 ndata[i] = exp((
double)data[i]);
1364 if (YAP_IsVarTerm(YAP_ARG2)) {
1365 return YAP_Unify(YAP_ARG2, out);
1369 double *data = matrix_double_data(mat, mat[MAT_NDIMS]), *ndata;
1373 if (!YAP_IsVarTerm(YAP_ARG2)) {
1376 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1377 if (out == YAP_TermNil())
1380 nmat = (intptr_t *)YAP_BlobOfTerm(out);
1381 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1382 for (i = 0; i < mat[MAT_SIZE]; i++) {
1383 ndata[i] = exp(data[i]);
1385 if (YAP_IsVarTerm(YAP_ARG2)) {
1386 return YAP_Unify(YAP_ARG2, out);
1400static YAP_Bool matrix_sum(
void) {
1404 if (GET_MATRIX(YAP_ARG1, &mat)>=0) {
1405 if (mat.type ==
'i') {
1408 for (i = 0; i < mat.sz; i++) {
1411 tf = YAP_MkIntTerm(sum);
1413 double *data = mat.data;
1418 for (i = 0; i < mat.sz; i++) {
1419 double y = data[i] - c;
1428 tf = YAP_MkFloatTerm(sum);
1431 return YAP_Unify(YAP_ARG2, tf);
1434static void add_int_lines(
int total, intptr_t nlines, YAP_Int *mat0,
1436 intptr_t ncols = total / nlines, i;
1437 for (i = 0; i < ncols; i++) {
1441 for (j = i; j < total; j += ncols) {
1448static void add_double_lines(
int total, intptr_t nlines,
double *mat0,
1450 intptr_t ncols = total / nlines, i;
1451 for (i = 0; i < ncols; i++) {
1455 for (j = i; j < total; j += ncols) {
1462static YAP_Bool matrix_agg_lines(
void) {
1465 YAP_Term top = YAP_ARG2;
1468 if (!YAP_IsIntTerm(top)) {
1471 op = YAP_IntOfTerm(top);
1472 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1478 if (mat[MAT_TYPE] == INT_MATRIX) {
1479 YAP_Int *data, *ndata;
1480 intptr_t dims = mat[MAT_NDIMS];
1483 tf = new_int_matrix(dims - 1, mat + (MAT_DIMS + 1), NULL);
1484 if (tf == YAP_TermNil())
1486 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1487 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
1488 data = matrix_long_data(mat, dims);
1489 ndata = matrix_long_data(nmat, dims - 1);
1490 if (op == MAT_PLUS) {
1491 add_int_lines(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1495 double *data, *ndata;
1496 intptr_t dims = mat[MAT_NDIMS];
1499 tf = new_float_matrix(dims - 1, mat + (MAT_DIMS + 1), NULL);
1500 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
1501 if (tf == YAP_TermNil())
1503 data = matrix_double_data(mat, dims);
1504 ndata = matrix_double_data(nmat, dims - 1);
1505 if (op == MAT_PLUS) {
1506 add_double_lines(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1510 return YAP_Unify(YAP_ARG3, tf);
1513static void add_int_cols(
int total, intptr_t nlines, YAP_Int *mat0,
1515 intptr_t ncols = total / nlines, i, j = 0;
1516 for (i = 0; i < nlines; i++) {
1518 int max = (i + 1) * ncols;
1520 for (; j < max; j++) {
1527static void add_double_cols(
int total, intptr_t nlines,
double *mat0,
1529 intptr_t ncols = total / nlines, i, j = 0;
1530 for (i = 0; i < nlines; i++) {
1532 int max = (i + 1) * ncols;
1534 for (; j < max; j++) {
1541static YAP_Bool matrix_agg_cols(
void) {
1544 YAP_Term top = YAP_ARG2;
1547 if (!YAP_IsIntTerm(top)) {
1550 op = YAP_IntOfTerm(top);
1551 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1557 if (mat[MAT_TYPE] == INT_MATRIX) {
1558 YAP_Int *data, *ndata;
1559 intptr_t dims = mat[MAT_NDIMS];
1562 tf = new_int_matrix(1, mat + MAT_DIMS, NULL);
1563 if (tf == YAP_TermNil())
1565 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1566 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
1567 data = matrix_long_data(mat, dims);
1568 ndata = matrix_long_data(nmat, 1);
1569 if (op == MAT_PLUS) {
1570 add_int_cols(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1574 double *data, *ndata;
1575 intptr_t dims = mat[MAT_NDIMS];
1578 tf = new_float_matrix(1, mat + MAT_DIMS, NULL);
1579 if (tf == YAP_TermNil())
1581 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
1582 data = matrix_double_data(mat, dims);
1583 ndata = matrix_double_data(nmat, 1);
1584 if (op == MAT_PLUS) {
1585 add_double_cols(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1589 return YAP_Unify(YAP_ARG3, tf);
1592static void div_int_by_lines(
int total, intptr_t nlines, YAP_Int *mat1,
1593 YAP_Int *mat2,
double *ndata) {
1594 intptr_t ncols = total / nlines, i;
1595 for (i = 0; i < total; i++) {
1596 ndata[i] = ((double)mat1[i]) / mat2[i % ncols];
1600static void div_int_by_dlines(
int total, intptr_t nlines, YAP_Int *mat1,
1601 double *mat2,
double *ndata) {
1602 intptr_t ncols = total / nlines, i;
1603 for (i = 0; i < total; i++) {
1604 ndata[i] = mat1[i] / mat2[i % ncols];
1608static void div_float_long_by_lines(
int total, intptr_t nlines,
double *mat1,
1609 YAP_Int *mat2,
double *ndata) {
1610 intptr_t ncols = total / nlines, i;
1611 for (i = 0; i < total; i++) {
1612 ndata[i] = mat1[i] / mat2[i % ncols];
1616static void div_float_by_lines(
int total, intptr_t nlines,
double *mat1,
1617 double *mat2,
double *ndata) {
1618 intptr_t ncols = total / nlines, i;
1619 for (i = 0; i < total; i++) {
1620 ndata[i] = mat1[i] / mat2[i % ncols];
1624static YAP_Bool matrix_op_to_lines(
void) {
1625 intptr_t *mat1, *mat2;
1626 YAP_Term top = YAP_ARG3;
1630 if (!YAP_IsIntTerm(top)) {
1633 op = YAP_IntOfTerm(top);
1634 mat1 = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
1639 mat2 = (intptr_t *)YAP_BlobOfTerm(YAP_ARG2);
1645 if (mat1[MAT_TYPE] == INT_MATRIX) {
1647 intptr_t dims = mat1[MAT_NDIMS];
1649 data1 = matrix_long_data(mat1, dims);
1651 if (mat2[MAT_TYPE] == INT_MATRIX) {
1652 YAP_Int *data2 = matrix_long_data(mat2, dims - 1);
1653 if (op == MAT_DIV) {
1656 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1657 if (tf == YAP_TermNil())
1659 nmat = YAP_BlobOfTerm(tf);
1660 ndata = matrix_double_data(nmat, dims);
1661 div_int_by_lines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
1665 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
1666 double *data2 = matrix_double_data(mat2, dims - 1);
1667 if (op == MAT_DIV) {
1670 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1671 if (tf == YAP_TermNil())
1673 nmat = YAP_BlobOfTerm(tf);
1674 ndata = matrix_double_data(nmat, dims);
1675 div_int_by_dlines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
1683 double *data1, *ndata;
1684 intptr_t dims = mat1[MAT_NDIMS];
1687 data1 = matrix_double_data(mat1, dims);
1688 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1689 nmat = YAP_BlobOfTerm(tf);
1690 if (tf == YAP_TermNil())
1692 ndata = matrix_double_data(nmat, dims);
1693 if (mat2[MAT_TYPE] == INT_MATRIX) {
1694 YAP_Int *data2 = matrix_long_data(mat2, dims - 1);
1695 if (op == MAT_DIV) {
1696 div_float_long_by_lines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2,
1701 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
1702 double *data2 = matrix_double_data(mat2, dims - 1);
1703 if (op == MAT_DIV) {
1704 div_float_by_lines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
1712 return YAP_Unify(YAP_ARG4, tf);
1715static void matrix_long_add_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1719 for (i = 0; i < siz; i++) {
1720 nmat[i] = mat1[i] + mat2[i];
1724static void matrix_long_double_add_data(
double *nmat,
int siz, YAP_Int mat1[],
1728 for (i = 0; i < siz; i++) {
1729 nmat[i] = mat1[i] + mat2[i];
1733static void matrix_double_add_data(
double *nmat,
int siz,
double mat1[],
1737 for (i = 0; i < siz; i++) {
1738 nmat[i] = mat1[i] + mat2[i];
1742static void matrix_long_sub_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1746 for (i = 0; i < siz; i++) {
1747 nmat[i] = mat1[i] - mat2[i];
1751static void matrix_long_double_sub_data(
double *nmat,
int siz, YAP_Int mat1[],
1755 for (i = 0; i < siz; i++) {
1756 nmat[i] = mat1[i] - mat2[i];
1760static void matrix_long_double_rsub_data(
double *nmat,
int siz,
double mat1[],
1764 for (i = 0; i < siz; i++) {
1765 nmat[i] = mat2[i] - mat1[i];
1769static void matrix_double_sub_data(
double *nmat,
int siz,
double mat1[],
1773 for (i = 0; i < siz; i++) {
1774 nmat[i] = mat1[i] - mat2[i];
1778static void matrix_long_mult_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1782 for (i = 0; i < siz; i++) {
1783 nmat[i] = mat1[i] * mat2[i];
1787static void matrix_long_double_mult_data(
double *nmat,
int siz, YAP_Int mat1[],
1791 for (i = 0; i < siz; i++) {
1792 nmat[i] = mat1[i] * mat2[i];
1796static void matrix_double_mult_data(
double *nmat,
int siz,
double mat1[],
1800 for (i = 0; i < siz; i++) {
1801 nmat[i] = mat1[i] * mat2[i];
1805static void matrix_long_div_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1809 for (i = 0; i < siz; i++) {
1810 nmat[i] = mat1[i] / mat2[i];
1814static void matrix_long_double_div_data(
double *nmat,
int siz, YAP_Int mat1[],
1818 for (i = 0; i < siz; i++) {
1819 nmat[i] = mat1[i] / mat2[i];
1823static void matrix_long_double_div2_data(
double *nmat,
int siz,
double mat1[],
1827 for (i = 0; i < siz; i++) {
1828 nmat[i] = mat1[i] / mat2[i];
1832static void matrix_double_div_data(
double *nmat,
int siz,
double mat1[],
1836 for (i = 0; i < siz; i++) {
1837 nmat[i] = mat1[i] / mat2[i];
1841static void matrix_long_zdiv_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1845 for (i = 0; i < siz; i++) {
1849 nmat[i] = mat1[i] / mat2[i];
1853static void matrix_long_double_zdiv_data(
double *nmat,
int siz, YAP_Int mat1[],
1857 for (i = 0; i < siz; i++) {
1861 nmat[i] = mat1[i] / mat2[i];
1865static void matrix_long_double_zdiv2_data(
double *nmat,
int siz,
double mat1[],
1869 for (i = 0; i < siz; i++) {
1873 nmat[i] = mat1[i] / mat2[i];
1877static void matrix_double_zdiv_data(
double *nmat,
int siz,
double mat1[],
1881 for (i = 0; i < siz; i++) {
1882 if (mat1[i] == 0.0) {
1885 nmat[i] = mat1[i] / mat2[i];
1890static YAP_Bool matrix_op(
void) {
1892 YAP_Term top = YAP_ARG3;
1894 YAP_Term tf = YAP_ARG4;
1896 if (!YAP_IsIntTerm(top)) {
1899 op = YAP_IntOfTerm(top);
1900 if (GET_MATRIX(YAP_ARG1, &mat1)<0 ||
1901 GET_MATRIX(YAP_ARG2, &mat2)<0) {
1904 if (tf == YAP_ARG1 || tf == YAP_ARG2) {
1908 if (create && (mem = YAP_RequiresExtraStack(mat1.sz*2+4096)) > 0) {
1909 GET_MATRIX(YAP_ARG1, &mat1);
1910 GET_MATRIX(YAP_ARG2, &mat2);
1915 if (mat1.type ==
'i' && mat2.type ==
'i') {
1916 tf = new_int_matrix(mat1.ndims, mat1.dims, NULL);
1918 tf = new_float_matrix(mat1.ndims, mat1.dims, NULL);
1920 if (tf == YAP_TermNil()) {
1926 GET_MATRIX(tf, &nmat);
1927 if (mat1.type ==
'i') {
1929 if (mat2.type ==
'i') {
1932 matrix_long_add_data(nmat.ls, mat1.sz, mat1.ls, mat2.ls);
1935 matrix_long_sub_data(nmat.ls, mat1.sz, mat1.ls, mat2.ls);
1938 matrix_long_mult_data(nmat.ls, mat1.sz, mat1.ls, mat2.ls);
1941 matrix_long_div_data(nmat.ls, mat1.sz, mat1.ls, mat2.ls);
1944 matrix_long_zdiv_data(nmat.ls, mat1.sz, mat1.ls, mat2.ls);
1949 }
else if (mat2.type ==
'f') {
1952 matrix_long_double_add_data(nmat.data, nmat.sz, mat1.ls, mat2.data);
1955 matrix_long_double_sub_data(nmat.data, nmat.sz, mat1.ls, mat2.data);
1958 matrix_long_double_mult_data(nmat.data, nmat.sz, mat1.ls, mat2.data);
1961 matrix_long_double_div_data(nmat.data, nmat.sz, mat1.ls, mat2.data);
1964 matrix_long_zdiv_data(nmat.ls, mat1.sz, mat1.ls, mat2.ls);
1973 if (mat2.type ==
'i') {
1976 matrix_long_double_add_data(nmat.data, nmat.sz, mat2.ls, mat1.data);
1979 matrix_long_double_rsub_data(nmat.data, nmat.sz, mat1.data, mat2.ls);
1982 matrix_long_double_mult_data(nmat.data, nmat.sz, mat2.ls, mat1.data );
1985 matrix_long_double_div2_data(nmat.data, nmat.sz, mat1.data, mat2.ls);
1988 matrix_long_double_zdiv_data(nmat.data, nmat.sz, mat2.ls, mat1.data);
1993 }
else if (mat2.type ==
'f') {
1996 matrix_double_add_data(nmat.data, nmat.sz, mat1.data, mat2.data);
1999 matrix_double_sub_data(nmat.data, nmat.sz, mat1.data, mat2.data);
2002 matrix_double_mult_data(nmat.data, nmat.sz, mat1.data, mat2.data);
2005 matrix_double_div_data(nmat.data, nmat.sz, mat1.data, mat2.data);
2008 matrix_double_zdiv_data(nmat.data, nmat.sz, mat1.data, mat2.data);
2018 return YAP_Unify(YAP_ARG4, tf);
2021static void add_int_by_cols(
int total, intptr_t nlines, YAP_Int *mat1,
2022 YAP_Int *mat2, YAP_Int *ndata) {
2023 intptr_t i, ncols = total / nlines;
2024 for (i = 0; i < total; i++) {
2025 ndata[i] = mat1[i] + mat2[i / ncols];
2029static void add_int_by_dcols(
int total, intptr_t nlines, YAP_Int *mat1,
2030 double *mat2,
double *ndata) {
2031 intptr_t i, ncols = total / nlines;
2032 for (i = 0; i < total; i++) {
2033 ndata[i] = mat1[i] + mat2[i / ncols];
2037static void add_double_by_cols(
int total, intptr_t nlines,
double *mat1,
2038 double *mat2,
double *ndata) {
2040 intptr_t ncols = total / nlines;
2042 for (i = 0; i < total; i++) {
2043 ndata[i] = mat1[i] + mat2[i / ncols];
2047static YAP_Bool matrix_op_to_cols(
void) {
2048 intptr_t *mat1, *mat2;
2049 YAP_Term top = YAP_ARG3;
2053 if (!YAP_IsIntTerm(top)) {
2056 op = YAP_IntOfTerm(top);
2057 mat1 = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2062 mat2 = (intptr_t *)YAP_BlobOfTerm(YAP_ARG2);
2067 if (mat1[MAT_TYPE] == INT_MATRIX) {
2069 intptr_t dims = mat1[MAT_NDIMS];
2071 data1 = matrix_long_data(mat1, dims);
2073 if (mat2[MAT_TYPE] == INT_MATRIX) {
2074 YAP_Int *data2 = matrix_long_data(mat2, 1);
2075 if (op == MAT_PLUS) {
2078 tf = new_int_matrix(dims, mat1 + MAT_DIMS, NULL);
2079 if (tf == YAP_TermNil())
2081 nmat = YAP_BlobOfTerm(tf);
2082 ndata = matrix_long_data(nmat, dims);
2083 add_int_by_cols(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
2087 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
2088 double *data2 = matrix_double_data(mat2, 1);
2089 if (op == MAT_PLUS) {
2092 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
2093 if (tf == YAP_TermNil())
2095 nmat = YAP_BlobOfTerm(tf);
2096 ndata = matrix_double_data(nmat, dims);
2097 add_int_by_dcols(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
2105 double *data1, *data2, *ndata;
2106 intptr_t dims = mat1[MAT_NDIMS];
2109 if (mat2[MAT_TYPE] != FLOAT_MATRIX)
2111 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
2112 if (tf == YAP_TermNil())
2114 nmat = YAP_BlobOfTerm(tf);
2115 data1 = matrix_double_data(mat1, dims);
2116 data2 = matrix_double_data(mat2, 1);
2117 ndata = matrix_double_data(nmat, dims);
2118 if (op == MAT_PLUS) {
2119 add_double_by_cols(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
2123 return YAP_Unify(YAP_ARG4, tf);
2126static YAP_Bool matrix_op_to_all(
void) {
2129 YAP_Term top = YAP_ARG2;
2133 if (!YAP_IsIntTerm(top)) {
2136 op = YAP_IntOfTerm(top);
2137 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2142 if (YAP_IsVarTerm(YAP_ARG4)) {
2146 if (mat[MAT_TYPE] == INT_MATRIX) {
2148 intptr_t dims = mat[MAT_NDIMS];
2150 YAP_Term tnum = YAP_ARG3;
2152 if (YAP_IsIntTerm(tnum)) {
2156 num = YAP_IntOfTerm(tnum);
2157 data = matrix_long_data(mat, dims);
2159 tf = new_int_matrix(dims, mat + (MAT_DIMS), NULL);
2160 if (tf == YAP_TermNil())
2162 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2163 ndata = matrix_long_data(nmat, dims);
2168 if (op == MAT_PLUS) {
2171 for (i = 0; i < mat[MAT_SIZE]; i++) {
2172 ndata[i] = data[i] + num;
2174 }
else if (op == MAT_TIMES) {
2177 for (i = 0; i < mat[MAT_SIZE]; i++) {
2178 ndata[i] = data[i] * num;
2183 }
else if (YAP_IsFloatTerm(tnum)) {
2187 num = YAP_FloatOfTerm(tnum);
2189 tf = new_float_matrix(dims, mat + (MAT_DIMS), NULL);
2190 if (tf == YAP_TermNil())
2192 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2193 ndata = matrix_double_data(nmat, dims);
2197 data = matrix_long_data(mat, dims);
2198 if (op == MAT_PLUS) {
2201 for (i = 0; i < mat[MAT_SIZE]; i++) {
2202 ndata[i] = data[i] + num;
2204 }
else if (op == MAT_SUB) {
2207 for (i = 0; i < mat[MAT_SIZE]; i++) {
2208 ndata[i] = num - data[i];
2210 }
else if (op == MAT_TIMES) {
2213 for (i = 0; i < mat[MAT_SIZE]; i++) {
2214 ndata[i] = data[i] * num;
2216 }
else if (op == MAT_DIV) {
2219 for (i = 0; i < mat[MAT_SIZE]; i++) {
2220 ndata[i] = data[i] / num;
2227 double *data, *ndata;
2228 intptr_t dims = mat[MAT_NDIMS];
2230 YAP_Term tnum = YAP_ARG3;
2233 if (YAP_IsFloatTerm(tnum)) {
2234 num = YAP_FloatOfTerm(tnum);
2235 }
else if (!YAP_IntOfTerm(tnum)) {
2240 num = (double)YAP_IntOfTerm(tnum);
2242 data = matrix_double_data(mat, dims);
2244 tf = new_float_matrix(dims, mat + (MAT_DIMS), NULL);
2245 if (tf == YAP_TermNil())
2247 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2248 ndata = matrix_double_data(nmat, dims);
2257 for (i = 0; i < mat[MAT_SIZE]; i++) {
2258 ndata[i] = data[i] + num;
2264 for (i = 0; i < mat[MAT_SIZE]; i++) {
2265 ndata[i] = num - data[i];
2271 for (i = 0; i < mat[MAT_SIZE]; i++) {
2272 ndata[i] = data[i] * num;
2278 for (i = 0; i < mat[MAT_SIZE]; i++) {
2279 ndata[i] = data[i] / num;
2287 return YAP_Unify(YAP_ARG4, tf);
2288 return YAP_Unify(YAP_ARG4, YAP_ARG1);
2294static YAP_Bool matrix_transpose(
void) {
2295 intptr_t ndims, i, *dims, *dimsn;
2296 intptr_t conv[MAX_DIMS], indx[MAX_DIMS], nindx[MAX_DIMS];
2298 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2303 ndims = mat[MAT_NDIMS];
2304 if (mat[MAT_TYPE] == INT_MATRIX) {
2306 tf = new_int_matrix(ndims, mat + MAT_DIMS, NULL);
2307 if (tf == YAP_TermNil())
2311 tf = new_float_matrix(ndims, mat + MAT_DIMS, NULL);
2312 if (tf == YAP_TermNil())
2316 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2317 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2318 dims = mat + MAT_DIMS;
2319 dimsn = nmat + MAT_DIMS;
2322 for (i = 0; i < ndims; i++) {
2326 if (!YAP_IsPairTerm(tconv))
2328 th = YAP_HeadOfTerm(tconv);
2329 if (!YAP_IsIntTerm(th))
2331 conv[i] = j = YAP_IntOfTerm(th);
2333 tconv = YAP_TailOfTerm(tconv);
2339 if (mat[MAT_TYPE] == INT_MATRIX) {
2340 YAP_Int *data = matrix_long_data(mat, ndims);
2342 for (i = 0; i < mat[MAT_SIZE]; i++) {
2343 YAP_Int x = data[i];
2349 matrix_get_index(mat, i, indx);
2350 for (j = 0; j < ndims; j++) {
2351 nindx[j] = indx[conv[j]];
2353 matrix_long_set(nmat, nindx, x);
2356 double *data = matrix_double_data(mat, ndims);
2358 for (i = 0; i < mat[MAT_SIZE]; i++) {
2362 matrix_get_index(mat, i, indx);
2363 for (j = 0; j < ndims; j++)
2364 nindx[j] = indx[conv[j]];
2365 matrix_float_set(nmat, nindx, x);
2368 return YAP_Unify(YAP_ARG3, tf);
2374static YAP_Bool matrix_select(
void) {
2375 intptr_t ndims, i, j, newdims, prdim, leftarg, *dims, indx[MAX_DIMS];
2376 intptr_t nindx[MAX_DIMS];
2377 YAP_Term tpdim, tdimarg, tf;
2378 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2385 ndims = mat[MAT_NDIMS];
2386 dims = mat + MAT_DIMS;
2387 if (!YAP_IsIntTerm(tpdim)) {
2390 prdim = YAP_IntOfTerm(tpdim);
2392 if (!YAP_IsIntTerm(tdimarg)) {
2395 leftarg = YAP_IntOfTerm(tdimarg);
2396 for (i = 0, j = 0; i < ndims; i++) {
2402 newdims = ndims - 1;
2403 if (mat[MAT_TYPE] == INT_MATRIX) {
2404 YAP_Int *data, *ndata;
2407 tf = new_int_matrix(newdims, nindx, NULL);
2408 if (tf == YAP_TermNil())
2411 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2412 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2413 data = matrix_long_data(mat, ndims);
2414 ndata = matrix_long_data(nmat, newdims);
2416 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2422 matrix_get_index(nmat, i, indx);
2423 for (j = 0, k = 0; j < newdims; j++, k++) {
2433 ndata[i] = data[matrix_get_offset(mat, nindx)];
2436 double *data, *ndata;
2439 tf = new_float_matrix(newdims, nindx, NULL);
2440 if (tf == YAP_TermNil())
2443 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2444 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2445 data = matrix_double_data(mat, ndims);
2446 ndata = matrix_double_data(nmat, newdims);
2448 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2454 matrix_get_index(nmat, i, indx);
2455 for (j = 0, k = 0; j < newdims; j++, k++) {
2465 ndata[i] = data[matrix_get_offset(mat, nindx)];
2468 return YAP_Unify(YAP_ARG4, tf);
2473static YAP_Bool matrix_column(
void) {
2474 intptr_t size, i, ndims, newdims[1];
2475 intptr_t indx[MAX_DIMS];
2476 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2483 ndims = mat[MAT_NDIMS];
2486 for (i = 1; i < ndims; i++) {
2489 if (!YAP_IsPairTerm(tconv))
2491 th = YAP_HeadOfTerm(tconv);
2492 if (!YAP_IsIntTerm(th))
2494 indx[i] = YAP_IntOfTerm(th);
2495 tconv = YAP_TailOfTerm(tconv);
2497 if (tconv != YAP_TermNil())
2499 newdims[0] = size = mat[MAT_DIMS];
2500 if (mat[MAT_TYPE] == INT_MATRIX) {
2501 YAP_Int *data, *ndata;
2504 tf = new_int_matrix(1, newdims, NULL);
2505 if (tf == YAP_TermNil())
2508 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2509 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2510 data = matrix_long_data(mat, ndims);
2511 ndata = matrix_long_data(nmat, 1);
2513 for (i = 0; i < size; i++) {
2515 ndata[i] = data[matrix_get_offset(mat, indx)];
2518 double *data, *ndata;
2521 tf = new_float_matrix(1, newdims, NULL);
2522 if (tf == YAP_TermNil())
2525 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2526 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2527 data = matrix_double_data(mat, ndims);
2528 ndata = matrix_double_data(nmat, 1);
2530 for (i = 0; i < size; i++) {
2532 ndata[i] = data[matrix_get_offset(mat, indx)];
2535 return YAP_Unify(YAP_ARG3, tf);
2540static YAP_Bool matrix_sum_out(
void) {
2541 intptr_t ndims, i, j, newdims, prdim;
2542 intptr_t indx[MAX_DIMS], nindx[MAX_DIMS];
2544 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2551 ndims = mat[MAT_NDIMS];
2552 if (!YAP_IsIntTerm(tpdim)) {
2555 prdim = YAP_IntOfTerm(tpdim);
2556 newdims = ndims - 1;
2557 for (i = 0, j = 0; i < ndims; i++) {
2559 nindx[j] = (mat + MAT_DIMS)[i];
2563 if (mat[MAT_TYPE] == INT_MATRIX) {
2564 YAP_Int *data, *ndata;
2567 tf = new_int_matrix(newdims, nindx, NULL);
2568 if (tf == YAP_TermNil())
2571 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2572 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2573 data = matrix_long_data(mat, ndims);
2574 ndata = matrix_long_data(nmat, newdims);
2576 for (i = 0; i < nmat[MAT_SIZE]; i++)
2578 for (i = 0; i < mat[MAT_SIZE]; i++) {
2584 matrix_get_index(mat, i, indx);
2585 for (j = 0, k = 0; j < ndims; j++) {
2587 nindx[k++] = indx[j];
2590 ndata[matrix_get_offset(nmat, nindx)] += data[i];
2593 double *data, *ndata;
2596 tf = new_float_matrix(newdims, nindx, NULL);
2597 if (tf == YAP_TermNil())
2600 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2601 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2602 data = matrix_double_data(mat, ndims);
2603 ndata = matrix_double_data(nmat, newdims);
2605 for (i = 0; i < nmat[MAT_SIZE]; i++)
2607 for (i = 0; i < mat[MAT_SIZE]; i++) {
2613 matrix_get_index(mat, i, indx);
2614 for (j = 0, k = 0; j < ndims; j++) {
2616 nindx[k++] = indx[j];
2619 ndata[matrix_get_offset(nmat, nindx)] += data[i];
2622 return YAP_Unify(YAP_ARG3, tf);
2627static YAP_Bool matrix_sum_out_several(
void) {
2628 intptr_t ndims, i, *dims, newdims;
2629 intptr_t indx[MAX_DIMS], nindx[MAX_DIMS], conv[MAX_DIMS];
2631 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2636 ndims = mat[MAT_NDIMS];
2637 dims = mat + MAT_DIMS;
2640 for (i = 0, newdims = 0; i < ndims; i++) {
2643 if (!YAP_IsPairTerm(tconv))
2645 th = YAP_HeadOfTerm(tconv);
2646 if (!YAP_IsIntTerm(th))
2648 conv[i] = YAP_IntOfTerm(th);
2650 nindx[newdims++] = dims[i];
2652 tconv = YAP_TailOfTerm(tconv);
2654 if (mat[MAT_TYPE] == INT_MATRIX) {
2655 YAP_Int *data, *ndata;
2658 tf = new_int_matrix(newdims, nindx, NULL);
2659 if (tf == YAP_TermNil())
2662 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2663 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2664 data = matrix_long_data(mat, ndims);
2665 ndata = matrix_long_data(nmat, newdims);
2667 for (i = 0; i < nmat[MAT_SIZE]; i++)
2669 for (i = 0; i < mat[MAT_SIZE]; i++) {
2675 matrix_get_index(mat, i, indx);
2676 for (j = 0, k = 0; j < ndims; j++) {
2678 nindx[k++] = indx[j];
2681 ndata[matrix_get_offset(nmat, nindx)] =
2682 log(exp(ndata[matrix_get_offset(nmat, nindx)]) + exp(data[i]));
2685 double *data, *ndata;
2688 tf = new_float_matrix(newdims, nindx, NULL);
2689 if (tf == YAP_TermNil())
2692 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2693 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2694 data = matrix_double_data(mat, ndims);
2695 ndata = matrix_double_data(nmat, newdims);
2697 for (i = 0; i < nmat[MAT_SIZE]; i++)
2699 for (i = 0; i < mat[MAT_SIZE]; i++) {
2705 matrix_get_index(mat, i, indx);
2706 for (j = 0, k = 0; j < ndims; j++) {
2708 nindx[k++] = indx[j];
2711 ndata[matrix_get_offset(nmat, nindx)] =
2712 log(exp(ndata[matrix_get_offset(nmat, nindx)]) + exp(data[i]));
2715 return YAP_Unify(YAP_ARG3, tf);
2720static YAP_Bool matrix_sum_out_logs(
void) {
2721 intptr_t ndims, i, j, *dims, newdims, prdim;
2722 intptr_t nindx[MAX_DIMS];
2724 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2731 ndims = mat[MAT_NDIMS];
2732 dims = mat + MAT_DIMS;
2733 if (!YAP_IsIntTerm(tpdim)) {
2736 prdim = YAP_IntOfTerm(tpdim);
2737 newdims = ndims - 1;
2738 for (i = 0, j = 0; i < ndims; i++) {
2744 if (mat[MAT_TYPE] == INT_MATRIX) {
2745 YAP_Int *data, *ndata;
2746 int d = 1, j = 0, dd = 1;
2749 tf = new_int_matrix(newdims, nindx, NULL);
2750 if (tf == YAP_TermNil())
2753 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2754 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2755 data = matrix_long_data(mat, ndims);
2756 ndata = matrix_long_data(nmat, newdims);
2761 dd = d * dims[prdim];
2762 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2763 int j = i % d + (i / dd) * d;
2764 ndata[j] = exp(data[i]);
2766 for (; i < mat[MAT_SIZE]; i++) {
2767 int j = i % d + (i / dd) * d;
2768 ndata[j] += exp(data[i]);
2770 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2771 ndata[i] = log(ndata[i]);
2774 double *data, *ndata;
2775 int d = 1, j = 0, dd = 1;
2778 tf = new_float_matrix(newdims, nindx, NULL);
2779 if (tf == YAP_TermNil())
2782 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2783 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2784 data = matrix_double_data(mat, ndims);
2785 ndata = matrix_double_data(nmat, newdims);
2792 dd = d * dims[prdim];
2793 memset(ndata, 0,
sizeof(
double) * nmat[MAT_SIZE]);
2794 for (i = 0; i < mat[MAT_SIZE]; i++) {
2795 YAP_Int k = i % d + (i / dd) * d;
2796 ndata[k] += exp(data[i]);
2798 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2799 ndata[i] = log(ndata[i]);
2802 return YAP_Unify(YAP_ARG3, tf);
2807static YAP_Bool matrix_sum_out_logs_several(
void) {
2808 intptr_t ndims, i, *dims, newdims;
2809 intptr_t indx[MAX_DIMS], nindx[MAX_DIMS], conv[MAX_DIMS];
2811 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2817 ndims = mat[MAT_NDIMS];
2818 dims = mat + MAT_DIMS;
2821 for (i = 0, newdims = 0; i < ndims; i++) {
2824 if (!YAP_IsPairTerm(tconv))
2826 th = YAP_HeadOfTerm(tconv);
2827 if (!YAP_IsIntTerm(th))
2829 conv[i] = YAP_IntOfTerm(th);
2831 nindx[newdims++] = dims[i];
2833 tconv = YAP_TailOfTerm(tconv);
2835 if (mat[MAT_TYPE] == INT_MATRIX) {
2836 YAP_Int *data, *ndata;
2839 tf = new_int_matrix(newdims, nindx, NULL);
2840 if (tf == YAP_TermNil())
2843 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2844 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2845 data = matrix_long_data(mat, ndims);
2846 ndata = matrix_long_data(nmat, newdims);
2848 for (i = 0; i < nmat[MAT_SIZE]; i++)
2850 for (i = 0; i < mat[MAT_SIZE]; i++) {
2856 matrix_get_index(mat, i, indx);
2857 for (j = 0, k = 0; j < ndims; j++) {
2859 nindx[k++] = indx[j];
2862 ndata[matrix_get_offset(nmat, nindx)] += exp(data[i]);
2865 double *data, *ndata;
2868 tf = new_float_matrix(newdims, nindx, NULL);
2869 if (tf == YAP_TermNil())
2872 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2873 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2874 data = matrix_double_data(mat, ndims);
2875 ndata = matrix_double_data(nmat, newdims);
2877 for (i = 0; i < nmat[MAT_SIZE]; i++)
2879 for (i = 0; i < mat[MAT_SIZE]; i++) {
2885 matrix_get_index(mat, i, indx);
2886 for (j = 0, k = 0; j < ndims; j++) {
2888 nindx[k++] = indx[j];
2891 ndata[matrix_get_offset(nmat, nindx)] += exp(data[i]);
2893 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2894 ndata[i] = log(ndata[i]);
2897 return YAP_Unify(YAP_ARG3, tf);
2903static YAP_Bool matrix_expand(
void) {
2904 intptr_t ndims, i, *dims, newdims = 0, olddims = 0;
2905 intptr_t
new[MAX_DIMS], indx[MAX_DIMS], nindx[MAX_DIMS];
2907 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2914 ndims = mat[MAT_NDIMS];
2915 dims = mat + MAT_DIMS;
2916 for (i = 0; i < MAX_DIMS; i++) {
2920 if (!YAP_IsPairTerm(tconv)) {
2921 if (tconv != YAP_TermNil())
2925 th = YAP_HeadOfTerm(tconv);
2926 if (!YAP_IsIntTerm(th))
2929 j = YAP_IntOfTerm(th);
2932 nindx[i] = dims[olddims];
2938 tconv = YAP_TailOfTerm(tconv);
2940 if (olddims != ndims)
2942 if (mat[MAT_TYPE] == INT_MATRIX) {
2943 YAP_Int *data, *ndata;
2946 tf = new_int_matrix(newdims, nindx, NULL);
2947 if (tf == YAP_TermNil())
2950 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2951 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2952 data = matrix_long_data(mat, ndims);
2953 ndata = matrix_long_data(nmat, newdims);
2955 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2961 matrix_get_index(nmat, i, indx);
2962 for (j = 0; j < newdims; j++) {
2964 nindx[k++] = indx[j];
2966 ndata[i] = data[matrix_get_offset(mat, nindx)];
2969 double *data, *ndata;
2972 tf = new_float_matrix(newdims, nindx, NULL);
2973 if (tf == YAP_TermNil())
2976 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
2977 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
2978 data = matrix_double_data(mat, ndims);
2979 ndata = matrix_double_data(nmat, newdims);
2981 for (i = 0; i < newdims; i++)
2983 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2989 for (j = 0; j < newdims; j++) {
2991 nindx[k++] = indx[j];
2993 ndata[i] = data[matrix_get_offset(mat, nindx)];
2994 matrix_next_index(nmat + MAT_DIMS, newdims, indx);
2997 return YAP_Unify(YAP_ARG3, tf);
3003static YAP_Bool matrix_set_all_that_disagree(
void) {
3004 intptr_t ndims, i, *dims;
3005 intptr_t indx[MAX_DIMS];
3007 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
3008 int dim = YAP_IntOfTerm(YAP_ARG2);
3009 int pos = YAP_IntOfTerm(YAP_ARG3);
3015 ndims = mat[MAT_NDIMS];
3016 dims = mat + MAT_DIMS;
3017 if (mat[MAT_TYPE] == INT_MATRIX) {
3018 YAP_Int *data, *ndata, val;
3021 tf = new_int_matrix(ndims, dims, NULL);
3022 if (tf == YAP_TermNil())
3025 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
3026 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
3027 data = matrix_long_data(mat, ndims);
3028 ndata = matrix_long_data(nmat, ndims);
3029 if (!YAP_IsIntTerm(YAP_ARG4))
3031 val = YAP_IntOfTerm(YAP_ARG4);
3033 for (i = 0; i < nmat[MAT_SIZE]; i++) {
3039 matrix_get_index(mat, i, indx);
3040 if (indx[dim] != pos)
3046 double *data, *ndata, val;
3049 tf = new_float_matrix(ndims, dims, NULL);
3050 if (tf == YAP_TermNil())
3053 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
3054 nmat = (intptr_t *)YAP_BlobOfTerm(tf);
3055 data = matrix_double_data(mat, ndims);
3056 ndata = matrix_double_data(nmat, ndims);
3057 if (YAP_IsFloatTerm(YAP_ARG4))
3058 val = YAP_FloatOfTerm(YAP_ARG4);
3059 else if (YAP_IsIntTerm(YAP_ARG4))
3060 val = YAP_IntOfTerm(YAP_ARG4);
3064 for (i = 0; i < nmat[MAT_SIZE]; i++) {
3070 matrix_get_index(mat, i, indx);
3071 if (indx[dim] != pos)
3077 return YAP_Unify(YAP_ARG5, tf);
3080static YAP_Bool matrix_m(
void) {
3081 intptr_t ndims, i, size;
3083 intptr_t *mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
3086 return YAP_Unify(YAP_ARG1, YAP_ARG2);
3088 ndims = mat[MAT_NDIMS];
3089 size = mat[MAT_SIZE];
3090 tm = YAP_MkNewApplTerm(MFunctorM, 5);
3091 tp = YAP_ArgsOfTerm(tm);
3092 tp[0] = mk_int_list(ndims, mat + MAT_DIMS);
3093 tp[1] = YAP_MkIntTerm(ndims);
3094 tp[2] = YAP_MkIntTerm(size);
3095 tp[3] = mk_rep_int_list(ndims, mat[MAT_BASE]);
3096 tp[4] = YAP_MkNewApplTerm(YAP_MkFunctor(MAtomC, size), size);
3097 tp = YAP_ArgsOfTerm(tp[3]);
3098 if (mat[MAT_TYPE] == INT_MATRIX) {
3102 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
3103 data = matrix_long_data(mat, ndims);
3104 for (i = 0; i < mat[MAT_SIZE]; i++) {
3105 tp[i] = YAP_MkIntTerm(data[i]);
3111 mat = (intptr_t *)YAP_BlobOfTerm(YAP_ARG1);
3112 data = matrix_double_data(mat, ndims);
3113 for (i = 0; i < mat[MAT_SIZE]; i++) {
3114 tp[i] = YAP_MkFloatTerm(data[i]);
3117 return YAP_Unify(YAP_ARG2, tm);
3121X_API
void init_matrix(
void);
3123X_API
void init_matrix(
void) {
3125 MAtomC = YAP_LookupAtom(
"c");
3126 MFunctorM = YAP_MkFunctor(YAP_LookupAtom(
"$matrix"), 5);
3127 MFunctorFloats = YAP_MkFunctor(YAP_LookupAtom(
"floats"), 2);
3128 MTermTrue = YAP_MkAtomTerm(YAP_LookupAtom(
"true"));
3129 MTermFail = YAP_MkAtomTerm(YAP_LookupAtom(
"fail"));
3130 MTermFalse = YAP_MkAtomTerm(YAP_LookupAtom(
"false"));
3133 YAP_UserCPredicate(
"new_ints_matrix", new_ints_matrix, 4);
3134 YAP_UserCPredicate(
"new_ints_matrix_set", new_ints_matrix_set, 4);
3135 YAP_UserCPredicate(
"new_floats_matrix", new_floats_matrix, 4);
3136 YAP_UserCPredicate(
"new_floats_matrix_set", new_floats_matrix_set, 4);
3139 YAP_UserCPredicate(
"matrix_set_one", matrix_set_one, 3);
3140 YAP_UserCPredicate(
"matrix_set_all", matrix_set_all, 2);
3141 YAP_UserCPredicate(
"matrix_get_one", matrix_get_one, 3);
3143 YAP_UserCPredicate(
"matrix_add_to_all" , matrix_add_to_all, 2);
3144 YAP_UserCPredicate(
"matrix_inc", matrix_inc, 2);
3145 YAP_UserCPredicate(
"matrix_dec", matrix_dec, 2);
3146 YAP_UserCPredicate(
"matrix_inc", matrix_inc3, 3);
3147 YAP_UserCPredicate(
"matrix_dec", matrix_dec3, 3);
3149 YAP_UserCPredicate(
"matrix_max", matrix_max, 2);
3150 YAP_UserCPredicate(
"matrix_maxarg", matrix_maxarg, 2);
3151 YAP_UserCPredicate(
"matrix_min", matrix_min, 2);
3152 YAP_UserCPredicate(
"matrix_minarg", matrix_minarg, 2);
3153 YAP_UserCPredicate(
"matrix_to_list", matrix_to_list, 2);
3154 YAP_UserCPredicate(
"matrix_set_base", matrix_set_base, 2);
3155 YAP_UserCPredicate(
"matrix_dims", matrix_dims, 2);
3156 YAP_UserCPredicate(
"matrix_dims", matrix_dims3, 3);
3157 YAP_UserCPredicate(
"matrix_ndims", matrix_ndims, 2);
3158 YAP_UserCPredicate(
"matrix_size", matrix_size, 2);
3159 YAP_UserCPredicate(
"matrix_type_as_number", matrix_type, 2);
3160 YAP_UserCPredicate(
"matrix_arg_to_offset", matrix_arg_to_offset, 3);
3161 YAP_UserCPredicate(
"matrix_offset_to_arg", matrix_offset_to_arg, 3);
3162 YAP_UserCPredicate(
"matrix_sum", matrix_sum, 2);
3163 YAP_UserCPredicate(
"matrix_shuffle", matrix_transpose, 3);
3164 YAP_UserCPredicate(
"matrix_expand", matrix_expand, 3);
3165 YAP_UserCPredicate(
"matrix_select", matrix_select, 4);
3166 YAP_UserCPredicate(
"matrix_column", matrix_column, 3);
3167 YAP_UserCPredicate(
"matrix_to_logs", matrix_log_all, 1);
3168 YAP_UserCPredicate(
"matrix_to_exps", matrix_exp_all, 1);
3169 YAP_UserCPredicate(
"matrix_to_exps2", matrix_exp2_all, 1);
3170 YAP_UserCPredicate(
"matrix_to_logs", matrix_log_all2, 2);
3171 YAP_UserCPredicate(
"matrix_to_exps", matrix_exp_all2, 2);
3172 YAP_UserCPredicate(
"matrix_sum_out", matrix_sum_out, 3);
3173 YAP_UserCPredicate(
"matrix_sum_out_several", matrix_sum_out_several, 3);
3174 YAP_UserCPredicate(
"matrix_sum_logs_out", matrix_sum_out_logs, 3);
3175 YAP_UserCPredicate(
"matrix_sum_logs_out_several", matrix_sum_out_logs_several,
3177 YAP_UserCPredicate(
"matrix_set_all_that_disagree",
3178 matrix_set_all_that_disagree, 5);
3179 YAP_UserCPredicate(
"do_matrix_op", matrix_op, 4);
3180 YAP_UserCPredicate(
"do_matrix_agg_lines", matrix_agg_lines, 3);
3181 YAP_UserCPredicate(
"do_matrix_agg_cols", matrix_agg_cols, 3);
3182 YAP_UserCPredicate(
"do_matrix_op_to_all", matrix_op_to_all, 4);
3183 YAP_UserCPredicate(
"do_matrix_op_to_lines", matrix_op_to_lines, 4);
3184 YAP_UserCPredicate(
"do_matrix_op_to_cols", matrix_op_to_cols, 4);
3185 YAP_UserCPredicate(
"matrix_m", matrix_m, 2);
3186 YAP_UserCPredicate(
"is_matrix", is_matrix, 1);
3191int WINAPI win_matrixs(HANDLE, DWORD, LPVOID);
3193int WINAPI win_matrixs(HANDLE hinst, DWORD reason, LPVOID reserved) {
3195 case DLL_PROCESS_ATTACH:
3197 case DLL_PROCESS_DETACH:
3199 case DLL_THREAD_ATTACH:
3201 case DLL_THREAD_DETACH: