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