Module: Lernen
- Defined in:
- lib/lernen.rb,
lib/lernen/equiv.rb,
lib/lernen/graph.rb,
lib/lernen/system.rb,
lib/lernen/version.rb,
lib/lernen/algorithm.rb,
lib/lernen/automaton.rb,
lib/lernen/system/sul.rb,
lib/lernen/equiv/oracle.rb,
lib/lernen/automaton/dfa.rb,
lib/lernen/automaton/spa.rb,
lib/lernen/automaton/vpa.rb,
lib/lernen/algorithm/lstar.rb,
lib/lernen/automaton/mealy.rb,
lib/lernen/automaton/moore.rb,
lib/lernen/algorithm/lsharp.rb,
lib/lernen/system/block_sul.rb,
lib/lernen/algorithm/learner.rb,
lib/lernen/automaton/proc_util.rb,
lib/lernen/algorithm/procedural.rb,
lib/lernen/automaton/moore_like.rb,
lib/lernen/equiv/combined_oracle.rb,
lib/lernen/system/moore_like_sul.rb,
lib/lernen/algorithm/cex_processor.rb,
lib/lernen/equiv/test_words_oracle.rb,
lib/lernen/equiv/random_walk_oracle.rb,
lib/lernen/equiv/random_word_oracle.rb,
lib/lernen/algorithm/kearns_vazirani.rb,
lib/lernen/equiv/spa_simulator_oracle.rb,
lib/lernen/equiv/vpa_simulator_oracle.rb,
lib/lernen/automaton/transition_system.rb,
lib/lernen/system/moore_like_simulator.rb,
lib/lernen/algorithm/cex_processor/acex.rb,
lib/lernen/algorithm/kearns_vazirani_vpa.rb,
lib/lernen/algorithm/lstar/lstar_learner.rb,
lib/lernen/equiv/exhaustive_search_oracle.rb,
lib/lernen/algorithm/lsharp/lsharp_learner.rb,
lib/lernen/algorithm/procedural/atr_manager.rb,
lib/lernen/algorithm/lsharp/observation_tree.rb,
lib/lernen/algorithm/lstar/observation_table.rb,
lib/lernen/equiv/moore_like_simulator_oracle.rb,
lib/lernen/system/transition_system_simulator.rb,
lib/lernen/algorithm/procedural/procedural_sul.rb,
lib/lernen/equiv/random_well_matched_word_oracle.rb,
lib/lernen/algorithm/procedural/procedural_learner.rb,
lib/lernen/algorithm/procedural/return_indices_acex.rb,
lib/lernen/equiv/transition_system_simulator_oracle.rb,
lib/lernen/algorithm/kearns_vazirani/discrimination_tree.rb,
lib/lernen/algorithm/cex_processor/prefix_transformer_acex.rb,
lib/lernen/algorithm/kearns_vazirani/kearns_vazirani_learner.rb,
lib/lernen/algorithm/kearns_vazirani_vpa/discrimination_tree_vpa.rb,
lib/lernen/algorithm/kearns_vazirani_vpa/kearns_vazirani_vpa_learner.rb
Overview
rbs_inline: enabled
Defined Under Namespace
Modules: Algorithm, Automaton, Equiv, System Classes: Graph
Constant Summary collapse
- VERSION =
The version string.
"0.3.0"
Class Method Summary collapse
-
.learn(alphabet:, call_alphabet: nil, return_alphabet: nil, return_input: nil, sul: nil, oracle: nil, oracle_params: {}, algorithm: nil, automaton_type: nil, params: {}, random: Random, &sul_block) ⇒ Object
Learn an automaton by using the given parameters.
Class Method Details
.learn(alphabet:, call_alphabet: nil, return_alphabet: nil, return_input: nil, sul: nil, oracle: nil, oracle_params: {}, algorithm: nil, automaton_type: nil, params: {}, random: Random, &sul_block) ⇒ Object
Learn an automaton by using the given parameters.
This method is a frontend of the learning algorithms. Actual implementations are placed under
the Lernen::Algorithm namespace.
Parameters
This method takes a lot of parameters, but almost of parameters are optional. To start learning,
we need to give alphabet and a block of a program to infer an automaton.
alphabet: An input alphabet. This must be given as anArrayobject.call_alphabet: A call input alphabet of VPA. If this is specified,automaton_typeis specified as:vpaautomatically.return_alphabet: A return input alphabet of VPA.sul: A system under learning. If an automaton instance is given, it is converted it to a simulator and use it as a SUL. Or, if it is not specified, we use a block as a SUL.oracle: An equivalence oracle. It is one of:exhaustive_search,:random_walk,:random_word, or an actual instance ofEquiv::Oracle. If the value is a symbol, anEquiv::Oracleinstance of the specified kind is created withoracle_params. The default value is:random_wordifautomaton_typeis one of:dfa,:moore, and:mealy, or the default value is:random_well_matched_wordifautomaton_typeis either:spaor:vpa.oracle_params: A hash of parameters for equivalence oracle. The default value is{}.algorithm: An algorithm name to use. It is one of:lstar,:kearns_vazirani, or:lsharp. The default value is:kearns_vazirani(ifautomaton_typeis one of:dfa,:moore, and:mealy), or:kearns_vazirani_vpa(ifautomaton_typeisvpa), or:procedural(ifautomaton_typeisspa).automaton_type: A type of automaton to infer. It is one of:dfa,:mealy,:moore,:vpa, and:spa. The default value is:dfa, but it becomes:vpaor:spaifcall_alphabetorreturn_inputis specified.params: A hash of parameter to pass a learning algorithm. The default value is{}.random: A PRNG instance. It is used by an equivalence oracle.
: [In] ( alphabet: Array, sul: Automaton::DFA | System::MooreLikeSUL[In, bool], ?oracle: oracle_type | Equiv::Oracle[In, bool], ?oracle_params: Hash[Symbol, untyped], ?algorithm: algorithm_name, ?automaton_type: :dfa, ?params: Hash[Symbol, untyped], ?random: Random ) -> Automaton::DFA : [In] ( alphabet: Array, ?oracle: oracle_type | Equiv::Oracle[In, bool], ?oracle_params: Hash[Symbol, untyped], ?algorithm: algorithm_name, ?automaton_type: :dfa, ?params: Hash[Symbol, untyped], ?random: Random ) { (Array) -> bool } -> Automaton::DFA : [In, Out] ( alphabet: Array, sul: Automaton::Mealy[In, Out] | System::SUL[In, Out], ?oracle: oracle_type | Equiv::Oracle[In, Out], ?oracle_params: Hash[Symbol, untyped], ?algorithm: algorithm_name, automaton_type: :mealy, ?params: Hash[Symbol, untyped], ?random: Random ) -> Automaton::Mealy[In, Out] : [In, Out] ( alphabet: Array, ?oracle: oracle_type | Equiv::Oracle[In, Out], ?oracle_params: Hash[Symbol, untyped], ?algorithm: algorithm_name, automaton_type: :mealy, ?params: Hash[Symbol, untyped], ?random: Random ) { (Array) -> Out } -> Automaton::Mealy[In, Out] : [In, Out] ( alphabet: Array, sul: Automaton::Moore[In, Out] | System::MooreLikeSUL[In, Out], ?oracle: oracle_type | Equiv::Oracle[In, Out], ?oracle_params: Hash[Symbol, untyped], ?algorithm: algorithm_name, automaton_type: :moore, ?params: Hash[Symbol, untyped], ?random: Random ) -> Automaton::Moore[In, Out] : [In, Out] ( alphabet: Array, ?oracle: oracle_type | Equiv::Oracle[In, Out], ?oracle_params: Hash[Symbol, untyped], ?algorithm: algorithm_name, automaton_type: :moore, ?params: Hash[Symbol, untyped], ?random: Random ) { (Array) -> Out } -> Automaton::Moore[In, Out] : [In, Call, Return] ( alphabet: Array, call_alphabet: Array, return_alphabet: Array, sul: Automaton::VPA[In, Call, Return] | System::MooreLikeSUL[In | Call | Return, bool], ?oracle: oracle_type | Equiv::Oracle[In | Call | Return, bool], ?oracle_params: Hash[Symbol, untyped], ?algorithm: :kearns_vazirani_vpa, ?automaton_type: :vpa, ?params: Hash[Symbol, untyped], ?random: Random ) -> Automaton::VPA[In, Call, Return] : [In, Call, Return] ( alphabet: Array, call_alphabet: Array, return_alphabet: Array, ?oracle: oracle_type | Equiv::Oracle[In | Call | Return, bool], ?oracle_params: Hash[Symbol, untyped], ?algorithm: :kearns_vazirani_vpa, ?automaton_type: :vpa, ?params: Hash[Symbol, untyped], ?random: Random ) { (Array[In | Call | Return]) -> bool } -> Automaton::VPA[In, Call, Return] : [In, Call, Return] ( alphabet: Array, call_alphabet: Array, return_input: Return, sul: Automaton::SPA[In, Call, Return] | System::MooreLikeSUL[In | Call | Return, bool], ?oracle: oracle_type | Equiv::Oracle[In | Call | Return, bool], ?oracle_params: Hash[Symbol, untyped], ?algorithm: :procedural, ?automaton_type: :spa, ?params: Hash[Symbol, untyped], ?random: Random ) -> Automaton::SPA[In, Call, Return] : [In, Call, Return] ( alphabet: Array, call_alphabet: Array, return_input: Return, ?oracle: oracle_type | Equiv::Oracle[In | Call | Return, bool], ?oracle_params: Hash[Symbol, untyped], ?algorithm: :procedural, ?automaton_type: :spa, ?params: Hash[Symbol, untyped], ?random: Random ) { (Array[In | Call | Return]) -> bool } -> Automaton::SPA[In, Call, Return]
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
# File 'lib/lernen.rb', line 221 def self.learn( alphabet:, call_alphabet: nil, return_alphabet: nil, return_input: nil, sul: nil, oracle: nil, oracle_params: {}, algorithm: nil, automaton_type: nil, params: {}, random: Random, &sul_block ) automaton = nil case sul when System::SUL # Do nothing when Automaton::TransitionSystem automaton = sul oracle ||= :simulator automaton_type ||= sul.type sul = System.from_automaton(sul) # steep:ignore when nil sul = System.from_block(&sul_block) # steep:ignore else raise ArgumentError, "Unsupported SUL: #{sul}" end automaton_type ||= if call_alphabet return_input ? :spa : :vpa else :dfa end merged_alphabet = case automaton_type in :dfa | :moore | :mealy alphabet in :vpa | :spa return_alphabet ||= [return_input] alphabet + call_alphabet + return_alphabet end oracle ||= i[vpa spa].include?(automaton_type) ? :random_well_matched_word : :random_word case oracle when Equiv::Oracle # Do nothing when :exhaustive_search oracle = Equiv::ExhaustiveSearchOracle.new(merged_alphabet, sul, **oracle_params) when :random_walk oracle = Equiv::RandomWalkOracle.new(merged_alphabet, sul, random:, **oracle_params) when :random_word oracle = Equiv::RandomWordOracle.new(merged_alphabet, sul, random:, **oracle_params) when :random_well_matched_word oracle = Equiv::RandomWellMatchedWordOracle.new( alphabet, call_alphabet, # steep:ignore return_alphabet, # steep:ignore sul, random:, **oracle_params ) when :simulator oracle = case automaton when Automaton::Mealy Equiv::TransitionSystemSimulatorOracle.new(alphabet, automaton, sul) when Automaton::DFA, Automaton::Moore Equiv::MooreLikeSimulatorOracle.new(alphabet, automaton, sul) when Automaton::VPA Equiv::VPASimulatorOracle.new(alphabet, call_alphabet, return_alphabet, automaton, sul) # steep:ignore when Automaton::SPA Equiv::SPASimulatorOracle.new(alphabet, call_alphabet, automaton, sul) # steep:ignore else raise ArgumentError, "Cannot simulate automaton: #{automaton}" end else raise ArgumentError, "Unsupported oracle: #{oracle}" end algorithm ||= case automaton_type in :dfa | :moore | :mealy :kearns_vazirani in :vpa :kearns_vazirani_vpa in :spa :procedural end case algorithm in :lstar Algorithm::LStar.learn(alphabet, sul, oracle, automaton_type:, **params) in :kearns_vazirani Algorithm::KearnsVazirani.learn(alphabet, sul, oracle, automaton_type:, **params) in :kearns_vazirani_vpa Algorithm::KearnsVaziraniVPA.learn(alphabet, call_alphabet, return_alphabet, sul, oracle, **params) in :lsharp Algorithm::LSharp.learn(alphabet, sul, oracle, automaton_type:, **params) in :procedural Algorithm::Procedural.learn(alphabet, call_alphabet, return_input, sul, oracle, **params) end end |