789 lines
29 KiB
C
789 lines
29 KiB
C
////////////////////////////////////////////////////////////////////////
|
|
// simulate.c //
|
|
// simulate file designed for Matlab LCC C compiler //
|
|
// use LCC_COMPILER option in MODEL command [defailt option] //
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#define PRINT_OUT
|
|
//#define FIXE
|
|
#define SIZE_OF_INT sizeof(int)
|
|
|
|
typedef struct t_table_y
|
|
{
|
|
int index, nb;
|
|
int *u_index, *y_index;
|
|
} t_table_y;
|
|
|
|
typedef struct t_table_u
|
|
{
|
|
struct t_table_u* pNext;
|
|
unsigned char type;
|
|
int index;
|
|
int op1, op2;
|
|
} t_table_u;
|
|
|
|
FILE *SaveCode = NULL, *fopen();
|
|
|
|
|
|
void
|
|
read_file_table_u(t_table_u **table_u, t_table_u **F_table_u,
|
|
t_table_u **i_table_u, t_table_u **F_i_table_u,
|
|
int *nb_table_u, bool i_to_do, bool shifting,
|
|
int *nb_add_u_count)
|
|
{
|
|
char type;
|
|
int i;
|
|
fread(nb_table_u, SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("->*nb_table_u=%d\n", *nb_table_u);
|
|
#endif
|
|
*table_u = (t_table_u*)mxMalloc(sizeof(t_table_u) - 2 * sizeof(int));
|
|
*F_table_u = *table_u;
|
|
for(i = 0;i < *nb_table_u;i++)
|
|
{
|
|
fread(&type, sizeof(type), 1, SaveCode);
|
|
switch (type)
|
|
{
|
|
case 3:
|
|
case 7:
|
|
(*table_u)->pNext = (t_table_u*)mxMalloc(sizeof(t_table_u) - sizeof(int));
|
|
(*table_u) = (*table_u)->pNext;
|
|
(*table_u)->type = type;
|
|
fread(&(*table_u)->index, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&(*table_u)->op1, SIZE_OF_INT, 1, SaveCode);
|
|
if(shifting)
|
|
{
|
|
(*table_u)->index -= y_kmin * u_size;
|
|
(*table_u)->op1 -= y_kmin * u_size;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
|
|
if((*table_u)->type == 3)
|
|
mexPrintf("u[%d]=-1/u[%d]\n", (*table_u)->index, (*table_u)->op1);
|
|
else
|
|
mexPrintf("u[%d]*=u[%d]\n", (*table_u)->index, (*table_u)->op1);
|
|
#endif
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 6:
|
|
(*table_u)->pNext = (t_table_u*)mxMalloc(sizeof(t_table_u));
|
|
(*table_u) = (*table_u)->pNext;
|
|
(*table_u)->type = type;
|
|
fread(&(*table_u)->index, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&(*table_u)->op1, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&(*table_u)->op2, SIZE_OF_INT, 1, SaveCode);
|
|
if(shifting)
|
|
{
|
|
(*table_u)->index -= y_kmin * u_size;
|
|
(*table_u)->op1 -= y_kmin * u_size;
|
|
(*table_u)->op2 -= y_kmin * u_size;
|
|
}
|
|
if((*table_u)->type == 1)
|
|
{
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=u[%d]*u[%d]\n", (*table_u)->index, (*table_u)->op1, (*table_u)->op2);
|
|
#endif
|
|
if(i_to_do)
|
|
(*nb_add_u_count)++;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
else if((*table_u)->type == 2)
|
|
mexPrintf("u[%d]+=u[%d]*u[%d]\n", (*table_u)->index, (*table_u)->op1, (*table_u)->op2);
|
|
else
|
|
mexPrintf("u[%d]=1/(1-u[%d]*u[%d])\n", (*table_u)->index, (*table_u)->op1, (*table_u)->op2);
|
|
#endif
|
|
break;
|
|
case 5:
|
|
(*table_u)->pNext = (t_table_u*)mxMalloc(sizeof(t_table_u) - 2 * sizeof(int));
|
|
(*table_u) = (*table_u)->pNext;
|
|
(*table_u)->type = type;
|
|
fread(&(*table_u)->index, SIZE_OF_INT, 1, SaveCode);
|
|
if(shifting)
|
|
(*table_u)->index -= y_kmin * u_size;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("push(u[%d])\n", (*table_u)->index);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
if(i_to_do)
|
|
{
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("=>i_table\n");
|
|
#endif
|
|
(*i_table_u) = (t_table_u*)mxMalloc(sizeof(t_table_u) - 2 * sizeof(int));
|
|
(*F_i_table_u) = (*i_table_u);
|
|
for(i = 0;i < *nb_table_u;i++)
|
|
{
|
|
fread(&type, sizeof(type), 1, SaveCode);
|
|
switch (type)
|
|
{
|
|
case 3:
|
|
case 7:
|
|
(*i_table_u)->pNext = (t_table_u*)mxMalloc(sizeof(t_table_u) - sizeof(int));
|
|
(*i_table_u) = (*i_table_u)->pNext;
|
|
(*i_table_u)->type = type;
|
|
fread(&(*i_table_u)->index, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&(*i_table_u)->op1, SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef FIXE
|
|
(*i_table_u)->index = u_size;
|
|
(*i_table_u)->op1 = u_size;
|
|
#endif
|
|
#ifdef PRINT_OUT
|
|
if((*i_table_u)->type == 3)
|
|
mexPrintf("u[%d]=1/(1-u[%d])\n", (*i_table_u)->index, (*i_table_u)->op1);
|
|
else
|
|
mexPrintf("u[%d]*=u[%d]\n", (*i_table_u)->index, (*i_table_u)->op1);
|
|
#endif
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 6:
|
|
(*i_table_u)->pNext = (t_table_u*)mxMalloc(sizeof(t_table_u));
|
|
(*i_table_u) = (*i_table_u)->pNext;
|
|
(*i_table_u)->type = type;
|
|
fread(&(*i_table_u)->index, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&(*i_table_u)->op1, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&(*i_table_u)->op2, SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef FIXE
|
|
(*i_table_u)->index = u_size;
|
|
(*i_table_u)->op1 = u_size;
|
|
(*i_table_u)->op2 = u_size;
|
|
#endif
|
|
#ifdef PRINT_OUT
|
|
if((*i_table_u)->type == 1)
|
|
mexPrintf("u[%d]=u[%d]*u[%d]\n", (*i_table_u)->index, (*i_table_u)->op1, (*i_table_u)->op2);
|
|
else if((*i_table_u)->type == 2)
|
|
mexPrintf("u[%d]+=u[%d]*u[%d]\n", (*i_table_u)->index, (*i_table_u)->op1, (*i_table_u)->op2);
|
|
else
|
|
mexPrintf("u[%d]=1/(1-u[%d]*u[%d])\n", (*i_table_u)->index, (*i_table_u)->op1, (*i_table_u)->op2);
|
|
#endif
|
|
break;
|
|
case 5:
|
|
(*i_table_u)->pNext = (t_table_u*)mxMalloc(sizeof(t_table_u) - 2 * sizeof(int));
|
|
(*i_table_u) = (*i_table_u)->pNext;
|
|
(*i_table_u)->type = type;
|
|
fread(&(*i_table_u)->index, SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef FIXE
|
|
(*i_table_u)->index = u_size;
|
|
#endif
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("push(u[%d])\n", (*i_table_u)->index);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
read_file_table_y(t_table_y **table_y, t_table_y **i_table_y, int *nb_table_y, bool i_to_do, bool shifting)
|
|
{
|
|
int i, k;
|
|
fread(nb_table_y, SIZE_OF_INT, 1, SaveCode);
|
|
|
|
mexPrintf("nb_table_y=%d\n", *nb_table_y);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_table_y=%d\n", *nb_table_y);
|
|
mexPrintf("y_size=%d, u_size=%d, y_kmin=%d, y_kmax=%d\n", y_size, u_size, y_kmin, y_kmax);
|
|
#endif
|
|
(*table_y) = (t_table_y*)mxMalloc((*nb_table_y) * sizeof(t_table_y));
|
|
for(i = 0;i < *nb_table_y;i++)
|
|
{
|
|
fread(&((*table_y)[i].index), SIZE_OF_INT, 1, SaveCode);
|
|
fread(&((*table_y)[i].nb), SIZE_OF_INT, 1, SaveCode);
|
|
if(shifting)
|
|
(*table_y)[i].index -= y_kmin * y_size;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("table_y[i].nb=%d\n", (*table_y)[i].nb);
|
|
mexPrintf("y[%d]=", (*table_y)[i].index);
|
|
#endif
|
|
(*table_y)[i].u_index = (int*)mxMalloc((*table_y)[i].nb * sizeof(int));
|
|
(*table_y)[i].y_index = (int*)mxMalloc((*table_y)[i].nb * sizeof(int));
|
|
for(k = 0;k < (*table_y)[i].nb;k++)
|
|
{
|
|
fread(&((*table_y)[i].u_index[k]), SIZE_OF_INT, 1, SaveCode);
|
|
fread(&((*table_y)[i].y_index[k]), SIZE_OF_INT, 1, SaveCode);
|
|
/*if(shifting)
|
|
{
|
|
(*table_y)[i].u_index[k] -= y_kmin * u_size;
|
|
if(((*table_y)[i].y_index[k] > y_size*y_kmin) && ((*table_y)[i].y_index[k] < y_size*(2*y_kmin + y_kmax + 2)))
|
|
{
|
|
(*table_y)[i].y_index[k] -= y_kmin * y_size;
|
|
}
|
|
}*/
|
|
#ifdef PRINT_OUT
|
|
//mexPrintf("sizeof((*i_table_y)[i].y_index[k])=%d\n",sizeof((*i_table_y)[i].y_index[k]));
|
|
if(k < (*table_y)[i].nb - 1)
|
|
mexPrintf("u[%d]*y[%d]+", (*table_y)[i].u_index[k], (*table_y)[i].y_index[k]);
|
|
else
|
|
mexPrintf("u[%d]*y[%d]\n", (*table_y)[i].u_index[k], (*table_y)[i].y_index[k]);
|
|
#endif
|
|
}
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("*nb_table_y=%d\n", *nb_table_y);
|
|
mexPrintf("i_to_do=%d\n", i_to_do);
|
|
#endif
|
|
if(i_to_do)
|
|
{
|
|
*i_table_y = (t_table_y*)mxMalloc((*nb_table_y) * sizeof(t_table_y));
|
|
for(i = 0;i < *nb_table_y;i++)
|
|
{
|
|
fread(&((*i_table_y)[i].index), SIZE_OF_INT, 1, SaveCode);
|
|
fread(&((*i_table_y)[i].nb), SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("(*i_table_y)[i].nb=%d\n", (*i_table_y)[i].nb);
|
|
mexPrintf("y_i[%d]=", (*i_table_y)[i].index);
|
|
#endif
|
|
(*i_table_y)[i].u_index = (int*)mxMalloc((*i_table_y)[i].nb * sizeof(int));
|
|
(*i_table_y)[i].y_index = (int*)mxMalloc((*i_table_y)[i].nb * sizeof(int));
|
|
for(k = 0;k < (*i_table_y)[i].nb;k++)
|
|
{
|
|
fread(&((*i_table_y)[i].u_index[k]), SIZE_OF_INT, 1, SaveCode);
|
|
fread(&((*i_table_y)[i].y_index[k]), SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef PRINT_OUT
|
|
if(k < (*i_table_y)[i].nb - 1)
|
|
mexPrintf("u[%d]*y[%d]+", (*i_table_y)[i].u_index[k], (*i_table_y)[i].y_index[k]);
|
|
else
|
|
mexPrintf("u[%d]*y[%d]\n", (*i_table_y)[i].u_index[k], (*i_table_y)[i].y_index[k]);
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int i, j, k, nb_endo, u_count, u_count_init;
|
|
int nb_prologue_table_u, nb_first_table_u, nb_middle_table_u, nb_last_table_u;
|
|
int nb_prologue_table_y, nb_first_table_y, nb_middle_table_y, nb_last_table_y;
|
|
int first_count_loop, middle_count_loop;
|
|
char type;
|
|
t_table_u *prologue_table_u, *first_table_u, *first_i_table_u, *middle_table_u, *middle_i_table_u, *last_table_u;
|
|
t_table_y *prologue_table_y, *first_table_y, *middle_table_y, *middle_i_table_y, *last_table_y;
|
|
t_table_u *F_prologue_table_u, *F_first_table_u, *F_first_i_table_u, *F_middle_table_u, *F_middle_i_table_u, *F_last_table_u;
|
|
|
|
|
|
void
|
|
Read_file(char* a_file_name, int periods, int u_size1, int y_size, int y_kmin, int y_kmax)
|
|
{
|
|
int nb_add_u_count = 0;
|
|
char *file_name=(char*)malloc(strlen(a_file_name)+5);
|
|
file_name=strcat(a_file_name,".bin");
|
|
u_size = u_size1;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("file_name=%s\n", file_name);
|
|
#endif
|
|
if(!SaveCode)
|
|
{
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("file opened\n");
|
|
#endif
|
|
if(!(SaveCode=fopen(file_name,"r")))
|
|
{
|
|
mexPrintf("Error : Can't open file \"%s\" for reading\n", file_name);
|
|
mexErrMsgTxt("Exit from Dynare");
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("done\n");
|
|
#endif
|
|
}
|
|
fread(&nb_endo, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&u_count, SIZE_OF_INT, 1, SaveCode);
|
|
fread(&u_count_init, SIZE_OF_INT, 1, SaveCode);
|
|
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_endo=%d, u_count=%d, u_count_init=%d\n",nb_endo,u_count, u_count_init);
|
|
mexPrintf("prologue table_u\n");
|
|
#endif
|
|
read_file_table_u(&prologue_table_u, &F_prologue_table_u, NULL, NULL, &nb_prologue_table_u, false, false, &nb_add_u_count);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_prologue_table_u=%d\n", nb_prologue_table_u);
|
|
mexPrintf("first table_u\n");
|
|
#endif
|
|
read_file_table_u(&first_table_u, &F_first_table_u, &first_i_table_u, &F_first_i_table_u, &nb_first_table_u, true, false, &nb_add_u_count);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_first_table_u=%d\n", nb_first_table_u);
|
|
mexPrintf("nb_endo=%d\n", nb_endo);
|
|
mexPrintf("nb_first_table_u=%d\n", nb_first_table_u);
|
|
mexPrintf("u_count=%d\n", u_count);
|
|
#endif
|
|
fread(&middle_count_loop, SIZE_OF_INT, 1, SaveCode);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("middle table_u\n");
|
|
#endif
|
|
read_file_table_u(&middle_table_u, &F_middle_table_u, &middle_i_table_u, &F_middle_i_table_u, &nb_middle_table_u, true, /*true*/false, &nb_add_u_count);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("last table_u\n");
|
|
#endif
|
|
read_file_table_u(&last_table_u, &F_last_table_u, NULL, NULL, &nb_last_table_u, false, false, &nb_add_u_count);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("->nb_last_table_u=%d\n", nb_last_table_u);
|
|
mexPrintf("i=%d\n", i);
|
|
mexPrintf("going to read prologue_table_y\n");
|
|
#endif
|
|
read_file_table_y(&prologue_table_y, NULL, &nb_prologue_table_y, false, false);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_prologue_table_y=%d\n", nb_prologue_table_y);
|
|
mexPrintf("going to read first_table_y\n");
|
|
#endif
|
|
read_file_table_y(&first_table_y, NULL, &nb_first_table_y, false, false);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_first_table_y=%d\n", nb_first_table_y);
|
|
mexPrintf("going to read middle_table_y\n");
|
|
#endif
|
|
read_file_table_y(&middle_table_y, &middle_i_table_y, &nb_middle_table_y, true, /*true*/false);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_middle_table_y=%d\n", nb_middle_table_y);
|
|
mexPrintf("going to read last_table_y\n");
|
|
#endif
|
|
read_file_table_y(&last_table_y, NULL, &nb_last_table_y, false, false);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_last_table_y=%d\n", nb_last_table_y);
|
|
mexPrintf("->nb_last_table_y=%d\n", nb_last_table_y);
|
|
#endif
|
|
if(nb_last_table_u > 0)
|
|
{
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("y_size=%d, periods=%d, y_kmin=%d, y_kmax=%d\n", y_size, periods, y_kmin, y_kmax);
|
|
mexPrintf("u=mxMalloc(%d)\n", u_count + 1);
|
|
#endif
|
|
u = (double*)mxMalloc((u_count + 1) * sizeof(double));
|
|
}
|
|
else
|
|
{
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u_size=%d, y_size=%d, periods=%d, y_kmin=%d, y_kmax=%d, u_count=%d, nb_add_u_count=%d\n", u_size, y_size, periods, y_kmin, y_kmax, u_count, nb_add_u_count);
|
|
mexPrintf("u=mxMalloc(%d)\n", u_count + (periods + y_kmin + y_kmax)* /*(u_count-u_size*(periods+y_kmin+y_kmax))*/nb_add_u_count);
|
|
#endif
|
|
u = (double*)mxMalloc((u_count + (periods + y_kmin + y_kmax)* /*(u_count-u_size*(periods+y_kmin+y_kmax)*/nb_add_u_count) * sizeof(double));
|
|
memset(u, 0, (u_count + (periods + y_kmin + y_kmax)* /*(u_count-u_size*(periods+y_kmin+y_kmax)*/nb_add_u_count)*sizeof(double));
|
|
}
|
|
if(u == NULL)
|
|
{
|
|
mexPrintf("memory exhausted\n");
|
|
mexErrMsgTxt("Exit from Dynare");
|
|
}
|
|
}
|
|
|
|
|
|
typedef struct t_Stack
|
|
{
|
|
double uu;
|
|
struct t_Stack *pPrev;
|
|
} t_Stack;
|
|
|
|
t_Stack *Stack=NULL, *tmp_Stack;
|
|
|
|
void push(double uu)
|
|
{
|
|
if(!Stack)
|
|
{
|
|
Stack=(t_Stack*)malloc(sizeof(t_Stack));
|
|
Stack->pPrev=NULL;
|
|
}
|
|
else
|
|
{
|
|
tmp_Stack=Stack;
|
|
Stack=(t_Stack*)malloc(sizeof(t_Stack));
|
|
Stack->pPrev=tmp_Stack;
|
|
}
|
|
Stack->uu=uu;
|
|
}
|
|
|
|
double pop()
|
|
{
|
|
double uu;
|
|
uu=Stack->uu;
|
|
Stack=Stack->pPrev;
|
|
return(uu);
|
|
}
|
|
|
|
void
|
|
simulate(int blck, int y_size, int it_, int y_kmin, int y_kmax)
|
|
{
|
|
int i, j, k, l, m, m1, nop;
|
|
int period = it_ * y_size, s_middle_count_loop = 0 ;
|
|
pctimer_t t1 = pctimer(), t2;
|
|
double uu;
|
|
#ifdef PRINT_OUT
|
|
for(j = 0;j < it_ -y_kmin;j++)
|
|
{
|
|
for(i = 0;i < u_size;i++)
|
|
{
|
|
mexPrintf("u[%d]=%f ", j*u_size + i, u[j*u_size + i]);
|
|
}
|
|
mexPrintf("\n");
|
|
}
|
|
#endif
|
|
if(nb_first_table_u > 0)
|
|
{
|
|
first_count_loop = it_;
|
|
s_middle_count_loop = it_ -y_kmin - middle_count_loop + 1;
|
|
//#ifdef PRINT_OUT
|
|
mexPrintf("----------------------------------------------------------------------\n");
|
|
mexPrintf("// Simulate \\\n");
|
|
mexPrintf("----------------------------------------------------------------------\n");
|
|
//#endif
|
|
}
|
|
nop = 0;
|
|
for(j = 0 ;j < first_count_loop - y_kmin;j++)
|
|
{
|
|
first_table_u = F_first_table_u->pNext;
|
|
first_i_table_u = F_first_i_table_u->pNext;
|
|
for(i = 0;i < nb_first_table_u;i++)
|
|
{
|
|
switch (first_table_u->type)
|
|
{
|
|
case 1:
|
|
u[first_table_u->index + j*first_i_table_u->index] = u[first_table_u->op1 + j * first_i_table_u->op1] * u[first_table_u->op2 + j * first_i_table_u->op2];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=u[%d]*u[%d]=%f\n", first_table_u->index + j*first_i_table_u->index , first_table_u->op1 + j*first_i_table_u->op1, first_table_u->op2 + j*first_i_table_u->op2, u[first_table_u->index + j*first_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 2:
|
|
u[first_table_u->index + j*first_i_table_u->index] += u[first_table_u->op1 + j * first_i_table_u->op1] * u[first_table_u->op2 + j * first_i_table_u->op2];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]+=u[%d]*u[%d]=%f\n" , first_table_u->index + j*first_i_table_u->index, first_table_u->op1 + j*first_i_table_u->op1, first_table_u->op2 + j*first_i_table_u->op2, u[first_table_u->index + j*first_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 3:
|
|
u[first_table_u->index + j*first_i_table_u->index] = 1 / ( -u[first_table_u->op1 + j * first_i_table_u->op1]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=1/(-u[%d])=%f\n", first_table_u->index + j*first_i_table_u->index, first_table_u->op1 + j*first_i_table_u->op1, u[first_table_u->index + j*first_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 5:
|
|
push(u[first_table_u->index + j*first_i_table_u->index]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("push(u[%d])\n", first_table_u->index + j*first_i_table_u->index);
|
|
#endif
|
|
break;
|
|
case 6:
|
|
u[first_table_u->index + j*first_i_table_u->index] = 1 / (1 - u[first_table_u->op1 + j * first_i_table_u->op1] * u[first_table_u->op2 + j * first_i_table_u->op2]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=1/(1-u[%d]*u[%d])=%f\n", first_table_u->index + j*first_i_table_u->index, first_table_u->op1 + j*first_i_table_u->op1, first_table_u->op2 + j*first_i_table_u->op2, u[first_table_u->index + j*first_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 7:
|
|
u[first_table_u->index + j*first_i_table_u->index] *= u[first_table_u->op1 + j * first_i_table_u->op1];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]*=u[%d]=%f\n", first_table_u->index + j*first_i_table_u->index, first_table_u->op1 + j*first_i_table_u->op1, u[first_table_u->index + j*first_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
}
|
|
first_table_u = first_table_u->pNext;
|
|
first_i_table_u = first_i_table_u->pNext;
|
|
nop++;
|
|
}
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("prologue\n");
|
|
#endif
|
|
prologue_table_u = F_prologue_table_u->pNext;
|
|
for(i = 0;i < nb_prologue_table_u;i++)
|
|
{
|
|
switch (prologue_table_u->type)
|
|
{
|
|
case 1:
|
|
u[prologue_table_u->index ] = u[prologue_table_u->op1 ] * u[prologue_table_u->op2 ];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=u[%d]*u[%d]=%f\n", prologue_table_u->index , prologue_table_u->op1 , prologue_table_u->op2 , u[prologue_table_u->index ]);
|
|
#endif
|
|
break;
|
|
case 2:
|
|
u[prologue_table_u->index ] += u[prologue_table_u->op1 ] * u[prologue_table_u->op2 ];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]+=u[%d]*u[%d]=%f\n" , prologue_table_u->index , prologue_table_u->op1 , prologue_table_u->op2 , u[prologue_table_u->index ]);
|
|
#endif
|
|
break;
|
|
case 3:
|
|
u[prologue_table_u->index ] = 1 / ( -u[prologue_table_u->op1 ]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=1/(-u[%d])=%f\n", prologue_table_u->index, prologue_table_u->op1, u[prologue_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 5:
|
|
push(u[prologue_table_u->index]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("push(u[%d])\n", prologue_table_u->index );
|
|
#endif
|
|
break;
|
|
case 6:
|
|
u[prologue_table_u->index ] = 1 / (1 - u[prologue_table_u->op1] * u[prologue_table_u->op2]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=1/(1-u[%d]*u[%d])=%f\n", prologue_table_u->index, prologue_table_u->op1, prologue_table_u->op2, u[prologue_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 7:
|
|
u[prologue_table_u->index] *= u[prologue_table_u->op1];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]*=u[%d]=%f\n", prologue_table_u->index, prologue_table_u->op1, u[prologue_table_u->index]);
|
|
#endif
|
|
break;
|
|
}
|
|
prologue_table_u = prologue_table_u->pNext;
|
|
nop++;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("middle_u (s_middle_count_loop=%d\n", s_middle_count_loop);
|
|
#endif
|
|
for(j = 0;j < s_middle_count_loop - y_kmin;j++)
|
|
{
|
|
//cout << "j=" << j << "\n";
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("-----------------------------------------------------------------\n");
|
|
#endif
|
|
middle_table_u = F_middle_table_u->pNext;
|
|
middle_i_table_u = F_middle_i_table_u->pNext;
|
|
for(i = 0;i < nb_middle_table_u;i++)
|
|
{
|
|
switch (middle_table_u->type)
|
|
{
|
|
case 1:
|
|
u[middle_table_u->index + j*middle_i_table_u->index] = u[middle_table_u->op1 + j * middle_i_table_u->op1] * u[middle_table_u->op2 + j * middle_i_table_u->op2];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d+%d*%d=%d]=u[%d]*u[%d]=%f\n", middle_table_u->index, j, middle_i_table_u->index, middle_table_u->index + j*middle_i_table_u->index, middle_table_u->op1 + j*middle_i_table_u->op1, middle_table_u->op2 + j*middle_i_table_u->op2, u[middle_table_u->index + j*middle_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 2:
|
|
u[middle_table_u->index + j*middle_i_table_u->index] += u[middle_table_u->op1 + j * middle_i_table_u->op1] * u[middle_table_u->op2 + j * middle_i_table_u->op2];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d+%d*%d=%d]+=u[%d]*u[%d]=%f\n" , middle_table_u->index, j, middle_i_table_u->index , middle_table_u->index + j*middle_i_table_u->index , middle_table_u->op1 + j*middle_i_table_u->op1, middle_table_u->op2 + j*middle_i_table_u->op2, u[middle_table_u->index + j*middle_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 3:
|
|
u[middle_table_u->index + middle_i_table_u->index] = 1 / ( -u[middle_table_u->op1 + j * middle_i_table_u->op1]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d+%d*%d=%d]=1/(-u[%d])=%f\n", middle_table_u->index, j, middle_i_table_u->index, middle_table_u->index + j*middle_i_table_u->index, middle_table_u->op1 + j*middle_i_table_u->op1, u[middle_table_u->index + j*middle_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 5:
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("push(u[%d+%d*%d=%d])\n", middle_table_u->index, j, middle_i_table_u->index, middle_table_u->index + j*middle_i_table_u->index);
|
|
#endif
|
|
push(u[middle_table_u->index + j*middle_i_table_u->index]);
|
|
break;
|
|
case 6:
|
|
u[middle_table_u->index + j*middle_i_table_u->index] = 1 / (1 - u[middle_table_u->op1 + j * middle_i_table_u->op1] * u[middle_table_u->op2 + j * middle_i_table_u->op2]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d+%d*%d=%d]=1/(1-u[%d]*u[%d])=%f\n", middle_table_u->index, j, middle_i_table_u->index, middle_table_u->index + j*middle_i_table_u->index, middle_table_u->op1 + j*middle_i_table_u->op1, middle_table_u->op2 + j*middle_i_table_u->op2, u[middle_table_u->index + j*middle_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 7:
|
|
u[middle_table_u->index + j*middle_i_table_u->index] *= u[middle_table_u->op1 + j * middle_i_table_u->op1];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d+%d*%d=%d]*=u[%d]=%f\n", middle_table_u->index, j, middle_i_table_u->index, middle_table_u->index + j*middle_i_table_u->index, middle_table_u->op1 + j*middle_i_table_u->op1, u[middle_table_u->index + j*middle_i_table_u->index]);
|
|
#endif
|
|
break;
|
|
}
|
|
middle_table_u = middle_table_u->pNext;
|
|
middle_i_table_u = middle_i_table_u->pNext;
|
|
nop++;
|
|
}
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("last_u\n");
|
|
#endif
|
|
last_table_u = F_last_table_u->pNext;
|
|
for(i = 0;i < nb_last_table_u ;i++)
|
|
{
|
|
switch (last_table_u->type)
|
|
{
|
|
case 1:
|
|
u[last_table_u->index] = u[last_table_u->op1] * u[last_table_u->op2];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=u[%d]*u[%d]=%f\n", last_table_u->index, last_table_u->op1, last_table_u->op2, u[last_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 2:
|
|
u[last_table_u->index] += u[last_table_u->op1] * u[last_table_u->op2];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]+=u[%d]*u[%d]=%f\n", last_table_u->index, last_table_u->op1, last_table_u->op2, u[last_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 3:
|
|
u[last_table_u->index] = 1 / ( -u[last_table_u->op1]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=1/(-u[%d])=%f\n", last_table_u->index, last_table_u->op1, u[last_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 5:
|
|
push(u[last_table_u->index]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("push(u[%d])\n", last_table_u->index);
|
|
#endif
|
|
break;
|
|
case 6:
|
|
u[last_table_u->index] = 1 / (1 - u[last_table_u->op1] * u[last_table_u->op2]);
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]=1/(1-u[%d]*u[%d])=%f\n", last_table_u->index, last_table_u->op1, last_table_u->op2, u[last_table_u->index]);
|
|
#endif
|
|
break;
|
|
case 7:
|
|
u[last_table_u->index] *= u[last_table_u->op1];
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("u[%d]*=u[%d]=%f\n", last_table_u->index, last_table_u->op1, u[last_table_u->index]);
|
|
#endif
|
|
break;
|
|
}
|
|
last_table_u = last_table_u->pNext;
|
|
nop++;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("nb_last_table_y=%d\n",nb_last_table_y);
|
|
#endif
|
|
for(i = nb_last_table_y - 1;i >= 0;i--)
|
|
{
|
|
k = last_table_y[i].index;
|
|
y[period + k] = 0;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("it_=%d\n", it_);
|
|
mexPrintf("->y[it_*y_size+%d]=y[%d]=", k, it_*y_size + k);
|
|
#endif
|
|
for(j = last_table_y[i].nb - 1;j >= 0;j--)
|
|
{
|
|
uu = pop();
|
|
m = last_table_y[i].y_index[j];
|
|
#ifdef PRINT_OUT
|
|
if(j > 0)
|
|
{
|
|
if(m >= 0)
|
|
mexPrintf("u[%d](%f)*y[%d]+", last_table_y[i].u_index[j], uu, last_table_y[i].y_index[j]);
|
|
else
|
|
mexPrintf("u[%d](%f)+", last_table_y[i].u_index[j], uu);
|
|
}
|
|
else
|
|
{
|
|
if(m >= 0)
|
|
mexPrintf("u[%d](%f)*y[%d]", last_table_y[i].u_index[j], uu, last_table_y[i].y_index[j]);
|
|
else
|
|
mexPrintf("u[%d](%f)", last_table_y[i].u_index[j], uu);
|
|
}
|
|
#endif
|
|
if(m >= 0)
|
|
y[period + k] += uu * y[period + m];
|
|
else
|
|
y[period + k] += uu;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("=%f\n", y[period + k]);
|
|
#endif
|
|
nop++;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("s_middle_count_loop=%d\n",s_middle_count_loop);
|
|
mexPrintf("nb_middle_table_y=%d\n",nb_middle_table_y);
|
|
#endif
|
|
for(j = s_middle_count_loop - y_kmin - 1;j >= 0;j--)
|
|
{
|
|
for(i = nb_middle_table_y - 1;i >= 0;i--)
|
|
{
|
|
k = middle_table_y[i].index + j * middle_i_table_y[i].index;
|
|
y[k] = 0;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("y[%d]=", k );
|
|
#endif
|
|
for(l = middle_table_y[i].nb - 1;l >= 0;l--)
|
|
{
|
|
uu = pop();
|
|
m = middle_table_y[i].y_index[l] + j * middle_i_table_y[i].y_index[l];
|
|
#ifdef PRINT_OUT
|
|
if(m >= 0)
|
|
{
|
|
m1 = middle_table_y[i].u_index[l] + j * middle_i_table_y[i].u_index[l];
|
|
if(l > 0)
|
|
mexPrintf("u[%d](%f)*y[%d](%f)+", m1, uu, m, y[m]);
|
|
else
|
|
mexPrintf("u[%d](%f)*y[%d](%f)", m1, uu, m, y[m]);
|
|
}
|
|
else
|
|
{
|
|
m1 = middle_table_y[i].u_index[l] + j * middle_i_table_y[i].u_index[l];
|
|
if(l > 0)
|
|
mexPrintf("u[%d](%f)*y[%d](%f)+", m1, uu, m, 1.0);
|
|
else
|
|
mexPrintf("u[%d](%f)*y[%d](%f)", m1, uu, m, 1.0);
|
|
}
|
|
#endif
|
|
if(m >= 0)
|
|
y[k] += uu * y[m];
|
|
else
|
|
y[k] += uu;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("=%f\n", y[k]);
|
|
#endif
|
|
nop++;
|
|
}
|
|
}
|
|
for(i = nb_prologue_table_y - 1;i >= 0;i--)
|
|
{
|
|
k = prologue_table_y[i].index;
|
|
y[k] = 0;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("y[%d]=", k);
|
|
#endif
|
|
for(j = prologue_table_y[i].nb - 1;j >= 0;j--)
|
|
{
|
|
uu = pop();
|
|
#ifdef PRINT_OUT
|
|
if(prologue_table_y[i].y_index[j] >= 0)
|
|
{
|
|
if(j > 0)
|
|
mexPrintf("u[%d](%f)*y[%d](%f)+", prologue_table_y[i].u_index[j], uu, prologue_table_y[i].y_index[j], y[prologue_table_y[i].y_index[j]]);
|
|
else
|
|
mexPrintf("u[%d](%f)*y[%d](%f)", prologue_table_y[i].u_index[j], uu, prologue_table_y[i].y_index[j], y[prologue_table_y[i].y_index[j]]);
|
|
}
|
|
else
|
|
{
|
|
if(j > 0)
|
|
mexPrintf("u[%d](%f)*y[%d](%f)+", prologue_table_y[i].u_index[j], uu, prologue_table_y[i].y_index[j], 1.0);
|
|
else
|
|
mexPrintf("u[%d](%f)*y[%d](%f)", prologue_table_y[i].u_index[j], uu, prologue_table_y[i].y_index[j], 1.0);
|
|
}
|
|
#endif
|
|
if(prologue_table_y[i].y_index[j] >= 0)
|
|
y[k] += uu * y[prologue_table_y[i].y_index[j]];
|
|
else
|
|
y[k] += uu;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("=%f\n", y[k]);
|
|
#endif
|
|
nop++;
|
|
}
|
|
for(i = nb_first_table_y - 1;i >= 0;i--)
|
|
{
|
|
k = first_table_y[i].index;
|
|
y[k] = 0;
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("y[%d]=", k);
|
|
#endif
|
|
for(j = first_table_y[i].nb - 1;j >= 0;j--)
|
|
{
|
|
uu = pop();
|
|
#ifdef PRINT_OUT
|
|
if(j > 0)
|
|
mexPrintf("u[%d](%f)*y[%d](%f)+", first_table_y[i].u_index[j], uu, first_table_y[i].y_index[j], y[first_table_y[i].y_index[j]]);
|
|
else
|
|
mexPrintf("u[%d](%f)*y[%d](%f)", first_table_y[i].u_index[j], uu, first_table_y[i].y_index[j], y[first_table_y[i].y_index[j]]);
|
|
#endif
|
|
if(m >= 0)
|
|
y[k] += uu * y[first_table_y[i].y_index[j]];
|
|
else
|
|
y[k] += uu;
|
|
}
|
|
#ifdef PRINT_OUT
|
|
mexPrintf("=%f\n", y[k]);
|
|
#endif
|
|
nop++;
|
|
}
|
|
t2 = pctimer();
|
|
if(nb_first_table_u > 0)
|
|
mexPrintf("(**%f milliseconds u_count : %d nop : %d **)\n", 1000*(t2 - t1), u_count, nop);
|
|
}
|
|
|