t3m_form_then_round#
- t3toolbox.backend.t3_linalg.t3m_form_then_round(x, y, max_tucker_ranks=None, max_tt_ranks=None, rtol=None, atol=None)#
def t3m_form_then_round( x: typ.Tuple[typ.Sequence[NDArray], typ.Sequence[NDArray]], # (tucker_cores_x, tt_cores_x) y: typ.Tuple[typ.Sequence[NDArray], typ.Sequence[NDArray]], # (tucker_cores_y, tt_cores_y) max_tucker_ranks: typ.Union[int, typ.Sequence[int], None] = None, # scalar caps all, or len=d max_tt_ranks: typ.Union[int, typ.Sequence[int], None] = None, # scalar caps all, or len=d+1 rtol: typ.Optional[float] = None, # requires unstacked (enforced by the frontend) atol: typ.Optional[float] = None, ) -> typ.Tuple[ typ.Tuple[NDArray, ...], # x_times_y tucker_cores typ.Tuple[NDArray, ...], # x_times_y tt_cores ]:
Elementwise product
x ⊙ y– method (a): form the full product, then round.Forms the full Khatri-Rao/Kronecker product (
t3_mult(), multiplied ranks) and, if any truncation is requested, rounds it witht3svd(); with no truncation it returns the exact full product directly. The forming step is embarrassingly parallel (no sweep) but materializes the whole product – seedocs/ttm_t3m_ht_note.texfor the cost trade-off vs the fused / swap methods. Stack-aware with max-rank truncation;rtol/atolrequire unstacked.- Parameters:
x (t3toolbox.backend.common.typ.Tuple[t3toolbox.backend.common.typ.Sequence[NDArray], t3toolbox.backend.common.typ.Sequence[NDArray]])
y (t3toolbox.backend.common.typ.Tuple[t3toolbox.backend.common.typ.Sequence[NDArray], t3toolbox.backend.common.typ.Sequence[NDArray]])
max_tucker_ranks (t3toolbox.backend.common.typ.Union[int, t3toolbox.backend.common.typ.Sequence[int], None])
max_tt_ranks (t3toolbox.backend.common.typ.Union[int, t3toolbox.backend.common.typ.Sequence[int], None])
rtol (t3toolbox.backend.common.typ.Optional[float])
atol (t3toolbox.backend.common.typ.Optional[float])
- Return type:
t3toolbox.backend.common.typ.Tuple[t3toolbox.backend.common.typ.Tuple[NDArray, Ellipsis], t3toolbox.backend.common.typ.Tuple[NDArray, Ellipsis]]