Class: Legion::Extensions::Agentic::Learning::EpistemicCuriosity::Helpers::CuriosityEngine

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb

Instance Method Summary collapse

Constructor Details

#initializeCuriosityEngine

Returns a new instance of CuriosityEngine.



10
11
12
13
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 10

def initialize
  @gaps    = {}
  @counter = 0
end

Instance Method Details

#by_domain(domain) ⇒ Object



63
64
65
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 63

def by_domain(domain)
  @gaps.values.select { |g| g.domain == domain }
end

#by_type(gap_type) ⇒ Object



67
68
69
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 67

def by_type(gap_type)
  @gaps.values.select { |g| g.gap_type == gap_type }
end

#create_gap(question:, domain:, gap_type: :factual, urgency: Constants::DEFAULT_URGENCY) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 15

def create_gap(question:, domain:, gap_type: :factual, urgency: Constants::DEFAULT_URGENCY)
  prune_resolved if @gaps.size >= Constants::MAX_GAPS
  return { created: false, reason: :at_capacity } if @gaps.size >= Constants::MAX_GAPS

  gap_type = :factual unless Constants::GAP_TYPES.include?(gap_type)
  id       = next_id
  gap      = KnowledgeGap.new(id: id, question: question, domain: domain, gap_type: gap_type, urgency: urgency)
  @gaps[id] = gap
  { created: true, gap: gap.to_h }
end

#curiosity_reportObject



91
92
93
94
95
96
97
98
99
100
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 91

def curiosity_report
  {
    total_gaps:             @gaps.size,
    open_gaps:              open_gaps.size,
    resolved_gaps:          resolved_gaps.size,
    information_debt:       information_debt,
    exploration_efficiency: exploration_efficiency,
    most_urgent:            most_urgent(limit: 3).map(&:to_h)
  }
end

#decay_allObject



82
83
84
85
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 82

def decay_all
  @gaps.each_value(&:decay!)
  @gaps.size
end

#exploration_efficiencyObject



75
76
77
78
79
80
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 75

def exploration_efficiency
  total = @gaps.size
  return 0.0 if total.zero?

  (resolved_gaps.size.to_f / total).round(4)
end

#explore_gap(gap_id:) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 26

def explore_gap(gap_id:)
  gap = @gaps[gap_id]
  return { found: false, gap_id: gap_id } unless gap

  gap.explore!
  { found: true, gap: gap.to_h }
end

#information_debtObject



71
72
73
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 71

def information_debt
  open_gaps.sum(&:urgency).round(4)
end

#most_urgent(limit: 5) ⇒ Object



59
60
61
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 59

def most_urgent(limit: 5)
  open_gaps.sort_by { |g| -g.urgency }.first(limit)
end

#open_gapsObject



51
52
53
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 51

def open_gaps
  @gaps.values.reject(&:resolved?)
end

#prune_resolvedObject



87
88
89
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 87

def prune_resolved
  @gaps.delete_if { |_id, gap| gap.resolved? }
end

#resolve_gap(gap_id:) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 42

def resolve_gap(gap_id:)
  gap = @gaps[gap_id]
  return { found: false, gap_id: gap_id } unless gap

  gap.satisfaction = 1.0
  gap.resolved_at  = Time.now.utc
  { found: true, resolved: true, gap: gap.to_h }
end

#resolved_gapsObject



55
56
57
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 55

def resolved_gaps
  @gaps.values.select(&:resolved?)
end

#satisfy_gap(gap_id:, amount: 0.3) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 34

def satisfy_gap(gap_id:, amount: 0.3)
  gap = @gaps[gap_id]
  return { found: false, gap_id: gap_id } unless gap

  gap.satisfy!(amount: amount)
  { found: true, gap: gap.to_h }
end

#to_hObject



102
103
104
105
106
107
108
# File 'lib/legion/extensions/agentic/learning/epistemic_curiosity/helpers/curiosity_engine.rb', line 102

def to_h
  {
    gaps:                   @gaps.transform_values(&:to_h),
    information_debt:       information_debt,
    exploration_efficiency: exploration_efficiency
  }
end