Module: Legion::Extensions::Agentic::Inference::Bayesian::Runners::BayesianBelief

Includes:
Helpers::Lex
Included in:
Client
Defined in:
lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb

Instance Method Summary collapse

Instance Method Details

#add_bayesian_belief(content:, domain:, prior: nil) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 13

def add_bayesian_belief(content:, domain:, prior: nil, **)
  pri = (prior || Helpers::Constants::DEFAULT_PRIOR).clamp(
    Helpers::Constants::PRIOR_FLOOR,
    Helpers::Constants::PRIOR_CEILING
  )
  belief = belief_network.add_belief(content: content, domain: domain, prior: pri)
  unless belief
    log.warn "[bayesian_belief] add failed: network at capacity (#{Helpers::Constants::MAX_HYPOTHESES})"
    return { success: false, reason: :capacity_exceeded, max: Helpers::Constants::MAX_HYPOTHESES }
  end

  log.debug "[bayesian_belief] add: id=#{belief.id[0..7]} domain=#{domain} prior=#{pri.round(3)}"
  { success: true, belief_id: belief.id, domain: domain, prior: belief.prior, posterior: belief.posterior }
end

#batch_bayesian_update(evidence_id:, likelihoods:) ⇒ Object



49
50
51
52
53
54
55
56
57
58
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 49

def batch_bayesian_update(evidence_id:, likelihoods:, **)
  if likelihoods.nil? || likelihoods.empty?
    log.debug '[bayesian_belief] batch_update: empty likelihoods, skipping'
    return { success: true, updated: 0, posteriors: {} }
  end

  posteriors = belief_network.batch_update(evidence_id: evidence_id, likelihoods: likelihoods)
  log.debug "[bayesian_belief] batch_update: evidence=#{evidence_id} updated=#{posteriors.size}"
  { success: true, evidence_id: evidence_id, updated: posteriors.size, posteriors: posteriors }
end

#bayesian_belief_statsObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 97

def bayesian_belief_stats(**)
  total = belief_network.count
  ent   = belief_network.entropy
  most  = belief_network.most_probable(limit: 1).first
  least = belief_network.least_probable(limit: 1).first

  log.debug "[bayesian_belief] stats: total=#{total} entropy=#{ent.round(4)}"
  {
    success:        true,
    total_beliefs:  total,
    entropy:        ent,
    most_probable:  most&.to_h,
    least_probable: least&.to_h,
    capacity:       Helpers::Constants::MAX_HYPOTHESES
  }
end

#belief_entropy(domain: nil) ⇒ Object



85
86
87
88
89
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 85

def belief_entropy(domain: nil, **)
  ent = belief_network.entropy(domain: domain)
  log.debug "[bayesian_belief] entropy: domain=#{domain.inspect} entropy=#{ent.round(4)}"
  { success: true, domain: domain, entropy: ent }
end

#information_gain(belief_id:, evidence_id:, likelihood:) ⇒ Object



78
79
80
81
82
83
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 78

def information_gain(belief_id:, evidence_id:, likelihood:, **)
  clamped = likelihood.clamp(Helpers::Constants::LIKELIHOOD_FLOOR, Helpers::Constants::LIKELIHOOD_CEILING)
  gain    = belief_network.information_gain(belief_id: belief_id, evidence_id: evidence_id, likelihood: clamped)
  log.debug "[bayesian_belief] information_gain: id=#{belief_id[0..7]} likelihood=#{clamped.round(3)} gain=#{gain.round(4)}"
  { success: true, belief_id: belief_id, evidence_id: evidence_id, likelihood: clamped, information_gain: gain }
end

#least_probable_beliefs(domain: nil, limit: 5) ⇒ Object



66
67
68
69
70
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 66

def least_probable_beliefs(domain: nil, limit: 5, **)
  beliefs = belief_network.least_probable(domain: domain, limit: limit)
  log.debug "[bayesian_belief] least_probable: domain=#{domain.inspect} count=#{beliefs.size}"
  { success: true, beliefs: beliefs.map(&:to_h), count: beliefs.size }
end

#most_probable_beliefs(domain: nil, limit: 5) ⇒ Object



60
61
62
63
64
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 60

def most_probable_beliefs(domain: nil, limit: 5, **)
  beliefs = belief_network.most_probable(domain: domain, limit: limit)
  log.debug "[bayesian_belief] most_probable: domain=#{domain.inspect} count=#{beliefs.size}"
  { success: true, beliefs: beliefs.map(&:to_h), count: beliefs.size }
end

#posterior_distribution(domain: nil) ⇒ Object



72
73
74
75
76
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 72

def posterior_distribution(domain: nil, **)
  dist = belief_network.posterior_distribution(domain: domain)
  log.debug "[bayesian_belief] posterior_distribution: domain=#{domain.inspect} size=#{dist.size}"
  { success: true, distribution: dist, size: dist.size }
end

#update_bayesian_belief(belief_id:, evidence_id:, likelihood:) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 28

def update_bayesian_belief(belief_id:, evidence_id:, likelihood:, **)
  clamped = likelihood.clamp(Helpers::Constants::LIKELIHOOD_FLOOR, Helpers::Constants::LIKELIHOOD_CEILING)
  belief  = belief_network.update_belief(belief_id: belief_id, evidence_id: evidence_id, likelihood: clamped)
  unless belief
    log.debug "[bayesian_belief] update failed: belief_id=#{belief_id} not found"
    return { success: false, reason: :not_found, belief_id: belief_id }
  end

  log.debug "[bayesian_belief] update: id=#{belief_id[0..7]} evidence=#{evidence_id} " \
            "likelihood=#{clamped.round(3)} posterior=#{belief.posterior.round(3)}"
  {
    success:          true,
    belief_id:        belief_id,
    evidence_id:      evidence_id,
    likelihood:       clamped,
    posterior:        belief.posterior,
    confidence_label: belief.confidence_label,
    update_count:     belief.update_count
  }
end

#update_bayesian_beliefsObject



91
92
93
94
95
# File 'lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb', line 91

def update_bayesian_beliefs(**)
  decayed = belief_network.decay_all
  log.debug "[bayesian_belief] decay cycle: beliefs_updated=#{decayed}"
  { success: true, decayed: decayed }
end