Пример #1
0
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;
}
Пример #2
0
VectorXf Arm::update(VectorXf theta) {
	VectorXf newTheta(12);
	newTheta = theta - psuedo_inv_jacobian(theta) * C(theta) * step_size;
	return newTheta;
}