MultiAgentDecisionProcess  Release 0.2.1
MADPComponentDiscreteStates.cpp
Go to the documentation of this file.
1 
29 #include <stdlib.h>
30 
31 using namespace std;
32 
33 #define DEBUG_MADP_DSTATES 0
34 
35 //Default constructor
37  :
38  _m_initialized(false)
39  ,_m_nrStates(0)
40  ,_m_initialStateDistribution(0)
41 {
42 }
43 
45  :
46  _m_initialized(false)
47  ,_m_nrStates(nrS)
48  ,_m_initialStateDistribution(0)
49 {
50  SetNrStates(nrS);
51  _m_initialized = true;
52 }
53 
54 //Destructor
56 {
58 }
59 
61 {
62  if(b)
63  {
64  if(_m_nrStates==0)
65  throw(E("MADPComponentDiscreteStates::SetInitialized problem has 0 states"));
66 
67  // alike to Belief::SanityCheck()
68 
69  bool validISD=true;
70 
71  // check for negative and entries>1
72  double sum=0;
73  for(vector<double>::const_iterator it=
75  it!=_m_initialStateDistribution->end(); ++it)
76  {
77  if(*it<0)
78  validISD=false;
79  if(*it>1)
80  validISD=false;
81  if(isnan(*it))
82  validISD=false;
83  sum+=*it;
84  }
85 
86  // check if sums to 1
87  if(abs(sum-1)>PROB_PRECISION)
88  validISD=false;
89 
90  // check whether the size is correct
92  validISD=false;
93 
94  if(!validISD)
95  throw(E("MADPComponentDiscreteStates::SetInitialized initial state distribution is not a valid probability distribution"));
96  }
97 
98  _m_initialized = b;
99  return(b);
100 }
101 
103 {
106 
107  if(!_m_initialized)
108  {
109  _m_nrStates=0;
111  _m_stateVec.clear();
112 
113  _m_initialized = true;
114  }
115  _m_stateVec.push_back(StateDiscrete( _m_nrStates++, StateName));
116  _m_initialStateDistribution->push_back(0.0);
117 // _m_nrStates++; - already done...
118 }
120 {
121  _m_nrStates = nrS;
122  _m_stateVec.clear();
125 
127  for(Index i=0; i < nrS; i++)
128  {
129  _m_stateVec.push_back(StateDiscrete(i));
130  _m_initialStateDistribution->push_back(0.0);
131  }
132  _m_initialized = true;
133 }
134 
136 {
137  //cout << " MADPComponentDiscreteStates::SetUniformISD called"<<endl;
138  if(!_m_initialized)
139  {
140  cout << " MADPComponentDiscreteStates::SetUniformISD - ERROR can't"<<
141  "set uniform init. state distr., when not initialized! (don't know how many state yet...)";
142  return;
143  }
144  double uprob = 1.0 / GetNrStates();
145  vector<double>::iterator it = _m_initialStateDistribution->begin();
146  vector<double>::iterator last = _m_initialStateDistribution->end();
147  while(it!=last)
148  {
149  *it = uprob;
150  it++;
151  }
152 }
153 
155 {
156  StateDistributionVector* p2 = dynamic_cast<StateDistributionVector*>(p);
157  if (p2 == 0)
158  throw E("MADPComponentDiscreteStates::SetISD(StateDistribution* p) dynamic cast failed");
159  SetISD(p2);
160 }
161 
163 {
164  if(v.size() != _m_nrStates)
165  throw E("MADPComponentDiscreteStates::SetISD - ERROR: nrStates don't match!");
166 
169 }
170 
172 {
173  return(s.GetIndex());
174 }
175 
178 {
179  if(!_m_initialized)
180  throw E("MADPComponentDiscreteStates::GetStateIndexByName - not initialized!");
181 
182  vector<StateDiscrete>::const_iterator it = _m_stateVec.begin();
183  vector<StateDiscrete>::const_iterator last = _m_stateVec.end();
184  while(it != last)
185  {
186  string s2 = (*it).GetName();
187  if(s == s2)
188  //if(strcmp(s,s2) == 0)//match
189  return( (*it).GetIndex() );
190  it++;
191  }
192  //not found
193  //return(-1);
194  stringstream ss;
195  ss << "GetStateIndexByName - state \"" << s << "\" not found." << endl;
196  throw E(ss);
197 
198 }
199 
200 
201 
203 {
204  if(!_m_initialized)
205  {
206  stringstream ss;
207  ss << "MADPComponentDiscreteStates::GetInitialStateProbability("<<
208  sI<<") - Error: not initialized. " <<endl;
209  throw E(ss);
210  }
211 
212  if(sI < _m_initialStateDistribution->size() )
213  {
214  if(DEBUG_MADP_DSTATES) cout << "MultiAgentDecisionProcess::GetInitialStateProbability - index "<<sI<<" is okay, size is "<<_m_initialStateDistribution->size() <<endl;
215  return(_m_initialStateDistribution->at(sI));
216  }
217  //else
218  stringstream ss;
219  ss << "MultiAgentDecisionProcess::GetInitialStateProbability - ERROR GetInitialStateProbability: index out of bounds";
220  throw E(ss);
221 }
222 
223 
225 {
226  if(!_m_initialized)
227  {
228  stringstream ss;
229  ss << "MADPComponentDiscreteStates::PrintInitialStateDistribution("<<
230  ") - Error: not initialized. " <<endl;
231  throw E(ss);
232  }
234 }
235 
237 {
238  stringstream ss;
239  vector<StateDiscrete>::const_iterator it = _m_stateVec.begin();
240  vector<StateDiscrete>::const_iterator last = _m_stateVec.end();
241  while(it!=last)
242  {
243  ss << (*it).SoftPrint();
244  ss << endl;
245  it++;
246  }
247  return(ss.str());
248 }
250 {
251  stringstream ss;
252  if(!_m_initialized)
253  {
254  stringstream ss2;
255  ss2 << "MADPComponentDiscreteStates::SoftPrint("<<
256  ") - Error: not initialized. " <<endl;
257  throw E(ss2);
258  }
259  ss << "- nr. states="<< GetNrStates()<<endl;
260  ss << SoftPrintStates();
261  ss << "Initial state distr.: ";
263  ss << endl;
264  return(ss.str());
265 }
266 
268 {
269  if(!_m_initialized)
270  {
271  stringstream ss;
272  ss << "MADPComponentDiscreteStates::SampleInitialState()" <<
273  " - Error: not initialized. " << endl;
274  throw E(ss);
275  }
276 
277  double randNr=rand() / (RAND_MAX + 1.0);
278 
279  double sum=0;
280  Index state=0,i;
281  for(i=0;i<_m_initialStateDistribution->size();i++)
282  {
283  sum+= _m_initialStateDistribution->at(i);
284  if(randNr<=sum)
285  {
286  state=i;
287  break;
288  }
289  }
290 
291  return(state);
292 }