NEML2 2.0.0
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
VariableStore.h
1// Copyright 2024, UChicago Argonne, LLC
2// All Rights Reserved
3// Software Name: NEML2 -- the New Engineering material Model Library, version 2
4// By: Argonne National Laboratory
5// OPEN SOURCE LICENSE (MIT)
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in
15// all copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23// THE SOFTWARE.
24
25#pragma once
26
27#include <memory>
28
29#include "neml2/models/map_types_fwd.h"
30#include "neml2/base/LabeledAxisAccessor.h"
31#include "neml2/jit/types.h"
32
33namespace neml2
34{
35// Foward declarations
36class Model;
37class LabeledAxis;
38class VariableBase;
39template <typename T>
40class Variable;
41template <typename T>
42struct TensorName;
43
45{
46public:
47 VariableStore(Model * object);
48
49 VariableStore(const VariableStore &) = delete;
53 virtual ~VariableStore() = default;
54
55 LabeledAxis & declare_axis(const std::string & name);
56
58 virtual void setup_layout();
59
62 LabeledAxis & input_axis() { return _input_axis; }
63 const LabeledAxis & input_axis() const { return _input_axis; }
65
68 LabeledAxis & output_axis() { return _output_axis; }
69 const LabeledAxis & output_axis() const { return _output_axis; }
71
72 using VariableStorage = std::map<VariableName, std::unique_ptr<VariableBase>>;
73
76 VariableStorage & input_variables() { return _input_variables; }
77 const VariableStorage & input_variables() const { return _input_variables; }
78 VariableStorage & output_variables() { return _output_variables; }
79 const VariableStorage & output_variables() const { return _output_variables; }
81
85 const VariableBase & input_variable(const VariableName &) const;
87 const VariableBase & output_variable(const VariableName &) const;
89
91 const TensorOptions & variable_options() const { return _options; }
92
95 virtual void clear_input();
96 virtual void clear_output();
98
101 virtual void zero_input();
102 virtual void zero_output();
104
107 void assign_input(const ValueMap & vals);
109 void assign_input(ValueMap && vals);
111 void assign_output(const ValueMap & vals);
113 void assign_output_derivatives(const DerivMap & derivs);
115
118 ValueMap collect_input() const;
119 ValueMap collect_output() const;
125
126protected:
132 virtual void send_variables_to(const TensorOptions & options);
133
135 template <typename T>
136 const Variable<T> & declare_input_variable(const char * name, TensorShapeRef list_shape = {});
137
139 template <typename T>
140 const Variable<T> & declare_input_variable(const VariableName & name,
141 TensorShapeRef list_shape = {});
142
144 template <typename T>
145 Variable<T> & declare_output_variable(const char * name, TensorShapeRef list_shape = {});
146
148 template <typename T>
149 Variable<T> & declare_output_variable(const VariableName & name, TensorShapeRef list_shape = {});
150
152 const VariableBase * clone_input_variable(const VariableBase & var,
153 const VariableName & new_name = {});
154
156 VariableBase * clone_output_variable(const VariableBase & var,
157 const VariableName & new_name = {});
158
160 void assign_input_stack(jit::Stack & stack);
161
163 void assign_output_stack(jit::Stack & stack, bool out, bool dout, bool d2out);
164
166 jit::Stack collect_input_stack() const;
167
169 jit::Stack collect_output_stack(bool out, bool dout, bool d2out) const;
170
171 // TensorName resolution may require declare_input_variable
172 template <typename T>
173 friend const T & resolve_tensor_name(const TensorName<T> &, Model *, const std::string &);
174
175private:
176 // Create a variable
177 template <typename T>
178 Variable<T> * create_variable(VariableStorage & variables,
179 const VariableName & name,
180 TensorShapeRef list_shape);
181
183 Model * _object;
184
186 std::map<std::string, std::unique_ptr<LabeledAxis>> _axes;
187
189 LabeledAxis & _input_axis;
190
192 LabeledAxis & _output_axis;
193
195 VariableStorage _input_variables;
196
198 VariableStorage _output_variables;
199
201 TensorOptions _options;
202};
203} // namespace neml2
A labeled axis used to associate layout of a tensor with human-interpretable names.
Definition LabeledAxis.h:47
The base class for all constitutive models.
Definition Model.h:97
Base class of variable.
Definition Variable.h:52
friend const T & resolve_tensor_name(const TensorName< T > &, Model *, const std::string &)
Definition ParameterStore.cxx:107
void assign_output_derivatives(const DerivMap &derivs)
Assign variable derivatives.
Definition VariableStore.cxx:280
VariableBase & output_variable(const VariableName &)
Definition VariableStore.cxx:200
virtual void zero_input()
Definition VariableStore.cxx:241
VariableBase * clone_output_variable(const VariableBase &var, const VariableName &new_name={})
Clone a variable and put it on the output axis.
Definition VariableStore.cxx:135
ValueMap collect_output() const
Definition VariableStore.cxx:407
void assign_output(const ValueMap &vals)
Assign output variable values.
Definition VariableStore.cxx:273
Variable< T > & declare_output_variable(const char *name, TensorShapeRef list_shape={})
Declare an output variable.
Definition VariableStore.cxx:94
virtual ~VariableStore()=default
virtual void send_variables_to(const TensorOptions &options)
Send padding variables to options.
Definition VariableStore.cxx:219
LabeledAxis & output_axis()
Definition VariableStore.h:68
SecDerivMap collect_output_second_derivatives() const
Collect variable second derivatives.
Definition VariableStore.cxx:425
virtual void clear_input()
Definition VariableStore.cxx:225
VariableStore(Model *object)
Definition VariableStore.cxx:36
void assign_output_stack(jit::Stack &stack, bool out, bool dout, bool d2out)
Assign stack to output variables and derivatives.
Definition VariableStore.cxx:310
ValueMap collect_input() const
Definition VariableStore.cxx:398
VariableStorage & output_variables()
Definition VariableStore.h:78
VariableBase & input_variable(const VariableName &)
Definition VariableStore.cxx:181
VariableStore(const VariableStore &)=delete
virtual void zero_output()
Definition VariableStore.cxx:249
jit::Stack collect_output_stack(bool out, bool dout, bool d2out) const
Collect stack from output variables and derivatives.
Definition VariableStore.cxx:445
DerivMap collect_output_derivatives() const
Collect variable derivatives.
Definition VariableStore.cxx:416
const LabeledAxis & input_axis() const
Definition VariableStore.h:63
virtual void clear_output()
Definition VariableStore.cxx:233
virtual void setup_layout()
Setup the layout of all the registered axes.
Definition VariableStore.cxx:58
const VariableStorage & input_variables() const
Definition VariableStore.h:77
std::map< VariableName, std::unique_ptr< VariableBase > > VariableStorage
Definition VariableStore.h:72
const Variable< T > & declare_input_variable(const char *name, TensorShapeRef list_shape={})
Declare an input variable.
Definition VariableStore.cxx:66
jit::Stack collect_input_stack() const
Collect stack from input variables.
Definition VariableStore.cxx:434
LabeledAxis & declare_axis(const std::string &name)
Definition VariableStore.cxx:45
VariableStore & operator=(const VariableStore &)=delete
void assign_input(const ValueMap &vals)
Definition VariableStore.cxx:257
const VariableStorage & output_variables() const
Definition VariableStore.h:79
VariableStore & operator=(VariableStore &&)=delete
VariableStorage & input_variables()
Definition VariableStore.h:76
const LabeledAxis & output_axis() const
Definition VariableStore.h:69
VariableStore(VariableStore &&)=delete
const TensorOptions & variable_options() const
Current tensor options for variables.
Definition VariableStore.h:91
void assign_input_stack(jit::Stack &stack)
Assign stack to input variables.
Definition VariableStore.cxx:291
LabeledAxis & input_axis()
Definition VariableStore.h:62
const VariableBase * clone_input_variable(const VariableBase &var, const VariableName &new_name={})
Clone a variable and put it on the input axis.
Definition VariableStore.cxx:120
Concrete definition of a variable.
Definition Variable.h:236
Definition DiagnosticsInterface.cxx:30
std::map< LabeledAxisAccessor, Tensor > ValueMap
Definition map_types_fwd.h:33
std::map< LabeledAxisAccessor, ValueMap > DerivMap
Definition map_types_fwd.h:34
std::string name(ElasticConstant p)
Definition ElasticityConverter.cxx:30
std::map< LabeledAxisAccessor, DerivMap > SecDerivMap
Definition map_types_fwd.h:35
LabeledAxisAccessor VariableName
Definition LabeledAxisAccessor.h:185
c10::TensorOptions TensorOptions
Definition types.h:63
c10::ArrayRef< Size > TensorShapeRef
Definition types.h:72
The name of a tensor object that can be referenced in the input files.
Definition TensorName.h:46