From f588a3928acf6c323abd56b54a989b89bcb9cd44 Mon Sep 17 00:00:00 2001 From: dellaert Date: Thu, 11 Dec 2014 13:19:08 +0100 Subject: [PATCH] Added handy dandy Factor Factory --- gtsam_unstable/nonlinear/ExpressionFactor.h | 43 ++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/gtsam_unstable/nonlinear/ExpressionFactor.h b/gtsam_unstable/nonlinear/ExpressionFactor.h index 56e72a807..af4b8a8ad 100644 --- a/gtsam_unstable/nonlinear/ExpressionFactor.h +++ b/gtsam_unstable/nonlinear/ExpressionFactor.h @@ -111,5 +111,46 @@ public: }; // ExpressionFactor -} +/** + * A functor that creates binary expression factors on demand + * Example usage: + * MakeBinaryFactor make(&Event::toa, model); + * ExpressionFactor factor = make(z, eventExpr, microphoneExpr); + * This obviates the need for making Factor classes that are almost empty. + * It also takes a default noise model. + * TODO: unary and ternary versions + */ +template +class MakeBinaryFactor { + + typedef typename BinaryExpression::Method Method; + typedef typename BinaryExpression::Function Function; + + Function function_; + SharedNoiseModel model_; + +public: + + /// Constructor with a binary function + MakeBinaryFactor(Function function, const SharedNoiseModel& model) : + function_(function), model_(model) { + } + + /// Constructor with a unary method pointer + MakeBinaryFactor(Method method, const SharedNoiseModel& model) : + function_(boost::bind(method, _1, _2, _3, _4)), model_(model) { + + } + + /// Operator just needs noise model, measurement, and two expressions + ExpressionFactor operator()(double measurement, + const Expression& expression1, const Expression& expression2) { + // Create expression and return factor + Expression expression(function_, expression1, expression2); + return ExpressionFactor(model_, measurement, expression); + } + +}; + +} // \ namespace gtsam