Blame docs/html/interfacing_with_autodiff.html

Packit ea1746
Packit ea1746
Packit ea1746
Packit ea1746
Packit ea1746
 <html class="no-js" lang="en" > 
Packit ea1746
<head>
Packit ea1746
  <meta charset="utf-8">
Packit ea1746
  
Packit ea1746
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
Packit ea1746
  
Packit ea1746
  <title>Interfacing with Automatic Differentiation — Ceres Solver</title>
Packit ea1746
  
Packit ea1746
Packit ea1746
  
Packit ea1746
  
Packit ea1746
Packit ea1746
  
Packit ea1746
Packit ea1746
  
Packit ea1746
  
Packit ea1746
    
Packit ea1746
Packit ea1746
  
Packit ea1746
Packit ea1746
  
Packit ea1746
  
Packit ea1746
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
Packit ea1746
  
Packit ea1746
Packit ea1746
  
Packit ea1746
Packit ea1746
  
Packit ea1746
    <link rel="top" title="Ceres Solver" href="index.html"/>
Packit ea1746
        <link rel="up" title="On Derivatives" href="derivatives.html"/>
Packit ea1746
        <link rel="next" title="Modeling Non-linear Least Squares" href="nnls_modeling.html"/>
Packit ea1746
        <link rel="prev" title="Automatic Derivatives" href="automatic_derivatives.html"/> 
Packit ea1746
Packit ea1746
  
Packit ea1746
  <script src="_static/js/modernizr.min.js"></script>
Packit ea1746
Packit ea1746
</head>
Packit ea1746
Packit ea1746
<body class="wy-body-for-nav" role="document">
Packit ea1746
Packit ea1746
  
Packit ea1746
Packit ea1746
    
Packit ea1746
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
Packit ea1746
      
Packit ea1746
        
Packit ea1746
          
Packit ea1746
Packit ea1746
          
Packit ea1746
             Ceres Solver
Packit ea1746
          
Packit ea1746
Packit ea1746
          
Packit ea1746
          
Packit ea1746
Packit ea1746
          
Packit ea1746
            
Packit ea1746
            
Packit ea1746
              
Packit ea1746
                1.13
Packit ea1746
              
Packit ea1746
            
Packit ea1746
          
Packit ea1746
Packit ea1746
          
Packit ea1746
Packit ea1746
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
Packit ea1746
    <input type="text" name="q" placeholder="Search docs" />
Packit ea1746
    <input type="hidden" name="check_keywords" value="yes" />
Packit ea1746
    <input type="hidden" name="area" value="default" />
Packit ea1746
  </form>
Packit ea1746
Packit ea1746
Packit ea1746
          
Packit ea1746
        
Packit ea1746
Packit ea1746
        
Packit ea1746
          
Packit ea1746
            
Packit ea1746
            
Packit ea1746
                
    Packit ea1746
  • Why?
  • Packit ea1746
  • Installation
  • Packit ea1746
  • Tutorial
  • Packit ea1746
  • On Derivatives
    • Packit ea1746
    • Spivak Notation
    • Packit ea1746
    • Analytic Derivatives
    • Packit ea1746
    • Numeric derivatives
    • Packit ea1746
    • Automatic Derivatives
    • Packit ea1746
    • Interfacing with Automatic Differentiation
      • Packit ea1746
      • A function that returns its value
      • Packit ea1746
      • A function that returns its value and derivative
      • Packit ea1746
      • A function that is defined as a table of values
      • Packit ea1746
        Packit ea1746
        Packit ea1746
        Packit ea1746
        Packit ea1746
      • Modeling Non-linear Least Squares
      • Packit ea1746
      • Solving Non-linear Least Squares
      • Packit ea1746
      • Covariance Estimation
      • Packit ea1746
      • General Unconstrained Minimization
      • Packit ea1746
      • FAQS, Tips & Tricks
      • Packit ea1746
      • Users
      • Packit ea1746
      • Contributing
      • Packit ea1746
      • Version History
      • Packit ea1746
      • Bibliography
      • Packit ea1746
      • License
      • Packit ea1746
        Packit ea1746
        Packit ea1746
                    
        Packit ea1746
                  
        Packit ea1746
                
        Packit ea1746
              
        Packit ea1746
            </nav>
        Packit ea1746
        Packit ea1746
            <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
        Packit ea1746
        Packit ea1746
              
        Packit ea1746
              <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        Packit ea1746
                
        Packit ea1746
                Ceres Solver
        Packit ea1746
              </nav>
        Packit ea1746
        Packit ea1746
        Packit ea1746
              
        Packit ea1746
              
        Packit ea1746
                
        Packit ea1746
                  
        Packit ea1746
        Packit ea1746
         
        Packit ea1746
        Packit ea1746
        Packit ea1746
        Packit ea1746
        Packit ea1746
          
          Packit ea1746
              
        • Docs »
        • Packit ea1746
                
          Packit ea1746
                    
        • On Derivatives »
        • Packit ea1746
                
          Packit ea1746
              
        • Interfacing with Automatic Differentiation
        • Packit ea1746
                
        • Packit ea1746
                  
          Packit ea1746
                    
          Packit ea1746
                  
          Packit ea1746
                
          Packit ea1746
            
          Packit ea1746
            
          Packit ea1746
          Packit ea1746
                    
          Packit ea1746
                     
          Packit ea1746
                      
          Packit ea1746
            
          Packit ea1746

          Interfacing with Automatic DifferentiationΒΆ

          Packit ea1746

          Automatic differentiation is straightforward to use in cases where an

          Packit ea1746
          explicit expression for the cost function is available. But this is
          Packit ea1746
          not always possible. Often one has to interface with external routines
          Packit ea1746
          or data. In this chapter we will consider a number of different ways
          Packit ea1746
          of doing so.

          Packit ea1746

          To do this, we will consider the problem of finding parameters

          Packit ea1746
          \(\theta\) and \(t\) that solve an optimization problem of the
          Packit ea1746
          form:

          Packit ea1746
          Packit ea1746
          \[\begin{split}\min & \quad \sum_i \left \|y_i - f\left (\|q_{i}\|^2\right) q_i
          Packit ea1746
          \right \|^2\\
          Packit ea1746
          \text{such that} & \quad q_i = R(\theta) x_i + t\end{split}\]
          Packit ea1746

          Here, \(R\) is a two dimensional rotation matrix parameterized

          Packit ea1746
          using the angle \(\theta\) and \(t\) is a two dimensional
          Packit ea1746
          vector. \(f\) is an external distortion function.

          Packit ea1746

          We begin by considering the case, where we have a templated function

          Packit ea1746
          TemplatedComputeDistortion that can compute the function
          Packit ea1746
          \(f\). Then the implementation of the corresponding residual
          Packit ea1746
          functor is straightforward and will look as follows:

          Packit ea1746
          template <typename T> T TemplatedComputeDistortion(const T r2) {
          Packit ea1746
            const double k1 = 0.0082;
          Packit ea1746
            const double k2 = 0.000023;
          Packit ea1746
            return 1.0 + k1 * y2 + k2 * r2 * r2;
          Packit ea1746
          }
          Packit ea1746
          Packit ea1746
          struct Affine2DWithDistortion {
          Packit ea1746
            Affine2DWithDistortion(const double x_in[2], const double y_in[2]) {
          Packit ea1746
              x[0] = x_in[0];
          Packit ea1746
              x[1] = x_in[1];
          Packit ea1746
              y[0] = y_in[0];
          Packit ea1746
              y[1] = y_in[1];
          Packit ea1746
            }
          Packit ea1746
          Packit ea1746
            template <typename T>
          Packit ea1746
            bool operator()(const T* theta,
          Packit ea1746
                            const T* t,
          Packit ea1746
                            T* residuals) const {
          Packit ea1746
              const T q_0 =  cos(theta[0]) * x[0] - sin(theta[0]) * x[1] + t[0];
          Packit ea1746
              const T q_1 =  sin(theta[0]) * x[0] + cos(theta[0]) * x[1] + t[1];
          Packit ea1746
              const T f = TemplatedComputeDistortion(q_0 * q_0 + q_1 * q_1);
          Packit ea1746
              residuals[0] = y[0] - f * q_0;
          Packit ea1746
              residuals[1] = y[1] - f * q_1;
          Packit ea1746
              return true;
          Packit ea1746
            }
          Packit ea1746
          Packit ea1746
            double x[2];
          Packit ea1746
            double y[2];
          Packit ea1746
          };