File size: 6,892 Bytes
5ccb4fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Copyright (c) 2026 Simulacra Research Inc.
# SPDX-License-Identifier: Apache-2.0

from __future__ import annotations

from typing import Any

from .model import (
    SpinAnsatz,
    _normalize_leaf_carriers,
)
from .tree import (
    _balanced_subtree_mask,
    _quadrilinear_merge,
    _tagged_dense,
    _tagged_dense_no_bias,
    _tagged_rms_eqx_style,
    _tree_active_clock_depth,
    _tree_depth_count_features,
    _tree_sphere,
    edge_merge_masked,
)


normalize_leaf_carriers = _normalize_leaf_carriers
quadrilinear_merge = _quadrilinear_merge
tagged_dense_no_bias = _tagged_dense_no_bias
tree_sphere = _tree_sphere
balanced_subtree_mask = _balanced_subtree_mask
tree_active_clock_depth = _tree_active_clock_depth
tree_depth_count_features = _tree_depth_count_features
tagged_dense = _tagged_dense
tagged_rms_eqx_style = _tagged_rms_eqx_style


def _attention_name(value: str) -> str:
    if value == "tuned":
        return "mhsea_tuned"
    if value == "einsum":
        return "einsum"
    raise ValueError("attention must be 'tuned' or 'einsum'")


def build_model(config: Any, key, *, n_max: int) -> SpinAnsatz:
    attention = _attention_name(str(config.attention))
    model = SpinAnsatz(
        d_e=int(config.d_e),
        d_o=int(config.d_o),
        d_c=int(config.d_c),
        d_r=int(config.d_r),
        n_heads=int(config.n_heads),
        n_layers=int(config.n_layers),
        rank=int(config.rank),
        n_edge=int(config.edge_channels),
        d_e_attn=int(config.attention_qk_dim),
        d_c_attn=int(config.attention_v_dim),
        trunk_edge_node_ctx_dim=int(config.trunk_edge_node_context_dim),
        trunk_edge_hidden_dim=int(config.trunk_edge_hidden_dim),
        trunk_attn_bias_hidden_dim=int(config.trunk_attention_bias_hidden_dim),
        trunk_ffn_hidden_dim=int(config.trunk_ffn_hidden_dim),
        trunk_two_hop_hidden_dim=int(config.trunk_two_hop_hidden_dim),
        tree_edge_node_ctx_dim=int(config.tree_edge_node_context_dim),
        attn_impl=attention,
        global_d_g=int(config.global_dim),
        d_m_merge=int(config.merge_dim),
        merge_chain_hypernet_rank=int(config.merge_hypernet_rank),
        feat_d_bond=int(config.featurizer_bond_dim),
        feat_n_heads=int(config.featurizer_heads),
        feat_head_dim=int(config.featurizer_head_dim),
        feat_n_global_q=int(config.featurizer_global_queries),
        feat_edge_hidden_dim=int(config.featurizer_edge_hidden_dim),
        feat_zeeman_hidden_dim=int(config.featurizer_zeeman_hidden_dim),
        feat_global_hidden_dim=int(config.featurizer_global_hidden_dim),
        feat_combine_hidden_dim=int(config.featurizer_combine_hidden_dim),
        feat_token_initial_scale=float(config.featurizer_token_initial_scale),
        feat_d_edge=int(config.edge_channels),
        polar_group_norm_tau=float(config.polar_group_norm_tau),
        polar_group_norm_bond_hidden=int(config.polar_bond_hidden_dim),
        polar_group_norm_n_bond_groups=int(config.polar_bond_groups),
        polar_group_norm_d_bond_group=int(config.polar_bond_group_dim),
        polar_group_norm_n_zeeman_groups=int(config.polar_zeeman_groups),
        polar_group_norm_d_zeeman_group=int(config.polar_zeeman_group_dim),
        route_pointer_max_n=max(int(config.router_max_n), int(n_max)),
        route_pointer_d_model=int(config.router_model_dim),
        route_pointer_n_heads=int(config.router_heads),
        route_pointer_attn_dim=int(config.router_attention_dim),
        route_pointer_score_dim=int(config.router_score_dim),
        route_pointer_candidate_hidden=int(config.router_candidate_dim),
        route_pointer_summary_hidden=int(config.router_summary_dim),
        route_pointer_ffn_hidden=int(config.router_ffn_dim),
        route_pointer_score_init_scale=float(config.router_score_initial_scale),
        route_pointer_rope_base=float(config.router_rope_base),
        route_pointer_rope_scaling=float(config.router_rope_scaling),
        route_tree_prefix_layers=int(config.router_tree_prefix_layers),
        route_tree_prefix_candidate_layers=int(config.router_tree_candidate_layers),
        route_tree_prefix_merge_hidden=int(config.router_tree_merge_dim),
        route_tree_prefix_post_prefix_suffix_layers=int(config.router_tree_post_layers),
        route_contextualizer_layers=int(config.router_context_layers),
        route_contextualizer_n_heads=int(config.router_context_heads),
        route_contextualizer_attn_dim=int(config.router_context_attention_dim),
        route_contextualizer_edge_node_ctx_dim=int(config.router_context_edge_node_dim),
        level_edge_attn_n_heads=int(config.level_edge_heads),
        level_edge_attn_edge_mlp_hidden=int(config.level_edge_mlp_dim),
        level_edge_attn_edge_mlp_n_blocks=int(config.level_edge_mlp_blocks),
        level_edge_attn_ffn_d_hidden=int(config.level_edge_ffn_dim),
        level_edge_attn_rope_base=float(config.level_edge_rope_base),
        level_edge_attn_rope_scaling=float(config.level_edge_rope_scaling),
        root_readout_edge_rank=int(config.root_readout_edge_rank),
        ngpt_alpha_initial=float(config.ngpt_alpha_initial),
        ngpt_alpha_initial_fraction=float(config.ngpt_alpha_initial_fraction),
        ngpt_alpha_maximum=float(config.ngpt_alpha_maximum),
        global_ladder_tap_dim=int(config.global_ladder_tap_dim),
        level_edge_attn_bias_mlp_hidden=int(config.level_edge_bias_mlp_dim),
        level_edge_attn_bias_mlp_n_blocks=int(config.level_edge_bias_mlp_blocks),
        merge_c_mlp_hidden=int(config.merge_context_mlp_dim),
        readout_leaf_context_layers=int(config.readout_context_layers),
        readout_leaf_context_n_heads=int(config.readout_context_heads),
        readout_leaf_context_attn_dim=int(config.readout_context_attention_dim),
        readout_leaf_context_edge_node_ctx_dim=int(
            config.readout_context_edge_node_dim
        ),
        readout_leaf_context_summary_hidden=int(config.readout_context_summary_dim),
        readout_leaf_context_mlp_hidden=int(config.readout_context_mlp_dim),
        readout_leaf_context_bias_hidden=int(config.readout_context_bias_dim),
        readout_leaf_context_edge_ffn_hidden=int(config.readout_context_edge_ffn_dim),
        readout_leaf_context_rope_base=float(config.readout_context_rope_base),
        readout_leaf_context_rope_scaling=float(config.readout_context_rope_scaling),
        two_hop_channels=int(config.two_hop_channels),
        tree_edge_fwl_channels=int(config.tree_fwl_channels),
        key=key,
    )
    return model


__all__ = [
    "SpinAnsatz",
    "balanced_subtree_mask",
    "build_model",
    "edge_merge_masked",
    "normalize_leaf_carriers",
    "quadrilinear_merge",
    "tagged_dense",
    "tagged_dense_no_bias",
    "tagged_rms_eqx_style",
    "tree_active_clock_depth",
    "tree_depth_count_features",
    "tree_sphere",
]