/*
 * w4735 assignment 3 step 2
 * by anders pearson <anders@columbia.edu>
 * 2001-04-19
 */

#include "defHelp.h"
#include <stdlib.h>

#define MAXROW 80.0

main(int argc, char *args[]){

  int R,W;
  struct image img[9]; 
  int i, j, k,r;
  int w = 0;
  int row, col, sum, samples;
  float data[9][7][591];
  float transitions[9];
  float diffs[9][9];
  float min = 1000.0;
  float max = 0.0;
  int mini,minj,maxi,maxj;

  float total,trans;
  float prev;
  char *images[9] = {"iris1.pgm","iris2.pgm","iris3.pgm","iris4.pgm",
		    "iris5.pgm","iris6.pgm","iris7.pgm","iris8.pgm",
		    "iris9.pgm"};
  
  /* read in images */
  for(i = 0; i < 9; i++){
    if(readImage(&img[i], images[i]) != 0) {
      exit(1);
    }
  }
  
  /* for each number of rows to average */
  for (w = 1; w <= 6; w++) {
    for (R = 1; R < 590; R++) {
      /* calculate transitions for each image */
      for (i = 0; i < 9; i++) {
	/* get raw data */
	for (r = 0; r < w; r++) {
	  row = (int)(rand() * MAXROW);
	  for (col = 0,j = 0; col < getNCols(&img[i]); col += R, j++) {
	    data[i][r][j] = (float) getPixel(&img[i],row,col);
	  }
	}
	samples = ceil(getNCols(&img[i])/R);

	/* normalize rows */
	for (r = 0; r < w; r++) {
	  sum = 0;
	  for (col = 0; col < samples; col++) {
	    sum += (float)data[i][r][col];
	  } 
	  for (col = 0; col < samples; col++) {
	    data[i][r][col] -= (float)sum/samples;
	  } 
	}

	/* find transition count for each row and average */	
	total = 0;
	for (r = 0; r < w; r++) {
	  trans = 0;
	  prev = data[i][r][0];
	  for(col = 0; col < samples; col++){
	    if((prev >= 0 && data[i][r][col] < 0) ||
	       (prev < 0 && data[i][r][col] >= 0)) {
	      trans++;
	    }
	    prev = data[i][r][col];
	  }
	  total += trans;
	}
	transitions[i] = ((float)total)/(w * samples);
      }

      /* generate difference matrix */
      for(i = 0; i < 9; i++) {
	for(j = i+1; j < 9; j++) {
	  diffs[i][j] = transitions[i] - transitions[j];
	  diffs[i][j] = (diffs[i][j] > 0) ? diffs[i][j] : -diffs[i][j];
	}
      }

      /* find minimum difference */
      min = diffs[0][1];
      max = diffs[0][1];
      mini = 0;
      minj = 1;
      maxi = 0;
      maxj = 1;
      for(i = 0; i < 9; i++) {
	for(j = i+1; j < 9; j++) {
	  if(diffs[i][j] < min){
	    min = diffs[i][j];
	    mini = i;
	    minj = j;
	  }
	  if(diffs[i][j] > max) {
	    max = diffs[i][j];
	    maxi = i;
	    maxj = j;
	  }
	}
      }

      if(min > 0.0 && max > 0.0) {
	printf("W: %d, R: %d, sim (%s,%s,%f), ",w,R,images[mini],images[minj],min);
	printf("diff (%s,%s,%f)\n",images[maxi],images[maxj],max);
      }
    }
  }
  return 0;
}

