#11400: Add PointCollection
---------------------------+------------------------------------------------
   Reporter:  novoselt     |          Owner:  novoselt          
       Type:  enhancement  |         Status:  new               
   Priority:  major        |      Milestone:  sage-4.7.1        
  Component:  geometry     |       Keywords:                    
Work_issues:               |       Upstream:  N/A               
   Reviewer:               |         Author:  Andrey Novoseltsev
     Merged:               |   Dependencies:                    
---------------------------+------------------------------------------------
 This patch adds support for a `PointCollection` class, which is not yet
 used for anything, but I propose switching cones and fans to it and plan
 to extensively use it in the rewrite of lattice polytopes.

 Module level documentation explains the benefits, basically, it is an
 "enhanced but still fast tuple" which will allow uniform treatment of
 things like ray generators, lattice points, and normals. Instead of
 writing
 {{{
 sage: cone.rays()
 sage: cone.ray_matrix()
 sage: cone.ray_set()
 sage: cone.lines()
 sage: cone.line_matrix()
 sage: cone.line_set()
 }}}
 which requires 6 different methods (and more for facet normals and
 vertices/points of polytopes), one will be able to use
 {{{
 sage: cone.rays()
 sage: cone.rays().matrix()
 sage: cone.rays().set()
 sage: cone.lines()
 sage: cone.lines().matrix()
 sage: cone.lines().set()
 }}}
 which uses only special methods for cones (plus 2 for point collections).

 Another good point will be elimination of `IntegralRayCollection` class
 which is currently the common base of cones and fans, which seemed to be
 convenient, but is definitely a bit weird.

 To make sure that the transition is painless, this ticket will only add
 the new class, while transition will be done in a consecutive one, with
 all the proper deprecations etc. The doctests show how `cone.rays()` will
 eventually behave.

 Regarding speed: there is `Sequence` class which does a similar thing,
 "Sagifying" lists and tuples. But it is very slow in construction (1000
 times with checks on, 20 times with checks off compared to tuples, my
 class is only 2 times slower) and two times slower than tuples in access
 (mine is as fast as tuples):
 {{{
 sage: from sage.geometry.point_collection import PointCollection
 sage: f = toric_varieties.dP6xdP6().fan()
 sage: timeit("PointCollection(f.rays())", number=1000, repeat=100)
 1000 loops, best of 100: 3.59 µs per loop
 sage: timeit("tuple(f.rays())", number=1000, repeat=100)
 1000 loops, best of 100: 1.62 µs per loop
 sage: timeit("seq(f.rays())", number=100, repeat=10)
 100 loops, best of 10: 1.49 ms per loop
 sage: timeit("seq(f.rays(), f.lattice(), check=False)", number=1000,
 repeat=100)
 1000 loops, best of 100: 39.3 µs per loop
 sage: pc = PointCollection(f.rays())
 sage: timeit("pc[5]", number=1000, repeat=100)
 1000 loops, best of 100: 561 ns per loop
 sage: pct = tuple(f.rays())
 sage: timeit("pct[5]", number=1000, repeat=100)
 1000 loops, best of 100: 547 ns per loop
 sage: pcs = seq(f.rays(), f.lattice(), check=False)
 sage: timeit("pcs[5]", number=1000, repeat=100)
 1000 loops, best of 100: 1.16 µs per loop
 }}}
 While plain tuples are still the fastest, I think that benefits of the
 proposed class worth the associated penalty (which is not the case for
 sequences). In fact, I think that overall speed will improve due to better
 cache sharing.

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/11400>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to