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.
- checksums.yaml +4 -4
- data/.rubocop.yml +18 -0
- data/README.md +531 -28
- data/Rakefile +29 -7
- data/Steepfile +14 -0
- data/examples/ripper_prism.rb +63 -0
- data/examples/uri_parse_regexp.rb +73 -0
- data/lib/lernen/algorithm/cex_processor/acex.rb +43 -0
- data/lib/lernen/algorithm/cex_processor/prefix_transformer_acex.rb +43 -0
- data/lib/lernen/algorithm/cex_processor.rb +115 -0
- data/lib/lernen/algorithm/kearns_vazirani/discrimination_tree.rb +207 -0
- data/lib/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rb +100 -0
- data/lib/lernen/algorithm/kearns_vazirani.rb +44 -0
- data/lib/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rb +246 -0
- data/lib/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rb +89 -0
- data/lib/lernen/algorithm/kearns_vazirani_vpa.rb +35 -0
- data/lib/lernen/algorithm/learner.rb +82 -0
- data/lib/lernen/algorithm/lsharp/lsharp_learner.rb +367 -0
- data/lib/lernen/algorithm/lsharp/observation_tree.rb +115 -0
- data/lib/lernen/algorithm/lsharp.rb +43 -0
- data/lib/lernen/algorithm/lstar/lstar_learner.rb +49 -0
- data/lib/lernen/algorithm/lstar/observation_table.rb +214 -0
- data/lib/lernen/algorithm/lstar.rb +49 -0
- data/lib/lernen/algorithm/procedural/atr_manager.rb +200 -0
- data/lib/lernen/algorithm/procedural/procedural_learner.rb +223 -0
- data/lib/lernen/algorithm/procedural/procedural_sul.rb +47 -0
- data/lib/lernen/algorithm/procedural/return_indices_acex.rb +58 -0
- data/lib/lernen/algorithm/procedural.rb +57 -0
- data/lib/lernen/algorithm.rb +19 -0
- data/lib/lernen/automaton/dfa.rb +204 -0
- data/lib/lernen/automaton/mealy.rb +108 -0
- data/lib/lernen/automaton/moore.rb +122 -0
- data/lib/lernen/automaton/moore_like.rb +83 -0
- data/lib/lernen/automaton/proc_util.rb +93 -0
- data/lib/lernen/automaton/spa.rb +368 -0
- data/lib/lernen/automaton/transition_system.rb +209 -0
- data/lib/lernen/automaton/vpa.rb +300 -0
- data/lib/lernen/automaton.rb +19 -92
- data/lib/lernen/equiv/combined_oracle.rb +57 -0
- data/lib/lernen/equiv/exhaustive_search_oracle.rb +60 -0
- data/lib/lernen/equiv/moore_like_simulator_oracle.rb +36 -0
- data/lib/lernen/equiv/oracle.rb +109 -0
- data/lib/lernen/equiv/random_walk_oracle.rb +69 -0
- data/lib/lernen/equiv/random_well_matched_word_oracle.rb +139 -0
- data/lib/lernen/equiv/random_word_oracle.rb +71 -0
- data/lib/lernen/equiv/spa_simulator_oracle.rb +39 -0
- data/lib/lernen/equiv/test_words_oracle.rb +42 -0
- data/lib/lernen/equiv/transition_system_simulator_oracle.rb +36 -0
- data/lib/lernen/equiv/vpa_simulator_oracle.rb +48 -0
- data/lib/lernen/equiv.rb +25 -0
- data/lib/lernen/graph.rb +215 -0
- data/lib/lernen/system/block_sul.rb +41 -0
- data/lib/lernen/system/moore_like_simulator.rb +45 -0
- data/lib/lernen/system/moore_like_sul.rb +33 -0
- data/lib/lernen/system/sul.rb +126 -0
- data/lib/lernen/system/transition_system_simulator.rb +40 -0
- data/lib/lernen/system.rb +72 -0
- data/lib/lernen/version.rb +2 -1
- data/lib/lernen.rb +322 -13
- data/rbs_collection.lock.yaml +16 -0
- data/rbs_collection.yaml +14 -0
- data/renovate.json +6 -0
- data/sig/generated/lernen/algorithm/cex_processor/acex.rbs +30 -0
- data/sig/generated/lernen/algorithm/cex_processor/prefix_transformer_acex.rbs +27 -0
- data/sig/generated/lernen/algorithm/cex_processor.rbs +59 -0
- data/sig/generated/lernen/algorithm/kearns_vazirani/discrimination_tree.rbs +68 -0
- data/sig/generated/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rbs +51 -0
- data/sig/generated/lernen/algorithm/kearns_vazirani.rbs +32 -0
- data/sig/generated/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rbs +73 -0
- data/sig/generated/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rbs +51 -0
- data/sig/generated/lernen/algorithm/kearns_vazirani_vpa.rbs +20 -0
- data/sig/generated/lernen/algorithm/learner.rbs +53 -0
- data/sig/generated/lernen/algorithm/lsharp/lsharp_learner.rbs +103 -0
- data/sig/generated/lernen/algorithm/lsharp/observation_tree.rbs +53 -0
- data/sig/generated/lernen/algorithm/lsharp.rbs +38 -0
- data/sig/generated/lernen/algorithm/lstar/lstar_learner.rbs +38 -0
- data/sig/generated/lernen/algorithm/lstar/observation_table.rbs +79 -0
- data/sig/generated/lernen/algorithm/lstar.rbs +37 -0
- data/sig/generated/lernen/algorithm/procedural/atr_manager.rbs +80 -0
- data/sig/generated/lernen/algorithm/procedural/procedural_learner.rbs +79 -0
- data/sig/generated/lernen/algorithm/procedural/procedural_sul.rbs +36 -0
- data/sig/generated/lernen/algorithm/procedural/return_indices_acex.rbs +33 -0
- data/sig/generated/lernen/algorithm/procedural.rbs +27 -0
- data/sig/generated/lernen/algorithm.rbs +10 -0
- data/sig/generated/lernen/automaton/dfa.rbs +93 -0
- data/sig/generated/lernen/automaton/mealy.rbs +61 -0
- data/sig/generated/lernen/automaton/moore.rbs +69 -0
- data/sig/generated/lernen/automaton/moore_like.rbs +63 -0
- data/sig/generated/lernen/automaton/proc_util.rbs +38 -0
- data/sig/generated/lernen/automaton/spa.rbs +125 -0
- data/sig/generated/lernen/automaton/transition_system.rbs +108 -0
- data/sig/generated/lernen/automaton/vpa.rbs +109 -0
- data/sig/generated/lernen/automaton.rbs +15 -0
- data/sig/generated/lernen/equiv/combined_oracle.rbs +27 -0
- data/sig/generated/lernen/equiv/exhaustive_search_oracle.rbs +38 -0
- data/sig/generated/lernen/equiv/moore_like_simulator_oracle.rbs +27 -0
- data/sig/generated/lernen/equiv/oracle.rbs +75 -0
- data/sig/generated/lernen/equiv/random_walk_oracle.rbs +41 -0
- data/sig/generated/lernen/equiv/random_well_matched_word_oracle.rbs +70 -0
- data/sig/generated/lernen/equiv/random_word_oracle.rbs +45 -0
- data/sig/generated/lernen/equiv/spa_simulator_oracle.rbs +30 -0
- data/sig/generated/lernen/equiv/test_words_oracle.rbs +20 -0
- data/sig/generated/lernen/equiv/transition_system_simulator_oracle.rbs +27 -0
- data/sig/generated/lernen/equiv/vpa_simulator_oracle.rbs +33 -0
- data/sig/generated/lernen/equiv.rbs +11 -0
- data/sig/generated/lernen/graph.rbs +80 -0
- data/sig/generated/lernen/system/block_sul.rbs +29 -0
- data/sig/generated/lernen/system/moore_like_simulator.rbs +31 -0
- data/sig/generated/lernen/system/moore_like_sul.rbs +28 -0
- data/sig/generated/lernen/system/sul.rbs +87 -0
- data/sig/generated/lernen/system/transition_system_simulator.rbs +28 -0
- data/sig/generated/lernen/system.rbs +62 -0
- data/sig/generated/lernen/version.rbs +6 -0
- data/sig/generated/lernen.rbs +214 -0
- data/sig-test/generated/test/example_test.rbs +14 -0
- data/sig-test/generated/test/lernen/algorithm/kearns_vazirani_test.rbs +16 -0
- data/sig-test/generated/test/lernen/algorithm/kearns_vazirani_vpa_test.rbs +10 -0
- data/sig-test/generated/test/lernen/algorithm/lsharp_test.rbs +16 -0
- data/sig-test/generated/test/lernen/algorithm/lstar_test.rbs +16 -0
- data/sig-test/generated/test/lernen/algorithm/procedural_test.rbs +10 -0
- data/sig-test/generated/test/lernen/automaton/dfa_test.rbs +19 -0
- data/sig-test/generated/test/lernen/automaton/mealy_test.rbs +19 -0
- data/sig-test/generated/test/lernen/automaton/moore_test.rbs +19 -0
- data/sig-test/generated/test/lernen/automaton/proc_util_test.rbs +19 -0
- data/sig-test/generated/test/lernen/automaton/spa_test.rbs +19 -0
- data/sig-test/generated/test/lernen/automaton/vpa_test.rbs +19 -0
- data/sig-test/generated/test/lernen/equiv/exhaustive_search_oracle_test.rbs +10 -0
- data/sig-test/generated/test/lernen/equiv/random_walk_oracle_test.rbs +10 -0
- data/sig-test/generated/test/lernen/equiv/random_word_oracle_test.rbs +10 -0
- data/sig-test/generated/test/lernen/system/block_sul_test.rbs +16 -0
- data/sig-test/generated/test/lernen/system/moore_like_simulator_test.rbs +16 -0
- data/sig-test/generated/test/lernen/system/transition_system_simulator_test.rbs +13 -0
- data/sig-test/generated/test/lernen/system_test.rbs +11 -0
- data/sig-test/generated/test/lernen_test.rbs +13 -0
- metadata +131 -11
- data/.yardopts +0 -3
- data/lib/lernen/cex_processor.rb +0 -61
- data/lib/lernen/kearns_vazirani.rb +0 -199
- data/lib/lernen/lsharp.rb +0 -335
- data/lib/lernen/lstar.rb +0 -169
- data/lib/lernen/oracle.rb +0 -116
- 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,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,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.
|
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-
|
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/
|
44
|
-
- lib/lernen/
|
45
|
-
- lib/lernen/
|
46
|
-
- lib/lernen/
|
47
|
-
- lib/lernen/
|
48
|
-
- lib/lernen/
|
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.
|
192
|
+
rubygems_version: 3.5.11
|
73
193
|
signing_key:
|
74
194
|
specification_version: 4
|
75
|
-
summary:
|
195
|
+
summary: an automata leraning library
|
76
196
|
test_files: []
|
data/.yardopts
DELETED
data/lib/lernen/cex_processor.rb
DELETED
@@ -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
|