Class: Legion::Extensions::Agentic::Homeostasis::Pendulum::Helpers::PendulumEngine

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/homeostasis/pendulum/helpers/pendulum_engine.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePendulumEngine

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

#pendulumsObject (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

#countObject



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

Raises:

  • (ArgumentError)


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_reportObject



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