many performance tweaks
parent
2cedda703c
commit
9ec714063a
|
@ -430,10 +430,9 @@ Vector JacobianFactor::unweighted_error(const VectorValues& c) const {
|
|||
|
||||
/* ************************************************************************* */
|
||||
Vector JacobianFactor::error_vector(const VectorValues& c) const {
|
||||
if (model_)
|
||||
return model_->whiten(unweighted_error(c));
|
||||
else
|
||||
return unweighted_error(c);
|
||||
Vector e = unweighted_error(c);
|
||||
if (model_) model_->whitenInPlace(e);
|
||||
return e;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
@ -474,10 +473,10 @@ VectorValues JacobianFactor::hessianDiagonal() const {
|
|||
for (size_t k = 0; k < nj; ++k) {
|
||||
Vector column_k = Ab_(pos).col(k);
|
||||
if (model_)
|
||||
column_k = model_->whiten(column_k);
|
||||
model_->whitenInPlace(column_k);
|
||||
dj(k) = dot(column_k, column_k);
|
||||
}
|
||||
d.insert(j, dj);
|
||||
d.emplace(j, dj);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
@ -496,7 +495,7 @@ map<Key, Matrix> JacobianFactor::hessianBlockDiagonal() const {
|
|||
Matrix Aj = Ab_(pos);
|
||||
if (model_)
|
||||
Aj = model_->Whiten(Aj);
|
||||
blocks.insert(make_pair(j, Aj.transpose() * Aj));
|
||||
blocks.emplace(j, Aj.transpose() * Aj);
|
||||
}
|
||||
return blocks;
|
||||
}
|
||||
|
@ -541,29 +540,38 @@ void JacobianFactor::updateHessian(const KeyVector& infoKeys,
|
|||
|
||||
/* ************************************************************************* */
|
||||
Vector JacobianFactor::operator*(const VectorValues& x) const {
|
||||
Vector Ax = Vector::Zero(Ab_.rows());
|
||||
Vector Ax(Ab_.rows());
|
||||
Ax.setZero();
|
||||
if (empty())
|
||||
return Ax;
|
||||
|
||||
// Just iterate over all A matrices and multiply in correct config part
|
||||
for (size_t pos = 0; pos < size(); ++pos)
|
||||
Ax += Ab_(pos) * x[keys_[pos]];
|
||||
for (size_t pos = 0; pos < size(); ++pos) {
|
||||
// http://eigen.tuxfamily.org/dox/TopicWritingEfficientProductExpression.html
|
||||
Ax.noalias() += Ab_(pos) * x[keys_[pos]];
|
||||
}
|
||||
|
||||
return model_ ? model_->whiten(Ax) : Ax;
|
||||
if (model_) model_->whitenInPlace(Ax);
|
||||
return Ax;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
void JacobianFactor::transposeMultiplyAdd(double alpha, const Vector& e,
|
||||
VectorValues& x) const {
|
||||
Vector E = alpha * (model_ ? model_->whiten(e) : e);
|
||||
VectorValues& x) const {
|
||||
Vector E(e.size());
|
||||
E.noalias() = alpha * e;
|
||||
if (model_) model_->whitenInPlace(E);
|
||||
// Just iterate over all A matrices and insert Ai^e into VectorValues
|
||||
for (size_t pos = 0; pos < size(); ++pos) {
|
||||
Key j = keys_[pos];
|
||||
// Create the value as a zero vector if it does not exist.
|
||||
pair<VectorValues::iterator, bool> xi = x.tryInsert(j, Vector());
|
||||
if (xi.second)
|
||||
xi.first->second = Vector::Zero(getDim(begin() + pos));
|
||||
xi.first->second += Ab_(pos).transpose()*E;
|
||||
const Key j = keys_[pos];
|
||||
// To avoid another malloc if key exists, we explicitly check
|
||||
auto it = x.find(j);
|
||||
if (it != x.end()) {
|
||||
// http://eigen.tuxfamily.org/dox/TopicWritingEfficientProductExpression.html
|
||||
it->second.noalias() += Ab_(pos).transpose() * E;
|
||||
} else {
|
||||
x.emplace(j, Ab_(pos).transpose() * E);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -625,8 +633,8 @@ VectorValues JacobianFactor::gradientAtZero() const {
|
|||
Vector b = getb();
|
||||
// Gradient is really -A'*b / sigma^2
|
||||
// transposeMultiplyAdd will divide by sigma once, so we need one more
|
||||
Vector b_sigma = model_ ? model_->whiten(b) : b;
|
||||
this->transposeMultiplyAdd(-1.0, b_sigma, g); // g -= A'*b/sigma^2
|
||||
if (model_) model_->whitenInPlace(b);
|
||||
this->transposeMultiplyAdd(-1.0, b, g); // g -= A'*b/sigma^2
|
||||
return g;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue