Class: Legion::Extensions::Agentic::Affect::Emotion::Helpers::Baseline
- Inherits:
-
Object
- Object
- Legion::Extensions::Agentic::Affect::Emotion::Helpers::Baseline
- Defined in:
- lib/legion/extensions/agentic/affect/emotion/helpers/baseline.rb
Constant Summary collapse
- ALPHA =
slow adaptation to prevent adversarial manipulation
0.05- MIN_STDDEV =
prevents division issues when baseline is stable
0.1- INITIAL_MEAN =
0.5- INITIAL_STDDEV =
0.25
Instance Attribute Summary collapse
-
#dimensions ⇒ Object
readonly
Returns the value of attribute dimensions.
Instance Method Summary collapse
- #get(dimension) ⇒ Object
-
#initialize ⇒ Baseline
constructor
A new instance of Baseline.
- #normalize(raw_score, dimension) ⇒ Object
- #update(dimension, raw_score) ⇒ Object
Constructor Details
#initialize ⇒ Baseline
Returns a new instance of Baseline.
17 18 19 20 21 |
# File 'lib/legion/extensions/agentic/affect/emotion/helpers/baseline.rb', line 17 def initialize @dimensions = Valence::DIMENSIONS.to_h do |dim| [dim, { mean: INITIAL_MEAN, stddev: INITIAL_STDDEV, count: 0 }] end end |
Instance Attribute Details
#dimensions ⇒ Object (readonly)
Returns the value of attribute dimensions.
15 16 17 |
# File 'lib/legion/extensions/agentic/affect/emotion/helpers/baseline.rb', line 15 def dimensions @dimensions end |
Instance Method Details
#get(dimension) ⇒ Object
43 44 45 |
# File 'lib/legion/extensions/agentic/affect/emotion/helpers/baseline.rb', line 43 def get(dimension) @dimensions[dimension] end |
#normalize(raw_score, dimension) ⇒ Object
23 24 25 26 27 28 29 |
# File 'lib/legion/extensions/agentic/affect/emotion/helpers/baseline.rb', line 23 def normalize(raw_score, dimension) baseline = @dimensions[dimension] return Valence.clamp(raw_score) unless baseline normalized = (raw_score - baseline[:mean]) / [baseline[:stddev], MIN_STDDEV].max Valence.clamp(normalized) end |
#update(dimension, raw_score) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/legion/extensions/agentic/affect/emotion/helpers/baseline.rb', line 31 def update(dimension, raw_score) baseline = @dimensions[dimension] return unless baseline baseline[:count] += 1 old_mean = baseline[:mean] baseline[:mean] = (ALPHA * raw_score) + ((1.0 - ALPHA) * old_mean) # Online stddev update (Welford-like with EMA) deviation = (raw_score - baseline[:mean]).abs baseline[:stddev] = (ALPHA * deviation) + ((1.0 - ALPHA) * baseline[:stddev]) end |