lernen 0.1.0 → 0.3.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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +18 -0
  3. data/README.md +531 -28
  4. data/Rakefile +29 -7
  5. data/Steepfile +14 -0
  6. data/examples/ripper_prism.rb +63 -0
  7. data/examples/uri_parse_regexp.rb +73 -0
  8. data/lib/lernen/algorithm/cex_processor/acex.rb +43 -0
  9. data/lib/lernen/algorithm/cex_processor/prefix_transformer_acex.rb +43 -0
  10. data/lib/lernen/algorithm/cex_processor.rb +115 -0
  11. data/lib/lernen/algorithm/kearns_vazirani/discrimination_tree.rb +207 -0
  12. data/lib/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rb +100 -0
  13. data/lib/lernen/algorithm/kearns_vazirani.rb +44 -0
  14. data/lib/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rb +246 -0
  15. data/lib/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rb +89 -0
  16. data/lib/lernen/algorithm/kearns_vazirani_vpa.rb +35 -0
  17. data/lib/lernen/algorithm/learner.rb +82 -0
  18. data/lib/lernen/algorithm/lsharp/lsharp_learner.rb +367 -0
  19. data/lib/lernen/algorithm/lsharp/observation_tree.rb +115 -0
  20. data/lib/lernen/algorithm/lsharp.rb +43 -0
  21. data/lib/lernen/algorithm/lstar/lstar_learner.rb +49 -0
  22. data/lib/lernen/algorithm/lstar/observation_table.rb +214 -0
  23. data/lib/lernen/algorithm/lstar.rb +49 -0
  24. data/lib/lernen/algorithm/procedural/atr_manager.rb +200 -0
  25. data/lib/lernen/algorithm/procedural/procedural_learner.rb +223 -0
  26. data/lib/lernen/algorithm/procedural/procedural_sul.rb +47 -0
  27. data/lib/lernen/algorithm/procedural/return_indices_acex.rb +58 -0
  28. data/lib/lernen/algorithm/procedural.rb +57 -0
  29. data/lib/lernen/algorithm.rb +19 -0
  30. data/lib/lernen/automaton/dfa.rb +204 -0
  31. data/lib/lernen/automaton/mealy.rb +108 -0
  32. data/lib/lernen/automaton/moore.rb +122 -0
  33. data/lib/lernen/automaton/moore_like.rb +83 -0
  34. data/lib/lernen/automaton/proc_util.rb +93 -0
  35. data/lib/lernen/automaton/spa.rb +368 -0
  36. data/lib/lernen/automaton/transition_system.rb +209 -0
  37. data/lib/lernen/automaton/vpa.rb +300 -0
  38. data/lib/lernen/automaton.rb +19 -92
  39. data/lib/lernen/equiv/combined_oracle.rb +57 -0
  40. data/lib/lernen/equiv/exhaustive_search_oracle.rb +60 -0
  41. data/lib/lernen/equiv/moore_like_simulator_oracle.rb +36 -0
  42. data/lib/lernen/equiv/oracle.rb +109 -0
  43. data/lib/lernen/equiv/random_walk_oracle.rb +69 -0
  44. data/lib/lernen/equiv/random_well_matched_word_oracle.rb +139 -0
  45. data/lib/lernen/equiv/random_word_oracle.rb +71 -0
  46. data/lib/lernen/equiv/spa_simulator_oracle.rb +39 -0
  47. data/lib/lernen/equiv/test_words_oracle.rb +42 -0
  48. data/lib/lernen/equiv/transition_system_simulator_oracle.rb +36 -0
  49. data/lib/lernen/equiv/vpa_simulator_oracle.rb +48 -0
  50. data/lib/lernen/equiv.rb +25 -0
  51. data/lib/lernen/graph.rb +215 -0
  52. data/lib/lernen/system/block_sul.rb +41 -0
  53. data/lib/lernen/system/moore_like_simulator.rb +45 -0
  54. data/lib/lernen/system/moore_like_sul.rb +33 -0
  55. data/lib/lernen/system/sul.rb +126 -0
  56. data/lib/lernen/system/transition_system_simulator.rb +40 -0
  57. data/lib/lernen/system.rb +72 -0
  58. data/lib/lernen/version.rb +2 -1
  59. data/lib/lernen.rb +322 -13
  60. data/rbs_collection.lock.yaml +16 -0
  61. data/rbs_collection.yaml +14 -0
  62. data/renovate.json +6 -0
  63. data/sig/generated/lernen/algorithm/cex_processor/acex.rbs +30 -0
  64. data/sig/generated/lernen/algorithm/cex_processor/prefix_transformer_acex.rbs +27 -0
  65. data/sig/generated/lernen/algorithm/cex_processor.rbs +59 -0
  66. data/sig/generated/lernen/algorithm/kearns_vazirani/discrimination_tree.rbs +68 -0
  67. data/sig/generated/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rbs +51 -0
  68. data/sig/generated/lernen/algorithm/kearns_vazirani.rbs +32 -0
  69. data/sig/generated/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rbs +73 -0
  70. data/sig/generated/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rbs +51 -0
  71. data/sig/generated/lernen/algorithm/kearns_vazirani_vpa.rbs +20 -0
  72. data/sig/generated/lernen/algorithm/learner.rbs +53 -0
  73. data/sig/generated/lernen/algorithm/lsharp/lsharp_learner.rbs +103 -0
  74. data/sig/generated/lernen/algorithm/lsharp/observation_tree.rbs +53 -0
  75. data/sig/generated/lernen/algorithm/lsharp.rbs +38 -0
  76. data/sig/generated/lernen/algorithm/lstar/lstar_learner.rbs +38 -0
  77. data/sig/generated/lernen/algorithm/lstar/observation_table.rbs +79 -0
  78. data/sig/generated/lernen/algorithm/lstar.rbs +37 -0
  79. data/sig/generated/lernen/algorithm/procedural/atr_manager.rbs +80 -0
  80. data/sig/generated/lernen/algorithm/procedural/procedural_learner.rbs +79 -0
  81. data/sig/generated/lernen/algorithm/procedural/procedural_sul.rbs +36 -0
  82. data/sig/generated/lernen/algorithm/procedural/return_indices_acex.rbs +33 -0
  83. data/sig/generated/lernen/algorithm/procedural.rbs +27 -0
  84. data/sig/generated/lernen/algorithm.rbs +10 -0
  85. data/sig/generated/lernen/automaton/dfa.rbs +93 -0
  86. data/sig/generated/lernen/automaton/mealy.rbs +61 -0
  87. data/sig/generated/lernen/automaton/moore.rbs +69 -0
  88. data/sig/generated/lernen/automaton/moore_like.rbs +63 -0
  89. data/sig/generated/lernen/automaton/proc_util.rbs +38 -0
  90. data/sig/generated/lernen/automaton/spa.rbs +125 -0
  91. data/sig/generated/lernen/automaton/transition_system.rbs +108 -0
  92. data/sig/generated/lernen/automaton/vpa.rbs +109 -0
  93. data/sig/generated/lernen/automaton.rbs +15 -0
  94. data/sig/generated/lernen/equiv/combined_oracle.rbs +27 -0
  95. data/sig/generated/lernen/equiv/exhaustive_search_oracle.rbs +38 -0
  96. data/sig/generated/lernen/equiv/moore_like_simulator_oracle.rbs +27 -0
  97. data/sig/generated/lernen/equiv/oracle.rbs +75 -0
  98. data/sig/generated/lernen/equiv/random_walk_oracle.rbs +41 -0
  99. data/sig/generated/lernen/equiv/random_well_matched_word_oracle.rbs +70 -0
  100. data/sig/generated/lernen/equiv/random_word_oracle.rbs +45 -0
  101. data/sig/generated/lernen/equiv/spa_simulator_oracle.rbs +30 -0
  102. data/sig/generated/lernen/equiv/test_words_oracle.rbs +20 -0
  103. data/sig/generated/lernen/equiv/transition_system_simulator_oracle.rbs +27 -0
  104. data/sig/generated/lernen/equiv/vpa_simulator_oracle.rbs +33 -0
  105. data/sig/generated/lernen/equiv.rbs +11 -0
  106. data/sig/generated/lernen/graph.rbs +80 -0
  107. data/sig/generated/lernen/system/block_sul.rbs +29 -0
  108. data/sig/generated/lernen/system/moore_like_simulator.rbs +31 -0
  109. data/sig/generated/lernen/system/moore_like_sul.rbs +28 -0
  110. data/sig/generated/lernen/system/sul.rbs +87 -0
  111. data/sig/generated/lernen/system/transition_system_simulator.rbs +28 -0
  112. data/sig/generated/lernen/system.rbs +62 -0
  113. data/sig/generated/lernen/version.rbs +6 -0
  114. data/sig/generated/lernen.rbs +214 -0
  115. data/sig-test/generated/test/example_test.rbs +14 -0
  116. data/sig-test/generated/test/lernen/algorithm/kearns_vazirani_test.rbs +16 -0
  117. data/sig-test/generated/test/lernen/algorithm/kearns_vazirani_vpa_test.rbs +10 -0
  118. data/sig-test/generated/test/lernen/algorithm/lsharp_test.rbs +16 -0
  119. data/sig-test/generated/test/lernen/algorithm/lstar_test.rbs +16 -0
  120. data/sig-test/generated/test/lernen/algorithm/procedural_test.rbs +10 -0
  121. data/sig-test/generated/test/lernen/automaton/dfa_test.rbs +19 -0
  122. data/sig-test/generated/test/lernen/automaton/mealy_test.rbs +19 -0
  123. data/sig-test/generated/test/lernen/automaton/moore_test.rbs +19 -0
  124. data/sig-test/generated/test/lernen/automaton/proc_util_test.rbs +19 -0
  125. data/sig-test/generated/test/lernen/automaton/spa_test.rbs +19 -0
  126. data/sig-test/generated/test/lernen/automaton/vpa_test.rbs +19 -0
  127. data/sig-test/generated/test/lernen/equiv/exhaustive_search_oracle_test.rbs +10 -0
  128. data/sig-test/generated/test/lernen/equiv/random_walk_oracle_test.rbs +10 -0
  129. data/sig-test/generated/test/lernen/equiv/random_word_oracle_test.rbs +10 -0
  130. data/sig-test/generated/test/lernen/system/block_sul_test.rbs +16 -0
  131. data/sig-test/generated/test/lernen/system/moore_like_simulator_test.rbs +16 -0
  132. data/sig-test/generated/test/lernen/system/transition_system_simulator_test.rbs +13 -0
  133. data/sig-test/generated/test/lernen/system_test.rbs +11 -0
  134. data/sig-test/generated/test/lernen_test.rbs +13 -0
  135. metadata +131 -11
  136. data/.yardopts +0 -3
  137. data/lib/lernen/cex_processor.rb +0 -61
  138. data/lib/lernen/kearns_vazirani.rb +0 -199
  139. data/lib/lernen/lsharp.rb +0 -335
  140. data/lib/lernen/lstar.rb +0 -169
  141. data/lib/lernen/oracle.rb +0 -116
  142. data/lib/lernen/sul.rb +0 -134
@@ -0,0 +1,19 @@
1
+ # Generated from test/lernen/automaton/dfa_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Automaton
5
+ class DFATest < Minitest::Test
6
+ # : () -> Lernen::Automaton::DFA[String]
7
+ def self.mod4_dfa: () -> Lernen::Automaton::DFA[String]
8
+
9
+ # : () -> void
10
+ def test_run: () -> void
11
+
12
+ # : () -> void
13
+ def test_to_mermaid: () -> void
14
+
15
+ # : () -> void
16
+ def test_to_dot: () -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # Generated from test/lernen/automaton/mealy_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Automaton
5
+ class MealyTest < Minitest::Test
6
+ # : () -> Lernen::Automaton::Mealy[String, Integer]
7
+ def self.mod4_mealy: () -> Lernen::Automaton::Mealy[String, Integer]
8
+
9
+ # : () -> void
10
+ def test_run: () -> void
11
+
12
+ # : () -> void
13
+ def test_to_mermaid: () -> void
14
+
15
+ # : () -> void
16
+ def test_to_dot: () -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # Generated from test/lernen/automaton/moore_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Automaton
5
+ class MooreTest < Minitest::Test
6
+ # : () -> Lernen::Automaton::Moore[String, Integer]
7
+ def self.mod4_moore: () -> Lernen::Automaton::Moore[String, Integer]
8
+
9
+ # : () -> void
10
+ def test_run: () -> void
11
+
12
+ # : () -> void
13
+ def test_to_mermaid: () -> void
14
+
15
+ # : () -> void
16
+ def test_to_dot: () -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # Generated from test/lernen/automaton/proc_util_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Automaton
5
+ class ProcUtilTest < Minitest::Test
6
+ # : () -> void
7
+ def test_expand: () -> void
8
+
9
+ # : () -> void
10
+ def test_project: () -> void
11
+
12
+ # : () -> void
13
+ def test_find_call_index: () -> void
14
+
15
+ # : () -> void
16
+ def test_find_return_index: () -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # Generated from test/lernen/automaton/spa_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Automaton
5
+ class SPATest < Minitest::Test
6
+ # : () -> Lernen::Automaton::SPA[String, Symbol, Symbol]
7
+ def self.palindrome_spa: () -> Lernen::Automaton::SPA[String, Symbol, Symbol]
8
+
9
+ # : () -> void
10
+ def test_run: () -> void
11
+
12
+ # : () -> void
13
+ def test_to_mermaid: () -> void
14
+
15
+ # : () -> void
16
+ def test_to_dot: () -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # Generated from test/lernen/automaton/vpa_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Automaton
5
+ class VPATest < Minitest::Test
6
+ # : () -> Lernen::Automaton::VPA[String, String, String]
7
+ def self.dyck_vpa: () -> Lernen::Automaton::VPA[String, String, String]
8
+
9
+ # : () -> void
10
+ def test_run: () -> void
11
+
12
+ # : () -> void
13
+ def test_to_mermaid: () -> void
14
+
15
+ # : () -> void
16
+ def test_to_dot: () -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ # Generated from test/lernen/equiv/exhaustive_search_oracle_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Equiv
5
+ class ExhaustiveSearchOracleTest < Minitest::Test
6
+ # : () -> void
7
+ def test_find_cex_and_stats: () -> void
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # Generated from test/lernen/equiv/random_walk_oracle_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Equiv
5
+ class RandomWalkOracleTest < Minitest::Test
6
+ # : () -> void
7
+ def test_find_cex: () -> void
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # Generated from test/lernen/equiv/random_word_oracle_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module Equiv
5
+ class RandomWordOracleTest < Minitest::Test
6
+ # : () -> void
7
+ def test_find_cex: () -> void
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # Generated from test/lernen/system/block_sul_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module System
5
+ class BlockSULTest < Minitest::Test
6
+ # : () -> void
7
+ def test_step: () -> void
8
+
9
+ # : () -> void
10
+ def test_query_and_stats: () -> void
11
+
12
+ # : () -> void
13
+ def test_query_empty: () -> void
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # Generated from test/lernen/system/moore_like_simulator_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module System
5
+ class MooreLikeSimulatorTest < Minitest::Test
6
+ # : () -> void
7
+ def test_step: () -> void
8
+
9
+ # : () -> void
10
+ def test_query_and_stats: () -> void
11
+
12
+ # : () -> void
13
+ def test_query_empty: () -> void
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ # Generated from test/lernen/system/transition_system_simulator_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ module System
5
+ class TransitionSystemSimulatorTest < Minitest::Test
6
+ # : () -> void
7
+ def test_step: () -> void
8
+
9
+ # : () -> void
10
+ def test_query_and_stats: () -> void
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # Generated from test/lernen/system_test.rb with RBS::Inline
2
+
3
+ module Lernen
4
+ class SystemTest < Minitest::Test
5
+ # : () -> void
6
+ def test_from_block: () -> void
7
+
8
+ # : () -> void
9
+ def test_from_automaton: () -> void
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # Generated from test/lernen_test.rb with RBS::Inline
2
+
3
+ class LernenTest < Minitest::Test
4
+ N: ::Integer
5
+
6
+ ORACLE: :random_word
7
+
8
+ ORACLE_PARAMS: Hash[Symbol, Integer]
9
+
10
+ VPA_ORACLE_PARAMS: Hash[Symbol, Integer]
11
+
12
+ TEST_CASES: Array[[ Lernen::algorithm_name, Hash[Symbol, Symbol] ]]
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lernen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TSUYUSATO Kitsune
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-22 00:00:00.000000000 Z
11
+ date: 2024-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: set
@@ -33,20 +33,140 @@ extra_rdoc_files: []
33
33
  files:
34
34
  - ".editorconfig"
35
35
  - ".rubocop.yml"
36
- - ".yardopts"
37
36
  - CODE_OF_CONDUCT.md
38
37
  - LICENSE.txt
39
38
  - README.md
40
39
  - Rakefile
40
+ - Steepfile
41
+ - examples/ripper_prism.rb
42
+ - examples/uri_parse_regexp.rb
41
43
  - lib/lernen.rb
44
+ - lib/lernen/algorithm.rb
45
+ - lib/lernen/algorithm/cex_processor.rb
46
+ - lib/lernen/algorithm/cex_processor/acex.rb
47
+ - lib/lernen/algorithm/cex_processor/prefix_transformer_acex.rb
48
+ - lib/lernen/algorithm/kearns_vazirani.rb
49
+ - lib/lernen/algorithm/kearns_vazirani/discrimination_tree.rb
50
+ - lib/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rb
51
+ - lib/lernen/algorithm/kearns_vazirani_vpa.rb
52
+ - lib/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rb
53
+ - lib/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rb
54
+ - lib/lernen/algorithm/learner.rb
55
+ - lib/lernen/algorithm/lsharp.rb
56
+ - lib/lernen/algorithm/lsharp/lsharp_learner.rb
57
+ - lib/lernen/algorithm/lsharp/observation_tree.rb
58
+ - lib/lernen/algorithm/lstar.rb
59
+ - lib/lernen/algorithm/lstar/lstar_learner.rb
60
+ - lib/lernen/algorithm/lstar/observation_table.rb
61
+ - lib/lernen/algorithm/procedural.rb
62
+ - lib/lernen/algorithm/procedural/atr_manager.rb
63
+ - lib/lernen/algorithm/procedural/procedural_learner.rb
64
+ - lib/lernen/algorithm/procedural/procedural_sul.rb
65
+ - lib/lernen/algorithm/procedural/return_indices_acex.rb
42
66
  - lib/lernen/automaton.rb
43
- - lib/lernen/cex_processor.rb
44
- - lib/lernen/kearns_vazirani.rb
45
- - lib/lernen/lsharp.rb
46
- - lib/lernen/lstar.rb
47
- - lib/lernen/oracle.rb
48
- - lib/lernen/sul.rb
67
+ - lib/lernen/automaton/dfa.rb
68
+ - lib/lernen/automaton/mealy.rb
69
+ - lib/lernen/automaton/moore.rb
70
+ - lib/lernen/automaton/moore_like.rb
71
+ - lib/lernen/automaton/proc_util.rb
72
+ - lib/lernen/automaton/spa.rb
73
+ - lib/lernen/automaton/transition_system.rb
74
+ - lib/lernen/automaton/vpa.rb
75
+ - lib/lernen/equiv.rb
76
+ - lib/lernen/equiv/combined_oracle.rb
77
+ - lib/lernen/equiv/exhaustive_search_oracle.rb
78
+ - lib/lernen/equiv/moore_like_simulator_oracle.rb
79
+ - lib/lernen/equiv/oracle.rb
80
+ - lib/lernen/equiv/random_walk_oracle.rb
81
+ - lib/lernen/equiv/random_well_matched_word_oracle.rb
82
+ - lib/lernen/equiv/random_word_oracle.rb
83
+ - lib/lernen/equiv/spa_simulator_oracle.rb
84
+ - lib/lernen/equiv/test_words_oracle.rb
85
+ - lib/lernen/equiv/transition_system_simulator_oracle.rb
86
+ - lib/lernen/equiv/vpa_simulator_oracle.rb
87
+ - lib/lernen/graph.rb
88
+ - lib/lernen/system.rb
89
+ - lib/lernen/system/block_sul.rb
90
+ - lib/lernen/system/moore_like_simulator.rb
91
+ - lib/lernen/system/moore_like_sul.rb
92
+ - lib/lernen/system/sul.rb
93
+ - lib/lernen/system/transition_system_simulator.rb
49
94
  - lib/lernen/version.rb
95
+ - rbs_collection.lock.yaml
96
+ - rbs_collection.yaml
97
+ - renovate.json
98
+ - sig-test/generated/test/example_test.rbs
99
+ - sig-test/generated/test/lernen/algorithm/kearns_vazirani_test.rbs
100
+ - sig-test/generated/test/lernen/algorithm/kearns_vazirani_vpa_test.rbs
101
+ - sig-test/generated/test/lernen/algorithm/lsharp_test.rbs
102
+ - sig-test/generated/test/lernen/algorithm/lstar_test.rbs
103
+ - sig-test/generated/test/lernen/algorithm/procedural_test.rbs
104
+ - sig-test/generated/test/lernen/automaton/dfa_test.rbs
105
+ - sig-test/generated/test/lernen/automaton/mealy_test.rbs
106
+ - sig-test/generated/test/lernen/automaton/moore_test.rbs
107
+ - sig-test/generated/test/lernen/automaton/proc_util_test.rbs
108
+ - sig-test/generated/test/lernen/automaton/spa_test.rbs
109
+ - sig-test/generated/test/lernen/automaton/vpa_test.rbs
110
+ - sig-test/generated/test/lernen/equiv/exhaustive_search_oracle_test.rbs
111
+ - sig-test/generated/test/lernen/equiv/random_walk_oracle_test.rbs
112
+ - sig-test/generated/test/lernen/equiv/random_word_oracle_test.rbs
113
+ - sig-test/generated/test/lernen/system/block_sul_test.rbs
114
+ - sig-test/generated/test/lernen/system/moore_like_simulator_test.rbs
115
+ - sig-test/generated/test/lernen/system/transition_system_simulator_test.rbs
116
+ - sig-test/generated/test/lernen/system_test.rbs
117
+ - sig-test/generated/test/lernen_test.rbs
118
+ - sig/generated/lernen.rbs
119
+ - sig/generated/lernen/algorithm.rbs
120
+ - sig/generated/lernen/algorithm/cex_processor.rbs
121
+ - sig/generated/lernen/algorithm/cex_processor/acex.rbs
122
+ - sig/generated/lernen/algorithm/cex_processor/prefix_transformer_acex.rbs
123
+ - sig/generated/lernen/algorithm/kearns_vazirani.rbs
124
+ - sig/generated/lernen/algorithm/kearns_vazirani/discrimination_tree.rbs
125
+ - sig/generated/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rbs
126
+ - sig/generated/lernen/algorithm/kearns_vazirani_vpa.rbs
127
+ - sig/generated/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rbs
128
+ - sig/generated/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rbs
129
+ - sig/generated/lernen/algorithm/learner.rbs
130
+ - sig/generated/lernen/algorithm/lsharp.rbs
131
+ - sig/generated/lernen/algorithm/lsharp/lsharp_learner.rbs
132
+ - sig/generated/lernen/algorithm/lsharp/observation_tree.rbs
133
+ - sig/generated/lernen/algorithm/lstar.rbs
134
+ - sig/generated/lernen/algorithm/lstar/lstar_learner.rbs
135
+ - sig/generated/lernen/algorithm/lstar/observation_table.rbs
136
+ - sig/generated/lernen/algorithm/procedural.rbs
137
+ - sig/generated/lernen/algorithm/procedural/atr_manager.rbs
138
+ - sig/generated/lernen/algorithm/procedural/procedural_learner.rbs
139
+ - sig/generated/lernen/algorithm/procedural/procedural_sul.rbs
140
+ - sig/generated/lernen/algorithm/procedural/return_indices_acex.rbs
141
+ - sig/generated/lernen/automaton.rbs
142
+ - sig/generated/lernen/automaton/dfa.rbs
143
+ - sig/generated/lernen/automaton/mealy.rbs
144
+ - sig/generated/lernen/automaton/moore.rbs
145
+ - sig/generated/lernen/automaton/moore_like.rbs
146
+ - sig/generated/lernen/automaton/proc_util.rbs
147
+ - sig/generated/lernen/automaton/spa.rbs
148
+ - sig/generated/lernen/automaton/transition_system.rbs
149
+ - sig/generated/lernen/automaton/vpa.rbs
150
+ - sig/generated/lernen/equiv.rbs
151
+ - sig/generated/lernen/equiv/combined_oracle.rbs
152
+ - sig/generated/lernen/equiv/exhaustive_search_oracle.rbs
153
+ - sig/generated/lernen/equiv/moore_like_simulator_oracle.rbs
154
+ - sig/generated/lernen/equiv/oracle.rbs
155
+ - sig/generated/lernen/equiv/random_walk_oracle.rbs
156
+ - sig/generated/lernen/equiv/random_well_matched_word_oracle.rbs
157
+ - sig/generated/lernen/equiv/random_word_oracle.rbs
158
+ - sig/generated/lernen/equiv/spa_simulator_oracle.rbs
159
+ - sig/generated/lernen/equiv/test_words_oracle.rbs
160
+ - sig/generated/lernen/equiv/transition_system_simulator_oracle.rbs
161
+ - sig/generated/lernen/equiv/vpa_simulator_oracle.rbs
162
+ - sig/generated/lernen/graph.rbs
163
+ - sig/generated/lernen/system.rbs
164
+ - sig/generated/lernen/system/block_sul.rbs
165
+ - sig/generated/lernen/system/moore_like_simulator.rbs
166
+ - sig/generated/lernen/system/moore_like_sul.rbs
167
+ - sig/generated/lernen/system/sul.rbs
168
+ - sig/generated/lernen/system/transition_system_simulator.rbs
169
+ - sig/generated/lernen/version.rbs
50
170
  homepage: https://github.com/makenowjust/lernen
51
171
  licenses:
52
172
  - MIT
@@ -69,8 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
189
  - !ruby/object:Gem::Version
70
190
  version: '0'
71
191
  requirements: []
72
- rubygems_version: 3.6.0.dev
192
+ rubygems_version: 3.5.11
73
193
  signing_key:
74
194
  specification_version: 4
75
- summary: a simple automata leraning library
195
+ summary: an automata leraning library
76
196
  test_files: []
data/.yardopts DELETED
@@ -1,3 +0,0 @@
1
- --protected
2
- --no-private
3
- --markup markdown
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lernen
4
- # CexProcessor is a collection of implementations of couterexample processing procesudres.
5
- module CexProcessor
6
- # Processes a given `cex`. It returns a new prefix and suffix to advance a learning.
7
- def self.process(sul, hypothesis, cex, state_to_prefix, cex_processing: :binary)
8
- case cex_processing
9
- in :linear
10
- process_linear(sul, hypothesis, cex, state_to_prefix)
11
- in :binary
12
- process_binary(sul, hypothesis, cex, state_to_prefix)
13
- end
14
- end
15
-
16
- # Processes a given `cex` by linear search.
17
- def self.process_linear(sul, hypothesis, cex, state_to_prefix)
18
- expected_output = sul.query(cex).last
19
-
20
- current_state = hypothesis.initial_state
21
- cex.each_with_index do |a, i|
22
- _, next_state = hypothesis.step(current_state, a)
23
-
24
- prefix = state_to_prefix[next_state]
25
- suffix = cex[i + 1...]
26
- return state_to_prefix[current_state], a, suffix if expected_output != sul.query(prefix + suffix).last
27
-
28
- current_state = next_state
29
- end
30
- end
31
-
32
- # Processes a given `cex` by binary search.
33
- #
34
- # It is known as the Rivest-Schapire (RS) technique.
35
- def self.process_binary(sul, hypothesis, cex, state_to_prefix)
36
- expected_output = sul.query(cex).last
37
-
38
- low = 0
39
- high = cex.size
40
-
41
- while high - low > 1
42
- mid = (low + high) / 2
43
- prefix = cex[0...mid]
44
- suffix = cex[mid...]
45
-
46
- _, prefix_state = hypothesis.run(prefix)
47
- if expected_output == sul.query(state_to_prefix[prefix_state] + suffix).last
48
- low = mid
49
- else
50
- high = mid
51
- end
52
- end
53
-
54
- prefix = cex[0...low]
55
- suffix = cex[high...]
56
-
57
- _, prefix_state = hypothesis.run(prefix)
58
- [state_to_prefix[prefix_state], cex[low], suffix]
59
- end
60
- end
61
- end
@@ -1,199 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lernen
4
- # ClassificationTree is a classification tree implementation.
5
- class ClassificationTree
6
- Node = Data.define(:suffix, :edges)
7
- Leaf = Data.define(:prefix)
8
-
9
- private_constant :Node, :Leaf
10
-
11
- def initialize(alphabet, sul, cex:, automaton_type:, cex_processing:)
12
- @alphabet = alphabet
13
- @sul = sul
14
- @automaton_type = automaton_type
15
- @cex_processing = cex_processing
16
-
17
- @paths = {}
18
-
19
- case @automaton_type
20
- in :dfa | :moore
21
- @root = Node[[], {}]
22
-
23
- empty_out = sul.query_empty
24
- @root.edges[empty_out] = Leaf[[]]
25
- @paths[[]] = [empty_out]
26
-
27
- cex_out = sul.query(cex).last
28
- @root.edges[cex_out] = Leaf[cex]
29
- @paths[cex] = [cex_out]
30
- in :mealy
31
- suffix = [cex.last]
32
- @root = Node[suffix, {}]
33
-
34
- suffix_out = sul.query(suffix).last
35
- @root.edges[suffix_out] = Leaf[[]]
36
- @paths[[]] = [suffix_out]
37
-
38
- cex_out = sul.query(cex).last
39
- @root.edges[cex_out] = Leaf[cex]
40
- @paths[cex] = [cex_out]
41
- end
42
- end
43
-
44
- # Returns a prefix classified by `word`.
45
- def sift(word)
46
- node = @root
47
- path = []
48
-
49
- until node.is_a?(Leaf)
50
- inputs = word + node.suffix
51
- out = @sul.query(inputs).last
52
- path << out
53
-
54
- unless node.edges.include?(out)
55
- node.edges[out] = Leaf[word]
56
- @paths[word] = path
57
- end
58
-
59
- node = node.edges[out]
60
- end
61
-
62
- node.prefix
63
- end
64
-
65
- # Constructs a hypothesis automaton from this classification tree.
66
- def to_hypothesis
67
- transitions = {}
68
-
69
- queue = []
70
- prefix_to_state = {}
71
-
72
- queue << []
73
- prefix_to_state[[]] = prefix_to_state.size
74
-
75
- until queue.empty?
76
- prefix = queue.shift
77
- state = prefix_to_state[prefix]
78
- @alphabet.each do |input|
79
- word = prefix + [input]
80
- next_prefix = sift(word)
81
-
82
- unless prefix_to_state.include?(next_prefix)
83
- prefix_to_state[next_prefix] = prefix_to_state.size
84
- queue << next_prefix
85
- end
86
-
87
- next_state = prefix_to_state[next_prefix]
88
- case @automaton_type
89
- in :dfa | :moore
90
- transitions[[state, input]] = next_state
91
- in :mealy
92
- output = @sul.query(word).last
93
- transitions[[state, input]] = [output, next_state]
94
- end
95
- end
96
- end
97
-
98
- state_to_prefix = prefix_to_state.to_h { |q, i| [i, q] }
99
- automaton =
100
- case @automaton_type
101
- in :dfa
102
- accept_states = state_to_prefix.to_a.filter { |(_, q)| @paths[q][0] }.to_set { |(i, _)| i }
103
- DFA.new(0, accept_states, transitions)
104
- in :moore
105
- outputs = state_to_prefix.transform_values { |q| @paths[q][0] }
106
- Moore.new(0, outputs, transitions)
107
- in :mealy
108
- Mealy.new(0, transitions)
109
- end
110
-
111
- [automaton, state_to_prefix]
112
- end
113
-
114
- # Update this classification tree by the given `cex`.
115
- def process_cex(hypothesis, cex, state_to_prefix)
116
- old_prefix, new_input, new_suffix =
117
- CexProcessor.process(@sul, hypothesis, cex, state_to_prefix, cex_processing: @cex_processing)
118
-
119
- _, old_prefix_state = hypothesis.run(old_prefix)
120
- new_prefix = state_to_prefix[old_prefix_state] + [new_input]
121
- new_prefix_out = @sul.query(new_prefix + new_suffix).last
122
-
123
- _, old_node_state = hypothesis.run(old_prefix + [new_input])
124
- old_node_prefix = state_to_prefix[old_node_state]
125
- old_node_out = @sul.query(old_node_prefix + new_suffix).last
126
-
127
- old_node_path = @paths[old_node_prefix]
128
- parent = @root
129
- old_node = @root.edges[old_node_path.first]
130
- old_node_path[1..].each do |out|
131
- parent = old_node
132
- old_node = old_node.edges[out]
133
- end
134
-
135
- new_node = Node[new_suffix, {}]
136
- parent.edges[old_node_path.last] = new_node
137
-
138
- new_node.edges[new_prefix_out] = Leaf[new_prefix]
139
- @paths[new_prefix] = old_node_path + [new_prefix_out]
140
-
141
- new_node.edges[old_node_out] = Leaf[old_node_prefix]
142
- @paths[old_node_prefix] = old_node_path + [old_node_out]
143
- end
144
- end
145
-
146
- # KearnsVazirani is an implementation of the Kearns-Vazirani automata learning algorithm.
147
- module KearnsVazirani
148
- # Runs the Kearns-Vazirani algoritghm and returns an inferred automaton.
149
- def self.learn(alphabet, sul, oracle, automaton_type:, cex_processing: :binary, max_learning_rounds: nil)
150
- hypothesis = construct_first_hypothesis(alphabet, sul, automaton_type)
151
- cex = oracle.find_cex(hypothesis)
152
- return hypothesis if cex.nil?
153
-
154
- classification_tree = ClassificationTree.new(alphabet, sul, cex:, automaton_type:, cex_processing:)
155
- learning_rounds = 0
156
-
157
- loop do
158
- break if max_learning_rounds && learning_rounds == max_learning_rounds
159
- learning_rounds += 1
160
-
161
- hypothesis, state_to_prefix = classification_tree.to_hypothesis
162
- cex = oracle.find_cex(hypothesis)
163
- break if cex.nil?
164
-
165
- classification_tree.process_cex(hypothesis, cex, state_to_prefix)
166
- end
167
-
168
- hypothesis, = classification_tree.to_hypothesis
169
- hypothesis
170
- end
171
-
172
- # Constructs the first hypothesis automaton.
173
- def self.construct_first_hypothesis(alphabet, sul, automaton_type)
174
- transitions = {}
175
- alphabet.each do |a|
176
- case automaton_type
177
- in :dfa | :moore
178
- transitions[[0, a]] = 0
179
- in :mealy
180
- out = sul.query([a]).last
181
- transitions[[0, a]] = [out, 0]
182
- end
183
- end
184
-
185
- case automaton_type
186
- in :dfa
187
- accept_states = sul.query_empty ? Set[0] : Set.new
188
- DFA.new(0, accept_states, transitions)
189
- in :moore
190
- outputs = { 0 => sul.query_empty }
191
- Moore.new(0, outputs, transitions)
192
- in :mealy
193
- Mealy.new(0, transitions)
194
- end
195
- end
196
-
197
- private_class_method :construct_first_hypothesis
198
- end
199
- end