Class: Legion::Extensions::Agentic::Executive::Flexibility::Helpers::FlexibilityEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb

Constant Summary

Constants included from Constants

Constants::ADAPTATION_ALPHA, Constants::DEFAULT_FLEXIBILITY, Constants::FLEXIBILITY_FLOOR, Constants::FLEXIBILITY_LABELS, Constants::MAX_RULES_PER_SET, Constants::MAX_SWITCH_HISTORY, Constants::MAX_TASK_SETS, Constants::PERSEVERATION_THRESHOLD, Constants::RULE_TYPES, Constants::SWITCH_COST_BASE, Constants::SWITCH_COST_DECAY

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeFlexibilityEngine

Returns a new instance of FlexibilityEngine.



14
15
16
17
18
19
20
21
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 14

def initialize
  @task_sets      = {}
  @current_set_id = nil
  @switch_cost    = 0.0
  @flexibility    = DEFAULT_FLEXIBILITY
  @switch_history = []
  @counter        = 0
end

Instance Attribute Details

#current_set_idObject (readonly)

Returns the value of attribute current_set_id.



12
13
14
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 12

def current_set_id
  @current_set_id
end

#flexibilityObject (readonly)

Returns the value of attribute flexibility.



12
13
14
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 12

def flexibility
  @flexibility
end

#switch_costObject (readonly)

Returns the value of attribute switch_cost.



12
13
14
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 12

def switch_cost
  @switch_cost
end

#switch_historyObject (readonly)

Returns the value of attribute switch_history.



12
13
14
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 12

def switch_history
  @switch_history
end

#task_setsObject (readonly)

Returns the value of attribute task_sets.



12
13
14
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 12

def task_sets
  @task_sets
end

Instance Method Details

#add_rule(set_id:, type:, condition:, action:) ⇒ Object



34
35
36
37
38
39
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 34

def add_rule(set_id:, type:, condition:, action:)
  ts = @task_sets[set_id]
  return nil unless ts

  ts.add_rule(type: type, condition: condition, action: action)
end

#available_setsObject



71
72
73
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 71

def available_sets
  @task_sets.values.reject { |ts| ts.id == @current_set_id }.map(&:to_h)
end

#create_task_set(name:, domain: :general) ⇒ Object



23
24
25
26
27
28
29
30
31
32
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 23

def create_task_set(name:, domain: :general)
  return nil if @task_sets.size >= MAX_TASK_SETS

  @counter += 1
  set_id = :"set_#{@counter}"
  ts = TaskSet.new(id: set_id, name: name, domain: domain)
  @task_sets[set_id] = ts
  @current_set_id ||= set_id
  ts
end

#current_setObject



55
56
57
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 55

def current_set
  @current_set_id ? @task_sets[@current_set_id] : nil
end

#flexibility_labelObject



59
60
61
62
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 59

def flexibility_label
  FLEXIBILITY_LABELS.each { |range, lbl| return lbl if range.cover?(@flexibility) }
  :perseverative
end

#perseverating?Boolean

Returns:

  • (Boolean)


64
65
66
67
68
69
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 64

def perseverating?
  cs = current_set
  return false unless cs

  cs.dominant? && @flexibility < 0.4
end

#switch_to(set_id:) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 41

def switch_to(set_id:)
  return nil unless @task_sets.key?(set_id)
  return @task_sets[set_id] if set_id == @current_set_id

  old_id = @current_set_id
  @task_sets[old_id]&.deactivate
  @task_sets[set_id].activate
  @current_set_id = set_id
  @switch_cost = SWITCH_COST_BASE
  update_flexibility(:success)
  record_switch(from: old_id, to: set_id)
  @task_sets[set_id]
end

#tickObject



75
76
77
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 75

def tick
  @switch_cost = [@switch_cost - SWITCH_COST_DECAY, 0.0].max
end

#to_hObject



79
80
81
82
83
84
85
86
87
88
89
# File 'lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb', line 79

def to_h
  {
    current_set:   @current_set_id,
    set_count:     @task_sets.size,
    switch_cost:   @switch_cost.round(4),
    flexibility:   @flexibility.round(4),
    label:         flexibility_label,
    perseverating: perseverating?,
    switch_count:  @switch_history.size
  }
end