The Veronese manifold
Manifolds.Veronese — Type
Veronese{T} <: AbstractManifold{ℝ}The Veronese manifold consists of the nonzero symmetric rank-one tensors of order $D$ over $ℝ^N$.
For positive integers $N$ and $D$, it is given by
\[\mathcal V_{N,D} = \left\{ λ x^{⊗ D} \;\middle|\; λ\in\mathbb R\setminus\{0\},\; x\in\mathbb S^{N-1} \right\}\]
Here
\[x^{⊗ D} := \underbrace{x⊗\cdots⊗x}_{D\text{ factors}}\]
is the $D$-fold tensor product of $x$ with itself. The parametrization
\[Φ:(\mathbb R\setminus\{0\})\times\mathbb S^{N-1}\to\mathcal V_{N,D}, \qquad Φ(λ,x)=λ x^{⊗ D},\]
is two-to-one. Every embedded tensor can be parametrized by either of the two pairs
\[(λ,x) \sim \bigl((-1)^Dλ,-x\bigr).\]
For even $D$ the sign of $λ$ is intrinsic and $\mathcal V_{N,D}$ has two connected components, while for odd $D$ the sign can be absorbed by replacing $x$ by $-x$ and the manifold is connected when $N≥2$. For $N=1$, the manifold is $ℝ\setminus\{0\}$ for every $D$ and has two connected components.
An instance M = Veronese(N, D) represents the manifold $\mathcal V_{N,D}$. In the implementation, a manifold point is stored by choosing one of the parameter pairs above. Thus
\[M=\mathcal V_{N,D}, \qquad p\leftrightarrow(λ,x), \qquad Φ(λ,x)=λ x^{⊗ D}.\]
The chosen pair is stored as p = ([λ], x). A tangent vector is stored analogously as X = ([ν], u), where
\[u\in T_x\mathbb S^{N-1}=x^⊥.\]
The metric is induced by the Euclidean metric on the full tensor space $(ℝ^N)^{⊗ D}$. The differential of $Φ$ is
\[DΦ_{(λ,x)}(ν,u) = ν x^{⊗ D} + λ\sum_{j=1}^{D} x^{⊗(j-1)}⊗ u⊗ x^{⊗(D-j)},\]
and therefore the induced Riemannian metric is
\[g_{(λ,x)}\bigl((ν,u),(ξ,v)\bigr) = νξ+Dλ^2⟨u,v⟩.\]
Thus the spherical directions are scaled by $\sqrt{D}|λ|$ relative to the radial direction.
The Veronese manifold is a special case of the Segre manifold: the Veronese case uses one spherical factor repeated $D$ times, whereas the Segre case uses independent spherical factors. Its geometry is described in [JSdVV26].
Constructor
Veronese(n::Int, d::Int; parameter::Symbol=:type)Generate the Veronese manifold of nonzero symmetric rank-one tensors of order d over $ℝ^n$. Both n and d must be positive. The keyword parameter specifies whether they are stored in the type (:type) or in a field (:field).
Base.exp — Method
exp(M::Veronese, p, X)
exp!(M::Veronese, q, p, X)Exponential map on Veronese.
Let $p ≐ (λ,x)$ and $X = ([ν],u) ∈ T_pM$. Writing
\[r = |λ|, \qquad \dot r = \operatorname{sign}(λ)ν, \qquad m = √D\,\lVert u\rVert,\]
the induced metric takes the warped-cone form
\[g = \mathrm dr^2 + D r^2 g_{𝕊^{N-1}}.\]
Thus $\dot r$ is the radial velocity and $m$ is the angular speed measured in the Veronese metric. For $m>0$, define
\[ρ = \sqrt{(r+\dot r)^2 + (rm)^2}, \qquad f = \operatorname{atan}(rm,r+\dot r).\]
Then the endpoint of the geodesic with initial data $(p,X)$ is represented by
\[\operatorname{exp}_p(X) ≐ \left( \operatorname{sign}(λ)ρ,\, \operatorname{Exp}^{𝕊^{N-1}}_x\!\left(\frac{f}{m}u\right) \right),\]
where $\operatorname{Exp}^{𝕊^{N-1}}$ is the exponential map on the unit sphere. Hence the radial component changes from $r$ to $ρ$, while the spherical component moves along the sphere in the direction $u$.
If $m=0$, there is no spherical motion. When $r+\dot r>0$,
\[\operatorname{exp}_p(X) ≐ (λ+ν,x).\]
If $r+\dot r≤0$, the radial geodesic reaches the excluded zero tensor, so the exponential map is not defined and a DomainError is thrown.
The formula follows from the warped-cone geodesics in Proposition 3.1 of [JSdVV26].
Base.log — Method
log(M::Veronese, p, q)
log!(M::Veronese, X, p, q)The logarithmic map returns the tangent vector X at p such that $exp_p(X)=q$ along a minimizing geodesic.
Let $p ≐ (λ,x)$ and write $q ≐ (μ,y)$ for the pair chosen by closest_representative!. Define
\[r = |λ|, \qquad s = |μ|, \qquad a = \operatorname{dist}_{𝕊^{N-1}}(x,y), \qquad m = √D\,a.\]
Here $r$ and $s$ are the radial magnitudes of the two points, $a$ is the spherical distance from $x$ to $y$, and $m$ is the corresponding angular distance in the Veronese metric.
A minimizing logarithm exists when p and q lie in the same connected component and $m < π$. It is given by
\[\operatorname{log}_p(q) ≐ ([ν],u),\]
with radial component
\[ν = \operatorname{sign}(λ)\bigl(s\cos(m)-r\bigr)\]
and, for $a>0$, spherical component
\[u = \frac{s}{r} \frac{\sin(m)}{√D\,\sin(a)} \bigl(y-\cos(a)x\bigr).\]
The vector $u ∈ T_x𝕊^{N-1}$ points from $x$ toward $y$ along the sphere. If $a=0$, there is no spherical motion and $u=0$.
If no minimizing geodesic exists, log and log! throw a DomainError.
The formula is derived in Theorem 4.4 of [JSdVV26].
Base.rand — Method
Random.rand(M::Veronese; vector_at=nothing, σ=1)Generate a random point on Veronese M, stored as p = ([λ], x). If vector_at is provided, generate a random tangent vector there, stored as X = ([ν], u). For a random point, draw $λ$ from a standard normal distribution (replacing an exactly zero draw by one) and independently draw $x$ uniformly on the unit sphere by normalizing a standard Gaussian vector. The keyword σ does not affect random points.
At vector_at = ([λ], x), independently draw a scalar $z$ and a vector $g∈ℝ^N$ with independent standard normal entries, and return
\[ν=σz,\qquad u=σ(I-xx^\top)g.\]
Thus σ scales both stored tangent components. Their sampling is isotropic in the unscaled product metric; the Veronese metric weights the spherical component by $Dλ^2$.
Manifolds.closest_representative! — Method
closest_representative!(M::Veronese, q, p)Let $p ≐ (λ,x)$ and $q ≐ (μ,y)$. The point q is described by either of the two parameter pairs
\[(μ,y) \quad\text{and}\quad \bigl((-1)^D μ,-y\bigr),\]
which correspond to the same tensor.
For even $D$, the pair whose spherical component is closest to $x$ is chosen. For odd $D$, the pair whose scale has the same sign as $λ$ is chosen.
Manifolds.connected_by_geodesic — Method
connected_by_geodesic(M::Veronese, p, q)Return true if p and q are connected by a minimizing geodesic, and false otherwise.
Let $p ≐ (λ,x)$ and let $q ≐ (μ,y)$ use the pair selected by closest_representative!. A minimizing geodesic exists if and only if the two points lie in the same connected component and
\[\sqrt D\,\operatorname{dist}_{𝕊^{N-1}}(x,y) < π.\]
ManifoldsBase.check_point — Method
check_point(M::Veronese, p; kwargs...)Check whether p represents a point on Veronese M. In the implementation, p = ([λ], x) is the selected parameter pair for the tensor $Φ(λ,x)=λ x^{⊗ D}$. The scale $λ$ must be finite and nonzero and $x$ must lie on $\mathbb S^{N-1}$.
ManifoldsBase.check_size — Method
check_size(M::Veronese, p)
check_size(M::Veronese, p, X)For M = Veronese(N, D), check that a stored point p = ([λ], x) and, optionally, a tangent vector X = ([ν], u) use two-component tuple representations with component sizes (1,) and (N,), corresponding respectively to their radial and spherical parts.
ManifoldsBase.check_vector — Method
check_vector(M::Veronese, p, X; kwargs...)Check whether X = ([ν], u) is tangent at p = ([λ], x) on Veronese M. The tangent space is
\[T_pM\simeq\mathbb R\times T_x\mathbb S^{N-1}.\]
Thus $ν∈ℝ$ is arbitrary and $u$ must satisfy $u∈T_x\mathbb S^{N-1}=x^⊥$, equivalently $⟨x,u⟩=0$.
ManifoldsBase.default_vector_transport_method — Method
default_vector_transport_method(M::Veronese)Return ProjectionTransport as the default vector transport method on Veronese.
ManifoldsBase.distance — Method
distance(M::Veronese, p, q)Riemannian distance between two points p and q on Veronese.
Let $p ≐ (λ,x)$ and let $q ≐ (μ,y)$ use the pair selected by closest_representative!. Define
\[r = |λ|, \qquad s = |μ|, \qquad m = \min\left(\sqrt D\,\operatorname{dist}_{𝕊^{N-1}}(x,y), π\right).\]
If p and q lie in the same connected component, then
\[\operatorname{dist}(p,q) = \sqrt{r^2+s^2-2rs\cos(m)} = \sqrt{(r-s)^2+4rs\sin^2(m/2)}.\]
Otherwise, their distance is infinite. See connected_by_geodesic for when this distance is attained by a minimizing geodesic.
ManifoldsBase.embed — Method
embed(M::Veronese, p, X)
embed!(M::Veronese, Y, p, X)Let p = ([λ], x) be the stored representative of the point, and let X = ([ν], u) represent a tangent vector at p. Embed X by applying the differential of the Veronese parametrization,
\[DΦ_{(λ,x)}(ν,u) = ν x^{⊗ D} + λ\sum_{j=1}^{D} x^{⊗(j-1)}⊗ u⊗ x^{⊗(D-j)}.\]
The first term is the radial variation and the sum contains the $D$ ways of inserting the spherical variation $u$ into one tensor mode. Since $u⊥ x$, this differential is tangent to the embedded Veronese manifold.
ManifoldsBase.embed — Method
embed(M::Veronese, p)
embed!(M::Veronese, q, p)Embed the point with stored representative p = ([λ], x) into the full tensor space using the Veronese parametrization
\[Φ(λ,x)=λ x^{⊗ D}, \qquad x^{⊗ D}=\underbrace{x⊗\cdots⊗ x}_{D\text{ factors}}.\]
The embedded tensor is stored as a vector of length $N^D$ corresponding to the full, rather than symmetry-compressed, tensor coordinates.
ManifoldsBase.exp_fused! — Method
exp_fused!(M::Veronese, q, p, X, t::Number)Compute $\exp_p(tX)$ and store the result in q.
The scalar $t$ is incorporated directly into the exponential-map formulas, avoiding the explicit construction of the scaled tangent vector $tX$.
ManifoldsBase.get_coordinates — Method
get_coordinates(M::Veronese, p, X, ::DefaultOrthonormalBasis; kwargs...)Get coordinates of $X ≐ (ν,u)$ in $T_p\mathcal V_{N,D}$ using a DefaultOrthonormalBasis.
For $p ≐ (λ,x)$, let $c_{\mathbb S}(u)$ denote the orthonormal coordinates of $u ∈ T_x\mathbb S^{N-1}$. Since the spherical part of the Veronese metric is scaled by $Dλ^2$, the coordinates are
\[c = \begin{bmatrix} ν \\ √D\,|λ|\,c_{\mathbb S}(u) \end{bmatrix}.\]
ManifoldsBase.get_embedding — Method
get_embedding(M::Veronese)For M = Veronese(N, D), return the Euclidean ambient space containing Veronese, represented as $\mathbb R^{N^D}$. Although points of the manifold are symmetric tensors, the current embedding uses all $N^D$ tensor coordinates rather than a symmetry-compressed basis.
ManifoldsBase.get_vector — Method
get_vector(M::Veronese, p, c, ::DefaultOrthonormalBasis; kwargs...)Get the tangent vector $X∈T_p\mathcal V_{N,D}$ from coordinates c using a DefaultOrthonormalBasis. For $p≐(λ,x)$, the first coordinate is the radial component and the remaining coordinates are divided by $\sqrt D\,|λ|$ before being converted to a tangent vector in $T_x\mathbb S^{N-1}$.
ManifoldsBase.inner — Method
inner(M::Veronese, p, X, Y)Inner product between tangent vectors $X≐(ν,u)$ and $Y≐(ξ,v)$ at $p≐(λ,x)$. The Frobenius metric of the symmetric tensor embedding induces
\[⟨X,Y⟩_p = νξ+Dλ^2⟨u,v⟩.\]
Here $ν,ξ∈ℝ$ and $u,v∈T_x\mathbb S^{N-1}=x^⊥$.
ManifoldsBase.manifold_dimension — Method
manifold_dimension(M::Veronese)For M = Veronese(N, D), return the manifold dimension $N$. There is one radial degree of freedom and $N-1$ spherical degrees of freedom, so
\[\dim\mathcal V_{N,D}=1+(N-1)=N.\]
ManifoldsBase.project — Method
project(M::Veronese, p, A)
project!(M::Veronese, Y, p, A)Let p = ([λ], x) be the stored representative of a point on Veronese. Orthogonally project an ambient tensor A onto the tangent space at p. The ambient tensor is stored as a vector of length $N^D$ and the result Y = ([ν], u) represents a tangent vector with $u⊥ x$.
For each mode $j=1,\ldots,D$, let $c_j\in\mathbb R^N$ be the contraction of A with $x$ in every mode except mode $j$. In coordinates,
\[(c_j)_a = \sum_{i_1,\ldots,i_{j-1},i_{j+1},\ldots,i_D} A_{i_1,\ldots,i_{j-1},a,i_{j+1},\ldots,i_D} \prod_{k\ne j}x_{i_k},\]
and set $c=\sum_{j=1}^{D}c_j$. The radial coefficient is
\[ν=⟨A,x^{⊗ D}⟩.\]
The spherical component is obtained from the tangent part of $c$:
\[u = \frac{(I-xx^\top)c}{Dλ} = \frac{c-Dν x}{Dλ}.\]
The second equality uses $⟨x,c⟩=Dν$. The implementation performs one final projection onto $x^⊥$ to remove numerical roundoff.
The projection formula follows by expressing the ambient vector in the orthonormal tangent basis from Lemma 4.7 of [KKM22].
ManifoldsBase.vector_transport_to — Method
vector_transport_to(M::Veronese, p, X, q, ::ProjectionTransport)Transport a tangent vector by orthogonally projecting its ambient embedding onto the tangent space at the destination point.
For $M=\mathcal V_{N,D}$, let p = ([λ], x) and q = ([μ], y) be stored point representatives, and let X = ([ν], u) represent a tangent vector at p. Its ambient embedding is
\[A = DΦ_{(λ,x)}(ν,u) = ν x^{⊗ D} + λ\sum_{j=1}^{D} x^{⊗(j-1)}⊗ u⊗ x^{⊗(D-j)}.\]
Projection transport returns Y = ([ξ], v) at q such that $DΦ_{(μ,y)}(ξ,v)$ is the orthogonal projection of A onto the embedded tangent space at $Φ(μ,y)$. Set
\[a=⟨x,y⟩, \qquad b=⟨u,y⟩.\]
Then
\[ξ = ν a^D+Dλ b a^{D-1},\]
and, with the final term omitted when $D=1$,
\[c = Dν a^{D-1}x +Dλ a^{D-1}u +D(D-1)λ b a^{D-2}x, \qquad v=\frac{c-Dξ y}{Dμ}.\]
The implementation evaluates these contractions directly and therefore does not form the ambient tangent vector of length $N^D$. It handles $D=1$ separately so that the vanishing final term does not evaluate $a^{-1}$. Projection transport for an embedded Riemannian submanifold is described in Section 8.1.3 of [AMS08]. The formulas above specialize this construction to the Veronese manifold by orthogonally projecting the ambient tangent vector given by the Veronese differential onto the tangent space at the target point, using the Euclidean-induced metric described in [JSdVV26].
ManifoldsBase.zero_vector! — Method
Literature
- [AMS08]
- P.-A. Absil, R. Mahony and R. Sepulchre. Optimization Algorithms on Matrix Manifolds (Princeton University Press, 2008), available online at press.princeton.edu/chapters/absil/.
- [JSdVV26]
- S. Jacobsson, L. Swijsen, J. V. der Veken and N. Vannieuwenhoven. Warped Geometries of Segre–Veronese Manifolds. SIAM Journal on Matrix Analysis and Applications 47, 1551–1577 (2026).
- [KKM22]
- R. Khouja, H. Khalil and B. Mourrain. Riemannian Newton Optimization Methods for the Symmetric Tensor Approximation Problem. Linear Algebra and its Applications 637, 175–211 (2022), arXiv:2003.01469.