| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | // Ceres Solver - A fast non-linear least squares minimizer// Copyright 2019 Google Inc. All rights reserved.// http://code.google.com/p/ceres-solver///// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are met://// * Redistributions of source code must retain the above copyright notice,//   this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above copyright notice,//   this list of conditions and the following disclaimer in the documentation//   and/or other materials provided with the distribution.// * Neither the name of Google Inc. nor the names of its contributors may be//   used to endorse or promote products derived from this software without//   specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE// POSSIBILITY OF SUCH DAMAGE.//// Author: darius.rueckert@fau.de (Darius Rueckert)#include "ceres/codegen/internal/expression_ref.h"#include "ceres/codegen/internal/expression_graph.h"#include "glog/logging.h"namespace ceres {namespace internal {ExpressionRef AddExpressionToGraph(const Expression& expression) {  ExpressionGraph* graph = GetCurrentExpressionGraph();  CHECK(graph)      << "The ExpressionGraph has to be created before using Expressions. This "         "is achieved by calling ceres::StartRecordingExpressions.";  return ExpressionRef::Create(graph->InsertBack(expression));}ExpressionRef ExpressionRef::Create(ExpressionId id) {  ExpressionRef ref;  ref.id = id;  return ref;}ExpressionRef::ExpressionRef(double compile_time_constant) {  id = AddExpressionToGraph(           Expression::CreateCompileTimeConstant(compile_time_constant))           .id;}ExpressionRef::ExpressionRef(const ExpressionRef& other) { *this = other; }ExpressionRef& ExpressionRef::operator=(const ExpressionRef& other) {  // Assigning an uninitialized variable to another variable is an error.  CHECK(other.IsInitialized()) << "Uninitialized Assignment.";  if (IsInitialized()) {    // Create assignment from other -> this    AddExpressionToGraph(Expression::CreateAssignment(this->id, other.id));  } else {    // Create a new variable and    // Create assignment from other -> this    // Passing kInvalidExpressionId to CreateAssignment generates a new    // variable name which we store in the id.    id = AddExpressionToGraph(             Expression::CreateAssignment(kInvalidExpressionId, other.id))             .id;  }  return *this;}// Compound operatorsExpressionRef& ExpressionRef::operator+=(const ExpressionRef& x) {  *this = *this + x;  return *this;}ExpressionRef& ExpressionRef::operator-=(const ExpressionRef& x) {  *this = *this - x;  return *this;}ExpressionRef& ExpressionRef::operator*=(const ExpressionRef& x) {  *this = *this * x;  return *this;}ExpressionRef& ExpressionRef::operator/=(const ExpressionRef& x) {  *this = *this / x;  return *this;}// Arith. OperatorsExpressionRef operator-(const ExpressionRef& x) {  return AddExpressionToGraph(Expression::CreateUnaryArithmetic("-", x.id));}ExpressionRef operator+(const ExpressionRef& x) {  return AddExpressionToGraph(Expression::CreateUnaryArithmetic("+", x.id));}ExpressionRef operator+(const ExpressionRef& x, const ExpressionRef& y) {  return AddExpressionToGraph(      Expression::CreateBinaryArithmetic("+", x.id, y.id));}ExpressionRef operator-(const ExpressionRef& x, const ExpressionRef& y) {  return AddExpressionToGraph(      Expression::CreateBinaryArithmetic("-", x.id, y.id));}ExpressionRef operator/(const ExpressionRef& x, const ExpressionRef& y) {  return AddExpressionToGraph(      Expression::CreateBinaryArithmetic("/", x.id, y.id));}ExpressionRef operator*(const ExpressionRef& x, const ExpressionRef& y) {  return AddExpressionToGraph(      Expression::CreateBinaryArithmetic("*", x.id, y.id));}ExpressionRef Ternary(const ComparisonExpressionRef& c,                      const ExpressionRef& x,                      const ExpressionRef& y) {  return AddExpressionToGraph(Expression::CreateScalarFunctionCall(      "ceres::Ternary", {c.id, x.id, y.id}));}#define CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(op)         \  ComparisonExpressionRef operator op(const ExpressionRef& x,   \                                      const ExpressionRef& y) { \    return ComparisonExpressionRef(AddExpressionToGraph(        \        Expression::CreateBinaryCompare(#op, x.id, y.id)));     \  }#define CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(op)                      \  ComparisonExpressionRef operator op(const ComparisonExpressionRef& x,   \                                      const ComparisonExpressionRef& y) { \    return ComparisonExpressionRef(AddExpressionToGraph(                  \        Expression::CreateBinaryCompare(#op, x.id, y.id)));               \  }CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(<)CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(<=)CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(>)CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(>=)CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(==)CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(!=)CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(&&)CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(||)CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(&)CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(|)#undef CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR#undef CERES_DEFINE_EXPRESSION_LOGICAL_OPERATORComparisonExpressionRef operator!(const ComparisonExpressionRef& x) {  return ComparisonExpressionRef(      AddExpressionToGraph(Expression::CreateLogicalNegation(x.id)));}}  // namespace internal}  // namespace ceres
 |