Class: Legion::Extensions::Agentic::Executive::Compass::Helpers::CompassEngine

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb

Instance Method Summary collapse

Constructor Details

#initializeCompassEngine

Returns a new instance of CompassEngine.



10
11
12
13
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 10

def initialize
  @bearings = {}
  @biases   = {}
end

Instance Method Details

#accuracyObject



42
43
44
45
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 42

def accuracy
  offset = true_north_offset
  (1.0 - offset).clamp(0.0, 1.0).round(10)
end

#accuracy_labelObject



47
48
49
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 47

def accuracy_label
  Constants.label_for(Constants::ACCURACY_LABELS, accuracy)
end

#all_bearingsObject



89
90
91
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 89

def all_bearings
  @bearings.values
end

#all_biasesObject



93
94
95
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 93

def all_biases
  @biases.values
end

#bearings_by_directionObject



66
67
68
69
70
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 66

def bearings_by_direction
  result = Hash.new(0)
  @bearings.each_value { |b| result[b.direction] += 1 }
  result
end

#calibrate(bias_id:, amount: Constants::CALIBRATION_BOOST) ⇒ Object



31
32
33
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 31

def calibrate(bias_id:, amount: Constants::CALIBRATION_BOOST)
  fetch_bias(bias_id).correct!(amount: amount)
end

#compass_reportObject



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 76

def compass_report
  {
    total_bearings:     @bearings.size,
    total_biases:       @biases.size,
    accuracy:           accuracy,
    accuracy_label:     accuracy_label,
    true_north_offset:  true_north_offset,
    dominant_direction: dominant_direction,
    by_direction:       bearings_by_direction,
    severe_biases:      @biases.count { |_, b| b.severe? }
  }
end

#decay_biases!(rate: Constants::DECLINATION_DECAY) ⇒ Object



51
52
53
54
55
56
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 51

def decay_biases!(rate: Constants::DECLINATION_DECAY)
  @biases.each_value { |b| b.decay!(rate: rate) }
  pruned = @biases.select { |_, b| b.negligible? && b.strength < 0.1 }.keys
  pruned.each { |id| @biases.delete(id) }
  { remaining: @biases.size, pruned: pruned.size }
end

#dominant_directionObject



58
59
60
61
62
63
64
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 58

def dominant_direction
  return nil if @bearings.empty?

  counts = Hash.new(0)
  @bearings.each_value { |b| counts[b.direction] += b.confidence }
  counts.max_by { |_, v| v }&.first
end

#register_bias(bias_type:, domain:, declination: nil, strength: nil) ⇒ Object

Raises:

  • (ArgumentError)


22
23
24
25
26
27
28
29
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 22

def register_bias(bias_type:, domain:, declination: nil, strength: nil)
  raise ArgumentError, 'too many biases' if @biases.size >= Constants::MAX_BIASES

  bias = MagneticBias.new(bias_type: bias_type, domain: domain,
                          declination: declination, strength: strength)
  @biases[bias.id] = bias
  bias
end

#strongest_biases(limit: 5) ⇒ Object



72
73
74
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 72

def strongest_biases(limit: 5)
  @biases.values.sort_by { |b| -b.strength }.first(limit)
end

#take_bearing(direction:, context:, confidence: nil) ⇒ Object



15
16
17
18
19
20
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 15

def take_bearing(direction:, context:, confidence: nil)
  bearing = Bearing.new(direction: direction, context: context,
                        confidence: confidence)
  @bearings[bearing.id] = bearing
  bearing
end

#true_north_offsetObject



35
36
37
38
39
40
# File 'lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb', line 35

def true_north_offset
  return 0.0 if @biases.empty?

  total = @biases.values.sum(&:declination)
  (total / @biases.size).round(10)
end