Class: Legion::Extensions::Agentic::Homeostasis::Pendulum::Helpers::PendulumEngine
- Inherits:
-
Object
- Object
- Legion::Extensions::Agentic::Homeostasis::Pendulum::Helpers::PendulumEngine
- Defined in:
- lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb
Instance Attribute Summary collapse
-
#pendulums ⇒ Object
readonly
Returns the value of attribute pendulums.
Instance Method Summary collapse
- #check_resonance(frequency) ⇒ Object
- #count ⇒ Object
- #create_pendulum(pole_pair:, amplitude: 0.5, period: 10.0, damping: Constants::DAMPING_RATE) ⇒ Object
- #damp_all! ⇒ Object
- #dominant_pole(pendulum_id) ⇒ Object
- #get(pendulum_id) ⇒ Object
-
#initialize ⇒ PendulumEngine
constructor
A new instance of PendulumEngine.
- #most_active(limit: 5) ⇒ Object
- #most_damped(limit: 5) ⇒ Object
- #pendulum_report ⇒ Object
- #swing(pendulum_id, force: 0.0) ⇒ Object
Constructor Details
#initialize ⇒ PendulumEngine
Returns a new instance of PendulumEngine.
12 13 14 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 12 def initialize @pendulums = {} end |
Instance Attribute Details
#pendulums ⇒ Object (readonly)
Returns the value of attribute pendulums.
10 11 12 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 10 def pendulums @pendulums end |
Instance Method Details
#check_resonance(frequency) ⇒ Object
41 42 43 44 45 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 41 def check_resonance(frequency) return [] unless frequency.positive? @pendulums.values.select { |p| p.resonant_with?(frequency) }.map(&:id) end |
#count ⇒ Object
80 81 82 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 80 def count @pendulums.size end |
#create_pendulum(pole_pair:, amplitude: 0.5, period: 10.0, damping: Constants::DAMPING_RATE) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 16 def create_pendulum(pole_pair:, amplitude: 0.5, period: 10.0, damping: Constants::DAMPING_RATE) raise ArgumentError, "max pendulums (#{Constants::MAX_PENDULUMS}) reached" if @pendulums.size >= Constants::MAX_PENDULUMS pendulum = Pendulum.new( pole_pair: pole_pair, amplitude: amplitude, period: period, damping: damping ) @pendulums[pendulum.id] = pendulum pendulum end |
#damp_all! ⇒ Object
37 38 39 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 37 def damp_all! @pendulums.each_value(&:damp!) end |
#dominant_pole(pendulum_id) ⇒ Object
47 48 49 50 51 52 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 47 def dominant_pole(pendulum_id) p = @pendulums[pendulum_id] return nil unless p p.dominant_pole end |
#get(pendulum_id) ⇒ Object
76 77 78 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 76 def get(pendulum_id) @pendulums[pendulum_id] end |
#most_active(limit: 5) ⇒ Object
54 55 56 57 58 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 54 def most_active(limit: 5) @pendulums.values .sort_by { |p| -p.amplitude } .first(limit) end |
#most_damped(limit: 5) ⇒ Object
60 61 62 63 64 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 60 def most_damped(limit: 5) @pendulums.values .sort_by(&:amplitude) .first(limit) end |
#pendulum_report ⇒ Object
66 67 68 69 70 71 72 73 74 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 66 def pendulum_report { total: @pendulums.size, max: Constants::MAX_PENDULUMS, pole_pairs: @pendulums.values.group_by(&:pole_pair).transform_values(&:count), most_active: most_active(limit: 3).map(&:to_h), most_damped: most_damped(limit: 3).map(&:to_h) } end |
#swing(pendulum_id, force: 0.0) ⇒ Object
29 30 31 32 33 34 35 |
# File 'lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb', line 29 def swing(pendulum_id, force: 0.0) p = @pendulums[pendulum_id] return nil unless p p.swing!(force: force) p end |