kbs 0.0.1

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.envrc +3 -0
  3. data/CHANGELOG.md +5 -0
  4. data/COMMITS.md +196 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +481 -0
  7. data/Rakefile +8 -0
  8. data/examples/README.md +531 -0
  9. data/examples/advanced_example.rb +270 -0
  10. data/examples/ai_enhanced_kbs.rb +523 -0
  11. data/examples/blackboard_demo.rb +50 -0
  12. data/examples/car_diagnostic.rb +64 -0
  13. data/examples/concurrent_inference_demo.rb +363 -0
  14. data/examples/csv_trading_system.rb +559 -0
  15. data/examples/iot_demo_using_dsl.rb +83 -0
  16. data/examples/portfolio_rebalancing_system.rb +651 -0
  17. data/examples/redis_trading_demo.rb +177 -0
  18. data/examples/sample_stock_data.csv +46 -0
  19. data/examples/stock_trading_advanced.rb +469 -0
  20. data/examples/stock_trading_system.rb.bak +563 -0
  21. data/examples/timestamped_trading.rb +286 -0
  22. data/examples/trading_demo.rb +334 -0
  23. data/examples/working_demo.rb +176 -0
  24. data/lib/kbs/alpha_memory.rb +37 -0
  25. data/lib/kbs/beta_memory.rb +57 -0
  26. data/lib/kbs/blackboard/audit_log.rb +115 -0
  27. data/lib/kbs/blackboard/engine.rb +83 -0
  28. data/lib/kbs/blackboard/fact.rb +65 -0
  29. data/lib/kbs/blackboard/memory.rb +191 -0
  30. data/lib/kbs/blackboard/message_queue.rb +96 -0
  31. data/lib/kbs/blackboard/persistence/hybrid_store.rb +118 -0
  32. data/lib/kbs/blackboard/persistence/redis_store.rb +218 -0
  33. data/lib/kbs/blackboard/persistence/sqlite_store.rb +242 -0
  34. data/lib/kbs/blackboard/persistence/store.rb +55 -0
  35. data/lib/kbs/blackboard/redis_audit_log.rb +107 -0
  36. data/lib/kbs/blackboard/redis_message_queue.rb +111 -0
  37. data/lib/kbs/blackboard.rb +23 -0
  38. data/lib/kbs/condition.rb +26 -0
  39. data/lib/kbs/dsl/condition_helpers.rb +57 -0
  40. data/lib/kbs/dsl/knowledge_base.rb +86 -0
  41. data/lib/kbs/dsl/pattern_evaluator.rb +69 -0
  42. data/lib/kbs/dsl/rule_builder.rb +115 -0
  43. data/lib/kbs/dsl/variable.rb +35 -0
  44. data/lib/kbs/dsl.rb +18 -0
  45. data/lib/kbs/fact.rb +43 -0
  46. data/lib/kbs/join_node.rb +117 -0
  47. data/lib/kbs/negation_node.rb +88 -0
  48. data/lib/kbs/production_node.rb +28 -0
  49. data/lib/kbs/rete_engine.rb +108 -0
  50. data/lib/kbs/rule.rb +46 -0
  51. data/lib/kbs/token.rb +37 -0
  52. data/lib/kbs/version.rb +5 -0
  53. data/lib/kbs/working_memory.rb +32 -0
  54. data/lib/kbs.rb +20 -0
  55. metadata +164 -0
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/kbs'
4
+
5
+ class StockTradingExpertSystem
6
+ def initialize
7
+ @engine = KBS::ReteEngine.new
8
+ setup_rules
9
+ end
10
+
11
+ def setup_rules
12
+ bull_market_rule = KBS::Rule.new(
13
+ "bull_market_buy",
14
+ conditions: [
15
+ KBS::Condition.new(:market, { trend: "bullish" }),
16
+ KBS::Condition.new(:stock, {
17
+ rsi: ->(rsi) { rsi < 70 }
18
+ }),
19
+ KBS::Condition.new(:stock, {
20
+ pe_ratio: ->(pe) { pe < 25 }
21
+ })
22
+ ],
23
+ action: lambda do |facts, bindings|
24
+ stock = facts.find { |f| f.type == :stock }
25
+ puts "šŸ“ˆ BUY SIGNAL: #{stock[:symbol]} - Bull market with good fundamentals"
26
+ puts " RSI: #{stock[:rsi]}, P/E: #{stock[:pe_ratio]}"
27
+ end,
28
+ priority: 10
29
+ )
30
+
31
+ oversold_bounce_rule = KBS::Rule.new(
32
+ "oversold_bounce",
33
+ conditions: [
34
+ KBS::Condition.new(:stock, {
35
+ rsi: ->(rsi) { rsi < 30 }
36
+ }),
37
+ KBS::Condition.new(:stock, {
38
+ volume: ->(v) { v > 1000000 }
39
+ }),
40
+ KBS::Condition.new(:news, { sentiment: "negative" }, negated: true)
41
+ ],
42
+ action: lambda do |facts, bindings|
43
+ stock = facts.find { |f| f.type == :stock }
44
+ puts "šŸ”„ OVERSOLD BOUNCE: #{stock[:symbol]} - Potential reversal opportunity"
45
+ puts " RSI: #{stock[:rsi]}, Volume: #{stock[:volume]}"
46
+ end,
47
+ priority: 8
48
+ )
49
+
50
+ stop_loss_rule = KBS::Rule.new(
51
+ "stop_loss_trigger",
52
+ conditions: [
53
+ KBS::Condition.new(:position, {
54
+ loss_percent: ->(loss) { loss > 8 }
55
+ }),
56
+ KBS::Condition.new(:market, { trend: "bearish" })
57
+ ],
58
+ action: lambda do |facts, bindings|
59
+ position = facts.find { |f| f.type == :position }
60
+ puts "šŸ›‘ STOP LOSS: #{position[:symbol]} - Exit position immediately"
61
+ puts " Loss: #{position[:loss_percent]}%"
62
+ end,
63
+ priority: 15
64
+ )
65
+
66
+ earnings_surprise_rule = KBS::Rule.new(
67
+ "earnings_surprise",
68
+ conditions: [
69
+ KBS::Condition.new(:earnings, {
70
+ surprise: ->(s) { s > 10 }
71
+ }),
72
+ KBS::Condition.new(:stock, {
73
+ momentum: ->(m) { m > 0 }
74
+ })
75
+ ],
76
+ action: lambda do |facts, bindings|
77
+ earnings = facts.find { |f| f.type == :earnings }
78
+ stock = facts.find { |f| f.type == :stock }
79
+ puts "šŸ’° EARNINGS BEAT: #{stock[:symbol]} - Strong earnings surprise"
80
+ puts " Surprise: #{earnings[:surprise]}%, Momentum: #{stock[:momentum]}"
81
+ end,
82
+ priority: 12
83
+ )
84
+
85
+ divergence_rule = KBS::Rule.new(
86
+ "price_volume_divergence",
87
+ conditions: [
88
+ KBS::Condition.new(:stock, {
89
+ price_trend: "up"
90
+ }),
91
+ KBS::Condition.new(:stock, {
92
+ volume_trend: "down"
93
+ })
94
+ ],
95
+ action: lambda do |facts, bindings|
96
+ stock = facts.find { |f| f.type == :stock }
97
+ puts "āš ļø DIVERGENCE WARNING: #{stock[:symbol]} - Price/volume divergence detected"
98
+ end,
99
+ priority: 5
100
+ )
101
+
102
+ @engine.add_rule(bull_market_rule)
103
+ @engine.add_rule(oversold_bounce_rule)
104
+ @engine.add_rule(stop_loss_rule)
105
+ @engine.add_rule(earnings_surprise_rule)
106
+ @engine.add_rule(divergence_rule)
107
+ end
108
+
109
+ def analyze_market(market_conditions)
110
+ puts "\n" + "=" * 70
111
+ puts "MARKET ANALYSIS - #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
112
+ puts "=" * 70
113
+
114
+ market_conditions.each do |condition|
115
+ case condition[:type]
116
+ when :market
117
+ @engine.add_fact(:market, condition[:data])
118
+ when :stock
119
+ @engine.add_fact(:stock, condition[:data])
120
+ when :position
121
+ @engine.add_fact(:position, condition[:data])
122
+ when :earnings
123
+ @engine.add_fact(:earnings, condition[:data])
124
+ when :news
125
+ @engine.add_fact(:news, condition[:data])
126
+ end
127
+ end
128
+
129
+ @engine.run
130
+ puts "=" * 70
131
+ end
132
+
133
+ def clear_facts
134
+ @engine.working_memory.facts.clear
135
+ end
136
+ end
137
+
138
+ class NetworkDiagnosticSystem
139
+ def initialize
140
+ @engine = KBS::ReteEngine.new
141
+ setup_network_rules
142
+ end
143
+
144
+ def setup_network_rules
145
+ ddos_attack_rule = KBS::Rule.new(
146
+ "ddos_detection",
147
+ conditions: [
148
+ KBS::Condition.new(:traffic, {
149
+ requests_per_second: ->(rps) { rps > 10000 }
150
+ }),
151
+ KBS::Condition.new(:traffic, {
152
+ unique_ips: ->(ips) { ips < 100 }
153
+ }),
154
+ KBS::Condition.new(:firewall, { status: "active" }, negated: true)
155
+ ],
156
+ action: lambda do |facts, bindings|
157
+ traffic = facts.find { |f| f.type == :traffic }
158
+ puts "🚨 DDoS ATTACK DETECTED!"
159
+ puts " Requests/sec: #{traffic[:requests_per_second]}"
160
+ puts " Unique IPs: #{traffic[:unique_ips]}"
161
+ puts " ACTION: Enabling rate limiting and firewall rules"
162
+ end
163
+ )
164
+
165
+ bandwidth_issue_rule = KBS::Rule.new(
166
+ "bandwidth_saturation",
167
+ conditions: [
168
+ KBS::Condition.new(:network, {
169
+ bandwidth_usage: ->(usage) { usage > 90 }
170
+ }),
171
+ KBS::Condition.new(:service, { priority: "high" })
172
+ ],
173
+ action: lambda do |facts, bindings|
174
+ network = facts.find { |f| f.type == :network }
175
+ service = facts.find { |f| f.type == :service }
176
+ puts "āš ļø BANDWIDTH SATURATION: #{network[:bandwidth_usage]}% utilized"
177
+ puts " High priority service affected: #{service[:name]}"
178
+ puts " ACTION: Implementing QoS policies"
179
+ end
180
+ )
181
+
182
+ latency_spike_rule = KBS::Rule.new(
183
+ "latency_anomaly",
184
+ conditions: [
185
+ KBS::Condition.new(:latency, {
186
+ current_ms: ->(ms) { ms > 200 }
187
+ }),
188
+ KBS::Condition.new(:latency, {
189
+ baseline_ms: ->(ms) { ms < 50 }
190
+ })
191
+ ],
192
+ action: lambda do |facts, bindings|
193
+ latency = facts.find { |f| f.type == :latency }
194
+ puts "šŸ”§ LATENCY SPIKE DETECTED"
195
+ puts " Current: #{latency[:current_ms]}ms (baseline: #{latency[:baseline_ms]}ms)"
196
+ puts " ACTION: Rerouting traffic to alternate path"
197
+ end
198
+ )
199
+
200
+ @engine.add_rule(ddos_attack_rule)
201
+ @engine.add_rule(bandwidth_issue_rule)
202
+ @engine.add_rule(latency_spike_rule)
203
+ end
204
+
205
+ def diagnose(conditions)
206
+ puts "\n" + "=" * 70
207
+ puts "NETWORK DIAGNOSTIC REPORT - #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
208
+ puts "=" * 70
209
+
210
+ conditions.each do |condition|
211
+ @engine.add_fact(condition[:type], condition[:data])
212
+ end
213
+
214
+ @engine.run
215
+ puts "=" * 70
216
+ end
217
+ end
218
+
219
+ if __FILE__ == $0
220
+ puts "\nšŸ¦ STOCK TRADING EXPERT SYSTEM DEMONSTRATION"
221
+ puts "=" * 70
222
+
223
+ trading_system = StockTradingExpertSystem.new
224
+
225
+ scenario1 = [
226
+ { type: :market, data: { trend: "bullish", volatility: "low" } },
227
+ { type: :stock, data: { symbol: "AAPL", rsi: 45, pe_ratio: 22, momentum: 5 } },
228
+ { type: :stock, data: { symbol: "GOOGL", rsi: 28, volume: 2000000, momentum: -2 } }
229
+ ]
230
+
231
+ trading_system.analyze_market(scenario1)
232
+ trading_system.clear_facts
233
+
234
+ scenario2 = [
235
+ { type: :market, data: { trend: "bearish", volatility: "high" } },
236
+ { type: :position, data: { symbol: "TSLA", loss_percent: 12, shares: 100 } },
237
+ { type: :earnings, data: { symbol: "MSFT", surprise: 15, quarter: "Q4" } },
238
+ { type: :stock, data: { symbol: "MSFT", momentum: 8, rsi: 62 } }
239
+ ]
240
+
241
+ trading_system.analyze_market(scenario2)
242
+ trading_system.clear_facts
243
+
244
+ scenario3 = [
245
+ { type: :stock, data: { symbol: "META", price_trend: "up", volume_trend: "down" } },
246
+ { type: :stock, data: { symbol: "NVDA", rsi: 25, volume: 5000000, momentum: 3 } }
247
+ ]
248
+
249
+ trading_system.analyze_market(scenario3)
250
+
251
+ puts "\n\n🌐 NETWORK DIAGNOSTIC SYSTEM DEMONSTRATION"
252
+ puts "=" * 70
253
+
254
+ network_system = NetworkDiagnosticSystem.new
255
+
256
+ network_scenario1 = [
257
+ { type: :traffic, data: { requests_per_second: 15000, unique_ips: 50, protocol: "HTTP" } },
258
+ { type: :network, data: { bandwidth_usage: 95, packet_loss: 2 } },
259
+ { type: :service, data: { name: "API Gateway", priority: "high" } }
260
+ ]
261
+
262
+ network_system.diagnose(network_scenario1)
263
+
264
+ network_scenario2 = [
265
+ { type: :latency, data: { current_ms: 250, baseline_ms: 30, endpoint: "database" } },
266
+ { type: :network, data: { bandwidth_usage: 60, packet_loss: 0 } }
267
+ ]
268
+
269
+ network_system.diagnose(network_scenario2)
270
+ end