Class: Legion::Extensions::Agentic::Social::Entrainment::Helpers::EntrainmentEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb

Constant Summary

Constants included from Constants

Constants::COUPLING_RATE, Constants::DECOUPLING_RATE, Constants::DEFAULT_SYNC, Constants::ENTRAINED_THRESHOLD, Constants::MAX_HISTORY, Constants::MAX_PAIRINGS, Constants::MAX_SIGNALS, Constants::NATURAL_DRIFT, Constants::PARTIAL_THRESHOLD, Constants::SIGNAL_TYPES, Constants::SYNC_CEILING, Constants::SYNC_FLOOR, Constants::SYNC_LABELS

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEntrainmentEngine

Returns a new instance of EntrainmentEngine.



14
15
16
17
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 14

def initialize
  @pairings = {}
  @history  = []
end

Instance Attribute Details

#historyObject (readonly)

Returns the value of attribute history.



12
13
14
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 12

def history
  @history
end

Instance Method Details

#by_domain(domain:) ⇒ Object



63
64
65
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 63

def by_domain(domain:)
  @pairings.values.select { |p| p.domain == domain }
end

#create_pairing(agent_a:, agent_b:, domain:) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 19

def create_pairing(agent_a:, agent_b:, domain:)
  evict_oldest if @pairings.size >= MAX_PAIRINGS

  existing = find_pairing(agent_a: agent_a, agent_b: agent_b, domain: domain)
  return existing if existing

  pairing = Pairing.new(agent_a: agent_a, agent_b: agent_b, domain: domain)
  @pairings[pairing.id] = pairing
  record_history(:created, pairing.id)
  pairing
end

#drift_allObject



73
74
75
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 73

def drift_all
  @pairings.each_value(&:drift!)
end

#entrained_pairingsObject



49
50
51
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 49

def entrained_pairings
  @pairings.values.select(&:entrained?)
end

#entrained_partners(agent_id:) ⇒ Object



53
54
55
56
57
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 53

def entrained_partners(agent_id:)
  pairings_for(agent_id: agent_id)
    .select(&:entrained?)
    .map { |p| p.partner_of(agent_id) }
end

#overall_entrainmentObject



67
68
69
70
71
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 67

def overall_entrainment
  return 0.0 if @pairings.empty?

  @pairings.values.sum(&:synchrony) / @pairings.size
end

#pairings_for(agent_id:) ⇒ Object



45
46
47
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 45

def pairings_for(agent_id:)
  @pairings.values.select { |p| p.involves?(agent_id) }
end

#prune_independentObject



77
78
79
80
81
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 77

def prune_independent
  ids = @pairings.select { |_id, p| p.synchrony <= 0.02 }.keys
  ids.each { |id| @pairings.delete(id) }
  ids.size
end

#record_interaction(pairing_id:, aligned:) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 31

def record_interaction(pairing_id:, aligned:)
  pairing = @pairings[pairing_id]
  return { success: false, reason: :not_found } unless pairing

  pairing.interact!(aligned: aligned)
  record_history(:interacted, pairing_id)
  {
    success:    true,
    synchrony:  pairing.synchrony,
    entrained:  pairing.entrained?,
    sync_label: pairing.sync_label
  }
end

#strongest_pairings(limit: 5) ⇒ Object



59
60
61
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 59

def strongest_pairings(limit: 5)
  @pairings.values.sort_by { |p| -p.synchrony }.first(limit)
end

#to_hObject



83
84
85
86
87
88
89
90
# File 'lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb', line 83

def to_h
  {
    total_pairings:  @pairings.size,
    entrained_count: entrained_pairings.size,
    overall_sync:    overall_entrainment,
    history_count:   @history.size
  }
end