Class: Legion::Extensions::Agentic::Attention::Surprise::Helpers::SurpriseStore

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSurpriseStore

Returns a new instance of SurpriseStore.



12
13
14
15
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 12

def initialize
  @events    = []
  @baselines = {}
end

Instance Attribute Details

#eventsObject (readonly)

Returns the value of attribute events.



10
11
12
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 10

def events
  @events
end

Instance Method Details

#baseline_for(domain) ⇒ Object



36
37
38
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 36

def baseline_for(domain)
  @baselines.fetch(domain, 0.0)
end

#by_domain(domain) ⇒ Object



28
29
30
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 28

def by_domain(domain)
  @events.select { |e| e.domain == domain }
end

#most_surprising(count = 5) ⇒ Object



32
33
34
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 32

def most_surprising(count = 5)
  @events.sort_by { |e| -e.magnitude }.first(count)
end

#recent(count = 10) ⇒ Object



24
25
26
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 24

def recent(count = 10)
  @events.last(count)
end

#record(event) ⇒ Object



17
18
19
20
21
22
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 17

def record(event)
  @events << event
  update_baseline(event.domain, event.magnitude)
  trim
  event
end

#to_hObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb', line 40

def to_h
  total    = @events.size
  domains  = @events.map(&:domain).uniq
  avg_mag  = total.positive? ? (@events.sum(&:magnitude) / total).round(4) : 0.0
  top      = most_surprising(1).first

  {
    total_events:           total,
    domain_count:           domains.size,
    average_magnitude:      avg_mag,
    most_surprising_domain: top&.domain,
    baselines:              @baselines.transform_values { |v| v.round(4) }
  }
end