amachine.am_create.am_star
1from collections import defaultdict 2import copy 3import random 4 5import numpy as np 6 7from ..am_hmm import HMM 8from ..am_causal_state import CausalState 9from ..am_transition import Transition 10 11from ..am_random import exp_uniform_blend, resolve_rng 12from ..am_vocabulary import Vocabulary 13 14from .am_random_machine import random_machine 15from .am_isomorphic_to import isomorphic_to 16from .am_star_join import star_join 17 18def star( 19 exit_symbol : str, 20 enter_symbols : list[str], 21 normal_symbols : list[str], 22 n_modes : int, 23 n_isomorphic : int, 24 randomness : float, 25 connectedness : float, 26 residency_factor : float, 27 n_normal_symbols : int, 28 t_states_per_machine : int, 29 random_seed : int | None = None ) -> HMM : 30 31 if len( normal_symbols ) < n_normal_symbols*n_isomorphic : 32 raise ValueError( "Must have at least n_normal_symbols*n_isomorphic normal symbols" ) 33 34 if len( enter_symbols ) < n_modes*n_isomorphic : 35 raise ValueError( "Must have at least n_modes*n_isomorphic enter symbols" ) 36 37 alphabet = [ f"{normal_symbols[i]}" for i in range( 0, n_normal_symbols ) ] 38 iso_alphabet = [ f"{normal_symbols[i]}" for i in range( n_normal_symbols, n_normal_symbols*2 ) ] 39 40 random_machines = [] 41 42 for i in range( n_modes ) : 43 44 m = random_machine( 45 n_states=t_states_per_machine, 46 symbols=alphabet, 47 connectedness=connectedness, 48 randomness=randomness, 49 ensure_strongly_connected=True, 50 ensure_minimal=True, 51 random_seed=random_seed ) 52 53 m.isoclass = f"{i}" 54 m_iso.isoclass = f"{i}" 55 56 for j, state in enumerate( m.states ) : 57 m.states[ j ].add_isomorph( m_iso.states[ j ].name ) 58 m_iso.states[ j ].add_isomorph( m.states[ j ].name ) 59 60 random_machines.append( m ) 61 random_machines.append( m_iso ) 62 63 mode_machine = star_join( 64 exit_symbol=exit_symbol, 65 enter_symbols=enter_symbols, 66 machines=random_machines, 67 mode_residency_factor=residency_factor 68 ) 69 70 return mode_machine
def
star( exit_symbol: str, enter_symbols: list[str], normal_symbols: list[str], n_modes: int, n_isomorphic: int, randomness: float, connectedness: float, residency_factor: float, n_normal_symbols: int, t_states_per_machine: int, random_seed: int | None = None) -> amachine.am_hmm.HMM:
19def star( 20 exit_symbol : str, 21 enter_symbols : list[str], 22 normal_symbols : list[str], 23 n_modes : int, 24 n_isomorphic : int, 25 randomness : float, 26 connectedness : float, 27 residency_factor : float, 28 n_normal_symbols : int, 29 t_states_per_machine : int, 30 random_seed : int | None = None ) -> HMM : 31 32 if len( normal_symbols ) < n_normal_symbols*n_isomorphic : 33 raise ValueError( "Must have at least n_normal_symbols*n_isomorphic normal symbols" ) 34 35 if len( enter_symbols ) < n_modes*n_isomorphic : 36 raise ValueError( "Must have at least n_modes*n_isomorphic enter symbols" ) 37 38 alphabet = [ f"{normal_symbols[i]}" for i in range( 0, n_normal_symbols ) ] 39 iso_alphabet = [ f"{normal_symbols[i]}" for i in range( n_normal_symbols, n_normal_symbols*2 ) ] 40 41 random_machines = [] 42 43 for i in range( n_modes ) : 44 45 m = random_machine( 46 n_states=t_states_per_machine, 47 symbols=alphabet, 48 connectedness=connectedness, 49 randomness=randomness, 50 ensure_strongly_connected=True, 51 ensure_minimal=True, 52 random_seed=random_seed ) 53 54 m.isoclass = f"{i}" 55 m_iso.isoclass = f"{i}" 56 57 for j, state in enumerate( m.states ) : 58 m.states[ j ].add_isomorph( m_iso.states[ j ].name ) 59 m_iso.states[ j ].add_isomorph( m.states[ j ].name ) 60 61 random_machines.append( m ) 62 random_machines.append( m_iso ) 63 64 mode_machine = star_join( 65 exit_symbol=exit_symbol, 66 enter_symbols=enter_symbols, 67 machines=random_machines, 68 mode_residency_factor=residency_factor 69 ) 70 71 return mode_machine