00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _plCndKernel_h
00019 #define _plCndKernel_h
00020
00021
00022 #include <plMath.h>
00023 #include <plValues.h>
00024 #include <plVariablesConjunction.h>
00025 #include <plKernel.h>
00026 #include <plJointDistribution.h>
00027 #include <plDataValues.h>
00028
00029
00030
00031
00032 class kplVariable;
00033 class kplComputableObject;
00034
00035
00036
00037
00038
00039
00040
00041
00044 class plCndKernel : public plComputableObject
00045 {
00046
00047 protected:
00048
00051 virtual plProbValue kernel_compute(const plDataValues ¶ms) const;
00052
00054 virtual void kernel_rename(const map
00055 <kplVariable*, kplVariable *> &rename_map);
00056
00057
00058 kplComputableObject* root_kernel;
00059 bool isConditional;
00060
00061 public:
00062
00064 plCndKernel();
00065
00067 plCndKernel(const plCndKernel &cnd_kernel);
00068
00070 plCndKernel(const class plProduct &);
00071
00073 plCndKernel(const plComputableObjectList &fun_list);
00074
00076 virtual ~plCndKernel();
00077
00081 virtual kplComputableObject* get_root_kernel() const;
00082
00083
00084 void set_root_kernel(kplComputableObject* new_kernel);
00085
00088 void instantiate(plKernel& kernel_to_instantiate,
00089 const plValues& values)const;
00090
00093 void partial_instantiate(plCndKernel& kernel_to_instantiate,
00094 const plVariablesConjunction& variables_to_instantiate,
00095 const plValues& values)const;
00096
00097
00105 plCndKernel partial_instantiate(const plVariablesConjunction& variables_to_instantiate,
00106 const plValues& values)const;
00107
00108
00115 plKernel instantiate(const plValues& values)const;
00116
00119 void instantiate(plKernel& kernel_to_instantiate,
00120 int *parameter)const;
00121
00133 template<typename T> plKernel instantiate( T parameter )const
00134 {
00135 plKernel res;
00136 this->instantiate( res, parameter );
00137 return res;
00138 }
00139
00151 template<typename T> plKernel instantiate( const vector<T>& parameter )const
00152 {
00153 plKernel res;
00154 this->instantiate( res, parameter );
00155 return res;
00156 }
00157
00160 void instantiate(plKernel& kernel_to_instantiate,
00161 unsigned int *parameter)const;
00162
00165 void instantiate(plKernel& kernel_to_instantiate,
00166 long int *parameter)const;
00167
00170 void instantiate(plKernel& kernel_to_instantiate,
00171 float *parameter)const;
00172
00175 void instantiate(plKernel& kernel_to_instantiate,
00176 double *parameter)const;
00177
00180 void instantiate(plKernel& kernel_to_instantiate,
00181 long double *parameter)const;
00182
00185 void instantiate(plKernel& kernel_to_instantiate,
00186 int parameter)const;
00187
00190 void instantiate(plKernel& kernel_to_instantiate,
00191 unsigned int parameter)const;
00192
00195 void instantiate(plKernel& kernel_to_instantiate,
00196 long int parameter)const;
00197
00200 void instantiate(plKernel& kernel_to_instantiate,
00201 float parameter)const;
00202
00205 void instantiate(plKernel& kernel_to_instantiate,
00206 double parameter)const;
00210 #ifndef RAVI_INTERFACE
00211 void instantiate(plKernel& kernel_to_instantiate,
00212 long double parameter)const;
00213 #endif
00214
00217 void instantiate(plKernel& kernel_to_instantiate,
00218 const vector <int> ¶meter)const;
00219
00222 void instantiate(plKernel& kernel_to_instantiate,
00223 const vector <unsigned int> ¶meter)const;
00224
00227 void instantiate(plKernel& kernel_to_instantiate,
00228 const vector <long int> ¶meter)const;
00229
00232 void instantiate(plKernel& kernel_to_instantiate,
00233 const vector <float> ¶meter)const;
00234
00237 void instantiate(plKernel& kernel_to_instantiate,
00238 const vector <double> ¶meter)const;
00239
00242 void instantiate(plKernel& kernel_to_instantiate,
00243 const vector <long double> ¶meter)const;
00244
00245
00247 ostream& write_head(ostream &out) const;
00248
00250 ostream& write_body(ostream &out) const;
00251
00253 plCndKernel& operator=(const plCndKernel& assigned_Cnd_kernel);
00254
00255
00259 void replace(const plVariablesConjunction &left_vars, const plVariablesConjunction &right_vars,
00260 plCndKernel &new_cnd_kernel);
00261
00265 void replace(const plVariablesConjunction &left_vars, plKernel &new_kernel);
00266
00275 void compile(plCndKernel& result) const;
00276
00285 void lowMemoryUse_compile(plCndKernel& result)const;
00286
00298 plCndKernel compile() const;
00299
00306 void compile(plCndKernel& result,
00307 plCompiledDistributionType compiled_distrib_type)const;
00308
00318 plCndKernel compile(plCompiledDistributionType compiled_distrib_type)const;
00319
00320
00342 void n_compile(plCndKernel& result,
00343 unsigned long n_iterations,
00344 plGeneratorType generator_type = PL_MC_GENERATOR,
00345 plCompiledDistributionType compiled_distrib_type = PL_MAP) const;
00346
00347
00369 void time_compile(plCndKernel& result,
00370 double time_in_seconds,
00371 plGeneratorType generator_type = PL_MC_GENERATOR,
00372 plCompiledDistributionType compiled_distrib_type = PL_MAP) const;
00373
00374
00383 plCndKernel time_compile(double time_in_seconds,
00384 plGeneratorType generator_type = PL_MC_GENERATOR,
00385 plCompiledDistributionType distrib_type = PL_MAP) const;
00386
00387 double get_exhaustive_compilation_complexity() const;
00388
00389 double get_exhaustive_update_complexity() const;
00390
00391 ostream &outputTree(ostream &out)const;
00392
00393 };
00394
00395 #endif