GitLab Repo

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