19#if defined(__MINGW32__) || _MSC_VER
44typedef enum { INT_MATRIX, FLOAT_MATRIX } mat_data_type;
80YAP_Functor FunctorM, FunctorFloats;
83static YAP_Int *matrix_long_data(
int *mat,
int ndims) {
84 return (YAP_Int *)(mat + (MAT_DIMS + ndims));
87static double *matrix_double_data(
int *mat,
int ndims) {
88 return (
double *)(mat + (MAT_DIMS + ndims));
91static unsigned int matrix_get_offset(
int *mat,
int *indx) {
92 unsigned int i, pos = mat[MAT_SIZE], off = 0;
95 for (i = 0; i < mat[MAT_NDIMS]; i++) {
97 pos /= mat[MAT_DIMS + i];
98 v = indx[i] - mat[MAT_BASE];
99 if (v >= mat[MAT_DIMS + i]) {
107static void matrix_get_index(
int *mat,
unsigned int offset,
int *indx) {
108 unsigned int i, pos = mat[MAT_SIZE];
111 for (i = 0; i < mat[MAT_NDIMS]; i++) {
112 pos /= mat[MAT_DIMS + i];
113 indx[i] = offset / pos;
114 offset = offset % pos;
118static size_t GET_OFFSET(YAP_Term t,
M *mat) {
119 unsigned int i, off = 0;
120 if (YAP_IsIntTerm(YAP_ARG1))
121 return YAP_IntOfTerm(YAP_ARG1);
123 for (i = 0; i < mat->ndims; i++) {
125 if (!YAP_IsPairTerm(t))
126 YAP_Error(TYPE_ERROR, t, NULL);
128 v = YAP_IntOfTerm(YAP_HeadOfTerm(t)) - mat->base;
129 if (v >= mat->dims[ i]) {
137static void matrix_next_index(
int *dims,
int ndims,
int *indx) {
141 for (i = ndims; i > 0;) {
144 if (indx[i] != dims[i])
151static bool GET_MATRIX(YAP_Term inp,
M *o)
154 if ((mat= YAP_BlobOfTerm(inp))) {
155 o->floats = mat[MAT_TYPE]==FLOAT_MATRIX;
157 o->sz = mat[MAT_SIZE];
158 o->ndims = mat[MAT_NDIMS];
159 o->data = (
double *)(mat + (MAT_DIMS + o->ndims));
160 o->dims=mat+MAT_DIMS;
162 }
else if (YAP_IsAtomTerm(inp) && (
163 o->data = YAP_FetchArray(inp, &o->sz, &o->floats) )) {
169 o->sz = YAP_IntOfTerm(YAP_ArgOfTerm(1,inp));
174 o->data = (
double *)YAP_IntOfTerm(YAP_ArgOfTerm(2,inp));
182static YAP_Term new_int_matrix(
int ndims,
int dims[], YAP_Int data[]) {
184 unsigned int i, nelems = 1;
192 for (i = 0; i < ndims; i++) {
196 sz = ((MAT_DIMS + 1) *
sizeof(
int) + ndims *
sizeof(int) +
197 nelems *
sizeof(YAP_Int)) /
200 blob = YAP_MkBlobTerm(sz);
201 if (blob == YAP_TermNil()) {
204 mat = (
int *)YAP_BlobOfTerm(blob);
205 mat[MAT_TYPE] = INT_MATRIX;
207 mat[MAT_NDIMS] = ndims;
208 mat[MAT_SIZE] = nelems;
209 for (i = 0; i < ndims; i++) {
210 mat[MAT_DIMS + i] = idims[i];
212 bdata = matrix_long_data(mat, ndims);
214 memmove((
void *)bdata, (
void *)data,
sizeof(
double) * nelems);
218static YAP_Term new_float_matrix(
int ndims,
int dims[],
double data[]) {
220 unsigned int i, nelems = 1;
228 for (i = 0; i < ndims; i++) {
232 sz = ((MAT_DIMS + 1) *
sizeof(
int) + ndims *
sizeof(int) +
233 (nelems + 1) *
sizeof(double) + (
sizeof(YAP_CELL) - 1)) /
235 blob = YAP_MkBlobTerm(sz);
236 if (blob == YAP_TermNil())
238 mat = YAP_BlobOfTerm(blob);
239 mat[MAT_TYPE] = FLOAT_MATRIX;
241 mat[MAT_NDIMS] = ndims;
242 mat[MAT_SIZE] = nelems;
243 for (i = 0; i < ndims; i++) {
244 mat[MAT_DIMS + i] = idims[i];
246 bdata = matrix_double_data(mat, ndims);
248 memmove((
void *)bdata, (
void *)data,
sizeof(
double) * nelems);
252static YAP_Bool scan_dims(
int ndims, YAP_Term tl,
int dims[MAX_DIMS]) {
255 for (i = 0; i < ndims; i++) {
259 if (!YAP_IsPairTerm(tl)) {
262 th = YAP_HeadOfTerm(tl);
263 if (!YAP_IsIntTerm(th)) {
267 d = YAP_IntOfTerm(th);
273 tl = YAP_TailOfTerm(tl);
275 if (tl != YAP_TermNil()) {
282static YAP_Bool scan_dims_args(
int ndims, YAP_Term tl,
int dims[MAX_DIMS]) {
285 for (i = 0; i < ndims; i++) {
289 th = YAP_ArgOfTerm(2 + i, tl);
290 if (!YAP_IsIntTerm(th)) {
294 d = YAP_IntOfTerm(th);
304static YAP_Bool cp_int_matrix(YAP_Term tl, YAP_Term matrix) {
305 int *mat = (
int *)YAP_BlobOfTerm(matrix);
306 int i, nelems = mat[MAT_SIZE];
307 YAP_Int *j = matrix_long_data(mat, mat[MAT_NDIMS]);
309 for (i = 0; i < nelems; i++) {
313 if (!YAP_IsPairTerm(tl)) {
316 th = YAP_HeadOfTerm(tl);
317 if (!YAP_IsIntTerm(th)) {
321 d = YAP_IntOfTerm(th);
323 tl = YAP_TailOfTerm(tl);
325 if (tl != YAP_TermNil()) {
332static YAP_Bool cp_float_matrix(YAP_Term tl, YAP_Term matrix) {
333 int *mat = (
int *)YAP_BlobOfTerm(matrix);
334 int i, nelems = mat[MAT_SIZE];
335 double *j = matrix_double_data(mat, mat[MAT_NDIMS]);
337 for (i = 0; i < nelems; i++) {
341 if (!YAP_IsPairTerm(tl)) {
344 th = YAP_HeadOfTerm(tl);
345 if (YAP_IsIntTerm(th)) {
346 d = YAP_IntOfTerm(th);
347 }
else if (!YAP_IsFloatTerm(th)) {
351 d = YAP_FloatOfTerm(th);
354 tl = YAP_TailOfTerm(tl);
356 if (tl != YAP_TermNil()) {
363static YAP_Bool set_int_matrix(YAP_Term matrix, YAP_Int set) {
364 int *mat = (
int *)YAP_BlobOfTerm(matrix);
365 int i, nelems = mat[MAT_SIZE];
366 YAP_Int *j = matrix_long_data(mat, mat[MAT_NDIMS]);
368 for (i = 0; i < nelems; i++) {
374static YAP_Bool set_float_matrix(YAP_Term matrix,
double set) {
375 int *mat = (
int *)YAP_BlobOfTerm(matrix);
376 int i, nelems = mat[MAT_SIZE];
377 double *j = matrix_double_data(mat, mat[MAT_NDIMS]);
379 for (i = 0; i < nelems; i++) {
385static YAP_Bool new_ints_matrix(
void) {
386 int ndims = YAP_IntOfTerm(YAP_ARG1);
387 YAP_Term tl = YAP_ARG2, out;
391 if (!scan_dims(ndims, tl, dims))
393 out = new_int_matrix(ndims, dims, NULL);
394 if (out == YAP_TermNil())
397 if (!YAP_IsVarTerm(data) && !cp_int_matrix(data, out))
399 return YAP_Unify(YAP_ARG4, out);
402static YAP_Bool new_ints_matrix_set(
void) {
403 int ndims = YAP_IntOfTerm(YAP_ARG1);
404 YAP_Term tl = YAP_ARG2, out, tset = YAP_ARG3;
408 if (!YAP_IsIntTerm(tset)) {
411 set = YAP_IntOfTerm(tset);
412 if (!scan_dims(ndims, tl, dims))
415 for (i=0;i<ndims;i++)
417 YAP_RequiresExtraStack(sz*
sizeof(YAP_CELL));
418 out = new_int_matrix(ndims, dims, NULL);
419 return set_int_matrix(out, set) &&
420 YAP_Unify(YAP_ARG4, out);
423static YAP_Bool new_floats_matrix(
void) {
424 int ndims = YAP_IntOfTerm(YAP_ARG1);
425 YAP_Term tl = YAP_ARG2, out, data = YAP_ARG3;
427 if (!scan_dims(ndims, tl, dims))
429 out = new_float_matrix(ndims, dims, NULL);
430 if (out == YAP_TermNil())
432 if (!YAP_IsVarTerm(data) && !cp_float_matrix(data, out))
434 return YAP_Unify(YAP_ARG4, out);
437static YAP_Bool new_floats_matrix_set(
void) {
438 int ndims = YAP_IntOfTerm(YAP_ARG1);
439 YAP_Term tl = YAP_ARG2, out, tset = YAP_ARG3;
443 if (!YAP_IsFloatTerm(tset)) {
446 set = YAP_FloatOfTerm(tset);
447 if (!scan_dims(ndims, tl, dims))
449 out = new_float_matrix(ndims, dims, NULL);
450 if (!set_float_matrix(out, set))
452 return YAP_Unify(YAP_ARG4, out);
455static YAP_Term float_matrix_to_list(
int *mat) {
456 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
459 if (YAP_RequiresExtraStack(6 * mat[MAT_SIZE])) {
460 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
461 data = matrix_double_data(mat, mat[MAT_NDIMS]);
463 return YAP_FloatsToList(data, mat[MAT_SIZE]);
466static YAP_Term mk_int_list(
int nelems,
int *data) {
467 YAP_Term tn = YAP_TermNil();
471 for (i = nelems - 1; i >= 0; i--) {
472 tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i]), tf);
481static YAP_Term mk_int_list2(
int nelems,
int base,
int *data) {
482 YAP_Term tn = YAP_TermNil();
486 for (i = nelems - 1; i >= 0; i--) {
487 tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i] + base), tf);
496static YAP_Term mk_rep_int_list(
int nelems,
int data) {
497 YAP_Term tn = YAP_TermNil();
501 for (i = nelems - 1; i >= 0; i--) {
502 tf = YAP_MkPairTerm(YAP_MkIntTerm(data), tf);
511static YAP_Term mk_long_list(
int nelems, YAP_Int *data) {
512 YAP_Term tn = YAP_TermNil();
516 for (i = nelems - 1; i >= 0; i--) {
517 tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i]), tf);
526static YAP_Term long_matrix_to_list(
int *mat) {
527 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
530 if (YAP_RequiresExtraStack(5 * mat[MAT_SIZE])) {
531 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
532 data = matrix_long_data(mat, mat[MAT_NDIMS]);
534 return mk_long_list(mat[MAT_SIZE], data);
537static YAP_Term matrix_access(
int *mat,
int *indx) {
538 unsigned int off = matrix_get_offset(mat, indx);
539 if (mat[MAT_TYPE] == FLOAT_MATRIX)
540 return YAP_MkFloatTerm((matrix_double_data(mat, mat[MAT_NDIMS]))[off]);
542 return YAP_MkIntTerm((matrix_long_data(mat, mat[MAT_NDIMS]))[off]);
545static void matrix_float_set(
int *mat,
int *indx,
double nval) {
546 unsigned int off = 0;
548 off = matrix_get_offset(mat, indx);
549 (matrix_double_data(mat, mat[MAT_NDIMS]))[off] = nval;
552static void matrix_long_set(
int *mat,
int *indx, YAP_Int nval) {
553 unsigned int off = matrix_get_offset(mat, indx);
554 (matrix_long_data(mat, mat[MAT_NDIMS]))[off] = nval;
557static void matrix_float_set_all(
int *mat,
double nval) {
559 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
561 for (i = 0; i < mat[MAT_SIZE]; i++)
565static void matrix_long_set_all(
int *mat, YAP_Int nval) {
567 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
570 memset((
void *)data, 0,
sizeof(YAP_Int) * mat[MAT_SIZE]);
572 for (i = 0; i < mat[MAT_SIZE]; i++)
577static void matrix_float_add(
int *mat,
int *indx,
double nval) {
579 double *dat = matrix_double_data(mat, mat[MAT_NDIMS]);
581 off = matrix_get_offset(mat, indx);
585static void matrix_long_add(
int *mat,
int *indx, YAP_Int nval) {
586 YAP_Int *dat = matrix_long_data(mat, mat[MAT_NDIMS]);
587 unsigned int off = matrix_get_offset(mat, indx);
591static void matrix_inc(
int *mat,
int *indx) {
592 unsigned int off = matrix_get_offset(mat, indx);
593 if (mat[MAT_TYPE] == FLOAT_MATRIX)
594 (matrix_double_data(mat, mat[MAT_NDIMS])[off])++;
596 ((matrix_long_data(mat, mat[MAT_NDIMS]))[off])++;
599static void matrix_dec(
int *mat,
int *indx) {
600 unsigned int off = matrix_get_offset(mat, indx);
601 if (mat[MAT_TYPE] == FLOAT_MATRIX)
602 (matrix_double_data(mat, mat[MAT_NDIMS])[off])--;
604 ((matrix_long_data(mat, mat[MAT_NDIMS]))[off])--;
607static YAP_Term matrix_inc2(
int *mat,
int *indx) {
608 unsigned int off = matrix_get_offset(mat, indx);
609 if (mat[MAT_TYPE] == FLOAT_MATRIX) {
610 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
611 double d = data[off];
614 return YAP_MkFloatTerm(d);
616 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
617 YAP_Int d = data[off];
620 return YAP_MkIntTerm(d);
624static YAP_Term matrix_dec2(
int *mat,
int *indx) {
625 unsigned int off = matrix_get_offset(mat, indx);
626 if (mat[MAT_TYPE] == FLOAT_MATRIX) {
627 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
628 double d = data[off];
631 return YAP_MkFloatTerm(d);
633 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
634 YAP_Int d = data[off];
637 return YAP_MkIntTerm(d);
642static YAP_Bool matrix_set2(
void) {
643 int dims[MAX_DIMS], *mat;
644 YAP_Term tf, t = YAP_ARG1;
646 mat = (
int *)YAP_BlobOfTerm(YAP_ArgOfTerm(1, t));
651 if (!scan_dims_args(mat[MAT_NDIMS], t, dims)) {
656 if (mat[MAT_TYPE] == INT_MATRIX) {
657 if (YAP_IsIntTerm(tf)) {
658 matrix_long_set(mat, dims, YAP_IntOfTerm(tf));
659 }
else if (YAP_IsFloatTerm(tf)) {
660 matrix_long_set(mat, dims, YAP_FloatOfTerm(tf));
666 if (YAP_IsIntTerm(tf)) {
667 matrix_float_set(mat, dims, YAP_IntOfTerm(tf));
668 }
else if (YAP_IsFloatTerm(tf)) {
669 matrix_float_set(mat, dims, YAP_FloatOfTerm(tf));
678static YAP_Bool matrix_set_all(
void) {
682 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
684 if (YAP_IsApplTerm(YAP_ARG1) && YAP_FunctorOfTerm(YAP_ARG1) == FunctorFloats) {
685 double * v = YAP_PointerOfTerm(YAP_ArgOfTerm(1,YAP_ARG1));
686 size_t sz = YAP_IntOfTerm(YAP_ArgOfTerm(2,YAP_ARG1));
687 double val = YAP_FloatOfTerm(YAP_ARG2);
688 if (val == 0.0) memset(v, 0,sz*
sizeof(
double));
691 for (j=0; j< sz; j++)
701 if (mat[MAT_TYPE] == INT_MATRIX) {
702 if (YAP_IsIntTerm(tf)) {
703 matrix_long_set_all(mat, YAP_IntOfTerm(tf));
704 }
else if (YAP_IsFloatTerm(tf)) {
705 matrix_long_set_all(mat, YAP_FloatOfTerm(tf));
711 if (YAP_IsIntTerm(tf)) {
712 matrix_float_set_all(mat, YAP_IntOfTerm(tf));
713 }
else if (YAP_IsFloatTerm(tf)) {
714 matrix_float_set_all(mat, YAP_FloatOfTerm(tf));
723static YAP_Bool matrix_add(
void) {
724 int dims[MAX_DIMS], *mat;
727 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
732 if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) {
737 if (mat[MAT_TYPE] == INT_MATRIX) {
738 if (YAP_IsIntTerm(tf)) {
739 matrix_long_add(mat, dims, YAP_IntOfTerm(tf));
740 }
else if (YAP_IsFloatTerm(tf)) {
741 matrix_long_add(mat, dims, YAP_FloatOfTerm(tf));
747 if (YAP_IsIntTerm(tf)) {
748 matrix_float_add(mat, dims, YAP_IntOfTerm(tf));
749 }
else if (YAP_IsFloatTerm(tf)) {
750 matrix_float_add(mat, dims, YAP_FloatOfTerm(tf));
759static YAP_Bool matrix_get(
void) {
764 if (!GET_MATRIX(YAP_ARG1 ,&mat) ||
765 !(offset = GET_OFFSET(YAP_ARG2,&mat))) {
770 tf = YAP_MkFloatTerm(mat.data[offset]);
772 tf = YAP_MkIntTerm(mat.ls[offset]);
773 return YAP_Unify(tf, YAP_ARG3);
776static YAP_Bool matrix_set(
void) {
781 if (!GET_MATRIX(YAP_ARG1 ,&mat) ||
782 !(offset = GET_OFFSET(YAP_ARG2,&mat))) {
787 if (YAP_IsIntTerm(YAP_ARG3))
788 mat.data[offset] = YAP_IntOfTerm(YAP_ARG3);
790 mat.data[offset] = YAP_FloatOfTerm(YAP_ARG3);
792 if (YAP_IsIntTerm(YAP_ARG3))
793 mat.ls[offset] = YAP_IntOfTerm(YAP_ARG3);
795 mat.ls[offset] = YAP_FloatOfTerm(YAP_ARG3);
800static YAP_Bool do_matrix_access2(
void) {
801 int dims[MAX_DIMS], *mat;
802 YAP_Term tf, t = YAP_ARG1;
804 mat = (
int *)YAP_BlobOfTerm(YAP_ArgOfTerm(1, t));
809 if (!scan_dims_args(mat[MAT_NDIMS], t, dims)) {
813 tf = matrix_access(mat, dims);
814 return YAP_Unify(tf, YAP_ARG2);
818static YAP_Bool do_matrix_inc(
void) {
821 if (!GET_MATRIX(YAP_ARG1 ,&mat) ||
822 !(offset = GET_OFFSET(YAP_ARG2,&mat))) {
827 mat.data[offset] += 1.0;
833static YAP_Bool do_matrix_dec(
void) {
836 if (!GET_MATRIX(YAP_ARG1 ,&mat) ||
837 !(offset = GET_OFFSET(YAP_ARG2,&mat))) {
842 mat.data[offset] -= 1.0;
848static YAP_Bool do_matrix_inc2(
void) {
849 int dims[MAX_DIMS], *mat;
851 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
856 if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) {
860 return YAP_Unify(matrix_inc2(mat, dims), YAP_ARG3);
863static YAP_Bool do_matrix_dec2(
void) {
864 int dims[MAX_DIMS], *mat;
866 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
871 if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) {
875 return YAP_Unify(matrix_dec2(mat, dims), YAP_ARG3);
878static YAP_Bool matrix_to_list(
void) {
882 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
887 if (mat[MAT_TYPE] == INT_MATRIX)
888 tf = long_matrix_to_list(mat);
890 tf = float_matrix_to_list(mat);
891 return YAP_Unify(YAP_ARG2, tf);
894static YAP_Bool matrix_set_base(
void) {
897 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
902 mat[MAT_BASE] = YAP_IntOfTerm(YAP_ARG2);
906static YAP_Bool matrix_dims(
void) {
910 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
915 tf = mk_int_list(mat[MAT_NDIMS], mat + MAT_DIMS);
916 return YAP_Unify(YAP_ARG2, tf);
919static YAP_Bool matrix_dims3(
void) {
923 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
928 tf = mk_int_list(mat[MAT_NDIMS], mat + MAT_DIMS);
929 tof = mk_rep_int_list(mat[MAT_NDIMS], mat[MAT_BASE]);
930 return YAP_Unify(YAP_ARG2, tf) && YAP_Unify(YAP_ARG3, tof);
933static YAP_Bool matrix_size(
void) {
936 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
941 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(mat[MAT_SIZE]));
944static YAP_Bool matrix_ndims(
void) {
947 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
952 return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(mat[MAT_NDIMS]));
955static YAP_Bool matrix_type(
void) {
959 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
964 if (mat[MAT_TYPE] == INT_MATRIX) {
965 tf = YAP_MkIntTerm(0);
967 tf = YAP_MkIntTerm(1);
969 return YAP_Unify(YAP_ARG2, tf);
972static YAP_Bool matrix_arg_to_offset(
void) {
973 int indx[MAX_DIMS], *mat;
976 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
981 if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, indx)) {
985 off = matrix_get_offset(mat, indx);
987 return YAP_Unify(YAP_ARG3, YAP_MkIntTerm(off));
990static YAP_Bool matrix_offset_to_arg(
void) {
991 int indx[MAX_DIMS], *mat;
995 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1000 if (!YAP_IsIntTerm(ti = YAP_ARG2)) {
1004 off = YAP_IntOfTerm(ti);
1005 matrix_get_index(mat, off, indx);
1006 tf = mk_int_list2(mat[MAT_NDIMS], mat[MAT_BASE], indx);
1007 return YAP_Unify(YAP_ARG3, tf);
1010static unsigned int scan_max_long(
int sz, YAP_Int *data) {
1012 YAP_Int max = data[0];
1013 for (i = 1; i < sz; i++) {
1014 if (data[i] > max) {
1022static unsigned int scan_max_float(
int sz,
double *data) {
1024 double max = data[0];
1025 for (i = 1; i < sz; i++) {
1026 if (data[i] > max) {
1034static unsigned int scan_min_long(
int sz, YAP_Int *data) {
1036 YAP_Int max = data[0];
1037 for (i = 1; i < sz; i++) {
1038 if (data[i] < max) {
1046static unsigned int scan_min_float(
int sz,
double *data) {
1048 double max = data[0];
1049 for (i = 1; i < sz; i++) {
1050 if (data[i] < max) {
1058static YAP_Bool matrix_max(
void) {
1063 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1068 if (mat[MAT_TYPE] == INT_MATRIX) {
1069 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1070 off = scan_max_long(mat[MAT_SIZE], data);
1071 tf = YAP_MkIntTerm(data[off]);
1073 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1074 off = scan_max_float(mat[MAT_SIZE], data);
1075 tf = YAP_MkFloatTerm(data[off]);
1077 return YAP_Unify(YAP_ARG2, tf);
1080static YAP_Bool matrix_maxarg(
void) {
1081 int indx[MAX_DIMS], *mat;
1085 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1090 if (mat[MAT_TYPE] == INT_MATRIX) {
1091 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1092 off = scan_max_long(mat[MAT_SIZE], data);
1094 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1095 off = scan_max_float(mat[MAT_SIZE], data);
1097 matrix_get_index(mat, off, indx);
1098 tf = mk_int_list(mat[MAT_NDIMS], indx);
1099 return YAP_Unify(YAP_ARG2, tf);
1102static YAP_Bool matrix_min(
void) {
1107 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1112 if (mat[MAT_TYPE] == INT_MATRIX) {
1113 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1114 off = scan_min_long(mat[MAT_SIZE], data);
1115 tf = YAP_MkIntTerm(data[off]);
1117 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1118 off = scan_min_float(mat[MAT_SIZE], data);
1119 tf = YAP_MkFloatTerm(data[off]);
1121 return YAP_Unify(YAP_ARG2, tf);
1124static YAP_Bool matrix_log_all(
void) {
1127 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1132 if (mat[MAT_TYPE] == INT_MATRIX) {
1135 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1138 for (i = 0; i < mat[MAT_SIZE]; i++) {
1139 data[i] = log(data[i]);
1145static YAP_Bool matrix_log_all2(
void) {
1148 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1153 if (mat[MAT_TYPE] == INT_MATRIX) {
1155 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1160 if (!YAP_IsVarTerm(YAP_ARG2)) {
1163 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1164 if (out == YAP_TermNil())
1167 nmat = (
int *)YAP_BlobOfTerm(out);
1168 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1169 for (i = 0; i < mat[MAT_SIZE]; i++) {
1170 ndata[i] = log((
double)data[i]);
1172 if (YAP_IsVarTerm(YAP_ARG2)) {
1173 return YAP_Unify(YAP_ARG2, out);
1177 double *data = matrix_double_data(mat, mat[MAT_NDIMS]), *ndata;
1181 if (!YAP_IsVarTerm(YAP_ARG2)) {
1184 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1185 if (out == YAP_TermNil())
1188 nmat = (
int *)YAP_BlobOfTerm(out);
1189 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1190 for (i = 0; i < mat[MAT_SIZE]; i++) {
1191 ndata[i] = log(data[i]);
1193 if (YAP_IsVarTerm(YAP_ARG2)) {
1194 return YAP_Unify(YAP_ARG2, out);
1200static YAP_Bool matrix_exp_all(
void) {
1203 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1208 if (mat[MAT_TYPE] == INT_MATRIX) {
1211 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1214 for (i = 0; i < mat[MAT_SIZE]; i++) {
1215 data[i] = exp(data[i]);
1221static YAP_Bool matrix_exp2_all(
void) {
1224 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1229 if (mat[MAT_TYPE] == INT_MATRIX) {
1232 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1234 double max = data[0];
1236 for (i = 1; i < mat[MAT_SIZE]; i++) {
1241 for (i = 0; i < mat[MAT_SIZE]; i++) {
1242 data[i] = exp(data[i] - max);
1248static YAP_Bool matrix_exp_all2(
void) {
1251 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1256 if (mat[MAT_TYPE] == INT_MATRIX) {
1258 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1263 if (!YAP_IsVarTerm(YAP_ARG2)) {
1266 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1267 if (out == YAP_TermNil())
1270 nmat = (
int *)YAP_BlobOfTerm(out);
1271 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1272 for (i = 0; i < mat[MAT_SIZE]; i++) {
1273 ndata[i] = exp((
double)data[i]);
1275 if (YAP_IsVarTerm(YAP_ARG2)) {
1276 return YAP_Unify(YAP_ARG2, out);
1280 double *data = matrix_double_data(mat, mat[MAT_NDIMS]), *ndata;
1284 if (!YAP_IsVarTerm(YAP_ARG2)) {
1287 out = new_float_matrix(mat[MAT_NDIMS], mat + MAT_DIMS, NULL);
1288 if (out == YAP_TermNil())
1291 nmat = (
int *)YAP_BlobOfTerm(out);
1292 ndata = matrix_double_data(nmat, mat[MAT_NDIMS]);
1293 for (i = 0; i < mat[MAT_SIZE]; i++) {
1294 ndata[i] = exp(data[i]);
1296 if (YAP_IsVarTerm(YAP_ARG2)) {
1297 return YAP_Unify(YAP_ARG2, out);
1303static YAP_Bool matrix_minarg(
void) {
1304 int indx[MAX_DIMS], *mat;
1308 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1313 if (mat[MAT_TYPE] == INT_MATRIX) {
1314 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1315 off = scan_min_long(mat[MAT_SIZE], data);
1317 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1318 off = scan_min_float(mat[MAT_SIZE], data);
1320 matrix_get_index(mat, off, indx);
1321 tf = mk_int_list(mat[MAT_NDIMS], indx);
1322 return YAP_Unify(YAP_ARG2, tf);
1325static YAP_Bool matrix_sum(
void) {
1329 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1334 if (mat[MAT_TYPE] == INT_MATRIX) {
1335 YAP_Int *data = matrix_long_data(mat, mat[MAT_NDIMS]);
1339 for (i = 0; i < mat[MAT_SIZE]; i++) {
1342 tf = YAP_MkIntTerm(sum);
1344 double *data = matrix_double_data(mat, mat[MAT_NDIMS]);
1349 for (i = 0; i < mat[MAT_SIZE]; i++) {
1350 double y = data[i] - c;
1359 tf = YAP_MkFloatTerm(sum);
1361 return YAP_Unify(YAP_ARG2, tf);
1364static void add_int_lines(
int total,
int nlines, YAP_Int *mat0,
1366 int ncols = total / nlines, i;
1367 for (i = 0; i < ncols; i++) {
1371 for (j = i; j < total; j += ncols) {
1378static void add_double_lines(
int total,
int nlines,
double *mat0,
1380 int ncols = total / nlines, i;
1381 for (i = 0; i < ncols; i++) {
1385 for (j = i; j < total; j += ncols) {
1392static YAP_Bool matrix_agg_lines(
void) {
1395 YAP_Term top = YAP_ARG2;
1398 if (!YAP_IsIntTerm(top)) {
1401 op = YAP_IntOfTerm(top);
1402 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1408 if (mat[MAT_TYPE] == INT_MATRIX) {
1409 YAP_Int *data, *ndata;
1410 int dims = mat[MAT_NDIMS];
1413 tf = new_int_matrix(dims - 1, mat + (MAT_DIMS + 1), NULL);
1414 if (tf == YAP_TermNil())
1416 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1417 nmat = (
int *)YAP_BlobOfTerm(tf);
1418 data = matrix_long_data(mat, dims);
1419 ndata = matrix_long_data(nmat, dims - 1);
1420 if (op == MAT_PLUS) {
1421 add_int_lines(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1425 double *data, *ndata;
1426 int dims = mat[MAT_NDIMS];
1429 tf = new_float_matrix(dims - 1, mat + (MAT_DIMS + 1), NULL);
1430 nmat = (
int *)YAP_BlobOfTerm(tf);
1431 if (tf == YAP_TermNil())
1433 data = matrix_double_data(mat, dims);
1434 ndata = matrix_double_data(nmat, dims - 1);
1435 if (op == MAT_PLUS) {
1436 add_double_lines(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1440 return YAP_Unify(YAP_ARG3, tf);
1443static void add_int_cols(
int total,
int nlines, YAP_Int *mat0,
1445 int ncols = total / nlines, i, j = 0;
1446 for (i = 0; i < nlines; i++) {
1448 int max = (i + 1) * ncols;
1450 for (; j < max; j++) {
1457static void add_double_cols(
int total,
int nlines,
double *mat0,
double *matf) {
1458 int ncols = total / nlines, i, j = 0;
1459 for (i = 0; i < nlines; i++) {
1461 int max = (i + 1) * ncols;
1463 for (; j < max; j++) {
1470static YAP_Bool matrix_agg_cols(
void) {
1473 YAP_Term top = YAP_ARG2;
1476 if (!YAP_IsIntTerm(top)) {
1479 op = YAP_IntOfTerm(top);
1480 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1486 if (mat[MAT_TYPE] == INT_MATRIX) {
1487 YAP_Int *data, *ndata;
1488 int dims = mat[MAT_NDIMS];
1491 tf = new_int_matrix(1, mat + MAT_DIMS, NULL);
1492 if (tf == YAP_TermNil())
1494 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1495 nmat = (
int *)YAP_BlobOfTerm(tf);
1496 data = matrix_long_data(mat, dims);
1497 ndata = matrix_long_data(nmat, 1);
1498 if (op == MAT_PLUS) {
1499 add_int_cols(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1503 double *data, *ndata;
1504 int dims = mat[MAT_NDIMS];
1507 tf = new_float_matrix(1, mat + MAT_DIMS, NULL);
1508 if (tf == YAP_TermNil())
1510 nmat = (
int *)YAP_BlobOfTerm(tf);
1511 data = matrix_double_data(mat, dims);
1512 ndata = matrix_double_data(nmat, 1);
1513 if (op == MAT_PLUS) {
1514 add_double_cols(mat[MAT_SIZE], mat[MAT_DIMS], data, ndata);
1518 return YAP_Unify(YAP_ARG3, tf);
1521static void div_int_by_lines(
int total,
int nlines, YAP_Int *mat1,
1522 YAP_Int *mat2,
double *ndata) {
1523 int ncols = total / nlines, i;
1524 for (i = 0; i < total; i++) {
1525 ndata[i] = ((double)mat1[i]) / mat2[i % ncols];
1529static void div_int_by_dlines(
int total,
int nlines, YAP_Int *mat1,
1530 double *mat2,
double *ndata) {
1531 int ncols = total / nlines, i;
1532 for (i = 0; i < total; i++) {
1533 ndata[i] = mat1[i] / mat2[i % ncols];
1537static void div_float_long_by_lines(
int total,
int nlines,
double *mat1,
1538 YAP_Int *mat2,
double *ndata) {
1539 int ncols = total / nlines, i;
1540 for (i = 0; i < total; i++) {
1541 ndata[i] = mat1[i] / mat2[i % ncols];
1545static void div_float_by_lines(
int total,
int nlines,
double *mat1,
1546 double *mat2,
double *ndata) {
1547 int ncols = total / nlines, i;
1548 for (i = 0; i < total; i++) {
1549 ndata[i] = mat1[i] / mat2[i % ncols];
1553static YAP_Bool matrix_op_to_lines(
void) {
1555 YAP_Term top = YAP_ARG3;
1559 if (!YAP_IsIntTerm(top)) {
1562 op = YAP_IntOfTerm(top);
1563 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1568 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
1574 if (mat1[MAT_TYPE] == INT_MATRIX) {
1576 int dims = mat1[MAT_NDIMS];
1578 data1 = matrix_long_data(mat1, dims);
1580 if (mat2[MAT_TYPE] == INT_MATRIX) {
1581 YAP_Int *data2 = matrix_long_data(mat2, dims - 1);
1582 if (op == MAT_DIV) {
1585 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1586 if (tf == YAP_TermNil())
1588 nmat = YAP_BlobOfTerm(tf);
1589 ndata = matrix_double_data(nmat, dims);
1590 div_int_by_lines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
1594 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
1595 double *data2 = matrix_double_data(mat2, dims - 1);
1596 if (op == MAT_DIV) {
1599 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1600 if (tf == YAP_TermNil())
1602 nmat = YAP_BlobOfTerm(tf);
1603 ndata = matrix_double_data(nmat, dims);
1604 div_int_by_dlines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
1612 double *data1, *ndata;
1613 int dims = mat1[MAT_NDIMS];
1616 data1 = matrix_double_data(mat1, dims);
1617 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1618 nmat = YAP_BlobOfTerm(tf);
1619 if (tf == YAP_TermNil())
1621 ndata = matrix_double_data(nmat, dims);
1622 if (mat2[MAT_TYPE] == INT_MATRIX) {
1623 YAP_Int *data2 = matrix_long_data(mat2, dims - 1);
1624 if (op == MAT_DIV) {
1625 div_float_long_by_lines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2,
1630 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
1631 double *data2 = matrix_double_data(mat2, dims - 1);
1632 if (op == MAT_DIV) {
1633 div_float_by_lines(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
1641 return YAP_Unify(YAP_ARG4, tf);
1644static void matrix_long_add_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1648 for (i = 0; i < siz; i++) {
1649 nmat[i] = mat1[i] + mat2[i];
1653static void matrix_long_double_add_data(
double *nmat,
int siz, YAP_Int mat1[],
1657 for (i = 0; i < siz; i++) {
1658 nmat[i] = mat1[i] + mat2[i];
1662static void matrix_double_add_data(
double *nmat,
int siz,
double mat1[],
1666 for (i = 0; i < siz; i++) {
1667 nmat[i] = mat1[i] + mat2[i];
1671static void matrix_long_sub_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1675 for (i = 0; i < siz; i++) {
1676 nmat[i] = mat1[i] - mat2[i];
1680static void matrix_long_double_sub_data(
double *nmat,
int siz, YAP_Int mat1[],
1684 for (i = 0; i < siz; i++) {
1685 nmat[i] = mat1[i] - mat2[i];
1689static void matrix_long_double_rsub_data(
double *nmat,
int siz,
double mat1[],
1693 for (i = 0; i < siz; i++) {
1694 nmat[i] = mat2[i] - mat1[i];
1698static void matrix_double_sub_data(
double *nmat,
int siz,
double mat1[],
1702 for (i = 0; i < siz; i++) {
1703 nmat[i] = mat1[i] - mat2[i];
1707static void matrix_long_mult_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1711 for (i = 0; i < siz; i++) {
1712 nmat[i] = mat1[i] * mat2[i];
1716static void matrix_long_double_mult_data(
double *nmat,
int siz, YAP_Int mat1[],
1720 for (i = 0; i < siz; i++) {
1721 nmat[i] = mat1[i] * mat2[i];
1725static void matrix_double_mult_data(
double *nmat,
int siz,
double mat1[],
1729 for (i = 0; i < siz; i++) {
1730 nmat[i] = mat1[i] * mat2[i];
1734static void matrix_long_div_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1738 for (i = 0; i < siz; i++) {
1739 nmat[i] = mat1[i] / mat2[i];
1743static void matrix_long_double_div_data(
double *nmat,
int siz, YAP_Int mat1[],
1747 for (i = 0; i < siz; i++) {
1748 nmat[i] = mat1[i] / mat2[i];
1752static void matrix_long_double_div2_data(
double *nmat,
int siz,
double mat1[],
1756 for (i = 0; i < siz; i++) {
1757 nmat[i] = mat1[i] / mat2[i];
1761static void matrix_double_div_data(
double *nmat,
int siz,
double mat1[],
1765 for (i = 0; i < siz; i++) {
1766 nmat[i] = mat1[i] / mat2[i];
1770static void matrix_long_zdiv_data(YAP_Int *nmat,
int siz, YAP_Int mat1[],
1774 for (i = 0; i < siz; i++) {
1778 nmat[i] = mat1[i] / mat2[i];
1782static void matrix_long_double_zdiv_data(
double *nmat,
int siz, YAP_Int mat1[],
1786 for (i = 0; i < siz; i++) {
1790 nmat[i] = mat1[i] / mat2[i];
1794static void matrix_long_double_zdiv2_data(
double *nmat,
int siz,
double mat1[],
1798 for (i = 0; i < siz; i++) {
1802 nmat[i] = mat1[i] / mat2[i];
1806static void matrix_double_zdiv_data(
double *nmat,
int siz,
double mat1[],
1810 for (i = 0; i < siz; i++) {
1811 if (mat1[i] == 0.0) {
1814 nmat[i] = mat1[i] / mat2[i];
1819static YAP_Bool matrix_op(
void) {
1821 YAP_Term top = YAP_ARG3;
1823 YAP_Term tf = YAP_ARG4;
1826 if (!YAP_IsIntTerm(top)) {
1829 op = YAP_IntOfTerm(top);
1830 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1835 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
1840 if (tf == YAP_ARG1 || tf == YAP_ARG2) {
1843 if (mat1[MAT_TYPE] == INT_MATRIX) {
1845 int dims = mat1[MAT_NDIMS];
1847 data1 = matrix_long_data(mat1, dims);
1849 if (mat2[MAT_TYPE] == INT_MATRIX) {
1854 tf = new_int_matrix(dims, mat1 + MAT_DIMS, NULL);
1855 if (tf == YAP_TermNil()) {
1859 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1860 data1 = matrix_long_data(mat1, dims);
1861 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
1862 data2 = matrix_long_data(mat2, dims);
1864 nmat = YAP_BlobOfTerm(tf);
1865 ndata = matrix_long_data(nmat, dims);
1868 matrix_long_add_data(ndata, mat1[MAT_SIZE], data1, data2);
1871 matrix_long_sub_data(ndata, mat1[MAT_SIZE], data1, data2);
1874 matrix_long_mult_data(ndata, mat1[MAT_SIZE], data1, data2);
1877 matrix_long_div_data(ndata, mat1[MAT_SIZE], data1, data2);
1880 matrix_long_zdiv_data(ndata, mat1[MAT_SIZE], data1, data2);
1885 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
1890 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1891 if (tf == YAP_TermNil()) {
1895 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1896 data1 = matrix_long_data(mat1, dims);
1897 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
1898 data2 = matrix_double_data(mat2, dims);
1900 nmat = YAP_BlobOfTerm(tf);
1901 ndata = matrix_double_data(nmat, dims);
1904 matrix_long_double_add_data(ndata, mat1[MAT_SIZE], data1, data2);
1907 matrix_long_double_sub_data(ndata, mat1[MAT_SIZE], data1, data2);
1910 matrix_long_double_mult_data(ndata, mat1[MAT_SIZE], data1, data2);
1913 matrix_long_double_div_data(ndata, mat1[MAT_SIZE], data1, data2);
1916 matrix_long_double_zdiv_data(ndata, mat1[MAT_SIZE], data1, data2);
1926 int dims = mat1[MAT_NDIMS];
1928 data1 = matrix_double_data(mat1, dims);
1930 if (mat2[MAT_TYPE] == INT_MATRIX) {
1935 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1936 if (tf == YAP_TermNil()) {
1940 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1941 data1 = matrix_double_data(mat1, dims);
1942 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
1943 data2 = matrix_long_data(mat2, dims);
1945 nmat = YAP_BlobOfTerm(tf);
1946 ndata = matrix_double_data(nmat, dims);
1949 matrix_long_double_add_data(ndata, mat1[MAT_SIZE], data2, data1);
1952 matrix_long_double_rsub_data(ndata, mat1[MAT_SIZE], data1, data2);
1955 matrix_long_double_mult_data(ndata, mat1[MAT_SIZE], data2, data1);
1958 matrix_long_double_div2_data(ndata, mat1[MAT_SIZE], data1, data2);
1961 matrix_long_double_zdiv2_data(ndata, mat1[MAT_SIZE], data1, data2);
1966 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
1971 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
1972 if (tf == YAP_TermNil()) {
1976 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
1977 data1 = matrix_double_data(mat1, dims);
1978 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
1979 data2 = matrix_double_data(mat2, dims);
1981 nmat = YAP_BlobOfTerm(tf);
1982 ndata = matrix_double_data(nmat, dims);
1985 matrix_double_add_data(ndata, mat1[MAT_SIZE], data1, data2);
1988 matrix_double_sub_data(ndata, mat1[MAT_SIZE], data1, data2);
1991 matrix_double_mult_data(ndata, mat1[MAT_SIZE], data1, data2);
1994 matrix_double_div_data(ndata, mat1[MAT_SIZE], data1, data2);
1997 matrix_double_zdiv_data(ndata, mat1[MAT_SIZE], data1, data2);
2006 return YAP_Unify(YAP_ARG4, tf);
2009static void add_int_by_cols(
int total,
int nlines, YAP_Int *mat1,
2010 YAP_Int *mat2, YAP_Int *ndata) {
2011 int i, ncols = total / nlines;
2012 for (i = 0; i < total; i++) {
2013 ndata[i] = mat1[i] + mat2[i / ncols];
2017static void add_int_by_dcols(
int total,
int nlines, YAP_Int *mat1,
2018 double *mat2,
double *ndata) {
2019 int i, ncols = total / nlines;
2020 for (i = 0; i < total; i++) {
2021 ndata[i] = mat1[i] + mat2[i / ncols];
2025static void add_double_by_cols(
int total,
int nlines,
double *mat1,
2026 double *mat2,
double *ndata) {
2028 int ncols = total / nlines;
2030 for (i = 0; i < total; i++) {
2031 ndata[i] = mat1[i] + mat2[i / ncols];
2035static YAP_Bool matrix_op_to_cols(
void) {
2037 YAP_Term top = YAP_ARG3;
2041 if (!YAP_IsIntTerm(top)) {
2044 op = YAP_IntOfTerm(top);
2045 mat1 = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2050 mat2 = (
int *)YAP_BlobOfTerm(YAP_ARG2);
2055 if (mat1[MAT_TYPE] == INT_MATRIX) {
2057 int dims = mat1[MAT_NDIMS];
2059 data1 = matrix_long_data(mat1, dims);
2061 if (mat2[MAT_TYPE] == INT_MATRIX) {
2062 YAP_Int *data2 = matrix_long_data(mat2, 1);
2063 if (op == MAT_PLUS) {
2066 tf = new_int_matrix(dims, mat1 + MAT_DIMS, NULL);
2067 if (tf == YAP_TermNil())
2069 nmat = YAP_BlobOfTerm(tf);
2070 ndata = matrix_long_data(nmat, dims);
2071 add_int_by_cols(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
2075 }
else if (mat2[MAT_TYPE] == FLOAT_MATRIX) {
2076 double *data2 = matrix_double_data(mat2, 1);
2077 if (op == MAT_PLUS) {
2080 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
2081 if (tf == YAP_TermNil())
2083 nmat = YAP_BlobOfTerm(tf);
2084 ndata = matrix_double_data(nmat, dims);
2085 add_int_by_dcols(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
2093 double *data1, *data2, *ndata;
2094 int dims = mat1[MAT_NDIMS];
2097 if (mat2[MAT_TYPE] != FLOAT_MATRIX)
2099 tf = new_float_matrix(dims, mat1 + MAT_DIMS, NULL);
2100 if (tf == YAP_TermNil())
2102 nmat = YAP_BlobOfTerm(tf);
2103 data1 = matrix_double_data(mat1, dims);
2104 data2 = matrix_double_data(mat2, 1);
2105 ndata = matrix_double_data(nmat, dims);
2106 if (op == MAT_PLUS) {
2107 add_double_by_cols(mat1[MAT_SIZE], mat1[MAT_DIMS], data1, data2, ndata);
2111 return YAP_Unify(YAP_ARG4, tf);
2114static YAP_Bool matrix_op_to_all(
void) {
2117 YAP_Term top = YAP_ARG2;
2121 if (!YAP_IsIntTerm(top)) {
2124 op = YAP_IntOfTerm(top);
2125 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2130 if (YAP_IsVarTerm(YAP_ARG4)) {
2134 if (mat[MAT_TYPE] == INT_MATRIX) {
2136 int dims = mat[MAT_NDIMS];
2138 YAP_Term tnum = YAP_ARG3;
2140 if (YAP_IsIntTerm(tnum)) {
2144 num = YAP_IntOfTerm(tnum);
2145 data = matrix_long_data(mat, dims);
2147 tf = new_int_matrix(dims, mat + (MAT_DIMS), NULL);
2148 if (tf == YAP_TermNil())
2150 nmat = (
int *)YAP_BlobOfTerm(tf);
2151 ndata = matrix_long_data(nmat, dims);
2156 if (op == MAT_PLUS) {
2159 for (i = 0; i < mat[MAT_SIZE]; i++) {
2160 ndata[i] = data[i] + num;
2162 }
else if (op == MAT_TIMES) {
2165 for (i = 0; i < mat[MAT_SIZE]; i++) {
2166 ndata[i] = data[i] * num;
2171 }
else if (YAP_IsFloatTerm(tnum)) {
2175 num = YAP_FloatOfTerm(tnum);
2177 tf = new_float_matrix(dims, mat + (MAT_DIMS), NULL);
2178 if (tf == YAP_TermNil())
2180 nmat = (
int *)YAP_BlobOfTerm(tf);
2181 ndata = matrix_double_data(nmat, dims);
2185 data = matrix_long_data(mat, dims);
2186 if (op == MAT_PLUS) {
2189 for (i = 0; i < mat[MAT_SIZE]; i++) {
2190 ndata[i] = data[i] + num;
2192 }
else if (op == MAT_SUB) {
2195 for (i = 0; i < mat[MAT_SIZE]; i++) {
2196 ndata[i] = num - data[i];
2198 }
else if (op == MAT_TIMES) {
2201 for (i = 0; i < mat[MAT_SIZE]; i++) {
2202 ndata[i] = data[i] * num;
2204 }
else if (op == MAT_DIV) {
2207 for (i = 0; i < mat[MAT_SIZE]; i++) {
2208 ndata[i] = data[i] / num;
2215 double *data, *ndata;
2216 int dims = mat[MAT_NDIMS];
2218 YAP_Term tnum = YAP_ARG3;
2221 if (YAP_IsFloatTerm(tnum)) {
2222 num = YAP_FloatOfTerm(tnum);
2223 }
else if (!YAP_IntOfTerm(tnum)) {
2228 num = (double)YAP_IntOfTerm(tnum);
2230 data = matrix_double_data(mat, dims);
2232 tf = new_float_matrix(dims, mat + (MAT_DIMS), NULL);
2233 if (tf == YAP_TermNil())
2235 nmat = (
int *)YAP_BlobOfTerm(tf);
2236 ndata = matrix_double_data(nmat, dims);
2245 for (i = 0; i < mat[MAT_SIZE]; i++) {
2246 ndata[i] = data[i] + num;
2252 for (i = 0; i < mat[MAT_SIZE]; i++) {
2253 ndata[i] = num - data[i];
2259 for (i = 0; i < mat[MAT_SIZE]; i++) {
2260 ndata[i] = data[i] * num;
2266 for (i = 0; i < mat[MAT_SIZE]; i++) {
2267 ndata[i] = data[i] / num;
2275 return YAP_Unify(YAP_ARG4, tf);
2276 return YAP_Unify(YAP_ARG4, YAP_ARG1);
2282static YAP_Bool matrix_transpose(
void) {
2283 int ndims, i, *dims, *dimsn;
2284 int conv[MAX_DIMS], indx[MAX_DIMS], nindx[MAX_DIMS];
2286 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2291 ndims = mat[MAT_NDIMS];
2292 if (mat[MAT_TYPE] == INT_MATRIX) {
2294 tf = new_int_matrix(ndims, mat + MAT_DIMS, NULL);
2295 if (tf == YAP_TermNil())
2299 tf = new_float_matrix(ndims, mat + MAT_DIMS, NULL);
2300 if (tf == YAP_TermNil())
2304 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2305 nmat = (
int *)YAP_BlobOfTerm(tf);
2306 dims = mat + MAT_DIMS;
2307 dimsn = nmat + MAT_DIMS;
2310 for (i = 0; i < ndims; i++) {
2314 if (!YAP_IsPairTerm(tconv))
2316 th = YAP_HeadOfTerm(tconv);
2317 if (!YAP_IsIntTerm(th))
2319 conv[i] = j = YAP_IntOfTerm(th);
2321 tconv = YAP_TailOfTerm(tconv);
2327 if (mat[MAT_TYPE] == INT_MATRIX) {
2328 YAP_Int *data = matrix_long_data(mat, ndims);
2330 for (i = 0; i < mat[MAT_SIZE]; i++) {
2331 YAP_Int x = data[i];
2337 matrix_get_index(mat, i, indx);
2338 for (j = 0; j < ndims; j++) {
2339 nindx[j] = indx[conv[j]];
2341 matrix_long_set(nmat, nindx, x);
2344 double *data = matrix_double_data(mat, ndims);
2346 for (i = 0; i < mat[MAT_SIZE]; i++) {
2350 matrix_get_index(mat, i, indx);
2351 for (j = 0; j < ndims; j++)
2352 nindx[j] = indx[conv[j]];
2353 matrix_float_set(nmat, nindx, x);
2356 return YAP_Unify(YAP_ARG3, tf);
2362static YAP_Bool matrix_select(
void) {
2363 int ndims, i, j, newdims, prdim, leftarg, *dims, indx[MAX_DIMS];
2364 int nindx[MAX_DIMS];
2365 YAP_Term tpdim, tdimarg, tf;
2366 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2373 ndims = mat[MAT_NDIMS];
2374 dims = mat + MAT_DIMS;
2375 if (!YAP_IsIntTerm(tpdim)) {
2378 prdim = YAP_IntOfTerm(tpdim);
2380 if (!YAP_IsIntTerm(tdimarg)) {
2383 leftarg = YAP_IntOfTerm(tdimarg);
2384 for (i = 0, j = 0; i < ndims; i++) {
2390 newdims = ndims - 1;
2391 if (mat[MAT_TYPE] == INT_MATRIX) {
2392 YAP_Int *data, *ndata;
2395 tf = new_int_matrix(newdims, nindx, NULL);
2396 if (tf == YAP_TermNil())
2399 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2400 nmat = (
int *)YAP_BlobOfTerm(tf);
2401 data = matrix_long_data(mat, ndims);
2402 ndata = matrix_long_data(nmat, newdims);
2404 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2410 matrix_get_index(nmat, i, indx);
2411 for (j = 0, k = 0; j < newdims; j++, k++) {
2421 ndata[i] = data[matrix_get_offset(mat, nindx)];
2424 double *data, *ndata;
2427 tf = new_float_matrix(newdims, nindx, NULL);
2428 if (tf == YAP_TermNil())
2431 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2432 nmat = (
int *)YAP_BlobOfTerm(tf);
2433 data = matrix_double_data(mat, ndims);
2434 ndata = matrix_double_data(nmat, newdims);
2436 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2442 matrix_get_index(nmat, i, indx);
2443 for (j = 0, k = 0; j < newdims; j++, k++) {
2453 ndata[i] = data[matrix_get_offset(mat, nindx)];
2456 return YAP_Unify(YAP_ARG4, tf);
2461static YAP_Bool matrix_column(
void) {
2462 int size, i, ndims, newdims[1];
2464 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2471 ndims = mat[MAT_NDIMS];
2474 for (i = 1; i < ndims; i++) {
2477 if (!YAP_IsPairTerm(tconv))
2479 th = YAP_HeadOfTerm(tconv);
2480 if (!YAP_IsIntTerm(th))
2482 indx[i] = YAP_IntOfTerm(th);
2483 tconv = YAP_TailOfTerm(tconv);
2485 if (tconv != YAP_TermNil())
2487 newdims[0] = size = mat[MAT_DIMS];
2488 if (mat[MAT_TYPE] == INT_MATRIX) {
2489 YAP_Int *data, *ndata;
2492 tf = new_int_matrix(1, newdims, NULL);
2493 if (tf == YAP_TermNil())
2496 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2497 nmat = (
int *)YAP_BlobOfTerm(tf);
2498 data = matrix_long_data(mat, ndims);
2499 ndata = matrix_long_data(nmat, 1);
2501 for (i = 0; i < size; i++) {
2503 ndata[i] = data[matrix_get_offset(mat, indx)];
2506 double *data, *ndata;
2509 tf = new_float_matrix(1, newdims, NULL);
2510 if (tf == YAP_TermNil())
2513 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2514 nmat = (
int *)YAP_BlobOfTerm(tf);
2515 data = matrix_double_data(mat, ndims);
2516 ndata = matrix_double_data(nmat, 1);
2518 for (i = 0; i < size; i++) {
2520 ndata[i] = data[matrix_get_offset(mat, indx)];
2523 return YAP_Unify(YAP_ARG3, tf);
2528static YAP_Bool matrix_sum_out(
void) {
2529 int ndims, i, j, newdims, prdim;
2530 int indx[MAX_DIMS], nindx[MAX_DIMS];
2532 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2539 ndims = mat[MAT_NDIMS];
2540 if (!YAP_IsIntTerm(tpdim)) {
2543 prdim = YAP_IntOfTerm(tpdim);
2544 newdims = ndims - 1;
2545 for (i = 0, j = 0; i < ndims; i++) {
2547 nindx[j] = (mat + MAT_DIMS)[i];
2551 if (mat[MAT_TYPE] == INT_MATRIX) {
2552 YAP_Int *data, *ndata;
2555 tf = new_int_matrix(newdims, nindx, NULL);
2556 if (tf == YAP_TermNil())
2559 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2560 nmat = (
int *)YAP_BlobOfTerm(tf);
2561 data = matrix_long_data(mat, ndims);
2562 ndata = matrix_long_data(nmat, newdims);
2564 for (i = 0; i < nmat[MAT_SIZE]; i++)
2566 for (i = 0; i < mat[MAT_SIZE]; i++) {
2572 matrix_get_index(mat, i, indx);
2573 for (j = 0, k = 0; j < ndims; j++) {
2575 nindx[k++] = indx[j];
2578 ndata[matrix_get_offset(nmat, nindx)] += data[i];
2581 double *data, *ndata;
2584 tf = new_float_matrix(newdims, nindx, NULL);
2585 if (tf == YAP_TermNil())
2588 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2589 nmat = (
int *)YAP_BlobOfTerm(tf);
2590 data = matrix_double_data(mat, ndims);
2591 ndata = matrix_double_data(nmat, newdims);
2593 for (i = 0; i < nmat[MAT_SIZE]; i++)
2595 for (i = 0; i < mat[MAT_SIZE]; i++) {
2601 matrix_get_index(mat, i, indx);
2602 for (j = 0, k = 0; j < ndims; j++) {
2604 nindx[k++] = indx[j];
2607 ndata[matrix_get_offset(nmat, nindx)] += data[i];
2610 return YAP_Unify(YAP_ARG3, tf);
2615static YAP_Bool matrix_sum_out_several(
void) {
2616 int ndims, i, *dims, newdims;
2617 int indx[MAX_DIMS], nindx[MAX_DIMS], conv[MAX_DIMS];
2619 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2624 ndims = mat[MAT_NDIMS];
2625 dims = mat + MAT_DIMS;
2628 for (i = 0, newdims = 0; i < ndims; i++) {
2631 if (!YAP_IsPairTerm(tconv))
2633 th = YAP_HeadOfTerm(tconv);
2634 if (!YAP_IsIntTerm(th))
2636 conv[i] = YAP_IntOfTerm(th);
2638 nindx[newdims++] = dims[i];
2640 tconv = YAP_TailOfTerm(tconv);
2642 if (mat[MAT_TYPE] == INT_MATRIX) {
2643 YAP_Int *data, *ndata;
2646 tf = new_int_matrix(newdims, nindx, NULL);
2647 if (tf == YAP_TermNil())
2650 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2651 nmat = (
int *)YAP_BlobOfTerm(tf);
2652 data = matrix_long_data(mat, ndims);
2653 ndata = matrix_long_data(nmat, newdims);
2655 for (i = 0; i < nmat[MAT_SIZE]; i++)
2657 for (i = 0; i < mat[MAT_SIZE]; i++) {
2663 matrix_get_index(mat, i, indx);
2664 for (j = 0, k = 0; j < ndims; j++) {
2666 nindx[k++] = indx[j];
2669 ndata[matrix_get_offset(nmat, nindx)] =
2670 log(exp(ndata[matrix_get_offset(nmat, nindx)]) + exp(data[i]));
2673 double *data, *ndata;
2676 tf = new_float_matrix(newdims, nindx, NULL);
2677 if (tf == YAP_TermNil())
2680 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2681 nmat = (
int *)YAP_BlobOfTerm(tf);
2682 data = matrix_double_data(mat, ndims);
2683 ndata = matrix_double_data(nmat, newdims);
2685 for (i = 0; i < nmat[MAT_SIZE]; i++)
2687 for (i = 0; i < mat[MAT_SIZE]; i++) {
2693 matrix_get_index(mat, i, indx);
2694 for (j = 0, k = 0; j < ndims; j++) {
2696 nindx[k++] = indx[j];
2699 ndata[matrix_get_offset(nmat, nindx)] =
2700 log(exp(ndata[matrix_get_offset(nmat, nindx)]) + exp(data[i]));
2703 return YAP_Unify(YAP_ARG3, tf);
2708static YAP_Bool matrix_sum_out_logs(
void) {
2709 int ndims, i, j, *dims, newdims, prdim;
2710 int nindx[MAX_DIMS];
2712 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2719 ndims = mat[MAT_NDIMS];
2720 dims = mat + MAT_DIMS;
2721 if (!YAP_IsIntTerm(tpdim)) {
2724 prdim = YAP_IntOfTerm(tpdim);
2725 newdims = ndims - 1;
2726 for (i = 0, j = 0; i < ndims; i++) {
2732 if (mat[MAT_TYPE] == INT_MATRIX) {
2733 YAP_Int *data, *ndata;
2734 int d = 1, j = 0, dd = 1;
2737 tf = new_int_matrix(newdims, nindx, NULL);
2738 if (tf == YAP_TermNil())
2741 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2742 nmat = (
int *)YAP_BlobOfTerm(tf);
2743 data = matrix_long_data(mat, ndims);
2744 ndata = matrix_long_data(nmat, newdims);
2749 dd = d * dims[prdim];
2750 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2751 int j = i % d + (i / dd) * d;
2752 ndata[j] = exp(data[i]);
2754 for (; i < mat[MAT_SIZE]; i++) {
2755 int j = i % d + (i / dd) * d;
2756 ndata[j] += exp(data[i]);
2758 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2759 ndata[i] = log(ndata[i]);
2762 double *data, *ndata;
2763 int d = 1, j = 0, dd = 1;
2766 tf = new_float_matrix(newdims, nindx, NULL);
2767 if (tf == YAP_TermNil())
2770 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2771 nmat = (
int *)YAP_BlobOfTerm(tf);
2772 data = matrix_double_data(mat, ndims);
2773 ndata = matrix_double_data(nmat, newdims);
2780 dd = d * dims[prdim];
2781 memset(ndata, 0,
sizeof(
double) * nmat[MAT_SIZE]);
2782 for (i = 0; i < mat[MAT_SIZE]; i++) {
2783 YAP_Int k = i % d + (i / dd) * d;
2784 ndata[k] += exp(data[i]);
2786 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2787 ndata[i] = log(ndata[i]);
2790 return YAP_Unify(YAP_ARG3, tf);
2795static YAP_Bool matrix_sum_out_logs_several(
void) {
2796 int ndims, i, *dims, newdims;
2797 int indx[MAX_DIMS], nindx[MAX_DIMS], conv[MAX_DIMS];
2799 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2805 ndims = mat[MAT_NDIMS];
2806 dims = mat + MAT_DIMS;
2809 for (i = 0, newdims = 0; i < ndims; i++) {
2812 if (!YAP_IsPairTerm(tconv))
2814 th = YAP_HeadOfTerm(tconv);
2815 if (!YAP_IsIntTerm(th))
2817 conv[i] = YAP_IntOfTerm(th);
2819 nindx[newdims++] = dims[i];
2821 tconv = YAP_TailOfTerm(tconv);
2823 if (mat[MAT_TYPE] == INT_MATRIX) {
2824 YAP_Int *data, *ndata;
2827 tf = new_int_matrix(newdims, nindx, NULL);
2828 if (tf == YAP_TermNil())
2831 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2832 nmat = (
int *)YAP_BlobOfTerm(tf);
2833 data = matrix_long_data(mat, ndims);
2834 ndata = matrix_long_data(nmat, newdims);
2836 for (i = 0; i < nmat[MAT_SIZE]; i++)
2838 for (i = 0; i < mat[MAT_SIZE]; i++) {
2844 matrix_get_index(mat, i, indx);
2845 for (j = 0, k = 0; j < ndims; j++) {
2847 nindx[k++] = indx[j];
2850 ndata[matrix_get_offset(nmat, nindx)] += exp(data[i]);
2853 double *data, *ndata;
2856 tf = new_float_matrix(newdims, nindx, NULL);
2857 if (tf == YAP_TermNil())
2860 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2861 nmat = (
int *)YAP_BlobOfTerm(tf);
2862 data = matrix_double_data(mat, ndims);
2863 ndata = matrix_double_data(nmat, newdims);
2865 for (i = 0; i < nmat[MAT_SIZE]; i++)
2867 for (i = 0; i < mat[MAT_SIZE]; i++) {
2873 matrix_get_index(mat, i, indx);
2874 for (j = 0, k = 0; j < ndims; j++) {
2876 nindx[k++] = indx[j];
2879 ndata[matrix_get_offset(nmat, nindx)] += exp(data[i]);
2881 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2882 ndata[i] = log(ndata[i]);
2885 return YAP_Unify(YAP_ARG3, tf);
2891static YAP_Bool matrix_expand(
void) {
2892 int ndims, i, *dims, newdims = 0, olddims = 0;
2893 int new[MAX_DIMS], indx[MAX_DIMS], nindx[MAX_DIMS];
2895 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2902 ndims = mat[MAT_NDIMS];
2903 dims = mat + MAT_DIMS;
2904 for (i = 0; i < MAX_DIMS; i++) {
2908 if (!YAP_IsPairTerm(tconv)) {
2909 if (tconv != YAP_TermNil())
2913 th = YAP_HeadOfTerm(tconv);
2914 if (!YAP_IsIntTerm(th))
2917 j = YAP_IntOfTerm(th);
2920 nindx[i] = dims[olddims];
2926 tconv = YAP_TailOfTerm(tconv);
2928 if (olddims != ndims)
2930 if (mat[MAT_TYPE] == INT_MATRIX) {
2931 YAP_Int *data, *ndata;
2934 tf = new_int_matrix(newdims, nindx, NULL);
2935 if (tf == YAP_TermNil())
2938 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2939 nmat = (
int *)YAP_BlobOfTerm(tf);
2940 data = matrix_long_data(mat, ndims);
2941 ndata = matrix_long_data(nmat, newdims);
2943 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2949 matrix_get_index(nmat, i, indx);
2950 for (j = 0; j < newdims; j++) {
2952 nindx[k++] = indx[j];
2954 ndata[i] = data[matrix_get_offset(mat, nindx)];
2957 double *data, *ndata;
2960 tf = new_float_matrix(newdims, nindx, NULL);
2961 if (tf == YAP_TermNil())
2964 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
2965 nmat = (
int *)YAP_BlobOfTerm(tf);
2966 data = matrix_double_data(mat, ndims);
2967 ndata = matrix_double_data(nmat, newdims);
2969 for (i = 0; i < newdims; i++)
2971 for (i = 0; i < nmat[MAT_SIZE]; i++) {
2977 for (j = 0; j < newdims; j++) {
2979 nindx[k++] = indx[j];
2981 ndata[i] = data[matrix_get_offset(mat, nindx)];
2982 matrix_next_index(nmat + MAT_DIMS, newdims, indx);
2985 return YAP_Unify(YAP_ARG3, tf);
2991static YAP_Bool matrix_set_all_that_disagree(
void) {
2992 int ndims, i, *dims;
2995 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1), *nmat;
2996 int dim = YAP_IntOfTerm(YAP_ARG2);
2997 int pos = YAP_IntOfTerm(YAP_ARG3);
3003 ndims = mat[MAT_NDIMS];
3004 dims = mat + MAT_DIMS;
3005 if (mat[MAT_TYPE] == INT_MATRIX) {
3006 YAP_Int *data, *ndata, val;
3009 tf = new_int_matrix(ndims, dims, NULL);
3010 if (tf == YAP_TermNil())
3013 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
3014 nmat = (
int *)YAP_BlobOfTerm(tf);
3015 data = matrix_long_data(mat, ndims);
3016 ndata = matrix_long_data(nmat, ndims);
3017 if (!YAP_IsIntTerm(YAP_ARG4))
3019 val = YAP_IntOfTerm(YAP_ARG4);
3021 for (i = 0; i < nmat[MAT_SIZE]; i++) {
3027 matrix_get_index(mat, i, indx);
3028 if (indx[dim] != pos)
3034 double *data, *ndata, val;
3037 tf = new_float_matrix(ndims, dims, NULL);
3038 if (tf == YAP_TermNil())
3041 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
3042 nmat = (
int *)YAP_BlobOfTerm(tf);
3043 data = matrix_double_data(mat, ndims);
3044 ndata = matrix_double_data(nmat, ndims);
3045 if (YAP_IsFloatTerm(YAP_ARG4))
3046 val = YAP_FloatOfTerm(YAP_ARG4);
3047 else if (YAP_IsIntTerm(YAP_ARG4))
3048 val = YAP_IntOfTerm(YAP_ARG4);
3052 for (i = 0; i < nmat[MAT_SIZE]; i++) {
3058 matrix_get_index(mat, i, indx);
3059 if (indx[dim] != pos)
3065 return YAP_Unify(YAP_ARG5, tf);
3068static YAP_Bool matrix_m(
void) {
3071 int *mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
3074 return YAP_Unify(YAP_ARG1, YAP_ARG2);
3076 ndims = mat[MAT_NDIMS];
3077 size = mat[MAT_SIZE];
3078 tm = YAP_MkNewApplTerm(FunctorM, 5);
3079 tp = YAP_ArgsOfTerm(tm);
3080 tp[0] = mk_int_list(ndims, mat + MAT_DIMS);
3081 tp[1] = YAP_MkIntTerm(ndims);
3082 tp[2] = YAP_MkIntTerm(size);
3083 tp[3] = mk_rep_int_list(ndims, mat[MAT_BASE]);
3084 tp[4] = YAP_MkNewApplTerm(YAP_MkFunctor(AtomC, size), size);
3085 tp = YAP_ArgsOfTerm(tp[3]);
3086 if (mat[MAT_TYPE] == INT_MATRIX) {
3090 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
3091 data = matrix_long_data(mat, ndims);
3092 for (i = 0; i < mat[MAT_SIZE]; i++) {
3093 tp[i] = YAP_MkIntTerm(data[i]);
3099 mat = (
int *)YAP_BlobOfTerm(YAP_ARG1);
3100 data = matrix_double_data(mat, ndims);
3101 for (i = 0; i < mat[MAT_SIZE]; i++) {
3102 tp[i] = YAP_MkFloatTerm(data[i]);
3105 return YAP_Unify(YAP_ARG2, tm);
3108static YAP_Bool is_matrix(
void) {
3109 YAP_Term t = YAP_ARG1;
3110 int *mat = (
int *)YAP_BlobOfTerm(t);
3113 if (!YAP_IsApplTerm(t))
3115 return YAP_FunctorOfTerm(t) == FunctorM;
3120static YAP_Bool get_float_from_address(
void) {
3121 YAP_Float *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3122 YAP_Int off = YAP_IntOfTerm(YAP_ARG2);
3124 return YAP_Unify(YAP_ARG3, YAP_MkFloatTerm(fp[off]));
3127static YAP_Bool set_float_from_address(
void) {
3128 YAP_Float f, *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3129 YAP_Int off = YAP_IntOfTerm(YAP_ARG2);
3130 if (YAP_IsIntTerm(YAP_ARG3)) {
3131 f = YAP_IntOfTerm(YAP_ARG3);
3133 f = YAP_FloatOfTerm(YAP_ARG3);
3141static YAP_Bool address_op_to_all(
void) {
3142 YAP_Term top = YAP_ARG3;
3145 YAP_Float *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3146 YAP_Int sz = YAP_IntOfTerm(YAP_ARG2);
3147 if (!YAP_IsIntTerm(top)) {
3150 op = YAP_IntOfTerm(top);
3151 YAP_Term tnum = YAP_ARG4;
3154 if (YAP_IsFloatTerm(tnum)) {
3155 num = YAP_FloatOfTerm(tnum);
3156 }
else if (!YAP_IntOfTerm(tnum)) {
3159 num = (double)YAP_IntOfTerm(tnum);
3165 for (i = 0; i < sz; i++) {
3166 fp[i] = fp[i] + num;
3172 for (i = 0; i < sz; i++) {
3173 fp[i] = num - fp[i];
3179 for (i = 0; i < sz; i++) {
3180 fp[i] = fp[i] * num;
3186 for (i = 0; i < sz; i++) {
3187 fp[i] = fp[i] / num;
3196static YAP_Bool address_to_list(
void) {
3197 YAP_Term t = YAP_TermNil();
3199 YAP_Float *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3200 YAP_Int sz = YAP_IntOfTerm(YAP_ARG2);
3201 for (i = 0; i< sz; i++)
3202 t = YAP_MkPairTerm(YAP_MkFloatTerm(fp[sz-i-1]),t);
3203 return YAP_Unify(YAP_ARG3, t);
3206static YAP_Bool address_to_max(
void) {
3208 YAP_Float *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3209 YAP_Int sz = YAP_IntOfTerm(YAP_ARG2);
3210 YAP_Float max = fp[0];
3211 for (i = 1; i< sz; i++)
3212 if (fp[i] > max) max = fp[i];
3213 return YAP_Unify(YAP_ARG3, YAP_MkFloatTerm(max));
3216static YAP_Bool address_to_min(
void) {
3218 YAP_Float *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3219 YAP_Int sz = YAP_IntOfTerm(YAP_ARG2);
3220 YAP_Float min = fp[0];
3221 for (i = 1; i< sz; i++)
3222 if (fp[i] < min) min = fp[i];
3223 return YAP_Unify(YAP_ARG3, YAP_MkFloatTerm(min));
3226static YAP_Bool address_set_all(
void) {
3228 YAP_Float f, *fp = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3229 YAP_Int sz = YAP_IntOfTerm(YAP_ARG2);
3230 if (YAP_IsFloatTerm(YAP_ARG3)) {
3231 f = YAP_FloatOfTerm(YAP_ARG3);
3233 f = YAP_IntOfTerm(YAP_ARG3);
3235 for (i = 0; i< sz; i++)
3240static YAP_Bool address_to_sum(
void) {
3241 YAP_Term t = YAP_TermNil();
3243 YAP_Float *data = (YAP_Float *)YAP_IntOfTerm(YAP_ARG1);
3244 YAP_Int sz = YAP_IntOfTerm(YAP_ARG2);
3248 for (i = 0; i < sz; i++) {
3249 double y = data[i] - c;
3258 t = YAP_MkFloatTerm(sum);
3259 return YAP_Unify(YAP_ARG3, t);
3264X_API
void init_matrix(
void);
3266X_API
void init_matrix(
void) {
3267 AtomC = YAP_LookupAtom(
"c");
3268 FunctorM = YAP_MkFunctor(YAP_LookupAtom(
"$matrix"), 5);
3269 FunctorFloats = YAP_MkFunctor(YAP_LookupAtom(
"floats"), 2);
3271 YAP_UserCPredicate(
"new_ints_matrix", new_ints_matrix, 4);
3272 YAP_UserCPredicate(
"new_ints_matrix_set", new_ints_matrix_set, 4);
3273 YAP_UserCPredicate(
"new_floats_matrix", new_floats_matrix, 4);
3274 YAP_UserCPredicate(
"new_floats_matrix_set", new_floats_matrix_set, 4);
3275 YAP_UserCPredicate(
"matrix_set", matrix_set, 3);
3276 YAP_UserCPredicate(
"matrix_set", matrix_set2, 2);
3277 YAP_UserCPredicate(
"matrix_set_all", matrix_set_all, 2);
3278 YAP_UserCPredicate(
"matrix_add", matrix_add, 3);
3279 YAP_UserCPredicate(
"matrix_get", matrix_get, 3);
3280 YAP_UserCPredicate(
"matrix_get", do_matrix_access2, 2);
3281 YAP_UserCPredicate(
"matrix_inc", do_matrix_inc, 2);
3282 YAP_UserCPredicate(
"matrix_dec", do_matrix_dec, 2);
3283 YAP_UserCPredicate(
"matrix_inc", do_matrix_inc2, 3);
3284 YAP_UserCPredicate(
"matrix_dec", do_matrix_dec2, 3);
3285 YAP_UserCPredicate(
"matrixn_to_list", matrix_to_list, 2);
3286 YAP_UserCPredicate(
"matrixn_set_base", matrix_set_base, 2);
3287 YAP_UserCPredicate(
"matrixn_dims", matrix_dims, 2);
3288 YAP_UserCPredicate(
"matrixn_dims", matrix_dims3, 3);
3289 YAP_UserCPredicate(
"matrixn_ndims", matrix_ndims, 2);
3290 YAP_UserCPredicate(
"matrixn_size", matrix_size, 2);
3291 YAP_UserCPredicate(
"matrix_type_as_number", matrix_type, 2);
3292 YAP_UserCPredicate(
"matrixn_arg_to_offset", matrix_arg_to_offset, 3);
3293 YAP_UserCPredicate(
"matrixn_offset_to_arg", matrix_offset_to_arg, 3);
3294 YAP_UserCPredicate(
"matrixn_max", matrix_max, 2);
3295 YAP_UserCPredicate(
"matrixn_maxarg", matrix_maxarg, 2);
3296 YAP_UserCPredicate(
"matrixn_min", matrix_min, 2);
3297 YAP_UserCPredicate(
"matrixn_minarg", matrix_minarg, 2);
3298 YAP_UserCPredicate(
"matrix_sum", matrix_sum, 2);
3299 YAP_UserCPredicate(
"matrix_shuffle", matrix_transpose, 3);
3300 YAP_UserCPredicate(
"matrix_expand", matrix_expand, 3);
3301 YAP_UserCPredicate(
"matrix_select", matrix_select, 4);
3302 YAP_UserCPredicate(
"matrix_column", matrix_column, 3);
3303 YAP_UserCPredicate(
"matrix_to_logs", matrix_log_all, 1);
3304 YAP_UserCPredicate(
"matrix_to_exps", matrix_exp_all, 1);
3305 YAP_UserCPredicate(
"matrix_to_exps2", matrix_exp2_all, 1);
3306 YAP_UserCPredicate(
"matrixn_to_logs", matrix_log_all2, 2);
3307 YAP_UserCPredicate(
"matrixn_to_exps", matrix_exp_all2, 2);
3308 YAP_UserCPredicate(
"matrix_sum_out", matrix_sum_out, 3);
3309 YAP_UserCPredicate(
"matrix_sum_out_several", matrix_sum_out_several, 3);
3310 YAP_UserCPredicate(
"matrix_sum_logs_out", matrix_sum_out_logs, 3);
3311 YAP_UserCPredicate(
"matrix_sum_logs_out_several", matrix_sum_out_logs_several,
3313 YAP_UserCPredicate(
"matrix_set_all_that_disagree",
3314 matrix_set_all_that_disagree, 5);
3315 YAP_UserCPredicate(
"do_matrix_op", matrix_op, 4);
3316 YAP_UserCPredicate(
"do_matrix_agg_lines", matrix_agg_lines, 3);
3317 YAP_UserCPredicate(
"do_matrix_agg_cols", matrix_agg_cols, 3);
3318 YAP_UserCPredicate(
"do_matrix_op_to_all", matrix_op_to_all, 4);
3319 YAP_UserCPredicate(
"do_matrix_op_to_lines", matrix_op_to_lines, 4);
3320 YAP_UserCPredicate(
"do_matrix_op_to_cols", matrix_op_to_cols, 4);
3321 YAP_UserCPredicate(
"matrix_m", matrix_m, 2);
3322 YAP_UserCPredicate(
"matrix", is_matrix, 1);
3323 YAP_UserCPredicate(
"get_float_from_address", get_float_from_address, 3);
3324 YAP_UserCPredicate(
"set_float_from_address", set_float_from_address, 3);
3325 YAP_UserCPredicate(
"address_to_list", address_to_list, 3);
3326 YAP_UserCPredicate(
"address_to_sum", address_to_sum, 3);
3327 YAP_UserCPredicate(
"address_to_min", address_to_min, 3);
3328 YAP_UserCPredicate(
"address_to_max", address_to_max, 3);
3329 YAP_UserCPredicate(
"address_set_all", address_set_all, 3);
3330 YAP_UserCPredicate(
"address_op_to_all", address_op_to_all, 3);}
3334int WINAPI win_matrixs(HANDLE, DWORD, LPVOID);
3336int WINAPI win_matrixs(HANDLE hinst, DWORD reason, LPVOID reserved) {
3338 case DLL_PROCESS_ATTACH:
3340 case DLL_PROCESS_DETACH:
3342 case DLL_THREAD_ATTACH:
3344 case DLL_THREAD_DETACH: