{"action":"created","issue":{"url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/issues/435","repository_url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl","labels_url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/issues/435/labels{/name}","comments_url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/issues/435/comments","events_url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/issues/435/events","html_url":"https://github.com/JuliaNLSolvers/Optim.jl/pull/435","id":237838559,"number":435,"title":"Manifold optimization","user":{"login":"antoine-levitt","id":88065,"avatar_url":"https://avatars2.githubusercontent.com/u/88065?v=4","gravatar_id":"","url":"https://api.github.com/users/antoine-levitt","html_url":"https://github.com/antoine-levitt","followers_url":"https://api.github.com/users/antoine-levitt/followers","following_url":"https://api.github.com/users/antoine-levitt/following{/other_user}","gists_url":"https://api.github.com/users/antoine-levitt/gists{/gist_id}","starred_url":"https://api.github.com/users/antoine-levitt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antoine-levitt/subscriptions","organizations_url":"https://api.github.com/users/antoine-levitt/orgs","repos_url":"https://api.github.com/users/antoine-levitt/repos","events_url":"https://api.github.com/users/antoine-levitt/events{/privacy}","received_events_url":"https://api.github.com/users/antoine-levitt/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":21,"created_at":"2017-06-22T13:03:25Z","updated_at":"2017-09-22T06:31:10Z","closed_at":"2017-09-22T06:23:06Z","author_association":"CONTRIBUTOR","pull_request":{"url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/pulls/435","html_url":"https://github.com/JuliaNLSolvers/Optim.jl/pull/435","diff_url":"https://github.com/JuliaNLSolvers/Optim.jl/pull/435.diff","patch_url":"https://github.com/JuliaNLSolvers/Optim.jl/pull/435.patch"},"body":"Follow-up from https://github.com/JuliaNLSolvers/Optim.jl/issues/433. This implements the last option https://github.com/JuliaNLSolvers/Optim.jl/issues/433#issuecomment-309685983. Having a manifold and tangent vector point is a nice idea (and it works pretty well), but I got stuck at the typing of points and vectors (they are not arrays, nor abstractarrays, so what should Optim type them as?). Anyway this is not too bad, allows more fine-grained on when projections and retractions are done, and seems to work well. I fake an objective function for compatibility with line searches. Ideally, LineSearches should be redesigned to take as input a 1D function, but I'm not confortable enough with the API to do that.\r\n\r\nThis is a pretty basic implementation, and not optimal by any means: I just project the gradient on the tangent space, and retract the iterate after each update. There is possibly either too much or too little projections. A proper Riemannian optimization person would possibly be horrified (no fancy vector transport or anything like that), but it works well enough in my tests, and this PR implements the infrastructure to make additional modifications possible. Only the spherical and Stiefel manifolds are implemented right now, but adding other manifolds/different retractions should be very easy. In the future, it would probably be better to split into a separate Manifolds package, with only the Manifold and Flat types living in Optim (or NLSolversBase?).\r\n\r\nI tried to make the modifications as unintrusive as possible compared to the unconstrained case. In the default case of a flat manifold, everything is a no-op, so there shouldn't be any change to the generated code.\r\n\r\nThere are some test failures on the counters, but they seem to be present on master already..."},"comment":{"url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/issues/comments/331362221","html_url":"https://github.com/JuliaNLSolvers/Optim.jl/pull/435#issuecomment-331362221","issue_url":"https://api.github.com/repos/JuliaNLSolvers/Optim.jl/issues/435","id":331362221,"user":{"login":"antoine-levitt","id":88065,"avatar_url":"https://avatars2.githubusercontent.com/u/88065?v=4","gravatar_id":"","url":"https://api.github.com/users/antoine-levitt","html_url":"https://github.com/antoine-levitt","followers_url":"https://api.github.com/users/antoine-levitt/followers","following_url":"https://api.github.com/users/antoine-levitt/following{/other_user}","gists_url":"https://api.github.com/users/antoine-levitt/gists{/gist_id}","starred_url":"https://api.github.com/users/antoine-levitt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antoine-levitt/subscriptions","organizations_url":"https://api.github.com/users/antoine-levitt/orgs","repos_url":"https://api.github.com/users/antoine-levitt/repos","events_url":"https://api.github.com/users/antoine-levitt/events{/privacy}","received_events_url":"https://api.github.com/users/antoine-levitt/received_events","type":"User","site_admin":false},"created_at":"2017-09-22T06:31:10Z","updated_at":"2017-09-22T06:31:10Z","author_association":"CONTRIBUTOR","body":"Awesome, thanks!\r\n\r\nThe example I put in the tests is quite nice and self contained, it computes the first eigenvalues of a matrix by optimizing the Rayleigh quotient over orthogonality constraints. I have other examples but way more involved. "}}
{"actor":{"display_login":"antoine-levitt"}}