/*****************************************************************************
Copyright 1993 MBARI                                                      
******************************************************************************
Summary  : Matrix routines
Filename : Matrix.h
Author   : Michael B. Matthews                                                
Project  : New ROV                                                        
Version  : Version 1.1                                                    
Created  : August 3, 1993                                                      
Modified :                                                                
Archived :                                                                
Notes    : 
*****************************************************************************/

#ifndef Matrix_h
#define Matrix_h

#include <vxWorks.h>            	/* VxWorks systems declarations       */
#include <stdioLib.h>           	/* VxWorks standard I/O library       */
#include <math.h>              		/* VxWorks floating point math library*/
#include <semLib.h>            		/* VxWorks semaphore library          */
#include <wdLib.h>             		/* VxWorks watchdog timer library     */
#include <systime.h>           		/* VxWorks system time declarations   */
#include <strLib.h>			/* VxWorks string library             */
#include <stdlib.h>
#include <trig.h>

#include <mbari/types.h>       		/* MBARI type declarations            */
#include <mbari/usrTime.h>     		/* MBARI time declarations            */
#include <mbari/kalmanDM.h>		/* kalman data manager definitions    */
#include <mbari/sensorDcon.h>		/* sensor data concentrator definitns */
#include <mbari/vmeIbc.h>		/* VME IBC definitions                */
#include <mbari/sensorsDm.h>		/*                                    */
#include <datamgr.h>           		/* data manager declarations          */
#include <dm_errno.h>          		/* data manager error declarations    */
#include "fppLib.h"             	/* vxWorks vxTas routine definition   */

#include <string.h>
#include <types.h>

#define DIMENSION_CHECK

enum {   
  NORMAL, 
  DIAGONAL,
  TRANSPOSE, 
  UPPER_TRIANGULAR, 
  LOWER_TRIANGULAR,
  ROW,
  COLUMN};

/* define floating-point precision */
typedef Flt64 FltN;

/* vector structure */
typedef struct {
  char* name;
  Word r;
  Word state;
  FltN *s;
} Vector;

/* matrix structure */
typedef struct {
  char* name;
  Word r;
  Word c;
  Word state;
  FltN **s;
} Matrix;

Vector* Vector_Create(int);
Vector* Vector_Duplicate(Vector*);
void Vector_Destroy(Vector*);
void Vector_Zero(Vector*);
void Vector_Init(Vector*, FltN);
void Vector_Addition(Vector*, Vector*, Vector*);
void Vector_Subtraction(Vector*, Vector*, Vector*);
void Vector_Multiplication(Vector*, Vector*, Vector*);
void Vector_Scalar_Multiplication(Vector*, FltN, Vector*);
void Vector_Randomize_Uniform(Vector*, FltN);
void Vector_Randomize_Gaussian(Vector*, FltN);
void Vector_Insert(Vector*, Vector*, int);
void Vector_Extract(Vector*, Vector*, int);
void Vector_Print(Vector*);
void Vector_Copy(Vector*, Vector*);
FltN Vector_Norm(Vector*);

Matrix* Matrix_Create(int, int);
Matrix* Matrix_Duplicate(Matrix*);
void Matrix_Destroy(Matrix*);
void Matrix_Init(Matrix*, FltN);
void Matrix_Zero(Matrix*);
void Matrix_Multiplication(Matrix*, Matrix*, Matrix*);
void Matrix_Scalar_Multiplication(Matrix*, FltN, Matrix*);
void Matrix_Transpose(Matrix*);
void Matrix_Print(Matrix*);
void Matrix_Identity(Matrix*);
void Matrix_Copy(Matrix*, Matrix*);
void Matrix_Inverse(Matrix*, Matrix*);
void Matrix_Addition(Matrix*, Matrix*, Matrix*);
void Matrix_Subtraction(Matrix*, Matrix*, Matrix*);
void Matrix_Insert(Matrix*, Matrix*, int, int);
void Matrix_Extract(Matrix*, Matrix*, int, int);
void Matrix_Randomize_Uniform(Matrix*, FltN);
void Matrix_Randomize_Uniform_Symmetrical(Matrix*, FltN);
void Matrix_Randomize_Gaussian(Matrix*, FltN);
void Matrix_Power(Matrix*, Matrix*, int);
void Matrix_Output(Matrix*, FILE*);
void Matrix_Symmetrize(Matrix*);
void Matrix_Exponential(Matrix*, Matrix*);
FltN Matrix_Trace(Matrix*);
FltN Matrix_Norm(Matrix*);
Matrix* Matrix_Input(FILE*);
void Matrix_Read(Matrix*, char*);

void Matrix_Vector_Multiplication(Matrix*, Vector*, Vector*);
void Matrix_Scalar_Multiplication(Matrix*, FltN, Matrix*);

FltN Random_Uniform(FltN);
FltN Random_Gaussian(FltN);
int fact(int);
FltN power(FltN, int);

void lubksb(Matrix*, int, int*, Vector*);
void ludcmp(Matrix*, int, int*, double*);

#endif

