T libSPRegion<T, DHB>::ArmijoStep(std::vector<T> *theta, std::vector<T> *empMean, std::vector<T>& grad) { std::vector<T> newTheta(*theta); grad.assign(NumFeatures, T(0.0)); T oldPrimalValue = libSPBase<T,DHB>::DataHandler->ComputeFandG(&newTheta, empMean, &grad, 0); ++funEvals; T stepsize = T(1.0); for(size_t armijoIteration=0;armijoIteration<SPParams->ArmijoIterations;++armijoIteration) { for(size_t r = 0;r<NumFeatures;++r) { newTheta[r] = (*theta)[r] - stepsize*grad[r]; } if(SPParams->ReuseMessagesForF==0) { libSPBase<T,DHB>::DataHandler->ClearMessages(); } T primalValue = libSPBase<T,DHB>::DataHandler->ComputeFandG(&newTheta, empMean, NULL, 0); ++funEvals; if(primalValue<oldPrimalValue) { for(size_t r=0;r<NumFeatures;++r) { (*theta)[r] = newTheta[r]; } oldPrimalValue = primalValue; break; } stepsize /= 2; } std::cout << " F: " << funEvals << " S: " << stepsize << " P: " << oldPrimalValue; return oldPrimalValue; }
VectorXf Arm::update(VectorXf theta) { VectorXf newTheta(12); newTheta = theta - psuedo_inv_jacobian(theta) * C(theta) * step_size; return newTheta; }