Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

ade_evaluator.h

Go to the documentation of this file.
00001 // Analytic D. Evaluator implementation -*- C++ -*-
00002 
00003 // Copyright (C) 2001-2003 Hermann Schichl, Knut Petras
00004 //
00005 // This file is part of the COCONUT API.  This library
00006 // is free software; you can redistribute it and/or modify it under the
00007 // terms of the Library GNU General Public License as published by the
00008 // Free Software Foundation; either version 2, or (at your option)
00009 // any later version.
00010 
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 // Library GNU General Public License for more details.
00015 
00016 // As a special exception, you may use this file as part of a free software
00017 // library without restriction.  Specifically, if other files instantiate
00018 // templates or use macros or inline functions from this file, or you compile
00019 // this file and link it with other files to produce an executable, this
00020 // file does not by itself cause the resulting executable to be covered by
00021 // the Library GNU General Public License.  This exception does not however
00022 // invalidate any other reasons why the executable file might be covered by
00023 // the Library GNU General Public License.
00024 
00027 #ifndef _ADE_EVALUATOR_H_
00028 #define _ADE_EVALUATOR_H_
00029 
00030 #include <coconut_config.h>
00031 #include <evaluator.h>
00032 #include <expression.h>
00033 #include <model.h>
00034 #include <eval_main.h>
00035 #include <linalg.h>
00036 #include <math.h>
00037 #include <cinterval.h>
00038 
00039 using namespace vgtl;
00040 
00041 typedef analyticd (*analyticd_evaluator)(const std::vector<analyticd>* __x,
00042                                  const variable_indicator& __v);
00043 
00044 struct analyticd_eval_type
00045 {
00046   const std::vector<analyticd>* x;
00047   std::vector<analyticd>* cache;
00048   const model* mod;
00049   void *p;
00050   analyticd d;
00051   int info;
00052   analyticd r;
00053   unsigned int n;
00054 };
00055 
00056 class analyticd_eval : public
00057   cached_forward_evaluator_base<analyticd_eval_type,expression_node,analyticd,
00058                                 model::walker>
00059 {
00060 private:
00061   typedef cached_forward_evaluator_base<analyticd_eval_type,expression_node,
00062                                         analyticd,model::walker> _Base;
00063 
00064 protected:
00065   bool is_cached(const node_data_type& __data)
00066   {
00067     if(__data.operator_type == EXPRINFO_LIN ||
00068        __data.operator_type == EXPRINFO_QUAD)
00069       return true;
00070     else
00071       return false;
00072 #if 0
00073     if(eval_data.cache && __data.n_parents > 1 && __data.n_children > 0)
00074       return true;
00075     else
00076       return false;
00077 #endif
00078   }
00079 
00080 private:
00081   /*  analyticd __power(double __coeff, analyticd __x, int __exp)
00082   {
00083     if(__exp == 0)
00084       return 1.;
00085     else
00086     {
00087       analyticd k = __coeff*__x;
00088       switch(__exp)
00089       {
00090         case 1:
00091           return k;
00092           break;
00093         case 2:
00094           return sqr(k);
00095           break;
00096         case -1:
00097           return 1./k;
00098           break;
00099         case -2:
00100           return 1./sqr(k);
00101           break;
00102         default:
00103           return ipow(k, __exp);
00104           break;
00105       }
00106     }
00107     return 0;           // we never come here!
00108   }
00109   */
00110 public:
00111   analyticd_eval(const std::vector<analyticd>& __x, const variable_indicator& __v,
00112                 const model& __m, std::vector<analyticd>* __c) : _Base()
00113   {
00114     eval_data.x = &__x;
00115     eval_data.cache = __c;
00116     eval_data.mod = &__m;
00117     eval_data.d = 0.;
00118     eval_data.p = NULL;
00119     v_ind = &__v;
00120     eval_data.n = 0;
00121   }
00122 
00123   analyticd_eval(const analyticd_eval& __v) : _Base(__v) {}
00124   
00125   ~analyticd_eval() {}
00126 
00127   model::walker short_cut_to(const expression_node& __data)
00128   { return eval_data.mod->node(0); }    // return anything
00129 
00130   void initialize() { return; }
00131   
00132   int initialize(const expression_node& __data)
00133   {
00134     if(__data.ev && (*__data.ev)[FUNC_ANALYTICD])
00135     // is there a short-cut evaluator defined?
00136     {
00137       eval_data.r =
00138         (*(analyticd_evaluator)(*__data.ev)[FUNC_ANALYTICD])(eval_data.x,
00139                                                                  *v_ind);
00140       return 0;     // don't perform the remaining graph walk
00141     }
00142     else
00143     {
00144       switch(__data.operator_type)
00145       {
00146         case EXPRINFO_SUM:
00147         case EXPRINFO_PROD:
00148         case EXPRINFO_MAX:
00149         case EXPRINFO_MIN:
00150         case EXPRINFO_INVERT:
00151         case EXPRINFO_DIV:
00152           eval_data.r = __data.params.nd();
00153           break;
00154         case EXPRINFO_MONOME:
00155         case EXPRINFO_IN:
00156         case EXPRINFO_AND:
00157         case EXPRINFO_NOGOOD:
00158           eval_data.r = 1.;
00159           break;
00160         case EXPRINFO_ALLDIFF:
00161           eval_data.p = (void*) new std::vector<analyticd>;
00162           ((std::vector<analyticd>*)eval_data.p)->reserve(__data.n_children);
00163           // no break!
00164         case EXPRINFO_MEAN:
00165         case EXPRINFO_IF:
00166         case EXPRINFO_OR:
00167         case EXPRINFO_NOT:
00168         case EXPRINFO_COUNT:
00169         case EXPRINFO_SCPROD:
00170         case EXPRINFO_NORM:
00171         case EXPRINFO_LEVEL:
00172           eval_data.r = 0.;
00173           break;
00174         case EXPRINFO_DET:
00175         case EXPRINFO_PSD:
00176           // here construct square analyticd matrix
00177           break;
00178         case EXPRINFO_COND:
00179         case EXPRINFO_FEM:
00180         case EXPRINFO_MPROD:
00181           // here construct rectangular analyticd matrix
00182           break;
00183       }
00184       return 1;
00185     }
00186   }
00187 
00188   void calculate(const expression_node& __data)
00189   {
00190 #if 0
00191     if(__data.operator_type > 0)
00192     {
00193       eval_data.r = __data.i_evaluate(-1, __data.params.nn(), *eval_data.x,
00194                                       *v_ind, eval_data.r, cintval(0.0), NULL);
00195     }
00196     eval_data.r.intersect(__data.f_bounds);
00197 #endif
00198   }
00199 
00200   void retrieve_from_cache(const expression_node& __data)
00201   {
00202     if(__data.operator_type == EXPRINFO_LIN)
00203     {
00204       const matrix<double>::Row& lrw(eval_data.mod->lin[__data.params.nn()]);
00205       matrix<double>::Row::const_iterator _x, _e;
00206 
00207       eval_data.r = analyticd(0.);
00208       for(_x = lrw.begin(); _x != _e; ++_x)
00209         eval_data.r += (*eval_data.x)[_x.index()] * *_x;
00210     }
00211     else if(__data.operator_type == EXPRINFO_QUAD)
00212     {
00213       throw "Interval Evaluation of QUAD: NYI!";
00214     }
00215     else
00216       eval_data.r = (*eval_data.cache)[__data.node_num];
00217   }
00218 
00219   int update(const analyticd& __rval)
00220   {
00221     eval_data.r = __rval;
00222     return 0;
00223   }
00224 
00225   int update(const expression_node& __data, const analyticd& __rval)
00226   {
00227     analyticd __x;
00228     int ret = 0;
00229     if(__data.operator_type < 0)
00230     {
00231       switch(__data.operator_type)
00232       {
00233         case EXPRINFO_CONSTANT:
00234           eval_data.r = __data.params.nd();
00235           break;
00236         case EXPRINFO_VARIABLE:
00237           eval_data.r = (*eval_data.x)[__data.params.nn()];
00238           break;
00239         case EXPRINFO_SUM:
00240         case EXPRINFO_MEAN:
00241           eval_data.r += __data.coeffs[eval_data.n++]*__rval;
00242           break;
00243         case EXPRINFO_PROD:
00244           // the coefficients MUST be collected in __data.params.nd()
00245           eval_data.r *= __rval;
00246           if(eval_data.r == 0.) ret = -1;
00247           break;
00248         case EXPRINFO_MONOME:
00249           // the coefficients MUST be collected in __data.params.nd()
00250           //eval_data.r *= __power(__data.coeffs[eval_data.n], __rval,
00251           //                       __data.params.n()[eval_data.n]);
00252           //if(eval_data.r == 0.) ret = -1;
00253           //eval_data.n++;
00254           std::cerr << "Momomials NYI" << std::endl;
00255           throw "NYI";
00256           break;
00257         case EXPRINFO_MAX:
00258           /* CHANGE HERE */
00259           //{ analyticd h = __rval * __data.coeffs[eval_data.n++];
00260           //  eval_data.r = imax(eval_data.r, h);
00261           // }
00262           std::cerr << "MAXIMUM  NYI" << std::endl;
00263           throw "NYI";
00264           break;
00265         case EXPRINFO_MIN:
00266           /* CHANGE HERE */
00267           std::cerr << "MAXIMUM  NYI" << std::endl;
00268           throw "NYI";
00269           break;
00270           //         { analyticd h = __rval * __data.coeffs[eval_data.n++];
00271           //  eval_data.r = imin(eval_data.r, h);
00272           //}
00273           // break;
00274         case EXPRINFO_SCPROD:
00275           { analyticd h = __data.coeffs[eval_data.n]*__rval;
00276             // if the number of children is odd, the list is implicitly
00277             // lengthened by one null element (i.e. implicitly shortened)
00278             if(eval_data.n & 1) // y_n
00279               eval_data.r += __data.coeffs[eval_data.n]*__rval*h;
00280             else // x_n
00281               eval_data.d = h;
00282           }
00283           eval_data.n++;
00284           break;
00285         case EXPRINFO_NORM:
00286           if(__data.params.nd() != 2.)
00287           {
00288             std::cerr << "Non-euclidean norms NYI" << std::endl;
00289             throw "NYI";
00290           }
00291           else
00292           {
00293             analyticd h = __data.coeffs[eval_data.n++]*__rval;
00294             eval_data.r += sqr(h);
00295           }
00296           if(eval_data.n == __data.n_children && __data.params.nd() == 2.)
00297             eval_data.r = sqrt(eval_data.r);
00298           break;
00299         case EXPRINFO_INVERT:
00300           eval_data.r /= __rval;
00301           break;
00302         case EXPRINFO_DIV:
00303           // this evaluator requires, that the second coefficient
00304           // is put into the first.
00305           if(eval_data.n == 0)
00306             eval_data.r *= __rval;
00307           else
00308             eval_data.r /= __rval;
00309           ++eval_data.n;
00310           break;
00311         case EXPRINFO_SQUARE:
00312           { analyticd h = __data.coeffs[0]*__rval+__data.params.nd();
00313             eval_data.r = sqr(h);
00314           }
00315           break;
00316         case EXPRINFO_INTPOWER:
00317           std::cerr << "INTPOWER  NYI" << std::endl;
00318           throw "NYI";
00319           break;
00320  //eval_data.r = __power(__data.coeffs[0], __rval, __data.params.nn());
00321  //          break;
00322         case EXPRINFO_SQROOT:
00323           eval_data.r = sqrt(__data.coeffs[0]*__rval+__data.params.nd());
00324           break;
00325         case EXPRINFO_ABS:
00326           eval_data.r = abs(__data.coeffs[0]*__rval+__data.params.nd());
00327           break;
00328         case EXPRINFO_POW:
00329           std::cerr << "cinterval^cinterval NYI" << std::endl;
00330           throw "NYI";
00331           break;
00332           //          { analyticd h = __rval * __data.coeffs[eval_data.n];
00333           // if(eval_data.n == 0)
00334           //    eval_data.r = h+__data.params.nd();
00335           // else
00336           //    eval_data.r = pow(eval_data.r, h);
00337           //}
00338           //++eval_data.n;
00339           //break;
00340         case EXPRINFO_EXP:
00341           eval_data.r = exp(__rval*__data.coeffs[0]+__data.params.nd());
00342           break;
00343         case EXPRINFO_LOG:
00344           eval_data.r = log(__rval*__data.coeffs[0]+__data.params.nd());
00345           break;
00346         case EXPRINFO_SIN:
00347           eval_data.r = sin(__rval*__data.coeffs[0]+__data.params.nd());
00348           break;
00349         case EXPRINFO_COS:
00350           eval_data.r = cos(__rval*__data.coeffs[0]+__data.params.nd());
00351           break;
00352         case EXPRINFO_ATAN2:
00353           std::cerr << "ATAN2 NYI" << std::endl;
00354           throw "NYI";
00355           break;
00356           /*
00357           { analyticd h = __rval * __data.coeffs[eval_data.n];
00358             if(eval_data.n == 0)
00359               eval_data.r = h;
00360             else
00361               eval_data.r = atan2(eval_data.r, h);
00362             ++eval_data.n;
00363           }
00364           break; */
00365         case EXPRINFO_GAUSS:
00366          std::cerr << "Polynomes NYI" << std::endl;
00367           throw "NYI";
00368           break;
00369           /*  { analyticd h = (__data.coeffs[0]*__rval-__data.params.d()[0])/
00370                                 __data.params.d()[1];
00371             eval_data.r = gauss(h);
00372           }
00373           break;*/
00374         case EXPRINFO_POLY:
00375           std::cerr << "Polynomials NYI" << std::endl;
00376           throw "NYI";
00377           break;
00378         case EXPRINFO_LIN:
00379         case EXPRINFO_QUAD:
00380           // we will never be here
00381           break;
00382         case EXPRINFO_IN:
00383          std::cerr << "Containment NYI" << std::endl;
00384           throw "NYI";
00385           break;
00386           /*           {
00387             __x = __data.coeffs[eval_data.n]*__rval;
00388             const analyticd& i(__data.params.i()[eval_data.n]);
00389             if(i.disjoint(__x))     // it is not in
00390             {
00391               eval_data.r = -1.;
00392               ret = -1;
00393             }
00394             else if(eval_data.r != analyticd(-1.))
00395             {
00396               if(!i.superset(__x))  // in and out are possible
00397               {
00398                 if(i.sup() == __x.inf() || i.inf() == __x.sup())
00399                 // intersection is only on the border
00400                   eval_data.r = analyticd(-1.,0.);
00401                 else if(eval_data.r.sup() > 0)
00402                   eval_data.r = analyticd(-1.,1.);
00403               }
00404               else if(i.inf() == __x.inf() || i.sup() == __x.sup())
00405               // they are not disjoint, and i is a superset of __x
00406               // but a border is possible
00407               {
00408                 if(eval_data.r.inf() == 1.)
00409                 {
00410                   if(__x.is_thin())       // only border
00411                     eval_data.r = 0.;
00412                   else                    // interior and border possible
00413                     eval_data.r = analyticd(0.,1.);
00414                 }
00415                 else if(__x.is_thin() && eval_data.r.inf() == 0.)
00416                   eval_data.r = 0.;
00417               }
00418               // if __x is in the interior of i eval_data.r does not change
00419             }
00420           }
00421           eval_data.n++;
00422           break; */
00423         case EXPRINFO_IF:
00424         std::cerr << "Cinterval-IF's NYI" << std::endl;
00425           throw "NYI";
00426           break;
00427           /*          __x = __rval * __data.coeffs[eval_data.n];
00428           if(eval_data.n == 0) // this is the condition
00429           {
00430             const analyticd& i(__data.params.ni());
00431             if(i.superset(__x))      // always true
00432               eval_data.info = 0;
00433             else if(i.disjoint(__x)) // never true
00434             {
00435               eval_data.info = 1;
00436               ret = 1;               // skip if part
00437             }
00438             else                     // both is possible
00439               eval_data.info = 2;
00440           }
00441           else if(eval_data.n == 1)  // this is the if part
00442           {
00443             eval_data.r = __x;
00444             if(eval_data.info == 0)  // it was always true
00445               ret = -1;              // don't continue walking
00446           }
00447           else // this is the else part
00448           {
00449             if(eval_data.info == 1) // only the else part
00450               eval_data.r = __x;
00451             else                      // both parts
00452               eval_data.r = eval_data.r.hull(__x);
00453           }
00454           eval_data.n += ret+1;
00455           break;
00456           */
00457          case EXPRINFO_AND:
00458          std::cerr << "Cinterval-AND's NYI" << std::endl;
00459           throw "NYI";
00460           break;
00461           /*           { __x = __data.coeffs[eval_data.n]*__rval;
00462             const analyticd& i(__data.params.i()[eval_data.n]);
00463             if(eval_data.r != 0.)
00464             {
00465               if(i.disjoint(__x))
00466               {
00467                 eval_data.r = 0;
00468                 ret = -1;         // result cannot become more false
00469               }
00470               else if(!i.superset(__x))
00471                 eval_data.r = analyticd(0.,1.);
00472               // else this does not change the value
00473             }
00474           }
00475           eval_data.n++;
00476           break; */
00477        case EXPRINFO_OR:
00478         std::cerr << "Cinterval-OR's NYI" << std::endl;
00479           throw "NYI";
00480           break;
00481           /*            { __x = __data.coeffs[eval_data.n]*__rval;
00482             const analyticd& i(__data.params.i()[eval_data.n]);
00483             if(eval_data.r != 1.)
00484             {
00485               if(i.superset(__x))
00486               {
00487                 eval_data.r = 1;
00488                 ret = -1;         // result cannot become more true
00489               }
00490               else if(!i.disjoint(__x))
00491                 eval_data.r = analyticd(0.,1.);
00492             }
00493           }
00494           eval_data.n++;
00495           break; */
00496         case EXPRINFO_NOT:
00497         std::cerr << "Cinterval-NOT's NYI" << std::endl;
00498           throw "NYI";
00499           break;
00500           /*             { __x = __data.coeffs[0]*__rval;
00501             const analyticd& i(__data.params.ni());
00502             if(i.superset(__x))
00503               eval_data.r = 0;
00504             else if(i.disjoint(__x))
00505               eval_data.r = 1;
00506             else
00507               eval_data.r = analyticd(0.,1.);
00508           }
00509           break; */
00510         case EXPRINFO_IMPLIES:
00511          std::cerr << "Cinterval-IMPLIES NYI" << std::endl;
00512           throw "NYI";
00513           break; /*
00514          { const analyticd& i(__data.params.i()[eval_data.n]);
00515             __x = __rval * __data.coeffs[eval_data.n];
00516             if(eval_data.n == 0)
00517             {
00518               if(i.disjoint(__x))
00519               {
00520                 eval_data.r = 1.;
00521                 ret = -1;        // ex falso quodlibet
00522               }
00523               else if(!i.superset(__x))
00524                 eval_data.r = analyticd(0.,1.);
00525               else
00526                 eval_data.r = analyticd(0.);
00527             }
00528             else // we only get here if first clause might be true
00529             {
00530               if(i.superset(__x))
00531                 eval_data.r = 1.;
00532               else if(!i.disjoint(__x))
00533                 eval_data.r = analyticd(0.,1.);
00534               // else the value does not change
00535             }
00536             ++eval_data.n;
00537           }
00538           break; */
00539         case EXPRINFO_COUNT:
00540          std::cerr << "Cinterval-COUNT NYI" << std::endl;
00541           throw "NYI";
00542           break; /*
00543           { __x = __data.coeffs[eval_data.n]*__rval;
00544             const analyticd& i(__data.params.i()[eval_data.n]);
00545             if(i.superset(__x))
00546               eval_data.r += 1;
00547             else if(!i.disjoint(__x))
00548               eval_data.r += analyticd(0.,1.);
00549               }
00550           eval_data.n++;
00551           break; */
00552         case EXPRINFO_ALLDIFF:
00553          std::cerr << "Cinterval-ALLDIFF NYI" << std::endl;
00554           throw "NYI";
00555           break; /*
00556           { __x = __data.coeffs[eval_data.n]*__rval;
00557             for(std::vector<analyticd>::const_iterator _b =
00558                         ((std::vector<analyticd>*)eval_data.p)->begin();
00559                 _b != ((std::vector<analyticd>*)eval_data.p)->end(); ++_b)
00560             {
00561               analyticd __h = abs(__x-*_b);
00562               if(__h.sup() <= __data.params.nd())  // they are always equal
00563               {
00564                 eval_data.r = 0;
00565                 ret = -1;               // don't continue
00566                 break;
00567               }
00568               else if(__h.inf() <= __data.params.nd()) // they are not always different
00569                 eval_data.r = analyticd(0.,1.);
00570             }
00571             if(ret != -1)
00572               ((std::vector<analyticd>*) eval_data.p)->push_back(__x);
00573           }
00574           eval_data.n++;
00575           if(eval_data.n == __data.n_children || ret == -1)
00576             delete (std::vector<analyticd>*) eval_data.p;
00577             break; */
00578         case EXPRINFO_HISTOGRAM:
00579           std::cerr << "int_evaluator: histogram NYI" << std::endl;
00580           throw "NYI";
00581           break;
00582         case EXPRINFO_LEVEL:
00583           std::cerr << "Cinterval-LEVEL NYI" << std::endl;
00584           throw "NYI";
00585           break; /*
00586          { int lo = (int)eval_data.r.inf();
00587             int hi = (int)eval_data.r.sup();
00588             __x = __data.coeffs[eval_data.n]*__rval;
00589             analyticd _h;
00590 
00591             // first adjust upper bound
00592             if(hi != INT_MAX)
00593             {
00594               while(hi < __data.params.im().nrows())
00595               { 
00596                 _h = __data.params.im()[hi][eval_data.n];
00597                 if(_h.superset(__x))
00598                   break;
00599                 hi++;
00600               }
00601               if(hi == __data.params.im().nrows())
00602                 hi = INT_MAX;
00603             }
00604             // then adjust lower bound
00605             if(lo != INT_MAX)
00606             {
00607               while(lo < __data.params.im().nrows())
00608               { 
00609                 _h = __data.params.im()[lo][eval_data.n];
00610                 if(!_h.disjoint(__x))
00611                   break;
00612                 lo++;
00613               }
00614               if(lo == __data.params.im().nrows())
00615                 lo = INT_MAX;
00616             }
00617             if(hi == INT_MAX && lo == INT_MAX)
00618             {
00619               eval_data.r = INT_MAX;
00620               ret = -1;
00621             }
00622             else
00623               eval_data.r = analyticd(lo+0.,hi+0.);
00624           }
00625           eval_data.n++;
00626           break; */
00627         case EXPRINFO_NEIGHBOR:
00628           std::cerr << "Cinterval-Neighbor NYI" << std::endl;
00629           throw "NYI";
00630           break; /*
00631           // this is suboptimal. It does not take into account
00632           // all the possibilities to proove that the result actually
00633           // EQUALS 1
00634           if(eval_data.n == 0)
00635             eval_data.r = __data.coeffs[0]*__rval;
00636           else
00637           {
00638             analyticd h = eval_data.r;
00639             eval_data.r = 0;
00640             __x = __data.coeffs[1]*__rval;
00641             for(unsigned int i = 0; i < __data.params.n().size(); i+=2)
00642             {
00643               if(h == __data.params.n()[i]+0. &&
00644                  __x == __data.params.n()[i+1]+0.)
00645               {
00646                 eval_data.r = 1;
00647                 break;
00648               }
00649               else if(h.contains(__data.params.n()[i]+0.) &&
00650                       __x.contains(__data.params.n()[i+1]+0.))
00651               {
00652                 eval_data.r = analyticd(0.,1.);
00653                 break;
00654               }
00655             }
00656           }
00657           eval_data.n++;
00658           break; */
00659         case EXPRINFO_NOGOOD:
00660           std::cerr << "Cinterval-nogood NYI" << std::endl;
00661           throw "NYI";
00662           break; /*
00663           __x = __data.coeffs[eval_data.n]*__rval;
00664           if(eval_data.r != 0.)
00665           { 
00666             if(!__x.contains(__data.params.n()[eval_data.n]+0.))
00667             {
00668               eval_data.r = 0.;
00669               ret = -1;
00670             }
00671             else if(__x != __data.params.n()[eval_data.n]+0.)
00672               eval_data.r = analyticd(0.,1.);
00673           }
00674           eval_data.n++;
00675           break;*/
00676         case EXPRINFO_EXPECTATION:
00677           std::cerr << "int_evaluator: E NYI" << std::endl;
00678           throw "NYI";
00679           break;
00680         case EXPRINFO_INTEGRAL:
00681           std::cerr << "int_evaluator: INT NYI" << std::endl;
00682           throw "NYI";
00683           break;
00684         case EXPRINFO_LOOKUP:
00685         case EXPRINFO_PWLIN:
00686         case EXPRINFO_SPLINE:
00687         case EXPRINFO_PWCONSTLC:
00688         case EXPRINFO_PWCONSTRC:
00689           std::cerr << "int_evaluator: Table Operations NYI" << std::endl;
00690           throw "NYI";
00691           break;
00692         case EXPRINFO_DET:
00693         case EXPRINFO_COND:
00694         case EXPRINFO_PSD:
00695         case EXPRINFO_MPROD:
00696         case EXPRINFO_FEM:
00697           std::cerr << "int_evaluator: Matrix Operations NYI" << std::endl;
00698           throw "NYI";
00699           break;
00700         case EXPRINFO_RE:
00701         case EXPRINFO_IM:
00702         case EXPRINFO_ARG:
00703         case EXPRINFO_CPLXCONJ:
00704           std::cerr << "int_evaluator: Complex Numbers NYI" << std::endl;
00705           throw "NYI";
00706           break;
00707         case EXPRINFO_CMPROD:
00708         case EXPRINFO_CGFEM:
00709           std::cerr << "int_evaluator: Const Matrix Operations NYI" << std::endl;
00710           throw "NYI";
00711           break;
00712         default:
00713           std::cerr << "int_evaluator: unknown function type " <<
00714                    __data.operator_type << std::endl;
00715           throw "Programming error";
00716           break;
00717       }
00718     }
00719 #if 0
00720     else if(__data.operator_type > 0)
00721       // update the function arguments
00722       // eval_data.r = __data.i_evaluate(eval_data.n++, __data.params.nn(),
00723       //                 *eval_data.x, *v_ind, eval_data.r, __rval, NULL);
00724     // use the cache only if it is worthwhile
00725     //    if(eval_data.cache && __data.n_parents > 1 && __data.n_children > 0)
00726 #endif
00727     if(eval_data.cache)
00728       (*eval_data.cache)[__data.node_num] = eval_data.r;
00729     return ret;
00730   }
00731 
00732   analyticd calculate_value(bool eval_all)
00733   {
00734     return eval_data.r;
00735   }
00736 };
00737 
00738 #endif /* _ADE_EVALUATOR_H_ */

Generated on Tue Nov 4 01:57:56 2003 for COCONUT API by doxygen1.2.18