# failure to compile cython .pyx when cimporting some function from sage

Hello,

I am working on a Sage graph project, and for optimization, I have chosen to move it to Cython. The code compiles just fine as is, but for further optimization I will need to use a union find data structure in my cdef function. So far, I was using DisjointSet from sage.sets.disjoint_set in a separate function: my issue is I do not know how to cdef such an object.

My initial attempt to solve this was to cimport the disjoint set class from the sage/sets/disjoint_set.pyx file, and use it to cdef.

This would in summary be something like this :

...

from sage.sets.disjoint_set cimport DisjointSet_of_hashables

cdef DisjointSet_of_hashables D

D = DisjointSet(10)

...


Though this does not compile : I get an error related to a library (that I assumed was included in the install of Sage). Just in case it was not, I manually installed GAP (which did not solve the problem).

/usr/bin/ld : ne peut trouver -lgap
collect2: error: ld returned 1 exit status
error: command 'x86_64-linux-gnu-g++' failed with exit status 1


This message is partly in French but it translates exactly to

/usr/bin/ld: cannot find -lgap


I believe this is mostly likely due to me misunderstanding how to import a class from the Sage Cython files. I had a similar problem when trying to work with bitsets (although the error was on the library PARI instead of GAP).

In case it is relevant, I am working on Ubuntu 20.04, installed Sage with apt (Sage version is 9.0).

Thank you in advance for any help.

Pierre

edit retag close merge delete

1

( 2021-08-24 17:45:41 +0200 )edit

On ne peut pas cimporter quelque chose qui est une def. Ca marche seulement pour les cdef.

( 2021-08-24 18:18:58 +0200 )edit

Merci pour votre réponse Frédéric, effectivement j'ai mal renseigné mon exemple ; mais même si j'utilise ... cimport DisjointSet_Class (qui est bien cdef dans le fichier source) ou DisjointSet_of_hashables j'ai la même erreur.

Est-il possible de cdef un DisjointSet ?

( 2021-08-25 09:46:27 +0200 )edit

Sort by » oldest newest most voted

As an update, I have decided to make my own union find class in my code considering it is a fairly simple object - but I would still like an answer to this slighty more general question : was "from xyz cimport some_cdef_class" not the correct way to import a class from a sage cython file [included in the source code] ? Do I need to specify something more in my setup.py file perhaps ?

And most importantly, is this error due to my installation or to my code ?

more

Ca serait bien de ré-essayer avec une nouvelle installation propre de sage 9.4.

( 2021-08-25 17:04:38 +0200 )edit