Class: Legion::Extensions::Agentic::Learning::LearningRate::Helpers::RateModel

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb

Constant Summary

Constants included from Constants

Constants::ACCURACY_WINDOW, Constants::CONFIDENCE_DAMPENING, Constants::DEFAULT_RATE, Constants::ERROR_BOOST, Constants::MAX_DOMAINS, Constants::MAX_RATE, Constants::MAX_RATE_HISTORY, Constants::MIN_RATE, Constants::RATE_DECAY, Constants::RATE_DECREASE, Constants::RATE_INCREASE, Constants::RATE_LABELS, Constants::SURPRISE_BOOST

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRateModel

Returns a new instance of RateModel.



14
15
16
17
18
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 14

def initialize
  @rates            = {}
  @accuracy_buffers = {}
  @rate_history     = []
end

Instance Attribute Details

#accuracy_buffersObject (readonly)

Returns the value of attribute accuracy_buffers.



12
13
14
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 12

def accuracy_buffers
  @accuracy_buffers
end

#rate_historyObject (readonly)

Returns the value of attribute rate_history.



12
13
14
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 12

def rate_history
  @rate_history
end

#ratesObject (readonly)

Returns the value of attribute rates.



12
13
14
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 12

def rates
  @rates
end

Instance Method Details

#accuracy_for(domain) ⇒ Object



45
46
47
48
49
50
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 45

def accuracy_for(domain)
  buffer = @accuracy_buffers.fetch(domain, [])
  return 0.0 if buffer.empty?

  buffer.sum / buffer.size
end

#decayObject



52
53
54
55
56
57
58
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 52

def decay
  @rates.each_key do |domain|
    current = @rates[domain]
    delta = (current - DEFAULT_RATE) * RATE_DECAY
    @rates[domain] = (current - delta).clamp(MIN_RATE, MAX_RATE)
  end
end

#domain_countObject



82
83
84
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 82

def domain_count
  @rates.size
end

#fastest_domains(count = 5) ⇒ Object



68
69
70
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 68

def fastest_domains(count = 5)
  @rates.sort_by { |_, r| -r }.first(count).to_h
end

#label_for(domain) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 60

def label_for(domain)
  rate = rate_for(domain)
  RATE_LABELS.each do |range, lbl|
    return lbl if range.cover?(rate)
  end
  :consolidated
end

#overall_rateObject



76
77
78
79
80
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 76

def overall_rate
  return DEFAULT_RATE if @rates.empty?

  @rates.values.sum / @rates.size
end

#rate_for(domain) ⇒ Object



20
21
22
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 20

def rate_for(domain)
  @rates.fetch(domain, DEFAULT_RATE)
end

#record_error(domain:, magnitude:) ⇒ Object



38
39
40
41
42
43
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 38

def record_error(domain:, magnitude:)
  ensure_domain(domain)
  boost = magnitude * ERROR_BOOST
  @rates[domain] = (@rates[domain] + boost).clamp(MIN_RATE, MAX_RATE)
  record_event(domain, :error, @rates[domain])
end

#record_prediction(domain:, correct:) ⇒ Object



24
25
26
27
28
29
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 24

def record_prediction(domain:, correct:)
  ensure_domain(domain)
  @accuracy_buffers[domain] << (correct ? 1.0 : 0.0)
  @accuracy_buffers[domain].shift while @accuracy_buffers[domain].size > ACCURACY_WINDOW
  adjust_rate(domain, correct: correct)
end

#record_surprise(domain:, magnitude:) ⇒ Object



31
32
33
34
35
36
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 31

def record_surprise(domain:, magnitude:)
  ensure_domain(domain)
  boost = magnitude * SURPRISE_BOOST
  @rates[domain] = (@rates[domain] + boost).clamp(MIN_RATE, MAX_RATE)
  record_event(domain, :surprise, @rates[domain])
end

#slowest_domains(count = 5) ⇒ Object



72
73
74
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 72

def slowest_domains(count = 5)
  @rates.sort_by { |_, r| r }.first(count).to_h
end

#to_hObject



86
87
88
89
90
91
92
93
# File 'lib/legion/extensions/agentic/learning/learning_rate/helpers/rate_model.rb', line 86

def to_h
  {
    domain_count: @rates.size,
    overall_rate: overall_rate.round(4),
    rates:        @rates.dup,
    history_size: @rate_history.size
  }
end