-
Notifications
You must be signed in to change notification settings - Fork 12
Description
Description
I believe something is wrong with constructing JacobianFactors from the result of a linearize() operation when using the python wrapper. Tagging @varunagrawal and @ProfFan due to the fact this is python related.
Specifically, the RTTI dynamic casts used in JacobianFactor constructors do not seem to be working properly. Here are two example usages:
For whatever reason, nonlinear factors constructed in python, which are then called with .linearize() to create a JacobianFactor, cannot be passed into the JacobianFactor(factor) constructors because boost::dynamic_pointer_cast<JacobianFactor>(factor) returns a null pointer.
Steps to reproduce
This example python script fails:
import gtsam
import gtdynamics as gtd
def main():
f = gtd.MinTorqueFactor(0, gtsam.noiseModel.Unit.Create(1))
init = gtsam.Values()
init.insert(0, 0.0)
flin = f.linearize(init)
flin.print("Linearized Factor: ")
print("\nLinearized factor has type: ", type(flin), '\n')
# output: Linearized factor has type: <class 'gtsam.gtsam.JacobianFactor'>
gtsam.JacobianFactor(flin) # this throws an error
if __name__ == '__main__':
main()Which throws the error:
In JacobianFactor(const GaussianFactor& rhs), rhs is neither a JacobianFactor nor a HessianFactor
Expected behavior
The python result should match that of this example C++ script succeeds:
#include <gtdynamics/factors/MinTorqueFactor.h>
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
#include <iostream>
using namespace gtsam;
using namespace gtdynamics;
int main() {
auto f = MinTorqueFactor(0, noiseModel::Unit::Create(1));
auto init = Values();
init.insert(0, 0.0);
auto flin = f.linearize(init);
flin->print("Linearized Factor: ");
std::cout << "\nLinearized factor has type: " << typeid(*flin).name() << std::endl<< std::endl;
// Output: Linearized factor has type: N5gtsam14JacobianFactorE
auto jf = JacobianFactor(*flin);
}Environment
MacOS 11.3.1, MacBook Air (M1, 2020),
AppleClang 12.0.5.12050022
gtsam hash b99bf4e92912f4ad0020f79d6b222a3d6593514f
I also experienced similar errors when I ran on an ubuntu intel lab machine, but I didn't rigorously test these particular test files.
Additional information
This only occurs for nonlinear factors defined outside of the GTSAM repo. So, for example, PriorFactor, BetweenFactor, etc all still work as expected.
This causes noticeable failures on optimizations with Constrained noise models, may be causing silent correctness errors on other optimizations, and is likely causing all non-GTSAM factors to be calling the HessianFactor constructor instead of the JacobianFactor constructor (performance penalty).