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
neural_field_2d.h
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <queue>
5#include <sstream>
6#include <iomanip>
7#include <format>
8
9#include "element.h"
10#include "activation_function.h"
11
13{
15 {
16 double tau;
18 std::unique_ptr<ActivationFunction> activationFunction;
19
21 : tau(25.0), startingRestingLevel(-5.0),
22 activationFunction(std::make_unique<SigmoidFunction>(0.0, 10.0))
23 {}
24
25 NeuralField2DParameters(double tau, double restingLevel, const ActivationFunction& af)
26 : tau(tau), startingRestingLevel(restingLevel), activationFunction(af.clone())
27 {}
28
32 ? other.activationFunction->clone()
33 : std::make_unique<SigmoidFunction>(0.0, 10.0))
34 {}
35
37 {
38 if (this != &other)
39 {
40 tau = other.tau;
43 ? other.activationFunction->clone()
44 : std::make_unique<SigmoidFunction>(0.0, 10.0);
45 }
46 return *this;
47 }
48
49 bool operator==(const NeuralField2DParameters& other) const
50 {
51 constexpr double epsilon = 1e-6;
52 return std::abs(tau - other.tau) < epsilon &&
53 std::abs(startingRestingLevel - other.startingRestingLevel) < epsilon;
54 }
55
56 [[nodiscard]] std::string toString() const override
57 {
58 std::ostringstream result;
59 result << "Parameters: ["
60 << "Tau: " << std::fixed << std::setprecision(2) << tau << ", "
61 << "Resting level: " << startingRestingLevel << ", "
62 << "Activation Function: " << (activationFunction ? activationFunction->toString() : "None")
63 << "]";
64 return result.str();
65 }
66 };
67
69 {
70 double centroid_x = 0.0;
71 double centroid_y = 0.0;
72 double amplitude = 0.0;
73 double area = 0.0;
74 double velocity_x = 0.0;
75 double velocity_y = 0.0;
76
77 [[nodiscard]] std::string toString() const
78 {
79 std::string str = "Bump 2D: [";
80 str += "Centroid: (" + std::format("{:.2f}", centroid_x) + ", " + std::format("{:.2f}", centroid_y) + "), ";
81 str += "Amplitude: " + std::format("{:.2f}", amplitude) + ", ";
82 str += "Area: " + std::format("{:.2f}", area) + ", ";
83 str += "Velocity: (" + std::format("{:.2f}", velocity_x) + ", " + std::format("{:.2f}", velocity_y) + ")]";
84 return str;
85 }
86
91 };
92
94 {
95 std::vector<NeuralField2DBump> bumps;
96 bool stable = false;
97 double lowestActivation = 0.0;
98 double highestActivation = 0.0;
99 double thresholdForStability = 0.895;
103
104 [[nodiscard]] std::string toString() const
105 {
106 std::string str = "Neural field 2D state [";
107 str += "Stable: " + std::string(stable ? "true" : "false") + ", ";
108 str += "Lowest act.: " + std::format("{:.2f}", lowestActivation) + ", ";
109 str += "Highest act.: " + std::format("{:.2f}", highestActivation) + ", ";
110 str += "Threshold: " + std::format("{:.2f}", thresholdForStability) + "]\n";
111 str += "Bumps: {";
112 for (const auto& bump : bumps)
113 str += bump.toString();
114 str += "}";
115 return str;
116 }
117
122 };
123
124 class NeuralField2D final : public Element
125 {
126 private:
127 NeuralField2DParameters parameters;
128 NeuralField2DState state;
129 double* act_ = nullptr;
130 double* inp_ = nullptr;
131 double* rest_ = nullptr;
132 bool computeStateMetrics_ = true;
133 std::vector<NeuralField2DBump> prevBumps_;
134 public:
135 NeuralField2D(const ElementCommonParameters& elementCommonParameters,
136 const NeuralField2DParameters& parameters);
137
138 void init() override;
139 void step(double t, double deltaT) override;
140 std::string toString() const override;
141 std::shared_ptr<Element> clone() const override;
142
143 void setParameters(const NeuralField2DParameters& parameters);
145
146 void setThresholdForStability(double threshold) { state.thresholdForStability = threshold; }
147 double getStabilityThreshold() const { return state.thresholdForStability; }
148 bool isStable() const { return state.stable; }
149 double getLowestActivation() const { return state.lowestActivation; }
150 double getHighestActivation() const { return state.highestActivation; }
151 std::vector<NeuralField2DBump> getBumps() const { return state.bumps; }
152 void setComputeStateMetrics(bool enable) { computeStateMetrics_ = enable; }
153 bool getComputeStateMetrics() const { return computeStateMetrics_; }
154
155 private:
156 void calculateActivation(double t, double deltaT);
157 void calculateOutput();
158 void updateState(double deltaT);
159 void updateBumps(double deltaT);
160 };
161}
Abstract base class for all simulation elements.
Definition element.h:28
Definition neural_field_2d.h:125
std::vector< NeuralField2DBump > getBumps() const
Definition neural_field_2d.h:151
bool isStable() const
Definition neural_field_2d.h:148
void setThresholdForStability(double threshold)
Definition neural_field_2d.h:146
std::string toString() const override
Definition neural_field_2d.cpp:162
double getHighestActivation() const
Definition neural_field_2d.h:150
NeuralField2DParameters getParameters() const
Definition neural_field_2d.cpp:182
void step(double t, double deltaT) override
Advance the element by one time step.
Definition neural_field_2d.cpp:29
void setComputeStateMetrics(bool enable)
Definition neural_field_2d.h:152
bool getComputeStateMetrics() const
Definition neural_field_2d.h:153
double getLowestActivation() const
Definition neural_field_2d.h:149
std::shared_ptr< Element > clone() const override
Definition neural_field_2d.cpp:171
void init() override
Initialize the element (called once before the simulation loop).
Definition neural_field_2d.cpp:15
void setParameters(const NeuralField2DParameters &parameters)
Definition neural_field_2d.cpp:176
double getStabilityThreshold() const
Definition neural_field_2d.h:147
Definition element_parameters.h:10
@ INFO
Definition logger.h:23
void log(LogLevel level, const std::string &message, LogOutputMode mode=ALL)
Definition logger.cpp:78
Abstract base for activation functions applied to a neural field.
Definition activation_function.h:36
Definition element_parameters.h:188
Definition element_parameters.h:206
Definition neural_field_2d.h:69
double centroid_x
Definition neural_field_2d.h:70
double amplitude
Definition neural_field_2d.h:72
std::string toString() const
Definition neural_field_2d.h:77
void print() const
Definition neural_field_2d.h:87
double area
Definition neural_field_2d.h:73
double velocity_y
Definition neural_field_2d.h:75
double centroid_y
Definition neural_field_2d.h:71
double velocity_x
Definition neural_field_2d.h:74
Definition neural_field_2d.h:15
double tau
Definition neural_field_2d.h:16
NeuralField2DParameters(double tau, double restingLevel, const ActivationFunction &af)
Definition neural_field_2d.h:25
NeuralField2DParameters()
Definition neural_field_2d.h:20
bool operator==(const NeuralField2DParameters &other) const
Definition neural_field_2d.h:49
std::unique_ptr< ActivationFunction > activationFunction
Definition neural_field_2d.h:18
std::string toString() const override
Definition neural_field_2d.h:56
double startingRestingLevel
Definition neural_field_2d.h:17
NeuralField2DParameters & operator=(const NeuralField2DParameters &other)
Definition neural_field_2d.h:36
NeuralField2DParameters(const NeuralField2DParameters &other)
Definition neural_field_2d.h:29
Definition neural_field_2d.h:94
double highestActivation
Definition neural_field_2d.h:98
double previousActivationNorm
Definition neural_field_2d.h:102
double previousActivationAvg
Definition neural_field_2d.h:101
std::string toString() const
Definition neural_field_2d.h:104
void print() const
Definition neural_field_2d.h:118
std::vector< NeuralField2DBump > bumps
Definition neural_field_2d.h:95
double lowestActivation
Definition neural_field_2d.h:97
double thresholdForStability
Definition neural_field_2d.h:99
double previousActivationSum
Definition neural_field_2d.h:100
bool stable
Definition neural_field_2d.h:96
Logistic (exponential) sigmoid.
Definition activation_function.h:70