NEML2 2.0.0
Loading...
Searching...
No Matches
VariableStore Class Reference

#include <VariableStore.h>

Inheritance diagram for VariableStore:

Public Types

using VariableStorage = std::map<VariableName, std::unique_ptr<VariableBase>>
 
using DerivSparsity = std::vector<std::pair<VariableBase *, const VariableBase *>>
 
using SecDerivSparsity
 

Public Member Functions

 VariableStore (Model *object)
 
 VariableStore (const VariableStore &)=delete
 
 VariableStore (VariableStore &&)=delete
 
VariableStoreoperator= (const VariableStore &)=delete
 
VariableStoreoperator= (VariableStore &&)=delete
 
virtual ~VariableStore ()=default
 
LabeledAxisdeclare_axis (const std::string &name)
 
const TensorOptionsvariable_options () const
 Current tensor options for variables.
 
virtual void zero_undefined_input ()
 Fill undefined input variables with zeros.
 
LabeledAxisinput_axis ()
 
const LabeledAxisinput_axis () const
 
LabeledAxisoutput_axis ()
 
const LabeledAxisoutput_axis () const
 
VariableStorageinput_variables ()
 
const VariableStorageinput_variables () const
 
VariableStorageoutput_variables ()
 
const VariableStorageoutput_variables () const
 
VariableBaseinput_variable (const VariableName &)
 
const VariableBaseinput_variable (const VariableName &) const
 
VariableBaseoutput_variable (const VariableName &)
 
const VariableBaseoutput_variable (const VariableName &) const
 
virtual void clear_input ()
 
virtual void clear_output ()
 
virtual void clear_derivatives ()
 
void cache_derivative_sparsity ()
 
void cache_second_derivative_sparsity ()
 Cache sparsity of second derivatives.
 
const std::optional< DerivSparsity > & derivative_sparsity () const
 Derivative sparsity.
 
const std::optional< SecDerivSparsity > & second_derivative_sparsity () const
 Second derivative sparsity.
 
void assign_input (const ValueMap &vals, bool assembly=false)
 
void assign_output (const ValueMap &vals, bool assembly=false)
 
void assign_output_derivatives (const DerivMap &derivs, bool assembly=false)
 
ValueMap collect_input (bool assembly=false) const
 
ValueMap collect_output (bool assembly=false) const
 
DerivMap collect_output_derivatives (bool assembly=false) const
 
SecDerivMap collect_output_second_derivatives (bool assembly=false) const
 
void set_input_intmd_sizes (const VariableName &, TensorShapeRef)
 Tag intermediate shapes for variables.
 
void set_output_intmd_sizes (const VariableName &, TensorShapeRef)
 

Protected Member Functions

virtual void send_variables_to (const TensorOptions &options)
 Send padding variables to options.
 
template<typename T >
const Variable< T > & declare_input_variable (const char *name, TensorShapeRef dep_intmd_dims={}, bool allow_duplicate=false)
 Declare an input variable.
 
template<typename T >
const Variable< T > & declare_input_variable (const VariableName &name, TensorShapeRef dep_intmd_dims={}, bool allow_duplicate=false)
 Declare an input variable.
 
template<typename T >
Variable< T > & declare_output_variable (const char *name, TensorShapeRef dep_intmd_dims={})
 Declare an output variable.
 
template<typename T >
Variable< T > & declare_output_variable (const VariableName &name, TensorShapeRef dep_intmd_dims={})
 Declare an output variable.
 
const VariableBaseclone_input_variable (const VariableBase &var, const VariableName &new_name={})
 Clone a variable and put it on the input axis.
 
VariableBaseclone_output_variable (const VariableBase &var, const VariableName &new_name={})
 Clone a variable and put it on the output axis.
 
void assign_input_stack (jit::Stack &stack)
 Assign stack to input variables.
 
void assign_output_stack (jit::Stack &stack, bool out, bool dout, bool d2out)
 Assign stack to output variables and derivatives.
 
jit::Stack collect_input_stack () const
 Collect stack from input variables.
 
jit::Stack collect_output_stack (bool out, bool dout, bool d2out) const
 Collect stack from output variables and derivatives.
 

Friends

template<typename T >
const T & resolve_tensor_name (const TensorName< T > &tn, Model *caller, const std::string &pname)
 

Member Typedef Documentation

◆ DerivSparsity

using DerivSparsity = std::vector<std::pair<VariableBase *, const VariableBase *>>

◆ SecDerivSparsity

Initial value:
std::vector<std::tuple<VariableBase *, const VariableBase *, const VariableBase *>>

◆ VariableStorage

using VariableStorage = std::map<VariableName, std::unique_ptr<VariableBase>>

Constructor & Destructor Documentation

◆ VariableStore() [1/3]

VariableStore ( Model * object)

◆ VariableStore() [2/3]

VariableStore ( const VariableStore & )
delete

◆ VariableStore() [3/3]

◆ ~VariableStore()

virtual ~VariableStore ( )
virtualdefault

Member Function Documentation

◆ assign_input()

void assign_input ( const ValueMap & vals,
bool assembly = false )

Assign input variable values assembly indicates if vals are in assembly format

◆ assign_input_stack()

void assign_input_stack ( jit::Stack & stack)
protected

Assign stack to input variables.

◆ assign_output()

void assign_output ( const ValueMap & vals,
bool assembly = false )

Assign output variable values assembly indicates if vals are in assembly format

◆ assign_output_derivatives()

void assign_output_derivatives ( const DerivMap & derivs,
bool assembly = false )

Assign variable derivatives assembly indicates if derivs are in assembly format

◆ assign_output_stack()

void assign_output_stack ( jit::Stack & stack,
bool out,
bool dout,
bool d2out )
protected

Assign stack to output variables and derivatives.

◆ cache_derivative_sparsity()

void cache_derivative_sparsity ( )

Cache sparsity of first derivatives

◆ cache_second_derivative_sparsity()

void cache_second_derivative_sparsity ( )

Cache sparsity of second derivatives.

◆ clear_derivatives()

void clear_derivatives ( )
virtual

◆ clear_input()

void clear_input ( )
virtual

Release allocated tensor

Reimplemented in Model.

◆ clear_output()

void clear_output ( )
virtual

Reimplemented in Model.

◆ clone_input_variable()

const VariableBase * clone_input_variable ( const VariableBase & var,
const VariableName & new_name = {} )
protected

Clone a variable and put it on the input axis.

◆ clone_output_variable()

VariableBase * clone_output_variable ( const VariableBase & var,
const VariableName & new_name = {} )
protected

Clone a variable and put it on the output axis.

◆ collect_input()

ValueMap collect_input ( bool assembly = false) const

Collect input variable values assembly indicates if the returned map should be in assembly format

◆ collect_input_stack()

jit::Stack collect_input_stack ( ) const
protected

Collect stack from input variables.

◆ collect_output()

ValueMap collect_output ( bool assembly = false) const

Collect output variable values assembly indicates if the returned map should be in assembly format

◆ collect_output_derivatives()

DerivMap collect_output_derivatives ( bool assembly = false) const

Collect variable derivatives assembly indicates if the returned map should be in assembly format

◆ collect_output_second_derivatives()

SecDerivMap collect_output_second_derivatives ( bool assembly = false) const

Collect variable second derivatives assembly indicates if the returned map should be in assembly format

◆ collect_output_stack()

jit::Stack collect_output_stack ( bool out,
bool dout,
bool d2out ) const
protected

Collect stack from output variables and derivatives.

◆ declare_axis()

LabeledAxis & declare_axis ( const std::string & name)

◆ declare_input_variable() [1/2]

template<typename T >
const Variable< T > & declare_input_variable ( const char * name,
TensorShapeRef dep_intmd_dims = {},
bool allow_duplicate = false )
protected

Declare an input variable.

◆ declare_input_variable() [2/2]

template<typename T >
const Variable< T > & declare_input_variable ( const VariableName & name,
TensorShapeRef dep_intmd_dims = {},
bool allow_duplicate = false )
protected

Declare an input variable.

◆ declare_output_variable() [1/2]

template<typename T >
Variable< T > & declare_output_variable ( const char * name,
TensorShapeRef dep_intmd_dims = {} )
protected

Declare an output variable.

◆ declare_output_variable() [2/2]

template<typename T >
Variable< T > & declare_output_variable ( const VariableName & name,
TensorShapeRef dep_intmd_dims = {} )
protected

Declare an output variable.

◆ derivative_sparsity()

const std::optional< VariableStore::DerivSparsity > & derivative_sparsity ( ) const

Derivative sparsity.

◆ input_axis() [1/2]

LabeledAxis & input_axis ( )

Input axis describing the assembly layout of input variables

◆ input_axis() [2/2]

const LabeledAxis & input_axis ( ) const

◆ input_variable() [1/2]

VariableBase & input_variable ( const VariableName & name)

Lookup a variable by name

◆ input_variable() [2/2]

const VariableBase & input_variable ( const VariableName & name) const

◆ input_variables() [1/2]

VariableStorage & input_variables ( )
inline

Variables

◆ input_variables() [2/2]

const VariableStorage & input_variables ( ) const
inline

◆ operator=() [1/2]

VariableStore & operator= ( const VariableStore & )
delete

◆ operator=() [2/2]

VariableStore & operator= ( VariableStore && )
delete

◆ output_axis() [1/2]

LabeledAxis & output_axis ( )

Output axis describing the assembly layout of output variables

◆ output_axis() [2/2]

const LabeledAxis & output_axis ( ) const

◆ output_variable() [1/2]

VariableBase & output_variable ( const VariableName & name)

◆ output_variable() [2/2]

const VariableBase & output_variable ( const VariableName & name) const

◆ output_variables() [1/2]

VariableStorage & output_variables ( )
inline

◆ output_variables() [2/2]

const VariableStorage & output_variables ( ) const
inline

◆ second_derivative_sparsity()

const std::optional< VariableStore::SecDerivSparsity > & second_derivative_sparsity ( ) const

Second derivative sparsity.

◆ send_variables_to()

void send_variables_to ( const TensorOptions & options)
protectedvirtual

Send padding variables to options.

Parameters
optionsThe target options

◆ set_input_intmd_sizes()

void set_input_intmd_sizes ( const VariableName & name,
TensorShapeRef shape )

Tag intermediate shapes for variables.

This is needed for two purposes:

  1. By default we initialize undefined input variables to zero before evaluating the model. If a variable is tagged with an non-empty intermediate shape, the zero tensor will be created with that shape.
  2. When using input/output axis for assembly, we need to know the intermediate sizes of each variable to correctly convert between variable format and assembly format. Variables are added to the LabeledAxis assuming zero intermediate dimension. If the actual intermediate shape is different, we need to use this method to inform the LabeledAxis about the correct shapes.
Note
This manual tagging is only necessary for the external-facing host models. We have the appropriate caching mechanism for sub-models (e.g., inside a ComposedModel) when they are being evaluated. In other words, this manual tagging is only necessary if variable intermediate shapes are needed before any model evaluation.
Warning
We spend no effort on verifying the correctness of the tagged shapes. It is the user's responsibility to ensure the correctness of the tagged shapes.

◆ set_output_intmd_sizes()

void set_output_intmd_sizes ( const VariableName & name,
TensorShapeRef shape )

◆ variable_options()

const TensorOptions & variable_options ( ) const
inline

Current tensor options for variables.

◆ zero_undefined_input()

void zero_undefined_input ( )
virtual

Fill undefined input variables with zeros.

Reimplemented in Model.

Friends And Related Symbol Documentation

◆ resolve_tensor_name

template<typename T >
const T & resolve_tensor_name ( const TensorName< T > & tn,
Model * caller,
const std::string & pname )
friend