Creating semi-custom manifolds

46 views
Skip to first unread message

Ethan Qi

unread,
Jan 7, 2023, 3:59:45 PM1/7/23
to Manopt
Hi,
For a problem I want to use a manifold that is part like Euclideanfactory and part like Obliquefactory (and their complex counterparts). Specifically, my intention was to make a manifold with the (m by n) matrix where the first n1 column have unit norm (like obliquefactory) and the rest are random column vectors in R^m (like Euclideanfactory). The problem I am running into is modifying the M.dist, M.typicaldist, and the other functions as I’m not too sure how they’re defined. So overall I could have something like customfactory(m, n, n1).

Any help would be appreciated.

Thanks,
Ethan

Carlos Feres

unread,
Jan 8, 2023, 4:37:32 AM1/8/23
to Manopt
Hello Ethan,

If I understood correctly, you want "one" optimization variable that has n1 columns in the Oblique manifold, and n2=n-n1 columns in Euclidean space. Is there a reason to join these two parts in such a way?

You can define your optimization variable as belonging to a product manifold of the oblique and euclidean manifolds. In other words, your variable has a part in oblique and a part in Euclidean, and distances and other geometric definitions are already provided and Manopt knows how to handle them. In MATLAB, you would define the optimization variable X as a struct such that X.O is generated by obliquefactory and X.E is generated by euclideancomplexfactory. An example:

% example of product manifold
m=10;
n=6;
n1=4;
n2=n-n1;
M = productmanifold(struct('O', obliquecomplexfactory(m,n1) , 'E', euclideancomplexfactory(m,n2)));
disp(M.name());
X = M.rand();

Hope this helps,
Carlos

Nicolas Boumal

unread,
Jan 8, 2023, 6:44:01 AM1/8/23
to Manopt
Thanks Carlos, that's exactly it.

Ethan wrote: The problem I am running into is modifying the M.dist, M.typicaldist, and the other functions as I’m not too sure how they’re defined.

M.dist(x, y) is the Riemannian distance between points x and y on the manifold M.
The approach Carlos suggested (product manifold) makes it such that the squared distance between (x1, x2) and (y1, y2) is equal to dist(x1, y1)^2 + dist(x2, y2)^2, where x1, y1 represent bits on the oblique manifold, and x2, y2 represent bits on the Euclidean manifold.

M.typicaldist() returns a scalar that represents the "typical distance" between random points. It's very loosely defined. For compact manifolds, this would be some fraction of the diameter. For non-compact manifolds, it's less clear. The reason this is included is because some solvers (such as the Trust Region method) need a sense of the scale of the manifold (e.g., to initialize the trust region radius) to get things started. This isn't hugely important though. For non-compact manifolds, I usually just use the square root of the dimension, as this is the distance between two opposite vertices of a unit cube.

Best,
Nicolas
Reply all
Reply to author
Forward
Message has been deleted
0 new messages