void DynProgProbLim::setValueBegin (Int4 valueBegin_) // resets the offset d_valueBegin // assert (offSet < getArrayCapacity ()); // if (getValueBegin () < valueBegin_) the caller must ensure consistency { if (valueBegin_ <= getValueBegin ()) { DynProgProb::setValueBegin (valueBegin_); return; } assert (getValueBegin () < valueBegin_); size_t offSet = static_cast <size_t> (valueBegin_ - getValueBegin ()); double *array = new double [getArrayCapacity ()]; for (size_t i = 0; i < 2; i++) { MemUtil::memCpy (array, getArray () [i], sizeof (double) * getArrayCapacity ()); MemUtil::memZero (lgetArray () [i], sizeof (double) * getArrayCapacity ()); if (offSet < getArrayCapacity ()) { MemUtil::memCpy (lgetArray () [i], array + offSet, sizeof (double) * (getArrayCapacity () - offSet)); } } delete [] array; array = 0; lgetValueBegin () = valueBegin_; }
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::setValueBegin (Int4 valueBegin_) // resets the offset d_valueBegin // assert (valueBegin_ <= getValueBegin ()) : enlarge the array only // assert (offSet < getArrayCapacity ()); { assert (valueBegin_ <= getValueBegin ()); size_t offSet = static_cast <size_t> (getValueBegin () - valueBegin_); if (offSet == 0) return; // nothing to do assert (offSet < getArrayCapacity ()); double *array = new double [getArrayCapacity ()]; for (size_t i = 0; i < 2; i++) { MemUtil::memCpy (array, d_array_p [i], sizeof (double) * getArrayCapacity ()); MemUtil::memZero (d_array_p [i], sizeof (double) * getArrayCapacity ()); MemUtil::memCpy (d_array_p [i] + offSet, array, sizeof (double) * (getArrayCapacity () - offSet)); } delete [] array; array = 0; d_valueBegin = valueBegin_; }