00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013
00014 #include "BSUObjectiveFunction.h"
00015
00016 #ifdef _MSC_VER
00017 #pragma warning( disable : 4786 )
00018 #endif
00019
00020 #include <Mers/Estimation/Discrete/ProbabilityRules/RuleTriggering/RuleTrigger.h>
00021 #include <Mers/Estimation/Discrete/ProbabilityRules/ObsProbRule.h>
00022 #include <Mers/Estimation/Discrete/ProbabilityRules/Rule.h>
00023
00024 #include <Mers/Models/Base/BaseModelVariableArray.h>
00025 #include <Mers/Models/Base/BaseModelAssignment.h>
00026
00027
00028 using Mers::Estimation::Discrete::ApproximateBeliefState::BSUObjectiveFunction;
00029 using Mers::Estimation::Discrete::ProbabilityRules::RuleTriggering::RuleTrigger;
00030 using Mers::Estimation::Discrete::ProbabilityRules::ObsProbRule;
00031 using Mers::Estimation::Discrete::ProbabilityRules::Rule;
00032 using Mers::Models::Base::BaseModelVariableArray;
00033 using Mers::Models::Base::BaseModelAssignment;
00034 using std::vector;
00035 using std::cout;
00036 using std::endl;
00037 using std::map;
00038
00040
00042
00043 BSUObjectiveFunction::BSUObjectiveFunction(BaseModelVariableArray const * dVs,
00044 const map<unsigned int,unsigned int> pMap, vector<double> allTransProbs,
00045 map<unsigned int,double> sProbs, vector<const ObsProbRule *> & theObsProbabilityRules)
00046 : BSEObjectiveFunction(dVs, pMap, allTransProbs, sProbs)
00047 {
00048 while(theObsProbabilityRules.size() > 0)
00049 {
00050 triggerRules.push_back((ObsProbRule *)theObsProbabilityRules.back());
00051 theObsProbabilityRules.pop_back();
00052 }
00053 obsProbabilityRuleTrigger = new RuleTrigger(triggerRules);
00054 }
00055
00057
00058 BSUObjectiveFunction::~BSUObjectiveFunction()
00059 {
00060 delete obsProbabilityRuleTrigger;
00061 }
00062
00063
00065
00067
00068
00070
00072
00073 double
00074 BSUObjectiveFunction::calculateUtility(vector<BaseModelAssignment const *> & bmAssignments,
00075 int sourceStateIndex) const
00076 {
00077 (void)sourceStateIndex;
00078
00079
00080
00081 double fX = BSEObjectiveFunction::calculateUtility(bmAssignments);
00082
00083
00084 obsProbabilityRuleTrigger->reset();
00085
00086
00087 for(size_t i=0; i<bmAssignments.size(); i++)
00088 obsProbabilityRuleTrigger->loadAssignment(bmAssignments[i]->getVariable()->getUID(),
00089 bmAssignments[i]->getValue()->getUID());
00090
00091
00092 vector<Rule *> enabledProbabilityRules = obsProbabilityRuleTrigger->getTriggeredRules();
00093 while(enabledProbabilityRules.size() > 0)
00094 {
00095 fX *= ((ObsProbRule *) enabledProbabilityRules.back() )->getProbability();
00096 enabledProbabilityRules.pop_back();
00097 }
00098
00099 return fX;
00100 }
00101
00103
00105