#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <string.h>
#include "calc.post.h"

int num_inter, num_tech, num_total;
float rho;
double **nu_phi;
int **ppDataMat;
int **ppDataMat2;

int MemAlloc() {

  int i;

  nu_phi = (double**)malloc(num_tech*sizeof(double*));
  if (nu_phi==NULL) {
    printf("Can't memalloc nu_phi\n");
    return 0;
  }
  for (i=0; i<num_tech; i++) {
    nu_phi[i] = (double*)malloc(2*sizeof(double));
    if (nu_phi[i]==NULL) {
      printf("Can't memalloc nu_phi[%d]\n",i);
      return 0;
    }
  }

  ppDataMat = (int**)malloc(num_inter*sizeof(int*));
  if (ppDataMat==NULL) {
    printf("Can't memalloc ppDataMat\n");
    return 0;
  }
  for (i=0; i<num_inter; i++) {
    ppDataMat[i] = (int*)malloc((2*num_tech+1)*sizeof(int));
    if (ppDataMat[i]==NULL) {
      printf("Can't memalloc ppDataMat[%d]\n",i);
      return 0;
    }
  }
  
  return 1;

}


int main() {

  FILE *datafile, *results;
  float temp, temp1, temp2;
  double prob, numer, denom;
  int i, j;
  char inputfile[20];
  char outputfile[30];

  printf("\n\nPlease enter the name of the file containing your data: ");
  scanf("%s",inputfile);

  strcpy(outputfile,inputfile);
  strcat(outputfile,".results");

  datafile = fopen(inputfile,"r");
  results = fopen(outputfile,"w");

  /* Read in data */

  fscanf(datafile,"%d %d",&num_inter,&num_tech);
  fscanf(datafile,"%f",&temp);
  rho = temp;

  fprintf(results,"\n\nThe number of interactions is %d\n",num_inter);
  fprintf(results,"The number of datasets is %d\n", num_tech);
  fprintf(results,"The value of rho is %f\n\n",rho);
  fflush(0);

  num_total = num_inter*num_tech;

  if (!MemAlloc()) {
    printf("Error allocating memory\n");
    return 0;
  }

  for (i=0; i<num_tech; i++) {

    fscanf(datafile,"%f %f",&temp1,&temp2);
    nu_phi[i][0] = temp1;
    nu_phi[i][1] = temp2;

    fprintf(results,"For dataset %d, nu is %f and phi is %f\n",i+1,nu_phi[i][0],nu_phi[i][1]);

  }

  fprintf(results,"\n");

  for (i=0; i<num_inter; i++) {

    fscanf(datafile,"%d",&ppDataMat[i][0]);
     
    for (j=0; j<num_tech; j++) fscanf(datafile,"%d %d",&ppDataMat[i][2*j+1],&ppDataMat[i][2*j+2]);
 
  }

 

  /* Compute posterior probability for each possible interaction */

  fprintf(results,"Interaction  ");
  for (j=0; j<num_tech; j++) fprintf(results,"(t,s)  ");
  fprintf(results," Post. Prob. \n");

  fflush(0);

  for (i=0; i<num_inter; i++) {
    
    numer = 1.0;
    denom = 1.0;

    fprintf(results,"     %d      ",i+1);

    for (j=0; j<num_tech; j++) {

      fprintf(results," (%d,%d) ",ppDataMat[i][2*j+1],ppDataMat[i][2*j+2]);
      fflush(0);

      numer = numer*pow(nu_phi[j][0],ppDataMat[i][2*j+1]-ppDataMat[i][2*j+2])*pow(1.0-nu_phi[j][0],ppDataMat[i][2*j+2]);

      denom = denom*pow(nu_phi[j][1],ppDataMat[i][2*j+2])*pow(1.0-nu_phi[j][1],ppDataMat[i][2*j+1]-ppDataMat[i][2*j+2]);

    }

    prob = (numer*rho)/((numer*rho)+(denom*(1.0-rho)));

    fprintf(results,"  %f \n",prob);

  }
 
  printf("\nResults have been written to the file %s.\n\n",outputfile);

}

