Dynamic Neural Field Composer 0.0.0
A C++20 library and interactive application for building and simulating Dynamic Neural Field (DNF) architectures.
Loading...
Searching...
No Matches
gauss_field_coupling.h
Go to the documentation of this file.
1#pragma once
2
3#include "element.h"
4#include "tools/math.h"
5#include "tools/utils.h"
6
7
9{
18 {
19 double x_i;
20 double x_j;
21 double amplitude;
22 double width;
23
29 GaussCoupling(const double x_i, const double x_j, const double amplitude, const double width)
31 {
32 if (x_i <= 0.0 || x_j <= 0.0 || amplitude <= 0.0 || width <= 0.0)
33 throw Exception(ErrorCode::ELEM_INVALID_PARAMETER, "GaussCoupling");
34 }
35
36 bool operator==(const GaussCoupling& other) const
37 {
38 constexpr double epsilon = 1e-6;
39
40 return std::abs(x_i - other.x_i) < epsilon &&
41 std::abs(x_j - other.x_j) < epsilon &&
42 std::abs(amplitude - other.amplitude) < epsilon &&
43 std::abs(width - other.width) < epsilon;
44 }
45
46 [[nodiscard]] std::string toString() const
47 {
48 std::string result = "Gauss coupling [";
49 result += "x_i: " + std::format("{:.2f}", x_i) + " ";
50 result += "x_j: " + std::format("{:.2f}", x_j) + " ";
51 result += "a: " + std::format("{:.2f}", amplitude) + " ";
52 result += "w: " + std::format("{:.2f}", width) + "]\n";
53 return result;
54 }
55 };
56
57
61 {
64 bool circular;
65 std::vector<GaussCoupling> couplings;
66
78
80 void addCoupling(const GaussCoupling& coupling)
81 {
82 couplings.emplace_back(coupling);
83 }
84
85 [[nodiscard]] std::string toString() const override
86 {
87 std::ostringstream result;
88 result << std::fixed << std::setprecision(2);
89 result << "Parameters: ["
90 << "Circular: " << (circular ? "true" : "false") << ", "
91 << "Normalized: " << (normalized ? "true" : "false") << ", "
92 << "Input field dimensions: " + inputFieldDimensions.toString() << "]\n";
93
94 for (const auto& coupling : couplings)
95 result << coupling.toString();
96
97 return result.str();
98 }
99 };
100
110 class GaussFieldCoupling final : public Element
111 {
112 private:
114 public:
118 GaussFieldCoupling(const ElementCommonParameters& elementCommonParameters,
119 const GaussFieldCouplingParameters& gfc_parameters);
120
123 void addCoupling(const GaussCoupling& coupling);
124
125 void init() override;
126 void step(double t, double deltaT) override;
127 std::string toString() const override;
128 std::shared_ptr<Element> clone() const override;
129
133 void changeDimensions(const ElementDimensions& newDimensions) override;
134
138 void changeInputDimensions(const ElementDimensions& newInputDimensions);
139
141 void setParameters(const GaussFieldCouplingParameters& gfc_parameters);
143 private:
144 void updateOutput();
145 void updateInputFieldDimensions();
146 };
147
148}
Definition exception.h:25
Abstract base class for all simulation elements.
Definition element.h:28
Sparse Gaussian field coupling with a fixed, user-defined projection.
Definition gauss_field_coupling.h:111
void changeInputDimensions(const ElementDimensions &newInputDimensions)
Resize the input field dimensions and rebuild the weight matrix. Preserves output field dimensions an...
Definition gauss_field_coupling.cpp:109
void changeDimensions(const ElementDimensions &newDimensions) override
Resize the output field dimensions and rebuild the weight matrix. Preserves input field dimensions an...
Definition gauss_field_coupling.cpp:100
void setParameters(const GaussFieldCouplingParameters &gfc_parameters)
Definition gauss_field_coupling.cpp:118
std::shared_ptr< Element > clone() const override
Definition gauss_field_coupling.cpp:70
void step(double t, double deltaT) override
Advance the element by one time step.
Definition gauss_field_coupling.cpp:56
std::string toString() const override
Definition gauss_field_coupling.cpp:62
void addCoupling(const GaussCoupling &coupling)
Append a new point-coupling at runtime.
Definition gauss_field_coupling.cpp:90
ElementDimensions getInputFieldDimensions() const
Definition gauss_field_coupling.cpp:124
GaussFieldCouplingParameters getParameters() const
Definition gauss_field_coupling.cpp:95
void init() override
Initialize the element (called once before the simulation loop).
Definition gauss_field_coupling.cpp:17
Definition element_parameters.h:10
Definition element_parameters.h:188
Definition element_parameters.h:159
std::string toString() const
Definition element_parameters.cpp:55
Definition element_parameters.h:206
A single sparse Gaussian point-coupling between two spatial locations.
Definition gauss_field_coupling.h:18
GaussCoupling(const double x_i, const double x_j, const double amplitude, const double width)
Construct a GaussCoupling. All parameters must be positive.
Definition gauss_field_coupling.h:29
double amplitude
Peak coupling weight.
Definition gauss_field_coupling.h:21
double x_j
Target location in the output field.
Definition gauss_field_coupling.h:20
double width
Gaussian spread (σ) of the coupling.
Definition gauss_field_coupling.h:22
double x_i
Source location in the input field.
Definition gauss_field_coupling.h:19
bool operator==(const GaussCoupling &other) const
Definition gauss_field_coupling.h:36
std::string toString() const
Definition gauss_field_coupling.h:46
Parameters for a sparse Gaussian field coupling (fixed projection).
Definition gauss_field_coupling.h:61
std::string toString() const override
Definition gauss_field_coupling.h:85
GaussFieldCouplingParameters(const ElementDimensions &inputFieldDimensions=ElementDimensions{}, bool normalized=true, bool circular=false, const std::vector< GaussCoupling > &couplings={})
Construct GaussFieldCoupling parameters.
Definition gauss_field_coupling.h:72
ElementDimensions inputFieldDimensions
Spatial dimensions of the source field.
Definition gauss_field_coupling.h:62
bool circular
If true, convolution wraps at field boundaries.
Definition gauss_field_coupling.h:64
std::vector< GaussCoupling > couplings
List of explicit point-to-point Gaussian couplings.
Definition gauss_field_coupling.h:65
void addCoupling(const GaussCoupling &coupling)
Append a coupling to the list.
Definition gauss_field_coupling.h:80
bool normalized
If true, each coupling Gaussian is area-normalised.
Definition gauss_field_coupling.h:63