Class: Legion::Extensions::Agentic::Attention::Blink::Helpers::BlinkEngine
- Inherits:
-
Object
- Object
- Legion::Extensions::Agentic::Attention::Blink::Helpers::BlinkEngine
show all
- Includes:
- Constants
- Defined in:
- lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb
Constant Summary
Constants included
from Constants
Constants::DEFAULT_BLINK_DURATION, Constants::LAG1_SPARING_THRESHOLD, Constants::MAX_BLINKS, Constants::MAX_BLINK_DURATION, Constants::MAX_STIMULI, Constants::MIN_BLINK_DURATION, Constants::PROCESSING_LABELS, Constants::RECOVERY_LABELS, Constants::RECOVERY_RATE, Constants::SALIENCE_THRESHOLD, Constants::STIMULUS_TYPES
Instance Method Summary
collapse
Constructor Details
Returns a new instance of BlinkEngine.
12
13
14
15
16
17
18
19
20
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 12
def initialize
@stimuli = {}
@blink_active = false
@blink_start = nil
@blink_duration = DEFAULT_BLINK_DURATION
@recovery = 1.0
@total_blinks = 0
@total_misses = 0
end
|
Instance Method Details
#adjust_blink_duration(duration:) ⇒ Object
82
83
84
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 82
def adjust_blink_duration(duration:)
@blink_duration = duration.to_f.clamp(MIN_BLINK_DURATION, MAX_BLINK_DURATION)
end
|
#blink_active? ⇒ Boolean
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 40
def blink_active?
return false unless @blink_active
elapsed = Time.now.utc.to_f - @blink_start
if elapsed >= @blink_duration
@blink_active = false
@recovery = 1.0
return false
end
true
end
|
#blink_report ⇒ Object
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 112
def blink_report
{
total_stimuli: @stimuli.size,
total_blinks: @total_blinks,
total_misses: @total_misses,
miss_rate: miss_rate,
blink_active: blink_active?,
recovery_level: recovery_level,
recovery_label: recovery_label,
blink_duration: @blink_duration,
avg_quality: processing_quality_average,
recent_missed: missed_stimuli.last(5).map(&:to_h)
}
end
|
#force_blink!(duration: DEFAULT_BLINK_DURATION) ⇒ Object
66
67
68
69
70
71
72
73
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 66
def force_blink!(duration: DEFAULT_BLINK_DURATION)
@blink_active = true
@blink_start = Time.now.utc.to_f
@blink_duration = duration.to_f.clamp(MIN_BLINK_DURATION, MAX_BLINK_DURATION)
@recovery = 0.0
@total_blinks += 1
{ blink_active: true, duration: @blink_duration, total_blinks: @total_blinks }
end
|
#force_recover! ⇒ Object
75
76
77
78
79
80
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 75
def force_recover!
@blink_active = false
@recovery = 1.0
@blink_start = nil
{ blink_active: false, recovery: 1.0 }
end
|
#miss_rate ⇒ Object
86
87
88
89
90
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 86
def miss_rate
return 0.0 if @stimuli.empty?
(@total_misses.to_f / @stimuli.size).round(10)
end
|
#missed_stimuli ⇒ Object
96
97
98
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 96
def missed_stimuli
@stimuli.values.select(&:missed?)
end
|
#processing_quality_average ⇒ Object
105
106
107
108
109
110
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 105
def processing_quality_average
return 0.0 if @stimuli.empty?
qualities = @stimuli.values.map(&:processing_quality)
(qualities.sum / qualities.size).round(10)
end
|
#recent_stimuli(limit: 10) ⇒ Object
92
93
94
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 92
def recent_stimuli(limit: 10)
@stimuli.values.sort_by { |s| -s.arrival_time }.first(limit)
end
|
#recovery_label ⇒ Object
61
62
63
64
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 61
def recovery_label
match = RECOVERY_LABELS.find { |range, _| range.cover?(recovery_level) }
match ? match.last : :saturated
end
|
#recovery_level ⇒ Object
53
54
55
56
57
58
59
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 53
def recovery_level
return 1.0 unless @blink_active
elapsed = Time.now.utc.to_f - @blink_start
progress = (elapsed / @blink_duration).clamp(0.0, 1.0)
(progress**0.5).round(10)
end
|
#stimuli_by_type(stimulus_type:) ⇒ Object
100
101
102
103
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 100
def stimuli_by_type(stimulus_type:)
st = stimulus_type.to_sym
@stimuli.values.select { |s| s.stimulus_type == st }
end
|
#submit_stimulus(stimulus_type:, content:, salience: 0.5) ⇒ Object
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 22
def submit_stimulus(stimulus_type:, content:, salience: 0.5)
prune_stimuli_if_needed
stimulus = Stimulus.new(
stimulus_type: stimulus_type,
content: content,
salience: salience
)
quality = compute_processing_quality(stimulus)
stimulus.process!(quality: quality)
trigger_blink!(stimulus) if stimulus.salient? && !@blink_active
@total_misses += 1 if stimulus.missed?
@stimuli[stimulus.id] = stimulus
stimulus
end
|
#to_h ⇒ Object
127
128
129
130
131
132
133
134
135
|
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 127
def to_h
{
total_stimuli: @stimuli.size,
total_blinks: @total_blinks,
miss_rate: miss_rate,
blink_active: blink_active?,
avg_quality: processing_quality_average
}
end
|