From 72064a8c7449fef89b7b1fc323a3b822f8539b15 Mon Sep 17 00:00:00 2001 From: vsc Date: Sun, 24 Dec 2006 01:34:16 +0000 Subject: [PATCH] compact representation for matrix operations git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1737 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- library/matrix.yap | 135 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 library/matrix.yap diff --git a/library/matrix.yap b/library/matrix.yap new file mode 100644 index 000000000..edd1a17a3 --- /dev/null +++ b/library/matrix.yap @@ -0,0 +1,135 @@ +/************************************************************************* +* * +* YAP Prolog * +* * +* Yap Prolog was developed at NCCUP - Universidade do Porto * +* * +* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2006 * +* * +************************************************************************** +* * +* File: matrix.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 + + Operations: + +typedef enum { + MAT_SUM=0, + MAT_SUB=1, + MAT_TIMES=2, + MAT_DIV=3, + MAT_IDIV=4 +} op_type; + + */ + +:- module( matrix, + [ + matrix_new/3, + matrix_new/4, + matrix_new_set/4, + matrix_dims/2, + matrix_ndims/2, + matrix_size/2, + matrix_type/2, + matrix_to_list/2, + matrix_get/3, + matrix_set/3, + matrix_set_all/2, + matrix_add/3, + matrix_inc/2, + matrix_dec/2, + matrix_inc/3, + matrix_dec/3, + matrix_arg_to_offset/3, + matrix_offset_to_arg/3, + matrix_max/2, + matrix_maxarg/2, + matrix_min/2, + matrix_minarg/2, + matrix_sum/2, + matrix_sum_to_all/2, + matrix_agg_lines/3, + matrix_agg_cols/3, + matrix_op/4, + matrix_op_to_all/4, + matrix_op_to_lines/4, + matrix_op_to_cols/4 + ]). + +:- load_foreign_files([matrix], [], init_matrix). + +matrix_new(ints,Dims,Matrix) :- + length(Dims,NDims), + new_ints_matrix(NDims, Dims, [], Matrix). +matrix_new(floats,Dims,Matrix) :- + length(Dims,NDims), + new_float_matrix(NDims, Dims, [], Matrix). + + +matrix_new(ints,Dims,Data,Matrix) :- + length(Dims,NDims), + new_ints_matrix(NDims, Dims, Data, Matrix). +matrix_new(floats,Dims,Data,Matrix) :- + length(Dims,NDims), + new_float_matrix(NDims, Dims, Data, Matrix). + + +matrix_new_set(ints,Dims,Elem,Matrix) :- + length(Dims,NDims), + new_ints_matrix_set(NDims, Dims, Elem, Matrix). +matrix_new_set(floats,Dims,Elem,Matrix) :- + length(Dims,NDims), + new_floats_matrix_set(NDims, Dims, Elem, Matrix). + + +matrix_type(Matrix,Type) :- + matrix_type_as_number(Matrix, 0), !, + Type = ints. +matrix_type(_,floats). + + +matrix_agg_lines(M1,+,NM) :- + do_matrix_agg_lines(M1,0,NM). +/* other operations: *, logprod */ + +matrix_agg_cols(M1,+,NM) :- + do_matrix_agg_cols(M1,0,NM). +/* other operations: *, logprod */ + +matrix_op(M1,M2,+,NM) :- + do_matrix_op(M1,M2,0,NM). + +matrix_op_to_all(M1,+,Num,NM) :- + do_matrix_op_to_all(M1,0,Num,NM). +matrix_op_to_all(M1,*,Num,NM) :- + do_matrix_op_to_all(M1,2,Num,NM). +matrix_op_to_all(M1,/,Num,NM) :- + % can only use floats. + FNum is float(Num), + do_matrix_op_to_all(M1,3,FNum,NM). +/* other operations: *, logprod */ + +matrix_op_to_lines(M1,M2,/,NM) :- + do_matrix_op_to_lines(M1,M2,3,NM). +/* other operations: *, logprod */ + +matrix_op_to_cols(M1,M2,+,NM) :- + do_matrix_op_to_cols(M1,M2,0,NM). +/* other operations: *, logprod */ + + +