T3Tangent ========= .. toctree:: :hidden: /autoapi/t3toolbox/manifold/T3Tangent.__post_init__ /autoapi/t3toolbox/manifold/T3Tangent.validate /autoapi/t3toolbox/manifold/T3Tangent.__repr__ /autoapi/t3toolbox/manifold/T3Tangent.d /autoapi/t3toolbox/manifold/T3Tangent.shape /autoapi/t3toolbox/manifold/T3Tangent.frame_stack_shape /autoapi/t3toolbox/manifold/T3Tangent.tangent_stack_shape /autoapi/t3toolbox/manifold/T3Tangent.stack_shape /autoapi/t3toolbox/manifold/T3Tangent.structure /autoapi/t3toolbox/manifold/T3Tangent.data /autoapi/t3toolbox/manifold/T3Tangent.to_jax /autoapi/t3toolbox/manifold/T3Tangent.to_numpy /autoapi/t3toolbox/manifold/T3Tangent.copy /autoapi/t3toolbox/manifold/T3Tangent.contains_jax /autoapi/t3toolbox/manifold/T3Tangent.size /autoapi/t3toolbox/manifold/T3Tangent.data_size /autoapi/t3toolbox/manifold/T3Tangent.to_dense /autoapi/t3toolbox/manifold/T3Tangent.to_t3 /autoapi/t3toolbox/manifold/T3Tangent.to_vector /autoapi/t3toolbox/manifold/T3Tangent.from_vector /autoapi/t3toolbox/manifold/T3Tangent.save /autoapi/t3toolbox/manifold/T3Tangent.load /autoapi/t3toolbox/manifold/T3Tangent.reverse /autoapi/t3toolbox/manifold/T3Tangent.sum_tangents /autoapi/t3toolbox/manifold/T3Tangent.zeros /autoapi/t3toolbox/manifold/T3Tangent.unit /autoapi/t3toolbox/manifold/T3Tangent.zeros_like /autoapi/t3toolbox/manifold/T3Tangent.__add__ /autoapi/t3toolbox/manifold/T3Tangent.__sub__ /autoapi/t3toolbox/manifold/T3Tangent.__mul__ /autoapi/t3toolbox/manifold/T3Tangent.__neg__ /autoapi/t3toolbox/manifold/T3Tangent.corewise_inner /autoapi/t3toolbox/manifold/T3Tangent.corewise_norm /autoapi/t3toolbox/manifold/T3Tangent.absorb_weights /autoapi/t3toolbox/manifold/T3Tangent.weighted_norm /autoapi/t3toolbox/manifold/T3Tangent.weighted_inner /autoapi/t3toolbox/manifold/T3Tangent.normalized /autoapi/t3toolbox/manifold/T3Tangent.allclose /autoapi/t3toolbox/manifold/T3Tangent.minimal_ranks /autoapi/t3toolbox/manifold/T3Tangent.tangent_space_dimension /autoapi/t3toolbox/manifold/T3Tangent.has_minimal_ranks /autoapi/t3toolbox/manifold/T3Tangent.has_numerically_minimal_ranks /autoapi/t3toolbox/manifold/T3Tangent.is_orthogonal /autoapi/t3toolbox/manifold/T3Tangent.gauge_residual /autoapi/t3toolbox/manifold/T3Tangent.is_gauged /autoapi/t3toolbox/manifold/T3Tangent.probe /autoapi/t3toolbox/manifold/T3Tangent.probe_transpose /autoapi/t3toolbox/manifold/T3Tangent.apply /autoapi/t3toolbox/manifold/T3Tangent.entries /autoapi/t3toolbox/manifold/T3Tangent.apply_transpose /autoapi/t3toolbox/manifold/T3Tangent.entries_transpose /autoapi/t3toolbox/manifold/T3Tangent.probe_derivatives /autoapi/t3toolbox/manifold/T3Tangent.apply_derivatives /autoapi/t3toolbox/manifold/T3Tangent.entries_derivatives /autoapi/t3toolbox/manifold/T3Tangent.probe_derivatives_transpose /autoapi/t3toolbox/manifold/T3Tangent.apply_derivatives_transpose /autoapi/t3toolbox/manifold/T3Tangent.entries_derivatives_transpose /autoapi/t3toolbox/manifold/T3Tangent.unstack_tangents /autoapi/t3toolbox/manifold/T3Tangent.unstack_frame /autoapi/t3toolbox/manifold/T3Tangent.stack_tangents /autoapi/t3toolbox/manifold/T3Tangent.stack_frame .. py:class:: t3toolbox.manifold.T3Tangent Tangent vector to the manifold of fixed-rank Tucker tensor trains. A ``T3Tangent`` bundles a :py:class:`~t3toolbox.frame_variations_format.T3Frame` (the frame at the base point where the tangent space is attached) with a :py:class:`~t3toolbox.frame_variations_format.T3Variations` (the tangent direction in that frame). Bundling them makes "which tangent space" a checkable property: linear algebra between two tangent vectors is only defined when they live in the same tangent space, which here means they hold the **same** ``T3Frame`` object (identity, not merely numerically-equal cores). The metric lives on the *geometry*, not here: :py:meth:`ManifoldGeometry.inner` / ``norm`` are the Hilbert-Schmidt inner product / norm (which check the orthogonal-frame + gauged preconditions in safe mode), and :py:meth:`CorewiseGeometry.inner` / ``norm`` are the Euclidean ones. This class exposes only the **raw coordinate** :py:meth:`corewise_inner` / :py:meth:`corewise_norm` (equal to HS only on an orthonormal, gauged, minimal-rank frame -- see :py:meth:`is_orthogonal` / :py:meth:`is_gauged` and the contract catalog), with no HS claim. A tangent vector is the sum of 2d single-core variation terms -- equation (47), Appendix A.3, of Alger, Christierson, Chen & Ghattas (2026), "Tucker Tensor Train Taylor Series" (arXiv:2603.21141). .. rubric:: Examples >>> import numpy as np >>> import t3toolbox.tucker_tensor_train as t3 >>> import t3toolbox.frame_variations_format as bvf >>> import t3toolbox.manifold as t3m >>> x = t3.TuckerTensorTrain.randn((10, 11, 12), (3, 4, 3), (1, 2, 2, 1)) >>> frame, variations = bvf.t3_orthogonal_representations(x) >>> v = t3m.T3Tangent(frame, variations) >>> print(v.shape, v.stack_shape) (10, 11, 12) () >>> print(v.is_orthogonal()) # frame from t3_orthogonal_representations is orthogonal True >>> print(v.is_gauged()) # ...but those variations are not gauged False >>> w = 2.0 * v - v # linear algebra stays in the same tangent space >>> print(np.linalg.norm(w.to_dense() - v.to_dense())) # (2v - v) == v 0.0 .. py:attribute:: frame :type: t3toolbox.frame_variations_format.T3Frame .. py:attribute:: variations :type: t3toolbox.frame_variations_format.T3Variations .. py:attribute:: __rmul__ Methods ------- .. autoapisummary:: t3toolbox.manifold.T3Tangent.__post_init__ t3toolbox.manifold.T3Tangent.validate t3toolbox.manifold.T3Tangent.__repr__ t3toolbox.manifold.T3Tangent.d t3toolbox.manifold.T3Tangent.shape t3toolbox.manifold.T3Tangent.frame_stack_shape t3toolbox.manifold.T3Tangent.tangent_stack_shape t3toolbox.manifold.T3Tangent.stack_shape t3toolbox.manifold.T3Tangent.structure t3toolbox.manifold.T3Tangent.data t3toolbox.manifold.T3Tangent.to_jax t3toolbox.manifold.T3Tangent.to_numpy t3toolbox.manifold.T3Tangent.copy t3toolbox.manifold.T3Tangent.contains_jax t3toolbox.manifold.T3Tangent.size t3toolbox.manifold.T3Tangent.data_size t3toolbox.manifold.T3Tangent.to_dense t3toolbox.manifold.T3Tangent.to_t3 t3toolbox.manifold.T3Tangent.to_vector t3toolbox.manifold.T3Tangent.from_vector t3toolbox.manifold.T3Tangent.save t3toolbox.manifold.T3Tangent.load t3toolbox.manifold.T3Tangent.reverse t3toolbox.manifold.T3Tangent.sum_tangents t3toolbox.manifold.T3Tangent.zeros t3toolbox.manifold.T3Tangent.unit t3toolbox.manifold.T3Tangent.zeros_like t3toolbox.manifold.T3Tangent.__add__ t3toolbox.manifold.T3Tangent.__sub__ t3toolbox.manifold.T3Tangent.__mul__ t3toolbox.manifold.T3Tangent.__neg__ t3toolbox.manifold.T3Tangent.corewise_inner t3toolbox.manifold.T3Tangent.corewise_norm t3toolbox.manifold.T3Tangent.absorb_weights t3toolbox.manifold.T3Tangent.weighted_norm t3toolbox.manifold.T3Tangent.weighted_inner t3toolbox.manifold.T3Tangent.normalized t3toolbox.manifold.T3Tangent.allclose t3toolbox.manifold.T3Tangent.minimal_ranks t3toolbox.manifold.T3Tangent.tangent_space_dimension t3toolbox.manifold.T3Tangent.has_minimal_ranks t3toolbox.manifold.T3Tangent.has_numerically_minimal_ranks t3toolbox.manifold.T3Tangent.is_orthogonal t3toolbox.manifold.T3Tangent.gauge_residual t3toolbox.manifold.T3Tangent.is_gauged t3toolbox.manifold.T3Tangent.probe t3toolbox.manifold.T3Tangent.probe_transpose t3toolbox.manifold.T3Tangent.apply t3toolbox.manifold.T3Tangent.entries t3toolbox.manifold.T3Tangent.apply_transpose t3toolbox.manifold.T3Tangent.entries_transpose t3toolbox.manifold.T3Tangent.probe_derivatives t3toolbox.manifold.T3Tangent.apply_derivatives t3toolbox.manifold.T3Tangent.entries_derivatives t3toolbox.manifold.T3Tangent.probe_derivatives_transpose t3toolbox.manifold.T3Tangent.apply_derivatives_transpose t3toolbox.manifold.T3Tangent.entries_derivatives_transpose t3toolbox.manifold.T3Tangent.unstack_tangents t3toolbox.manifold.T3Tangent.unstack_frame t3toolbox.manifold.T3Tangent.stack_tangents t3toolbox.manifold.T3Tangent.stack_frame