nonlinear
parent
ee65c85442
commit
1f833a0bc3
|
@ -78,7 +78,7 @@ struct GTSAM_EXPORT DeltaImpl {
|
|||
size_t nFullSystemVars;
|
||||
enum { /*AS_ADDED,*/ COLAMD } algorithm;
|
||||
enum { NO_CONSTRAINT, CONSTRAIN_LAST } constrain;
|
||||
boost::optional<FastMap<Key, int> > constrainedKeys;
|
||||
std::optional<FastMap<Key, int> > constrainedKeys;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -195,9 +195,9 @@ struct GTSAM_EXPORT UpdateImpl {
|
|||
|
||||
// Calculate nonlinear error
|
||||
void error(const NonlinearFactorGraph& nonlinearFactors,
|
||||
const Values& estimate, boost::optional<double>* result) const {
|
||||
const Values& estimate, std::optional<double>* result) const {
|
||||
gttic(error);
|
||||
result->reset(nonlinearFactors.error(estimate));
|
||||
*result = nonlinearFactors.error(estimate);
|
||||
}
|
||||
|
||||
// Mark linear update
|
||||
|
|
|
@ -396,9 +396,9 @@ void ISAM2::removeVariables(const KeySet& unusedKeys) {
|
|||
ISAM2Result ISAM2::update(
|
||||
const NonlinearFactorGraph& newFactors, const Values& newTheta,
|
||||
const FactorIndices& removeFactorIndices,
|
||||
const boost::optional<FastMap<Key, int> >& constrainedKeys,
|
||||
const boost::optional<FastList<Key> >& noRelinKeys,
|
||||
const boost::optional<FastList<Key> >& extraReelimKeys,
|
||||
const std::optional<FastMap<Key, int> >& constrainedKeys,
|
||||
const std::optional<FastList<Key> >& noRelinKeys,
|
||||
const std::optional<FastList<Key> >& extraReelimKeys,
|
||||
bool force_relinearize) {
|
||||
ISAM2UpdateParams params;
|
||||
params.constrainedKeys = constrainedKeys;
|
||||
|
|
|
@ -87,7 +87,7 @@ class GTSAM_EXPORT ISAM2 : public BayesTree<ISAM2Clique> {
|
|||
ISAM2Params params_;
|
||||
|
||||
/** The current Dogleg Delta (trust region radius) */
|
||||
mutable boost::optional<double> doglegDelta_;
|
||||
mutable std::optional<double> doglegDelta_;
|
||||
|
||||
/** Set of variables that are involved with linear factors from marginalized
|
||||
* variables and thus cannot have their linearization points changed. */
|
||||
|
@ -152,9 +152,9 @@ class GTSAM_EXPORT ISAM2 : public BayesTree<ISAM2Clique> {
|
|||
const NonlinearFactorGraph& newFactors = NonlinearFactorGraph(),
|
||||
const Values& newTheta = Values(),
|
||||
const FactorIndices& removeFactorIndices = FactorIndices(),
|
||||
const boost::optional<FastMap<Key, int> >& constrainedKeys = boost::none,
|
||||
const boost::optional<FastList<Key> >& noRelinKeys = boost::none,
|
||||
const boost::optional<FastList<Key> >& extraReelimKeys = boost::none,
|
||||
const std::optional<FastMap<Key, int> >& constrainedKeys = {},
|
||||
const std::optional<FastList<Key> >& noRelinKeys = {},
|
||||
const std::optional<FastList<Key> >& extraReelimKeys = {},
|
||||
bool force_relinearize = false);
|
||||
|
||||
/**
|
||||
|
|
|
@ -51,7 +51,7 @@ struct ISAM2Result {
|
|||
* ISAM2Params::evaluateNonlinearError is set to \c true, because there is
|
||||
* some cost to this computation.
|
||||
*/
|
||||
boost::optional<double> errorBefore;
|
||||
std::optional<double> errorBefore;
|
||||
|
||||
/** The nonlinear error of all of the factors computed after the current
|
||||
* update, meaning that variables above the relinearization threshold
|
||||
|
@ -63,7 +63,7 @@ struct ISAM2Result {
|
|||
* ISAM2Params::evaluateNonlinearError is set to \c true, because there is
|
||||
* some cost to this computation.
|
||||
*/
|
||||
boost::optional<double> errorAfter;
|
||||
std::optional<double> errorAfter;
|
||||
|
||||
/** The number of variables that were relinearized because their linear
|
||||
* deltas exceeded the reslinearization threshold
|
||||
|
@ -155,14 +155,20 @@ struct ISAM2Result {
|
|||
|
||||
/** Detailed results, if enabled by ISAM2Params::enableDetailedResults. See
|
||||
* Detail for information about the results data stored here. */
|
||||
boost::optional<DetailedResults> detail;
|
||||
std::optional<DetailedResults> detail;
|
||||
|
||||
explicit ISAM2Result(bool enableDetailedResults = false) {
|
||||
if (enableDetailedResults) detail.reset(DetailedResults());
|
||||
if (enableDetailedResults) detail = DetailedResults();
|
||||
}
|
||||
|
||||
/// Return pointer to detail, 0 if no detail requested
|
||||
DetailedResults* details() { return detail.get_ptr(); }
|
||||
DetailedResults* details() {
|
||||
if (detail.has_value()) {
|
||||
return &(*detail);
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
/// Print results
|
||||
void print(const std::string str = "") const {
|
||||
|
|
|
@ -37,16 +37,16 @@ struct ISAM2UpdateParams {
|
|||
|
||||
/** An optional map of keys to group labels, such that a variable can be
|
||||
* constrained to a particular grouping in the BayesTree */
|
||||
boost::optional<FastMap<Key, int>> constrainedKeys{boost::none};
|
||||
std::optional<FastMap<Key, int>> constrainedKeys{{}};
|
||||
|
||||
/** An optional set of nonlinear keys that iSAM2 will hold at a constant
|
||||
* linearization point, regardless of the size of the linear delta */
|
||||
boost::optional<FastList<Key>> noRelinKeys{boost::none};
|
||||
std::optional<FastList<Key>> noRelinKeys{{}};
|
||||
|
||||
/** An optional set of nonlinear keys that iSAM2 will re-eliminate, regardless
|
||||
* of the size of the linear delta. This allows the provided keys to be
|
||||
* reordered. */
|
||||
boost::optional<FastList<Key>> extraReelimKeys{boost::none};
|
||||
std::optional<FastList<Key>> extraReelimKeys{{}};
|
||||
|
||||
/** Relinearize any variables whose delta magnitude is sufficiently large
|
||||
* (Params::relinearizeThreshold), regardless of the relinearization
|
||||
|
@ -63,7 +63,7 @@ struct ISAM2UpdateParams {
|
|||
* depend on Keys `X(2)`, `X(3)`. Next call to ISAM2::update() must include
|
||||
* its `newAffectedKeys` field with the map `13 -> {X(2), X(3)}`.
|
||||
*/
|
||||
boost::optional<FastMap<FactorIndex, KeySet>> newAffectedKeys{boost::none};
|
||||
std::optional<FastMap<FactorIndex, KeySet>> newAffectedKeys{{}};
|
||||
|
||||
/** By default, iSAM2 uses a wildfire update scheme that stops updating when
|
||||
* the deltas become too small down in the tree. This flagg forces a full
|
||||
|
|
|
@ -104,7 +104,7 @@ public:
|
|||
};
|
||||
|
||||
LinearSolverType linearSolverType = MULTIFRONTAL_CHOLESKY; ///< The type of linear solver to use in the nonlinear optimizer
|
||||
boost::optional<Ordering> ordering; ///< The optional variable elimination ordering, or empty to use COLAMD (default: empty)
|
||||
std::optional<Ordering> ordering; ///< The optional variable elimination ordering, or empty to use COLAMD (default: empty)
|
||||
IterativeOptimizationParameters::shared_ptr iterativeParams; ///< The container for iterativeOptimization parameters. used in CG Solvers.
|
||||
|
||||
NonlinearOptimizerParams() = default;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include <Eigen/Core>
|
||||
#include <iostream>
|
||||
#include <optional>
|
||||
|
||||
namespace gtsam {
|
||||
namespace internal {
|
||||
|
@ -132,12 +133,12 @@ class ExecutionTrace {
|
|||
|
||||
/// Return record pointer, quite unsafe, used only for testing
|
||||
template<class Record>
|
||||
boost::optional<Record*> record() {
|
||||
std::optional<Record*> record() {
|
||||
if (kind != Function)
|
||||
return boost::none;
|
||||
return {};
|
||||
else {
|
||||
Record* p = dynamic_cast<Record*>(content.ptr);
|
||||
return p ? boost::optional<Record*>(p) : boost::none;
|
||||
return p ? std::optional<Record*>(p) : std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ bool ConcurrentIncrementalFilter::equals(const ConcurrentFilter& rhs, double tol
|
|||
|
||||
/* ************************************************************************* */
|
||||
ConcurrentIncrementalFilter::Result ConcurrentIncrementalFilter::update(const NonlinearFactorGraph& newFactors, const Values& newTheta,
|
||||
const boost::optional<FastList<Key> >& keysToMove, const boost::optional< FactorIndices >& removeFactorIndices) {
|
||||
const std::optional<FastList<Key> >& keysToMove, const std::optional< FactorIndices >& removeFactorIndices) {
|
||||
|
||||
gttic(update);
|
||||
|
||||
|
@ -63,7 +63,7 @@ ConcurrentIncrementalFilter::Result ConcurrentIncrementalFilter::update(const No
|
|||
}
|
||||
|
||||
// Generate ordering constraints that force the 'keys to move' to the end
|
||||
boost::optional<FastMap<Key,int> > orderingConstraints = boost::none;
|
||||
std::optional<FastMap<Key,int> > orderingConstraints = {};
|
||||
if(keysToMove && keysToMove->size() > 0) {
|
||||
orderingConstraints = FastMap<Key,int>();
|
||||
int group = 1;
|
||||
|
@ -86,10 +86,10 @@ ConcurrentIncrementalFilter::Result ConcurrentIncrementalFilter::update(const No
|
|||
|
||||
// Create the set of linear keys that iSAM2 should hold constant
|
||||
// iSAM2 takes care of this for us; no need to specify additional noRelin keys
|
||||
boost::optional<FastList<Key> > noRelinKeys = boost::none;
|
||||
std::optional<FastList<Key> > noRelinKeys = {};
|
||||
|
||||
// Mark additional keys between the 'keys to move' and the leaves
|
||||
boost::optional<FastList<Key> > additionalKeys = boost::none;
|
||||
std::optional<FastList<Key> > additionalKeys = {};
|
||||
if(keysToMove && keysToMove->size() > 0) {
|
||||
std::set<Key> markedKeys;
|
||||
for(Key key: *keysToMove) {
|
||||
|
@ -211,7 +211,7 @@ void ConcurrentIncrementalFilter::synchronize(const NonlinearFactorGraph& smooth
|
|||
|
||||
// Remove the old factors on the separator and insert the new ones
|
||||
FactorIndices removeFactors(currentSmootherSummarizationSlots_.begin(), currentSmootherSummarizationSlots_.end());
|
||||
ISAM2Result result = isam2_.update(currentSmootherSummarization, Values(), removeFactors, boost::none, noRelinKeys, boost::none, false);
|
||||
ISAM2Result result = isam2_.update(currentSmootherSummarization, Values(), removeFactors, {}, noRelinKeys, {}, false);
|
||||
currentSmootherSummarizationSlots_ = result.newFactorsIndices;
|
||||
|
||||
// Set the previous smoother summarization to the current smoother summarization and clear the smoother shortcut
|
||||
|
|
|
@ -123,8 +123,8 @@ public:
|
|||
* @param removeFactorIndices An optional set of indices corresponding to the factors you want to remove from the graph
|
||||
*/
|
||||
Result update(const NonlinearFactorGraph& newFactors = NonlinearFactorGraph(), const Values& newTheta = Values(),
|
||||
const boost::optional<FastList<Key> >& keysToMove = boost::none,
|
||||
const boost::optional< FactorIndices >& removeFactorIndices = boost::none);
|
||||
const std::optional<FastList<Key> >& keysToMove = {},
|
||||
const std::optional< FactorIndices >& removeFactorIndices = {});
|
||||
|
||||
/**
|
||||
* Perform any required operations before the synchronization process starts.
|
||||
|
|
|
@ -76,7 +76,7 @@ FixedLagSmoother::Result IncrementalFixedLagSmoother::update(
|
|||
}
|
||||
|
||||
FastVector<size_t> removedFactors;
|
||||
boost::optional<FastMap<Key, int> > constrainedKeys = boost::none;
|
||||
std::optional<FastMap<Key, int> > constrainedKeys = {};
|
||||
|
||||
// Update the Timestamps associated with the factor keys
|
||||
updateKeyTimestampMap(timestamps);
|
||||
|
@ -126,7 +126,7 @@ FixedLagSmoother::Result IncrementalFixedLagSmoother::update(
|
|||
|
||||
// Update iSAM2
|
||||
isamResult_ = isam_.update(newFactors, newTheta,
|
||||
factorsToRemove, constrainedKeys, boost::none, additionalMarkedKeys);
|
||||
factorsToRemove, constrainedKeys, {}, additionalMarkedKeys);
|
||||
|
||||
if (debug) {
|
||||
PrintSymbolicTree(isam_,
|
||||
|
@ -175,7 +175,7 @@ void IncrementalFixedLagSmoother::eraseKeysBefore(double timestamp) {
|
|||
/* ************************************************************************* */
|
||||
void IncrementalFixedLagSmoother::createOrderingConstraints(
|
||||
const KeyVector& marginalizableKeys,
|
||||
boost::optional<FastMap<Key, int> >& constrainedKeys) const {
|
||||
std::optional<FastMap<Key, int> >& constrainedKeys) const {
|
||||
if (marginalizableKeys.size() > 0) {
|
||||
constrainedKeys = FastMap<Key, int>();
|
||||
// Generate ordering constraints so that the marginalizable variables will be eliminated first
|
||||
|
|
|
@ -137,7 +137,7 @@ protected:
|
|||
|
||||
/** Fill in an iSAM2 ConstrainedKeys structure such that the provided keys are eliminated before all others */
|
||||
void createOrderingConstraints(const KeyVector& marginalizableKeys,
|
||||
boost::optional<FastMap<Key, int> >& constrainedKeys) const;
|
||||
std::optional<FastMap<Key, int> >& constrainedKeys) const;
|
||||
|
||||
private:
|
||||
/** Private methods for printing debug information */
|
||||
|
|
|
@ -204,7 +204,7 @@ TEST(ExpressionFactor, Binary) {
|
|||
expected22 << 1, 0, 0, 1;
|
||||
|
||||
// Check matrices
|
||||
boost::optional<Binary::Record*> r = trace.record<Binary::Record>();
|
||||
std::optional<Binary::Record*> r = trace.record<Binary::Record>();
|
||||
CHECK(r);
|
||||
EXPECT(assert_equal(expected25, (Matrix ) (*r)->dTdA1, 1e-9));
|
||||
EXPECT(assert_equal(expected22, (Matrix ) (*r)->dTdA2, 1e-9));
|
||||
|
@ -257,7 +257,7 @@ TEST(ExpressionFactor, Shallow) {
|
|||
expected23 << 1, 0, 0, 0, 1, 0;
|
||||
|
||||
// Check matrices
|
||||
boost::optional<Unary::Record*> r = trace.record<Unary::Record>();
|
||||
std::optional<Unary::Record*> r = trace.record<Unary::Record>();
|
||||
CHECK(r);
|
||||
EXPECT(assert_equal(expected23, (Matrix)(*r)->dTdA1, 1e-9));
|
||||
|
||||
|
@ -623,7 +623,7 @@ TEST(ExpressionFactor, MultiplyWithInverseFunction) {
|
|||
CHECK(assert_equal(A * b, Ab));
|
||||
CHECK(assert_equal(
|
||||
numericalDerivative11<Vector3, Point2>(
|
||||
std::bind(f, std::placeholders::_1, b, boost::none, boost::none), a),
|
||||
[&](const Point2& a) { return f(a, b, {}, {}); }, a),
|
||||
H1));
|
||||
|
||||
Values values;
|
||||
|
|
Loading…
Reference in New Issue