46template <
typename real_t>
54 const std::vector<int64_t> &layers,
55 const std::vector<std::vector<std::any>> &activations,
57 assert(layers.size() == activations.size() + 1);
60 for (
auto i = 0; i < layers.size() - 1; ++i) {
62 register_module(
"layer[" + std::to_string(i) +
"]",
63 torch::nn::Linear(layers[i], layers[i + 1])));
64 layers_.back()->to(options.device(), options.dtype(),
true);
66 torch::nn::init::xavier_uniform_(
layers_.back()->weight);
67 torch::nn::init::constant_(
layers_.back()->bias, 0.0);
71 for (
const auto &a : activations)
80 throw std::runtime_error(
"Invalid number of parameters");
89 std::any_cast<torch::Tensor>(a[1]),
90 std::any_cast<torch::Tensor>(a[2]),
91 std::any_cast<torch::Tensor>(a[3]),
92 std::any_cast<torch::Tensor>(a[4]), std::any_cast<double>(a[5]),
93 std::any_cast<double>(a[6]), std::any_cast<bool>(a[7])});
97 std::any_cast<torch::Tensor>(a[1]),
98 std::any_cast<torch::Tensor>(a[2]),
99 std::any_cast<torch::Tensor>(a[3]),
100 std::any_cast<torch::Tensor>(a[4]), std::any_cast<double>(a[5]),
101 std::any_cast<double>(a[6])});
105 std::any_cast<torch::Tensor>(a[1]),
106 std::any_cast<torch::Tensor>(a[2]),
107 std::any_cast<torch::nn::functional::BatchNormFuncOptions>(
112 new BatchNorm{std::any_cast<torch::Tensor>(a[1]),
113 std::any_cast<torch::Tensor>(a[2])});
116 throw std::runtime_error(
"Invalid number of parameters");
125 new CELU{std::any_cast<double>(a[1]), std::any_cast<bool>(a[2])});
130 std::any_cast<torch::nn::functional::CELUFuncOptions>(a[1])});
132 activations_.emplace_back(
new CELU{std::any_cast<double>(a[1])});
139 throw std::runtime_error(
"Invalid number of parameters");
148 new ELU{std::any_cast<double>(a[1]), std::any_cast<bool>(a[2])});
153 std::any_cast<torch::nn::functional::ELUFuncOptions>(a[1])});
155 activations_.emplace_back(
new ELU{std::any_cast<double>(a[1])});
162 throw std::runtime_error(
"Invalid number of parameters");
173 throw std::runtime_error(
"Invalid number of parameters");
183 std::any_cast<torch::nn::functional::GLUFuncOptions>(a[1])});
185 activations_.emplace_back(
new GLU{std::any_cast<int64_t>(a[1])});
192 throw std::runtime_error(
"Invalid number of parameters");
201 std::any_cast<int64_t>(a[1]), std::any_cast<torch::Tensor>(a[2]),
202 std::any_cast<torch::Tensor>(a[3]), std::any_cast<double>(a[4])});
207 std::any_cast<torch::nn::functional::GroupNormFuncOptions>(
211 new GroupNorm{std::any_cast<int64_t>(a[1])});
215 throw std::runtime_error(
"Invalid number of parameters");
224 std::any_cast<double>(a[1]), std::any_cast<int>(a[2]),
225 std::any_cast<bool>(a[3])});
229 std::any_cast<torch::nn::functional::GumbelSoftmaxFuncOptions>(
236 throw std::runtime_error(
"Invalid number of parameters");
246 std::any_cast<torch::nn::functional::HardshrinkFuncOptions>(
250 new Hardshrink{std::any_cast<double>(a[1])});
257 throw std::runtime_error(
"Invalid number of parameters");
268 throw std::runtime_error(
"Invalid number of parameters");
279 throw std::runtime_error(
"Invalid number of parameters");
287 activations_.emplace_back(
new Hardtanh{std::any_cast<double>(a[1]),
288 std::any_cast<double>(a[2]),
289 std::any_cast<bool>(a[3])});
292 activations_.emplace_back(
new Hardtanh{std::any_cast<double>(a[1]),
293 std::any_cast<double>(a[2])});
297 std::any_cast<torch::nn::functional::HardtanhFuncOptions>(a[1])});
303 throw std::runtime_error(
"Invalid number of parameters");
312 std::any_cast<torch::Tensor>(a[1]),
313 std::any_cast<torch::Tensor>(a[2]),
314 std::any_cast<torch::Tensor>(a[3]),
315 std::any_cast<torch::Tensor>(a[4]), std::any_cast<double>(a[5]),
316 std::any_cast<double>(a[6]), std::any_cast<bool>(a[7])});
320 std::any_cast<torch::Tensor>(a[1]),
321 std::any_cast<torch::Tensor>(a[2]),
322 std::any_cast<torch::Tensor>(a[3]),
323 std::any_cast<torch::Tensor>(a[4]), std::any_cast<double>(a[5]),
324 std::any_cast<double>(a[6])});
328 std::any_cast<torch::nn::functional::InstanceNormFuncOptions>(
335 throw std::runtime_error(
"Invalid number of parameters");
344 std::any_cast<std::vector<int64_t>>(a[1]),
345 std::any_cast<torch::Tensor>(a[2]),
346 std::any_cast<torch::Tensor>(a[3]), std::any_cast<double>(a[4])});
351 std::any_cast<torch::nn::functional::LayerNormFuncOptions>(
355 new LayerNorm{std::any_cast<std::vector<int64_t>>(a[1])});
359 throw std::runtime_error(
"Invalid number of parameters");
367 activations_.emplace_back(
new LeakyReLU{std::any_cast<double>(a[1]),
368 std::any_cast<bool>(a[2])});
373 std::any_cast<torch::nn::functional::LeakyReLUFuncOptions>(
377 new LeakyReLU{std::any_cast<double>(a[1])});
384 throw std::runtime_error(
"Invalid number of parameters");
393 std::any_cast<int64_t>(a[1]), std::any_cast<double>(a[2]),
394 std::any_cast<double>(a[3]), std::any_cast<double>(a[4])});
398 activations_.emplace_back(
new LocalResponseNorm{std::any_cast<
399 torch::nn::functional::LocalResponseNormFuncOptions>(a[1])});
402 new LocalResponseNorm{std::any_cast<int64_t>(a[1])});
406 throw std::runtime_error(
"Invalid number of parameters");
417 throw std::runtime_error(
"Invalid number of parameters");
427 std::any_cast<torch::nn::functional::LogSoftmaxFuncOptions>(
431 new LogSoftmax{std::any_cast<int64_t>(a[1])});
435 throw std::runtime_error(
"Invalid number of parameters");
446 throw std::runtime_error(
"Invalid number of parameters");
455 std::any_cast<double>(a[1]), std::any_cast<double>(a[2]),
456 std::any_cast<int64_t>(a[3])});
460 std::any_cast<torch::nn::functional::NormalizeFuncOptions>(
467 throw std::runtime_error(
"Invalid number of parameters");
476 new PReLU{std::any_cast<torch::Tensor>(a[1])});
479 throw std::runtime_error(
"Invalid number of parameters");
489 std::any_cast<torch::nn::functional::ReLUFuncOptions>(a[1])});
491 activations_.emplace_back(
new ReLU{std::any_cast<bool>(a[1])});
498 throw std::runtime_error(
"Invalid number of parameters");
508 std::any_cast<torch::nn::functional::ReLU6FuncOptions>(a[1])});
510 activations_.emplace_back(
new ReLU6{std::any_cast<bool>(a[1])});
517 throw std::runtime_error(
"Invalid number of parameters");
525 activations_.emplace_back(
new RReLU{std::any_cast<double>(a[1]),
526 std::any_cast<double>(a[2]),
527 std::any_cast<bool>(a[3])});
530 activations_.emplace_back(
new RReLU{std::any_cast<double>(a[1]),
531 std::any_cast<double>(a[2])});
535 std::any_cast<torch::nn::functional::RReLUFuncOptions>(a[1])});
541 throw std::runtime_error(
"Invalid number of parameters");
551 std::any_cast<torch::nn::functional::SELUFuncOptions>(a[1])});
553 activations_.emplace_back(
new SELU{std::any_cast<bool>(a[1])});
560 throw std::runtime_error(
"Invalid number of parameters");
571 throw std::runtime_error(
"Invalid number of parameters");
582 throw std::runtime_error(
"Invalid number of parameters");
592 std::any_cast<torch::nn::functional::SoftmaxFuncOptions>(
596 new Softmax{std::any_cast<int64_t>(a[1])});
600 throw std::runtime_error(
"Invalid number of parameters");
610 std::any_cast<torch::nn::functional::SoftminFuncOptions>(
614 new Softmin{std::any_cast<int64_t>(a[1])});
618 throw std::runtime_error(
"Invalid number of parameters");
626 activations_.emplace_back(
new Softplus{std::any_cast<double>(a[1]),
627 std::any_cast<double>(a[2])});
631 std::any_cast<torch::nn::functional::SoftplusFuncOptions>(a[1])});
637 throw std::runtime_error(
"Invalid number of parameters");
647 std::any_cast<torch::nn::functional::SoftshrinkFuncOptions>(
651 new Softshrink{std::any_cast<double>(a[1])});
658 throw std::runtime_error(
"Invalid number of parameters");
669 throw std::runtime_error(
"Invalid number of parameters");
680 throw std::runtime_error(
"Invalid number of parameters");
691 throw std::runtime_error(
"Invalid number of parameters");
699 activations_.emplace_back(
new Threshold{std::any_cast<double>(a[1]),
700 std::any_cast<double>(a[2]),
701 std::any_cast<bool>(a[3])});
704 activations_.emplace_back(
new Threshold{std::any_cast<double>(a[1]),
705 std::any_cast<double>(a[2])});
709 std::any_cast<torch::nn::functional::ThresholdFuncOptions>(
713 throw std::runtime_error(
"Invalid number of parameters");
718 throw std::runtime_error(
"Invalid activation function");
724 torch::Tensor x_in = x.clone();
734 inline torch::serialize::OutputArchive &
735 write(torch::serialize::OutputArchive &archive,
736 const std::string &key =
"iganet")
const {
739 archive.write(key +
".layers", torch::full({1}, (int64_t)
layers_.size()));
740 for (std::size_t i = 0; i <
layers_.size(); ++i) {
742 key +
".layer[" + std::to_string(i) +
"].in_features",
743 torch::full({1}, (int64_t)
layers_[i]->options.in_features()));
745 key +
".layer[" + std::to_string(i) +
"].outputs_features",
746 torch::full({1}, (int64_t)
layers_[i]->options.out_features()));
747 archive.write(key +
".layer[" + std::to_string(i) +
"].bias",
748 torch::full({1}, (int64_t)
layers_[i]->options.bias()));
750 activations_[i]->write(archive, key +
".layer[" + std::to_string(i) +
758 inline torch::serialize::InputArchive &
759 read(torch::serialize::InputArchive &archive,
760 const std::string &key =
"iganet") {
761 torch::Tensor layers, in_features, outputs_features, bias,
activation;
763 archive.read(key +
".layers", layers);
764 for (int64_t i = 0; i < layers.item<int64_t>(); ++i) {
765 archive.read(key +
".layer[" + std::to_string(i) +
"].in_features",
767 archive.read(key +
".layer[" + std::to_string(i) +
"].outputs_features",
769 archive.read(key +
".layer[" + std::to_string(i) +
"].bias", bias);
770 layers_.emplace_back(register_module(
771 "layer[" + std::to_string(i) +
"]",
773 torch::nn::LinearOptions(in_features.item<int64_t>(),
774 outputs_features.item<int64_t>())
775 .bias(bias.item<
bool>()))));
777 archive.read(key +
".layer[" + std::to_string(i) +
"].activation.type",
785 new BatchNorm{torch::Tensor{}, torch::Tensor{}});
887 throw std::runtime_error(
"Invalid activation function");
889 activations_.back()->read(archive, key +
".layer[" + std::to_string(i) +
901 os <<
"activation[" << i++ <<
"] = " << *
activation <<
"\n";
918template <
typename real_t>
920 :
public torch::nn::ModuleHolder<IgANetGeneratorImpl<real_t>> {
930template <
typename Optimizer,
typename GeometryMap,
typename Variable,
951 std::unique_ptr<optimizer_type>
opt_;
972 template <std::
size_t Coeffs>
973 IgANet(
const std::vector<int64_t> &layers,
974 const std::vector<std::vector<std::any>> &activations,
975 std::array<int64_t, Coeffs> ncoeffs,
IgANetOptions defaults = {},
978 : IgANet(layers, activations,
std::tuple{ncoeffs},
std::tuple{ncoeffs},
981 template <std::size_t... Coeffs>
982 IgANet(
const std::vector<int64_t> &layers,
983 const std::vector<std::vector<std::any>> &activations,
984 std::tuple<std::array<int64_t, Coeffs>...> ncoeffs,
988 : IgANet(layers, activations, ncoeffs, ncoeffs, defaults,
options) {}
995 template <std::
size_t GeometryMapNumCoeffs, std::
size_t VariableNumCoeffs>
996 IgANet(
const std::vector<int64_t> &layers,
997 const std::vector<std::vector<std::any>> &activations,
998 std::array<int64_t, GeometryMapNumCoeffs> geometryMapNumCoeffs,
999 std::array<int64_t, VariableNumCoeffs> variableNumCoeffs,
1003 : IgANet(layers, activations,
std::tuple{geometryMapNumCoeffs},
1004 std::tuple{variableNumCoeffs}, defaults,
options) {}
1006 template <std::size_t... GeometryMapNumCoeffs,
1007 std::size_t... VariableNumCoeffs>
1009 const std::vector<int64_t> &layers,
1010 const std::vector<std::vector<std::any>> &activations,
1011 std::tuple<std::array<int64_t, GeometryMapNumCoeffs>...>
1012 geometryMapNumCoeffs,
1013 std::tuple<std::array<int64_t, VariableNumCoeffs>...> variableNumCoeffs,
1018 Base(geometryMapNumCoeffs, variableNumCoeffs,
options),
1020 net_(utils::concat(
std::vector<int64_t>{
inputs( 0).size(0)},
1022 std::vector<int64_t>{
Base::u_.as_tensor_size()}),
1026 opt_(std::make_unique<optimizer_type>(
net_->parameters())),
1050 opt_ = std::make_unique<optimizer_type>(
net_->parameters());
1052 std::vector<optimizer_options_type>
options;
1053 for (
auto & group :
opt_->param_groups())
1055 opt_ = std::make_unique<optimizer_type>(
net_->parameters());
1068 if (param_group < opt_->param_groups().size())
1071 throw std::runtime_error(
"Index exceeds number of parameter groups");
1076 if (param_group < opt_->param_groups().size())
1079 throw std::runtime_error(
"Index exceeds number of parameter groups");
1084 for (
auto &group :
opt_->param_groups())
1090 for (
auto &group :
opt_->param_groups())
1096 if (param_group < opt_->param_groups().size())
1099 throw std::runtime_error(
"Index exceeds number of parameter groups");
1104 if (param_group < opt_->param_groups().size())
1107 throw std::runtime_error(
"Index exceeds number of parameter groups");
1130 return torch::empty({0});
1137 virtual torch::Tensor
loss(
const torch::Tensor &, int64_t) = 0;
1141#ifdef IGANET_WITH_MPI
1142 c10::intrusive_ptr<c10d::ProcessGroupMPI> pg =
1143 c10d::ProcessGroupMPI::createProcessGroupMPI()
1156 auto closure = [&]() {
1167 loss.backward({},
true,
false);
1172#ifdef IGANET_WITH_MPI
1178 std::vector<c10::intrusive_ptr<::c10d::Work>> works;
1179 for (
auto ¶m :
net_->named_parameters()) {
1180 std::vector<torch::Tensor> tmp = {param.value().grad()};
1181 works.emplace_back(pg->allreduce(tmp));
1184 waitWork(pg, works);
1186 for (
auto ¶m :
net_->named_parameters()) {
1187 param.value().grad().data() =
1188 param.value().grad().data() / pg->getSize();
1193 opt_->step(closure);
1208 if (current_loss == previous_loss || std::abs(current_loss-previous_loss) < previous_loss/10) {
1215 if (
loss.isnan().template item<bool>()) {
1221 previous_loss = current_loss;
1226 template <
typename DataLoader>
1228#ifdef IGANET_WITH_MPI
1230 c10::intrusive_ptr<c10d::ProcessGroupMPI> pg =
1231 c10d::ProcessGroupMPI::createProcessGroupMPI()
1242 for (
auto &batch : loader) {
1250 .slice(1,
Base::G_.as_tensor_size(),
1266 .slice(1,
Base::G_.as_tensor_size(),
1280 auto closure = [&]() {
1291 loss.backward({},
true,
false);
1297 opt_->step(closure);
1299 Loss +=
loss.template item<typename Base::value_type>();
1311 if (Loss == previous_loss) {
1316 previous_loss = Loss;
1327 torch::Tensor outputs =
net_->forward(
inputs);
1332 inline virtual nlohmann::json
to_json()
const override {
1333 return "Not implemented yet";
1338 return net_->parameters();
1343 inline torch::OrderedDict<std::string, torch::Tensor>
1345 return net_->named_parameters();
1350 std::size_t result = 0;
1351 for (
const auto ¶m : this->
parameters()) {
1352 result += param.numel();
1360 os <<
name() <<
"(\n"
1361 <<
"net = " <<
net_ <<
"\n";
1371 inline void save(
const std::string &filename,
1372 const std::string &key =
"iganet")
const {
1373 torch::serialize::OutputArchive archive;
1374 write(archive, key).save_to(filename);
1378 inline void load(
const std::string &filename,
1379 const std::string &key =
"iganet") {
1380 torch::serialize::InputArchive archive;
1381 archive.load_from(filename);
1386 inline torch::serialize::OutputArchive &
1387 write(torch::serialize::OutputArchive &archive,
1388 const std::string &key =
"iganet")
const {
1396 net_->write(archive, key +
".net");
1397 torch::serialize::OutputArchive archive_net;
1398 net_->save(archive_net);
1399 archive.write(key +
".net.data", archive_net);
1401 torch::serialize::OutputArchive archive_opt;
1402 opt_->save(archive_opt);
1403 archive.write(key +
".opt", archive_opt);
1409 inline torch::serialize::InputArchive &
1410 read(torch::serialize::InputArchive &archive,
1411 const std::string &key =
"iganet") {
1419 net_->read(archive, key +
".net");
1420 torch::serialize::InputArchive archive_net;
1421 archive.read(key +
".net.data", archive_net);
1422 net_->load(archive_net);
1424 opt_->add_parameters(
net_->parameters());
1425 torch::serialize::InputArchive archive_opt;
1426 archive.read(key +
".opt", archive_opt);
1427 opt_->load(archive_opt);
1449#ifdef IGANET_WITH_MPI
1452 static void waitWork(c10::intrusive_ptr<c10d::ProcessGroupMPI> pg,
1453 std::vector<c10::intrusive_ptr<c10d::Work>> works) {
1454 for (
auto &work : works) {
1457 }
catch (
const std::exception &ex) {
1458 Log(
log::error) <<
"Exception received during waitWork: " << ex.what()
1468 template <
typename Optimizer,
typename GeometryMap,
typename Variable>
1469 requires OptimizerType<Optimizer> && FunctionSpaceType<GeometryMap> && FunctionSpaceType<Variable>
1470inline std::ostream &
1482 template <
typename GeometryMap,
typename Variable>
1483 requires FunctionSpaceType<GeometryMap> && FunctionSpaceType<Variable>
1488 decltype(std::declval<GeometryMap>()
1489 .template find_knot_indices<functionspace::interior>(
1490 std::declval<typename GeometryMap::eval_type>()));
1494 decltype(std::declval<GeometryMap>()
1495 .template find_knot_indices<functionspace::boundary>(
1497 typename GeometryMap::boundary_eval_type>()));
1501 decltype(std::declval<Variable>()
1502 .template find_knot_indices<functionspace::interior>(
1503 std::declval<typename Variable::eval_type>()));
1507 decltype(std::declval<Variable>()
1508 .template find_knot_indices<functionspace::boundary>(
1509 std::declval<typename Variable::boundary_eval_type>()));
1513 decltype(std::declval<GeometryMap>()
1514 .template find_coeff_indices<functionspace::interior>(
1515 std::declval<typename GeometryMap::eval_type>()));
1519 decltype(std::declval<GeometryMap>()
1520 .template find_coeff_indices<functionspace::boundary>(
1522 typename GeometryMap::boundary_eval_type>()));
1526 decltype(std::declval<Variable>()
1527 .template find_coeff_indices<functionspace::interior>(
1528 std::declval<typename Variable::eval_type>()));
1532 decltype(std::declval<Variable>()
1533 .template find_coeff_indices<functionspace::boundary>(
1534 std::declval<typename Variable::boundary_eval_type>()));
Batch Normalization as described in the paper.
Definition layer.hpp:134
Continuously Differentiable Exponential Linear Units activation function.
Definition layer.hpp:264
Exponential Linear Units activation function.
Definition layer.hpp:341
Gaussian Error Linear Units activation function.
Definition layer.hpp:417
Grated Linear Units activation function.
Definition layer.hpp:468
Group Normalization over a mini-batch of inputs as described in the paper Group Normalization,...
Definition layer.hpp:532
Gumbel-Softmax distribution activation function.
Definition layer.hpp:615
Hard shrinkish activation function.
Definition layer.hpp:692
Hardsigmoid activation function.
Definition layer.hpp:769
Hardswish activation function.
Definition layer.hpp:822
Hardtanh activation function.
Definition layer.hpp:875
IgA base class.
Definition igabase.hpp:459
Variable f_
Spline representation of the reference data.
Definition igabase.hpp:490
typename Base::value_type value_type
Value type.
Definition igabase.hpp:465
static bool constexpr has_GeometryMap
Indicates whether this class provides a geometry map.
Definition igabase.hpp:480
static bool constexpr has_Solution
Indicates whether this class provides a solution.
Definition igabase.hpp:486
static bool constexpr has_RefData
Indicates whether this class provides a reference solution.
Definition igabase.hpp:483
GeometryMap G_
Spline representation of the geometry map.
Definition igabase.hpp:73
Variable u_
Spline representation of the solution.
Definition igabase.hpp:76
IgANetGenerator.
Definition iganet.hpp:920
IgANetGeneratorImpl.
Definition iganet.hpp:47
torch::serialize::InputArchive & read(torch::serialize::InputArchive &archive, const std::string &key="iganet")
Reads the IgANet from a torch::serialize::InputArchive object.
Definition iganet.hpp:759
IgANetGeneratorImpl()=default
Default constructor.
IgANetGeneratorImpl(const std::vector< int64_t > &layers, const std::vector< std::vector< std::any > > &activations, Options< real_t > options=Options< real_t >{})
Constructor.
Definition iganet.hpp:53
std::vector< std::unique_ptr< iganet::ActivationFunction > > activations_
Vector of activation functions.
Definition iganet.hpp:910
virtual void pretty_print(std::ostream &os=Log(log::info)) const noexcept override
Definition iganet.hpp:896
torch::Tensor forward(torch::Tensor x)
Forward evaluation.
Definition iganet.hpp:723
std::vector< torch::nn::Linear > layers_
Vector of linear layers.
Definition iganet.hpp:907
torch::serialize::OutputArchive & write(torch::serialize::OutputArchive &archive, const std::string &key="iganet") const
Writes the IgANet into a torch::serialize::OutputArchive object.
Definition iganet.hpp:735
IgANet.
Definition iganet.hpp:935
const auto & options() const
Returns a constant reference to the options structure.
Definition iganet.hpp:1111
void optimizerOptionsReset(optimizer_options_type &&options)
Resets the optimizer options.
Definition iganet.hpp:1089
void save(const std::string &filename, const std::string &key="iganet") const
Saves the IgANet to file.
Definition iganet.hpp:1371
void load(const std::string &filename, const std::string &key="iganet")
Loads the IgANet from file.
Definition iganet.hpp:1378
torch::OrderedDict< std::string, torch::Tensor > named_parameters() const noexcept
Returns a constant reference to the named parameters of the IgANet object.
Definition iganet.hpp:1344
void optimizerOptionsReset(const optimizer_options_type &options)
Resets the optimizer options.
Definition iganet.hpp:1083
virtual torch::Tensor loss(const torch::Tensor &, int64_t)=0
Computes the loss function.
torch::serialize::InputArchive & read(torch::serialize::InputArchive &archive, const std::string &key="iganet")
Loads the IgANet from a torch::serialize::InputArchive object.
Definition iganet.hpp:1410
IgABase< GeometryMap, Variable > Base
Base type.
Definition iganet.hpp:938
IgANet(const std::vector< int64_t > &layers, const std::vector< std::vector< std::any > > &activations, std::tuple< std::array< int64_t, GeometryMapNumCoeffs >... > geometryMapNumCoeffs, std::tuple< std::array< int64_t, VariableNumCoeffs >... > variableNumCoeffs, IgANetOptions defaults={}, iganet::Options< typename Base::value_type > options=iganet::Options< typename Base::value_type >{})
Constructor: number of layers, activation functions, and number of spline coefficients (different for...
Definition iganet.hpp:1008
std::vector< torch::Tensor > parameters() const noexcept
Returns a constant reference to the parameters of the IgANet object.
Definition iganet.hpp:1337
std::unique_ptr< optimizer_type > opt_
Optimizer.
Definition iganet.hpp:951
std::size_t nparameters() const noexcept
Returns the total number of parameters of the IgANet object.
Definition iganet.hpp:1349
IgANet(const std::vector< int64_t > &layers, const std::vector< std::vector< std::any > > &activations, std::tuple< std::array< int64_t, Coeffs >... > ncoeffs, IgANetOptions defaults={}, iganet::Options< typename Base::value_type > options=iganet::Options< typename Base::value_type >{})
Constructor: number of layers, activation functions, and number of spline coefficients (same for geom...
Definition iganet.hpp:982
optimizer_type & optimizer()
Returns a non-constant reference to the optimizer.
Definition iganet.hpp:1043
virtual void train()
Trains the IgANet.
Definition iganet.hpp:1140
virtual void pretty_print(std::ostream &os=Log(log::info)) const noexcept override
Returns a string representation of the IgANet object.
Definition iganet.hpp:1359
Optimizer optimizer_type
Type of the optimizer.
Definition iganet.hpp:941
torch::serialize::OutputArchive & write(torch::serialize::OutputArchive &archive, const std::string &key="iganet") const
Writes the IgANet into a torch::serialize::OutputArchive object.
Definition iganet.hpp:1387
void optimizerOptionsReset(optimizer_options_type &&options, std::size_t param_group)
Resets the optimizer options.
Definition iganet.hpp:1103
virtual torch::Tensor inputs(int64_t epoch) const
Returns the network inputs.
Definition iganet.hpp:1122
auto & options()
Returns a non-constant reference to the options structure.
Definition iganet.hpp:1114
void optimizerReset(bool resetOptions=true)
Resets the optimizer.
Definition iganet.hpp:1048
IgANetGenerator< typename Base::value_type > & net()
Returns a non-constant reference to the IgANet generator.
Definition iganet.hpp:1037
const IgANetGenerator< typename Base::value_type > & net() const
Returns a constant reference to the IgANet generator.
Definition iganet.hpp:1032
const optimizer_options_type & optimizerOptions(std::size_t param_group=0) const
Returns a constant reference to the optimizer options.
Definition iganet.hpp:1075
virtual bool epoch(int64_t)=0
Initializes epoch.
IgANet(IgANetOptions defaults={}, iganet::Options< typename Base::value_type > options=iganet::Options< typename Base::value_type >{})
Default constructor.
Definition iganet.hpp:958
IgANet(const std::vector< int64_t > &layers, const std::vector< std::vector< std::any > > &activations, std::array< int64_t, GeometryMapNumCoeffs > geometryMapNumCoeffs, std::array< int64_t, VariableNumCoeffs > variableNumCoeffs, IgANetOptions defaults={}, iganet::Options< typename Base::value_type > options=iganet::Options< typename Base::value_type >{})
Constructor: number of layers, activation functions, and number of spline coefficients (different for...
Definition iganet.hpp:996
typename optimizer_options_type< Optimizer >::type optimizer_options_type
Type of the optimizer options.
Definition iganet.hpp:944
void train(DataLoader &loader)
Trains the IgANet.
Definition iganet.hpp:1227
IgANetOptions options_
Options.
Definition iganet.hpp:954
virtual nlohmann::json to_json() const override
Returns the IgANet object as JSON object.
Definition iganet.hpp:1332
IgANetGenerator< typename Base::value_type > net_
IgANet generator.
Definition iganet.hpp:948
void optimizerOptionsReset(const optimizer_options_type &options, std::size_t param_group)
Resets the optimizer options.
Definition iganet.hpp:1095
void eval()
Evaluate IgANet.
Definition iganet.hpp:1325
optimizer_options_type & optimizerOptions(std::size_t param_group=0)
Returns a non-constant reference to the optimizer options.
Definition iganet.hpp:1067
const optimizer_type & optimizer() const
Returns a constant reference to the optimizer.
Definition iganet.hpp:1040
bool operator==(const IgANet &other) const
Returns true if both IgANet objects are the same.
Definition iganet.hpp:1433
void optimizerReset(const optimizer_options_type &optimizerOptions)
Resets the optimizer.
Definition iganet.hpp:1062
IgANet(const std::vector< int64_t > &layers, const std::vector< std::vector< std::any > > &activations, std::array< int64_t, Coeffs > ncoeffs, IgANetOptions defaults={}, iganet::Options< typename Base::value_type > options=iganet::Options< typename Base::value_type >{})
Constructor: number of layers, activation functions, and number of spline coefficients (same for geom...
Definition iganet.hpp:973
bool operator!=(const IgANet &other) const
Returns true if both IgANet objects are different.
Definition iganet.hpp:1447
Instance Normalization as described in the paper.
Definition layer.hpp:958
Layer Normalization as described in the paper.
Definition layer.hpp:1064
Leaky ReLU activation function.
Definition layer.hpp:1159
Local response Normalization.
Definition layer.hpp:1234
LogSigmoid activation function.
Definition layer.hpp:1326
LogSoftmax activation function.
Definition layer.hpp:1377
Mish activation function.
Definition layer.hpp:1444
No-op activation function.
Definition layer.hpp:92
Lp Normalization.
Definition layer.hpp:1487
The Options class handles the automated determination of dtype from the template argument and the sel...
Definition options.hpp:107
PReLU activation function.
Definition layer.hpp:1562
Randomized ReLU activation function.
Definition layer.hpp:1764
ReLU6 activation function.
Definition layer.hpp:1692
ReLU activation function.
Definition layer.hpp:1624
SELU activation function.
Definition layer.hpp:1847
Sigmoid Linear Unit activation function.
Definition layer.hpp:1959
Sigmoid activation function.
Definition layer.hpp:1915
Softmax activation function.
Definition layer.hpp:2004
Softmin activation function.
Definition layer.hpp:2075
Softplus activation function.
Definition layer.hpp:2146
Softshrink activation function.
Definition layer.hpp:2228
Softsign activation function.
Definition layer.hpp:2300
Tanh activation function.
Definition layer.hpp:2344
Tanhshrink activation function.
Definition layer.hpp:2387
Threshold activation function.
Definition layer.hpp:2435
Full qualified name descriptor.
Definition fqn.hpp:26
virtual const std::string & name() const noexcept
Returns the full qualified name of the object.
Definition fqn.hpp:31
Concept to identify template parameters that are derived from iganet::details::FunctionSpaceType.
Definition functionspace.hpp:3117
Concept to identify template parameters that are derived from torch::optim::Optimizer.
Definition optimizer.hpp:21
Container utility functions.
Full qualified name utility functions.
Isogeometric analysis base class.
auto zip(T &&...seqs)
Definition zip.hpp:97
Definition boundary.hpp:22
decltype(std::declval< Variable >() .template find_knot_indices< functionspace::interior >(std::declval< typename Variable::eval_type >())) variable_interior_knot_indices_type
Type of the knot indices of the variables in the interior.
Definition iganet.hpp:1503
decltype(std::declval< GeometryMap >() .template find_coeff_indices< functionspace::boundary >(std::declval< typename GeometryMap::boundary_eval_type >())) geometryMap_boundary_coeff_indices_type
Type of the coefficient indices of geometry type at the boundary.
Definition iganet.hpp:1522
decltype(std::declval< Variable >() .template find_knot_indices< functionspace::boundary >(std::declval< typename Variable::boundary_eval_type >())) variable_boundary_knot_indices_type
Type of the knot indices of boundary_eval_type type at the boundary.
Definition iganet.hpp:1509
decltype(std::declval< Variable >() .template find_coeff_indices< functionspace::interior >(std::declval< typename Variable::eval_type >())) variable_interior_coeff_indices_type
Type of the coefficient indices of variable type in the interior.
Definition iganet.hpp:1528
decltype(std::declval< GeometryMap >() .template find_knot_indices< functionspace::boundary >(std::declval< typename GeometryMap::boundary_eval_type >())) geometryMap_boundary_knot_indices_type
Type of the knot indices of the geometry map at the boundary.
Definition iganet.hpp:1497
decltype(std::declval< GeometryMap >() .template find_coeff_indices< functionspace::interior >(std::declval< typename GeometryMap::eval_type >())) geometryMap_interior_coeff_indices_type
Type of the coefficient indices of geometry type in the interior.
Definition iganet.hpp:1515
struct iganet::@0 Log
Logger.
decltype(std::declval< Variable >() .template find_coeff_indices< functionspace::boundary >(std::declval< typename Variable::boundary_eval_type >())) variable_boundary_coeff_indices_type
Type of the coefficient indices of variable type at the boundary.
Definition iganet.hpp:1534
activation
Enumerator for nonlinear activation functions.
Definition layer.hpp:23
std::ostream & operator<<(std::ostream &os, const Boundary< Spline > &obj)
Print (as string) a Boundary object.
Definition boundary.hpp:1963
decltype(std::declval< GeometryMap >() .template find_knot_indices< functionspace::interior >(std::declval< typename GeometryMap::eval_type >())) geometryMap_interior_knot_indices_type
Type of the knot indices of the geometry map in the interior.
Definition iganet.hpp:1490
IgANetCustomizable.
Definition iganet.hpp:1484
IgANetOptions.
Definition iganet.hpp:31
TORCH_ARG(int64_t, batch_size)
TORCH_ARG(double, min_loss)
TORCH_ARG(int64_t, max_epoch)
Serialization prototype.
Definition serialize.hpp:31