sagemath/sage

Replacement of sage/libs/ppl.pyx by pplpy

vinklein opened this issue · 255 comments

The Sage wrappers around ppl are now superseded by the standalone pplpy (Python/Cython compatible). This ticket proposes to replace src/sage/libs/ppl.pyx extension with pplpy. For this, we

  • create a new standard package pplpy
  • upgrade gmpy2 from optional to standard
  • replace the Sage code calling sage/libs/ppl.pyx to call pplpy
  • make appropriate deprecation for sage.libs.ppl

Tarball for pplpy: pplpy-0.8.4.tar.gz

Upstream: Reported upstream. Developers acknowledge bug.

CC: @videlec @kiwifb @embray @slel

Component: packages: standard

Keywords: thursdaysbdx, ppl, pplpy, upgrade

Author: Vincent Klein

Branch: 829317e

Reviewer: Dima Pasechnik, François Bissey, Vincent Delecroix, Jeroen Demeyer, Erik Bray

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

Changed dependencies from #229 to #22928

Description changed:

--- 
+++ 
@@ -1,4 +1,4 @@
-Remove ppl.pyx extension and replace with pplpy[https://github.com/videlec/pplpy/](https://github.com/videlec/pplpy/) package.
+The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) is now superseded by the stand alone [pplpy](https://github.com/videlec/pplpy/) (Python/Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy.
 
 Some steps :
 - list any ticket proposing to extend ppl functionalities in Sage (if yes, open issues on github with cross links)

Description changed:

--- 
+++ 
@@ -1,4 +1,4 @@
-The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) is now superseded by the stand alone [pplpy](https://github.com/videlec/pplpy/) (Python/Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy.
+The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) is now superseded by the stand alone [pplpy](https://github.com/videlec/pplpy/) (!Python/!Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy.
 
 Some steps :
 - list any ticket proposing to extend ppl functionalities in Sage (if yes, open issues on github with cross links)

Branch pushed to git repo; I updated commit sha1. New commits:

f8bf274Updating checksum for pplpy pkg
comment:7

For testing purpose you can use the following tarball of pplpy (outdated, use the one in the ticket's description)

comment:8

Salut Vincent,

Your branch appears in red which means that there are merge issues (possibly trivial). Would be better to rebase it on the latest beta.

comment:9
  1. Pickling should be fixed
-        sage: TestSuite(Asso).run()
+        sage: TestSuite(Asso).run(skip='_test_pickling')

It works with pplpy used from Python

>>> x = ppl.Variable(0)
>>> y = ppl.Variable(1)
>>> z = ppl.Variable(2)
>>> gs.insert(ppl.point(x+y+2*z))
>>> gs.insert(ppl.point(x-y))
>>> gs.insert(ppl.point(z))
>>> P = ppl.C_Polyhedron(gs)
>>> import pickle
>>> pickle.loads(pickle.dumps(P)) == P
True
  1. I don't see the point of the function mpz_to_sage_integer. You can just do [Integer(x) for x in my_mpz_list]. For example
v_coords = (1,) + tuple(mpz_to_sage_integer(v.coefficients()))

can be replaced by

v_coords = (1,) + tuple(Integer(c) for c in v.coefficients())

Moreover, the name is confusing since the fuction converts a list of mpz integers.

  1. Some possible simplifications
  • In ppl_backend.pyx:
    Integer(g.coefficient(Variable(variable))) / Integer(g.divisor()) ->
    Rational(g.coefficient(Variable(variable)) / g.divisor())

  • In ppl_lattice_polytope.py: assert Integer(v.divisor()).is_one() -> assert v.divisor() == 1

Branch pushed to git repo; I updated commit sha1. This was a forced push. Last 10 new commits:

f19f81eInteger and rational constructors support gmpy2 params
cd8ef5dremove OptionalExtension sage.libs.gmpy2
8ced5d3remove get_gmpy2_path()
674fe62Add few doctests
2ed4f95Use of MPZ_Check and MPQ_Check functions from gmpy2 C-API
b4f0c26Add pplpy as a standard package
257c330Replace sage.libs.ppl with pplpy package
636051fRemove sage.libs.ppl extension
f52b3d4Modify associahedron doctest
dffa134Updating checksum for pplpy pkg

Changed commit from f8bf274 to dffa134

comment:11

Replying to @videlec:

  1. Some possible simplifications
  • In ppl_backend.pyx:
    Integer(g.coefficient(Variable(variable))) / Integer(g.divisor()) ->
    Rational(g.coefficient(Variable(variable)) / g.divisor())

  • In ppl_lattice_polytope.py: assert Integer(v.divisor()).is_one() -> assert v.divisor() == 1

It will be nice, but coercion for gmpy2 types is required for doing this (#23052).

Changed commit from dffa134 to b3563eb

Branch pushed to git repo; I updated commit sha1. New commits:

b3563ebremove mpz_to_sage_integer function
comment:13

Replying to @vinklein:

Replying to @videlec:

  1. Some possible simplifications
  • In ppl_backend.pyx:
    Integer(g.coefficient(Variable(variable))) / Integer(g.divisor()) ->
    Rational(g.coefficient(Variable(variable)) / g.divisor())

  • In ppl_lattice_polytope.py: assert Integer(v.divisor()).is_one() -> assert v.divisor() == 1

It will be nice, but coercion for gmpy2 types is required for doing this (#23052).

Where? The first involves a direct call Rational(mpq_type) and the second comparison between mpz and Python integer. Which operation is mixing gmpy2 types with Sage types?

comment:14

Replying to @videlec:

Where? The first involves a direct call Rational(mpq_type) and the second comparison between mpz and Python integer. Which operation is mixing gmpy2 types with Sage types?

You're right, tests failures in ppl_backend.pyx with the suggested code are not coercion related. Forget my previous comment.

Branch pushed to git repo; I updated commit sha1. New commits:

3785bf4assert simplification ppl_lattice_polytope.py
d3875e7remove skip=('_test_pickling') option for pplpy polyhedron

Changed commit from b3563eb to d3875e7

comment:16

As pplpy has evolved to fix pickling with cPickle download pplpy again to update your local package.

Changed commit from d3875e7 to 7ae21f5

Branch pushed to git repo; I updated commit sha1. New commits:

700f72cremove sage/libs/ppl from doctree
7ae21f5trac 23024 Bullet list indentation correction

Branch pushed to git repo; I updated commit sha1. Last 10 new commits:

08c7a72Add path of gmpy2 in include_dirs
359a0ffupdate checksum and package version
0d4fd2eInteger and rational constructors support gmpy2 params
7c66a7cremove OptionalExtension sage.libs.gmpy2
d143dderemove get_gmpy2_path()
2c56a3fAdd few doctests
e5264fdUse of MPZ_Check and MPQ_Check functions from gmpy2 C-API
504ab68Change way of creating a Rational from a mpz
072a15cadd __mpz__() to Rational
858c2e5trac 23024 update pplpy checksum

Changed commit from 7ae21f5 to 858c2e5

comment:19

As pplpy has evolved to fix pickling with cPickle download ​pplpy again to update your local package.

Changed dependencies from #22928 to #22928, #23309

Branch pushed to git repo; I updated commit sha1. This was a forced push. Last 10 new commits:

1c1b971Replace sage.libs.ppl with pplpy package
2a1798eRemove sage.libs.ppl extension
d1b0b2fModify associahedron doctest
db21e1dUpdating checksum for pplpy pkg
eb215c3remove mpz_to_sage_integer function
53f30f3assert simplification ppl_lattice_polytope.py
f9a6415remove skip=('_test_pickling') option for pplpy polyhedron
924984cremove sage/libs/ppl from doctree
ce863ffupdate checksum, snapshot version update in setup.py
7a5812aAdd path of gmpy2 in include_dirs

Changed commit from 858c2e5 to 7a5812a

Description changed:

--- 
+++ 
@@ -1,6 +1,7 @@
 The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) is now superseded by the stand alone [pplpy](https://github.com/videlec/pplpy/) (!Python/!Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy.
 
 Some steps :
+- pplpy and gmpy2 must be standard packages.
 - list any ticket proposing to extend ppl functionalities in Sage (if yes, open issues on github with cross links)
 - see if anybody changed sage/libs/ppl.pyx since the fork (if yes, list the commit and port them into pplpy)
 - prepare a package for pplpy as documented in the developer guide

Changed dependencies from #22928, #23309 to #22928

comment:23

pplpy 0.7 is out

Branch pushed to git repo; I updated commit sha1. This was a forced push. Last 10 new commits:

760bbdfModify associahedron doctest
6d3345eUpdating checksum for pplpy pkg
85cb9fcremove mpz_to_sage_integer function
70177c8assert simplification ppl_lattice_polytope.py
b0858a2remove skip=('_test_pickling') option for pplpy polyhedron
94c7817remove sage/libs/ppl from doctree
67c8c2eupdate checksum, snapshot version update in setup.py
50d62ffAdd path of gmpy2 in include_dirs
375fda6Trac #23024 Fix checksum (pplpy), spkg-install and spkg-check
dc37f38Trac #23024 Add new mpz gmpy2 to sage Integer conversion

Changed commit from 7a5812a to dc37f38

comment:26

Rebase on 22928 (with 22928 based on 8.2.beta0)

comment:27

You need to provide a link to the pplpy tarball.

comment:28

And proper deprecation has to be done for sage.libs.ppl so that a user doing

sage: from sage.libs.ppl import whatever

should not get an ImportError but a warning. See http://doc.sagemath.org/html/en/reference/misc/sage/misc/superseded.htm

Description changed:

--- 
+++ 
@@ -1,8 +1,6 @@
-The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) is now superseded by the stand alone [pplpy](https://github.com/videlec/pplpy/) (!Python/!Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy.
+The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) are now superseded by the standalone [pplpy](https://github.com/videlec/pplpy/) (Python/Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy. It
 
-Some steps :
-- pplpy and gmpy2 must be standard packages.
-- list any ticket proposing to extend ppl functionalities in Sage (if yes, open issues on github with cross links)
-- see if anybody changed sage/libs/ppl.pyx since the fork (if yes, list the commit and port them into pplpy)
-- prepare a package for pplpy as documented in the developer guide
+- creates a new standard package pplpy
+- upgrade gmpy2 from optional to standard
 - replace the Sage code calling sage/libs/ppl.pyx to call pplpy
+- make appropriate deprecation for `sage.libs.ppl`

Description changed:

--- 
+++ 
@@ -4,3 +4,5 @@
 - upgrade gmpy2 from optional to standard
 - replace the Sage code calling sage/libs/ppl.pyx to call pplpy
 - make appropriate deprecation for `sage.libs.ppl`
+
+pplpy' Tarball : [pplpy-0.7.tar.gz](https://pypi.python.org/packages/ca/d3/1629e95997068c129e3a5235fd32a39e4fc39faca892cf9a2da11f842fb9/pplpy-0.7.tar.gz#md5=89dd6a1e75e06e287adae2ea4dbc143b)
comment:30

And by proper deprecation do you mean keeping sage.libs.ppl fully functioning with his doctests ? Or do we prefer to shutdown sage.libs.ppl functionalities (Functions don't do their old work and just return a warning) ?

comment:31

Replying to @vinklein:

And by proper deprecation do you mean keeping sage.libs.ppl fully functioning with his doctests ? Or do we prefer to shutdown sage.libs.ppl functionalities (Functions don't do their old work and just return a warning) ?

The aim is not to keep sage.libs.ppl but to just to have some indirection in the import so that you do not break user's code. As sage.libs.ppl will not here anymore I do not expect the full doctesuite to pass as it used to be. But the following kind of things should work (and be doctested)

sage: from sage.libs.ppl import Variable, Constraint_System, C_Polyhedron
UserWarning: proper deprecation message
sage: x = Variable(0)
sage: y = Variable(1)
sage: cs = Constraint_System()
sage: cs.insert(x >= 0)
sage: cs.insert(x <= 3)
sage: cs.insert(y >= 0)
sage: cs.insert(y <= 3)
sage: poly_from_constraints = C_Polyhedron(cs)

And the various objects constructed above are of course from pplpy.

You can have a look at other places in the sage code and look for "deprecation" and "lazy_import".

comment:32

Well, i spoke with Sebastien L. and if the goal is to let one year for developers to adapt their old code, doing an indirection is not enough. Mainly because pplpy use gmpy2 (some functions return and calls are differents).

Therefore it seems like we should keep sage.libs.ppl old code with added warnings.

comment:34

Just a small request can you put upstream's address in SPKG.txt? Of course you are available on pypi but it is not the same as being able to find where to fill bugs and what the current issues are straight away.

Branch pushed to git repo; I updated commit sha1. New commits:

7d19154Trac #23024 SPKG.txt add upstream contact and licence.

Changed commit from dc37f38 to 7d19154

comment:36

Done, thanks for noticing that.

Branch pushed to git repo; I updated commit sha1. New commits:

01403bdTrac #23024 Deprecate sage.libs.ppl

Changed commit from 7d19154 to 01403bd

comment:38

Deprecation of sage.libs.ppl added. As the whole module is deprecated i choose to send deprecation warning at import time.

comment:39

Replying to @vinklein:

Deprecation of sage.libs.ppl added. As the whole module is deprecated i choose to send deprecation warning at import time.

Good solution.

Now, we just need to wait for #22928...

comment:40

Did you run the testsuite!?

sage -t src/sage/geometry/lattice_polytope.py
**********************************************************************
File "src/sage/geometry/lattice_polytope.py", line 1608, in sage.geometry.lattice_polytope.LatticePolytopeClass.boundary_point_indices
Failed example:
    face.points()
Exception raised:
    Traceback (most recent call last):
      File "/home/vdelecro/sage_patchbot/local/lib/python2.7/site-packages/sage/doctest/forker.py", line 517, in _run
        self.compile_and_execute(example, compiler, test.globs)
      File "/home/vdelecro/sage_patchbot/local/lib/python2.7/site-packages/sage/doctest/forker.py", line 920, in compile_and_execute
        exec(compiled, globs)
      File "<doctest sage.geometry.lattice_polytope.LatticePolytopeClass.boundary_point_indices[4]>", line 1, in <module>
        face.points()
      File "/home/vdelecro/sage_patchbot/local/lib/python2.7/site-packages/sage/geometry/lattice_polytope.py", line 3680, in points
        l = gcd(v)
    NameError: global name 'gcd' is not defined

Branch pushed to git repo; I updated commit sha1. New commits:

e395e0eTrac #23024 Use gmpy2 as a standard package
d244109Trac #23024 Restore import gcd

Changed commit from 01403bd to d244109

comment:42

Yes i have see this one.
The last remaining problem is a SEGFAULT when running ppl_lattice_polytope.py doctests.

comment:43

Could you post the log here?

comment:44

Replying to @videlec:

Could you post the log here?

segfault_ppl_lattice_polytope.log

Short story is

sage: LatticePolytope_PPL((0,0),(1/2,1))

cause a Segfault.

comment:45

Isn't it aleaxit/gmpy#174?

comment:46

At least with the patch applied I got

sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL
sage: LatticePolytope_PPL((0,0),(1/2,1))
Traceback (most recent call last):
...
TypeError: rational is not an integer
comment:47

See #24417

comment:48

Replying to @videlec:

Isn't it aleaxit/gmpy#174?

Yes it is ! Nicely done.

Changed commit from d244109 to 3cec632

Branch pushed to git repo; I updated commit sha1. This was a forced push. Last 10 new commits:

7596cffremove sage/libs/ppl from doctree
0cd326cupdate checksum, snapshot version update in setup.py
91b5d52Add path of gmpy2 in include_dirs
0b965a7Trac #23024 Fix checksum (pplpy), spkg-install and spkg-check
dd886fbTrac #23024 Add new mpz gmpy2 to sage Integer conversion
b7a5a21Trac #23024 SPKG.txt add upstream contact and licence.
96146caTrac #23024 Deprecate sage.libs.ppl
e85ae5fTrac #23024 Use gmpy2 as a standard package
da9aa35Trac #23024 Restore import gcd
3cec632Trac #23024 : merge #22928 ppl.pyx add deprecation warning ...

Changed commit from 3cec632 to d206c14

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

d206c14Trac #23024: ppl.pyx add deprecation warning to long doctest
comment:51

You are adding sage.libs.gmpy2 in 7596cff and removing it in 91b5d52...

comment:52

Yes adding it was one of our old solutions. Before having a better include in pplpy's setup.py if i remember correctly. All of this historical things can be squashed later.

comment:53

It's the same for ppl.pyx we don't need to show that we deleted it and restore and deprecate later.

comment:54

There are a lot of trailing whitespaces that should be removed.

Changed commit from d206c14 to f3e4bcd

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

886424bTrac 23024: Add pplpy as a standard package
a6e1cc7Trac 23024: Replace sage.libs.ppl with pplpy package
f3e4bcdTrac #23024: Use gmpy2 as a standard package
comment:56

History rewrited. Trailing whitespaces removed in real_mpfr.pyx, complex_mpc.pyx and complex_number.pyx files.

comment:57

I don't understand why you are modifying pplpy/SPKG.txt, pplpy/checksums.ini, pplpy/spkg-check, etc in both 886424b and ​a6e1cc7.

comment:58

Build fine and all tests pass on my computer!

Description changed:

--- 
+++ 
@@ -1,4 +1,4 @@
-The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) are now superseded by the standalone [pplpy](https://github.com/videlec/pplpy/) (Python/Cython compatible). This ticket proposes to replace `sage/src/libs/ppl.pyx` extension with pplpy. It
+The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) are now superseded by the standalone [pplpy](https://github.com/videlec/pplpy/) (Python/Cython compatible). This ticket proposes to replace `src/sage/libs/ppl.pyx` extension with pplpy. It
 
 - creates a new standard package pplpy
 - upgrade gmpy2 from optional to standard
comment:60

Use sdh_pip_install instead of $PIP_INSTALL

comment:61

Is the license of pplpy really GPL version 3? Or do you mean GPL version 3 or later? The difference is important.

comment:62

This looks like a strange way to check if something is one:

Integer(p.divisor()).is_one()

What's wrong with

p.divisor() == 1
comment:63

Replying to @jdemeyer:

Is the license of pplpy really GPL version 3? Or do you mean GPL version 3 or later? The difference is important.

Yes the current one is GPL version 3 (see LICENSE.txt). Is it better to say GPL version 3 or later anyway ?

comment:64

In backend_ppl.py you do from gmpy2 import mpz but you're not using it.

comment:65

Replying to @vinklein:

Is it better to say GPL version 3 or later anyway ?

See https://github.com/videlec/pplpy/issues/28

comment:66

Replying to @jdemeyer:

What's wrong with

p.divisor() == 1

p.divisor() return a gmpy2.mpz.

Branch pushed to git repo; I updated commit sha1. New commits:

ef97c32Trac #23024: spkg-install `sdh_pip_install` instead ...

Changed commit from f3e4bcd to ef97c32

comment:68

Replying to @vinklein:

Replying to @jdemeyer:

What's wrong with

p.divisor() == 1

p.divisor() return a gmpy2.mpz.

What is wrong with

>>> gmpy2.mpz(1) == 1
True
comment:69

Replying to @videlec:

...
What is wrong with

>>> gmpy2.mpz(1) == 1
True

In this case you compare a python int with a gmpy2.mpz.

But with sage's Integer :

sage: gmpy2.mpz(1) == 1
False

Edit: Hum ok my bad.

Branch pushed to git repo; I updated commit sha1. New commits:

2f98d70Trac #23024: Code cleaning

Changed commit from ef97c32 to 2f98d70

comment:71

self-testing fails:

$ SAGE_CHECK=yes ./sage -f pplpy
...
[pplpy-0.7] Successfully installed pplpy-0.7
[pplpy-0.7] Cleaning up...
[pplpy-0.7] 
[pplpy-0.7] real	0m38.345s
[pplpy-0.7] user	0m36.490s
[pplpy-0.7] sys	0m1.835s
[pplpy-0.7] Copying package files from temporary location /home/dima/Sage/sage-dev/local/var/tmp/sage/build/pplpy-0.7/inst to /home/dima/Sage/sage-dev/local
[pplpy-0.7] Running the test suite for pplpy-0.7...
[pplpy-0.7] running test
[pplpy-0.7] error: cannot copy tree './tests': not a directory
[pplpy-0.7] 

Changed dependencies from #22928 to none

comment:75

This would still be a good thing to do IMO, in general.

Description changed:

--- 
+++ 
@@ -5,4 +5,4 @@
 - replace the Sage code calling sage/libs/ppl.pyx to call pplpy
 - make appropriate deprecation for `sage.libs.ppl`
 
-pplpy' Tarball : [pplpy-0.7.tar.gz](https://pypi.python.org/packages/ca/d3/1629e95997068c129e3a5235fd32a39e4fc39faca892cf9a2da11f842fb9/pplpy-0.7.tar.gz#md5=89dd6a1e75e06e287adae2ea4dbc143b)
+pplpy' Tarball : [pplpy-0.8.tar.gz](https://files.pythonhosted.org/packages/9b/bb/4973d00ec0b02bb5c4a744584a41d29b68bb9fec529407d81808e46adcca/pplpy-0.8.tar.gz)

Description changed:

--- 
+++ 
@@ -1,4 +1,4 @@
-The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) are now superseded by the standalone [pplpy](https://github.com/videlec/pplpy/) (Python/Cython compatible). This ticket proposes to replace `src/sage/libs/ppl.pyx` extension with pplpy. It
+The Sage wrappers around [ppl](http://bugseng.com/products/ppl/) are now superseded by the standalone [pplpy](https://gitlab.com/videlec/pplpy) (Python/Cython compatible). This ticket proposes to replace `src/sage/libs/ppl.pyx` extension with pplpy. It
 
 - creates a new standard package pplpy
 - upgrade gmpy2 from optional to standard

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

f5b7110Trac 23024: Add pplpy as a standard package
82a5d24Trac 23024: Replace sage.libs.ppl with pplpy package
59617e1Trac #23024: Use gmpy2 as a standard package
8f51887Trac #23024: spkg-install `sdh_pip_install` instead ...
d7a67d4Trac #23024: Code cleaning
9ea9382Trac #23024: Remove HAVE_GMPY2 from coerce.pyx
55ad161Trac #23024: fix ppl_lattice_polytope doctests

Changed commit from 2f98d70 to 55ad161

comment:79

Rebased on sage8.6

Description changed:

--- 
+++ 
@@ -5,4 +5,4 @@
 - replace the Sage code calling sage/libs/ppl.pyx to call pplpy
 - make appropriate deprecation for `sage.libs.ppl`
 
-pplpy' Tarball : [pplpy-0.8.tar.gz](https://files.pythonhosted.org/packages/9b/bb/4973d00ec0b02bb5c4a744584a41d29b68bb9fec529407d81808e46adcca/pplpy-0.8.tar.gz)
+pplpy' Tarball : [pplpy-0.8.1.tar.gz](https://files.pythonhosted.org/packages/b2/90/890f89536a0fdd66d78a07d963152502b4b1af7c94366d8bb16e7ff8e309/pplpy-0.8.1.tar.gz)

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

90d999bTrac #23024: fix ppl_lattice_polytope doctests
e90bc77Trac #23024: upgrade pplpy version to 0.8.1

Changed commit from 55ad161 to e90bc77

comment:82

upgrade pplpy to 0.8.1

comment:83

Apparently a merge failure with sage 8.7.beta0

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

c37dcb0Trac 23024: Add pplpy as a standard package
3f5eed8Trac 23024: Replace sage.libs.ppl with pplpy package
26d3d54Trac #23024: Use gmpy2 as a standard package
1a5d7e5Trac #23024: spkg-install `sdh_pip_install` instead ...
62452d5Trac #23024: Code cleaning
58a0e8aTrac #23024: Remove HAVE_GMPY2 from coerce.pyx
dabd865Trac #23024: fix ppl_lattice_polytope doctests
9a06541Trac #23024: upgrade pplpy version to 0.8.1