From 960d10582d2d96235af32db2c6e8b1234151f036 Mon Sep 17 00:00:00 2001 From: Sungtae An Date: Mon, 17 Nov 2014 16:17:11 -0500 Subject: [PATCH] Add pure virtual function in GaussianFactor and empty dummy virtual function in Jacobian/Hessian Factor for the raw memory access functions --- gtsam/linear/GaussianFactor.h | 6 ++++++ gtsam/linear/HessianFactor.cpp | 14 ++++++++++++++ gtsam/linear/HessianFactor.h | 6 ++++++ gtsam/linear/JacobianFactor.cpp | 14 ++++++++++++++ gtsam/linear/JacobianFactor.h | 6 ++++++ 5 files changed, 46 insertions(+) diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index 58eaf4460..2b5777e94 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -99,6 +99,9 @@ namespace gtsam { /// Return the diagonal of the Hessian for this factor virtual VectorValues hessianDiagonal() const = 0; + /// Raw memory access version of hessianDiagonal + virtual void hessianDiagonal(double* d) const = 0; + /// Return the block diagonal of the Hessian for this factor virtual std::map hessianBlockDiagonal() const = 0; @@ -121,6 +124,9 @@ namespace gtsam { /// A'*b for Jacobian, eta for Hessian virtual VectorValues gradientAtZero() const = 0; + /// Raw memory access version of gradientAtZero + virtual void gradientAtZero(double* d) const = 0; + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index b1f8dc6a6..e42e4a1f7 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -358,6 +358,13 @@ VectorValues HessianFactor::hessianDiagonal() const { return d; } +/* ************************************************************************* */ +// Raw memory access version should be called in Regular Factors only currently +void HessianFactor::hessianDiagonal(double* d) const { + throw std::runtime_error( + "HessianFactor::hessianDiagonal raw memory access is allowed for Regular Factors only"); +} + /* ************************************************************************* */ map HessianFactor::hessianBlockDiagonal() const { map blocks; @@ -540,6 +547,13 @@ VectorValues HessianFactor::gradientAtZero() const { return g; } +/* ************************************************************************* */ +// Raw memory access version should be called in Regular Factors only currently +void HessianFactor::gradientAtZero(double* d) const { + throw std::runtime_error( + "HessianFactor::gradientAtZero raw memory access is allowed for Regular Factors only"); +} + /* ************************************************************************* */ std::pair, boost::shared_ptr > EliminateCholesky(const GaussianFactorGraph& factors, const Ordering& keys) diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 44118cece..bcc6f4864 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -340,6 +340,9 @@ namespace gtsam { /// Return the diagonal of the Hessian for this factor virtual VectorValues hessianDiagonal() const; + /// Raw memory access version of hessianDiagonal + virtual void hessianDiagonal(double* d) const; + /// Return the block diagonal of the Hessian for this factor virtual std::map hessianBlockDiagonal() const; @@ -380,6 +383,9 @@ namespace gtsam { /// eta for Hessian VectorValues gradientAtZero() const; + /// Raw memory access version of gradientAtZero + virtual void gradientAtZero(double* d) const; + /** * Densely partially eliminate with Cholesky factorization. JacobianFactors are * left-multiplied with their transpose to form the Hessian using the conversion constructor diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 723d84d57..4e75c5bd6 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -460,6 +460,13 @@ VectorValues JacobianFactor::hessianDiagonal() const { return d; } +/* ************************************************************************* */ +// Raw memory access version should be called in Regular Factors only currently +void JacobianFactor::hessianDiagonal(double* d) const { + throw std::runtime_error( + "JacobianFactor::hessianDiagonal raw memory access is allowed for Regular Factors only"); +} + /* ************************************************************************* */ map JacobianFactor::hessianBlockDiagonal() const { map blocks; @@ -520,6 +527,13 @@ VectorValues JacobianFactor::gradientAtZero() const { return g; } +/* ************************************************************************* */ +// Raw memory access version should be called in Regular Factors only currently +void JacobianFactor::gradientAtZero(double* d) const { + throw std::runtime_error( + "JacobianFactor::gradientAtZero raw memory access is allowed for Regular Factors only"); +} + /* ************************************************************************* */ pair JacobianFactor::jacobian() const { pair result = jacobianUnweighted(); diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 6057b7819..32f062928 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -185,6 +185,9 @@ namespace gtsam { /// Return the diagonal of the Hessian for this factor virtual VectorValues hessianDiagonal() const; + /// Raw memory access version of hessianDiagonal + virtual void hessianDiagonal(double* d) const; + /// Return the block diagonal of the Hessian for this factor virtual std::map hessianBlockDiagonal() const; @@ -279,6 +282,9 @@ namespace gtsam { /// A'*b for Jacobian VectorValues gradientAtZero() const; + /// Raw memory access version of gradientAtZero + virtual void gradientAtZero(double* d) const; + /** Return a whitened version of the factor, i.e. with unit diagonal noise model. */ JacobianFactor whiten() const;