Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question about complex sphere #241

Open
Fengcheng-Pei opened this issue May 21, 2023 · 4 comments
Open

Question about complex sphere #241

Fengcheng-Pei opened this issue May 21, 2023 · 4 comments

Comments

@Fengcheng-Pei
Copy link

Hello,

In my problem, the variable is a complex vector w and its norm ||w||=5, so I think it is a complex sphere manifold. But how could I define this complex sphere manifold? I only find the real sphere manifold.

Best regards,
Fengcheng Pei

@antoinecollas
Copy link
Contributor

antoinecollas commented Jun 1, 2023

Hello, indeed, the set of ${w \in \mathbb{C}^n: || w || = 1}$ is a manifold. Unfortunately, it is only available as a real-valued manifold in Pymanopt.

If you implement a complex-valued version, you can open a PR. It consists of copy-paste the class Sphereas well as its unit tests and adapting real-valued operators (such as the transpose) to the complex-valued counterparts (such as the conjugate transpose).

@kellertuer
Copy link

Hi,
I was not sure whether it was available, so thanks Antoine for checking that; you can “steal” quite a lot of ideas and information from the Julia implementation: Manifolds.jl does cover the complex case as well, see https://juliamanifolds.github.io/Manifolds.jl/stable/manifolds/sphere.html#Manifolds.Sphere

@antoinecollas
Copy link
Contributor

By the way, if the goal is only to do optimization on the complex sphere manifold, I think it is better to directly implement the complex Stiefel manifold (which reduces to the complex sphere for $p=1$).

@NicolasBoumal
Copy link
Contributor

Also, as a proxy for now, you can work with the sphere in R^2n instead of the sphere in C^n, and use the map g(x) = x(1:n) + i * x((n+1):2n) to transform a vector from R^2n to C^n. It's a Riemannian isometry (with the usual metrics), so there's no mathematical difference at all. Of course, eventually, it'd be nicer to just have the complex sphere, complex oblique and complex Stiefel implemented directly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants