- 3.0.1 core module.
ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR > Class Template Reference

Computes the linearization of a general non-linear ControlledSystem using Automatic Differentiation with code generation. More...

#include <ADCodegenLinearizer.h>

Inheritance diagram for ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >:
ct::core::LinearSystem< STATE_DIM, CONTROL_DIM, SCALAR > ct::core::ControlledSystem< STATE_DIM, CONTROL_DIM, SCALAR > ct::core::System< STATE_DIM, SCALAR >

Public Types

typedef CppAD::AD< CppAD::cg::CG< SCALAR > > ADCGScalar
 Autodiff codegen type. More...
 
typedef ControlledSystem< STATE_DIM, CONTROL_DIM, ADCGScalarsystem_t
 type of system to be linearized More...
 
typedef DynamicsLinearizerADCG< STATE_DIM, CONTROL_DIM, ADCGScalar, ADCGScalarlinearizer_t
 type of linearizer to be used More...
 
typedef Base::state_vector_t state_vector_t
 state vector type More...
 
typedef Base::control_vector_t control_vector_t
 input vector type More...
 
typedef Base::state_matrix_t state_matrix_t
 state Jacobian type More...
 
typedef Base::state_control_matrix_t state_control_matrix_t
 input Jacobian type More...
 
- Public Types inherited from ct::core::LinearSystem< STATE_DIM, CONTROL_DIM, SCALAR >
typedef Base::time_t time_t
 
typedef StateVector< STATE_DIM, SCALARstate_vector_t
 state vector type More...
 
typedef ControlVector< CONTROL_DIM, SCALARcontrol_vector_t
 input vector type More...
 
typedef StateMatrix< STATE_DIM, SCALARstate_matrix_t
 state Jacobian type More...
 
typedef StateControlMatrix< STATE_DIM, CONTROL_DIM, SCALARstate_control_matrix_t
 input Jacobian type More...
 
- Public Types inherited from ct::core::ControlledSystem< STATE_DIM, CONTROL_DIM, SCALAR >
typedef std::shared_ptr< ControlledSystem< STATE_DIM, CONTROL_DIM, SCALAR > > Ptr
 
typedef Base::time_t time_t
 
- Public Types inherited from ct::core::System< STATE_DIM, SCALAR >
typedef SCALAR time_t
 the type of the time variable More...
 

Public Member Functions

 ADCodegenLinearizer (std::shared_ptr< system_t > nonlinearSystem, bool cacheJac=true)
 default constructor More...
 
 ADCodegenLinearizer (const ADCodegenLinearizer< STATE_DIM, CONTROL_DIM > &arg)
 copy constructor More...
 
ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR > * clone () const override
 deep cloning More...
 
const state_matrix_tgetDerivativeState (const state_vector_t &x, const control_vector_t &u, const SCALAR t=SCALAR(0.0)) override
 get the Jacobian with respect to the state More...
 
const state_control_matrix_tgetDerivativeControl (const state_vector_t &x, const control_vector_t &u, const SCALAR t=SCALAR(0.0)) override
 get the Jacobian with respect to the input More...
 
void compileJIT (const std::string &libName="ADCodegenLinearizer")
 compile just-in-time More...
 
void generateCode (const std::string &systemName, const std::string &outputDir=ct::core::CODEGEN_OUTPUT_DIR, const std::string &templateDir=ct::core::CODEGEN_TEMPLATE_DIR, const std::string &ns1="core", const std::string &ns2="generated", bool useReverse=false, bool ignoreZero=true)
 generates source code and saves it to file More...
 
const linearizer_tgetLinearizer () const
 accessor to the linearizer, e.g. for testing More...
 
- Public Member Functions inherited from ct::core::LinearSystem< STATE_DIM, CONTROL_DIM, SCALAR >
 LinearSystem (const ct::core::SYSTEM_TYPE &type=ct::core::SYSTEM_TYPE::GENERAL)
 default constructor More...
 
virtual ~LinearSystem ()
 destructor More...
 
virtual void computeControlledDynamics (const state_vector_t &state, const time_t &t, const control_vector_t &control, state_vector_t &derivative) override
 compute the system dynamics More...
 
virtual const state_matrix_tgetDerivativeState (const state_vector_t &x, const control_vector_t &u, const time_t t=time_t(0.0))=0
 get the A matrix of a linear system More...
 
virtual const state_control_matrix_tgetDerivativeControl (const state_vector_t &x, const control_vector_t &u, const time_t t=time_t(0.0))=0
 get the B matrix of a linear system More...
 
virtual void getDerivatives (state_matrix_t &A, state_control_matrix_t &B, const state_vector_t &x, const control_vector_t &u, const time_t t=time_t(0.0))
 Get both linear system matrices A and B in one call. More...
 
- Public Member Functions inherited from ct::core::ControlledSystem< STATE_DIM, CONTROL_DIM, SCALAR >
 ControlledSystem (const SYSTEM_TYPE &type=SYSTEM_TYPE::GENERAL)
 default constructor More...
 
 ControlledSystem (std::shared_ptr< ct::core::Controller< STATE_DIM, CONTROL_DIM, SCALAR >> controller, const SYSTEM_TYPE &type=SYSTEM_TYPE::GENERAL)
 constructor More...
 
 ControlledSystem (const ControlledSystem &arg)
 copy constructor More...
 
virtual ~ControlledSystem ()
 destructor More...
 
void setController (const std::shared_ptr< Controller< STATE_DIM, CONTROL_DIM, SCALAR >> &controller)
 set a new controller More...
 
void getController (std::shared_ptr< Controller< STATE_DIM, CONTROL_DIM, SCALAR >> &controller) const
 get the controller instance More...
 
std::shared_ptr< Controller< STATE_DIM, CONTROL_DIM, SCALAR > > getController ()
 get the controller instace More...
 
virtual void computeDynamics (const StateVector< STATE_DIM, SCALAR > &state, const time_t &t, StateVector< STATE_DIM, SCALAR > &derivative) override
 compute the dynamics of the system More...
 
virtual void computeControlledDynamics (const StateVector< STATE_DIM, SCALAR > &state, const time_t &t, const ControlVector< CONTROL_DIM, SCALAR > &control, StateVector< STATE_DIM, SCALAR > &derivative)=0
 
ControlVector< CONTROL_DIM, SCALARgetLastControlAction ()
 
- Public Member Functions inherited from ct::core::System< STATE_DIM, SCALAR >
 System (const SYSTEM_TYPE &type=SYSTEM_TYPE::GENERAL)
 default constructor More...
 
 System (const System &other)
 copy constructor More...
 
virtual ~System ()
 destructor More...
 
virtual void computeDynamics (const StateVector< STATE_DIM, SCALAR > &state, const time_t &t, StateVector< STATE_DIM, SCALAR > &derivative)=0
 computes the system dynamics More...
 
SYSTEM_TYPE getType () const
 get the type of system More...
 
virtual bool isSymplectic () const
 Determines if the system is in symplectic form. More...
 

Public Attributes

EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef LinearSystem< STATE_DIM, CONTROL_DIM, SCALARBase
 Base class type. More...
 
- Public Attributes inherited from ct::core::LinearSystem< STATE_DIM, CONTROL_DIM, SCALAR >
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef ControlledSystem< STATE_DIM, CONTROL_DIM, SCALARBase
 
- Public Attributes inherited from ct::core::ControlledSystem< STATE_DIM, CONTROL_DIM, SCALAR >
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef System< STATE_DIM, SCALARBase
 
- Public Attributes inherited from ct::core::System< STATE_DIM, SCALAR >
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef SCALAR S
 the scalar type More...
 

Additional Inherited Members

- Protected Attributes inherited from ct::core::ControlledSystem< STATE_DIM, CONTROL_DIM, SCALAR >
std::shared_ptr< Controller< STATE_DIM, CONTROL_DIM, SCALAR > > controller_
 the controller instance More...
 
ControlVector< CONTROL_DIM, SCALARcontrolAction_
 
- Protected Attributes inherited from ct::core::System< STATE_DIM, SCALAR >
SYSTEM_TYPE type_
 type of system More...
 

Detailed Description

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
class ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >

Computes the linearization of a general non-linear ControlledSystem using Automatic Differentiation with code generation.

This class takes a non-linear ControlledSystem $ \dot{x} = f(x,u,t) $ and computes the linearization around a certain point $ x = x_s $, $ u = u_s $.

\[ \dot{x} = A x + B u \]

where

\[ \begin{aligned} A &= \frac{df}{dx} |_{x=x_s, u=u_s} \\ B &= \frac{df}{du} |_{x=x_s, u=u_s} \end{aligned} \]

Note
This is generally the most efficient and most accurate way to generate the linearization of system dynamics.
Warning
You should ensure that your ControlledSystem is templated on the scalar type and does not contain branching (if/else statements, switch cases etc.)

The linearization is computed using Auto Differentiation which is then used by a code generator framework to generate efficient code. For convenience just-in-time compilation is provided. However, you can also generate source code directly.

Unit test CodegenTests.cpp illustrates the use of the ADCodeGenLinearizer.

Warning
Depending on the complexity of your system, just-in-time compilation (compileJIT()) can be slow. In that case generate a source code file
Template Parameters
STATE_DIMdimension of state vector
CONTROL_DIMdimension of control vector
SCALARprimitive type of resultant linear system

Member Typedef Documentation

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef CppAD::AD<CppAD::cg::CG<SCALAR> > ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::ADCGScalar

Autodiff codegen type.

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef ControlledSystem<STATE_DIM, CONTROL_DIM, ADCGScalar> ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::system_t

type of system to be linearized

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef DynamicsLinearizerADCG<STATE_DIM, CONTROL_DIM, ADCGScalar, ADCGScalar> ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::linearizer_t

type of linearizer to be used

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef Base::state_vector_t ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::state_vector_t

state vector type

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef Base::control_vector_t ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::control_vector_t

input vector type

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef Base::state_matrix_t ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::state_matrix_t

state Jacobian type

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
typedef Base::state_control_matrix_t ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::state_control_matrix_t

input Jacobian type

Constructor & Destructor Documentation

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::ADCodegenLinearizer ( std::shared_ptr< system_t nonlinearSystem,
bool  cacheJac = true 
)
inline

default constructor

Initializes an Auto-Diff codegen linearizer with a ControlledSystem

Parameters
nonlinearSystemnon-linear system instance
cacheJacif true, caches the Jacobians to prevent recomputation for the same state/input
template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::ADCodegenLinearizer ( const ADCodegenLinearizer< STATE_DIM, CONTROL_DIM > &  arg)
inline

copy constructor

Member Function Documentation

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
ADCodegenLinearizer<STATE_DIM, CONTROL_DIM, SCALAR>* ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::clone ( ) const
inlineoverridevirtual
template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
const state_matrix_t& ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::getDerivativeState ( const state_vector_t x,
const control_vector_t u,
const SCALAR  t = SCALAR(0.0) 
)
inlineoverride

get the Jacobian with respect to the state

This computes the linearization of the system with respect to the state at a given point $ x=x_s $, $ u=u_s $, i.e. it computes

\[ A = \frac{df}{dx} |_{x=x_s, u=u_s} \]

Warning
Call compileJIT() before calling this function.
Parameters
xstate to linearize at
ucontrol to linearize at
ttime
Returns
Jacobian wrt state
template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
const state_control_matrix_t& ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::getDerivativeControl ( const state_vector_t x,
const control_vector_t u,
const SCALAR  t = SCALAR(0.0) 
)
inlineoverride

get the Jacobian with respect to the input

This computes the linearization of the system with respect to the input at a given point $ x=x_s $, $ u=u_s $, i.e. it computes

\[ B = \frac{df}{du} |_{x=x_s, u=u_s} \]

Warning
Call compileJIT() before calling this function.
Parameters
xstate to linearize at
ucontrol to linearize at
ttime
Returns
Jacobian wrt input
template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
void ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::compileJIT ( const std::string &  libName = "ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >")
inline

compile just-in-time

Generates the source code, compiles it and dynamically loads the resulting library.

Note
If this function takes a long time, consider generating the source code using generateCode() and compile it before runtime.
template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
void ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::generateCode ( const std::string &  systemName,
const std::string &  outputDir = ct::core::CODEGEN_OUTPUT_DIR,
const std::string &  templateDir = ct::core::CODEGEN_TEMPLATE_DIR,
const std::string &  ns1 = "core",
const std::string &  ns2 = "generated",
bool  useReverse = false,
bool  ignoreZero = true 
)
inline

generates source code and saves it to file

This generates source code for computing the system linearization and saves it to file. This function uses a template file in which it replaces two placeholders, each identified as the string "AUTOGENERATED_CODE_PLACEHOLDER"

Parameters
systemNamename of the resulting LinearSystem class
outputDiroutput directory
templateDirdirectory of the template file
ns1first layer namespace
ns2second layer namespace
useReverseif true, uses Auto-Diff reverse mode
ignoreZeroif true, zero entries are not assigned zero
template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
const linearizer_t& ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::getLinearizer ( ) const
inline

accessor to the linearizer, e.g. for testing

Member Data Documentation

template<size_t STATE_DIM, size_t CONTROL_DIM, typename SCALAR = double>
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef LinearSystem<STATE_DIM, CONTROL_DIM, SCALAR> ct::core::ADCodegenLinearizer< STATE_DIM, CONTROL_DIM, SCALAR >::Base

Base class type.


The documentation for this class was generated from the following file: