#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


/**********************/
/*    MCMC            */
/**********************/


double condlrfn_binary(int N,int K,int M,int aN,int ** fdata,double *beta0_o,double *beta1_o,double ***pxz_o,double *pz_o,double *beta0_s,double *beta1_s,double ***pxz_s,double *pz_s)
{	
	double llr,lr;
	double mul_o,mul_s,mul_x_o,mul_x_s;
	int i,j,an,m;
	// n=the number of strata
	// n_imd = the number of D = d when G = gm in ith strata.
	// M_im = the number of G = gm in ith strata.

	llr = 0;
	
	for (j = 0; j< N; j++) 
    {
		mul_o = 0;
		mul_s = 0;
		for (i = 0; i<K;i++)
		{
			mul_x_o =1;
			mul_x_s =1;
			for (an=0; an<aN;an++)
			{
				if (pxz_o[an][i][fdata[j][1+an]]!=0) 
				{
					mul_x_o *=pxz_o[an][i][fdata[j][1+an]];
					mul_x_s *=pxz_s[an][i][fdata[j][1+an]];
				}
			}
			if (fdata[j][1]==2)
				m=1;
			else
				m=0;
			mul_o += pz_o[i]*mul_x_o*exp(fdata[j][0]*(beta0_o[i]+beta1_o[m]))/(1+exp(beta0_o[i]+beta1_o[m]));
			mul_s += pz_s[i]*mul_x_s*exp(fdata[j][0]*(beta0_s[i]+beta1_s[m]))/(1+exp(beta0_s[i]+beta1_s[m]));
		}
		llr += log(mul_s)-log(mul_o);
	}	
		
	//lr = exp(llr);
	lr = llr;
	return (lr);
}

void est_beta_fn_binary(int N,double *a,double **ax,double alpha_o,int step,int times,int trials, int n,int Nt,int tt,int K,int M,int aN,int *xM,int **fdata)
{
	int time,i,an,xm,m;
	double lr,prob;
	double ***pxz_s,*ax_an;
	double *rp_x;
	double **beta0_v,**beta1_v;
	double *beta0_s,*beta1_s,*pz_s,*rp_z,alpha_s,*az;
	double *beta0_mean,*beta0_var,*beta1_mean,*beta1_var;
	double *beta0_o,*beta1_o,***pxz_o,*pz_o;
	//double temp;

	FILE *fid;

	beta0_o = (double*) calloc(K,sizeof(double));
	beta1_o = (double*) calloc(M+1,sizeof(double));
	pz_o = (double*) calloc(K,sizeof(double));
	pxz_o = (double***) calloc(aN,sizeof(double**));
	for (an=0;an<aN;an++)
	{
		pxz_o[an] = (double**) calloc(K,sizeof(double*));
		for (i=0;i<K;i++)
			pxz_o[an][i]= (double*) calloc(xM[an],sizeof(double));
	}

	beta0_v = (double**) calloc(K,sizeof(double*));
	for (i=0;i<K;i++)
	{
		beta0_v[i] = (double*) calloc(times,sizeof(double));
	}
	beta1_v = (double**) calloc(M,sizeof(double*));
	for (m=0;m<M;m++)
	{
		beta1_v[m] = (double*) calloc(times,sizeof(double));
	}

	az = (double*) calloc(K,sizeof(double));

	beta0_s = (double*) calloc(K,sizeof(double));
	beta1_s = (double*) calloc(M+1,sizeof(double));
	beta0_mean = (double*) calloc(K,sizeof(double));
	beta0_var = (double*) calloc(K,sizeof(double));
	beta1_mean = (double*) calloc(M,sizeof(double));
	beta1_var = (double*) calloc(M,sizeof(double));
	pz_s = (double*) calloc(K,sizeof(double));
	rp_z = (double*) calloc(K,sizeof(double));
	ax_an = (double*) calloc(10,sizeof(double));

	pxz_s = (double***) calloc(aN,sizeof(double**));
	for (an=0;an<aN;an++)
	{
		pxz_s[an] = (double**) calloc(K,sizeof(double*));
		for (i=0;i<K;i++)
			pxz_s[an][i]= (double*) calloc(xM[an],sizeof(double));
	}
	
	rp_x = (double*) calloc(10,sizeof(double));

	for(i=0;i<K;i++)
	{
		beta0_mean[i] = 0;
		beta0_var[i] = 0;
	}
	for(m=1;m<M+1;m++)
	{
		beta1_mean[m-1] = 0;
		beta1_var[m-1] = 0;
	}

	beta1_o[0] = 0.0;
	for (m=0;m<M;m++)
		beta1_o[m+1] = rnorm(0,0.5);
	for(i=0;i<K;i++)
	{
		beta0_o[i]=0;//rnorm(0,3);
		pz_o[i] = 0.1;
	}
	pz_o[K-1]=1-0.1*(K-1);
	for (an = 0; an<aN; an++)
	{
		for (i=0;i<K;i++) 
		{
			for (xm = 0; xm<(xM[an]-1); xm++)
  				pxz_o[an][i][xm] = 0.1;
			pxz_o[an][i][xM[an]-1] = 1-0.1*(xM[an]-1);
		}
	}
	for (time=0;time<times;time++)
    {
		for(i=0;i<K;i++)
			az[i]=alpha_o;
		dirichletrv(az,K-1,rp_z);
		for (i=0;i<K;i++) 
			pz_s[i] = rp_z[i];
 		lr = condlrfn_binary(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_o,beta1_o,pxz_o,pz_s);
		prob = whrandom(); 
		if ((log(prob) <=0)&&(log(prob) < lr))
		{
			for (i=0;i<K;i++) 	
				pz_o[i] = pz_s[i];
		}
		else
		{
			for (i=0;i<K;i++) 
				pz_s[i] = pz_o[i];
		}
 		for (i=0;i<K;i++) 
		{
			beta0_s[i] = beta0_o[i];
		}
		
		for (i=0;i<K;i++) 
		{
			beta0_s[i]=beta0_o[i]+rnorm(0,sqrt(0.1));
 			lr = -(beta0_s[i]*beta0_s[i]-beta0_o[i]*beta0_o[i])/2/9+condlrfn_binary(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_s,beta1_o,pxz_o,pz_o);
			//whseed(rand(),rand(),rand());                                   
			prob = whrandom(); 
			if ((log(prob) <=0)&&(log(prob) < lr))
				beta0_o[i] = beta0_s[i];
			else
				beta0_s[i] = beta0_o[i];
			beta0_v[i][time] = beta0_o[i];
		}

		/*
		lr=0;
		temp=rnorm(0,sqrt(0.5));
		for (i=0;i<K;i++) 
		{
			//beta0_s[i] = rnorm(0,3);
			beta0_s[i]=beta0_o[i]+temp;
			lr += -(beta0_s[i]*beta0_s[i]-beta0_o[i]*beta0_o[i])/2/9;
		}
			lr += condlrfn(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_s,beta1_o,pxz_o,pz_o);
			//whseed(rand(),rand(),rand());                                   
			prob = whrandom(); 
			//if ((prob < 1) && (prob < lr)) 
			if ((log(prob) <=0)&&(log(prob) < lr))
			{
				for (i=0;i<K;i++) 
					beta0_o[i] = beta0_s[i];
			}
			else
			{
				for (i=0;i<K;i++) 
					beta0_s[i] = beta0_o[i];
			}
			for (i=0;i<K;i++) 
				beta0_v[i][time] = beta0_o[i];
		*/
		
		
		for (i=0;i<(M+1);i++) 
		{
			beta1_s[i] = beta1_o[i];
		}
		for (i=1;i<(M+1);i++) 
		{
			//beta1_s[i] = rnorm(0,3);
 			beta1_s[i]=beta1_o[i]+rnorm(0,sqrt(0.1));
			lr = -(beta1_s[i]*beta1_s[i]-beta1_o[i]*beta1_o[i])/2/9+condlrfn_binary(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_o,beta1_s,pxz_o,pz_o);
			//whseed(rand(),rand(),rand());                                   
			prob = whrandom(); 
			//if ((prob < 1) && (prob < lr))
			if ((log(prob) <=0)&&(log(prob) < lr))
				beta1_o[i] = beta1_s[i];
			else
				beta1_s[i] = beta1_o[i];
			beta1_v[i-1][time] = beta1_o[i];
		}

		for (an = 0; an<aN; an++)
		{
			for (i=0;i<K;i++) 
			{
				for (xm = 0; xm<xM[an]; xm++)
					pxz_s[an][i][xm] = pxz_o[an][i][xm];
			}
				
		}

		for (an = 0; an<aN; an++)
		{
			
			for (i=0;i<K;i++) 
			{
				for (xm = 0; xm < xM[an]; xm++)
				{
					ax_an[xm] = ax[an][xm];
				}
				dirichletrv(ax_an,(xM[an]-1),rp_x);
				for (xm = 0; xm<xM[an]; xm++)
					pxz_s[an][i][xm] = rp_x[xm];
				lr = condlrfn_binary(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_o,beta1_o,pxz_s,pz_o);
				//whseed(rand(),rand(),rand());                                   
				prob = whrandom(); 
				//if ((prob < 1) && (prob < lr)) 
				if ((log(prob) <=0)&&(log(prob) < lr))
				{
					for (xm = 0; xm<xM[an]; xm++)
  						pxz_o[an][i][xm] = pxz_s[an][i][xm];
				}
				else 
				{
					for (xm = 0; xm<xM[an]; xm++)
  						pxz_s[an][i][xm] = pxz_o[an][i][xm];
				}
			}
		}

		alpha_s = whrandom()*5.0;
		lr = log(gammafn(K*alpha_s))-log(K*gammafn(alpha_s))-(log(gammafn(K*alpha_o))-log(K*gammafn(alpha_o)));
		for(i=0;i<K;i++)
			lr += alpha_s*log(pz_s[i])-alpha_o*log(pz_s[i]);
		prob = whrandom(); 
		if ((log(prob) <=0)&&(log(prob) < lr))
			alpha_o = alpha_s;
		else
			alpha_s = alpha_o;
		//alpha_s=alpha_o=5;
	}

	if(tt==0)
	{
		fid = fopen("LE_trace_beta0.txt","a");
		for(time=0;time<times;time++)
		{
			for (i=0;i<K;i++)
				fprintf(fid,"%4.4f ",beta0_v[i][time]);
			fprintf(fid,"\n");
		}
		fclose(fid);
		
		if(K==1)
		{
			fid = fopen("LE_trace_1.txt","a");
			for(time=0;time<times;time++)
			{
				for(m=0;m<M;m++)
					fprintf(fid,"%4.4f",beta1_v[m][time]);
				fprintf(fid,"\n");
			}
			fclose(fid);
		}
		if(K==2)
		{
			fid = fopen("LE_trace_2.txt","a");
			for(time=0;time<times;time++)
			{
				for(m=0;m<M;m++)
					fprintf(fid,"%4.4f",beta1_v[m][time]);
				fprintf(fid,"\n");
			}
			fclose(fid);
		}
		if(K==3)
		{
			fid = fopen("LE_trace_3.txt","a");
			for(time=0;time<times;time++)
			{
				for(m=0;m<M;m++)
					fprintf(fid,"%4.4f",beta1_v[m][time]);
				fprintf(fid,"\n");
			}
			fclose(fid);
		}
		if(K==4)
		{
			fid = fopen("LE_trace_4.txt","a");
			for(time=0;time<times;time++)
			{
				for(m=0;m<M;m++)
					fprintf(fid,"%4.4f",beta1_v[m][time]);
				fprintf(fid,"\n");
			}
			fclose(fid);
		}
	}
	
	for(i=0;i<K;i++)
	{
		for (time=times-Nt-1; time<times; time+=step)
		{
				beta0_mean[i] += beta0_v[i][time];
				//beta1_var[m] += beta1_v[m][time]*beta1_v[m][time];
		}
	}
	for(i=0;i<K;i++)
	{
		beta0_mean[i] /= Nt/step;
		for (time=times-Nt-1; time<times; time+=step)
			{
				beta0_var[i] += pow((beta0_v[i][time]-beta0_mean[i]),2);
			}
		
		beta0_var[i] = sqrt(beta0_var[i]/(Nt/step)) ;
	}
	for(m=0;m<M;m++)
	{
		for (time=times-Nt-1; time<times; time+=step)
		{
				beta1_mean[m] += beta1_v[m][time];
				//beta1_var[m] += beta1_v[m][time]*beta1_v[m][time];
		}
	}

	for(m=0;m<M;m++)
	{
		beta1_mean[m] /= Nt/step;
		for (time=times-Nt-1; time<times; time+=step)
			{
				beta1_var[m] += pow((beta1_v[m][time]-beta1_mean[m]),2);
			}
		
		beta1_var[m] = sqrt(beta1_var[m]/(Nt/step)) ;
	}
	if(K==1)
	{
		fid = fopen("LE_est_1.txt","a");
		fprintf(fid,"%d ",K);
		for(m=0;m<M;m++)
			fprintf(fid,"%4.4f %4.4f ",beta1_mean[m],beta1_var[m]);
		fprintf(fid,"\n");
		fclose(fid);
	}
	if(K==2)
	{
		fid = fopen("LE_est_2.txt","a");
		fprintf(fid,"%d ",K);
		for(m=0;m<M;m++)
			fprintf(fid,"%4.4f %4.4f ",beta1_mean[m],beta1_var[m]);
		fprintf(fid,"\n");
		fclose(fid);
	}
	if(K==3)
	{
		fid = fopen("LE_est_3.txt","a");
		fprintf(fid,"%d ",K);
		for(m=0;m<M;m++)
			fprintf(fid,"%4.4f %4.4f ",beta1_mean[m],beta1_var[m]);
		fprintf(fid,"\n");
		fclose(fid);
	}
	if(K==4)
	{
		fid = fopen("LE_est_4.txt","a");
		fprintf(fid,"%d ",K);
		for(m=0;m<M;m++)
			fprintf(fid,"%4.4f %4.4f ",beta1_mean[m],beta1_var[m]);
		fprintf(fid,"\n");
		fclose(fid);
	}

	for (an=0;an<aN;an++)
	{
		for (i=0;i<K;i++)
		{
			free(pxz_s[an][i]);
			free(pxz_o[an][i]);
		}
		free(pxz_s[an]);
		free(pxz_o[an]);
	}
	free(pxz_s);free(pxz_o);

	free(rp_x); 
	
	free(ax_an);

	free(beta0_o);free(beta1_o);free(pz_o);
	free(beta0_s);free(beta1_s);free(pz_s);free(rp_z);
	free(beta0_mean);free(beta0_var);
	free(beta1_mean);free(beta1_var);

	for (i=0;i<K;i++)
		free(beta0_v[0]);
	free(beta0_v);
	for (m=0;m<M;m++)
		free(beta1_v[m]);
	free(beta1_v);


 }




double condlrfn(int N,int K,int M,int aN,int ** fdata,double *beta0_o,double *beta1_o,double ***pxz_o,double *pz_o,double *beta0_s,double *beta1_s,double ***pxz_s,double *pz_s)
{	
	double llr,lr;
	double mul_o,mul_s,mul_x_o,mul_x_s;
	int i,j,an;
	// n=the number of strata
	// n_imd = the number of D = d when G = gm in ith strata.
	// M_im = the number of G = gm in ith strata.

	llr = 0;
	
	for (j = 0; j< N; j++) 
    {
		mul_o = 0;
		mul_s = 0;
		for (i = 0; i<K;i++)
		{
			mul_x_o =1;
			mul_x_s =1;
			for (an=0; an<aN;an++)
			{
				if (pxz_o[an][i][fdata[j][1+an]]!=0) 
				{
					mul_x_o *=pxz_o[an][i][fdata[j][1+an]];
					mul_x_s *=pxz_s[an][i][fdata[j][1+an]];
				}
			}
			mul_o += pz_o[i]*mul_x_o*exp(fdata[j][0]*(beta0_o[i]+beta1_o[fdata[j][1]]))/(1+exp(beta0_o[i]+beta1_o[fdata[j][1]]));
			mul_s += pz_s[i]*mul_x_s*exp(fdata[j][0]*(beta0_s[i]+beta1_s[fdata[j][1]]))/(1+exp(beta0_s[i]+beta1_s[fdata[j][1]]));
		}
		llr += log(mul_s)-log(mul_o);
	}	
		
	//lr = exp(llr);
	lr = llr;
	return (lr);
}

void est_beta_fn(int N,double *a,double **ax,double alpha_o,int step,int times,int trials, int n,int Nt,int tt,int K,int M,int aN,int *xM,int **fdata)
{
	int time,i,an,xm,m;
	double lr,prob;
	double ***pxz_s,*ax_an;
	double *rp_x;
	double **beta0_v,**beta1_v;
	double *beta0_s,*beta1_s,*pz_s,*rp_z,alpha_s,*az;
	double *beta0_mean,*beta0_var,*beta1_mean,*beta1_var;
	double *beta0_o,*beta1_o,***pxz_o,*pz_o;
	//double temp;

	FILE *fid;

	beta0_o = (double*) calloc(K,sizeof(double));
	beta1_o = (double*) calloc(M+1,sizeof(double));
	pz_o = (double*) calloc(K,sizeof(double));
	pxz_o = (double***) calloc(aN,sizeof(double**));
	for (an=0;an<aN;an++)
	{
		pxz_o[an] = (double**) calloc(K,sizeof(double*));
		for (i=0;i<K;i++)
			pxz_o[an][i]= (double*) calloc(xM[an],sizeof(double));
	}

	beta0_v = (double**) calloc(K,sizeof(double*));
	for (i=0;i<K;i++)
	{
		beta0_v[i] = (double*) calloc(times,sizeof(double));
	}
	beta1_v = (double**) calloc(M,sizeof(double*));
	for (m=0;m<M;m++)
	{
		beta1_v[m] = (double*) calloc(times,sizeof(double));
	}

	az = (double*) calloc(K,sizeof(double));

	beta0_s = (double*) calloc(K,sizeof(double));
	beta1_s = (double*) calloc(M+1,sizeof(double));
	beta0_mean = (double*) calloc(K,sizeof(double));
	beta0_var = (double*) calloc(K,sizeof(double));
	beta1_mean = (double*) calloc(M,sizeof(double));
	beta1_var = (double*) calloc(M,sizeof(double));
	pz_s = (double*) calloc(K,sizeof(double));
	rp_z = (double*) calloc(K,sizeof(double));
	ax_an = (double*) calloc(10,sizeof(double));

	pxz_s = (double***) calloc(aN,sizeof(double**));
	for (an=0;an<aN;an++)
	{
		pxz_s[an] = (double**) calloc(K,sizeof(double*));
		for (i=0;i<K;i++)
			pxz_s[an][i]= (double*) calloc(xM[an],sizeof(double));
	}
	
	rp_x = (double*) calloc(10,sizeof(double));

	for(i=0;i<K;i++)
	{
		beta0_mean[i] = 0;
		beta0_var[i] = 0;
	}
	for(m=1;m<M+1;m++)
	{
		beta1_mean[m-1] = 0;
		beta1_var[m-1] = 0;
	}

	beta1_o[0] = 0.0; 
	beta1_o[1] = beta1_o[2] = rnorm(0,0.5);
	for(i=0;i<K;i++)
	{
		beta0_o[i]=0;//rnorm(0,3);
		pz_o[i] = 0.1;
	}
	pz_o[K-1]=1-0.1*(K-1);
	for (an = 0; an<aN; an++)
	{
		for (i=0;i<K;i++) 
		{
			for (xm = 0; xm<(xM[an]-1); xm++)
  				pxz_o[an][i][xm] = 0.1;
			pxz_o[an][i][xM[an]-1] = 1-0.1*(xM[an]-1);
		}
	}
	for (time=0;time<times;time++)
    {
		for(i=0;i<K;i++)
			az[i]=alpha_o;
		dirichletrv(az,K-1,rp_z);
		for (i=0;i<K;i++) 
			pz_s[i] = rp_z[i];
 		lr = condlrfn(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_o,beta1_o,pxz_o,pz_s);
		prob = whrandom(); 
		if ((log(prob) <=0)&&(log(prob) < lr))
		{
			for (i=0;i<K;i++) 	
				pz_o[i] = pz_s[i];
		}
		else
		{
			for (i=0;i<K;i++) 
				pz_s[i] = pz_o[i];
		}
 		for (i=0;i<K;i++) 
		{
			beta0_s[i] = beta0_o[i];
		}
		
		for (i=0;i<K;i++) 
		{
			
			if (i==2)
				beta0_s[i]=rnorm(-1.1933,0.5);
			if (i==0)
				beta0_s[i]=rnorm(0.3007,0.5);
			if (i==1)
				beta0_s[i]=rnorm(-0.4192,0.5);
			lr = condlrfn(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_s,beta1_o,pxz_o,pz_o);
			
			//beta0_s[i]=beta0_o[i]+rnorm(0,sqrt(0.1));
 			//lr = -(beta0_s[i]*beta0_s[i]-beta0_o[i]*beta0_o[i])/2/9+condlrfn(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_s,beta1_o,pxz_o,pz_o);
			//whseed(rand(),rand(),rand());                                   
			prob = whrandom(); 
			if ((log(prob) <=0)&&(log(prob) < lr))
				beta0_o[i] = beta0_s[i];
			else
				beta0_s[i] = beta0_o[i];
			beta0_v[i][time] = beta0_o[i];
		}

				
		for (i=0;i<(M+1);i++) 
		{
			beta1_s[i] = beta1_o[i];
		}
		for (i=1;i<(M+1);i++) 
		{
			//beta1_s[i] = rnorm(0,3);
 			beta1_s[i]=beta1_o[i]+rnorm(0,sqrt(0.1));
			lr = -(beta1_s[i]*beta1_s[i]-beta1_o[i]*beta1_o[i])/2/9+condlrfn(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_o,beta1_s,pxz_o,pz_o);
			//whseed(rand(),rand(),rand());                                   
			prob = whrandom(); 
			//if ((prob < 1) && (prob < lr))
			if ((log(prob) <=0)&&(log(prob) < lr))
				beta1_o[i] = beta1_s[i];
			else
				beta1_s[i] = beta1_o[i];
			beta1_v[i-1][time] = beta1_o[i];
		}

		for (an = 0; an<aN; an++)
		{
			for (i=0;i<K;i++) 
			{
				for (xm = 0; xm<xM[an]; xm++)
					pxz_s[an][i][xm] = pxz_o[an][i][xm];
			}
				
		}

		for (an = 0; an<aN; an++)
		{
			
			for (i=0;i<K;i++) 
			{
				for (xm = 0; xm < xM[an]; xm++)
				{
					ax_an[xm] = ax[an][xm];
				}
				dirichletrv(ax_an,(xM[an]-1),rp_x);
				for (xm = 0; xm<xM[an]; xm++)
					pxz_s[an][i][xm] = rp_x[xm];
				lr = condlrfn(N,K,M,aN,fdata,beta0_o,beta1_o,pxz_o,pz_o,beta0_o,beta1_o,pxz_s,pz_o);
				//whseed(rand(),rand(),rand());                                   
				prob = whrandom(); 
				//if ((prob < 1) && (prob < lr)) 
				if ((log(prob) <=0)&&(log(prob) < lr))
				{
					for (xm = 0; xm<xM[an]; xm++)
  						pxz_o[an][i][xm] = pxz_s[an][i][xm];
				}
				else 
				{
					for (xm = 0; xm<xM[an]; xm++)
  						pxz_s[an][i][xm] = pxz_o[an][i][xm];
				}
			}
		}

		alpha_s = whrandom()*5.0;
		lr = log(gammafn(K*alpha_s))-log(K*gammafn(alpha_s))-(log(gammafn(K*alpha_o))-log(K*gammafn(alpha_o)));
		for(i=0;i<K;i++)
			lr += alpha_s*log(pz_s[i])-alpha_o*log(pz_s[i]);
		prob = whrandom(); 
		if ((log(prob) <=0)&&(log(prob) < lr))
			alpha_o = alpha_s;
		else
			alpha_s = alpha_o;
		//alpha_s=alpha_o=5;
	}

	if(tt==0)
	{
		fid = fopen("LE_trace_beta0.txt","a");
		for(time=0;time<times;time++)
		{
			for (i=0;i<K;i++)
				fprintf(fid,"%4.4f ",beta0_v[i][time]);
			fprintf(fid,"\n");
		}
		fclose(fid);
		
		if(K==1)
		{
			fid = fopen("LE_trace_1.txt","a");
			for(time=0;time<times;time++)
				fprintf(fid,"%4.4f %4.4f \n",beta1_v[0][time],beta1_v[1][time]);
			fclose(fid);
		}
		if(K==2)
		{
			fid = fopen("LE_trace_2.txt","a");
			for(time=0;time<times;time++)
				fprintf(fid,"%4.4f %4.4f \n",beta1_v[0][time],beta1_v[1][time]);
			fclose(fid);
		}
		if(K==3)
		{
			fid = fopen("LE_trace_3.txt","a");
			for(time=0;time<times;time++)
				fprintf(fid,"%4.4f %4.4f \n",beta1_v[0][time],beta1_v[1][time]);
			fclose(fid);
		}
		if(K==4)
		{
			fid = fopen("LE_trace_4.txt","a");
			for(time=0;time<times;time++)
				fprintf(fid,"%4.4f %4.4f \n",beta1_v[0][time],beta1_v[1][time]);
			fclose(fid);
		}
	}
	
	for(i=0;i<K;i++)
	{
		for (time=times-Nt-1; time<times; time+=step)
		{
				beta0_mean[i] += beta0_v[i][time];
				//beta1_var[m] += beta1_v[m][time]*beta1_v[m][time];
		}
	}
	for(i=0;i<K;i++)
	{
		beta0_mean[i] /= Nt/step;
		for (time=times-Nt-1; time<times; time+=step)
			{
				beta0_var[i] += pow((beta0_v[i][time]-beta0_mean[i]),2);
			}
		
		beta0_var[i] = sqrt(beta0_var[i]/(Nt/step)) ;
	}
	for(m=0;m<M;m++)
	{
		for (time=times-Nt-1; time<times; time+=step)
		{
				beta1_mean[m] += beta1_v[m][time];
				//beta1_var[m] += beta1_v[m][time]*beta1_v[m][time];
		}
	}

	for(m=0;m<M;m++)
	{
		beta1_mean[m] /= Nt/step;
		for (time=times-Nt-1; time<times; time+=step)
			{
				beta1_var[m] += pow((beta1_v[m][time]-beta1_mean[m]),2);
			}
		
		beta1_var[m] = sqrt(beta1_var[m]/(Nt/step)) ;
	}
	if(K==1)
	{
		fid = fopen("LE_est_1.txt","a");
		fprintf(fid,"%d %4.4f %4.4f %4.4f  %4.4f \n",K,beta1_mean[0],beta1_mean[1],beta1_var[0],beta1_var[1]);
		fclose(fid);
	}
	if(K==2)
	{
		fid = fopen("LE_est_2.txt","a");
		fprintf(fid,"%d %4.4f %4.4f %4.4f  %4.4f \n",K,beta1_mean[0],beta1_mean[1],beta1_var[0],beta1_var[1]);
		fclose(fid);
	}
	if(K==3)
	{
		fid = fopen("LE_est_3.txt","a");
		fprintf(fid,"%d %4.4f %4.4f %4.4f  %4.4f \n",K,beta1_mean[0],beta1_mean[1],beta1_var[0],beta1_var[1]);
		fclose(fid);
		fid = fopen("LE_est_3_beta0.txt","a");
		fprintf(fid,"%d %4.4f %4.4f %4.4f  %4.4f %4.4f %4.4f\n",K,beta0_mean[0],beta0_mean[1],beta0_mean[2],beta0_var[0],beta0_var[1],beta0_var[2]);
		fclose(fid);
	}
	if(K==4)
	{
		fid = fopen("LE_est_4.txt","a");
		fprintf(fid,"%d %4.4f %4.4f %4.4f  %4.4f \n",K,beta1_mean[0],beta1_mean[1],beta1_var[0],beta1_var[1]);
		fclose(fid);
	}

	for (an=0;an<aN;an++)
	{
		for (i=0;i<K;i++)
		{
			free(pxz_s[an][i]);
			free(pxz_o[an][i]);
		}
		free(pxz_s[an]);
		free(pxz_o[an]);
	}
	free(pxz_s);free(pxz_o);

	free(rp_x); 
	
	free(ax_an);

	free(beta0_o);free(beta1_o);free(pz_o);
	free(beta0_s);free(beta1_s);free(pz_s);free(rp_z);
	free(beta0_mean);free(beta0_var);
	free(beta1_mean);free(beta1_var);

	for (i=0;i<K;i++)
		free(beta0_v[i]);
	free(beta0_v);
	for (m=0;m<M;m++)
		free(beta1_v[m]);
	free(beta1_v);


 }



