Class: Legion::Extensions::Agentic::Social::Mentalizing::Helpers::MentalModel

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb

Instance Method Summary collapse

Constructor Details

#initializeMentalModel

Returns a new instance of MentalModel.



10
11
12
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 10

def initialize
  @models = {}
end

Instance Method Details

#agent_countObject



92
93
94
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 92

def agent_count
  @models.size
end

#alignment(agent_a:, agent_b:, subject:) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 57

def alignment(agent_a:, agent_b:, subject:)
  beliefs_a = beliefs_on_subject(agent_a, subject)
  beliefs_b = beliefs_on_subject(agent_b, subject)
  return 0.0 if beliefs_a.empty? || beliefs_b.empty?

  conf_a = beliefs_a.sum(&:confidence) / beliefs_a.size
  conf_b = beliefs_b.sum(&:confidence) / beliefs_b.size
  1.0 - (conf_a - conf_b).abs
end

#attribute_belief(agent_id:, subject:, content:, confidence:, depth: 0, about_agent_id: nil) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 14

def attribute_belief(agent_id:, subject:, content:, confidence:, depth: 0, about_agent_id: nil)
  ensure_agent_capacity(agent_id)
  capped_depth = [depth.to_i, Constants::MAX_RECURSION_DEPTH].min
  belief = BeliefAttribution.new(
    agent_id:       agent_id,
    subject:        subject,
    content:        content,
    confidence:     confidence,
    depth:          capped_depth,
    about_agent_id: about_agent_id
  )
  @models[agent_id] ||= []
  @models[agent_id] << belief
  prune_agent_beliefs(agent_id)
  belief
end

#belief_countObject



96
97
98
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 96

def belief_count
  @models.values.sum(&:size)
end

#beliefs_about(about_agent_id:) ⇒ Object



35
36
37
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 35

def beliefs_about(about_agent_id:)
  @models.values.flatten.select { |b| b.about_agent_id == about_agent_id }
end

#beliefs_for(agent_id:) ⇒ Object



31
32
33
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 31

def beliefs_for(agent_id:)
  @models[agent_id] || []
end

#decay_allObject



83
84
85
86
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 83

def decay_all
  @models.each_value { |beliefs| beliefs.each(&:decay) }
  prune_expired
end

#detect_false_belief(agent_id:, subject:, reality:) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 67

def detect_false_belief(agent_id:, subject:, reality:)
  relevant = beliefs_for(agent_id: agent_id).select { |b| b.subject == subject }
  return { false_belief: false, reason: :no_beliefs } if relevant.empty?

  strongest = relevant.max_by(&:confidence)
  false_belief = strongest.content != reality
  {
    false_belief: false_belief,
    agent_id:     agent_id,
    subject:      subject,
    held_belief:  strongest.content,
    reality:      reality,
    confidence:   strongest.confidence
  }
end

#project_self(subject:, own_belief:, other_agent_id:) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 45

def project_self(subject:, own_belief:, other_agent_id:)
  discounted = (own_belief * Constants::PROJECTION_DISCOUNT).clamp(0.0, 1.0)
  attribute_belief(
    agent_id:       :self,
    subject:        subject,
    content:        "projected: #{other_agent_id} thinks I believe this",
    confidence:     discounted,
    depth:          1,
    about_agent_id: other_agent_id
  )
end

#recursive_belief(agent_id:, about_agent_id:, subject:) ⇒ Object



39
40
41
42
43
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 39

def recursive_belief(agent_id:, about_agent_id:, subject:)
  beliefs = beliefs_for(agent_id: agent_id)
  beliefs.select { |b| b.about_agent_id == about_agent_id && b.subject == subject }
         .max_by(&:confidence)
end

#remove_agent(agent_id:) ⇒ Object



88
89
90
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 88

def remove_agent(agent_id:)
  @models.delete(agent_id)
end

#to_hObject



100
101
102
# File 'lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb', line 100

def to_h
  @models.transform_values { |beliefs| beliefs.map(&:to_h) }
end