#include "TotCI_Ri.h" /*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/ //Function Declarations: void ReadDates(int NoDates, char *DatesFile, int *Dates); void ReadParams(int SampleGenTime, char *ParamFile, char *OptParamFile, double *kappa_opt, double *eta_opt, double *kappa, double *eta); void CalcRDistOpt(int NoDates, int *Dates, double kappa, double eta, double **matrix, double **RDist, double *R0list); void CalcRDist(int index, int NoDates, int *Dates, double kappa, double eta, double **matrix, double **RDist, double **RSample); double weibullPDF(double x, double kappa, double eta); void SampleRi(int index, int NoDates, double **RDist, double **RSampleTot); int NDistOutput(char *OutputFile, int NSample, int NoDates, double **RSampleTot); void CalcMeanR(int Npre, int NSample, double **RSampleTot, double *meanRSampleTot); double CalcMeanROpt(int Npre, double *R0list); void CalcMaxR(int NoDates, int NSample, double **RSampleTot, double *maxRSampleTot); double CalcMaxROpt(int NoDates, double *R0list); void sort(int n, double *arr); void OutputMeanMax(char *OutputFile, double meanR, double maxR, double meanCImin, double meanCImax, double maxCImin, double maxCImax); void OutputData(int NoDates, char *OutputFile, int *Dates, double *R0list, double *CIminGT, double *CImaxGT, double *CIminTot, double *CImaxTot); /*-------------------------------------------------------------------------------------------*/ //Global variables: long seed, rcount; /*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { char DatesFile[255], ParamFile[255], OptParamFile[255], OutputFile[255]; int NoDates, Npre, SampleGenTime, SampleR, NoEps; int *Dates; double *kappa, *eta, kappa_opt, eta_opt; double **matrix, **RDist; double *R0list, *CIminGT, *CImaxGT, *CIminTot, *CImaxTot; double **RSampleGT, **RSampleTot, *meanRSampleTot, *maxRSampleTot; double meanR, meanRCImin, meanRCImax, maxR, maxRCImin, maxRCImax; int i, j; printf("Hello from TotCI_Ri.\n"); if(argc<10) ERR_CRITICAL("Syntax: \n"); sscanf_s(argv[1], "%d", &Npre); sscanf_s(argv[2], "%d", &NoDates); sscanf_s(argv[3], "%s", DatesFile, sizeof(DatesFile)); sscanf_s(argv[4], "%s", ParamFile, sizeof(ParamFile)); sscanf_s(argv[5], "%s", OptParamFile, sizeof(OptParamFile)); sscanf_s(argv[6], "%s", OutputFile, sizeof(OutputFile)); sscanf_s(argv[7], "%d", &SampleGenTime); sscanf_s(argv[8], "%d", &SampleR); sscanf_s(argv[9], "%d", &seed); if(seed>0) seed=-seed; if(seed==0) { seed=(long)time(NULL); if(seed>0) seed=-seed; } ran3(&seed); if( (Dates=(int *) calloc(NoDates, sizeof(int)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for Dates.\n"); if( (kappa=(double *) calloc(SampleGenTime, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for kappa.\n"); if( (eta=(double *) calloc(SampleGenTime, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for eta.\n"); if( (matrix=dmatrix(0, NoDates-1, 0, NoDates-1))==0 ) ERR_CRITICAL("main: Unable to allocate memory for matrix.\n"); if( (RDist=dmatrix(0, NoDates-1, 0, NoDates))==0 ) ERR_CRITICAL("main: Unable to allocate memory for RDist.\n"); if( (R0list=(double *) calloc(NoDates, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for R0list.\n"); if( (RSampleGT=dmatrix(0, NoDates-1, 0, SampleGenTime))==0 ) ERR_CRITICAL("main: Unable to allocate memory for RSampleGT.\n"); if( (RSampleTot=dmatrix(0, NoDates, 0, SampleGenTime*SampleR))==0 ) ERR_CRITICAL("main: Unable to allocate memory for RSampleTot.\n"); if( (meanRSampleTot=(double *) calloc(SampleGenTime*SampleR, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for meanRSampleTot.\n"); if( (maxRSampleTot=(double *) calloc(SampleGenTime, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for maxRSampleTot.\n"); if( (CIminGT=(double *) calloc(NoDates, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for CIminGT.\n"); if( (CImaxGT=(double *) calloc(NoDates, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for CImaxGT.\n"); if( (CIminTot=(double *) calloc(NoDates, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for CIminTot.\n"); if( (CImaxTot=(double *) calloc(NoDates, sizeof(double)))==0 ) ERR_CRITICAL("main: Unable to allocate memory for CImaxTot.\n"); ReadDates(NoDates, DatesFile, Dates); ReadParams(SampleGenTime, ParamFile, OptParamFile, &kappa_opt, &eta_opt, kappa, eta); CalcRDistOpt(NoDates, Dates, kappa_opt, eta_opt, matrix, RDist, R0list); meanR=CalcMeanROpt(Npre, R0list); maxR=CalcMaxROpt(NoDates, R0list); for(i=0;i=0;i++){ eofind=fscanf_s(indat, "%d", &Dates[i]); } if(eofind<0) ERR_CRITICAL("ReadDates: dates input file does not contain enough dates.\n"); fclose(indat); printf("Successfully read list of dates.\n"); } /*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/ void ReadParams(int SampleGenTime, char *ParamFile, char *OptParamFile, double *kappa_opt, double *eta_opt, double *kappa, double *eta) { FILE *indat; int j, eofind=1; double temp; if( (fopen_s(&indat, ParamFile, "r"))!=0) ERR_CRITICAL("ReadParam: Unable to open ParamFile for input.\n"); for(j=0;j=0;j++) { eofind=fscanf_s(indat, "%lg %lg %lg", &temp, &kappa[j], &eta[j]); } if(eofind<0) ERR_CRITICAL("ReadParams: not enough values of kappa and eta in ParamFile.\n"); fclose(indat); if( (fopen_s(&indat, OptParamFile, "r"))!=0) ERR_CRITICAL("ReadParam: Unable to open OptParamFile for input.\n"); fscanf_s(indat, "%lg %lg", kappa_opt, eta_opt); fclose(indat); printf("Successfully read Params.\n"); } /*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/ void CalcRDistOpt(int NoDates, int *Dates, double kappa, double eta, double **matrix, double **RDist, double *R0list) //Calculates the estimates of R for each date, //and returns the cumulative distributions for Ri in matrix. { int i, j, r, timediffij; double *norm; if( (norm=(double *) calloc(NoDates, sizeof(double)))==0 ) ERR_CRITICAL("CalcRDist: unable to allocate memory for norm.\n"); for(i=0;i0 /*&& timediffij<=30*/ && i!=j){ //i can infect j if i was earlier, //but less than 30 days before, //and i cannot infect itself. matrix[i][j] = weibullPDF(timediffij, kappa, eta); } else { matrix[i][j]=0; } } } //Normalisation of matrix for(j=0;j0) for(i=0;i0;r--) { RDist[i][r]=RDist[i][r]*(1.0-matrix[i][j])+RDist[i][r-1]*matrix[i][j]; } RDist[i][0]=RDist[i][0]*(1.0-matrix[i][j]); } } //Convert RDist into the cumulative distribution: for(i=0;i0 /*&& timediffij<=30*/ && i!=j){ //i can infect j if i was earlier, //but less than 30 days before, //and i cannot infect itself. matrix[i][j] = weibullPDF(timediffij, kappa, eta); } else { matrix[i][j]=0; } } } //Normalisation of matrix for(j=0;j0) for(i=0;i0;r--) { RDist[i][r]=RDist[i][r]*(1.0-matrix[i][j])+RDist[i][r-1]*matrix[i][j]; } RDist[i][0]=RDist[i][0]*(1.0-matrix[i][j]); } } //Convert RDist into the cumulative distribution: for(i=0;i=l;i--) { if(arr[i-1] <= a) break; arr[i]=arr[i-1]; } arr[i]=a; } if(jstack == -1) break; ir=istack[jstack--]; l=istack[jstack--]; } else { k=(l+ir) >> 1; SWAP(arr[k-1], arr[l]) if(arr[l-1] > arr[ir-1]) { SWAP(arr[l-1], arr[ir-1]) } if(arr[l] > arr[ir-1]) { SWAP(arr[l], arr[ir-1]) } if(arr[l-1] > arr[l]) { SWAP(arr[l-1],arr[l]) } i=l+1; j=ir; a=arr[l]; for (;;) { do i++; while (arr[i-1]a); if (j < i) break; SWAP(arr[i-1],arr[j-1]); } arr[l]=arr[j-1]; arr[j-1]=a; jstack +=2; if(jstack > NSTACK-1) ERR_CRITICAL("STACK too small in sort.\n"); if(ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } free(istack); } /*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/ void OutputMeanMax(char *OutputFile, double meanR, double maxR, double meanCImin, double meanCImax, double maxCImin, double maxCImax) { FILE *out; char filename[255]; sprintf_s(filename, sizeof(filename), "MeanMaxR%s", OutputFile); if( (fopen_s(&out, filename, "w"))!=0 ) ERR_CRITICAL("OutputMeanMax: Unable to open file for output.\n"); fprintf(out, "meanR\tmeanR_CImin\tmeanR_CImax\n%lg\t%lg\t%lg\n", meanR, meanCImin, meanCImax); fprintf(out, "maxR\tmaxR_CImin\tmaxR_CImax\n%lg\t%lg\t%lg\n", maxR, maxCImin, maxCImax); fclose(out); } /*-------------------------------------------------------------------------------------------*/ void OutputData(int NoDates, char *OutputFile, int *Dates, double *R0list, double *CIminGT, double *CImaxGT, double *CIminTot, double *CImaxTot) { int i; FILE *out; if( (fopen_s(&out, OutputFile, "w"))!=0 ) ERR_CRITICAL("OutputData: Unable to open file for output.\n"); fprintf(out, "Date\tR\tCIminGT\tCImaxGT\tCIminTot\tCImaxTot\n"); for(i=0;i