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

#define cx 22



void clin(double x[][cx], double size[1][1], double p[][1], double lin[][1])
{

register int i,j;
register int rx;

rx=size[0][0];

for(i=0;i<rx;i++) {
lin[i][0]=0;
}

for(j=0;j<cx;j++) {
for(i=0;i<rx;i++) {
lin[i][0]=lin[i][0]+x[i][j]*p[j][0];
}
}
}



void expo(double x[][1], double size[1][1], double ex[][1])
{
register int i;
register int rx=size[0][0];

for(i=0;i<rx;i++) {
ex[i][0]=exp(x[i][0]);
}
}



void soms0(double x[][cx], double t[][1], double size[1][1], double p[][1], double som[][1])
{
register int i,j,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];

register double lin[rx][1];
register double exb[rx][1];

clin(x,size,p,lin);
expo(lin,size,exb);

for(tt=0;tt<tm;tt++) {
som[tt][0]=0;
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
som[tt][0]=som[tt][0]+exb[i][0];
}


for(tt=tm-2;tt>-1;tt--) {
som[tt][0]=som[tt+1][0]+som[tt][0];
}
}



void soms0b(double x[][cx], double t[][1], double size[1][1], double p[][1], double som[][1])
{
register int i,j,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];

register double lin[rx][1];
register double exb[rx][1];
register double somt[tm][1];

clin(x,size,p,lin);
expo(lin,size,exb);

for(tt=0;tt<tm;tt++) {
somt[tt][0]=0;
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
somt[tt][0]=somt[tt][0]+exb[i][0];
}

for(tt=tm-2;tt>-1;tt--) {
somt[tt][0]=somt[tt+1][0]+somt[tt][0];
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
som[i][0]=somt[tt][0];
}
}



void soms0c(double exb[][1], double t[][1], double size[1][1], double som[][1])
{
register int i,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];

for(tt=0;tt<tm;tt++) {
som[tt][0]=0;
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
som[tt][0]=som[tt][0]+exb[i][0];
}


for(tt=tm-2;tt>-1;tt--) {
som[tt][0]=som[tt+1][0]+som[tt][0];
}
}



void nbrisk(double t[][1], double size[1][1], double nb[1][1], double p[1][1], double som[][1])
{
register int i,j,tt,nbm;
register int rx=size[0][0];
register int tm=t[rx-1][0];
register int pas=p[0][0];
register double somt[tm][1];

for(tt=0;tt<tm;tt++) {
somt[tt][0]=0;
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
somt[tt][0]=somt[tt][0]+1;
}

for(tt=tm-2;tt>-1;tt--) {
somt[tt][0]=somt[tt+1][0]+somt[tt][0];
}

if (tm<nb[0][0]*pas) {
nbm=trunc((tm-1)/pas)+1;
}
else {
nbm=nb[0][0];
}
 
for(i=0;i<nbm;i++) {
som[i][0]=somt[i*pas][0];
}

for(i=nbm;i<nb[0][0];i++) {
som[i][0]=0;
}

}


void nbriskb(double t[][1], double size[1][1], double nb[1][1], double p[1][1], double som[][1])
{
register int i,j,tt,nbm;
register int rx=size[0][0];
register int tm=t[rx-1][0];
register int pas=p[0][0];

for(tt=0;tt<tm;tt++) {
som[tt][0]=0;
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
som[tt][0]=som[tt][0]+1;
}

for(tt=tm-2;tt>-1;tt--) {
som[tt][0]=som[tt+1][0]+som[tt][0];
}
}



void soms1(double x[][cx], double t[][1], double size[1][1], double p[][1], double **som)
{
register int i,j,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];

register double lin[rx][1];
register double exb[rx][1];

clin(x,size,p,lin);
expo(lin,size,exb);

for(tt=0;tt<tm;tt++) {
for(j=0;j<cx;j++) {
som[tt][j]=0;
}
}

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
for(j=0;j<cx;j++) {
som[tt][j]=som[tt][j]+x[i][j]*exb[i][0];
}
}

for(tt=tm-2;tt>-1;tt--) {
for(j=0;j<cx;j++) {
som[tt][j]=som[tt+1][j]+som[tt][j];
}
}
}



void ds(double t[][1], double s[][1], double n[1][1], double tm[1][1], double dsom[][1])
{
register int nc=n[0][0];
register int i,tt;

for(tt=0;tt<tm[0][0];tt++) {
dsom[tt][0]=0;
}

for(i=0;i<nc;i++) {
tt=t[i][0]-1;
dsom[tt][0]=dsom[tt][0]+s[i][0];
}
}



void somdsom(double t[][1], double s[][1], double n[1][1], double tm[1][1], double som[][1], double dsom[][1])
{
register int nc=n[0][0];
register int tmc=tm[0][0];
register int i,tt;

for(tt=0;tt<tmc;tt++) {
som[tt][0]=0;
dsom[tt][0]=0;
}

for(i=0;i<nc;i++) {
tt=t[i][0]-1;
som[tt][0]=som[tt][0]+1;
dsom[tt][0]=dsom[tt][0]+s[i][0];
}

for(tt=tmc-2;tt>-1;tt--) {
som[tt][0]=som[tt+1][0]+som[tt][0];
}
}



void kaplan(double t[][1], double n[1][1], double tm[1][1], double s[][1], double kap[][1], double vkap[][1])
{
register int tmc=tm[0][0];
register int i,tt;
register double som[tmc][1], dsom[tmc][1];

somdsom(t,s,n,tm,som,dsom);

kap[0][0]=1-dsom[0][0]/som[0][0];
vkap[0][0]=dsom[0][0]/(som[0][0]*(som[0][0]-dsom[0][0]));

for(tt=1;tt<tmc;tt++) {
kap[tt][0]=kap[tt-1][0]*(1-dsom[tt][0]/som[tt][0]);
vkap[tt][0]=vkap[tt-1][0]+dsom[tt][0]/(som[tt][0]*(som[tt][0]-dsom[tt][0]));
}

for(tt=1;tt<tmc;tt++) {
vkap[tt][0]=vkap[tt][0]*kap[tt][0]*kap[tt][0];
}
}



void akaplan(double t[][1], double n[1][1], double tm[1][1], double s[][1], double kap[][1])
{
register int tmc=tm[0][0];
register int tt;
register double som[tmc][1], dsom[tmc][1];

somdsom(t,s,n,tm,som,dsom);

kap[0][0]=1-dsom[0][0]/som[0][0];

for(tt=1;tt<tmc;tt++) {
kap[tt][0]=kap[tt-1][0]*(1-dsom[tt][0]/som[tt][0]);
}
}



void nelson(double t[][1], double n[1][1], double tm[1][1], double s[][1], double nels[][1], double vnels[][1])
{
register int nc=n[0][0];
register int tmc=tm[0][0];
register int i,tt;
register double som[tmc][1], dsom[tmc][1];

somdsom(t,s,n,tm,som,dsom);

nels[0][0]=dsom[0][0]/som[0][0];
vnels[0][0]=dsom[0][0]*(som[0][0]-dsom[0][0])/(som[0][0]*som[0][0]*som[0][0]);

for(tt=1;tt<tmc;tt++) {
nels[tt][0]=nels[tt-1][0]+dsom[tt][0]/som[tt][0];
vnels[tt][0]=vnels[tt-1][0]+dsom[tt][0]*(som[tt][0]-dsom[tt][0])/(som[tt][0]*som[tt][0]*som[tt][0]);
}
}



void comlik(double x[][cx], double t[][1], double size[1][1], double p[][1], double som[][1])
{
register int i,j,n,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];
register double s0[tm][1];

register double lin[rx][1];
register double exb[rx][1];

clin(x,size,p,lin);
expo(lin,size,exb);

soms0(x,t,size,p,s0);

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
som[i][0]=exb[i][0]/s0[tt][0];
}
}



void comlik1(double x[][cx], double t[][1], double size[1][1], double p[][1], double som[][cx])
{
register int i,j,n,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];

register double s0[tm][1];
register double lin[rx][1];
register double exb[rx][1];

double **s1;

s1=(double**) malloc(sizeof(double*)*tm);
for (tt=0;tt<tm;tt++)
s1[tt]=(double*) malloc(sizeof(double)*cx);

clin(x,size,p,lin);
expo(lin,size,exb);

soms0(x,t,size,p,s0);
soms1(x,t,size,p,s1);

for(i=0;i<rx;i++) {
tt=t[i][0]-1;
for(j=0;j<cx;j++) {
som[i][j]=(x[i][j]-s1[tt][j]/s0[tt][0]);
}
}

}



void hazc(double x[][cx], double t[][1], double s[][1], double size[1][1], double p[][1], double hc[][1], double a[][cx], double b[][1])
{
register int i,j,k,tt;
register int rx=size[0][0];
register int tm=t[rx-1][0];
register double tmc[1][1];

register double lin[rx][1];
register double exb[rx][1];

register double s0[tm][1];

register double dsom[tm][1];

register double vec1[cx][1];
register double vec2;

double **s1;

s1=(double**) malloc(sizeof(double*)*tm);
for (tt=0;tt<tm;tt++)
s1[tt]=(double*) malloc(sizeof(double)*cx);

clin(x,size,p,lin);
expo(lin,size,exb);
tmc[0][0]=tm;
ds(t,s,size,tmc,dsom);
soms0(x,t,size,p,s0);
soms1(x,t,size,p,s1);

for(tt=0;tt<tm;tt++) {
hc[tt][0]=0;
for(j=0;j<cx;j++) {
a[tt][j]=0;
}
}

for(tt=0;tt<tm;tt++) {
hc[tt][0]=dsom[tt][0]/s0[tt][0];
b[tt][0]=dsom[tt][0]/(s0[tt][0]*s0[tt][0]);
for(j=0;j<cx;j++) {
a[tt][j]=dsom[tt][0]*s1[tt][j]/(s0[tt][0]*s0[tt][0]);
}
}

for(tt=1;tt<tm;tt++) {
hc[tt][0]=hc[tt-1][0]+hc[tt][0];
b[tt][0]=b[tt-1][0]+b[tt][0];
for(j=0;j<cx;j++) {
a[tt][j]=a[tt-1][j]+a[tt][j];
}
}

free(s1);

}



void ahazc(double exb[][1], double t[][1], double s[][1], double size[1][1], double hc[][1])
{
register int tt;
register int rx=size[0][0];
register double tm=t[rx-1][0];
register double s0[tm][1];
register double dsom[tm][1];

register double tmc[1][1];

tmc[0][0]=tm;

ds(t,s,size,tmc,dsom);
soms0c(exb,t,size,s0);

for(tt=0;tt<tm;tt++) {
hc[tt][0]=0;
}

for(tt=0;tt<tm;tt++) {
hc[tt][0]=dsom[tt][0]/s0[tt][0];
}

for(tt=1;tt<tm;tt++) {
hc[tt][0]=hc[tt-1][0]+hc[tt][0];
}
}
