From 31ca0d76dbf6f245b5add2621f999b905f14ca27 Mon Sep 17 00:00:00 2001 From: dellaert Date: Thu, 11 Dec 2014 13:44:47 +0100 Subject: [PATCH] Added unary version --- gtsam_unstable/nonlinear/ExpressionFactor.h | 52 +++++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/gtsam_unstable/nonlinear/ExpressionFactor.h b/gtsam_unstable/nonlinear/ExpressionFactor.h index af4b8a8ad..680fd9878 100644 --- a/gtsam_unstable/nonlinear/ExpressionFactor.h +++ b/gtsam_unstable/nonlinear/ExpressionFactor.h @@ -111,14 +111,56 @@ public: }; // ExpressionFactor +/** + * ExpressionFactor Factories + * They obviate the need for making Factor classes that are almost empty. + * They also takes a default noise model. + * TODO: Ternary version + */ + +/** + * A functor that creates unary expression factors on demand + * Example usage: + * MakeUnaryFactor MakePrior(&Event::height, model); + * ExpressionFactor factor = MakePrior(z, eventExpr); + */ +template +class MakeUnaryFactor { + + typedef typename UnaryExpression::Method Method; + typedef typename UnaryExpression::Function Function; + + Function function_; + SharedNoiseModel model_; + +public: + + /// Constructor with a binary function + MakeUnaryFactor(Function function, const SharedNoiseModel& model) : + function_(function), model_(model) { + } + + /// Constructor with a unary method pointer + MakeUnaryFactor(Method method, const SharedNoiseModel& model) : + function_(boost::bind(method, _1, _2)), model_(model) { + + } + + /// Operator just needs noise model, measurement, and two expressions + ExpressionFactor operator()(double measurement, + const Expression& expression1) { + // Create expression and return factor + Expression expression(function_, expression1); + return ExpressionFactor(model_, measurement, expression); + } + +}; + /** * 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 + * MakeBinaryFactor MakeFactor(&Event::toa, model); + * ExpressionFactor factor = MakeFactor(z, eventExpr, microphoneExpr); */ template class MakeBinaryFactor {