VariableContainer.cpp
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 // this indexing function has to called after "sealAndPopulate"
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; // carry in
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 // this indexing function has to corresponds to "sealAndPopulate"
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; // carry in
00117                 int subIndex2 = valueIndex[i - 1];
00118                 subIndex2 ++;
00119                 valueIndex[i - 1] = subIndex2;
00120             }
00121         }
00122     }
00123         
00124 
00125 }


appl
Author(s): petercai
autogenerated on Tue Jan 7 2014 11:02:29