#21020 closed enhancement (fixed)
gap/libgap polynomial to Sage
Reported by:  vdelecroix  Owned by:  

Priority:  major  Milestone:  sage8.7 
Component:  interfaces  Keywords:  libgap 
Cc:  dimpase, tscrim  Merged in:  
Authors:  Frédéric Chapoton, Vincent Delecroix  Reviewers:  Vincent Delecroix, Frédéric Chapoton, Travis Scrimshaw 
Report Upstream:  N/A  Work issues:  
Branch:  9437416 (Commits, GitHub, GitLab)  Commit:  
Dependencies:  #27021  Stopgaps: 
Description
Given a polynomial in gap/libgap it is (most of the time) not possible to get it back into Sage.
Note: the other direction is dealt with in #18266
Change History (36)
comment:1 Changed 6 years ago by
 Cc dimpase added
comment:2 Changed 6 years ago by
 Cc tscrim added
comment:3 followup: ↓ 4 Changed 3 years ago by
 Branch set to u/chapoton/21020
 Commit set to 46e6f88e14b7d3816d7aad194e83d26d80910e94
comment:4 in reply to: ↑ 3 Changed 3 years ago by
Replying to chapoton:
I have no idea how to ask Gap for the Ring containing a polynomial..
if f
is your polynomial, then
gap> Ring(f);
does what you ask.
comment:5 Changed 3 years ago by
 Milestone changed from sage7.3 to sagewishlist
comment:6 Changed 3 years ago by
Hmm. Not very clear.. Does not look like a polynomial ring..
sage: x=polygen(QQ,'x') sage: f=x+6 sage: g=libgap(f) sage: g.Ring() <ring with 1 generators> sage: g.Ring().IsPolynomialRing() false
comment:7 Changed 3 years ago by
 Commit changed from 46e6f88e14b7d3816d7aad194e83d26d80910e94 to 347ffdfd4819942c7a2e7338f611c626c52bd61f
Branch pushed to git repo; I updated commit sha1. New commits:
347ffdf  working conversion back from libgap for univariate polynomials

comment:8 Changed 3 years ago by
 Status changed from new to needs_review
Here is something that seems to work, even if somewhat ugly.
comment:9 Changed 3 years ago by
 Milestone changed from sagewishlist to sage8.7
comment:10 Changed 3 years ago by
 Dependencies #18266 deleted
 Keywords libgap added
comment:11 Changed 3 years ago by
bot is morally green, please review
comment:12 Changed 3 years ago by
Dima, do you have any other comments? I am ready to set this to a positive review.
comment:13 Changed 3 years ago by
Can we get doctests for multivariate polynomials? And for different base rings?
comment:14 followup: ↓ 17 Changed 3 years ago by
This will not work for multivariate polynomials so far.
comment:15 Changed 3 years ago by
 Reviewers set to Vincent Delecroix
 Status changed from needs_review to needs_work
1) I think should also be treated at the same time
 (univariate) rational functions
 (univariate) laurent polynomials
2) Instead of going through the coercion system in Sage you should just query gap base ring (function CoefficientsRing).
comment:16 followup: ↓ 18 Changed 3 years ago by
By all ways, please do that! I have zero knowledge of gap, essentially.
comment:17 in reply to: ↑ 14 Changed 3 years ago by
Replying to chapoton:
This will not work for multivariate polynomials so far.
There is code in this branch added for multivariate polynomial rings, so it was quite unclear why no examples for treating multivariate polynomials...
comment:18 in reply to: ↑ 16 Changed 3 years ago by
Replying to chapoton:
By all ways, please do that! I have zero knowledge of gap, essentially.
I am working on a commit.
comment:19 followup: ↓ 20 Changed 3 years ago by
 Branch changed from u/chapoton/21020 to public/21020
 Commit changed from 347ffdfd4819942c7a2e7338f611c626c52bd61f to ceeca172a50672c9335ebea90cb38376a55975d4
 Status changed from needs_work to needs_review
Contrarily to what I thought, it seems not possible to extract the common ring of the coefficients from GAP. I kept the "common_parent".
Now works with (univriate) Laurent polynomials and rational functions.
Needs review again.
New commits:
ceeca17  21020: univariate laurent polynomial, rational fraction

comment:20 in reply to: ↑ 19 ; followup: ↓ 21 Changed 3 years ago by
Replying to vdelecroix:
Contrarily to what I thought, it seems not possible to extract the common ring of the coefficients from GAP. I kept the "common_parent".
Did you try CoefficientRing(Ring(f))
for
a GAP polynomial f
?
(I'll have a look later today...)
comment:21 in reply to: ↑ 20 Changed 3 years ago by
Replying to dimpase:
Replying to vdelecroix:
Contrarily to what I thought, it seems not possible to extract the common ring of the coefficients from GAP. I kept the "common_parent".
Did you try
CoefficientRing(Ring(f))
for a GAP polynomialf
?(I'll have a look later today...)
complete failure
sage: x = libgap.eval('Indeterminate(Integers, "x")') sage: libgap.Ring(x) <ring with 1 generators> sage: libgap.CoefficientsRing(libgap.Ring(x)) Traceback (most recent call last): ... AttributeError: No such attribute: CoefficientsRing.
comment:22 Changed 3 years ago by
If this works in GAP then it is matter of putting CoefficientRing
into an appropriate list of GAP functions, or just calling libgap.function_factory(CoefficientRing)
comment:23 Changed 3 years ago by
Dima, do you have a concrete proposal ? Otherwise, one could start with the current thing and enhance that later in other tickets ?
What is the correct argument for CoefficientsRing? ?
sage: x=polygen(QQ,'x') sage: X=libgap(x) sage: R=X.Ring() sage: R.CoefficientsRing()  ValueError Traceback (most recent call last) <ipythoninput9003be256b736> in <module>() > 1 R.CoefficientsRing() /home/chapoton/sage/local/lib/python2.7/sitepackages/sage/libs/gap/element.pyx in sage.libs.gap.element.GapElement_MethodProxy.__call__ (build/cythonized/sage/libs/gap/element.c:18831)() 2465 return GapElement_Function.__call__(self, * ([self.first_argument] + list(args))) 2466 else: > 2467 return GapElement_Function.__call__(self, self.first_argument) 2468 2469 /home/chapoton/sage/local/lib/python2.7/sitepackages/sage/libs/gap/element.pyx in sage.libs.gap.element.GapElement_Function.__call__ (build/cythonized/sage/libs/gap/element.c:18288)() 2353 return make_any_gap_element(self.parent(), result) 2354 except RuntimeError as msg: > 2355 raise ValueError('libGAP: ' + str(msg)) 2356 finally: 2357 GAP_Leave() ValueError: libGAP: Error, no method found! Error, no 1st choice method found for `CoefficientsRing' on 1 arguments
comment:24 Changed 3 years ago by
This looks like a GAP bug to me. I've opened #3159 for GAP.
Indeed, this should not stop us from going ahead with this ticket in some form.
comment:25 followup: ↓ 26 Changed 3 years ago by
 Reviewers changed from Vincent Delecroix to Vincent Delecroix, Frédéric Chapoton
Then I am satisfied with the current state, and ready to give a positive review.
Vincent, d'accord ?
comment:26 in reply to: ↑ 25 Changed 3 years ago by
 Status changed from needs_review to positive_review
Replying to chapoton:
Then I am satisfied with the current state, and ready to give a positive review.
Vincent, d'accord ?
C'est bon pour moi. Merci Frédéric.
comment:27 Changed 3 years ago by
I don't know if it is only me but this ticket breaks building in sageongentoo with cython0.29.2
> First build of interpreters running build_cython Enabling Cython debugging support Updating Cython code.... warning: sage/graphs/mcqd.pyx:52:19: local variable 'clique_number' referenced before assignment warning: sage/graphs/mcqd.pyx:55:57: local variable 'clique_number' referenced before assignment Error compiling Cython file:  ... from sage.structure.parent import Parent from sage.rings.all import ZZ, QQ, RDF from sage.groups.perm_gps.permgroup_element cimport PermutationGroupElement from sage.combinat.permutation import Permutation from sage.structure.element cimport coercion_model as cm ^  sage/libs/gap/element.pyx:34:0: 'sage/structure/element/coercion_model.pxd' not found warning: sage/libs/gap/element.pyx:238:21: local variable 'result' referenced before assignment warning: sage/libs/gap/element.pyx:239:15: local variable 'result' referenced before assignment Error compiling Cython file:  ... var = var.sage() num, den, val = self.CoefficientsOfUnivariateRationalFunction() num = num.sage() den = den.sage() val = val.sage() base_ring = cm.common_parent(*(num + den)) ^  sage/libs/gap/element.pyx:1277:26: cimported module has no attribute 'common_parent' Error compiling Cython file:  ... var = var.sage() num, den, val = self.CoefficientsOfUnivariateRationalFunction() num = num.sage() den = den.sage() val = val.sage() base_ring = cm.common_parent(*(num + den)) ^  sage/libs/gap/element.pyx:1277:26: Compiler crash in AnalyseExpressionsTransform ModuleNode.body = StatListNode(element.pyx:19:0) StatListNode.stats[13] = CClassDefNode(element.pyx:369:5, as_name = u'GapElement', class_name = u'GapElement', doc = u"\n Wrapper for all Gap objects.\n\n .. NOTE::\n\n In order to create ``GapElements`` you should use the\n ``libgap`` instance (the parent of all Gap elements) to\n convert things into ``GapElement``. You must not create\n ``GapElement`` instances manually.\n\n EXAMPLES::\n\n sage: libgap(0)\n 0\n\n If Gap finds an error while evaluating, a corresponding assertion is raised::\n\n sage: libgap.eval('1/0')\n Traceback (most recent call last):\n ...\n ValueError: libGAP: Error, Rational operations: <divisor> must not be zero\n\n Also, a ``ValueError`` is raised if the input is not a simple expression::\n\n sage: libgap.eval('1; 2; 3')\n Traceback (most recent call last):\n ...\n ValueError: can only evaluate a single statement\n ") CClassDefNode.body = StatListNode(element.pyx:370:4) StatListNode.stats[30] = DefNode(element.pyx:1202:4, doc = u'\n Return the Sage equivalent of the :class:`GapElement`\n\n EXAMPLES::\n\n sage: libgap(1).sage()\n 1\n sage: type(_)\n <type \'sage.rings.integer.Integer\'>\n\n sage: libgap(3/7).sage()\n 3/7\n sage: type(_)\n <type \'sage.rings.rational.Rational\'>\n\n sage: libgap.eval(\'5 + 7*E(3)\').sage()\n 7*zeta3 + 5\n\n sage: libgap(Infinity).sage()\n +Infinity\n sage: libgap(Infinity).sage()\n Infinity\n\n sage: libgap(True).sage()\n True\n sage: libgap(False).sage()\n False\n sage: type(_)\n <... \'bool\'>\n\n sage: libgap(\'this is a string\').sage()\n \'this is a string\'\n sage: type(_)\n <... \'str\'>\n\n sage: x = libgap.eval(\'Indeterminate(Integers, "x")\')\n\n sage: p = x^2  2*x + 3\n sage: p.sage()\n x^2  2*x + 3\n sage: p.sage().parent()\n Univariate Polynomial Ring in x over Integer Ring\n\n sage: p = x^2 + 3*x\n sage: p.sage()\n x^2 + 3*x\n sage: p.sage().parent()\n Univariate Laurent Polynomial Ring in x over Integer Ring\n\n sage: p = (3 * x^2 + x) / (x^2  2)\n sage: p.sage()\n (3*x^2 + x)/(x^2  2)\n sage: p.sage().parent()\n Fraction Field of Univariate Polynomial Ring in x over Integer Ring\n ', modifiers = [...]/0, name = u'sage', np_args_idx = [...]/0, num_required_args = 1, outer_attrs = [...]/2, py_wrapper_required = True, used = True) File 'ExprNodes.py', line 5338, in infer_type: GeneralCallNode(element.pyx:1277:40, result_is_used = True, use_managed_ref = True) File 'ExprNodes.py', line 6826, in infer_type: AttributeNode(element.pyx:1277:26, attribute = u'common_parent', is_attribute = 1, needs_none_check = True, result_is_used = True, use_managed_ref = True) Compiler crash traceback from this point on: File "/usr/lib64/python2.7/sitepackages/Cython/Compiler/ExprNodes.py", line 6826, in infer_type return node.entry.type AttributeError: 'NoneType' object has no attribute 'type' Traceback (most recent call last): File "/usr/lib64/python2.7/sitepackages/Cython/Build/Dependencies.py", line 1244, in cythonize_one_helper return cythonize_one(*m) File "/usr/lib64/python2.7/sitepackages/Cython/Build/Dependencies.py", line 1220, in cythonize_one raise CompileError(None, pyx_file) CompileError: sage/libs/gap/element.pyx ************************************************************************ Traceback (most recent call last): File "setup.py", line 954, in <module> ext_modules = ext_modules) File "/usr/lib64/python2.7/distutils/core.py", line 151, in setup dist.run_commands() File "/usr/lib64/python2.7/distutils/dist.py", line 953, in run_commands self.run_command(cmd) File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command cmd_obj.run() File "setup.py", line 857, in run build.run(self) File "/usr/lib64/python2.7/distutils/command/build.py", line 127, in run self.run_command(cmd_name) File "/usr/lib64/python2.7/distutils/cmd.py", line 326, in run_command self.distribution.run_command(command) File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command cmd_obj.run() File "setup.py", line 376, in run cache=False, File "/usr/lib64/python2.7/sitepackages/Cython/Build/Dependencies.py", line 1088, in cythonize result.get(99999) # seconds File "/usr/lib64/python2.7/multiprocessing/pool.py", line 572, in get raise self._value CompileError: sage/libs/gap/element.pyx ************************************************************************ Error building the Sage library ************************************************************************
Going from from sage.structure.element cimport coercion_model as cm
to from sage.structure.coerce cimport coercion_model as cm
seem to fix the breakage.
comment:28 followup: ↓ 29 Changed 3 years ago by
coercion_model has been moved by ticket #27021
so there is a conflict between here and there..
comment:29 in reply to: ↑ 28 Changed 3 years ago by
comment:30 Changed 3 years ago by
 Dependencies set to #27021
 Status changed from positive_review to needs_work
let us step back here then
comment:31 Changed 3 years ago by
 Commit changed from ceeca172a50672c9335ebea90cb38376a55975d4 to 0f2a7cca0bde11d1966341057d5ef815c15db844
Branch pushed to git repo; I updated commit sha1. New commits:
44b4e79  trac #27066 deprecate 5 things from the global namespace

184cef9  Merge branch 'u/chapoton/27066' in 8.6

431b46c  trac 27066 fixing the failing doctests

70a2c6e  adding some doctests, more to do

b1a19fb  Merge branch 'public/21020' in 8.6

0f2a7cc  trac 21020 fix import w.r.t. to 27021

comment:32 Changed 3 years ago by
 Branch changed from public/21020 to u/chapoton/21020
 Commit changed from 0f2a7cca0bde11d1966341057d5ef815c15db844 to 9437416a316059cf109207397aa35ebeb63f7f6c
 Status changed from needs_work to needs_review
comment:34 Changed 3 years ago by
 Reviewers changed from Vincent Delecroix, Frédéric Chapoton to Vincent Delecroix, Frédéric Chapoton, Travis Scrimshaw
comment:35 Changed 3 years ago by
 Branch changed from u/chapoton/21020 to 9437416a316059cf109207397aa35ebeb63f7f6c
 Resolution set to fixed
 Status changed from positive_review to closed
comment:36 Changed 21 months ago by
 Commit 9437416a316059cf109207397aa35ebeb63f7f6c deleted
follow up (a bug): #30496
first tentative:
I have no idea how to ask Gap for the Ring containing a polynomial..
New commits:
first tentative to convert back polynomials from gap