/*************************************************************************
*									 *
*	 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).