From e72ce435d9f68e4cee544af1037e637c28622c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Mon, 21 Jun 2010 17:12:45 +0100 Subject: [PATCH] fix confusion --- library/matrices.yap | 94 -- library/matrices/Makefile.in | 60 -- library/matrices/matrices.c | 150 --- library/matrices/matrix.c | 1755 ---------------------------------- 4 files changed, 2059 deletions(-) delete mode 100644 library/matrices.yap delete mode 100644 library/matrices/Makefile.in delete mode 100644 library/matrices/matrices.c delete mode 100644 library/matrices/matrix.c diff --git a/library/matrices.yap b/library/matrices.yap deleted file mode 100644 index 39329f1c0..000000000 --- a/library/matrices.yap +++ /dev/null @@ -1,94 +0,0 @@ -/************************************************************************* -* * -* YAP Prolog * -* * -* Yap Prolog was developed at NCCUP - Universidade do Porto * -* * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2006 * -* * -************************************************************************** -* * -* File: matrices.yap * -* Last rev: * -* mods: * -* comments: Have some fun with blobs * -* * -*************************************************************************/ - -/* - A matrix is an object with integer or floating point numbers. A matrix - may have a number of dimensions. These routines implement a number of - routine manipulation procedures. - - matrix(Type,D1,D2,...,Dn,data(......)) - - Type = int, float - */ - -:- module( matrices, - [ - matrix_new/4, - matrix_dim/2, - matrix_type/2, - matrix_max/2, - matrix_add/3]). - -:- use_module(library_lists, - [append/3]). - -matrix_new(Type,Dims,Data,Matrix) :- - PackedData =.. [data|Data], - append([Type,Dims],PackedData,MatInfo), - Matrix =.. [matrix|MatInfo]. - -matrix_dim(Matrix,Dim) :- - functor(Matrix,matrix,Arity), - Dim is Arity-2. - -matrix_type(Matrix,Type) :- - arg(1, Matrix, Type). - Dim is Arity-2. - -matrix_max(Matrix,Max) :- - arg(1, Matrix, Type). - typed_matrix_max(Type, Matrix, Max). - -typed_matrix_max(int, Matrix, Max) :- - int_max_of_matrix(Matrix, Max, _). -typed_matrix_max(float, Matrix, Max) :- - float_max_of_matrix(Matrix, Max, _). - - -matrix_maxarg(Matrix,Max) :- - arg(1, Matrix, Type). - typed_matrix_maxarg(Type, Matrix, Max). - -typed_matrix_maxarg(int, Matrix, Max) :- - int_max_of_matrix(Matrix, _, Max). -typed_matrix_maxarg(float, Matrix, Max) :- - float_max_of_matrix(Matrix, _, Max). - - -matrix_min(Matrix,Min) :- - arg(1, Matrix, Type). - typed_matrix_min(Type, Matrix, Min). - -typed_matrix_min(int, Matrix, Min) :- - int_min_of_matrix(Matrix, Min, _). -typed_matrix_min(float, Matrix, Min) :- - float_min_of_matrix(Matrix, Min, _). - - -matrix_minarg(Matrix,Min) :- - arg(1, Matrix, Type). - typed_matrix_minarg(Type, Matrix, Min). - -typed_matrix_minarg(int, Matrix, Min) :- - int_min_of_matrix(Matrix, _, Min). -typed_matrix_minarg(float, Matrix, Min) :- - float_min_of_matrix(Matrix, _, Min). - - - - - diff --git a/library/matrices/Makefile.in b/library/matrices/Makefile.in deleted file mode 100644 index 748a0396f..000000000 --- a/library/matrices/Makefile.in +++ /dev/null @@ -1,60 +0,0 @@ -# -# default base directory for YAP installation -# (EROOT for architecture-dependent files) -# -prefix = @prefix@ -exec_prefix = @exec_prefix@ -ROOTDIR = $(prefix) -EROOTDIR = @exec_prefix@ -abs_top_builddir = @abs_top_builddir@ -# -# where the binary should be -# -BINDIR = $(EROOTDIR)/bin -# -# where YAP should look for libraries -# -LIBDIR=@libdir@/Yap -# -# -CC=@CC@ -CFLAGS= @CFLAGS@ $(YAP_EXTRAS) $(DEFS) -I$(srcdir) -I../.. -I$(srcdir)/../../include -# -# -# You shouldn't need to change what follows. -# -INSTALL=@INSTALL@ -INSTALL_DATA=@INSTALL_DATA@ -INSTALL_PROGRAM=@INSTALL_PROGRAM@ -SHELL=/bin/sh -RANLIB=@RANLIB@ -srcdir=@srcdir@ -SHLIB_CFLAGS=@SHLIB_CFLAGS@ -SO=@SO@ -#4.1VPATH=@srcdir@:@srcdir@/OPTYap -CWD=$(PWD) -# - -OBJS=matrix.o -SOBJS=matrix.@SO@ - -#in some systems we just create a single object, in others we need to -# create a libray - -all: $(SOBJS) - -matrix.o: $(srcdir)/matrix.c - $(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/matrix.c -o matrix.o - -@DO_SECOND_LD@%.@SO@: %.o -@DO_SECOND_LD@ @SHLIB_LD@ -o $@ $< - -@DO_SECOND_LD@matrix.@SO@: matrix.o -@DO_SECOND_LD@ @SHLIB_LD@ -o matrix.@SO@ matrix.o - -install: all - $(INSTALL_PROGRAM) $(SOBJS) $(DESTDIR)$(LIBDIR) - -clean: - rm -f *.o *~ $(OBJS) $(SOBJS) *.BAK - diff --git a/library/matrices/matrices.c b/library/matrices/matrices.c deleted file mode 100644 index 321a30cf3..000000000 --- a/library/matrices/matrices.c +++ /dev/null @@ -1,150 +0,0 @@ -/************************************************************************* -* * -* YAP Prolog * -* * -* Yap Prolog was developed at NCCUP - Universidade do Porto * -* * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * -* * -************************************************************************** -* * -* File: random.c * -* Last rev: * -* mods: * -* comments: regular expression interpreter * -* * -*************************************************************************/ - -#include "config.h" -#include "YapInterface.h" -#include -#if defined(__MINGW32__) || _MSC_VER -#include -#endif - -void PROTO(init_matrices, (void)); - -static int -int_min_of_matrix(void) -{ - Term t = YAP_ARG1; - YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos; - YAP_Int *mat = (YAP_Int *)malloc( dim*sizeof(YAP_Int) ), min; - if (!mat) - return FALSE; - if (!YAP_ArgsToIntArray(t, dim, mat)) - return FALSE; - - min = mat[0]; - pos = 0; - for (i = 1; i < dim; i++) { - if (mat[i] < min) { - min = mat[i]; - pos = i; - } - } - return YAP_unify(YAP_ARG2, YAP_MkIntTerm(min)) && - YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos)); -} - -static int -float_min_of_matrix(void) -{ - Term t = YAP_ARG1; - YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos; - YAP_Float *mat = (YAP_Float *)malloc( dim*sizeof(YAP_Float) ), min; - - if (!mat) - return FALSE; - if (!YAP_ArgsToFloatArray(t, dim, mat)) - return FALSE; - - min = mat[0]; - pos = 0; - for (i = 1; i < dim; i++) { - if (mat[i] < min) { - min = mat[i]; - pos = i; - } - } - return YAP_unify(YAP_ARG2, YAP_MkFloatTerm(min)) && - YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos)); -} - -static int -int_max_of_matrix(void) -{ - Term t = YAP_ARG1; - YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos; - YAP_Int *mat = (YAP_Int *)malloc( dim*sizeof(YAP_Int) ), max; - - if (!mat) - return FALSE; - if (!YAP_ArgsToIntArray(t, dim, mat)) - return FALSE; - - max = mat[0]; - pos = 0; - for (i = 1; i < dim; i++) { - if (mat[i] > max) { - max = mat[i]; - pos = i; - } - } - return YAP_unify(YAP_ARG2, YAP_MkIntTerm(min)) && - YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos)); -} - -static int -float_max_of_matrix(void) -{ - Term t = YAP_ARG1; - YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos; - YAP_Float *mat = (YAP_Float *)malloc( dim*sizeof(YAP_Float) ), max; - - if (!mat) - return FALSE; - if (!YAP_ArgsToFloatArray(t, dim, mat)) - return FALSE; - - max = mat[0]; - pos = 0; - for (i = 1; i < dim; i++) { - if (mat[i] > max) { - max = mat[i]; - pos = i; - } - } - return YAP_unify(YAP_ARG2, YAP_MkFloatTerm(min)) && - YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos)); -} - -void -init_matrices(void) -{ - YAP_UserCPredicate("int_max_of_matrix", int_max_of_matrix, 3); - YAP_UserCPredicate("float_max_of_matrix", float_max_of_matrix, 3); - YAP_UserCPredicate("int_min_of_matrix", int_min_of_matrix, 3); - YAP_UserCPredicate("float_min_of_matrix", float_min_of_matrix, 3); -} - -#ifdef _WIN32 - -int WINAPI PROTO(win_matrices, (HANDLE, DWORD, LPVOID)); - -int WINAPI win_matrices(HANDLE hinst, DWORD reason, LPVOID reserved) -{ - switch (reason) - { - case DLL_PROCESS_ATTACH: - break; - case DLL_PROCESS_DETACH: - break; - case DLL_THREAD_ATTACH: - break; - case DLL_THREAD_DETACH: - break; - } - return 1; -} -#endif diff --git a/library/matrices/matrix.c b/library/matrices/matrix.c deleted file mode 100644 index 629ced75a..000000000 --- a/library/matrices/matrix.c +++ /dev/null @@ -1,1755 +0,0 @@ -/************************************************************************* -* * -* YAP Prolog * -* * -* Yap Prolog was developed at NCCUP - Universidade do Porto * -* * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * -* * -************************************************************************** -* * -* File: matrix.c * -* Last rev: * -* mods: * -* comments: numerical arrays * -* * -*************************************************************************/ - -#include "config.h" -#include "YapInterface.h" -#include -#if defined(__MINGW32__) || _MSC_VER -#include -#endif -#if HAVE_STRING_H -#include -#endif - -/* - A matrix is something of the form - - TYPE = {int,double} - #DIMS = an int - DIM1 - ... - DIMn - DATA in C format. - - floating point matrixes may need to be aligned, so we always have an - extra element at the end. -*/ - -/* maximal number of dimensions, 1024 should be enough */ -#define MAX_DIMS 1024 - -typedef enum { - INT_MATRIX, - FLOAT_MATRIX -} mat_data_type; - -typedef enum { - MAT_TYPE=0, - MAT_NDIMS=1, - MAT_SIZE=2, - MAT_ALIGN=3, - MAT_DIMS=4, -} mat_type; - -typedef enum { - MAT_PLUS=0, - MAT_SUB=1, - MAT_TIMES=2, - MAT_DIV=3, - MAT_IDIV=4 -} op_type; - -static long int * -matrix_long_data(int *mat, int ndims) -{ - return (long int *)(mat+(MAT_DIMS+ndims)); -} - -static double * -matrix_double_data(int *mat, int ndims) -{ - return (double *)(mat+(MAT_DIMS+ndims)); -} - -static unsigned int -matrix_get_offset(int *mat, int* indx) -{ - unsigned int i, pos = mat[MAT_SIZE], off = 0; - - /* find where we are */ - for (i = 0; i < mat[MAT_NDIMS]; i++) { - pos /= mat[MAT_DIMS+i]; - if (indx[i] >= mat[MAT_DIMS+i]) { - return off; - } - off += pos*indx[i]; - } - return off; -} - -static void -matrix_get_index(int *mat, unsigned int offset, int* indx) -{ - unsigned int i, pos = mat[MAT_SIZE]; - - /* find where we are */ - for (i = 0; i < mat[MAT_NDIMS]; i++) { - pos /= mat[MAT_DIMS+i]; - indx[i] = offset / pos; - offset = offset % pos; - } -} - -static YAP_Term -new_int_matrix(int ndims, int dims[], long int data[]) -{ - unsigned int sz; - unsigned int i, nelems=1; - YAP_Term blob; - int *mat; - long int *bdata; - - for (i=0;i< ndims;i++) { - nelems *= dims[i]; - } - sz = ((MAT_DIMS+1)*sizeof(int)+ndims*sizeof(int)+nelems*sizeof(long int))/sizeof(YAP_CELL); - blob = YAP_MkBlobTerm(sz); - if (blob == YAP_TermNil()) - return FALSE; - mat = (int *)YAP_BlobOfTerm(blob); - mat[MAT_TYPE] = INT_MATRIX; - mat[MAT_NDIMS] = ndims; - mat[MAT_SIZE] = nelems; - for (i=0;i< ndims;i++) { - mat[MAT_DIMS+i] = dims[i]; - } - bdata = matrix_long_data(mat,ndims); - if (data) - memcpy((void *)bdata,(void *)data,sizeof(double)*nelems); - return blob; -} - -static YAP_Term -new_float_matrix(int ndims, int dims[], double data[]) -{ - unsigned int sz; - unsigned int i, nelems=1; - YAP_Term blob; - int *mat; - double *bdata; - - for (i=0;i< ndims;i++) { - nelems *= dims[i]; - } - sz = ((MAT_DIMS+1)*sizeof(int)+ndims*sizeof(int)+(nelems+1)*sizeof(double))/sizeof(YAP_CELL); - blob = YAP_MkBlobTerm(sz); - if (blob == YAP_TermNil()) - return FALSE; - mat = YAP_BlobOfTerm(blob); - mat[MAT_TYPE] = FLOAT_MATRIX; - mat[MAT_NDIMS] = ndims; - mat[MAT_SIZE] = nelems; - for (i=0;i< ndims;i++) { - mat[MAT_DIMS+i] = dims[i]; - } - bdata = matrix_double_data(mat,ndims); - if (data) - memcpy((void *)bdata,(void *)data,sizeof(double)*nelems); - return blob; -} - -static int -scan_dims(int ndims, YAP_Term tl, int dims[MAX_DIMS]) -{ - int i; - - for (i = 0; i < ndims; i++) { - YAP_Term th; - int d; - - if (!YAP_IsPairTerm(tl)) { - return FALSE; - } - th = YAP_HeadOfTerm(tl); - if (!YAP_IsIntTerm(th)) { - /* ERROR */ - return FALSE; - } - d = YAP_IntOfTerm(th); - if (d < 0) { - /* ERROR */ - return FALSE; - } - dims[i] = d; - tl = YAP_TailOfTerm(tl); - } - if (tl != YAP_TermNil()) { - /* ERROR */ - return FALSE; - } - return TRUE; -} - -static int -cp_int_matrix(YAP_Term tl,YAP_Term matrix) -{ - int *mat = (int *)YAP_BlobOfTerm(matrix); - int i, nelems = mat[MAT_SIZE]; - long int *j = matrix_long_data(mat, mat[MAT_NDIMS]); - - for (i = 0; i < nelems; i++) { - YAP_Term th; - int d; - - if (!YAP_IsPairTerm(tl)) { - return FALSE; - } - th = YAP_HeadOfTerm(tl); - if (!YAP_IsIntTerm(th)) { - /* ERROR */ - return FALSE; - } - d = YAP_IntOfTerm(th); - j[i] = d; - tl = YAP_TailOfTerm(tl); - } - if (tl != YAP_TermNil()) { - /* ERROR */ - return FALSE; - } - return TRUE; -} - -static int -cp_float_matrix(YAP_Term tl,YAP_Term matrix) -{ - int *mat = (int *)YAP_BlobOfTerm(matrix); - int i, nelems = mat[MAT_SIZE]; - double *j = matrix_double_data(mat, mat[MAT_NDIMS]); - - for (i = 0; i < nelems; i++) { - YAP_Term th; - double d; - - if (!YAP_IsPairTerm(tl)) { - return FALSE; - } - th = YAP_HeadOfTerm(tl); - if (!YAP_IsFloatTerm(th)) { - /* ERROR */ - return FALSE; - } - d = YAP_FloatOfTerm(th); - j[i] = d; - tl = YAP_TailOfTerm(tl); - } - if (tl != YAP_TermNil()) { - /* ERROR */ - return FALSE; - } - return TRUE; -} - - -static int -set_int_matrix(YAP_Term matrix,long int set) -{ - int *mat = (int *)YAP_BlobOfTerm(matrix); - int i, nelems = mat[MAT_SIZE]; - long int *j = matrix_long_data(mat, mat[MAT_NDIMS]); - - for (i = 0; i < nelems; i++) { - j[i] = set; - } - return TRUE; -} - -static int -set_float_matrix(YAP_Term matrix,double set) -{ - int *mat = (int *)YAP_BlobOfTerm(matrix); - int i, nelems = mat[MAT_SIZE]; - double *j = matrix_double_data(mat, mat[MAT_NDIMS]); - - for (i = 0; i < nelems; i++) { - j[i] = set; - } - return TRUE; -} - -static int -new_ints_matrix(void) -{ - int ndims = YAP_IntOfTerm(YAP_ARG1); - YAP_Term tl = YAP_ARG2, out; - int dims[MAX_DIMS]; - - if (!scan_dims(ndims, tl, dims)) - return FALSE; - out = new_int_matrix(ndims, dims, NULL); - if (!cp_int_matrix(YAP_ARG3,out)) - return FALSE; - return YAP_Unify(YAP_ARG4, out); -} - -static int -new_ints_matrix_set(void) -{ - int ndims = YAP_IntOfTerm(YAP_ARG1); - YAP_Term tl = YAP_ARG2, out, tset = YAP_ARG3; - int dims[MAX_DIMS]; - long int set; - - if (!YAP_IsIntTerm(tset)) { - return FALSE; - } - set = YAP_IntOfTerm(tset); - if (!scan_dims(ndims, tl, dims)) - return FALSE; - out = new_int_matrix(ndims, dims, NULL); - if (!set_int_matrix(out,set)) - return FALSE; - return YAP_Unify(YAP_ARG4, out); -} - -static int -new_floats_matrix(void) -{ - int ndims = YAP_IntOfTerm(YAP_ARG1); - YAP_Term tl = YAP_ARG2, out; - int dims[MAX_DIMS]; - - if (!scan_dims(ndims, tl, dims)) - return FALSE; - out = new_float_matrix(ndims, dims, NULL); - if (!cp_float_matrix(YAP_ARG3,out)) - return FALSE; - return YAP_Unify(YAP_ARG4, out); -} - -static int -new_floats_matrix_set(void) -{ - int ndims = YAP_IntOfTerm(YAP_ARG1); - YAP_Term tl = YAP_ARG2, out, tset = YAP_ARG3; - int dims[MAX_DIMS]; - double set; - - if (!YAP_IsFloatTerm(tset)) { - return FALSE; - } - set = YAP_FloatOfTerm(tset); - if (!scan_dims(ndims, tl, dims)) - return FALSE; - out = new_float_matrix(ndims, dims, NULL); - if (!set_float_matrix(out,set)) - return FALSE; - return YAP_Unify(YAP_ARG4, out); -} - -static YAP_Term -float_matrix_to_list(int *mat) { - double *data = matrix_double_data(mat, mat[MAT_NDIMS]); - int i = 0; - YAP_Term tf = YAP_TermNil(); - - for (i = mat[MAT_SIZE]-1; i>= 0; i--) { - tf = YAP_MkPairTerm(YAP_MkFloatTerm(data[i]),tf); - if (tf == YAP_TermNil()) { - /* error */ - return YAP_TermNil(); - } - } - return tf; -} - -static YAP_Term -mk_int_list(int nelems, int *data) -{ - YAP_Term tn = YAP_TermNil(); - YAP_Term tf = tn; - int i = 0; - - for (i = nelems-1; i>= 0; i--) { - tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i]),tf); - if (tf == tn) { - /* error */ - return tn; - } - } - return tf; -} - -static YAP_Term -mk_long_list(int nelems, long int *data) -{ - YAP_Term tn = YAP_TermNil(); - YAP_Term tf = tn; - int i = 0; - - for (i = nelems-1; i>= 0; i--) { - tf = YAP_MkPairTerm(YAP_MkIntTerm(data[i]),tf); - if (tf == tn) { - /* error */ - return tn; - } - } - return tf; -} - - -static YAP_Term -long_matrix_to_list(int *mat) { - long int *data = matrix_long_data(mat, mat[MAT_NDIMS]); - - return mk_long_list(mat[MAT_SIZE], data); -} - -static YAP_Term -matrix_access(int *mat, int *indx) -{ - unsigned int off = matrix_get_offset(mat, indx); - if (mat[MAT_TYPE]==FLOAT_MATRIX) - return YAP_MkFloatTerm((matrix_double_data(mat,mat[MAT_NDIMS]))[off]); - else - return YAP_MkIntTerm((matrix_long_data(mat,mat[MAT_NDIMS]))[off]); -} - -static void -matrix_float_set(int *mat, int *indx, double nval) -{ - unsigned int off = 0; - - off = matrix_get_offset(mat, indx); - (matrix_double_data(mat,mat[MAT_NDIMS]))[off] = nval; -} - -static void -matrix_long_set(int *mat, int *indx, long int nval) -{ - unsigned int off = matrix_get_offset(mat, indx); - (matrix_long_data(mat,mat[MAT_NDIMS]))[off] = nval; -} - -static void -matrix_float_set_all(int *mat, double nval) -{ - int i; - double *data = matrix_double_data(mat,mat[MAT_NDIMS]); - - for (i = 0; i< mat[MAT_SIZE]; i++) - data[i] = nval; -} - -static void -matrix_long_set_all(int *mat, long int nval) -{ - int i; - long int *data = matrix_long_data(mat,mat[MAT_NDIMS]); - - for (i = 0; i< mat[MAT_SIZE]; i++) - data[i] = nval; -} - -static void -matrix_float_add(int *mat, int *indx, double nval) -{ - unsigned int off; - double *dat = matrix_double_data(mat,mat[MAT_NDIMS]); - - off = matrix_get_offset(mat, indx); - dat[off] += nval; -} - -static void -matrix_long_add(int *mat, int *indx, long int nval) -{ - long int *dat = matrix_long_data(mat,mat[MAT_NDIMS]); - unsigned int off = matrix_get_offset(mat, indx); - dat[off] += nval; -} - -static void -matrix_inc(int *mat, int *indx) -{ - unsigned int off = matrix_get_offset(mat, indx); - if (mat[MAT_TYPE]==FLOAT_MATRIX) - (matrix_double_data(mat,mat[MAT_NDIMS])[off])++; - else - ((matrix_long_data(mat,mat[MAT_NDIMS]))[off])++; -} - -static void -matrix_dec(int *mat, int *indx) -{ - unsigned int off = matrix_get_offset(mat, indx); - if (mat[MAT_TYPE]==FLOAT_MATRIX) - (matrix_double_data(mat,mat[MAT_NDIMS])[off])--; - else - ((matrix_long_data(mat,mat[MAT_NDIMS]))[off])--; -} - -static YAP_Term -matrix_inc2(int *mat, int *indx) -{ - unsigned int off = matrix_get_offset(mat, indx); - if (mat[MAT_TYPE]==FLOAT_MATRIX) { - double *data = matrix_double_data(mat,mat[MAT_NDIMS]); - double d = data[off]; - d++; - data[off] = d; - return YAP_MkFloatTerm(d); - } else { - long int *data = matrix_long_data(mat,mat[MAT_NDIMS]); - long int d = data[off]; - d++; - data[off] = d; - return YAP_MkIntTerm(d); - } -} - -static YAP_Term -matrix_dec2(int *mat, int *indx) -{ - unsigned int off = matrix_get_offset(mat, indx); - if (mat[MAT_TYPE]==FLOAT_MATRIX) { - double *data = matrix_double_data(mat,mat[MAT_NDIMS]); - double d = data[off]; - d--; - data[off] = d; - return YAP_MkFloatTerm(d); - } else { - long int *data = matrix_long_data(mat,mat[MAT_NDIMS]); - long int d = data[off]; - d--; - data[off] = d; - return YAP_MkIntTerm(d); - } -} - - -static int -matrix_set(void) -{ - int dims[MAX_DIMS], *mat, tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - tf = YAP_ARG3; - if (mat[MAT_TYPE] == INT_MATRIX) { - if (YAP_IsIntTerm(tf)) { - matrix_long_set(mat, dims, YAP_IntOfTerm(tf)); - } else if (YAP_IsFloatTerm(tf)) { - matrix_long_set(mat, dims, YAP_FloatOfTerm(tf)); - } else { - /* Error */ - return FALSE; - } - } else { - if (YAP_IsIntTerm(tf)) { - matrix_float_set(mat, dims, YAP_IntOfTerm(tf)); - } else if (YAP_IsFloatTerm(tf)) { - matrix_float_set(mat, dims, YAP_FloatOfTerm(tf)); - } else { - /* Error */ - return FALSE; - } - } - return TRUE; -} - -static int -matrix_set_all(void) -{ - int *mat; - YAP_Term tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - tf = YAP_ARG2; - if (mat[MAT_TYPE] == INT_MATRIX) { - if (YAP_IsIntTerm(tf)) { - matrix_long_set_all(mat, YAP_IntOfTerm(tf)); - } else if (YAP_IsFloatTerm(tf)) { - matrix_long_set_all(mat, YAP_FloatOfTerm(tf)); - } else { - /* Error */ - return FALSE; - } - } else { - if (YAP_IsIntTerm(tf)) { - matrix_float_set_all(mat, YAP_IntOfTerm(tf)); - } else if (YAP_IsFloatTerm(tf)) { - matrix_float_set_all(mat, YAP_FloatOfTerm(tf)); - } else { - /* Error */ - return FALSE; - } - } - return TRUE; -} - -static int -matrix_add(void) -{ - int dims[MAX_DIMS], *mat, tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - tf = YAP_ARG3; - if (mat[MAT_TYPE] == INT_MATRIX) { - if (YAP_IsIntTerm(tf)) { - matrix_long_add(mat, dims, YAP_IntOfTerm(tf)); - } else if (YAP_IsFloatTerm(tf)) { - matrix_long_add(mat, dims, YAP_FloatOfTerm(tf)); - } else { - /* Error */ - return FALSE; - } - } else { - if (YAP_IsIntTerm(tf)) { - matrix_float_add(mat, dims, YAP_IntOfTerm(tf)); - } else if (YAP_IsFloatTerm(tf)) { - matrix_float_add(mat, dims, YAP_FloatOfTerm(tf)); - } else { - /* Error */ - return FALSE; - } - } - return TRUE; -} - -static int -do_matrix_access(void) -{ - int dims[MAX_DIMS], *mat, tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - tf = matrix_access(mat, dims); - return YAP_Unify(tf, YAP_ARG3); -} - -static int -do_matrix_inc(void) -{ - int dims[MAX_DIMS], *mat; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - matrix_inc(mat, dims); - return TRUE; -} - -static int -do_matrix_dec(void) -{ - int dims[MAX_DIMS], *mat; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - matrix_dec(mat, dims); - return TRUE; -} - -static int -do_matrix_inc2(void) -{ - int dims[MAX_DIMS], *mat; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - return - YAP_Unify(matrix_inc2(mat, dims), YAP_ARG3); -} - -static int -do_matrix_dec2(void) -{ - int dims[MAX_DIMS], *mat; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, dims)) { - /* Error */ - return FALSE; - } - return - YAP_Unify(matrix_dec2(mat, dims), YAP_ARG3); -} - -static int -matrix_to_list(void) -{ - int *mat; - YAP_Term tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (mat[MAT_TYPE] == INT_MATRIX) - tf = long_matrix_to_list(mat); - else - tf = float_matrix_to_list(mat); - return YAP_Unify(YAP_ARG2, tf); -} - -static int -matrix_dims(void) -{ - int *mat; - YAP_Term tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - tf = mk_int_list(mat[MAT_NDIMS],mat+MAT_DIMS); - return YAP_Unify(YAP_ARG2, tf); -} - -static int -matrix_size(void) -{ - int *mat; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(mat[MAT_SIZE])); -} - -static int -matrix_ndims(void) -{ - int *mat; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - return YAP_Unify(YAP_ARG2, YAP_MkIntTerm(mat[MAT_NDIMS])); -} - -static int -matrix_type(void) -{ - int *mat; - YAP_Term tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (mat[MAT_TYPE] == INT_MATRIX) { - tf = YAP_MkIntTerm(0); - } else { - tf = YAP_MkIntTerm(1); - } - return YAP_Unify(YAP_ARG2, tf); -} - -static int -matrix_arg_to_offset(void) -{ - int indx[MAX_DIMS], *mat; - unsigned int off; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!scan_dims(mat[MAT_NDIMS], YAP_ARG2, indx)) { - /* Error */ - return FALSE; - } - off = matrix_get_offset(mat, indx); - - return YAP_Unify(YAP_ARG3, YAP_MkIntTerm(off)); -} - -static int -matrix_offset_to_arg(void) -{ - int indx[MAX_DIMS], *mat; - unsigned int off; - YAP_Term ti, tf; - - mat = (int *)YAP_BlobOfTerm(YAP_ARG1); - if (!mat) { - /* Error */ - return FALSE; - } - if (!YAP_IsIntTerm(ti = YAP_ARG2)) { - /* Error */ - return FALSE; - } - off = YAP_IntOfTerm(ti); - matrix_get_index(mat, off, indx); - tf = mk_int_list(mat[MAT_NDIMS], indx); - return YAP_Unify(YAP_ARG3, tf); -} - -static unsigned int -scan_max_long(int sz, long int *data) -{ - int i, off=0; - long int max= data[0]; - for (i=1; imax) { - off=i; - max = data[i]; - } - } - return off; -} - -static unsigned int -scan_max_float(int sz, double *data) -{ - int i, off=0; - double max= data[0]; - for (i=1; imax) { - max = data[i]; - off=i; - } - } - return off; -} - -static unsigned int -scan_min_long(int sz, long int *data) -{ - int i, off=0; - long int max= data[0]; - for (i=1; i