RE: local function definitios are illegal
dear guys,
i wrote a c++ code and compiled it using VC++ 6. I got the following
errors when compiling:
full1.cpp
full1.cpp(177) : error C2601: 'calculate_logit' : local function
definitions are illegal
full1.cpp(414) : error C2601: 'preliminary_calculations' : local
function definitions are illegal
full1.cpp(419) : error C2143: syntax error : missing ';' before '{'
full1.cpp(422) : error C2143: syntax error : missing ';' before '{'
full1.cpp(427) : error C2601: 'report' : local function definitions
are illegal
full1.cpp(429) : error C2601: 'final_calcs' : local function
definitions are illegal
full1.cpp(443) : error C2601: 'main' : local function definitions are
illegal
full1.cpp(458) : fatal error C1004: unexpected end of file found
obviously I don't know what could be going on, and hope someone in
this group could help me with this. Thank you very much in advance. I
also post the code (it's kinda long) here.
Sean
the code:
#include <admodel.h>
#include <full1.htp>
model_data::model_data(int argc,char * argv[]) : ad_comm(argc,argv)
{
nhouse=191;
nprods=3;
nsizes=5;
nupcs=15;
ndraws=30;
num_market_vars=2;
nweeks=105;
ad_comm::change_datafile_name("ntimes1.txt");
if (!(*ad_comm::global_datafile)) cerr << "Error A" << endl;
ntimes.allocate(1,nhouse,"ntimes");
ad_comm::change_datafile_name("purchase1.txt");
incidents.allocate(1,nhouse,1,ntimes,1,9,"incidents");
ad_comm::change_datafile_name("pfd1.txt");
X1.allocate(1,nweeks,1,nsizes,1,nprods,1,2,"X1");
ad_comm::change_datafile_name("inventory.txt");
inv.allocate(1,nhouse,1,ntimes,1,2,"inv");
ad_comm::change_datafile_name("lagdummies.txt");
lagdummy.allocate(1,nhouse,1,ntimes,1,3,"lagdummy");
ad_comm::change_datafile_name("rdndraws1.txt");
errdel.allocate(1,nhouse,1,ntimes,1,nprods,1,nsizes,
1,ndraws,"errdel");
ad_comm::change_datafile_name("rdndraws2.txt");
errmu.allocate(1,nhouse,1,nprods,1,nsizes,1,ndraws,"errmu");
ad_comm::change_datafile_name("rdndraws3.txt");
erromega.allocate(1,nhouse,1,ntimes,1,nupcs,1,nsizes,
1,ndraws,"erromega");
}
model_parameters::model_parameters(int sz,int argc,char * argv[]) :
model_data(argc,argv) , function_minimizer(sz)
{
initializationfunction();
theta1.allocate(1,9,1,ndraws,"theta1");
#ifndef NO_AD_INITIALIZE
theta1.initialize();
#endif
alpha1.allocate(1,14,"alpha1");
b1.allocate(1,4,"b1");
rhos.allocate(1,4,"rhos");
wa.allocate("wa");
r.allocate(-10.,10.1,"r");
sddel.allocate(-1.0,1.0,"sddel");
sdini.allocate(-1.0,1.0,"sdini");
sdomega.allocate(-1.0,1.0,"sdomega");
varmu.allocate(1,nhouse,1,nprods,1,nsizes,1,ntimes,"varmu");
#ifndef NO_AD_INITIALIZE
varmu.initialize();
#endif
varomega.allocate(1,nhouse,1,nprods,1,nsizes,1,nsizes,
1,ntimes,"varomega");
#ifndef NO_AD_INITIALIZE
varomega.initialize();
#endif
beta.allocate(1,nhouse,1,ntimes,"beta");
#ifndef NO_AD_INITIALIZE
beta.initialize();
#endif
beta1.allocate(1,nhouse,1,ntimes,"beta1");
#ifndef NO_AD_INITIALIZE
beta1.initialize();
#endif
beta2.allocate(1,nhouse,1,ntimes,"beta2");
#ifndef NO_AD_INITIALIZE
beta2.initialize();
#endif
mu.allocate(1,nhouse,1,nprods,1,nsizes,1,ntimes,1,ndraws,"mu");
#ifndef NO_AD_INITIALIZE
mu.initialize();
#endif
denom.allocate("denom");
#ifndef NO_AD_INITIALIZE
denom.initialize();
#endif
denom1.allocate("denom1");
#ifndef NO_AD_INITIALIZE
denom1.initialize();
#endif
denom2.allocate("denom2");
#ifndef NO_AD_INITIALIZE
denom2.initialize();
#endif
kappa1.allocate("kappa1");
#ifndef NO_AD_INITIALIZE
kappa1.initialize();
#endif
kappa2.allocate("kappa2");
#ifndef NO_AD_INITIALIZE
kappa2.initialize();
#endif
S.allocate(1,nprods,1,nprods,"S");
#ifndef NO_AD_INITIALIZE
S.initialize();
#endif
A.allocate(1,nprods,1,nsizes,"A");
#ifndef NO_AD_INITIALIZE
A.initialize();
#endif
R.allocate(1,nsizes,1,nsizes,"R");
#ifndef NO_AD_INITIALIZE
R.initialize();
#endif
temp.allocate(1,ndraws,"temp");
#ifndef NO_AD_INITIALIZE
temp.initialize();
#endif
P1.allocate("P1");
#ifndef NO_AD_INITIALIZE
P1.initialize();
#endif
f.allocate("f");
}
void model_parameters::userfunction(void)
{
cout << "starting calcs" << endl;
calculate_indices();
calculate_logit();
cout << "ending calcs" << endl;
}
void model_parameters::set_runtime(void)
{
dvector temp("{1.e-6}");
convergence_criteria.allocate(temp.indexmin(),temp.indexmax());
convergence_criteria=temp;
}
void model_parameters::calculate_indices(void)
{
int i,j;
S.initialize();
A.initialize();
R.initialize();
for (i=1;i<=nprods;i++)
{
for (j=1;j<=nprods;j++)
{
if (i==j)
S(i,j)=1;
else
S(i,j)=0;
}
}
for (i=1;i<=nprods;i++)
{
for (j=1;j<=nsizes;j++)
{
if (i==nprods && j==nsizes)
{
A(i,j)=0-sum(alpha1);
}
else
{
A(i,j)=alpha1((i-1)*nsizes+j);
}
//this is identification restriction; the 15th A is normalized;
}
for (i=1;i<=5;i++)
{
if (i==1)
{
R(i,2)=rhos(1);
}
else if (i==2)
{
R(i,1)=rhos(1);
R(i,3)=rhos(2);
}
else if (i==3)
{
R(i,2)=rhos(2);
R(i,4)=rhos(3);
}
else if (i==4)
{
R(i,3)=rhos(3);
R(i,5)=rhos(4);
}
else
{
R(i,4)=rhos(4);
}
}
}
void model_parameters::calculate_logit(void)
{
int h,i,j,k,l,m,n,s,t,sz;
funnel_dvariable fd;
for (h=1;h<=nhouse;h++)
{
ad_begin_funnel();
dvariable f1=0.0;
for (t=1;t<=ntimes(h);t++)
{
int week=incidents(h,t,3);
int brand=incidents(h,t,4);
int size=incidents(h,t,6);
int upc=(incidents(h,t,6)-1)*nprods+incidents(h,t,4);
dmatrix inc=incidents(h);
dmatrix lbs=lagdummy(h);
for (j=1;j<=nprods;j++)
{
if (size>0)
{
sz=size;
}
else
{
sz=lbs(t,3);
//this is the lag size;
}
if (t==1)
{
for (i=1;i<=nsizes;i++)
{
varmu(h,j,i,1)=pow(sdini,2);
// start with initial variance;
mu(h,j,i,1)=sqrt(pow(sdini,2))*errmu(h,j,i);
}
for (i=1;i<=nsizes;i++)
{
s=(i-1)*nprods+j;
if (i==sz)
{
denom=varmu(h,j,i,1)+pow(sddel,2);
beta(h,1)=varmu(h,j,i,1)/denom;
varmu(h,j,i,1)=(1-beta(h,1))*varmu(h,j,i,1);
mu(h,j,i,1)=mu(h,j,i,1)+beta(h,1)*(sqrt(pow(sddel,2))*errdel(h,
1,j,i)-mu(h,j,i,1));
// the next if else-if else routine updates the 2 adjacent sizes
of that brand;
if (i==1)
{
varomega(h,j,i,i+1,1)=(varmu(h,j,i,1)+pow(sddel,2))*(varmu(h,j,i
+1,1)+pow(sddel,2));
kappa1=sqrt(varmu(h,j,i,1))*sqrt(varmu(h,j,i+1,1))*sqrt(pow(R(i,i
+1),2));
varomega(h,j,i,i+1,1)=(varomega(h,j,i,i+1,1)+pow(kappa1,2))/
(varmu(h,j,i+1,1)+pow(sddel,2));
kappa1=kappa1/(varmu(h,j,i+1,1)+pow(sddel,2));
denom1=pow(kappa1,2)*varmu(h,j,i+1,1)+pow(kappa1,2)*pow(sddel,
2)+varomega(h,j,i,i+1,1);
beta1(h,1)=pow(kappa1,2)*varmu(h,j,i+1,1)/denom;
varmu(h,j,i+1,1)=(1-beta1(h,1))*varmu(h,j,i+1,1);
mu(h,j,i+1,1)=mu(h,j,i+1,1)+beta1(h,1)*(sqrt(pow(sddel,
2))*errdel(h,1,j,i+1)-mu(h,j,i+1,1))
+beta1(h,1)/kappa1*sqrt(pow(sdomega,2))*erromega(h,1,s,i
+1);
}
else if (i==5)
{
varomega(h,j,i,i-1,1)=(varmu(h,j,i,1)+pow(sddel,
2))*(varmu(h,j,i-1,1)+pow(sddel,2));
kappa2=sqrt(varmu(h,j,i,
1))*sqrt(varmu(h,j,i-1,1))*sqrt(pow(R(i,i-1),2));
varomega(h,j,i,i-1,1)=(varomega(h,j,i,i-1,1)+pow(kappa2,2))/
(varmu(h,j,i-1,1)+pow(sddel,2));
kappa2=kappa2/(varmu(h,j,i-1,1)+pow(sddel,2));
denom2=pow(kappa2,2)*varmu(h,j,i-1,1)+pow(kappa2,2)*pow(sddel,
2)+varomega(h,j,i,i-1,1);
beta2(h,1)=pow(kappa2,2)*varmu(h,j,i-1,1)/denom;
varmu(h,j,i-1,1)=(1-beta2(h,1))*varmu(h,j,i-1,1);
mu(h,j,i-1,1)=mu(h,j,i-1,1)+beta2(h,1)*(sqrt(pow(sddel,
2))*errdel(h,1,j,i-1)-mu(h,j,i-1,1))
+beta2(h,1)/kappa2*sqrt(pow(sdomega,2))*erromega(h,
1,s,i-1);
}
else
{
varomega(h,j,i,i+1,1)=(varmu(h,j,i,1)+pow(sddel,2))*(varmu(h,j,i
+1,1)+pow(sddel,2));
kappa1=sqrt(varmu(h,j,i,1))*sqrt(varmu(h,j,i+1,1))*sqrt(pow(R(i,i
+1),2));
varomega(h,j,i,i+1,1)=(varomega(h,j,i,i+1,1)+pow(kappa1,2))/
(varmu(h,j,i+1,1)+pow(sddel,2));
kappa1=kappa1/(varmu(h,j,i+1,1)+pow(sddel,2));
denom1=pow(kappa1,2)*varmu(h,j,i+1,1)+pow(kappa1,2)*pow(sddel,
2)+varomega(h,j,i,i+1,1);
beta1(h,1)=pow(kappa1,2)*varmu(h,j,i+1,1)/denom;
varmu(h,j,i+1,1)=(1-beta1(h,1))*varmu(h,j,i+1,1);
mu(h,j,i+1,1)=mu(h,j,i+1,1)+beta1(h,1)*(sqrt(pow(sddel,
2))*errdel(h,1,j,i+1)-mu(h,j,i+1,1))
+beta1(h,1)/kappa1*sqrt(pow(sdomega,2))*erromega(h,1,s,i
+1);
varomega(h,j,i,i-1,1)=(varmu(h,j,i,1)+pow(sddel,
2))*(varmu(h,j,i-1,1)+pow(sddel,2));
kappa2=sqrt(varmu(h,j,i,
1))*sqrt(varmu(h,j,i-1,1))*sqrt(pow(R(i,i-1),2));
varomega(h,j,i,i-1,1)=(varomega(h,j,i,i-1,1)+pow(kappa2,2))/
(varmu(h,j,i-1,1)+pow(sddel,2));
kappa2=kappa2/(varmu(h,j,i-1,1)+pow(sddel,2));
denom2=pow(kappa2,2)*varmu(h,j,i-1,1)+pow(kappa2,2)*pow(sddel,
2)+varomega(h,j,i,i-1,1);
beta2(h,1)=pow(kappa2,2)*varmu(h,j,i-1,1)/denom;
varmu(h,j,i-1,1)=(1-beta2(h,1))*varmu(h,j,i-1,1);
mu(h,j,i-1,1)=mu(h,j,i-1,1)+beta2(h,1)*(sqrt(pow(sddel,
2))*errdel(h,1,j,i-1)-mu(h,j,i-1,1))
+beta2(h,1)/kappa2*sqrt(pow(sdomega,2))*erromega(h,
1,s,i-1);
}//for if else
}//for if (i==size)
}// for i=1;i<=nsizes;i++;
}// for if (t==1)
else if (brand!=j)
{
for (i=1;i<=nsizes;i++)
{
varmu(h,j,i,t)=varmu(h,j,i,t-1);
mu(h,j,i,t)=mu(h,j,i,t-1);
}
}
else//brand==j, the size bought will be updated; the 2 adjacent
sizes of the size bought will also be updated
{
for (i=1;i<=nsizes;i++)
{
s=(i-1)*nprods+j;
if (i==sz)
{
denom=varmu(h,j,i,t-1)+pow(sddel,2);
beta(h,t)=varmu(h,j,i,t-1)/denom;
varmu(h,j,i,t)=(1-beta(h,t))*varmu(h,j,i,t-1);
mu(h,j,i,t)=mu(h,j,i,t-1)+beta(h,t)*(sqrt(pow(sddel,
2))*errdel(h,t,j,i)-mu(h,j,i,t-1));
//varmu(h,j,i,t)=varmu(h,j,i,t-1);
//mu(h,j,i,t)=mu(h,j,i,t-1);
}
else if (i==sz+1)
{
varomega(h,j,i-1,i,t)=(varmu(h,j,i-1,t-1)+pow(sddel,
2))*(varmu(h,j,i,t-1)+pow(sddel,2));
kappa1=sqrt(varmu(h,j,i-1,t-1))*sqrt(varmu(h,j,i,t-1))*sqrt(pow(R(i-1,i),
2));
varomega(h,j,i-1,i,t)=(varomega(h,j,i-1,i,t)+pow(kappa1,2))/
(varmu(h,j,i-1,t-1)+pow(sddel,2));
kappa1=kappa1/(varmu(h,j,i,t-1)+pow(sddel,2));
denom1=pow(kappa1,2)*varmu(h,j,i,t-1)+pow(kappa1,2)*pow(sddel,
2)+varomega(h,j,i-1,i,t);
beta1(h,t)=pow(kappa1,2)*varmu(h,j,i,t-1)/denom;
varmu(h,j,i,t)=(1-beta1(h,t))*varmu(h,j,i,t);
mu(h,j,i,t)=mu(h,j,i,t-1)+beta1(h,t)*(sqrt(pow(sddel,
2))*errdel(h,t,j,i)-mu(h,j,i,t-1))
+beta1(h,1)/kappa1*sqrt(pow(sdomega,2))*erromega(h,t,s,i);
}
else if (i==sz-1)
{
varomega(h,j,i+1,i,t)=(varmu(h,j,i+1,t-1)+pow(sddel,
2))*(varmu(h,j,i,t-1)+pow(sddel,2));
kappa2=sqrt(varmu(h,j,i+1,t-1))*sqrt(varmu(h,j,i,t-1))*sqrt(pow(R(i
+1,i),2));
varomega(h,j,i+1,i,t)=(varomega(h,j,i+1,i,t)+pow(kappa2,2))/
(varmu(h,j,i,t-1)+pow(sddel,2));
kappa2=kappa2/(varmu(h,j,i,t-1)+pow(sddel,2));
denom2=pow(kappa2,2)*varmu(h,j,i,t-1)+pow(kappa2,2)*pow(sddel,
2)+varomega(h,j,i+1,i,t);
beta2(h,t)=pow(kappa2,2)*varmu(h,j,i,t-1)/denom;
varmu(h,j,i,t)=(1-beta2(h,t))*varmu(h,j,i,t-1);
mu(h,j,i,t)=mu(h,j,i,t-1)+beta2(h,t)*(sqrt(pow(sddel,
2))*errdel(h,t,j,i)-mu(h,j,i,t-1))
+beta2(h,1)/kappa2*sqrt(pow(sdomega,
2))*erromega(h,t,s,i);
}
else
{
varmu(h,j,i,t)=varmu(h,j,i,t-1);
mu(h,j,i,t)=mu(h,j,i,t-1);
}// for if (i==sz)
}// for i=1;i<=nsizes;i++
}// for if (t==1)
s=sz;
k=j+nprods;
l=s-1;
m=j+2*nprods;
n=s+1;
theta1(j)=exp(wa*(A(j,s)+mu(h,j,s,t))
+wa*r*elem_prod(A(j,s)+mu(h,j,s,t),A(j,s)+mu(h,j,s,t))
+wa*r*varmu(h,j,s,t)+wa*r*pow(sddel,2)
+X1(week,s,j,1)*b1(1)+X1(week,s,j,2)*b1(2)+S(lbs(t,2),j)*b1(3));
theta1(k)=0;
theta1(m)=0;
if (sz==1)
{
theta1(m)=exp(wa*(A(j,n)+mu(h,j,n,t))
+wa*r*elem_prod(A(j,n)+mu(h,j,n,t),A(j,n)+mu(h,j,n,t))
+wa*r*varmu(h,j,n,t)+wa*r*pow(sddel,2)
+X1(week,n,j,1)*b1(1)+X1(week,n,j,2)*b1(2)+S(lbs(t,2),j)*b1(3));
}
else if (sz==5)
{
theta1(k)=exp(wa*(A(j,l)+mu(h,j,l,t))
+wa*r*elem_prod(A(j,l)+mu(h,j,l,t),A(j,l)+mu(h,j,l,t))
+wa*r*varmu(h,j,l,t)+wa*r*pow(sddel,2)
+X1(week,l,j,1)*b1(1)+X1(week,l,j,2)*b1(2)+S(lbs(t,2),j)*b1(3));
}
else
{
theta1(k)=exp(wa*(A(j,l)+mu(h,j,l,t))
+wa*r*elem_prod(A(j,l)+mu(h,j,l,t),A(j,l)+mu(h,j,l,t))
+wa*r*varmu(h,j,l,t)+wa*r*pow(sddel,2)
+X1(week,l,j,1)*b1(1)+X1(week,l,j,2)*b1(2)+S(lbs(t,2),j)*b1(3));
theta1(m)=exp(wa*(A(j,n)+mu(h,j,n,t))
+wa*r*elem_prod(A(j,n)+mu(h,j,n,t),A(j,n)+mu(h,j,n,t))
+wa*r*varmu(h,j,n,t)+wa*r*pow(sddel,2)
+X1(week,n,j,1)*b1(1)+X1(week,n,j,2)*b1(2)+S(lbs(t,2),j)*b1(3));
}
} // for j=1;j<=nprods;j++
if (brand==0)
{
temp(1,ndraws)=exp(b1(4)*inv(h,t,2));
temp=elem_div(temp,temp+colsum(theta1));
P1=sum(temp)/ndraws;
}
else
{
temp(1,ndraws)=exp(b1(4)*inv(h,t,2));
temp=elem_div(theta1(brand),temp+colsum(theta1));
P1=sum(temp)/ndraws;
}
f1+=log(1.e-20+P1);
}// for t=1;t<=ntimes(h);t++
fd=f1;
// give a large memory to funnel variable;
f-=fd;
// clear funnel variable, save memory usage;
}// for h=1;h<=nhouse;h++
f+=.1*(norm2(alpha1)+norm2(beta1));
}
void model_parameters::preliminary_calculations(void){
admaster_slave_variable_interface(*this);
}
model_data::~model_data()
{}
model_parameters::~model_parameters()
{}
void model_parameters::report(void){}
void model_parameters::final_calcs(void){}
#ifdef _BORLANDC_
extern unsigned _stklen=10000U;
#endif
#ifdef __ZTC__
extern unsigned int _stack=10000U;
#endif
long int arrmblsize=0;
int main(int argc,char * argv[])
{
gradient_structure::set_NO_DERIVATIVES();
gradient_structure::set_YES_SAVE_VARIABLES_VALUES();
#if defined(__GNUDOS__) || defined(DOS386) || defined(__DPMI32__)
|| \
defined(__MSVC32__)
if (!arrmblsize) arrmblsize=150000;
#else
if (!arrmblsize) arrmblsize=25000;
#endif
model_parameters mp(arrmblsize,argc,argv);
mp.iprint=10;
mp.preliminary_calculations();
mp.computations(argc,argv);
return 0;
}