Go to the documentation of this file.00001 #include "VariableContainer.h"
00002
00003 VariableContainer::VariableContainer(void)
00004 {
00005 }
00006
00007 VariableContainer::~VariableContainer(void)
00008 {
00009 }
00010
00011
00012
00013 SharedPointer<SparseVector> VariableContainer::getInitialProb()
00014 {
00015 DenseVector initialProb;
00016 initialProb.resize(this->size());
00017
00018 SharedPointer<SparseVector> result (new SparseVector());
00019
00020 vector<vector<SharedPointer<IVariableValue> > > valueListArray;
00021 vector<int> valueIndex;
00022 for(int i = 0 ; i < vars.size() ; i ++)
00023 {
00024 valueListArray.push_back(vars[i]->getInitialValues());
00025 valueIndex.push_back(0);
00026 }
00027
00028
00029 while(valueIndex[0] < valueListArray[0].size())
00030 {
00031 map<string, SharedPointer<IVariableValue> > values;
00032 double prob = 1.0;
00033 for(int i = 0 ; i < valueIndex.size() ; i ++)
00034 {
00035 int subIndex = valueIndex[i];
00036 SharedPointer<IVariableValue> curPart = valueListArray[i][subIndex];
00037 values[curPart->getVariableName()] = curPart;
00038 prob *= curPart->getProb();
00039 }
00040 int curindex = this->indexOf(values);
00041 initialProb.data[curindex] = prob;
00042
00043 int lastIndex = valueIndex[valueIndex.size() - 1];
00044 lastIndex ++;
00045 valueIndex[valueIndex.size() - 1] = lastIndex;
00046
00047 for(int i = valueIndex.size() -1 ; i > 0 ; i --)
00048 {
00049 int subIndex = valueIndex[i];
00050 if(subIndex >= valueListArray[i].size())
00051 {
00052 valueIndex[i] = 0;
00053 int subIndex2 = valueIndex[i - 1];
00054 subIndex2 ++;
00055 valueIndex[i - 1] = subIndex2;
00056 }
00057 }
00058 }
00059
00060
00061 copy(*result, initialProb);
00062 return result;
00063 }
00064
00065
00066
00067
00068 int VariableContainer::indexOf(map<string, SharedPointer<IVariableValue> >& input)
00069 {
00070 int numVar = vars.size();
00071 int index = 0;
00072 for(int i = 0 ; i < vars.size() ; i ++)
00073 {
00074 int curIndex = input[ vars[i]->getVariableName() ] ->getIndex();
00075 index *= vars[i]->getNumValues();
00076 index += curIndex;
00077 }
00078
00079 return index;
00080 }
00081
00082 void VariableContainer::sealAndPopulate()
00083 {
00084 int numVar = vars.size();
00085
00086 vector<vector<SharedPointer<IVariableValue> > > valueListArray;
00087 vector<int> valueIndex;
00088 for(int i = 0 ; i < vars.size() ; i ++)
00089 {
00090 valueListArray.push_back(vars[i]->getValues());
00091 valueIndex.push_back(0);
00092 }
00093
00094 int overalIndex = 0;
00095
00096 while(valueIndex[0] < valueListArray[0].size())
00097 {
00098 ValueSet temp;
00099 for(int i = 0 ; i < valueIndex.size() ; i ++)
00100 {
00101 int subIndex = valueIndex[i];
00102 SharedPointer<IVariableValue> curPart = valueListArray[i][subIndex];
00103 temp.vals[vars[i]->getVariableName()] = curPart;
00104 }
00105 this->add(temp);
00106
00107 int lastIndex = valueIndex[valueIndex.size() - 1];
00108 lastIndex ++;
00109 valueIndex[valueIndex.size() - 1] = lastIndex;
00110
00111 for(int i = valueIndex.size() -1 ; i > 0 ; i --)
00112 {
00113 int subIndex = valueIndex[i];
00114 if(subIndex >= valueListArray[i].size())
00115 {
00116 valueIndex[i] = 0;
00117 int subIndex2 = valueIndex[i - 1];
00118 subIndex2 ++;
00119 valueIndex[i - 1] = subIndex2;
00120 }
00121 }
00122 }
00123
00124
00125 }