#ifndef _PORK_MAT_UTIL1361346616 
#define _PORK_MAT_UTIL1361346616

#define INTERNAL_VARIABLE 0
#define IMAGE 1
#define INTERNAL_INT 2

#define GREY_SCALE 1
#define RGB24 3

#define GREY_PGM   5
#define RGB_PPM    6
#define GREY_PDM   7
#define RGB_PDM    8
#define GREY_PLM   9
#define RGB_PLM    10

#define TRUE 1
#define FALSE 0

#include<stdlib.h>
#include<stdio.h>
#include<stddef.h>

/* - - Macro for (x,y) array indexing - - */
#define XYofA(x, y, A, row_length)  A[y*row_length + x ]

/* - - Not a Number definitions - - */
#define NaNData  512000.0
#define NaNImage 512000.0
#define NaNChar 255

/* - - Types - - */
typedef double Data;
typedef double Image;

/* - - structures - - */
struct variable
{
  const char * name;
  Data * data;     /* signed floating point values  */
  Image * image;   /* also signed floating point values */
  int magic_number;
  int plm_field_1;
  float plm_field_2;
  int max_value;
  int channels;
  int var_type;
  int M, N;
};
typedef struct variable Var;

/* - - prototypes for mat_util.c - - */

void transpose_matrix(const Var *, Var *);
void matrix_multiply(const Var *, const Var *, Var *);              
void sub_matrix(const Var *, const Var *, Var *);
void add_matrix(const Var *, const Var *, Var *);
int sub_rows(const Var *, Var *);
int sub_cols(const Var *, Var *);
int div_mat_by_constant(const Var * A, Data constant, Var *ANS);
double meansquared( const Var * A );
void gaussian_elimination(Var *, Var *, Var *);
void data_to_image(Var *);
void data_to_image(Var *);
void print_var(Var *, int, int);
void print(Var *, int, int, int, int);
void init_var(Var *, const char * name, int, int, int, int);
void Var_Destructor( void * );
void copy_image(Var *, Var *);
void copy_data(Var *, Var *);
void clear_data(Var *);

int sum2nan(Var *);
int chval(Var *, double, double);
double min(Var *);
double max(Var *);
void absval(Var *);

#endif
