[Developers] d4_array
dave fournier
davef at otter-rsch.com
Thu Jul 24 11:37:39 PDT 2014
On 07/24/2014 11:06 AM, Jim Ianelli - NOAA Federal wrote:
You are starting at the wrong place. Here is what I would do.
1.) put it into a tpl and run tpl2cpp (or tpl2rem if that is appropriate)
Here I use simple.tpl and add a 3darray as well to compare
DATA_SECTION
init_int nobs
init_vector Y(1,nobs)
init_vector x(1,nobs)
// add 4d array and 3darray
3darray yyy
4darray xxxx
PARAMETER_SECTION
init_number a
init_number b
vector pred_Y(1,nobs)
objective_function_value f
PROCEDURE_SECTION
pred_Y=a*x+b;
f=(norm2(pred_Y-Y));
f=nobs/2.*log(f); // make it a likelihood function so that
// covariance matrix is correct
what I get is
warning -- creating unallocated 3darray() at line 38
Error in line 39 while reading
x
so tpl2cpp knows about 3darrays but not 4darrays.
So check out the lex code for tpl2cpp to see what neds to be added.
code for 3darray is
<DEFINE_DATA>3darray {
likelihood_found=1;
BEGIN IN_NAMED_THREE_ARRAY_DEF;
fprintf(fdat,"%s"," d3_array ");
}
What this does is to switch the state of the lexer to
IN_NAMED_THREE_ARRAY_DEF stuff.
so in there will be a case when there are no arguments. Here it is.
<IN_NAMED_THREE_ARRAY_DEF>{name} {
if (warn_unallocated) write_unallocated("3darray()");
strcpy(tmp_string,yytext); // get x in x(1,4)
fprintf(fdat,"%s",tmp_string);
fprintf(fall," %s",tmp_string);
fprintf(fall,"%s",".allocate()");
//fprintf(fall,"%s",".allocate");
//after_part(tmp_string1,yytext,'('); // get x in x(1,4)
//before_part(tmp_string2,tmp_string1,')');
//fprintf(fall,"%s)",tmp_string2);
fprintf(fdat,"%s",";\n");
fprintf(fall,"%s",";\n");
if (!params_defined)
{
if(likelihood_found) {
if(likelihood_counter<MAX_LIKE_CHECK)
sprintf(likelihood_checker[likelihood_counter++],"%s",tmp_string);
likelihood_found=0;
}
BEGIN DEFINE_DATA;
}
else
{
BEGIN DEFINE_PARAMETERS;
}
}
So we need a corresponding entry for 4darrays.
So dup the above and change THREE to FOUR and 3darray to 4darray
<IN_NAMED_FOUR_ARRAY_DEF>{name} {
if (warn_unallocated) write_unallocated("4darray()");
strcpy(tmp_string,yytext); // get x in x(1,4)
fprintf(fdat,"%s",tmp_string);
fprintf(fall," %s",tmp_string);
fprintf(fall,"%s",".allocate()");
//fprintf(fall,"%s",".allocate");
//after_part(tmp_string1,yytext,'('); // get x in x(1,4)
//before_part(tmp_string2,tmp_string1,')');
//fprintf(fall,"%s)",tmp_string2);
fprintf(fdat,"%s",";\n");
fprintf(fall,"%s",";\n");
if (!params_defined)
{
if(likelihood_found) {
if(likelihood_counter<MAX_LIKE_CHECK)
sprintf(likelihood_checker[likelihood_counter++],"%s",tmp_string);
likelihood_found=0;
}
BEGIN DEFINE_DATA;
}
else
{
BEGIN DEFINE_PARAMETERS;
}
}
and remake tpl2cpp and run again on the modified simple.tpl
and you will get
> t/bin/tpl2cpp simple
> warning -- creating unallocated 3darray() at line 38
> warning -- creating unallocated 4darray() at line 39
check the code simple.htp for xxxx and yyyy
class model_data : public ad_comm{
data_int nobs;
data_vector Y;
data_vector x;
d3_array yyyy;
d4_array xxxx;
~model_data();
model_data(int argc,char * argv[]);
friend class model_parameters;
};
so they are there. and in simple.cpp
model_data::model_data(int argc,char * argv[]) : ad_comm(argc,argv)
{
nobs.allocate("nobs");
Y.allocate(1,nobs,"Y");
x.allocate(1,nobs,"x");
yyyy.allocate();
xxxx.allocate();
}
So now it is a question of whether admb knows about unallocated d4_arrays.
So compile simple.cpp.
I think you will find that it compiles so you are done.
f I grep d3_array in nh99 I get 104 lines of code
>
> grepping d4_array gets 34 lines...
>
> below are the hits (they keep coming...).
>
> Question is how to identify where the code didn't write itself. Ignore
> if this is stupid, as always.
> admodel.h: named_dvar3_array& operator=(const d3_array& m);
> admodel.h:class named_d3_array : public d3_array, public model_name_tag
> admodel.h: named_d3_array(void) : d3_array(), model_name_tag() {;}
> admodel.h: named_d3_array& operator=(const d3_array& m);
> admodel.h:class data_3array : public named_d3_array
> admodel.h: data_3array(void) : named_d3_array() {;}
> admodel.h: dll_data_3array& operator=(const d3_array &);
> admodel.h: const d3_array& eigenvals,d3_array& curvcor);
> admodel.h: dll_param_init_d3array& operator=(const d3_array&);
> admodel.h: dll_param_d3array& operator=(const d3_array&);
> getbigs.cpp: d3_array & H=*(lapprox->block_diagonal_hessian);
> getbigs.cpp: d3_array & Dux=*(lapprox->block_diagonal_Dux);
> getbigs.cpp: d3_array & H=*(lapprox->block_diagonal_hessian);
> lex.yy.c: fprintf(fdat,"%s"," d3_array ");
> mod_pmin.cpp: //d3_array hesses(-num_pp,num_pp,1,nvar,1,nvar);
> mod_pmin.cpp: d3_array eigenvals(0,nlp-1,-num_pp,num_pp,1,nvar-1);
> mod_pmin.cpp: d3_array curvcor(0,nlp-1,-num_pp,num_pp,1,nvar-1);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model.cpp: named_d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax,s);
> model.cpp: *(ad_comm::global_datafile) >> d3_array(*this);
> model11.cpp:named_dvar3_array& named_dvar3_array::operator=(const
> d3_array& m)
> model11.cpp:void named_d3_array::allocate(int hsl,int hsu,int rmin,int
> rmax,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl,int hsu,int rmin,int
> rmax,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax);
> model11.cpp:void named_d3_array::allocate(int hsl,int hsu,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax);
> model11.cpp:void named_d3_array::allocate(int hsl,int hsu,const char * s)
> model11.cpp: d3_array::allocate(hsl,hsu);
> model11.cpp:void named_d3_array::allocate(const char * s)
> model11.cpp: d3_array::allocate();
> model11.cpp:void named_d3_array::allocate(int hsl, int hsu, const
> index_type& rmin,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl, int hsu, const
> ivector& rmin,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl,int hsu,int rmin,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl, int hsu, const
> ivector& rmin,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl, int hsu, int rmin,
> int rmax,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl, int hsu, int rmin,
> int rmax,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:void named_d3_array::allocate(int hsl, int hsu, int rmin,
> int rmax,
> model11.cpp: d3_array::allocate(hsl,hsu,rmin,rmax,cmin,cmax);
> model11.cpp:named_d3_array& named_d3_array::operator=(const d3_array& m)
> model11.cpp: d3_array::operator=(m);
> model35.cpp: named_d3_array::allocate(hmin,hmax,rmin,rmax,cmin,cmax,_s);
> model35.cpp:dll_data_3array& dll_data_3array::operator=(const d3_array &m)
> model35.cpp: d3_array::operator = (m);
> model35.cpp:dll_param_d3array& dll_param_d3array::operator=(const
> d3_array &m)
> model35.cpp:dll_param_init_d3array&
> dll_param_init_d3array::operator=(const d3_array &m)
> newmodmn.cpp: const d3_array& eigenvals,d3_array& curvcor)
> newmodmn.cpp: const d3_array& eigenvals,d3_array& curvcor)
> tpl2cpp.c: fprintf(fdat,"%s"," d3_array ");
> tpl2cpp.lex: fprintf(fdat,"%s"," d3_array ");
>
> admodel.h: named_dvar4_array& operator=(const d4_array& m);
> admodel.h:class named_d4_array : public d4_array, public model_name_tag
> admodel.h: named_d4_array(void) : d4_array(), model_name_tag() {;}
> admodel.h: named_d4_array& operator=(const d4_array& m);
> admodel.h:class data_4array : public named_d4_array
> admodel.h: data_4array(void) : named_d4_array() {;}
> lex.yy.c: fprintf(fdat,"%s"," d4_array ");
> model15.cpp:void named_d4_array::allocate(int hhsl,int hhsu,int
> hsl,int hsu,
> model15.cpp: d4_array::allocate(hhsl,hhsu,hsl,hsu,rmin,rmax,cmin,cmax);
> model15.cpp:void named_d4_array::allocate(int hhsl,int hhsu,int
> hsl,int hsu,
> model15.cpp: d4_array::allocate(hhsl,hhsu,hsl,hsu,rmin,rmax);
> model15.cpp:void named_d4_array::allocate(int hhsl,int hhsu,int
> hsl,int hsu, const char* s)
> model15.cpp: d4_array::allocate(hhsl,hhsu,hsl,hsu);
> model15.cpp:void named_d4_array::allocate(int hhsl,int hhsu,const char* s)
> model15.cpp: d4_array::allocate(hhsl,hhsu);
> model15.cpp:void named_d4_array::allocate(const char* s)
> model15.cpp: d4_array::allocate();
> model15.cpp:void named_d4_array::allocate(ad_integer hhsl, ad_integer
> hhsu,
> model15.cpp: d4_array::allocate(hhsl,hhsu,hsl,hsu,rmin,rmax,cmin,cmax);
> model15.cpp:void named_d4_array::allocate(ad_integer hhsl,ad_integer hhsu,
> model15.cpp: d4_array::allocate(hhsl,hhsu,hsl,hsu);
> model15.cpp:void named_d4_array::allocate(ad_integer hhsl,ad_integer
> hhsu,const char* s)
> model15.cpp: d4_array::allocate(hhsl,hhsu);
> model15.cpp:void named_d4_array::allocate(ad_integer hhsl,ad_integer hhsu,
> model15.cpp: d4_array::allocate(hhsl,hhsu,hsl,hsu,rmin,rmax);
> model15.cpp:named_d4_array& named_d4_array::operator=(const d4_array& m)
> model15.cpp: this->d4_array::operator=(m);
> model15.cpp:named_dvar4_array& named_dvar4_array::operator=(const
> d4_array& m)
> model16.cpp:
> named_d4_array::allocate(hhsl,hhsu,hsl,hsu,rmin,rmax,cmin,cmax,s);
> model16.cpp: *(ad_comm::global_datafile) >> d4_array(*this);
> model16.cpp:
> named_d4_array::allocate(hhsl,hhsu,hsl,hsu,rmin,rmax,cmin,cmax,s);
> model16.cpp: *(ad_comm::global_datafile) >> d4_array(*this);
> tpl2cpp.c: fprintf(fdat,"%s"," d4_array ");
> tpl2cpp.lex: fprintf(fdat,"%s"," d4_array ");
>
>
>
> On Thu, Jul 24, 2014 at 10:51 AM, dave fournier <davef at otter-rsch.com
> <mailto:davef at otter-rsch.com>> wrote:
>
> On 07/24/2014 10:41 AM, John Sibert wrote:
>
> Probably never wrote itself. Unallocated objects were a later
> development.
> Wouldn't be much work to implement, but getting it into the code
> base ...
>
>
> I was looking for a null constructor to use in the DATA_SECTION
> 4darray effort_proxy;
>
> and then allocate later
> effort_proxy.allocate(int,int, int,int, ivector&,ivector&,
> ivector&,ivector&)
>
> I do this routinely with d3_arrays:
> 3darray effort;
>
> effort.allocate(0, nfleet, ilbv, iubv, jlbm, jubm);
>
> John Sibert
> Emeritus Researcher, SOEST
> University of Hawaii at Manoa
> Honolulu HI (GMT-10)
> 808-294-3842 <tel:808-294-3842> (mobile)
>
> Visit the ADMB project http://admb-project.org/
>
> On 07/23/2014 04:22 PM, dave fournier wrote:
>
> On 07/23/2014 06:54 PM, John Sibert wrote:
>
> How does one declare a d4_array in a tpl file?
>
> init_4darray
>
> for initial one but maybe that is not what you want?
> _______________________________________________
> Developers mailing list
> Developers at admb-project.org
> <mailto:Developers at admb-project.org>
> http://lists.admb-project.org/mailman/listinfo/developers
>
>
>
>
> _______________________________________________
> Developers mailing list
> Developers at admb-project.org <mailto:Developers at admb-project.org>
> http://lists.admb-project.org/mailman/listinfo/developers
>
>
>
>
> --
>
> James Ianelli
> NMFS/NOAA Building 4
> 7600 Sand Pt Way NE
> Seattle WA 98115
>
> 206 526 6510
>
> Visit the ADMB project http://admb-project.org/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.admb-project.org/pipermail/developers/attachments/20140724/8b3e363e/attachment-0001.html>
More information about the Developers
mailing list