00001
00002
00003
00004
00005
00006
00011 #include <df1b2fun.h>
00012 #include "f1b2locl.h"
00013 class newadkludge;
00014 extern newadkludge * newadkl;
00015
00020 void local_init_df1b2variable::dot_calcs(local_dep_df1b2variable& v,int j)
00021 {
00022 if (adpool_stack_pointer<1)
00023 {
00024 cerr << "this can't happen" << endl;
00025 ad_exit(1);
00026 }
00027 int global_nvar=adpool_nvar_stack[adpool_stack_pointer-1];
00028 double * xd=p->get_u_dot();
00029 double * ud=v.get_u_dot();
00030 double * zd=(v.p)->get_u_dot();
00031 for (int i=0;i<global_nvar;i++)
00032 {
00033
00034 {
00035 *zd+=ud[j] * *xd;
00036 }
00037 zd++;
00038 xd++;
00039 }
00040 }
00041
00046 local_init_df1b2variable::local_init_df1b2variable
00047 (void) : df1b2variable(newadkl)
00048 {
00049 p=0;
00050 }
00051
00056 local_init_df1b2variable::local_init_df1b2variable
00057 (double _xu, double * _xdot) : df1b2variable()
00058 {
00059 *get_u()=_xu;
00060 p=0;
00061 xdot=_xdot;
00062 set_dot(num_vars-1);
00063 }
00064
00069 local_init_df1b2variable::local_init_df1b2variable
00070 (const df1b2variable & _x) : df1b2variable(newadkl)
00071 {
00072 ADUNCONST(df1b2variable,x)
00073 p=&_x;
00074 xu=*(x.get_u());
00075 }
00076
00081 local_init_df1b2vector::local_init_df1b2vector(const df1b2vector & _x)
00082 {
00083 ADUNCONST(df1b2vector,x)
00084 p=&_x;
00085 int mmin=x.indexmin();
00086 int mmax=x.indexmax();
00087
00088 df1b2variable::noallocate=1;
00089 df1b2vector::allocate(mmin,mmax);
00090 df1b2variable::noallocate=0;
00091 }
00092
00093
00094
00095
00096
00097
00098
00099 typedef local_init_var * PLOCAL_INIT_VAR;
00100
00101
00102
00103
00104 int local_init_var::num_vars=0;
00105
00106 int local_init_var::num_inactive_vars=0;
00107 int local_init_var::num_active_parameters=0;
00108
00109 local_init_var ** local_init_var::list=new PLOCAL_INIT_VAR[200];
00110 local_init_var ** local_init_var::inactive_list=new PLOCAL_INIT_VAR[200];
00111 init_df1b2vector * local_init_var::py=0;
00112 imatrix * local_init_var::plist=0;
00113
00114
00115
00116
00121 void local_init_var::add_to_list(void)
00122 {
00123 index=num_vars;
00124 list[num_vars++]=this;
00125
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00144 void local_init_var::add_to_inactive_list(void)
00145 {
00146 index=-1;
00147 inactive_list[num_inactive_vars++]=this;
00148 }
00149
00154 void local_init_var::allocate(void)
00155 {
00156
00157 }
00158
00163 void local_init_var::allocate_all(void)
00164 {
00165 num_active_parameters=local_init_var::nvarcalc_all();
00166 if (py)
00167 {
00168 if (py->indexmax() != num_active_parameters)
00169 {
00170 delete py;
00171 py=0;
00172 }
00173 }
00174
00175 df1b2variable::save_adpool_pointer();
00176 adpool * tmppool=df1b2variable::pool;
00177 if (!localf1b2gradlist)
00178 {
00179 localf1b2gradlist = new df1b2_gradlist(400000U,20000U,800000U,40000U,
00180 200000U,10000U,adstring("lf1b2list1"));
00181 if (!localf1b2gradlist)
00182 {
00183 cerr << "Error allocating memory for local df1b2gradlist" << endl;
00184 ad_exit(1);
00185 }
00186 }
00187 globalf1b2gradlist=f1b2gradlist;
00188 f1b2gradlist=localf1b2gradlist;
00189
00190 if (tmppool)
00191 {
00192
00193
00194 if (tmppool->nvar != num_active_parameters)
00195 {
00196
00197 int found_pool_flag=0;
00198 for (int i=0;i<df1b2variable::adpool_counter;i++)
00199 {
00200 if (df1b2variable::adpool_vector[i]->nvar == num_active_parameters)
00201 {
00202 adpool * tmp = df1b2variable::pool;
00203 df1b2variable::pool=df1b2variable::adpool_vector[i];
00204 if (!tmp->on_adpool_vector())
00205 {
00206 df1b2variable::adpool_vector[df1b2variable::adpool_counter]=tmp;
00207 df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00208 tmp->nvar;
00209
00210 df1b2variable::increment_adpool_counter();
00211 tmp->on_adpool_vector()=1;
00212 }
00213 found_pool_flag=1;
00214 break;
00215 }
00216 }
00217 if (!found_pool_flag)
00218 {
00219 if (df1b2variable::adpool_counter>=df1b2variable::adpool_vectorsize)
00220 {
00221 cerr << "Need to increase adpool_vectorsize" << endl;
00222 ad_exit(1);
00223 }
00224 if (!df1b2variable::pool->on_adpool_vector())
00225 {
00226 df1b2variable::adpool_vector[df1b2variable::adpool_counter]=
00227 df1b2variable::pool;
00228 df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00229 df1b2variable::pool->nvar;
00230
00231 df1b2variable::increment_adpool_counter();
00232 df1b2variable::pool->on_adpool_vector()=1;
00233 }
00234 df1b2variable::pool=new adpool();
00235 if (!df1b2variable::pool)
00236 {
00237 cerr << "Memory allocation error" << endl;
00238 ad_exit(1);
00239 }
00240
00241 df1b2variable::nvar=num_active_parameters;
00242 df1b2variable::set_blocksize();
00243
00244 if (!df1b2variable::pool->on_adpool_vector())
00245 {
00246 df1b2variable::adpool_vector[df1b2variable::adpool_counter]=
00247 df1b2variable::pool;
00248 df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00249 df1b2variable::pool->nvar;
00250
00251 df1b2variable::increment_adpool_counter();
00252 df1b2variable::pool->on_adpool_vector()=1;
00253 }
00254
00255 }
00256 }
00257 }
00258 else
00259 {
00260 df1b2variable::pool=new adpool();
00261 if (!df1b2variable::pool)
00262 {
00263 cerr << "Memory allocation error" << endl;
00264 ad_exit(1);
00265 }
00266 df1b2variable::nvar=num_active_parameters;
00267 df1b2variable::set_blocksize();
00268 df1b2variable::adpool_vector[df1b2variable::adpool_counter]=
00269 df1b2variable::pool;
00270 df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00271 df1b2variable::pool->nvar;
00272
00273 df1b2variable::increment_adpool_counter();
00274 }
00275
00276 df1b2variable::nvar=num_active_parameters;
00277 df1b2variable::set_blocksize();
00278
00279 if (!py)
00280 {
00281 py = new init_df1b2vector(1,num_active_parameters);
00282 }
00283 if (!py)
00284 {
00285 cerr << "memory allocation error" << endl;
00286 ad_exit(1);
00287 }
00288
00289
00290
00291 if (plist)
00292 {
00293 if (plist->indexmax() != num_active_parameters)
00294 {
00295 delete plist;
00296 plist=0;
00297 }
00298 }
00299 if (!plist)
00300 {
00301 plist = new imatrix(1,num_active_parameters,1,2);
00302 }
00303 if (!plist)
00304 {
00305 cerr << "memory allocation error" << endl;
00306 ad_exit(1);
00307 }
00308
00309 int ii=1;
00310 int i;
00311 for(i=0;i<num_vars;i++)
00312 {
00313 list[i]->xinit(*py,ii);
00314 }
00315
00316 ii=1;
00317 for(i=0;i<num_vars;i++)
00318 {
00319 list[i]->set_index(*plist,ii);
00320 }
00321
00322 for(i=0;i<num_inactive_vars;i++)
00323 {
00324 inactive_list[i]->allocate();
00325 }
00326
00327 local_init_var::reset(*py);
00328 }
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00380 void local_init_df1b2variable::allocate(const df1b2variable& x)
00381 {
00382 cerr << "Haven't defined htis yet" << endl;
00383 ad_exit(1);
00384 }
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00407 void local_init_df1b2variable::
00408 preallocate(const df1b2variable & _x)
00409 {
00410 ADUNCONST(df1b2variable,x)
00411 type=0;
00412 pointer=0;
00413 ind_index = x.get_ind_index();
00414 if (ind_index<0)
00415 {
00416 add_to_inactive_list();
00417 }
00418 else
00419 {
00420 add_to_list();
00421 }
00422 xu=*(x.get_u());
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00449 void local_init_df1b2variable::allocate(void)
00450 {
00451 df1b2variable::allocate();
00452 *(get_u())=xu;
00453 if (index>=0)
00454 get_u_dot()[index]=1.0;
00455 }
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00474 void local_init_df1b2variable::set_value(const init_df1b2vector& _x,
00475 const int& _ii)
00476 {
00477
00478 ADUNCONST(init_df1b2vector,x)
00479 ADUNCONST(int,ii)
00480 df1b2variable::operator = (x(ii++));
00481 }
00482
00487 void local_init_df1b2variable::set_value(const init_df1b2vector& _x,
00488 const int& _ii,const df1b2variable& _pen)
00489 {
00490 ADUNCONST(init_df1b2vector,x)
00491 ADUNCONST(int,ii)
00492 ADUNCONST(df1b2variable,pen)
00493 if (!pointer)
00494 {
00495 df1b2variable::operator = (x(ii++));
00496 }
00497 else
00498 {
00499 switch (type)
00500 {
00501 case 1:
00502 {
00503 df1b2_init_bounded_vector & b = *(df1b2_init_bounded_vector*)pointer;
00504
00505
00506 if (ind_index>0)
00507 {
00508
00509 }
00510 else
00511 {
00512 if (!initial_params::straight_through_flag)
00513 {
00514 df1b2variable::operator = (boundp(x(ii++),b.getminb(),b.getmaxb(),
00515 pen));
00516 }
00517 else
00518 {
00519 df1b2variable::operator = (x(ii++));
00520 *get_u()=boundp(*get_u(),b.getminb(),b.getmaxb());
00521 double diff=b.getmaxb()-b.getminb();
00522 df1b2variable ss=((*this)-b.getminb())/diff;
00523 # ifdef USE_BARD_PEN
00524 const double l4=log(4.0);
00525 double wght=.000001/diff;
00526 pen-=wght*(log(ss+double(1.e-40))+log((double(1.0)-ss)
00527 +double(1.e-40))+l4);
00528 # else
00529 XXXX
00530 # endif
00531 }
00532 }
00533 break;
00534 }
00535 case 2:
00536 default:
00537 {
00538 cerr << "the bounded matrix case in "
00539 " void funnel_init_df1b2variable::xinit has not bee implemented"
00540 << endl;
00541 ad_exit(1);
00542 }
00543 }
00544 }
00545 }
00546
00551 int local_init_var::nvarcalc_all(void)
00552 {
00553 int n=0;
00554 for (int i=0;i<num_vars;i++)
00555 {
00556 n+=list[i]->nvar_calc();
00557 }
00558 return n;
00559 }
00560
00565 void local_init_var::set_dot_all(void)
00566 {
00567 int ii=0;
00568 for (int i=0;i<num_vars;i++)
00569 {
00570 list[i]->set_dot(ii);
00571 }
00572 }
00573
00578 void local_init_var::dot_calcs_all(local_dep_df1b2variable& v)
00579 {
00580 for (int i=0;i<num_vars;i++)
00581 {
00582 list[i]->dot_calcs(v,i);
00583 }
00584 }
00585
00590 void local_init_df1b2variable::xinit(init_df1b2vector& y,int& ii)
00591 {
00592 y(ii)= xu;
00593 ii++;
00594 }
00595
00600 void local_init_df1b2variable::xinit(dvector& y,int& ii)
00601 {
00602 if (!pointer)
00603 {
00604 y(ii)= xu;
00605 }
00606 else
00607 {
00608 switch (type)
00609 {
00610 case 1:
00611 {
00612 df1b2_init_bounded_vector & b = *(df1b2_init_bounded_vector*)pointer;
00613 y(ii)=boundpin(xu,b.getminb(),b.getmaxb());
00614 break;
00615 }
00616 case 2:
00617 default:
00618 {
00619 cerr << "the bounded matrix case in "
00620 " void local_init_df1b2variable::xinit has not bee implemented"
00621 << endl;
00622 ad_exit(1);
00623 }
00624 }
00625 }
00626 ii++;
00627 }
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00642 void local_init_df1b2variable::set_index(imatrix& y,int& ii)
00643 {
00644
00645 y(ii,1)= ind_index;
00646 y(ii,2)= ii;
00647 ii++;
00648 }
00649
00654 void local_init_var::reset(init_df1b2vector& x)
00655 {
00656 int ii=1;
00657
00658 for (int i=0;i<num_vars;i++)
00659 {
00660
00661 list[i]->set_value(x,ii);
00662 }
00663 }
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00694 int local_init_df1b2vector::nvar_calc(void)
00695 {
00696 return p->indexmax()-p->indexmin()+1;
00697 }
00698
00699
00704 void local_init_df1b2vector::xinit(init_df1b2vector& y,int& ii)
00705 {
00706 df1b2vector * vp = (df1b2vector*)(p);
00707 int mmin=vp->indexmin();
00708 int mmax=vp->indexmax();
00709 int i;
00710 for (i=mmin;i<=mmax;i++)
00711 {
00712 y(ii)= value((*vp)(i));
00713 ii++;
00714 }
00715 }
00716
00721 void local_init_df1b2vector::set_index(imatrix& y,int& ii)
00722 {
00723
00724 int mmin=p->indexmin();
00725 int mmax=p->indexmax();
00726 int i;
00727 for (i=mmin;i<=mmax;i++)
00728 {
00729
00730 y(ii,2)= ii;
00731 ii++;
00732 }
00733 }
00734
00739 void local_init_df1b2vector::set_value(const init_df1b2vector& _x,
00740 const int& _ii)
00741 {
00742 ADUNCONST(int,ii)
00743 ADUNCONST(init_df1b2vector,x)
00744 int mmin=p->indexmin();
00745 int mmax=p->indexmax();
00746 int i;
00747 for (i=mmin;i<=mmax;i++)
00748 {
00749 (*this)(i) = (x(ii++));
00750 }
00751 }
00752
00757 void local_init_df1b2vector::set_value(const init_df1b2vector& _x,
00758 const int& _ii,const df1b2variable& pen)
00759 {
00760 ADUNCONST(int,ii)
00761 ADUNCONST(init_df1b2vector,x)
00762 int mmin=p->indexmin();
00763 int mmax=p->indexmax();
00764 int i;
00765 for (i=mmin;i<=mmax;i++)
00766 {
00767 (*this)(i) = (x(ii++));
00768 }
00769 }