NEML2 2.0.0
Loading...
Searching...
No Matches
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/misc/types.h"
32#include "neml2/tensors/jit.h"
33
34namespace neml2
35{
36// Foward declarations
37class Model;
38class LabeledAxis;
39class VariableBase;
40template <typename T>
42template <typename T>
44
46{
47public:
48 VariableStore(Model * object);
49
50 VariableStore(const VariableStore &) = delete;
54 virtual ~VariableStore() = default;
55
56 LabeledAxis & declare_axis(const std::string & name);
57
61 const LabeledAxis & input_axis() const;
63
67 const LabeledAxis & output_axis() const;
69
70 using VariableStorage = std::map<VariableName, std::unique_ptr<VariableBase>>;
71 using DerivSparsity = std::vector<std::pair<VariableBase *, const VariableBase *>>;
73 std::vector<std::tuple<VariableBase *, const VariableBase *, const VariableBase *>>;
74
77 VariableStorage & input_variables() { return _input_variables; }
78 const VariableStorage & input_variables() const { return _input_variables; }
79 VariableStorage & output_variables() { return _output_variables; }
80 const VariableStorage & output_variables() const { return _output_variables; }
82
86 const VariableBase & input_variable(const VariableName &) const;
88 const VariableBase & output_variable(const VariableName &) const;
90
92 const TensorOptions & variable_options() const { return _options; }
93
96 virtual void clear_input();
97 virtual void clear_output();
98 virtual void clear_derivatives();
100
102 virtual void zero_undefined_input();
103
110 const std::optional<DerivSparsity> & derivative_sparsity() const;
112 const std::optional<SecDerivSparsity> & second_derivative_sparsity() const;
114
118 void assign_input(const ValueMap & vals, bool assembly = false);
121 void assign_output(const ValueMap & vals, bool assembly = false);
124 void assign_output_derivatives(const DerivMap & derivs, bool assembly = false);
126
130 ValueMap collect_input(bool assembly = false) const;
133 ValueMap collect_output(bool assembly = false) const;
136 DerivMap collect_output_derivatives(bool assembly = false) const;
139 SecDerivMap collect_output_second_derivatives(bool assembly = false) const;
141
167
168protected:
174 virtual void send_variables_to(const TensorOptions & options);
175
177 template <typename T>
178 const Variable<T> & declare_input_variable(const char * name,
179 TensorShapeRef dep_intmd_dims = {},
180 bool allow_duplicate = false);
181
183 template <typename T>
184 const Variable<T> & declare_input_variable(const VariableName & name,
185 TensorShapeRef dep_intmd_dims = {},
186 bool allow_duplicate = false);
187
189 template <typename T>
190 Variable<T> & declare_output_variable(const char * name, TensorShapeRef dep_intmd_dims = {});
191
193 template <typename T>
194 Variable<T> & declare_output_variable(const VariableName & name,
195 TensorShapeRef dep_intmd_dims = {});
196
198 const VariableBase * clone_input_variable(const VariableBase & var,
199 const VariableName & new_name = {});
200
202 VariableBase * clone_output_variable(const VariableBase & var,
203 const VariableName & new_name = {});
204
206 void assign_input_stack(jit::Stack & stack);
207
209 void assign_output_stack(jit::Stack & stack, bool out, bool dout, bool d2out);
210
212 jit::Stack collect_input_stack() const;
213
215 jit::Stack collect_output_stack(bool out, bool dout, bool d2out) const;
216
217 // TensorName resolution may require declare_input_variable
218 template <typename T>
219 friend const T & resolve_tensor_name(const TensorName<T> &, Model *, const std::string &);
220
221private:
222 // Create a variable
223 template <typename T>
224 Variable<T> * create_variable(VariableStorage & variables,
225 const VariableName & name,
226 TensorShapeRef dep_intmd_dims,
227 bool allow_duplicate = false);
228
230 Model * _object;
231
233 std::map<std::string, std::unique_ptr<LabeledAxis>> _axes;
234
236 LabeledAxis & _input_axis;
237
239 LabeledAxis & _output_axis;
240
242 VariableStorage _input_variables;
243
245 VariableStorage _output_variables;
246
248 TensorOptions _options;
249
251 std::map<VariableName, Size> _input_intmd_dims;
252
254 std::map<VariableName, Size> _output_intmd_dims;
255
257 std::optional<DerivSparsity> _deriv_sparsity = std::nullopt;
258
260 std::optional<SecDerivSparsity> _secderiv_sparsity = std::nullopt;
261
263 std::optional<DerivSparsity> _deriv_sparsity_nl_sys = std::nullopt;
264
266 std::optional<SecDerivSparsity> _secderiv_sparsity_nl_sys = std::nullopt;
267};
268} // namespace neml2
The accessor containing all the information needed to access an item in a LabeledAxis.
Definition LabeledAxisAccessor.h:56
A labeled axis is used to associate layout of a tensor with human-interpretable names.
Definition LabeledAxis.h:48
The base class for all constitutive models.
Definition Model.h:70
Base class of variable.
Definition VariableBase.h:53
Definition VariableStore.h:46
Variable< T > & declare_output_variable(const char *name, TensorShapeRef dep_intmd_dims={})
Declare an output variable.
Definition VariableStore.cxx:132
friend const T & resolve_tensor_name(const TensorName< T > &, Model *, const std::string &)
Definition ParameterStore.cxx:108
SecDerivMap collect_output_second_derivatives(bool assembly=false) const
Definition VariableStore.cxx:464
virtual void zero_undefined_input()
Fill undefined input variables with zeros.
Definition VariableStore.cxx:292
VariableBase & output_variable(const VariableName &)
Definition VariableStore.cxx:244
VariableBase * clone_output_variable(const VariableBase &var, const VariableName &new_name={})
Clone a variable and put it on the output axis.
Definition VariableStore.cxx:170
virtual ~VariableStore()=default
void cache_derivative_sparsity()
Definition VariableStore.cxx:300
virtual void send_variables_to(const TensorOptions &options)
Send padding variables to options.
Definition VariableStore.cxx:263
virtual void clear_derivatives()
Definition VariableStore.cxx:285
DerivMap collect_output_derivatives(bool assembly=false) const
Definition VariableStore.cxx:454
const std::optional< SecDerivSparsity > & second_derivative_sparsity() const
Second derivative sparsity.
Definition VariableStore.cxx:337
LabeledAxis & output_axis()
Definition VariableStore.cxx:81
std::vector< std::pair< VariableBase *, const VariableBase * > > DerivSparsity
Definition VariableStore.h:71
virtual void clear_input()
Definition VariableStore.cxx:269
VariableStore(Model *object)
Definition VariableStore.cxx:39
void set_input_intmd_sizes(const VariableName &, TensorShapeRef)
Tag intermediate shapes for variables.
Definition VariableStore.cxx:504
void assign_output_stack(jit::Stack &stack, bool out, bool dout, bool d2out)
Assign stack to output variables and derivatives.
Definition VariableStore.cxx:399
VariableStorage & output_variables()
Definition VariableStore.h:79
void assign_output(const ValueMap &vals, bool assembly=false)
Definition VariableStore.cxx:355
VariableBase & input_variable(const VariableName &)
Definition VariableStore.cxx:225
VariableStore(const VariableStore &)=delete
jit::Stack collect_output_stack(bool out, bool dout, bool d2out) const
Collect stack from output variables and derivatives.
Definition VariableStore.cxx:484
ValueMap collect_output(bool assembly=false) const
Definition VariableStore.cxx:445
virtual void clear_output()
Definition VariableStore.cxx:277
const VariableStorage & input_variables() const
Definition VariableStore.h:78
std::map< VariableName, std::unique_ptr< VariableBase > > VariableStorage
Definition VariableStore.h:70
jit::Stack collect_input_stack() const
Collect stack from input variables.
Definition VariableStore.cxx:475
const Variable< T > & declare_input_variable(const char *name, TensorShapeRef dep_intmd_dims={}, bool allow_duplicate=false)
Declare an input variable.
Definition VariableStore.cxx:102
LabeledAxis & declare_axis(const std::string &name)
Definition VariableStore.cxx:48
VariableStore & operator=(const VariableStore &)=delete
const VariableStorage & output_variables() const
Definition VariableStore.h:80
VariableStore & operator=(VariableStore &&)=delete
void set_output_intmd_sizes(const VariableName &, TensorShapeRef)
Definition VariableStore.cxx:515
void cache_second_derivative_sparsity()
Cache sparsity of second derivatives.
Definition VariableStore.cxx:315
std::vector< std::tuple< VariableBase *, const VariableBase *, const VariableBase * > > SecDerivSparsity
Definition VariableStore.h:72
VariableStorage & input_variables()
Definition VariableStore.h:77
ValueMap collect_input(bool assembly=false) const
Definition VariableStore.cxx:436
void assign_input(const ValueMap &vals, bool assembly=false)
Definition VariableStore.cxx:345
VariableStore(VariableStore &&)=delete
const TensorOptions & variable_options() const
Current tensor options for variables.
Definition VariableStore.h:92
void assign_input_stack(jit::Stack &stack)
Assign stack to input variables.
Definition VariableStore.cxx:383
LabeledAxis & input_axis()
Definition VariableStore.cxx:61
void assign_output_derivatives(const DerivMap &derivs, bool assembly=false)
Definition VariableStore.cxx:365
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:155
const std::optional< DerivSparsity > & derivative_sparsity() const
Derivative sparsity.
Definition VariableStore.cxx:329
Concrete definition of a variable.
Definition VariableStore.h:41
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
LabeledAxisAccessor VariableName
Definition LabeledAxisAccessor.h:185
std::map< LabeledAxisAccessor, DerivMap > SecDerivMap
Definition map_types_fwd.h:35
c10::TensorOptions TensorOptions
Definition types.h:60
c10::ArrayRef< Size > TensorShapeRef
Definition types.h:67
The name of a tensor object that can be referenced in the input files.
Definition VariableStore.h:43