Class: Legion::Extensions::Agentic::Affect::Reward::Helpers::RewardStore

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(signal: nil) ⇒ RewardStore

Returns a new instance of RewardStore.



12
13
14
# File 'lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb', line 12

def initialize(signal: nil)
  @signal = signal || RewardSignal.new
end

Instance Attribute Details

#signalObject (readonly)

Returns the value of attribute signal.



10
11
12
# File 'lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb', line 10

def signal
  @signal
end

Instance Method Details

#all_domain_averagesObject



35
36
37
38
39
# File 'lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb', line 35

def all_domain_averages
  @signal.domain_history.keys.to_h do |domain|
    [domain, @signal.domain_average(domain).round(4)]
  end
end

#domain_report(domain) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb', line 26

def domain_report(domain)
  {
    domain:  domain,
    average: @signal.domain_average(domain),
    trend:   @signal.domain_trend(domain),
    history: @signal.domain_history[domain]&.last(10) || []
  }
end

#health_assessmentObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb', line 41

def health_assessment
  avg = @signal.running_average
  vol = @signal.reward_volatility

  if @signal.anhedonic?
    { status: :anhedonic, description: 'Persistently low reward — possible disengagement', severity: :high }
  elsif @signal.euphoric?
    { status: :euphoric, description: 'Persistently high reward — possible overconfidence', severity: :moderate }
  elsif vol > 0.4
    { status: :volatile, description: 'Highly variable reward — unstable learning signals', severity: :moderate }
  elsif avg.between?(-0.1, 0.1)
    { status: :neutral, description: 'Low reward signal — minimal learning happening', severity: :low }
  else
    { status: :healthy, description: 'Balanced reward signal — healthy learning', severity: :none }
  end
end

#process_tick(tick_results) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/legion/extensions/agentic/affect/reward/helpers/reward_store.rb', line 16

def process_tick(tick_results)
  source_signals = extract_signals(tick_results)
  result = @signal.compute(source_signals)

  domain = extract_domain(tick_results)
  @signal.record_domain_reward(domain, result[:reward]) if domain

  result
end