lex-meta-learning 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/meta_learning/client'
4
+
5
+ RSpec.describe Legion::Extensions::MetaLearning::Runners::MetaLearning do
6
+ let(:client) { Legion::Extensions::MetaLearning::Client.new }
7
+
8
+ let(:domain_result) { client.create_learning_domain(name: 'ruby') }
9
+ let(:domain_id) { domain_result[:id] }
10
+ let(:strategy_result) { client.register_learning_strategy(name: 'flash_cards', strategy_type: :repetition) }
11
+ let(:strategy_id) { strategy_result[:id] }
12
+
13
+ describe '#create_learning_domain' do
14
+ it 'returns a hash with id and name' do
15
+ result = client.create_learning_domain(name: 'python')
16
+ expect(result[:id]).to match(/\A[0-9a-f-]{36}\z/)
17
+ expect(result[:name]).to eq('python')
18
+ end
19
+
20
+ it 'applies custom learning rate' do
21
+ result = client.create_learning_domain(name: 'go', learning_rate: 0.2)
22
+ expect(result[:learning_rate]).to be_within(0.0001).of(0.2)
23
+ end
24
+
25
+ it 'accepts related_domains array' do
26
+ result = client.create_learning_domain(name: 'typescript', related_domains: ['javascript'])
27
+ expect(result[:related_domains]).to include('javascript')
28
+ end
29
+
30
+ it 'returns error hash on limit reached' do
31
+ stub_const('Legion::Extensions::MetaLearning::Helpers::Constants::MAX_DOMAINS', 0)
32
+ result = client.create_learning_domain(name: 'test')
33
+ expect(result[:error]).to eq(:limit_reached)
34
+ end
35
+ end
36
+
37
+ describe '#register_learning_strategy' do
38
+ it 'returns a hash with id and name' do
39
+ result = client.register_learning_strategy(name: 'analogy', strategy_type: :analogy)
40
+ expect(result[:id]).to match(/\A[0-9a-f-]{36}\z/)
41
+ expect(result[:name]).to eq('analogy')
42
+ end
43
+
44
+ it 'returns error for invalid strategy_type' do
45
+ result = client.register_learning_strategy(name: 'bad', strategy_type: :invalid)
46
+ expect(result[:error]).to eq(:invalid_strategy_type)
47
+ end
48
+ end
49
+
50
+ describe '#record_learning_episode' do
51
+ it 'records a success and returns episode hash' do
52
+ result = client.record_learning_episode(domain_id: domain_id, success: true)
53
+ expect(result[:success]).to be true
54
+ expect(result[:domain_name]).to eq('ruby')
55
+ end
56
+
57
+ it 'records a failure' do
58
+ result = client.record_learning_episode(domain_id: domain_id, success: false)
59
+ expect(result[:success]).to be false
60
+ end
61
+
62
+ it 'returns error for unknown domain' do
63
+ result = client.record_learning_episode(domain_id: 'bad', success: true)
64
+ expect(result[:error]).to eq(:domain_not_found)
65
+ end
66
+
67
+ it 'accepts strategy_id' do
68
+ sid = strategy_id
69
+ result = client.record_learning_episode(domain_id: domain_id, strategy_id: sid, success: true)
70
+ expect(result[:strategy_id]).to eq(sid)
71
+ end
72
+ end
73
+
74
+ describe '#recommend_learning_strategy' do
75
+ it 'returns no_data when no strategy history' do
76
+ result = client.recommend_learning_strategy(domain_id: domain_id)
77
+ expect(result[:reason]).to eq(:no_data)
78
+ end
79
+
80
+ it 'recommends best strategy after episodes' do
81
+ sid = strategy_id
82
+ did = domain_id
83
+ 3.times { client.record_learning_episode(domain_id: did, strategy_id: sid, success: true) }
84
+ result = client.recommend_learning_strategy(domain_id: did)
85
+ expect(result[:recommendation]).to eq('flash_cards')
86
+ end
87
+
88
+ it 'returns error for unknown domain' do
89
+ result = client.recommend_learning_strategy(domain_id: 'bad')
90
+ expect(result[:error]).to eq(:domain_not_found)
91
+ end
92
+ end
93
+
94
+ describe '#check_transfer_learning' do
95
+ it 'returns not eligible when source proficiency is low' do
96
+ d1 = client.create_learning_domain(name: 'source')
97
+ d2 = client.create_learning_domain(name: 'target', related_domains: ['source'])
98
+ result = client.check_transfer_learning(source_domain_id: d1[:id], target_domain_id: d2[:id])
99
+ expect(result[:eligible]).to be false
100
+ end
101
+
102
+ it 'returns error for unknown domains' do
103
+ result = client.check_transfer_learning(source_domain_id: 'bad', target_domain_id: 'also-bad')
104
+ expect(result[:error]).to eq(:domain_not_found)
105
+ end
106
+ end
107
+
108
+ describe '#apply_transfer_bonus' do
109
+ it 'returns not applied when not eligible' do
110
+ d1 = client.create_learning_domain(name: 'src')
111
+ d2 = client.create_learning_domain(name: 'tgt', related_domains: ['src'])
112
+ result = client.apply_transfer_bonus(source_domain_id: d1[:id], target_domain_id: d2[:id])
113
+ expect(result[:applied]).to be false
114
+ end
115
+
116
+ it 'returns error for unknown domains' do
117
+ result = client.apply_transfer_bonus(source_domain_id: 'x', target_domain_id: 'y')
118
+ expect(result[:error]).to eq(:domain_not_found)
119
+ end
120
+ end
121
+
122
+ describe '#learning_domain_ranking' do
123
+ it 'returns ranking and count' do
124
+ client.create_learning_domain(name: 'a')
125
+ client.create_learning_domain(name: 'b')
126
+ result = client.learning_domain_ranking
127
+ expect(result[:ranking]).to be_an(Array)
128
+ expect(result[:count]).to eq(2)
129
+ end
130
+
131
+ it 'respects limit parameter' do
132
+ 5.times { |i| client.create_learning_domain(name: "d#{i}") }
133
+ result = client.learning_domain_ranking(limit: 2)
134
+ expect(result[:ranking].size).to eq(2)
135
+ end
136
+ end
137
+
138
+ describe '#learning_strategy_ranking' do
139
+ it 'returns ranking and count' do
140
+ client.register_learning_strategy(name: 's1', strategy_type: :repetition)
141
+ result = client.learning_strategy_ranking
142
+ expect(result[:ranking]).to be_an(Array)
143
+ expect(result[:count]).to eq(1)
144
+ end
145
+ end
146
+
147
+ describe '#learning_curve_report' do
148
+ it 'returns error for unknown domain' do
149
+ result = client.learning_curve_report(domain_id: 'bad')
150
+ expect(result[:error]).to eq(:domain_not_found)
151
+ end
152
+
153
+ it 'returns curve data for valid domain' do
154
+ did = domain_id
155
+ 2.times { client.record_learning_episode(domain_id: did, success: true) }
156
+ result = client.learning_curve_report(domain_id: did)
157
+ expect(result[:domain]).to eq('ruby')
158
+ expect(result[:curve].size).to eq(2)
159
+ end
160
+ end
161
+
162
+ describe '#update_meta_learning' do
163
+ it 'returns adapt, prune, and stats' do
164
+ result = client.update_meta_learning
165
+ expect(result).to include(:adapt, :prune, :stats)
166
+ end
167
+
168
+ it 'boosts rate for efficient domains' do
169
+ did = domain_id
170
+ 5.times { client.record_learning_episode(domain_id: did, success: true) }
171
+ result = client.update_meta_learning
172
+ expect(result[:adapt][:count]).to eq(1)
173
+ expect(result[:adapt][:adapted].first[:direction]).to eq(:boost)
174
+ end
175
+ end
176
+
177
+ describe '#meta_learning_stats' do
178
+ it 'returns engine stats hash' do
179
+ domain_id
180
+ result = client.meta_learning_stats
181
+ expect(result).to include(:domain_count, :strategy_count, :episode_count, :overall_efficiency)
182
+ expect(result[:domain_count]).to eq(1)
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ module Legion
6
+ module Logging
7
+ def self.debug(_msg); end
8
+ def self.info(_msg); end
9
+ def self.warn(_msg); end
10
+ def self.error(_msg); end
11
+ end
12
+ end
13
+
14
+ require 'legion/extensions/meta_learning'
15
+
16
+ RSpec.configure do |config|
17
+ config.example_status_persistence_file_path = '.rspec_status'
18
+ config.disable_monkey_patching!
19
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
20
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-meta-learning
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: legion-gaia
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ description: Meta-learning engine for brain-modeled agentic AI — tracks learning efficiency,
27
+ adapts learning rates, and selects strategies based on past performance
28
+ email:
29
+ - matthewdiverson@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - Gemfile
35
+ - lex-meta-learning.gemspec
36
+ - lib/legion/extensions/meta_learning.rb
37
+ - lib/legion/extensions/meta_learning/client.rb
38
+ - lib/legion/extensions/meta_learning/helpers/constants.rb
39
+ - lib/legion/extensions/meta_learning/helpers/learning_domain.rb
40
+ - lib/legion/extensions/meta_learning/helpers/meta_learning_engine.rb
41
+ - lib/legion/extensions/meta_learning/helpers/strategy.rb
42
+ - lib/legion/extensions/meta_learning/runners/meta_learning.rb
43
+ - lib/legion/extensions/meta_learning/version.rb
44
+ - spec/legion/extensions/meta_learning/client_spec.rb
45
+ - spec/legion/extensions/meta_learning/helpers/constants_spec.rb
46
+ - spec/legion/extensions/meta_learning/helpers/learning_domain_spec.rb
47
+ - spec/legion/extensions/meta_learning/helpers/meta_learning_engine_spec.rb
48
+ - spec/legion/extensions/meta_learning/helpers/strategy_spec.rb
49
+ - spec/legion/extensions/meta_learning/runners/meta_learning_spec.rb
50
+ - spec/spec_helper.rb
51
+ homepage: https://github.com/LegionIO/lex-meta-learning
52
+ licenses:
53
+ - MIT
54
+ metadata:
55
+ homepage_uri: https://github.com/LegionIO/lex-meta-learning
56
+ source_code_uri: https://github.com/LegionIO/lex-meta-learning
57
+ documentation_uri: https://github.com/LegionIO/lex-meta-learning
58
+ changelog_uri: https://github.com/LegionIO/lex-meta-learning
59
+ bug_tracker_uri: https://github.com/LegionIO/lex-meta-learning/issues
60
+ rubygems_mfa_required: 'true'
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubygems_version: 3.6.9
76
+ specification_version: 4
77
+ summary: LEX Meta-Learning
78
+ test_files: []