mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-30 00:50:37 +08:00
848c1f90c0
Change-Id: I128f8ccc21c2c3a2c79674ac28dd9a5b26b58772
121 lines
4.3 KiB
C++
121 lines
4.3 KiB
C++
// 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)
|
|
//
|
|
#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_CODE_GENERATOR_H_
|
|
#define CERES_PUBLIC_CODEGEN_INTERNAL_CODE_GENERATOR_H_
|
|
|
|
#include "ceres/codegen/internal/expression.h"
|
|
#include "ceres/codegen/internal/expression_graph.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace ceres {
|
|
namespace internal {
|
|
|
|
// This class is used to convert an expression graph into a string. The typical
|
|
// pipeline is:
|
|
//
|
|
// 1. Record ExpressionGraph
|
|
// 2. Optimize ExpressionGraph
|
|
// 3. Generate C++ code (this class here)
|
|
//
|
|
// The CodeGenerator operates in the following way:
|
|
//
|
|
// 1. Print Header
|
|
// - The header string is defined in the options.
|
|
// - This is usually the function name including the parameter list.
|
|
//
|
|
// 2. Print Declarations
|
|
// - Declare all used variables
|
|
// - Example:
|
|
// double v_0;
|
|
// double v_1;
|
|
// bool v_3;
|
|
// ...
|
|
//
|
|
// 3. Print Code
|
|
// - Convert each expression line by line to a string
|
|
// - Example:
|
|
// v_2 = v_0 + v_1
|
|
// if (v_5) {
|
|
// v_2 = v_0;
|
|
// ....
|
|
//
|
|
class CodeGenerator {
|
|
public:
|
|
struct Options {
|
|
// Name of the function.
|
|
// Example:
|
|
// bool Evaluate(const double* x, double* res)
|
|
std::string function_name = "";
|
|
|
|
// Number of spaces added for each level of indentation.
|
|
int indentation_spaces_per_level = 2;
|
|
|
|
// The prefix added to each variable name.
|
|
std::string variable_prefix = "v_";
|
|
};
|
|
|
|
CodeGenerator(const ExpressionGraph& graph, const Options& options);
|
|
|
|
// Generate the C++ code in the steps (1)-(3) described above.
|
|
// The result is a vector of strings, where each element is exactly one line
|
|
// of code. The order is important and must not be changed.
|
|
std::vector<std::string> Generate();
|
|
|
|
private:
|
|
// Converts a single expression given by id to a string.
|
|
// The format depends on the ExpressionType.
|
|
// See ExpressionType in expression.h for more detailed how the different
|
|
// lines will look like.
|
|
std::string ExpressionToString(ExpressionId id);
|
|
|
|
// Helper function to get the name of an expression.
|
|
// If the expression does not have a valid name an error is generated.
|
|
std::string VariableForExpressionId(ExpressionId id);
|
|
|
|
// Adds one level of indentation. Called when an IF expression is encountered.
|
|
void PushIndentation();
|
|
|
|
// Removes one level of indentation. Currently only used by ENDIF.
|
|
void PopIndentation();
|
|
|
|
const ExpressionGraph& graph_;
|
|
const Options options_;
|
|
std::string indentation_ = "";
|
|
static constexpr int kFloatingPointPrecision = 25;
|
|
};
|
|
|
|
} // namespace internal
|
|
} // namespace ceres
|
|
|
|
#endif // CERES_PUBLIC_CODEGEN_INTERNAL_CODE_GENERATOR_H_
|