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

Speed up the computation of the Hilbert basis of a cone #11312

Closed
vbraun opened this issue May 8, 2011 · 21 comments
Closed

Speed up the computation of the Hilbert basis of a cone #11312

vbraun opened this issue May 8, 2011 · 21 comments

Comments

@vbraun
Copy link
Member

vbraun commented May 8, 2011

My first implementation of the Hilbert basis eventually uses PALP to compute the points in the parallelotope spanned by the rays of a simplicial cone. This can be done much faster with just the Smith normal form of the ray matrix.

This makes it easy to compute the points in the semi-open parallelotope, so the actual number of semigroup generators is sometimes less than the PALP version (which computed the integral points in the closure). As a pleasant side effect, arbitrary dimension cones work now as we are no longer limited to PALP's compile-time bounds.

Apply:

  1. attachment: trac_11312_speed_up_Hilbert_cone.2.patch

CC: @novoselt @zafeirakopoulos

Component: geometry

Keywords: sd31

Author: Volker Braun

Reviewer: Andrey Novoseltsev

Merged: sage-4.7.2.alpha0

Issue created by migration from https://trac.sagemath.org/ticket/11312

@vbraun

This comment has been minimized.

@novoselt
Copy link
Member

Work Issues: non-full-dimensional errors

@novoselt
Copy link
Member

comment:2

The speed-up looks impressive! About 20x on trivial examples (no surprise here since we are avoiding system calls to both cdd and PALP), on a "complicated" 6-d example that I picked the new version worked for 15sec and the old one didn't finish before my patience ran out ;-) Am I right that this speed is partially due to taking into account the special structure of the polytopes in which you are computing integral points?

There are, however, issues with non-full-dimensional cones::

sage: Cone([(1,1), (-1,1)], check=False).Hilbert_basis()
(N(1, 1), N(-1, 1), N(0, 1))
sage: Cone([(1,1,0), (-1,1,0)], check=False).Hilbert_basis()
(N(1, 1, 0), N(-1, 1, 0))

@novoselt
Copy link
Member

Reviewer: Andrey Novoseltsev

@vbraun
Copy link
Member Author

vbraun commented May 21, 2011

comment:3

I think I'm just implementing the same algorithm as PALP would use to enumerate the points in the parallelotope spanned by the rays, though I'm not sure. Essentially you have to compute the Smith form to enumerate the points, the rest is a simple loop. I'll try to get some more info about Palp's inner workings out of Harald Skarke at the Kreuzer Memorial conference.

And thanks for catching the non-full dimensional cone bug, I should have thought about that but didn't.

@vbraun
Copy link
Member Author

vbraun commented Jun 3, 2011

comment:4

Fixed:

sage: Cone([(1,1), (-1,1)], check=False).Hilbert_basis()
(N(1, 1), N(-1, 1), N(0, 1))
sage: Cone([(1,1,0), (-1,1,0)], check=False).Hilbert_basis()
(N(1, 1, 0), N(-1, 1, 0), N(0, 1, 0))

@vbraun
Copy link
Member Author

vbraun commented Jun 4, 2011

comment:5

On further thought, I think its better to also remove non-primitive vectors from the semigroup generators. The new version of the patch saves a few generators, which should speed up the Hilbert basis a little bit.

@vbraun
Copy link
Member Author

vbraun commented Jun 5, 2011

comment:6

New version of the patch breaks out the parallelotope_points() function so it can be reused in #11429

@vbraun
Copy link
Member Author

vbraun commented Jun 5, 2011

Changed work issues from non-full-dimensional errors to none

@novoselt
Copy link
Member

Work Issues: One long test fails in cone module

@novoselt
Copy link
Member

Changed keywords from none to sd31

@novoselt
Copy link
Member

comment:9

As the patch has to be adjusted one more time anyway - what do you think about creating some kind of sage.geometry.misc module for "helper functions"? Names and rays normalization functions are also natural candidates to go there. This will reduce the potential for circular imports and clarify the structure. cone.parallelotope_points seems a bit strange ;-)

@novoselt
Copy link
Member

comment:10

Ah, this particular function is moved to another place in the next patch anyway!

@vbraun
Copy link
Member Author

vbraun commented Jun 17, 2011

Updated patch

@vbraun
Copy link
Member Author

vbraun commented Jun 17, 2011

comment:11

Attachment: trac_11312_speed_up_Hilbert_cone.patch.gz

Good catch! I fixed the offending doctest. Up to the ordering the Hilbert bases before and after the patch are the same, of course.

@novoselt
Copy link
Member

comment:12

All works now!

@novoselt
Copy link
Member

Two corrections to REST formatting

@novoselt
Copy link
Member

Changed work issues from One long test fails in cone module to none

@novoselt

This comment has been minimized.

@novoselt
Copy link
Member

comment:13

Attachment: trac_11312_speed_up_Hilbert_cone.2.patch.gz

I have made tiny adjustments to the patch to make the documentation compile without warnings, I'll leave it at positive review. (Added one column and replaced a quote with a backward one.)

Volker: subsequent patches may need to be rebased.

@jdemeyer jdemeyer modified the milestones: sage-4.7.1, sage-4.7.2 Jun 18, 2011
@jdemeyer
Copy link
Contributor

Merged: sage-4.7.2.alpha0

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

No branches or pull requests

3 participants