00001 /*============================================================================= 00002 * Product : OpenPL 00003 * File : plComputableObject.h 00004 * Author : Juan-Manuel Ahuactzin 00005 * Creation : Wed Jun 6 12:01:46 2001 00006 * 00007 *============================================================================= 00008 * (c) Copyright 2000, Centre National de la Recherche Scientifique, 00009 * all rights reserved 00010 *============================================================================= 00011 * 00012 *------------------------- Description --------------------------------------- 00013 * 00014 * 00015 *----------------------------------------------------------------------------- 00016 */ 00017 00018 00019 #ifndef _plComputableObject_h_ 00020 #define _plComputableObject_h_ 00021 00022 #include <plObject.h> 00023 #include <plMath.h> 00024 #include <plSignature.h> 00025 #include <plVariablesConjunction.h> 00026 #include <plValues.h> 00027 #include <plDataValues.h> 00028 00029 /***************************************************************************** 00030 * External Classes 00031 *****************************************************************************/ 00032 class kplComputableObject; 00033 class kplVariable; 00034 00035 00036 /***************************************************************************** 00037 * Classes Definitions 00038 *****************************************************************************/ 00039 00045 class plComputableObjectList : public plObject 00046 { 00047 //friend class plComputableObject; 00048 public: 00049 typedef list <kplComputableObject *> kplCOL; 00050 typedef kplCOL::iterator iterator; 00051 typedef kplCOL::const_iterator const_iterator; 00052 00053 protected : 00054 kplCOL internList; 00055 public : 00056 plComputableObjectList() {} 00057 00058 plComputableObjectList(const plComputableObject & obj); 00059 00060 plComputableObjectList(const plComputableObjectList & l); 00061 00062 ~plComputableObjectList(); 00063 00064 plComputableObjectList &operator=(const plComputableObjectList & l); 00065 00066 plComputableObjectList operator^(const plComputableObject &f1) const; 00067 00068 plComputableObjectList operator*(const plComputableObject &f1) const; 00069 00070 plComputableObjectList operator*(const plComputableObjectList &r_list) const; 00071 00072 const plComputableObjectList& operator*=(const plComputableObject &f1); 00073 00074 const plComputableObjectList& operator*=(const plComputableObjectList &r_list); 00075 00076 void push_back(kplComputableObject * o); 00077 void push_back(const plComputableObject & o); 00078 00079 iterator begin() {return internList.begin();} 00080 const_iterator begin() const {return internList.begin();} 00081 00082 iterator end() {return internList.end();} 00083 const_iterator end() const {return internList.end();} 00084 00085 unsigned int size() const {return internList.size();} 00086 00087 void clear(); 00088 }; 00089 00090 00091 00094 class plComputableObject : public plObject 00095 { 00096 00097 protected: 00098 00099 plSignature signature; 00100 00102 list <kplVariable *> head_variables; 00103 00107 unsigned int variables_size; 00108 00110 list <kplVariable*> search_variables; 00111 00113 list <kplVariable*> known_variables; 00114 00118 mutable plDataValues head_variables_data_values; 00119 00123 mutable plDataValues known_variables_data_values; 00124 00127 virtual plProbValue kernel_compute(const plDataValues ¶ms) const=0; 00128 00130 virtual void kernel_rename(const map 00131 <kplVariable*, kplVariable *> &rename_map)=0; 00132 00134 virtual void Output(ostream &out) const; 00135 00136 public: 00138 void set_variables(const list <kplVariable*> search_vars, 00139 const list <kplVariable*> known_vars); 00140 00143 void set_variables(const list <kplVariable*> search_vars); 00144 00145 00146 00148 bool is(const plComputableObjectType& type) const; 00149 00150 00153 bool is_some_on_signature(const plSignature& prototype_signature) const; 00154 00156 plVariablesConjunction get_head_plvariables() const; 00157 00159 plVariablesConjunction get_search_plvariables() const; 00160 00163 plVariablesConjunction get_known_plvariables() const; 00164 00166 plComputableObject(); 00167 00169 virtual ~plComputableObject(); 00170 00173 virtual plProbValue compute(const plValues ¶meter)const; 00174 00177 virtual plProbValue compute(int *parameter)const; 00178 00181 virtual plProbValue compute(unsigned int *parameter)const; 00182 00185 virtual plProbValue compute(long int *parameter)const; 00186 00189 virtual plProbValue compute(float *parameter)const; 00190 00193 virtual plProbValue compute(double *parameter)const; 00194 00197 virtual plProbValue compute(long double *parameter)const; 00198 00201 virtual plProbValue compute(int parameter)const; 00202 00203 /* *Computes the value of the function, by using a single unsigned 00204 integer parameter. */ 00205 virtual plProbValue compute(unsigned int parameter)const; 00206 00209 virtual plProbValue compute(long int parameter)const; 00210 00213 virtual plProbValue compute(float parameter)const; 00214 00217 virtual plProbValue compute(double parameter)const; 00218 00221 #ifndef RAVI_INTERFACE 00222 virtual plProbValue compute(long double parameter)const; 00223 #endif 00224 00227 virtual plProbValue compute(const vector <int> ¶meter)const; 00228 00231 virtual plProbValue compute(const vector <unsigned int> ¶meter)const; 00232 00235 virtual plProbValue compute(const vector <long int> ¶meter)const; 00236 00239 virtual plProbValue compute(const vector <float> ¶meter)const; 00240 00243 virtual plProbValue compute(const vector <double> ¶meter)const; 00244 00247 virtual plProbValue compute(const vector <long double> ¶meter)const; 00248 00252 virtual kplComputableObject* get_root_kernel()const =0 ; 00253 00257 #ifndef RAVI_INTERFACE 00258 const list <kplVariable*> get_head_variables() const; 00259 #endif 00260 00262 bool rename(const plVariablesConjunction &new_variables); 00263 00265 virtual ostream& write_head(ostream &out) const=0; 00266 00268 virtual ostream& write_body(ostream &out) const = 0; 00269 00270 00271 plComputableObjectList operator^(const plComputableObject &f2)const; 00272 00273 plComputableObjectList operator^(const plComputableObjectList &v_list)const ; 00274 00275 plComputableObjectList operator*(const plComputableObject &f2)const ; 00276 00277 plComputableObjectList operator*(const plComputableObjectList &v_list)const; 00278 00282 virtual void replace(const plVariablesConjunction &left_vars, const plVariablesConjunction &right_vars, 00283 plCndKernel &new_cnd_kernel) = 0; 00284 00288 virtual void replace(const plVariablesConjunction &left_vars, plKernel &new_kernel) = 0; 00289 00290 }; 00291 00292 00293 00294 00295 ostream & operator<<(ostream & out, const plComputableObjectList & klist); 00296 00297 00298 00299 #endif 00300