00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00027 #ifndef _IHESS_EVALUATOR_H_
00028 #define _IHESS_EVALUATOR_H_
00029
00030 #define DEBUG_IHESS_EVALUATOR 0
00031 #define DEBUG_FHE_LIST_NODES_WITH_PARAMETERS 0
00032
00033 #include <coconut_config.h>
00034 #include <evaluator.h>
00035 #include <expression.h>
00036
00037 #include <eval_main.h>
00038 #include <linalg.h>
00039 #include <math.h>
00040 #include <api_exception.h>
00041 #include <diffI.h>
00042
00043 namespace coco {
00044
00045 using namespace vgtl;
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 struct ihessPreparationEvaluatorType
00068 {
00069 std::vector<std::vector<interval> >* d;
00070 std::vector<std::vector<interval> >* h;
00071 };
00072
00073 class ihessPreparationEvaluator: public
00074 cached_forward_evaluator_base<ihessPreparationEvaluatorType, expression_node,
00075 bool, expression_const_walker>
00076 {
00077 private:
00078 typedef cached_forward_evaluator_base<ihessPreparationEvaluatorType,
00079 expression_node,bool,expression_const_walker> _Base;
00080
00081 public:
00082 ihessPreparationEvaluator(std::vector<std::vector<interval> >& __d,
00083 std::vector<std::vector<interval> >& __h,
00084 unsigned int _num_of_nodes)
00085 {
00086 eval_data.d=&__d;
00087 eval_data.h=&__h;
00088 if((*eval_data.d).size() < _num_of_nodes && eval_data.d!=NULL)
00089 (*eval_data.d).insert((*eval_data.d).end(),
00090 _num_of_nodes-(*eval_data.d).size(), std::vector<interval>());
00091
00092
00093
00094
00095
00096 if((*eval_data.h).size() < _num_of_nodes )
00097 (*eval_data.h).insert((*eval_data.h).end(),
00098 _num_of_nodes-(*eval_data.h).size(), std::vector<interval>());
00099 }
00100
00101 ihessPreparationEvaluator(const ihessPreparationEvaluator& __x)
00102 { eval_data.d = __x.eval_data.d;
00103 eval_data.h = __x.eval_data.h; }
00104
00105 ~ihessPreparationEvaluator() {}
00106
00107 void initialize() { return; }
00108
00109 bool is_cached(const expression_node& __data)
00110 {
00111 return (*eval_data.h)[__data.node_num].size() > 0;
00112 }
00113
00114 void retrieve_from_cache(const expression_node& __data) { return; }
00115
00116 int initialize(const expression_node& __data)
00117 {
00118
00119 (*eval_data.d)[__data.node_num].insert(
00120 (*eval_data.d)[__data.node_num].end(), __data.n_children, interval(0.));
00121 (*eval_data.h)[__data.node_num].insert(
00122 (*eval_data.h)[__data.node_num].end(), __data.n_children, interval(0.));
00123 return 1;
00124 }
00125
00126 void calculate(const expression_node& __data) { return; }
00127
00128 int update(bool __rval) { return 0; }
00129
00130 int update(const expression_node& __data, bool __rval)
00131 { return 0; }
00132
00133
00134
00135
00136
00137
00138 bool calculate_value(bool eval_all) { return true; }
00139 };
00140
00141
00142
00143
00144 struct ihessForwardEvaluatorReturnValue
00145 {
00146 diffI f;
00147
00148 unsigned int nn;
00149 tristate in_chn;
00150 };
00151
00152 struct ihessForwardEvaluatorType
00153 {
00154 const std::vector<diffI>* x;
00155 const std::vector<interval>* range;
00156 std::vector<diffI>* f_cache;
00157 std::vector<std::vector<interval> >* h_data;
00158 std::vector<std::vector<interval> >* d_data;
00159 std::vector<unsigned int>* t;
00160 std::vector<bool>* b;
00161 ihessForwardEvaluatorReturnValue r;
00162 diffI carry;
00163 const model* mod;
00164 void* p;
00165 interval d;
00166 unsigned int n, info;
00167 };
00168
00169 class ihessForwardEvaluator : public
00170 cached_forward_evaluator_base<ihessForwardEvaluatorType, expression_node,
00171 ihessForwardEvaluatorReturnValue, expression_const_walker>
00172 {
00173 private:
00174 typedef cached_forward_evaluator_base<ihessForwardEvaluatorType,expression_node,
00175 ihessForwardEvaluatorReturnValue, expression_const_walker> _Base;
00176
00177 protected:
00178 bool is_cached(const node_data_type& __data)
00179 {
00180 if(__data.operator_type == EXPRINFO_LIN ||
00181 __data.operator_type == EXPRINFO_QUAD)
00182 return true;
00183 if(eval_data.f_cache && __data.n_parents > 1 && __data.n_children > 0 &&
00184 v_ind->match(__data.var_indicator()))
00185 return true;
00186 else
00187 return false;
00188 }
00189
00190 private:
00191 diffI __power(double __coeff, diffI __x, int __exp)
00192 {
00193 if(__exp == 0)
00194 return 1.;
00195 else
00196 {
00197 diffI k = __coeff *__x;
00198 switch(__exp)
00199 {
00200 case 1:
00201 return k;
00202 break;
00203 case 2:
00204 return square(k);
00205 break;
00206 case -1:
00207 return 1./k;
00208 break;
00209 case -2:
00210 return 1./square(k);
00211 break;
00212 default:
00213 return power(k,__exp);
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 break;
00224 }
00225 }
00226 return 0;
00227 }
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250 public:
00251 ihessForwardEvaluator(const std::vector<diffI>& __x,
00252 const std::vector<interval>& __rg,
00253 const variable_indicator& __v,
00254 const model& __m, std::vector<std::vector<interval> >& __d,
00255 std::vector<std::vector<interval> >& __h,
00256 std::vector<diffI>* __c) : _Base()
00257 {
00258 #if DEBUG_IHESS_EVALUATOR
00259 cout<<"ihessForwardEvaluator.constructor"<< std::endl;
00260 #endif
00261 eval_data.x = &__x;
00262 eval_data.range = &__rg;
00263 eval_data.f_cache = __c;
00264 eval_data.mod = &__m;
00265 eval_data.d_data = &__d;
00266
00267
00268 eval_data.h_data = &__h;
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 eval_data.n = 0;
00284 eval_data.r.f.setDeg(1);
00285 eval_data.carry.setDeg(1);
00286 eval_data.d = 0;
00287 v_ind = &__v;
00288
00289 }
00290
00291 ihessForwardEvaluator(const ihessForwardEvaluator& __x) : _Base(__x) {
00292
00293 }
00294
00295 ~ihessForwardEvaluator() {}
00296
00297 expression_const_walker short_cut_to(const expression_node& __data)
00298 { return eval_data.mod->node(0); }
00299
00300 void newPoint(const std::vector<diffI>& __x, const variable_indicator& __v)
00301 {
00302 eval_data.x = &__x;
00303
00304 v_ind = &__v;
00305 eval_data.n = 0;
00306 eval_data.r.f[0]=0.;eval_data.r.f[1]=0.;
00307 eval_data.carry[0]=0.; eval_data.carry[1]=0.;
00308 eval_data.d = 0;
00309 v_ind = &__v;
00310
00311 #if 0
00312 for(unsigned int i=0; i<(*eval_data.d_data).size(); i++)
00313 {
00314 for(unsigned int j=0; j< ((*eval_data.d_data)[i]).size(); j++)
00315 (*eval_data.d_data)[i][j] =0.0;
00316 }
00317 for(unsigned int i=0; i<(*eval_data.h_data).size(); i++)
00318 for(unsigned int j=0; j< ((*eval_data.h_data)[i]).size(); j++)
00319 (*eval_data.h_data)[i][j] =0.0;
00320 #endif
00321
00322 }
00323
00327 void newRange(const std::vector<interval>& __rg, const variable_indicator& __v)
00328 {
00329 eval_data.range = &__rg;
00330 v_ind = &__v;
00331 }
00332
00333 void initialize() {
00334 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00335 std::cout<<"forward.initialize" << std::endl;
00336 #endif
00337 #if DEBUG_IHESS_EVALUATOR
00338 std::cout<<"forward.initialize" << std::endl;
00339 #endif
00340 return; }
00341
00342 int initialize(const expression_node& __data)
00343 {
00344 #if DEBUG_IHESS_EVALUATOR
00345 std::cout<<"forward.initialize node_num="<<eval_data.r.nn<< " node_counter="<< eval_data.n << std::endl;
00346 #endif
00347 eval_data.r.nn = __data.node_num;
00348 eval_data.r.in_chn = __data.sem.info_flags.has_0chnbase;
00349 eval_data.n = 0;
00350
00351 switch(__data.operator_type)
00352 {
00353 case EXPRINFO_VARIABLE:
00354
00355 eval_data.r.f = (*eval_data.x)[__data.params.nn()];
00356 break;
00357 case EXPRINFO_SUM:
00358 case EXPRINFO_PROD:
00359 case EXPRINFO_MAX:
00360 case EXPRINFO_MIN:
00361 case EXPRINFO_INVERT:
00362 case EXPRINFO_DIV:
00363 case EXPRINFO_CONSTANT:
00364 eval_data.r.f =diffI(__data.params.nd(),1);
00365 eval_data.carry=diffI(__data.params.nd(),1);
00366 break;
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380 case EXPRINFO_IN:
00381 case EXPRINFO_AND:
00382 case EXPRINFO_NOGOOD:
00383 eval_data.r.f = diffI(1.,1);
00384 break;
00385 case EXPRINFO_ALLDIFF:
00386
00387
00388
00389 case EXPRINFO_MEAN:
00390 case EXPRINFO_IF:
00391 case EXPRINFO_OR:
00392 case EXPRINFO_NOT:
00393 case EXPRINFO_COUNT:
00394 case EXPRINFO_SCPROD:
00395 case EXPRINFO_LEVEL:
00396 eval_data.r.f = diffI(0.,1);
00397 break;
00398 case EXPRINFO_NORM:
00399 eval_data.info = 0;
00400 eval_data.r.f = diffI(0.,1);
00401 break;
00402 case EXPRINFO_DET:
00403 case EXPRINFO_PSD:
00404
00405 break;
00406 case EXPRINFO_COND:
00407 case EXPRINFO_FEM:
00408 case EXPRINFO_MPROD:
00409
00410 break;
00411 }
00412 return 1;
00413
00414 }
00415
00416 void calculate(const expression_node& __data)
00417 {
00418 if(__data.operator_type > 0){
00419 #if DEBUG_IHESS_EVALUATOR
00420 std::cout<<"forward.calculate node_num="<<eval_data.r.nn<< " node_counter="<< eval_data.n << std::endl;
00421 #endif
00422 }
00423
00424
00425 }
00426
00427 void retrieve_from_cache(const expression_node& __data)
00428 {
00429 #if DEBUG_IHESS_EVALUATOR
00430 std::cout<<"forward.retrieve_from_cache node_num="<<eval_data.r.nn<< " node_counter="<< eval_data.n << std::endl;
00431 #endif
00432 }
00433
00434 int update(const diffI& __rval)
00435 {
00436 #if DEBUG_IHESS_EVALUATOR
00437 std::cout<<"forward.update node_num="<<eval_data.r.nn<< " node_counter="<< eval_data.n << std::endl;
00438 #endif
00439 eval_data.r.f = __rval;
00440 return 0;
00441 }
00442
00443
00444 int update(const expression_node& __data, const ihessForwardEvaluatorReturnValue& __rval)
00445 {
00446 #if DEBUG_IHESS_EVALUATOR
00447 std::cout<<"forward.update node_num="<<eval_data.r.nn<< " ";
00448
00449 #endif
00450 int ret = 0;
00451 diffI __x(0.,1);
00452 diffI h(0.,1);
00453 diffI k(0.,1);
00454
00455
00456
00457
00458 if(__data.operator_type < 0)
00459 {
00460 switch(__data.operator_type)
00461 {
00462 case EXPRINFO_CONSTANT:
00463 {
00464
00465
00466 eval_data.r.f = diffI(__data.params.nd(),1);
00467 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00468 std::cout<<"EXPRINFO_CONSTANT (__data.params.nd()="<< __data.params.nd() << "), ";
00469 #endif
00470
00471 break;
00472 }
00473 case EXPRINFO_VARIABLE:
00474 {
00475
00476
00477 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00478 std::cout<<"EXPRINFO_VARIABLE (__data.params.nn()="<< __data.params.nn() << "), ";
00479 #endif
00480 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00481
00482 break;
00483 }
00484 case EXPRINFO_SUM:
00485
00486 case EXPRINFO_MEAN:
00487 {
00488 {
00489 double hd = __data.coeffs[eval_data.n];
00490 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00491 std::cout<<"EXPRINFO_MEAN (__data.params.coeffs="<< __data.coeffs[eval_data.n] << ";__data.params.hd()="<< __data.params.nd() <<"), ";
00492 #endif
00493
00494 eval_data.r.f = eval_data.r.f + hd * __rval.f;
00495 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00496 (*eval_data.d_data)[__data.node_num][eval_data.n] = hd;
00497
00498
00499
00500 (*eval_data.h_data)[__data.node_num][eval_data.n] = 0.;
00501
00502 #if DEBUG_IHESS_EVALUATOR
00503 std::cout<<"EXPRINFO_MEAN " << eval_data.r.f << std::endl;
00504
00505 #endif
00506 eval_data.n++;
00507 }
00508 break;
00509 }
00510 case EXPRINFO_PROD:
00511 {
00512 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00513 std::cout<<"EXPRINFO_PROD (__data.params.nd()="<< __data.params.nd() << ";__data.coeffs[0]="<< __data.coeffs[0] <<"), ";
00514 #endif
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529 if(eval_data.n == 0)
00530 {
00531 diffI temp(1);
00532 temp=eval_data.r.f * __rval.f;
00533 eval_data.r.f = temp;
00534
00535 eval_data.carry =__rval.f;
00536
00537
00538
00539 (*eval_data.d_data)[__data.node_num][0] = __data.params.nd();
00540 (*eval_data.h_data)[__data.node_num][0] = 0;
00541 }
00542 else
00543 {
00544 interval transfer_variable=eval_data.r.f[0];
00545
00546 (*eval_data.d_data)[__data.node_num][eval_data.n] = transfer_variable;
00547 (*eval_data.h_data)[__data.node_num][eval_data.n] =
00548 (*eval_data.h_data)[__data.node_num][eval_data.n-1]*
00549 eval_data.carry[0] +
00550 (*eval_data.d_data)[__data.node_num][eval_data.n-1] *
00551 eval_data.carry[1];
00552
00553
00554
00555
00556
00557
00558
00559 eval_data.carry= __rval.f;
00560
00561 diffI temp(1);
00562 temp=eval_data.r.f * __rval.f;
00563 eval_data.r.f = temp;
00564
00565
00566
00567
00568
00569 for(int i = eval_data.n-1; i >= 0; i--) {
00570 (*eval_data.h_data)[__data.node_num][i]
00571 = (*eval_data.h_data)[__data.node_num][i] * __rval.f[0];
00572 (*eval_data.h_data)[__data.node_num][i]
00573 = (*eval_data.h_data)[__data.node_num][i] + (*eval_data.d_data)[__data.node_num][i] * __rval.f[1] ;
00574 (*eval_data.d_data)[__data.node_num][i]
00575 = (*eval_data.d_data)[__data.node_num][i] * __rval.f[0];
00576
00577 }
00578 }
00579
00580
00581 eval_data.n++;
00582 if(eval_data.n == __data.n_children)
00583 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00584 break;
00585 }
00586 case EXPRINFO_MONOME:
00587 {
00588 std::cerr << "ihessForwardEvaluator: Polynomes NYI" << std::endl;
00589 throw "NYI: ihessForwardEvaluator. EXPRINFO_QUAD";
00590 break;
00591 }
00592 case EXPRINFO_MAX:
00593 {
00594 std::cerr << "ihessForwardEvaluator: MAX" << std::endl;
00595 throw api_exception(apiee_other,"Regularity error: ihessForwardEvaluator. EXPRINFO_MAX");
00596 break;
00597 }
00598 case EXPRINFO_MIN:
00599 {
00600 std::cerr << "ihessForwardEvaluator: MIN" << std::endl;
00601 throw api_exception(apiee_other,"Regularity error: ihessForwardEvaluator. EXPRINFO_MIN");
00602 break;
00603 }
00604
00605 case EXPRINFO_SCPROD:
00606 {
00607 std::cerr << "ihessForwardEvaluator: SCPROD" << std::endl;
00608 throw "NYI: ihessForwardEvaluator. EXPRINFO_SCPROD";
00609 break;
00610 }
00611 case EXPRINFO_NORM:
00612 {
00613 std::cerr << "ihessForwardEvaluator: NORM" << std::endl;
00614 throw "NYI: ihessForwardEvaluator. EXPRINFO_NORM";
00615 break;
00616 }
00617 case EXPRINFO_INVERT:
00618 {
00619 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00620 std::cout<<"EXPRINFO_INVERT (__data.params.nd()="<< __data.params.nd() << "), ";
00621 #endif
00622
00623 #if DEBUG_IHESS_EVALUATOR
00624 std::cout<<"EXPRINFO_INVERT"<<std::endl;
00625 #endif
00626
00627 h= 1 / __rval.f ;
00628 eval_data.r.f = eval_data.r.f * h;
00629 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00630
00631 (*eval_data.d_data)[__data.node_num][0] =
00632 -__data.params.nd()*sqr(h[0]);
00633
00634 (*eval_data.h_data)[__data.node_num][0] =
00635 2*__data.params.nd()*sqr(h[0]) * h[0] * __rval.f[1];
00636
00637 break;
00638 }
00639 case EXPRINFO_DIV:
00640 {
00641 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00642 std::cout<<"EXPRINFO_DIV (__data.params.nd()="<< __data.params.nd() <<";__data.coeffs[0]="<<__data.coeffs[0]<< "), ";
00643 #endif
00644 #if DEBUG_IHESS_EVALUATOR
00645 std::cout<<"EXPRINFO_DIV"<<std::endl;
00646 #endif
00647 if(eval_data.n++ == 0) {
00648 eval_data.r.f = __rval.f;
00649 }
00650 else
00651 {
00652 double constant=__data.params.nd();
00653 diffI h= 1/__rval.f;
00654 interval g1= eval_data.r.f[1];
00655 interval temp= sqr(h[0]);
00656 eval_data.r.f = constant * eval_data.r.f * h ;
00657 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670 (*eval_data.h_data)[__data.node_num][0] = - constant * temp * __rval.f[1] ;
00671 (*eval_data.h_data)[__data.node_num][1] = temp*(- constant * g1 + 2 * eval_data.r.f[0] *__rval.f[1]);
00672
00673 (*eval_data.d_data)[__data.node_num][0] = h[0] * constant ;
00674 (*eval_data.d_data)[__data.node_num][1] = - eval_data.r.f[0] * h[0];
00675
00676 }
00677
00678 break;
00679 }
00680 case EXPRINFO_SQUARE:
00681 {
00682 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00683 std::cout<<"EXPRINFO_SQUARE (__data.params.nd()="<< __data.params.nd() <<";__data.coeffs[0]=" << __data.coeffs[0] << "), ";
00684 #endif
00685 h = __data.coeffs[0]*__rval.f+__data.params.nd();
00686 eval_data.r.f = square(h);
00687 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00688 #if DEBUG_IHESS_EVALUATOR
00689 std::cout<<"EXPRINFO_SQUARE " << eval_data.r.f <<std::endl;
00690 #endif
00691
00692 (*eval_data.h_data)[__data.node_num][0] = 2 * h[1] * __data.coeffs[0];
00693 (*eval_data.d_data)[__data.node_num][0] = 2 * h[0] * __data.coeffs[0];
00694
00695 break;
00696 }
00697 case EXPRINFO_INTPOWER:
00698 {
00699 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00700 std::cout<<"EXPRINFO_INTPOWER (__data.params.nn()="<< __data.params.nn() << "; __data.coeffs="<<__data.coeffs<<"), ";
00701 #endif
00702 #if DEBUG_IHESS_EVALUATOR
00703 std::cout<<"EXPRINFO_INTPOWER"<<std::endl;
00704 #endif
00705 int hl = __data.params.nn();
00706 if(hl == 0)
00707 {
00708 eval_data.r.f = 1;
00709 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00710
00711 (*eval_data.h_data)[__data.node_num][0] = 0;
00712 (*eval_data.d_data)[__data.node_num][0] = 0;
00713
00714 }
00715 else
00716 {
00717 diffI kl = __data.coeffs[0]*__rval.f;
00718 switch(hl)
00719 {
00720 case 1:
00721 eval_data.r.f = kl;
00722 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00723 (*eval_data.h_data)[__data.node_num][0] = 0;
00724 (*eval_data.d_data)[__data.node_num][0] = __data.coeffs[0];
00725 break;
00726 case 2:
00727 eval_data.r.f = square(kl);
00728 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00729
00730 (*eval_data.h_data)[__data.node_num][0] = 2*kl[1]*__data.coeffs[0];
00731
00732 (*eval_data.d_data)[__data.node_num][0] = 2*kl[0]*__data.coeffs[0];
00733
00734 break;
00735 case -1:
00736 { diffI h = 1/kl;
00737 h[0].intersectwith((*eval_data.range)[__data.node_num]);
00738 eval_data.r.f = h;
00739 (*eval_data.h_data)[__data.node_num][0] = 2*ipow(h[0],3)*kl[1]*__data.coeffs[0];
00740 (*eval_data.d_data)[__data.node_num][0] = -sqr(h[0])*__data.coeffs[0];
00741 }
00742 break;
00743 case -2:
00744 {
00745 diffI h = 1/kl;
00746 diffI k = square(h);
00747 k[0].intersectwith((*eval_data.range)[__data.node_num]);
00748 eval_data.r.f = k;
00749
00750 (*eval_data.h_data)[__data.node_num][0] = 6*sqr(k[0])*kl[1]*__data.coeffs[0];
00751
00752 (*eval_data.d_data)[__data.node_num][0] = -2*h[0]*k[0]*__data.coeffs[0];
00753
00754 }
00755 break;
00756 default:
00757 {
00758
00759 diffI k=__power(1.,kl, hl-1);
00760 eval_data.r.f = k*kl;
00761 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00762
00763 (*eval_data.h_data)[__data.node_num][0] = hl * __data.coeffs[0] * k[1];
00764 (*eval_data.d_data)[__data.node_num][0] = hl * __data.coeffs[0] * k[0];
00765 }
00766 break;
00767 }
00768 }
00769
00770 break;
00771 }
00772 case EXPRINFO_SQROOT:
00773 {
00774 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00775 std::cout<<"EXPRINFO_SQROOT(__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs<<"), ";
00776 #endif
00777 #if DEBUG_IHESS_EVALUATOR
00778 std::cout<<"EXPRINFO_SQROOT"<<std::endl;
00779 #endif
00780 h = sqrt(__data.coeffs[0]*__rval.f+__data.params.nd());
00781 h[0].intersectwith((*eval_data.range)[__data.node_num]);
00782 eval_data.r.f = h;
00783 k = 0.5 * (__data.coeffs[0] / h);
00784
00785 (*eval_data.h_data)[__data.node_num][0] = k[1];
00786 if(eval_data.d_data!=NULL) {
00787 (*eval_data.d_data)[__data.node_num][0] = k[0];
00788 }
00789
00790 break;
00791 }
00792 case EXPRINFO_ABS:
00793 {
00794 std::cerr << "ihessForwardEvaluator: ABS" << std::endl;
00795 throw api_exception(apiee_other,"Regularity error: ihessForwardEvaluator. EXPRINFO_ABS");
00796 break;
00797 }
00798 case EXPRINFO_POW:
00799 {
00800
00801
00802
00803
00804 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00805 std::cout<<"EXPRINFO_POW(n="<<eval_data.n<<";__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs<<"), ";
00806 #endif
00807 diffI hh = __rval.f * __data.coeffs[eval_data.n];
00808 if(eval_data.n++ == 0)
00809 {
00810 eval_data.carry = __rval.f;
00811 eval_data.r.f = hh+__data.params.nd();
00812 }
00813 else
00814 {
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829 interval x = eval_data.r.f[0];
00830 interval logx = log(eval_data.r.f[0]);
00831 interval y = __rval.f[0] * __data.coeffs[1];
00832 interval yy1;
00833 if(y.contains(0.5)) {
00834 interval u = abs(y-0.5);
00835 u = u.sup();
00836 u *= u-1;
00837 yy1 = interval(-0.25, u.sup());
00838 } else {
00839 interval u = abs(y-0.5);
00840 yy1 = u.inf();
00841 yy1 *= yy1-1;
00842 u = u.sup();
00843 u *= u-1;
00844 yy1.hullwith(u);
00845 }
00846
00847 eval_data.r.f = power(eval_data.r.f, __rval.f * __data.coeffs[1]);
00848 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00849 interval temp2 = eval_data.r.f[0] / sqr(x);
00850
00851 (*eval_data.h_data)[__data.node_num][0] =
00852 temp2 * ( yy1 * __data.coeffs[0] * __data.coeffs[0] * eval_data.carry[1]
00853 + x * (1+ y * logx ) * __data.coeffs[0] * __data.coeffs[1] * __rval.f[1] ) ;
00854 temp2 = eval_data.r.f[0] / x;
00855 (*eval_data.h_data)[__data.node_num][1] =
00856 temp2 * ( (1+ y * logx ) * __data.coeffs[0] * __data.coeffs[1] * eval_data.carry[1]
00857 + sqr(logx) * x * __data.coeffs[1] * __data.coeffs[1] * __rval.f[1]);
00858
00859 (*eval_data.d_data)[__data.node_num][0] = y * temp2;
00860
00861 (*eval_data.d_data)[__data.node_num][1] = logx * eval_data.r.f[0] * __data.coeffs[1];
00862
00863 }
00864 break;
00865 }
00866 case EXPRINFO_EXP:
00867 {
00868 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00869 std::cout<<"EXPRINFO_EXP(__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs[0]<<"), ";
00870 #endif
00871 diffI h = exp(__rval.f*__data.coeffs[0]+__data.params.nd());
00872 h[0].intersectwith((*eval_data.range)[__data.node_num]);
00873 eval_data.r.f = h;
00874 (*eval_data.d_data)[__data.node_num][0] = __data.coeffs[0]* h[0];
00875 (*eval_data.h_data)[__data.node_num][0] = __data.coeffs[0] *(__data.coeffs[0] * h[0]) * __rval.f[1];
00876 break;
00877 }
00878 case EXPRINFO_LOG:
00879 {
00880 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00881 std::cout<<"EXPRINFO_LOG(__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs[0]<<"), ";
00882 #endif
00883 diffI h = __rval.f*__data.coeffs[0]+__data.params.nd();
00884 interval k=__data.coeffs[0]/h[0];
00885 eval_data.r.f = log(h);
00886 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00887 (*eval_data.d_data)[__data.node_num][0] = k;
00888 (*eval_data.h_data)[__data.node_num][0] = - sqr(k) * __rval.f[1];
00889 }
00890 break;
00891 case EXPRINFO_SIN:
00892 {
00893 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00894 std::cout<<"EXPRINFO_SIN(__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs[0]<<"), ";
00895 #endif
00896 diffI h = __rval.f*__data.coeffs[0]+__data.params.nd();
00897 eval_data.r.f = sin(h);
00898 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00899 interval cosh0 = sqrt(1-sqr(eval_data.r.f[0]));
00900 cosh0.intersectwith(cos(h[0]));
00901
00902 (*eval_data.d_data)[__data.node_num][0] =__data.coeffs[0] * cosh0;
00903 (*eval_data.h_data)[__data.node_num][0] = - __data.coeffs[0] * (__data.coeffs[0] * eval_data.r.f[0]) * __rval.f[1];
00904 }
00905 break;
00906 case EXPRINFO_COS:
00907 {
00908 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00909 std::cout<<"EXPRINFO_COS(__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs[0]<<"), ";
00910 #endif
00911 diffI h = __rval.f*__data.coeffs[0]+__data.params.nd();
00912 eval_data.r.f = cos(h);
00913 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00914 interval sinh0 = sqrt(1-sqr(eval_data.r.f[0]));
00915 sinh0.intersectwith(sin(h[0]));
00916
00917 (*eval_data.d_data)[__data.node_num][0] = -__data.coeffs[0]*sinh0;
00918 (*eval_data.h_data)[__data.node_num][0] = -__data.coeffs[0]*(__data.coeffs[0] * eval_data.r.f[0])*__rval.f[1];
00919 }
00920 break;
00921 case EXPRINFO_ATAN2:
00922 {
00923 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00924 std::cout<<"EXPRINFO_ATAN2(__data.params.nd()="<< __data.params.nd() << "; __data.coeffs[0]="<<__data.coeffs[0]<<"), ";
00925 #endif
00926 diffI hh = __rval.f * __data.coeffs[eval_data.n];
00927 if(eval_data.n++ == 0) {
00928 eval_data.carry=__rval.f;
00929 eval_data.r.f = hh;
00930 }
00931 else
00932 {
00933 interval h = eval_data.r.f[0];
00934 h = sqr(h);
00935 h = h + sqr(hh[0]);
00936 interval gradx = hh[0]/h;
00937 interval grady = eval_data.r.f[0]/h;
00938
00939 (*eval_data.d_data)[__data.node_num][0] = __data.coeffs[0] * gradx;
00940 (*eval_data.d_data)[__data.node_num][1] = - __data.coeffs[1] * grady;
00941 interval ihessdiag= 2 * gradx * grady;
00942
00943 interval ihessoffdiag= __data.coeffs[0]*(__data.coeffs[1]*(sqr(hh[0])-sqr(eval_data.r.f[0]))/sqr(h));
00944 (*eval_data.h_data)[__data.node_num][0] = __data.coeffs[0]* __data.coeffs[0] * ihessdiag * eval_data.carry[1]
00945 + ihessoffdiag * __rval.f[1];
00946 (*eval_data.h_data)[__data.node_num][1] = ihessoffdiag * eval_data.carry[1]
00947 -__data.coeffs[1]* __data.coeffs[1] * ihessdiag * __rval.f[1] ;
00948 eval_data.r.f = atan2(eval_data.r.f,hh);
00949 eval_data.r.f[0].intersectwith((*eval_data.range)[__data.node_num]);
00950 }
00951 }
00952 break;
00953 case EXPRINFO_GAUSS:
00954 {
00955 #if DEBUG_FHE_LIST_NODES_WITH_PARAMETERS
00956 std::cout<<"EXPRINFO_GAUSS(__data.params.d()="<< __data.params.d() << "; __data.coeffs[0]="<<__data.coeffs[0]<<"), ";
00957 #endif
00958
00959 diffI h = (__data.coeffs[0]*__rval.f-__data.params.d()[0])/
00960 __data.params.d()[1];
00961 diffI k = exp(-h*h);
00962 k[0].intersectwith((*eval_data.range)[__data.node_num]);
00963 eval_data.r.f = k;
00964
00965 (*eval_data.d_data)[__data.node_num][0] =
00966 -2*h[0]*__data.coeffs[0]*k[0]/__data.params.d()[1];
00967 (*eval_data.h_data)[__data.node_num][0] =
00968 2*(2*sqr(h[0])-2) * __data.coeffs[0] *__data.coeffs[0] * k[0] / (__data.params.d()[1]*__data.params.d()[1]);
00969 }
00970 break;
00971
00973 case EXPRINFO_POLY:
00974 {
00975 std::cerr << "ihessForwardEvaluator: POLY" << std::endl;
00976 throw "NYI: ihessForwardEvaluator. EXPRINFO_POLY";
00977 break;
00978 }
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992 case EXPRINFO_LIN:
00993 case EXPRINFO_QUAD:
00994 {
00995
00996 std::cerr << "ihessForwardEvaluator: QUAD" << std::endl;
00997 throw "NYI: ihessForwardEvaluator. EXPRINFO_QUAD";
00998 break;
00999 }
01000 case EXPRINFO_IN:
01001 {
01002 std::cerr << "ihessForwardEvaluator: IN" << std::endl;
01003 throw "NYI: ihessForwardEvaluator. EXPRINFO_IN";
01004 break;
01005 }
01006 case EXPRINFO_IF:
01007 {
01008 std::cerr << "ihessForwardEvaluator: IF" << std::endl;
01009 throw "NYI: ihessForwardEvaluator. EXPRINFO_IF";
01010 break;
01011 }
01012 case EXPRINFO_AND:
01013 {
01014 std::cerr << "ihessForwardEvaluator: AND" << std::endl;
01015 throw "NYI: ihessForwardEvaluator. EXPRINFO_AND";
01016 break;
01017 }
01018 case EXPRINFO_OR:
01019 {
01020 std::cerr << "ihessForwardEvaluator: OR" << std::endl;
01021 throw "NYI: ihessForwardEvaluator. EXPRINFO_OR";
01022 break;
01023 }
01024 case EXPRINFO_NOT:
01025 {
01026 std::cerr << "ihessForwardEvaluator: NOT" << std::endl;
01027 throw "NYI: ihessForwardEvaluator. EXPRINFO_NOT";
01028 break;
01029 }
01030
01031 case EXPRINFO_IMPLIES:
01032 {
01033 std::cerr << "ihessForwardEvaluator: IMPLIES" << std::endl;
01034 throw "NYI: ihessForwardEvaluator. EXPRINFO_IMPLIES";
01035 break;
01036 }
01037 case EXPRINFO_COUNT:
01038 {
01039 std::cerr << "ihessForwardEvaluator: COUNT" << std::endl;
01040 throw "NYI: ihessForwardEvaluator. EXPRINFO_COUNT";
01041 break;
01042 }
01043 case EXPRINFO_ALLDIFF:
01044 {
01045 std::cerr << "ihessForwardEvaluator: ALLDIFF" << std::endl;
01046 throw "NYI: ihessForwardEvaluator. EXPRINFO_ALLDIFF";
01047 break;
01048 }
01049 case EXPRINFO_HISTOGRAM:
01050 {
01051 std::cerr << "ihessForwardEvaluator: HISTOGRAM" << std::endl;
01052 throw "NYI: ihessForwardEvaluator. EXPRINFO_HISTOGRAM";
01053 break;
01054 }
01055 case EXPRINFO_LEVEL:
01056 {
01057 std::cerr << "ihessForwardEvaluator: LEVEL" << std::endl;
01058 throw "NYI: ihessForwardEvaluator. EXPRINFO_LEVEL";
01059 break;
01060 }
01061 case EXPRINFO_NEIGHBOR:
01062 {
01063 std::cerr << "ihessForwardEvaluator: NEIGHBOR" << std::endl;
01064 throw "NYI: ihessForwardEvaluator. EXPRINFO_NEIGHBOR";
01065 break;
01066 }
01067 case EXPRINFO_NOGOOD:
01068 {
01069 std::cerr << "ihessForwardEvaluator: NOGOOD" << std::endl;
01070 throw "NYI: ihessForwardEvaluator. EXPRINFO_NOGOOD";
01071 break;
01072 }
01073 case EXPRINFO_EXPECTATION:
01074 {
01075 std::cerr << "ihessForwardEvaluator: EXPECTATION" << std::endl;
01076 throw "NYI: ihessForwardEvaluator. EXPRINFO_EXPECTATION";
01077 break;
01078 }
01079 case EXPRINFO_INTEGRAL:
01080 {
01081 std::cerr << "ihessForwardEvaluator: INTEGRAL" << std::endl;
01082 throw "NYI: ihessForwardEvaluator. EXPRINFO_INTEGRAL";
01083 break;
01084 }
01085 case EXPRINFO_LOOKUP:
01086 case EXPRINFO_PWLIN:
01087 case EXPRINFO_SPLINE:
01088 case EXPRINFO_PWCONSTLC:
01089 case EXPRINFO_PWCONSTRC:
01090 {
01091 std::cerr << "ihessForwardEvaluator: SPLINE_STUFF" << std::endl;
01092 throw "NYI: ihessForwardEvaluator. EXPRINFO_SPLINE_STUFF";
01093 break;
01094 }
01095 case EXPRINFO_DET:
01096 case EXPRINFO_COND:
01097 case EXPRINFO_PSD:
01098 case EXPRINFO_MPROD:
01099 case EXPRINFO_FEM:
01100 {
01101 std::cerr << "ihessForwardEvaluator: MATRIX_STUFF" << std::endl;
01102 throw "NYI: ihessForwardEvaluator. EXPRINFO_MATRIX_STUFF";
01103 break;
01104 }
01105 case EXPRINFO_RE:
01106 case EXPRINFO_IM:
01107 case EXPRINFO_ARG:
01108 case EXPRINFO_CPLXCONJ:
01109 {
01110 std::cerr << "ihessForwardEvaluator: COMPLEX_STUFF" << std::endl;
01111 throw "NYI: ihessForwardEvaluator. EXPRINFO_COMPLEX_STUFF";
01112 break;
01113 }
01114 case EXPRINFO_CMPROD:
01115 case EXPRINFO_CGFEM:
01116 {
01117 std::cerr << "ihessForwardEvaluator: FEM_STUFF" << std::endl;
01118 throw "NYI: ihessForwardEvaluator. EXPRINFO_FEM_STUFF";
01119 break;
01120 }
01121 default:
01122 {
01123 std::cerr << "ihessForwardEvaluator: unknown function type " <<
01124 __data.operator_type << std::endl;
01125 throw "Programming error";
01126 break;
01127 }
01128 }
01129 }
01130
01131
01132
01133
01134
01135
01136
01137 if(eval_data.f_cache && __data.n_parents > 1 && __data.n_children > 0)
01138 (*eval_data.f_cache)[__data.node_num] = eval_data.r.f;
01139 return ret;
01140 }
01141
01142 ihessForwardEvaluatorReturnValue calculate_value(bool eval_all)
01143 {
01144 return eval_data.r;
01145 }
01146 };
01147
01148
01149
01150
01151 struct ihessBackwardEvaluatorType
01152 {
01153 std::vector<std::vector<interval> >* d_data;
01154 std::vector<std::vector<interval> >* h_data;
01155 std::vector<std::vector<interval> >* d_cache;
01156 std::vector<std::vector<interval> >* h_cache;
01157 std::vector<interval>* grad_vec;
01158 std::vector<interval>* hess_vec;
01159 bool calc_grad;
01160 const model* mod;
01161 interval d_mult;
01162 interval hessian_of_current_node;
01163 bool hess_zero;
01164 interval d_mult_trans;
01165 interval h_mult;
01166 interval h_mult_trans;
01167 bool is_linear;
01168 unsigned int child_n;
01169
01170
01171 };
01172
01173 class ihessBackwardEvaluator : public
01174 cached_backward_evaluator_base<ihessBackwardEvaluatorType,expression_node,bool,
01175 expression_const_walker>
01176 {
01177 private:
01178 typedef cached_backward_evaluator_base<ihessBackwardEvaluatorType,expression_node,
01179 bool,expression_const_walker> _Base;
01180
01181 protected:
01182 bool is_cached(const node_data_type& __data)
01183 {
01184 if(eval_data.d_cache && __data.n_parents > 1 && __data.n_children > 0
01185 && (*eval_data.d_cache)[__data.node_num].size() > 0 &&
01186 v_ind->match(__data.var_indicator()))
01187 {
01188 return true;
01189 }
01190 else
01191 return false;
01192 }
01193
01194 public:
01195 ihessBackwardEvaluator(std::vector<std::vector<interval> >*__der_data,
01196 std::vector<std::vector<interval> >* __hess_data,
01197 variable_indicator& __v,
01198 const model& __m,
01199 std::vector<std::vector<interval > >* __d,
01200 std::vector<std::vector<interval > >* __h,
01201 std::vector<interval>* __grad,
01202 std::vector<interval>* __hess)
01203 {
01204 #if DEBUG_IHESS_EVALUATOR
01205 cout<<"backward.constructor"<< std::endl;
01206 #endif
01207 eval_data.d_data = __der_data;
01208 eval_data.h_data = __hess_data;
01209 eval_data.d_cache = __d;
01210 eval_data.h_cache = __h;
01211 eval_data.mod = &__m;
01212 eval_data.grad_vec = __grad;
01213 eval_data.hess_vec = __hess;
01214
01215 eval_data.d_mult_trans = 1.;
01216 eval_data.d_mult = 0.;
01217 eval_data.h_mult_trans = 0.;
01218 eval_data.h_mult = 0.;
01219 eval_data.hess_zero =true;
01220 eval_data.hessian_of_current_node =0.;
01221 v_ind = &__v;
01222 }
01223
01224
01225 ihessBackwardEvaluator(const ihessBackwardEvaluator& __he) { eval_data = __he.eval_data; }
01226
01227 ~ihessBackwardEvaluator() {}
01228
01229 void newPoint(std::vector<std::vector<interval> >* __der_data,
01230 std::vector<std::vector<interval> >* __hess_data,
01231 const variable_indicator& __v)
01232 {
01233 if(__der_data!=NULL) eval_data.d_data = __der_data;
01234 else eval_data.calc_grad=false;
01235 eval_data.h_data = __hess_data;
01236 v_ind = &__v;
01237 }
01238
01239 void newResult(std::vector<interval>* __grad, std::vector<interval>* __hess)
01240 {
01241 eval_data.grad_vec = __grad;
01242 eval_data.hess_vec = __hess;
01243 }
01244
01245 void set_mult(interval scal)
01246 {
01247 eval_data.d_mult_trans = scal;
01248 eval_data.h_mult_trans = 0.;
01249 }
01250 public:
01251
01252 expression_const_walker short_cut_to(const expression_node& __data)
01253 { return eval_data.mod->node(0); }
01254
01255
01256 void initialize()
01257 {
01258
01259 #if DEBUG_IHESS_EVALUATOR
01260 std::cout<<"backward.initialize" << std::endl;
01261
01262 #endif
01263 eval_data.child_n = 0;
01264 }
01265
01266
01267 int calculate(const expression_node& __data)
01268 {
01269
01270 switch(__data.operator_type) {
01271 case EXPRINFO_CONSTANT:
01272 {
01273 #if DEBUG_IHESS_EVALUATOR
01274 std::cout<<"backward.calculate: EXPRINFO_CONSTANT" << std::endl;
01275
01276 #endif
01277 break;
01278
01279 }
01280 case EXPRINFO_VARIABLE:
01281 {
01282 #if DEBUG_IHESS_EVALUATOR
01283 std::cout<<"backward.calculate: EXPRINFO_VARIABLE" << std::endl;
01284 #endif
01285
01286 int i=__data.params.nn();
01287
01288 (*eval_data.grad_vec)[i] = (*eval_data.grad_vec)[i]+ eval_data.d_mult_trans;
01289 (*eval_data.hess_vec)[i] = (*eval_data.hess_vec)[i] +eval_data.h_mult_trans;
01290 eval_data.hessian_of_current_node=0.;
01291
01292
01293 break;
01294 }
01295 case EXPRINFO_SUM:
01296 {eval_data.hessian_of_current_node=0.;}
01297 case EXPRINFO_MEAN:
01298 {eval_data.hessian_of_current_node=0.;}
01299 case EXPRINFO_PROD:
01300 {eval_data.hessian_of_current_node=0.;}
01301 case EXPRINFO_MONOME:
01302 {eval_data.hessian_of_current_node=0.;}
01303 case EXPRINFO_MAX:
01304 {eval_data.hessian_of_current_node=0.;}
01305 case EXPRINFO_SCPROD:
01306 {eval_data.hessian_of_current_node=0.;}
01307 case EXPRINFO_NORM:
01308 {eval_data.hessian_of_current_node=0.;}
01309 case EXPRINFO_INVERT:
01310 {eval_data.hessian_of_current_node=0.;}
01311 case EXPRINFO_DIV:
01312 {eval_data.hessian_of_current_node=0.;}
01313 case EXPRINFO_SQUARE:
01314 {eval_data.hessian_of_current_node=2.;}
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342 default:
01343 {
01344 #if DEBUG_IHESS_EVALUATOR
01345
01346 std::cout<<"backward.calculate: DEFAULT optype="<<__data.operator_type << std::endl;
01347 #endif
01348
01349 eval_data.child_n = 1;
01350
01351
01352 #if DEBUG_IHESS_EVALUATOR
01353
01354
01355
01356 #endif
01357
01358 eval_data.h_mult = eval_data.h_mult_trans;
01359
01360 eval_data.h_mult_trans = eval_data.h_mult_trans * (*eval_data.d_data)[__data.node_num][0]
01361 +eval_data.d_mult_trans * (*eval_data.h_data)[__data.node_num][0];
01362
01363
01364
01365
01366
01367
01368 #if DEBUG_IHESS_EVALUATOR
01369
01370
01371
01372 #endif
01373
01374
01375
01376
01377 if(eval_data.d_mult_trans != 0. ) {
01378 #if DEBUG_IHESS_EVALUATOR
01379
01380
01381
01382 #endif
01383
01384 eval_data.d_mult = eval_data.d_mult_trans;
01385
01386 eval_data.d_mult_trans *= (*eval_data.d_data)[__data.node_num][0];
01387
01388 #if DEBUG_IHESS_EVALUATOR
01389
01390
01391
01392 #endif
01393
01394 }
01395
01396 }
01397
01398
01399 }
01400
01401 return 1;
01402 }
01403
01404 void cleanup(const expression_node& __data)
01405 {
01406 #if DEBUG_IHESS_EVALUATOR
01407 std::cout<<"backward.cleanup" << std::endl;
01408 #endif
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431 }
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442 int update(const bool& __rval)
01443 {
01444 #if DEBUG_IHESS_EVALUATOR
01445 std::cout<<"backward.update bool" << std::endl;
01446 #endif
01447 eval_data.child_n++;
01448 return 0;
01449 }
01450
01451
01452 int update(const expression_node& __data, const bool& __rval)
01453 {
01454 #if DEBUG_IHESS_EVALUATOR
01455 std::cout<<"backward.update"<<std::endl;;
01456 #endif
01457 if(__data.n_children == 0) {
01458 #if DEBUG_IHESS_EVALUATOR
01459
01460 #endif
01461 return 0;
01462 }
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474 if(eval_data.child_n < __data.n_children)
01475 {
01476
01477 #if DEBUG_IHESS_EVALUATOR
01478
01479
01480
01481
01482
01483 #endif
01484
01485 eval_data.d_mult_trans = eval_data.d_mult * (*eval_data.d_data)[__data.node_num][eval_data.child_n];
01486
01487 eval_data.h_mult_trans = eval_data.h_mult * (*eval_data.d_data)[__data.node_num][eval_data.child_n]
01488 +eval_data.d_mult * (*eval_data.h_data)[__data.node_num][eval_data.child_n];
01489
01490 #if DEBUG_IHESS_EVALUATOR
01491
01492
01493
01494
01495
01496 #endif
01497 }
01498
01499
01500
01501
01502 eval_data.child_n++;
01503 return 0;
01504 }
01505
01506 bool calculate_value(bool eval_all)
01507 {
01508 #if DEBUG_IHESS_EVALUATOR
01509 std::cout<<"backward.calculate_value" << std::endl;
01510 #endif
01511 return true;
01512 }
01513 };
01514
01515
01516
01517 }
01518
01519 #endif