https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | List of all members
Moose::LibtorchActorNeuralNet Class Reference

Feed-forward actor network coupled to a Gaussian or Beta action distribution. More...

#include <LibtorchActorNeuralNet.h>

Inheritance diagram for Moose::LibtorchActorNeuralNet:
[legend]

Public Member Functions

 LibtorchActorNeuralNet (const std::string name, const unsigned int num_inputs, const unsigned int num_outputs, const std::vector< unsigned int > &num_neurons_per_layer, const std::vector< std::string > &activation_function={"relu"}, const std::vector< Real > &minimum_values={}, const std::vector< Real > &maximum_values={}, const torch::DeviceType device_type=torch::kCPU, const torch::ScalarType scalar_type=torch::kDouble, const bool build_on_construct=true, const std::vector< Real > &input_shift_factors={}, const std::vector< Real > &input_scaling_factors={}, const std::vector< Real > &output_scaling_factors={}, const bool state_independent_std=true)
 Build an actor network with either a Gaussian or Beta action distribution.
 
 LibtorchActorNeuralNet (const Moose::LibtorchActorNeuralNet &nn, const bool build_on_construct=true)
 Copy-construct an actor network.
 
virtual torch::Tensor forward (const torch::Tensor &x) override
 Run a forward pass through the actor body.
 
virtual torch::Tensor evaluate (torch::Tensor &input, bool sampled, c10::optional< at::Generator > generator=c10::nullopt)
 Evaluate the actor and either sample from it or use its deterministic action.
 
virtual torch::Tensor sample (c10::optional< at::Generator > generator=c10::nullopt)
 Sample an action from the already-reset distribution.
 
virtual void constructNeuralNetwork () override
 Construct the actor body and action-distribution modules.
 
const LibtorchActionDistribution & actionDistribution () const
 Return the active action distribution as the common base type.
 
LibtorchActionDistribution & actionDistribution ()
 Return the active action distribution as the common base type.
 
const LibtorchGaussianActionDistribution * gaussianActionDistributionPtr () const
 Return the Gaussian action distribution pointer, or nullptr for bounded actors.
 
LibtorchGaussianActionDistribution * gaussianActionDistributionPtr ()
 Return the Gaussian action distribution pointer, or nullptr for bounded actors.
 
const LibtorchGaussianActionDistribution & gaussianActionDistribution () const
 Return the Gaussian action distribution reference.
 
LibtorchGaussianActionDistribution & gaussianActionDistribution ()
 Return the Gaussian action distribution reference.
 
const LibtorchBetaActionDistribution * betaActionDistributionPtr () const
 Return the Beta action distribution pointer, or nullptr for Gaussian actors.
 
LibtorchBetaActionDistribution * betaActionDistributionPtr ()
 Return the Beta action distribution pointer, or nullptr for Gaussian actors.
 
const LibtorchBetaActionDistribution & betaActionDistribution () const
 Return the Beta action distribution reference.
 
LibtorchBetaActionDistribution & betaActionDistribution ()
 Return the Beta action distribution reference.
 
bool stateIndependentStd () const
 Return whether the Gaussian standard deviation ignores the current actor features.
 
const std::vector< Real > & minValues () const
 Return the configured lower action bounds.
 
const std::vector< Real > & maxValues () const
 Return the configured upper action bounds.
 
void resetDistributionParams (torch::Tensor input)
 Refresh the cached distribution parameters from a fresh input tensor.
 
torch::Tensor logProbability (const torch::Tensor &other)
 Evaluate the log-probability of an action under the current actor state.
 
torch::Tensor entropy ()
 Compute the entropy of the current action distribution.
 
virtual void initializeNeuralNetwork (c10::optional< at::Generator > generator=c10::nullopt) override
 Initialize the actor body and action-distribution parameters.
 
virtual void addLayer (const std::string &layer_name, const std::unordered_map< std::string, unsigned int > &parameters)
 
const std::string & name () const
 
unsigned int numInputs () const
 
unsigned int numOutputs () const
 
unsigned int numHiddenLayers () const
 
const std::vector< unsigned int > & numNeuronsPerLayer () const
 
const MultiMooseEnum & activationFunctions () const
 
torch::DeviceType deviceType () const
 
torch::ScalarType dataType () const
 
const std::vector< Real > & inputShiftFactors () const
 
const std::vector< Real > & inputScalingFactors () const
 
const std::vector< Real > & outputScalingFactors () const
 
void synchronizeAffineFactorsFromBuffers ()
 
Real determineGain (const std::string &activation)
 
void store (nlohmann::json &json) const
 

Protected Member Functions

void initializeAffineBuffers ()
 
virtual torch::Tensor preprocessInput (const torch::Tensor &x) const
 
virtual torch::Tensor scaleOutput (const torch::Tensor &y) const
 

Static Protected Member Functions

static std::vector< Real > setAffineFactors (const std::vector< Real > &factors, unsigned int expected_size, Real default_value, const std::string &factor_name)
 

Protected Attributes

const std::vector< Real > _minimum_values
 Lower action bounds used by bounded actor distributions.
 
const std::vector< Real > _maximum_values
 Upper action bounds used by bounded actor distributions.
 
const bool _state_independent_std
 Whether the Gaussian std ignores the current actor features.
 
std::shared_ptr< LibtorchActionDistribution > _action_distribution
 Action-distribution module attached to the actor output.
 
const std::string _name
 
std::vector< torch::nn::Linear > _weights
 
const unsigned int _num_inputs
 
const unsigned int _num_outputs
 
const std::vector< unsigned int > _num_neurons_per_layer
 
MultiMooseEnum _activation_function
 
const torch::DeviceType _device_type
 
const torch::ScalarType _data_type
 
std::vector< Real > _input_shift_factors
 
std::vector< Real > _input_scaling_factors
 
std::vector< Real > _output_scaling_factors
 
torch::Tensor _input_shift_tensor
 
torch::Tensor _input_scale_tensor
 
torch::Tensor _output_scale_tensor
 

Detailed Description

Feed-forward actor network coupled to a Gaussian or Beta action distribution.

Definition at line 24 of file LibtorchActorNeuralNet.h.

Constructor & Destructor Documentation

◆ LibtorchActorNeuralNet() [1/2]

Moose::LibtorchActorNeuralNet::LibtorchActorNeuralNet ( const std::string  name,
const unsigned int  num_inputs,
const unsigned int  num_outputs,
const std::vector< unsigned int > &  num_neurons_per_layer,
const std::vector< std::string > &  activation_function = {"relu"},
const std::vector< Real > &  minimum_values = {},
const std::vector< Real > &  maximum_values = {},
const torch::DeviceType  device_type = torch::kCPU,
const torch::ScalarType  scalar_type = torch::kDouble,
const bool  build_on_construct = true,
const std::vector< Real > &  input_shift_factors = {},
const std::vector< Real > &  input_scaling_factors = {},
const std::vector< Real > &  output_scaling_factors = {},
const bool  state_independent_std = true 
)

Build an actor network with either a Gaussian or Beta action distribution.

Parameters
nameName of the neural network module.
num_inputsNumber of actor inputs.
num_outputsNumber of action outputs.
num_neurons_per_layerHidden-layer widths.
activation_functionHidden-layer activation names.
minimum_valuesOptional lower action bounds. Leave empty for Gaussian actions.
maximum_valuesOptional upper action bounds. Leave empty for Gaussian actions.
device_typeTorch device used by the module.
scalar_typeTorch scalar type used by the module.
build_on_constructWhether to build the torch modules right away.
input_shift_factorsOptional affine input shifts.
input_scaling_factorsOptional affine input scales.
output_scaling_factorsOptional per-action scaling in physical units.
state_independent_stdWhether the Gaussian std should ignore the current state.

Definition at line 64 of file LibtorchActorNeuralNet.C.

80 num_inputs,
81 num_outputs,
82 num_neurons_per_layer,
83 activation_function,
84 device_type,
85 data_type,
86 false,
87 input_shift_factors,
88 input_scaling_factors,
89 output_scaling_factors),
90 _minimum_values(minimum_values),
91 _maximum_values(maximum_values),
92 _state_independent_std(state_independent_std)
93{
94 const bool has_minimum_values = !_minimum_values.empty();
95 const bool has_maximum_values = !_maximum_values.empty();
96 if (has_minimum_values != has_maximum_values)
97 mooseError("Bounded action distributions require both minimum_values and maximum_values.");
98
99 if (has_minimum_values)
100 {
101 if (_minimum_values.size() != _num_outputs || _maximum_values.size() != _num_outputs)
102 mooseError("The number of minimum_values and maximum_values entries must match the number "
103 "of action outputs.");
104
105 for (const auto i : make_range(_minimum_values.size()))
107 mooseError("maximum_values entries must be strictly greater than minimum_values entries.");
108 }
109
110 if (build_on_construct)
112}
void mooseError(Args &&... args)
const std::vector< Real > _maximum_values
Upper action bounds used by bounded actor distributions.
virtual void constructNeuralNetwork() override
Construct the actor body and action-distribution modules.
const std::vector< Real > _minimum_values
Lower action bounds used by bounded actor distributions.
const bool _state_independent_std
Whether the Gaussian std ignores the current actor features.
const std::string & name() const
LibtorchArtificialNeuralNet(const std::string name, const unsigned int num_inputs, const unsigned int num_outputs, const std::vector< unsigned int > &num_neurons_per_layer, const std::vector< std::string > &activation_function={"relu"}, const torch::DeviceType device_type=torch::kCPU, const torch::ScalarType scalar_type=torch::kDouble, const bool build_on_construct=true, const std::vector< Real > &input_shift_factors={}, const std::vector< Real > &input_scaling_factors={}, const std::vector< Real > &output_scaling_factors={})
if(subdm)
IntRange< T > make_range(T beg, T end)

◆ LibtorchActorNeuralNet() [2/2]

Moose::LibtorchActorNeuralNet::LibtorchActorNeuralNet ( const Moose::LibtorchActorNeuralNet &  nn,
const bool  build_on_construct = true 
)

Copy-construct an actor network.

Parameters
nnActor network to copy.
build_on_constructWhether to rebuild the module structure during the copy.

Definition at line 114 of file LibtorchActorNeuralNet.C.

116 : LibtorchArtificialNeuralNet(dynamic_cast<const LibtorchArtificialNeuralNet &>(nn), false),
120{
121 // We construct the NN architecture
122 if (build_on_construct)
123 {
125 // We fill it up with the current parameter values
126 const auto & from_params = nn.named_parameters();
127 auto to_params = this->named_parameters();
128 for (unsigned int param_i : make_range(from_params.size()))
129 to_params[param_i].value().data() = from_params[param_i].value().data().clone();
130
131 const auto & from_buffers = nn.named_buffers();
132 auto to_buffers = this->named_buffers();
133 for (unsigned int buffer_i : make_range(from_buffers.size()))
134 to_buffers[buffer_i].value().data() = from_buffers[buffer_i].value().data().clone();
135 }
136}
bool stateIndependentStd() const
Return whether the Gaussian standard deviation ignores the current actor features.
const std::vector< Real > & minValues() const
Return the configured lower action bounds.
const std::vector< Real > & maxValues() const
Return the configured upper action bounds.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)

Member Function Documentation

◆ actionDistribution() [1/2]

LibtorchActionDistribution & Moose::LibtorchActorNeuralNet::actionDistribution ( )
inline

Return the active action distribution as the common base type.

Definition at line 102 of file LibtorchActorNeuralNet.h.

102{ return *_action_distribution; }
std::shared_ptr< LibtorchActionDistribution > _action_distribution
Action-distribution module attached to the actor output.

◆ actionDistribution() [2/2]

const LibtorchActionDistribution & Moose::LibtorchActorNeuralNet::actionDistribution ( ) const
inline

Return the active action distribution as the common base type.

Definition at line 97 of file LibtorchActorNeuralNet.h.

97{ return *_action_distribution; }

Referenced by Moose::loadLibtorchActorNeuralNetState().

◆ betaActionDistribution() [1/2]

LibtorchBetaActionDistribution & Moose::LibtorchActorNeuralNet::betaActionDistribution ( )

Return the Beta action distribution reference.

Errors if the actor is unbounded.

Definition at line 253 of file LibtorchActorNeuralNet.C.

254{
255 auto * distribution = betaActionDistributionPtr();
256 if (!distribution)
257 mooseError("Requested a Beta action distribution from an unbounded actor.");
258 return *distribution;
259}
const LibtorchBetaActionDistribution * betaActionDistributionPtr() const
Return the Beta action distribution pointer, or nullptr for Gaussian actors.

◆ betaActionDistribution() [2/2]

const LibtorchBetaActionDistribution & Moose::LibtorchActorNeuralNet::betaActionDistribution ( ) const

Return the Beta action distribution reference.

Errors if the actor is unbounded.

Definition at line 244 of file LibtorchActorNeuralNet.C.

245{
246 const auto * distribution = betaActionDistributionPtr();
247 if (!distribution)
248 mooseError("Requested a Beta action distribution from an unbounded actor.");
249 return *distribution;
250}

◆ betaActionDistributionPtr() [1/2]

LibtorchBetaActionDistribution * Moose::LibtorchActorNeuralNet::betaActionDistributionPtr ( )

Return the Beta action distribution pointer, or nullptr for Gaussian actors.

Definition at line 238 of file LibtorchActorNeuralNet.C.

239{
240 return dynamic_cast<LibtorchBetaActionDistribution *>(_action_distribution.get());
241}

◆ betaActionDistributionPtr() [2/2]

const LibtorchBetaActionDistribution * Moose::LibtorchActorNeuralNet::betaActionDistributionPtr ( ) const

Return the Beta action distribution pointer, or nullptr for Gaussian actors.

Definition at line 232 of file LibtorchActorNeuralNet.C.

233{
234 return dynamic_cast<const LibtorchBetaActionDistribution *>(_action_distribution.get());
235}

Referenced by betaActionDistribution(), and betaActionDistribution().

◆ constructNeuralNetwork()

void Moose::LibtorchActorNeuralNet::constructNeuralNetwork ( )
overridevirtual

Construct the actor body and action-distribution modules.

Reimplemented from Moose::LibtorchArtificialNeuralNet.

Definition at line 154 of file LibtorchActorNeuralNet.C.

155{
156 // Adding hidden layers
157 unsigned int inp_neurons = _num_inputs;
158 for (unsigned int i = 0; i < numHiddenLayers(); ++i)
159 {
160 std::unordered_map<std::string, unsigned int> parameters = {
161 {"inp_neurons", inp_neurons}, {"out_neurons", _num_neurons_per_layer[i]}};
162 addLayer("hidden_layer_" + std::to_string(i + 1), parameters);
163
164 // Necessary to retain double precision (and error-free runs)
166 inp_neurons = _num_neurons_per_layer[i];
167 }
168
169 if (_minimum_values.empty() && _maximum_values.empty())
171 std::make_shared<LibtorchGaussianActionDistribution>("action_distribution",
172 inp_neurons,
176 true,
179 else
181 std::make_shared<LibtorchBetaActionDistribution>("action_distribution",
182 inp_neurons,
188 true,
190
191 // Keep the serialized module name stable so existing checkpoints continue to load.
192 register_module("action_head", _action_distribution);
193}
const torch::ScalarType _data_type
std::vector< torch::nn::Linear > _weights
virtual void addLayer(const std::string &layer_name, const std::unordered_map< std::string, unsigned int > &parameters)
const torch::DeviceType _device_type
unsigned int numHiddenLayers() const
const std::vector< unsigned int > _num_neurons_per_layer
std::vector< Real > _output_scaling_factors

Referenced by LibtorchActorNeuralNet(), and LibtorchActorNeuralNet().

◆ entropy()

torch::Tensor Moose::LibtorchActorNeuralNet::entropy ( )

Compute the entropy of the current action distribution.

Definition at line 196 of file LibtorchActorNeuralNet.C.

197{
198 return _action_distribution->entropy();
199}

Referenced by LibtorchRLPPOLoss::compute().

◆ evaluate()

torch::Tensor Moose::LibtorchActorNeuralNet::evaluate ( torch::Tensor &  input,
bool  sampled,
c10::optional< at::Generator >  generator = c10::nullopt 
)
virtual

Evaluate the actor and either sample from it or use its deterministic action.

Parameters
inputInput tensor for the evaluation.
sampledWhether to draw a stochastic sample.
generatorOptional random-number generator used for sampling.

Definition at line 294 of file LibtorchActorNeuralNet.C.

297{
298 torch::Tensor output = forward(x);
299
301
302 if (sampled)
303 return sample(generator);
304
305 return _action_distribution->deterministicAction();
306}
const std::vector< double > x
virtual torch::Tensor sample(c10::optional< at::Generator > generator=c10::nullopt)
Sample an action from the already-reset distribution.
virtual torch::Tensor forward(const torch::Tensor &x) override
Run a forward pass through the actor body.
void resetDistributionParams(torch::Tensor input)
Refresh the cached distribution parameters from a fresh input tensor.

Referenced by LibtorchRLPPOLoss::compute().

◆ forward()

torch::Tensor Moose::LibtorchActorNeuralNet::forward ( const torch::Tensor &  x)
overridevirtual

Run a forward pass through the actor body.

Parameters
xInput tensor for the evaluation.

Reimplemented from Moose::LibtorchArtificialNeuralNet.

Definition at line 268 of file LibtorchActorNeuralNet.C.

269{
270 torch::Tensor output = preprocessInput(x);
271
272 for (unsigned int i = 0; i < _weights.size(); ++i)
273 {
274 std::string activation =
276 if (activation == "relu")
277 output = torch::relu(_weights[i]->forward(output));
278 else if (activation == "sigmoid")
279 output = torch::sigmoid(_weights[i]->forward(output));
280 else if (activation == "tanh")
281 output = torch::tanh(_weights[i]->forward(output));
282 else if (activation == "elu")
283 output = torch::elu(_weights[i]->forward(output));
284 else if (activation == "gelu")
285 output = torch::gelu(_weights[i]->forward(output));
286 else if (activation == "linear")
287 output = _weights[i]->forward(output);
288 }
289
290 return output;
291}
virtual torch::Tensor preprocessInput(const torch::Tensor &x) const
unsigned int size() const

Referenced by evaluate(), and forward().

◆ gaussianActionDistribution() [1/2]

LibtorchGaussianActionDistribution & Moose::LibtorchActorNeuralNet::gaussianActionDistribution ( )

Return the Gaussian action distribution reference.

Errors if the actor is bounded.

Definition at line 223 of file LibtorchActorNeuralNet.C.

224{
225 auto * distribution = gaussianActionDistributionPtr();
226 if (!distribution)
227 mooseError("Requested a Gaussian action distribution from a bounded actor.");
228 return *distribution;
229}
const LibtorchGaussianActionDistribution * gaussianActionDistributionPtr() const
Return the Gaussian action distribution pointer, or nullptr for bounded actors.

◆ gaussianActionDistribution() [2/2]

const LibtorchGaussianActionDistribution & Moose::LibtorchActorNeuralNet::gaussianActionDistribution ( ) const

Return the Gaussian action distribution reference.

Errors if the actor is bounded.

Definition at line 214 of file LibtorchActorNeuralNet.C.

215{
216 const auto * distribution = gaussianActionDistributionPtr();
217 if (!distribution)
218 mooseError("Requested a Gaussian action distribution from a bounded actor.");
219 return *distribution;
220}

◆ gaussianActionDistributionPtr() [1/2]

LibtorchGaussianActionDistribution * Moose::LibtorchActorNeuralNet::gaussianActionDistributionPtr ( )

Return the Gaussian action distribution pointer, or nullptr for bounded actors.

Definition at line 208 of file LibtorchActorNeuralNet.C.

209{
210 return dynamic_cast<LibtorchGaussianActionDistribution *>(_action_distribution.get());
211}

◆ gaussianActionDistributionPtr() [2/2]

const LibtorchGaussianActionDistribution * Moose::LibtorchActorNeuralNet::gaussianActionDistributionPtr ( ) const

Return the Gaussian action distribution pointer, or nullptr for bounded actors.

Definition at line 202 of file LibtorchActorNeuralNet.C.

203{
204 return dynamic_cast<const LibtorchGaussianActionDistribution *>(_action_distribution.get());
205}

Referenced by gaussianActionDistribution(), and gaussianActionDistribution().

◆ initializeNeuralNetwork()

void Moose::LibtorchActorNeuralNet::initializeNeuralNetwork ( c10::optional< at::Generator >  generator = c10::nullopt)
overridevirtual

Initialize the actor body and action-distribution parameters.

Parameters
generatorOptional random-number generator used for reproducible initialization.

Reimplemented from Moose::LibtorchArtificialNeuralNet.

Definition at line 139 of file LibtorchActorNeuralNet.C.

140{
141 for (unsigned int i = 0; i < numHiddenLayers(); ++i)
142 {
143 const auto & activation =
145 const Real gain = determineGain(activation);
146 Moose::orthogonalInitializeTensor(_weights[i]->weight, gain, generator);
147 torch::nn::init::zeros_(_weights[i]->bias);
148 }
149
150 _action_distribution->initialize(generator);
151}
Real determineGain(const std::string &activation)
void orthogonalInitializeTensor(torch::Tensor &tensor, Real gain=1.0, c10::optional< at::Generator > generator=c10::nullopt)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ logProbability()

torch::Tensor Moose::LibtorchActorNeuralNet::logProbability ( const torch::Tensor &  other)

Evaluate the log-probability of an action under the current actor state.

Parameters
otherAction tensor in physical units.

Definition at line 315 of file LibtorchActorNeuralNet.C.

316{
317 return _action_distribution->logProbability(action);
318}

Referenced by LibtorchRLPPOLoss::compute().

◆ maxValues()

const std::vector< Real > & Moose::LibtorchActorNeuralNet::maxValues ( ) const
inline

Return the configured upper action bounds.

Definition at line 157 of file LibtorchActorNeuralNet.h.

157{ return _maximum_values; }

◆ minValues()

const std::vector< Real > & Moose::LibtorchActorNeuralNet::minValues ( ) const
inline

Return the configured lower action bounds.

Definition at line 152 of file LibtorchActorNeuralNet.h.

152{ return _minimum_values; }

◆ resetDistributionParams()

void Moose::LibtorchActorNeuralNet::resetDistributionParams ( torch::Tensor  input)

Refresh the cached distribution parameters from a fresh input tensor.

Parameters
inputInput tensor used to update the distribution.

Definition at line 262 of file LibtorchActorNeuralNet.C.

263{
264 _action_distribution->reset(input);
265}

Referenced by evaluate().

◆ sample()

torch::Tensor Moose::LibtorchActorNeuralNet::sample ( c10::optional< at::Generator >  generator = c10::nullopt)
virtual

Sample an action from the already-reset distribution.

Parameters
generatorOptional random-number generator used for sampling.

Definition at line 309 of file LibtorchActorNeuralNet.C.

310{
311 return _action_distribution->sample(generator);
312}

Referenced by evaluate().

◆ stateIndependentStd()

bool Moose::LibtorchActorNeuralNet::stateIndependentStd ( ) const
inline

Return whether the Gaussian standard deviation ignores the current actor features.

Definition at line 147 of file LibtorchActorNeuralNet.h.

147{ return _state_independent_std; }

Member Data Documentation

◆ _action_distribution

std::shared_ptr<LibtorchActionDistribution> Moose::LibtorchActorNeuralNet::_action_distribution
protected

◆ _maximum_values

const std::vector<Real> Moose::LibtorchActorNeuralNet::_maximum_values
protected

Upper action bounds used by bounded actor distributions.

Definition at line 187 of file LibtorchActorNeuralNet.h.

Referenced by constructNeuralNetwork(), LibtorchActorNeuralNet(), and maxValues().

◆ _minimum_values

const std::vector<Real> Moose::LibtorchActorNeuralNet::_minimum_values
protected

Lower action bounds used by bounded actor distributions.

Definition at line 185 of file LibtorchActorNeuralNet.h.

Referenced by constructNeuralNetwork(), LibtorchActorNeuralNet(), and minValues().

◆ _state_independent_std

const bool Moose::LibtorchActorNeuralNet::_state_independent_std
protected

Whether the Gaussian std ignores the current actor features.

Definition at line 189 of file LibtorchActorNeuralNet.h.

Referenced by constructNeuralNetwork(), and stateIndependentStd().


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