void DynProgProb::update () // updates dynamic prog probs { assert (getValueFct ()); assert (getDimInputProb ()); assert (getInputProb ()); const size_t ARRAY_FAC = 2; assert (1 < ARRAY_FAC); Int4 i = 0; size_t j = 0; const double *oldArray = 0; double *array = 0; Int4 value = 0; Int4 valueBegin = 0; Int4 valueLower = 0; Int4 valueUpper = 0; size_t arrayPos = 0; oldArray = d_array_p [d_step % 2]; array = d_array_p [(d_step + 1) % 2]; valueLower = kMax_I4; valueUpper = kMin_I4; MemUtil::memZero (array, sizeof (double) * getArrayCapacity ()); for (i = getValueLower (); i < getValueUpper (); i++) { if (oldArray [getArrayPos (i)] == 0.0) continue; for (j = 0; j < getDimInputProb (); j++) { if (getInputProb () [j] == 0.0) continue; // adjust the reserve, if necessary value = getValueFct () (i, j); while (value < getValueBegin () || getValueEnd () <= value) { valueBegin = getValueBegin (); if (value < getValueBegin ()) valueBegin -= (ARRAY_FAC - 1) * getArrayCapacity (); reserve (ARRAY_FAC * getArrayCapacity ()); setValueBegin (valueBegin); oldArray = d_array_p [d_step % 2]; array = d_array_p [(d_step + 1) % 2]; } if (value < valueLower) valueLower = value; if (valueUpper < value) valueUpper = value; // add the probability assert (getValueBegin () <= i); assert (i < getValueEnd ()); array [getArrayPos (value)] += oldArray [getArrayPos (i)] * getInputProb () [j]; } } d_valueLower = valueLower; d_valueUpper = valueUpper + 1; d_step++; }
void DynProgProbLim::update () // updates dynamic prog probs { assert (getValueFct ()); assert (getDimInputProb ()); assert (getInputProb ()); assert (0 < getArrayCapacity ()); Int4 i = 0; size_t j = 0; const double *oldArray = 0; double *array = 0; Int4 value = 0; Int4 valueLower = 0; Int4 valueUpper = 0; size_t arrayPos = 0; double prob = 0.0; oldArray = getArray () [getStep () % 2]; array = lgetArray () [(getStep () + 1) % 2]; valueLower = kMax_I4; valueUpper = kMin_I4; MemUtil::memZero (array, sizeof (double) * getArrayCapacity ()); for (i = getValueLower (); i < getValueUpper (); i++) { if (oldArray [getArrayPos (i)] == 0.0) continue; for (j = 0; j < getDimInputProb (); j++) { if (getInputProb () [j] == 0.0) continue; value = getValueFct () (i, j); prob = oldArray [getArrayPos (i)] * getInputProb () [j]; if (value < getValueBegin () || getValueEnd () <= value) { d_probLost += prob; } else { if (value < valueLower) valueLower = value; if (valueUpper < value) valueUpper = value; // add the probability assert (getValueBegin () <= i); assert (i < getValueEnd ()); array [getArrayPos (value)] += prob; } } } lgetValueLower () = valueLower; lgetValueUpper () = valueUpper + 1; lgetStep ()++; }
void DynProgProb::setInput ( size_t dimInputProb_, const double *inputProb_) // array of input states : d_inputProb_p [0...dimStateProb - 1] { if (dimInputProb_ != getDimInputProb ()) { freeInput (); initInput (dimInputProb_); } if (getDimInputProb () > 0) MemUtil::memCpy (d_inputProb_p, inputProb_, sizeof (double) * getDimInputProb ()); }
void DynProgProb::freeInput () { if (getDimInputProb () > 0) { delete [] d_inputProb_p; d_inputProb_p = 0; } d_dimInputProb = 0; }