Class: Legion::Extensions::Agentic::Attention::Subliminal::Helpers::SubliminalEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb

Constant Summary

Constants included from Constants

Constants::ACCUMULATION_RATE, Constants::ACTIVATION_BOOST, Constants::ACTIVATION_DECAY, Constants::ACTIVATION_LABELS, Constants::CONSCIOUS_THRESHOLD, Constants::DEFAULT_ACTIVATION, Constants::EXTINCTION_THRESHOLD, Constants::INFLUENCE_LABELS, Constants::INFLUENCE_STRENGTH, Constants::INFLUENCE_TARGETS, Constants::MAX_INFLUENCES, Constants::MAX_INFLUENCE_PER_DOMAIN, Constants::MAX_TOTAL_INFLUENCE, Constants::MAX_TRACES, Constants::SATURATION_LABELS, Constants::SUBLIMINAL_CEILING, Constants::SUBLIMINAL_FLOOR, Constants::TRACE_TYPES

Instance Method Summary collapse

Methods included from Constants

label_for

Constructor Details

#initializeSubliminalEngine

Returns a new instance of SubliminalEngine.



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

def initialize
  @traces = {}
  @influences = []
end

Instance Method Details

#active_tracesObject



56
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 56

def active_traces = @traces.values.select(&:active?)

#boost_trace(trace_id:, amount: ACTIVATION_BOOST) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 26

def boost_trace(trace_id:, amount: ACTIVATION_BOOST)
  trace = @traces[trace_id]
  return nil unless trace

  trace.boost!(amount: amount)
  trace
end

#breached_tracesObject



101
102
103
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 101

def breached_traces
  @traces.values.select(&:breached_threshold?)
end

#create_trace(content:, trace_type: :associative, domain: :general, activation: DEFAULT_ACTIVATION, influence_target: :attention) ⇒ Object



17
18
19
20
21
22
23
24
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 17

def create_trace(content:, trace_type: :associative, domain: :general, activation: DEFAULT_ACTIVATION,
                 influence_target: :attention)
  prune_extinct
  trace = SubliminalTrace.new(content: content, trace_type: trace_type, domain: domain,
                              activation: activation, influence_target: influence_target)
  @traces[trace.id] = trace
  trace
end

#decay_all!Object



50
51
52
53
54
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 50

def decay_all!
  @traces.each_value(&:decay!)
  prune_extinct
  { traces_remaining: @traces.size }
end

#domain_saturation(domain:) ⇒ Object



80
81
82
83
84
85
86
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 80

def domain_saturation(domain:)
  domain_traces = traces_by_domain(domain: domain)
  return 0.0 if domain_traces.empty?

  total_activation = domain_traces.sum(&:activation)
  (total_activation / (domain_traces.size * SUBLIMINAL_CEILING)).clamp(0.0, 1.0).round(10)
end

#extinct_tracesObject



59
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 59

def extinct_traces = @traces.values.select(&:extinct?)

#influence_on(target:) ⇒ Object



73
74
75
76
77
78
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 73

def influence_on(target:)
  recent = @influences.last(100).select { |e| e.target == target.to_sym }
  return 0.0 if recent.empty?

  recent.sum(&:magnitude).clamp(0.0, MAX_TOTAL_INFLUENCE).round(10)
end

#near_threshold_tracesObject



57
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 57

def near_threshold_traces = @traces.values.select(&:near_threshold?)

#overall_subliminal_loadObject



88
89
90
91
92
93
94
95
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 88

def overall_subliminal_load
  return 0.0 if @traces.empty?

  active = active_traces
  return 0.0 if active.empty?

  (active.sum(&:activation) / (active.size * SUBLIMINAL_CEILING)).clamp(0.0, 1.0).round(10)
end

#potent_tracesObject



58
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 58

def potent_traces = @traces.values.select(&:potent?)

#process_influences!Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 34

def process_influences!
  active = active_traces
  events = []
  active.each do |trace|
    mag = trace.exert_influence!
    next if mag <= 0.0

    event = InfluenceEvent.new(trace_id: trace.id, target: trace.influence_target,
                               magnitude: mag, domain: trace.domain)
    events << event
    @influences << event
  end
  prune_influences
  { influences_generated: events.size, events: events.map(&:to_h) }
end

#saturation_labelObject



97
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 97

def saturation_label = Constants.label_for(SATURATION_LABELS, overall_subliminal_load)

#strongest_traces(limit: 5) ⇒ Object



99
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 99

def strongest_traces(limit: 5) = @traces.values.sort_by { |t| -t.activation }.first(limit)

#subliminal_reportObject



105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 105

def subliminal_report
  {
    total_traces:     @traces.size,
    active_count:     active_traces.size,
    near_threshold:   near_threshold_traces.size,
    potent_count:     potent_traces.size,
    total_influences: @influences.size,
    subliminal_load:  overall_subliminal_load,
    saturation_label: saturation_label,
    breached_count:   breached_traces.size,
    strongest:        strongest_traces(limit: 3).map(&:to_h)
  }
end

#to_hObject



119
120
121
122
123
124
125
126
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 119

def to_h
  {
    total_traces:     @traces.size,
    active:           active_traces.size,
    subliminal_load:  overall_subliminal_load,
    total_influences: @influences.size
  }
end

#traces_by_domain(domain:) ⇒ Object



61
62
63
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 61

def traces_by_domain(domain:)
  @traces.values.select { |t| t.domain == domain.to_sym }
end

#traces_by_target(target:) ⇒ Object



69
70
71
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 69

def traces_by_target(target:)
  @traces.values.select { |t| t.influence_target == target.to_sym }
end

#traces_by_type(trace_type:) ⇒ Object



65
66
67
# File 'lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb', line 65

def traces_by_type(trace_type:)
  @traces.values.select { |t| t.trace_type == trace_type.to_sym }
end