Class: Legion::Extensions::Agentic::Homeostasis::Metabolism::Helpers::MetabolismEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb

Constant Summary collapse

MAX_EFFICIENCY_HISTORY =
200

Constants included from Constants

Constants::EFFICIENCY_DECAY, Constants::MAX_ENERGY, Constants::METABOLIC_STATES, Constants::OPERATION_COSTS, Constants::RECOVERY_RATE, Constants::RESTING_METABOLIC_RATE, Constants::STATE_THRESHOLDS

Instance Method Summary collapse

Methods included from Constants

label_for

Constructor Details

#initializeMetabolismEngine

Returns a new instance of MetabolismEngine.



14
15
16
17
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 14

def initialize
  @reserves = {}
  @efficiency_history = []
end

Instance Method Details

#all_reservesObject



96
97
98
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 96

def all_reserves
  @reserves.transform_values(&:to_h)
end

#anabolize(reserve_id:, energy_cost: 5.0) ⇒ Object



62
63
64
65
66
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 62

def anabolize(reserve_id:, energy_cost: 5.0)
  reserve = fetch_reserve(reserve_id)
  result = reserve.anabolize!(energy_cost: energy_cost)
  result.merge(reserve_id: reserve_id)
end

#catabolize(reserve_id:, complexity: 1.0) ⇒ Object



56
57
58
59
60
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 56

def catabolize(reserve_id:, complexity: 1.0)
  reserve = fetch_reserve(reserve_id)
  result = reserve.catabolize!(complexity: complexity)
  result.merge(reserve_id: reserve_id)
end

#create_reserve(max_energy: MAX_ENERGY, metabolic_rate: RESTING_METABOLIC_RATE, efficiency: 1.0) ⇒ Object



19
20
21
22
23
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 19

def create_reserve(max_energy: MAX_ENERGY, metabolic_rate: RESTING_METABOLIC_RATE, efficiency: 1.0)
  reserve = EnergyReserve.new(max_energy: max_energy, metabolic_rate: metabolic_rate, efficiency: efficiency)
  @reserves[reserve.id] = reserve
  reserve
end

#efficiency_historyObject



92
93
94
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 92

def efficiency_history
  @efficiency_history.dup
end

#metabolic_report(reserve_id:) ⇒ Object



84
85
86
87
88
89
90
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 84

def metabolic_report(reserve_id:)
  reserve = fetch_reserve(reserve_id)
  {
    reserve:            reserve.to_h,
    efficiency_history: efficiency_history_for(reserve_id)
  }
end

#recover(reserve_id:, duration: 1.0) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 42

def recover(reserve_id:, duration: 1.0)
  reserve = fetch_reserve(reserve_id)
  amount = (RECOVERY_RATE * duration.clamp(0.0, Float::INFINITY)).round(10)
  gained = reserve.recover!(amount)
  record_efficiency(reserve)
  {
    reserve_id:     reserve_id,
    duration:       duration,
    energy_gained:  gained.round(10),
    current_energy: reserve.current_energy.round(10),
    state:          reserve.state
  }
end

#run_cycle(reserve_id:, operations: []) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 68

def run_cycle(reserve_id:, operations: [])
  reserve = fetch_reserve(reserve_id)
  cycle   = MetabolicCycle.new

  operations.each do |op_type|
    cost_base = OPERATION_COSTS.fetch(op_type, 0.0)
    reserve.spend!(cost_base) if cost_base > 0.0
    cycle.record_operation(operation_type: op_type, energy_spent: cost_base)
  end

  reserve.spend!(reserve.metabolic_rate)
  cycle.record_operation(operation_type: :resting_rate, energy_spent: reserve.metabolic_rate)

  cycle.complete!.merge(reserve_state: reserve.state, reserve_energy: reserve.current_energy.round(10))
end

#spend_energy(reserve_id:, operation_type:) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/legion/extensions/agentic/homeostasis/metabolism/helpers/metabolism_engine.rb', line 25

def spend_energy(reserve_id:, operation_type:)
  reserve = fetch_reserve(reserve_id)
  cost = OPERATION_COSTS.fetch(operation_type) do
    raise ArgumentError, "Unknown operation type: #{operation_type.inspect}"
  end
  actual_spent = reserve.spend!(cost)
  record_efficiency(reserve)
  {
    reserve_id:     reserve_id,
    operation_type: operation_type,
    base_cost:      cost,
    actual_spent:   actual_spent.round(10),
    current_energy: reserve.current_energy.round(10),
    state:          reserve.state
  }
end