passagemath-pari 10.6.32__cp314-cp314t-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-pari might be problematic. Click here for more details.
- PARIKernel/.dylibs/libcrypto.3.dylib +0 -0
- PARIKernel/.dylibs/libflint.21.0.dylib +0 -0
- PARIKernel/.dylibs/libgf2x.3.dylib +0 -0
- PARIKernel/.dylibs/libgfortran.5.dylib +0 -0
- PARIKernel/.dylibs/libgivaro.9.dylib +0 -0
- PARIKernel/.dylibs/libgmp.10.dylib +0 -0
- PARIKernel/.dylibs/libgmpxx.4.dylib +0 -0
- PARIKernel/.dylibs/libgsl.28.dylib +0 -0
- PARIKernel/.dylibs/libmpfr.6.dylib +0 -0
- PARIKernel/.dylibs/libntl.44.dylib +0 -0
- PARIKernel/.dylibs/libopenblasp-r0.3.29.dylib +0 -0
- PARIKernel/.dylibs/libpari-gmp-tls.dylib +0 -0
- PARIKernel/.dylibs/libquadmath.0.dylib +0 -0
- PARIKernel/.dylibs/libreadline.8.2.dylib +0 -0
- PARIKernel/.dylibs/libxeus-zmq.6.0.1.dylib +0 -0
- PARIKernel/.dylibs/libxeus.13.1.0.dylib +0 -0
- PARIKernel/.dylibs/libzmq.5.dylib +0 -0
- PARIKernel/__init__.py +2 -0
- PARIKernel/__main__.py +5 -0
- PARIKernel/io.cpython-314t-darwin.so +0 -0
- PARIKernel/io.pxd +7 -0
- PARIKernel/io.pyx +84 -0
- PARIKernel/kernel.cpython-314t-darwin.so +0 -0
- PARIKernel/kernel.pyx +260 -0
- PARIKernel/paridecl.pxd +95 -0
- PARIKernel/svg.cpython-314t-darwin.so +0 -0
- PARIKernel/svg.pyx +52 -0
- cypari2/__init__.py +8 -0
- cypari2/auto_paridecl.pxd +1070 -0
- cypari2/closure.cpython-314t-darwin.so +0 -0
- cypari2/closure.pxd +5 -0
- cypari2/closure.pyx +246 -0
- cypari2/convert.cpython-314t-darwin.so +0 -0
- cypari2/convert.pxd +80 -0
- cypari2/convert.pyx +613 -0
- cypari2/custom_block.cpython-314t-darwin.so +0 -0
- cypari2/custom_block.pyx +30 -0
- cypari2/cypari.h +13 -0
- cypari2/gen.cpython-314t-darwin.so +0 -0
- cypari2/gen.pxd +69 -0
- cypari2/gen.pyx +4819 -0
- cypari2/handle_error.cpython-314t-darwin.so +0 -0
- cypari2/handle_error.pxd +7 -0
- cypari2/handle_error.pyx +232 -0
- cypari2/pari_instance.cpython-314t-darwin.so +0 -0
- cypari2/pari_instance.pxd +27 -0
- cypari2/pari_instance.pyx +1438 -0
- cypari2/paridecl.pxd +5353 -0
- cypari2/paripriv.pxd +34 -0
- cypari2/pycore_long.h +98 -0
- cypari2/pycore_long.pxd +9 -0
- cypari2/stack.cpython-314t-darwin.so +0 -0
- cypari2/stack.pxd +27 -0
- cypari2/stack.pyx +278 -0
- cypari2/string_utils.cpython-314t-darwin.so +0 -0
- cypari2/string_utils.pxd +29 -0
- cypari2/string_utils.pyx +65 -0
- cypari2/types.pxd +147 -0
- passagemath_pari-10.6.32.data/data/etc/jupyter/nbconfig/notebook.d/gp-mode.json +5 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/pari_jupyter/kernel.js +28 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/pari_jupyter/kernel.json +6 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/pari_jupyter/logo-64x64.png +0 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/kernel.json +13 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/logo-32x32.png +0 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/logo-64x64.png +0 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/logo-svg.svg +75 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/nbextensions/gp-mode/gp.js +284 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/nbextensions/gp-mode/main.js +15 -0
- passagemath_pari-10.6.32.dist-info/METADATA +209 -0
- passagemath_pari-10.6.32.dist-info/RECORD +327 -0
- passagemath_pari-10.6.32.dist-info/WHEEL +6 -0
- passagemath_pari-10.6.32.dist-info/top_level.txt +4 -0
- sage/all__sagemath_pari.py +26 -0
- sage/databases/all__sagemath_pari.py +7 -0
- sage/databases/conway.py +274 -0
- sage/ext/all__sagemath_pari.py +1 -0
- sage/ext/memory.cpython-314t-darwin.so +0 -0
- sage/ext/memory.pyx +98 -0
- sage/ext_data/pari/buzzard/DimensionSk.g +286 -0
- sage/ext_data/pari/buzzard/Tpprog.g +179 -0
- sage/ext_data/pari/buzzard/genusn.g +129 -0
- sage/ext_data/pari/dokchitser/computel.gp +740 -0
- sage/ext_data/pari/dokchitser/computel.gp.template +740 -0
- sage/ext_data/pari/dokchitser/ex-bsw +43 -0
- sage/ext_data/pari/dokchitser/ex-chgen +48 -0
- sage/ext_data/pari/dokchitser/ex-chqua +37 -0
- sage/ext_data/pari/dokchitser/ex-delta +35 -0
- sage/ext_data/pari/dokchitser/ex-eisen +30 -0
- sage/ext_data/pari/dokchitser/ex-gen2 +38 -0
- sage/ext_data/pari/dokchitser/ex-gen3 +49 -0
- sage/ext_data/pari/dokchitser/ex-gen4 +54 -0
- sage/ext_data/pari/dokchitser/ex-nf +48 -0
- sage/ext_data/pari/dokchitser/ex-shin +50 -0
- sage/ext_data/pari/dokchitser/ex-tau2 +30 -0
- sage/ext_data/pari/dokchitser/ex-zeta +27 -0
- sage/ext_data/pari/dokchitser/ex-zeta2 +47 -0
- sage/ext_data/pari/dokchitser/testall +13 -0
- sage/ext_data/pari/simon/ell.gp +2129 -0
- sage/ext_data/pari/simon/ellQ.gp +2151 -0
- sage/ext_data/pari/simon/ellcommon.gp +126 -0
- sage/ext_data/pari/simon/qfsolve.gp +722 -0
- sage/ext_data/pari/simon/resultant3.gp +306 -0
- sage/groups/all__sagemath_pari.py +3 -0
- sage/groups/pari_group.py +175 -0
- sage/interfaces/all__sagemath_pari.py +1 -0
- sage/interfaces/genus2reduction.py +464 -0
- sage/interfaces/gp.py +1114 -0
- sage/libs/all__sagemath_pari.py +2 -0
- sage/libs/linkages/__init__.py +1 -0
- sage/libs/linkages/padics/API.pxi +617 -0
- sage/libs/linkages/padics/Polynomial_ram.pxi +388 -0
- sage/libs/linkages/padics/Polynomial_shared.pxi +554 -0
- sage/libs/linkages/padics/__init__.py +1 -0
- sage/libs/linkages/padics/fmpz_poly_unram.pxi +869 -0
- sage/libs/linkages/padics/mpz.pxi +691 -0
- sage/libs/linkages/padics/relaxed/API.pxi +518 -0
- sage/libs/linkages/padics/relaxed/__init__.py +1 -0
- sage/libs/linkages/padics/relaxed/flint.pxi +543 -0
- sage/libs/linkages/padics/unram_shared.pxi +247 -0
- sage/libs/pari/__init__.py +210 -0
- sage/libs/pari/all.py +5 -0
- sage/libs/pari/convert_flint.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_flint.pxd +14 -0
- sage/libs/pari/convert_flint.pyx +159 -0
- sage/libs/pari/convert_gmp.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_gmp.pxd +14 -0
- sage/libs/pari/convert_gmp.pyx +210 -0
- sage/libs/pari/convert_sage.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_sage.pxd +16 -0
- sage/libs/pari/convert_sage.pyx +588 -0
- sage/libs/pari/convert_sage_complex_double.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_sage_complex_double.pxd +14 -0
- sage/libs/pari/convert_sage_complex_double.pyx +132 -0
- sage/libs/pari/convert_sage_matrix.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_sage_matrix.pyx +106 -0
- sage/libs/pari/convert_sage_real_double.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_sage_real_double.pxd +5 -0
- sage/libs/pari/convert_sage_real_double.pyx +14 -0
- sage/libs/pari/convert_sage_real_mpfr.cpython-314t-darwin.so +0 -0
- sage/libs/pari/convert_sage_real_mpfr.pxd +7 -0
- sage/libs/pari/convert_sage_real_mpfr.pyx +108 -0
- sage/libs/pari/misc.cpython-314t-darwin.so +0 -0
- sage/libs/pari/misc.pxd +4 -0
- sage/libs/pari/misc.pyx +26 -0
- sage/libs/pari/tests.py +1848 -0
- sage/matrix/all__sagemath_pari.py +1 -0
- sage/matrix/matrix_integer_pari.cpython-314t-darwin.so +0 -0
- sage/matrix/matrix_integer_pari.pyx +187 -0
- sage/matrix/matrix_rational_pari.cpython-314t-darwin.so +0 -0
- sage/matrix/matrix_rational_pari.pyx +160 -0
- sage/quadratic_forms/all__sagemath_pari.py +10 -0
- sage/quadratic_forms/genera/all.py +9 -0
- sage/quadratic_forms/genera/genus.py +3506 -0
- sage/quadratic_forms/genera/normal_form.py +1519 -0
- sage/quadratic_forms/genera/spinor_genus.py +243 -0
- sage/quadratic_forms/qfsolve.py +255 -0
- sage/quadratic_forms/quadratic_form__automorphisms.py +427 -0
- sage/quadratic_forms/quadratic_form__genus.py +141 -0
- sage/quadratic_forms/quadratic_form__local_density_interfaces.py +140 -0
- sage/quadratic_forms/quadratic_form__local_normal_form.py +421 -0
- sage/quadratic_forms/quadratic_form__local_representation_conditions.py +889 -0
- sage/quadratic_forms/quadratic_form__mass.py +69 -0
- sage/quadratic_forms/quadratic_form__mass__Conway_Sloane_masses.py +663 -0
- sage/quadratic_forms/quadratic_form__mass__Siegel_densities.py +373 -0
- sage/quadratic_forms/quadratic_form__siegel_product.py +198 -0
- sage/quadratic_forms/special_values.py +323 -0
- sage/rings/all__sagemath_pari.py +15 -0
- sage/rings/factorint_pari.cpython-314t-darwin.so +0 -0
- sage/rings/factorint_pari.pyx +80 -0
- sage/rings/finite_rings/all__sagemath_pari.py +1 -0
- sage/rings/finite_rings/element_givaro.cpython-314t-darwin.so +0 -0
- sage/rings/finite_rings/element_givaro.pxd +91 -0
- sage/rings/finite_rings/element_givaro.pyx +1769 -0
- sage/rings/finite_rings/element_ntl_gf2e.cpython-314t-darwin.so +0 -0
- sage/rings/finite_rings/element_ntl_gf2e.pxd +22 -0
- sage/rings/finite_rings/element_ntl_gf2e.pyx +1333 -0
- sage/rings/finite_rings/element_pari_ffelt.cpython-314t-darwin.so +0 -0
- sage/rings/finite_rings/element_pari_ffelt.pxd +13 -0
- sage/rings/finite_rings/element_pari_ffelt.pyx +1441 -0
- sage/rings/finite_rings/finite_field_givaro.py +612 -0
- sage/rings/finite_rings/finite_field_pari_ffelt.py +238 -0
- sage/rings/finite_rings/hom_finite_field_givaro.cpython-314t-darwin.so +0 -0
- sage/rings/finite_rings/hom_finite_field_givaro.pxd +28 -0
- sage/rings/finite_rings/hom_finite_field_givaro.pyx +280 -0
- sage/rings/finite_rings/residue_field_givaro.cpython-314t-darwin.so +0 -0
- sage/rings/finite_rings/residue_field_givaro.pyx +133 -0
- sage/rings/finite_rings/residue_field_pari_ffelt.cpython-314t-darwin.so +0 -0
- sage/rings/finite_rings/residue_field_pari_ffelt.pyx +128 -0
- sage/rings/function_field/all__sagemath_pari.py +1 -0
- sage/rings/function_field/valuation.py +1450 -0
- sage/rings/function_field/valuation_ring.py +212 -0
- sage/rings/number_field/all__sagemath_pari.py +14 -0
- sage/rings/number_field/totallyreal.cpython-314t-darwin.so +0 -0
- sage/rings/number_field/totallyreal.pyx +509 -0
- sage/rings/number_field/totallyreal_data.cpython-314t-darwin.so +0 -0
- sage/rings/number_field/totallyreal_data.pxd +26 -0
- sage/rings/number_field/totallyreal_data.pyx +928 -0
- sage/rings/number_field/totallyreal_phc.py +144 -0
- sage/rings/number_field/totallyreal_rel.py +1018 -0
- sage/rings/padics/CA_template.pxi +1847 -0
- sage/rings/padics/CA_template_header.pxi +50 -0
- sage/rings/padics/CR_template.pxi +2563 -0
- sage/rings/padics/CR_template_header.pxi +57 -0
- sage/rings/padics/FM_template.pxi +1575 -0
- sage/rings/padics/FM_template_header.pxi +50 -0
- sage/rings/padics/FP_template.pxi +2176 -0
- sage/rings/padics/FP_template_header.pxi +57 -0
- sage/rings/padics/all.py +3 -0
- sage/rings/padics/all__sagemath_pari.py +11 -0
- sage/rings/padics/common_conversion.cpython-314t-darwin.so +0 -0
- sage/rings/padics/common_conversion.pxd +15 -0
- sage/rings/padics/common_conversion.pyx +508 -0
- sage/rings/padics/eisenstein_extension_generic.py +232 -0
- sage/rings/padics/factory.py +3623 -0
- sage/rings/padics/generic_nodes.py +1615 -0
- sage/rings/padics/lattice_precision.py +2889 -0
- sage/rings/padics/morphism.cpython-314t-darwin.so +0 -0
- sage/rings/padics/morphism.pxd +11 -0
- sage/rings/padics/morphism.pyx +366 -0
- sage/rings/padics/padic_base_generic.py +467 -0
- sage/rings/padics/padic_base_leaves.py +1235 -0
- sage/rings/padics/padic_capped_absolute_element.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_capped_absolute_element.pxd +15 -0
- sage/rings/padics/padic_capped_absolute_element.pyx +520 -0
- sage/rings/padics/padic_capped_relative_element.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_capped_relative_element.pxd +14 -0
- sage/rings/padics/padic_capped_relative_element.pyx +614 -0
- sage/rings/padics/padic_extension_generic.py +990 -0
- sage/rings/padics/padic_extension_leaves.py +738 -0
- sage/rings/padics/padic_fixed_mod_element.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_fixed_mod_element.pxd +15 -0
- sage/rings/padics/padic_fixed_mod_element.pyx +584 -0
- sage/rings/padics/padic_floating_point_element.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_floating_point_element.pxd +14 -0
- sage/rings/padics/padic_floating_point_element.pyx +447 -0
- sage/rings/padics/padic_generic_element.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_generic_element.pxd +48 -0
- sage/rings/padics/padic_generic_element.pyx +4642 -0
- sage/rings/padics/padic_lattice_element.py +1342 -0
- sage/rings/padics/padic_printing.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_printing.pxd +38 -0
- sage/rings/padics/padic_printing.pyx +1505 -0
- sage/rings/padics/padic_relaxed_element.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_relaxed_element.pxd +56 -0
- sage/rings/padics/padic_relaxed_element.pyx +18 -0
- sage/rings/padics/padic_relaxed_errors.cpython-314t-darwin.so +0 -0
- sage/rings/padics/padic_relaxed_errors.pxd +11 -0
- sage/rings/padics/padic_relaxed_errors.pyx +71 -0
- sage/rings/padics/padic_template_element.pxi +1212 -0
- sage/rings/padics/padic_template_element_header.pxi +50 -0
- sage/rings/padics/padic_valuation.py +1423 -0
- sage/rings/padics/pow_computer_flint.cpython-314t-darwin.so +0 -0
- sage/rings/padics/pow_computer_flint.pxd +38 -0
- sage/rings/padics/pow_computer_flint.pyx +641 -0
- sage/rings/padics/pow_computer_relative.cpython-314t-darwin.so +0 -0
- sage/rings/padics/pow_computer_relative.pxd +29 -0
- sage/rings/padics/pow_computer_relative.pyx +415 -0
- sage/rings/padics/qadic_flint_CA.cpython-314t-darwin.so +0 -0
- sage/rings/padics/qadic_flint_CA.pxd +21 -0
- sage/rings/padics/qadic_flint_CA.pyx +130 -0
- sage/rings/padics/qadic_flint_CR.cpython-314t-darwin.so +0 -0
- sage/rings/padics/qadic_flint_CR.pxd +13 -0
- sage/rings/padics/qadic_flint_CR.pyx +172 -0
- sage/rings/padics/qadic_flint_FM.cpython-314t-darwin.so +0 -0
- sage/rings/padics/qadic_flint_FM.pxd +14 -0
- sage/rings/padics/qadic_flint_FM.pyx +111 -0
- sage/rings/padics/qadic_flint_FP.cpython-314t-darwin.so +0 -0
- sage/rings/padics/qadic_flint_FP.pxd +12 -0
- sage/rings/padics/qadic_flint_FP.pyx +165 -0
- sage/rings/padics/relative_extension_leaves.py +429 -0
- sage/rings/padics/relative_ramified_CA.cpython-314t-darwin.so +0 -0
- sage/rings/padics/relative_ramified_CA.pxd +9 -0
- sage/rings/padics/relative_ramified_CA.pyx +33 -0
- sage/rings/padics/relative_ramified_CR.cpython-314t-darwin.so +0 -0
- sage/rings/padics/relative_ramified_CR.pxd +8 -0
- sage/rings/padics/relative_ramified_CR.pyx +33 -0
- sage/rings/padics/relative_ramified_FM.cpython-314t-darwin.so +0 -0
- sage/rings/padics/relative_ramified_FM.pxd +9 -0
- sage/rings/padics/relative_ramified_FM.pyx +33 -0
- sage/rings/padics/relative_ramified_FP.cpython-314t-darwin.so +0 -0
- sage/rings/padics/relative_ramified_FP.pxd +8 -0
- sage/rings/padics/relative_ramified_FP.pyx +33 -0
- sage/rings/padics/relaxed_template.pxi +4229 -0
- sage/rings/padics/relaxed_template_header.pxi +160 -0
- sage/rings/padics/tests.py +35 -0
- sage/rings/padics/tutorial.py +341 -0
- sage/rings/padics/unramified_extension_generic.py +335 -0
- sage/rings/padics/witt_vector.py +917 -0
- sage/rings/padics/witt_vector_ring.py +934 -0
- sage/rings/pari_ring.py +235 -0
- sage/rings/polynomial/all__sagemath_pari.py +1 -0
- sage/rings/polynomial/padics/all.py +1 -0
- sage/rings/polynomial/padics/polynomial_padic.py +360 -0
- sage/rings/polynomial/padics/polynomial_padic_capped_relative_dense.py +1324 -0
- sage/rings/polynomial/padics/polynomial_padic_flat.py +72 -0
- sage/rings/power_series_pari.cpython-314t-darwin.so +0 -0
- sage/rings/power_series_pari.pxd +6 -0
- sage/rings/power_series_pari.pyx +934 -0
- sage/rings/tate_algebra.py +1282 -0
- sage/rings/tate_algebra_element.cpython-314t-darwin.so +0 -0
- sage/rings/tate_algebra_element.pxd +49 -0
- sage/rings/tate_algebra_element.pyx +3464 -0
- sage/rings/tate_algebra_ideal.cpython-314t-darwin.so +0 -0
- sage/rings/tate_algebra_ideal.pxd +7 -0
- sage/rings/tate_algebra_ideal.pyx +1307 -0
- sage/rings/valuation/all.py +7 -0
- sage/rings/valuation/augmented_valuation.py +2118 -0
- sage/rings/valuation/developing_valuation.py +362 -0
- sage/rings/valuation/gauss_valuation.py +812 -0
- sage/rings/valuation/inductive_valuation.py +1686 -0
- sage/rings/valuation/limit_valuation.py +946 -0
- sage/rings/valuation/mapped_valuation.py +656 -0
- sage/rings/valuation/scaled_valuation.py +322 -0
- sage/rings/valuation/trivial_valuation.py +382 -0
- sage/rings/valuation/valuation.py +1119 -0
- sage/rings/valuation/valuation_space.py +1615 -0
- sage/rings/valuation/valuations_catalog.py +10 -0
- sage/rings/valuation/value_group.py +697 -0
- sage/schemes/all__sagemath_pari.py +1 -0
- sage/schemes/elliptic_curves/all__sagemath_pari.py +1 -0
- sage/schemes/elliptic_curves/descent_two_isogeny_pari.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/descent_two_isogeny_pari.pyx +46 -0
- sage_wheels/bin/gp +0 -0
- sage_wheels/bin/gp2c +0 -0
- sage_wheels/bin/gp2c-run +57 -0
- sage_wheels/bin/xeus-gp +0 -0
- sage_wheels/share/gp2c/func.dsc +18414 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
PARIKernel/__init__.py
ADDED
PARIKernel/__main__.py
ADDED
|
Binary file
|
PARIKernel/io.pxd
ADDED
PARIKernel/io.pyx
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
#cython: language_level=3
|
|
3
|
+
#
|
|
4
|
+
# Helper class to manage I/O between PARI and the Jupyter client
|
|
5
|
+
#
|
|
6
|
+
# Copyright (C) 2015 Jeroen Demeyer
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
from .paridecl cimport pariOut, pariErr
|
|
24
|
+
from ipykernel.iostream import OutStream
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
cdef extern from "Python.h":
|
|
28
|
+
unicode PyUnicode_FromString(const char *)
|
|
29
|
+
unicode PyUnicode_FromStringAndSize(const char *, Py_ssize_t)
|
|
30
|
+
|
|
31
|
+
# Unique PARIKernelIO object
|
|
32
|
+
cdef PARIKernelIO io
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
cdef void out_putch(char c) noexcept with gil:
|
|
36
|
+
io.stdout_stream.write(PyUnicode_FromStringAndSize(&c, 1))
|
|
37
|
+
|
|
38
|
+
cdef void out_puts(const char* s) noexcept with gil:
|
|
39
|
+
io.stdout_stream.write(PyUnicode_FromString(s))
|
|
40
|
+
|
|
41
|
+
cdef void out_flush() noexcept with gil:
|
|
42
|
+
io.stdout_stream.flush()
|
|
43
|
+
|
|
44
|
+
cdef void err_putch(char c) noexcept with gil:
|
|
45
|
+
io.stderr_stream.write(PyUnicode_FromStringAndSize(&c, 1))
|
|
46
|
+
|
|
47
|
+
cdef void err_puts(const char* s) noexcept with gil:
|
|
48
|
+
io.stderr_stream.write(PyUnicode_FromString(s))
|
|
49
|
+
|
|
50
|
+
cdef void err_flush() noexcept with gil:
|
|
51
|
+
io.stderr_stream.flush()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
cdef class PARIKernelIO(object):
|
|
55
|
+
def __cinit__(self):
|
|
56
|
+
self.pari_out.putch = out_putch
|
|
57
|
+
self.pari_out.puts = out_puts
|
|
58
|
+
self.pari_out.flush = out_flush
|
|
59
|
+
self.pari_err.putch = err_putch
|
|
60
|
+
self.pari_err.puts = err_puts
|
|
61
|
+
self.pari_err.flush = err_flush
|
|
62
|
+
|
|
63
|
+
def __init__(self, kernel):
|
|
64
|
+
global io
|
|
65
|
+
if io is not None:
|
|
66
|
+
raise RuntimeError("cannot create more than one PARIKernelIO object")
|
|
67
|
+
io = self
|
|
68
|
+
|
|
69
|
+
global pariOut, pariErr
|
|
70
|
+
pariOut = &self.pari_out
|
|
71
|
+
pariErr = &self.pari_err
|
|
72
|
+
|
|
73
|
+
self.stdout_stream = OutStream(kernel.session,
|
|
74
|
+
kernel.iopub_socket, "stdout")
|
|
75
|
+
self.stderr_stream = OutStream(kernel.session,
|
|
76
|
+
kernel.iopub_socket, "stderr")
|
|
77
|
+
|
|
78
|
+
def set_parent(self, parent):
|
|
79
|
+
self.stdout_stream.set_parent(parent)
|
|
80
|
+
self.stderr_stream.set_parent(parent)
|
|
81
|
+
|
|
82
|
+
def flush(self):
|
|
83
|
+
self.stdout_stream.flush()
|
|
84
|
+
self.stderr_stream.flush()
|
|
Binary file
|
PARIKernel/kernel.pyx
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
# distutils: include_dirs = READLINE_INCDIR
|
|
3
|
+
# distutils: library_dirs = READLINE_LIBDIR
|
|
4
|
+
# distutils: extra_link_args = READLINE_LIBEXTRA
|
|
5
|
+
# distutils: libraries = readline
|
|
6
|
+
#cython: language_level=3
|
|
7
|
+
#
|
|
8
|
+
# Jupyter kernel for PARI/GP
|
|
9
|
+
#
|
|
10
|
+
# Copyright (C) 2015-2016 Jeroen Demeyer
|
|
11
|
+
#
|
|
12
|
+
# This program is free software: you can redistribute it and/or modify
|
|
13
|
+
# it under the terms of the GNU General Public License as published by
|
|
14
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
15
|
+
# (at your option) any later version.
|
|
16
|
+
#
|
|
17
|
+
# This program is distributed in the hope that it will be useful,
|
|
18
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
20
|
+
# GNU General Public License for more details.
|
|
21
|
+
#
|
|
22
|
+
# You should have received a copy of the GNU General Public License
|
|
23
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
24
|
+
#
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
from .paridecl cimport *
|
|
28
|
+
from .io cimport PARIKernelIO
|
|
29
|
+
from libc.setjmp cimport *
|
|
30
|
+
from libc.string cimport memset, strncmp
|
|
31
|
+
from ipykernel.kernelbase import Kernel
|
|
32
|
+
from libc.signal cimport SIGALRM, SIGINT
|
|
33
|
+
from posix.signal cimport sigaction, sigaction_t
|
|
34
|
+
import PARIKernel
|
|
35
|
+
|
|
36
|
+
cdef extern from "readline/readline.h":
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
DEF PARISIZE = 2**27
|
|
40
|
+
DEF PRIMELIMIT = 500000
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# Global setjmp() context for error handling
|
|
44
|
+
cdef sigjmp_buf context
|
|
45
|
+
|
|
46
|
+
cdef void pari_recover(long numerr) noexcept nogil:
|
|
47
|
+
siglongjmp(context, numerr)
|
|
48
|
+
|
|
49
|
+
# Global PARI readline interface
|
|
50
|
+
cdef pari_rl_interface pari_rl
|
|
51
|
+
|
|
52
|
+
# Support for SVG plotting (if compiled in)
|
|
53
|
+
try:
|
|
54
|
+
from .svg import init_svg
|
|
55
|
+
except ImportError:
|
|
56
|
+
def init_svg(self):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# Helper functions
|
|
61
|
+
cdef extern from "Python.h":
|
|
62
|
+
unicode PyUnicode_FromString(const char*)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
cdef inline PyUnicode_FromGEN(GEN g):
|
|
66
|
+
cdef char* s = GENtostr(g)
|
|
67
|
+
cdef object pystr = PyUnicode_FromString(s)
|
|
68
|
+
pari_free(s)
|
|
69
|
+
return pystr
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def pari_short_version():
|
|
73
|
+
cdef unsigned long mask = (1<<PARI_VERSION_SHIFT) - 1
|
|
74
|
+
cdef unsigned long n = paricfg_version_code
|
|
75
|
+
|
|
76
|
+
cdef unsigned long patch = n & mask
|
|
77
|
+
n >>= PARI_VERSION_SHIFT
|
|
78
|
+
cdef unsigned long minor = n & mask
|
|
79
|
+
n >>= PARI_VERSION_SHIFT
|
|
80
|
+
cdef unsigned long major = n
|
|
81
|
+
return "{}.{}.{}".format(major, minor, patch)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
cdef inline bint is_keyword_char_python(s) except -1:
|
|
85
|
+
"""
|
|
86
|
+
Given a Python single-character string ``s``, is it a PARI
|
|
87
|
+
keyword character?
|
|
88
|
+
"""
|
|
89
|
+
cdef long c
|
|
90
|
+
try:
|
|
91
|
+
c = ord(s)
|
|
92
|
+
except TypeError:
|
|
93
|
+
return 0
|
|
94
|
+
return 32 <= c < 128 and is_keyword_char(c)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class PARIKernel(Kernel):
|
|
98
|
+
implementation = 'PARI'
|
|
99
|
+
implementation_version = PARIKernel.__version__
|
|
100
|
+
language = 'GP'
|
|
101
|
+
language_version = pari_short_version()
|
|
102
|
+
language_info = dict(mimetype='text/x-pari-gp', name='gp', file_extension='.gp')
|
|
103
|
+
banner = "PARI/GP kernel"
|
|
104
|
+
|
|
105
|
+
def __init__(self, *args, **kwds):
|
|
106
|
+
super().__init__(*args, **kwds)
|
|
107
|
+
|
|
108
|
+
pari_init_opts(PARISIZE, PRIMELIMIT, INIT_SIGm | INIT_DFTm)
|
|
109
|
+
global cb_pari_err_recover
|
|
110
|
+
cb_pari_err_recover = pari_recover
|
|
111
|
+
self.io = PARIKernelIO(self)
|
|
112
|
+
pari_use_readline(pari_rl)
|
|
113
|
+
init_svg(self)
|
|
114
|
+
|
|
115
|
+
def do_execute(self, code, silent, store_history=True, user_expressions=None,
|
|
116
|
+
allow_stdin=False):
|
|
117
|
+
global avma
|
|
118
|
+
cdef pari_sp av = avma
|
|
119
|
+
cdef GEN result
|
|
120
|
+
|
|
121
|
+
code = (<unicode?>code).encode("utf-8")
|
|
122
|
+
cdef const char* gp_code = <bytes>code
|
|
123
|
+
|
|
124
|
+
self.io.set_parent(self._parent_header)
|
|
125
|
+
|
|
126
|
+
cdef sigaction_t sa
|
|
127
|
+
cdef sigaction_t old_sa
|
|
128
|
+
memset(&sa, 0, sizeof(sa))
|
|
129
|
+
sa.sa_handler = pari_sighandler
|
|
130
|
+
|
|
131
|
+
cdef int err
|
|
132
|
+
cdef long t_ms, wt_ms
|
|
133
|
+
cdef char last
|
|
134
|
+
|
|
135
|
+
with nogil:
|
|
136
|
+
err = sigsetjmp(context, 1)
|
|
137
|
+
if err == 0: # Initial sigsetjmp() call
|
|
138
|
+
sigaction(SIGINT, &sa, &old_sa) # Handle SIGINT by PARI
|
|
139
|
+
timer_start(GP_DATA.T)
|
|
140
|
+
walltimer_start(GP_DATA.Tw)
|
|
141
|
+
result = gp_read_str_multiline(gp_code, &last)
|
|
142
|
+
t_ms = timer_delay(GP_DATA.T)
|
|
143
|
+
wt_ms = walltimer_delay(GP_DATA.Tw)
|
|
144
|
+
sigaction(SIGINT, &old_sa, &sa) # Restore Python SIGINT handler
|
|
145
|
+
|
|
146
|
+
if err == 0: # success
|
|
147
|
+
if not silent:
|
|
148
|
+
if t_ms and GP_DATA.chrono:
|
|
149
|
+
pari_puts(b"time = ")
|
|
150
|
+
pari_puts(gp_format_time(t_ms))
|
|
151
|
+
pari_flush()
|
|
152
|
+
|
|
153
|
+
# gnil as a result is like Python's None, it should be
|
|
154
|
+
# considered as "no result"
|
|
155
|
+
if result is not gnil:
|
|
156
|
+
if store_history:
|
|
157
|
+
pari_add_hist(result, t_ms, wt_ms)
|
|
158
|
+
|
|
159
|
+
if last != c';' and not silent:
|
|
160
|
+
content = {
|
|
161
|
+
'execution_count': pari_nb_hist(),
|
|
162
|
+
'data': {
|
|
163
|
+
'text/plain': PyUnicode_FromGEN(result),
|
|
164
|
+
},
|
|
165
|
+
'metadata': {}
|
|
166
|
+
}
|
|
167
|
+
self.send_response(self.iopub_socket, 'execute_result', content)
|
|
168
|
+
|
|
169
|
+
reply = {'status': 'ok',
|
|
170
|
+
'execution_count': pari_nb_hist(),
|
|
171
|
+
'payload': [],
|
|
172
|
+
'user_expressions': {},
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
avma = av
|
|
176
|
+
|
|
177
|
+
else: # error (therefore no result)
|
|
178
|
+
reply = {'status': 'error',
|
|
179
|
+
'execution_count': pari_nb_hist(),
|
|
180
|
+
'ename': "",
|
|
181
|
+
'evalue': "",
|
|
182
|
+
'traceback': [],
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if err > 0:
|
|
186
|
+
# true error
|
|
187
|
+
avma = av
|
|
188
|
+
else:
|
|
189
|
+
# allocatemem
|
|
190
|
+
avma = pari_mainstack.top
|
|
191
|
+
|
|
192
|
+
self.io.flush()
|
|
193
|
+
return reply
|
|
194
|
+
|
|
195
|
+
def do_complete(self, code, cursor_pos):
|
|
196
|
+
cdef long word
|
|
197
|
+
cdef char** m = pari_completion_matches(&pari_rl,
|
|
198
|
+
(<unicode?>code).encode("utf-8"), cursor_pos, &word)
|
|
199
|
+
|
|
200
|
+
cdef list matches = []
|
|
201
|
+
if m != NULL:
|
|
202
|
+
if m[1] == NULL: # Unique match
|
|
203
|
+
matches = [PyUnicode_FromString(m[0])]
|
|
204
|
+
else: # Non-unique match
|
|
205
|
+
while m[1] != NULL:
|
|
206
|
+
matches.append(PyUnicode_FromString(m[1]))
|
|
207
|
+
m += 1
|
|
208
|
+
|
|
209
|
+
reply = dict(status="ok", matches=sorted(matches),
|
|
210
|
+
cursor_start=word, cursor_end=cursor_pos)
|
|
211
|
+
return reply
|
|
212
|
+
|
|
213
|
+
def do_inspect(self, code, cursor_pos, detail_level=0):
|
|
214
|
+
word = self.__get_keyword(code, cursor_pos)[0]
|
|
215
|
+
# Possibly rewind if we are right after a "("
|
|
216
|
+
if not word and cursor_pos > 0 and code[cursor_pos-1] == u"(":
|
|
217
|
+
word = self.__get_keyword(code, cursor_pos-1)[0]
|
|
218
|
+
|
|
219
|
+
reply = dict(status="ok", found=False, data={}, metadata={})
|
|
220
|
+
if not word:
|
|
221
|
+
return reply
|
|
222
|
+
|
|
223
|
+
cdef entree* ep = is_entry((<unicode?>word).encode("utf-8"))
|
|
224
|
+
if ep == NULL or ep.help == NULL:
|
|
225
|
+
return reply
|
|
226
|
+
|
|
227
|
+
reply["found"] = True
|
|
228
|
+
reply["data"] = {"text/plain": PyUnicode_FromString(ep.help)}
|
|
229
|
+
return reply
|
|
230
|
+
|
|
231
|
+
def publish_svg(self, svg, width, height):
|
|
232
|
+
# For some reason, the payload must be str, not bytes
|
|
233
|
+
if not isinstance(svg, str):
|
|
234
|
+
svg = PyUnicode_FromString(svg)
|
|
235
|
+
content = {
|
|
236
|
+
'data': {
|
|
237
|
+
"text/plain": "SVG plot",
|
|
238
|
+
"image/svg+xml": svg,
|
|
239
|
+
},
|
|
240
|
+
'metadata': {
|
|
241
|
+
"width": width,
|
|
242
|
+
"height": height,
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
self.send_response(self.iopub_socket, 'display_data', content)
|
|
246
|
+
|
|
247
|
+
def __get_keyword(self, code, pos):
|
|
248
|
+
"""
|
|
249
|
+
Return a tuple ``(word, start, end)`` such that ``word`` is a
|
|
250
|
+
PARI "keyword" and ``word = code[start:end]``. The bounds are
|
|
251
|
+
such that ``start <= pos <= end``.
|
|
252
|
+
"""
|
|
253
|
+
cdef Py_ssize_t start, end, length = len(code)
|
|
254
|
+
start = end = pos
|
|
255
|
+
while start > 0 and is_keyword_char_python(code[start-1]):
|
|
256
|
+
start -= 1
|
|
257
|
+
while end < length and is_keyword_char_python(code[end]):
|
|
258
|
+
end += 1
|
|
259
|
+
word = code[start:end]
|
|
260
|
+
return (word, start, end)
|
PARIKernel/paridecl.pxd
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
# distutils: libraries = pari
|
|
3
|
+
|
|
4
|
+
cdef extern from "pari/pari.h" nogil:
|
|
5
|
+
ctypedef unsigned long ulong "pari_ulong"
|
|
6
|
+
ctypedef long* GEN
|
|
7
|
+
ctypedef unsigned long pari_sp
|
|
8
|
+
ctypedef long pari_timer
|
|
9
|
+
|
|
10
|
+
ctypedef struct entree:
|
|
11
|
+
entree* next
|
|
12
|
+
char* name
|
|
13
|
+
const char* help
|
|
14
|
+
|
|
15
|
+
long paricfg_version_code
|
|
16
|
+
long PARI_VERSION_SHIFT
|
|
17
|
+
|
|
18
|
+
ctypedef struct pari_mainstack:
|
|
19
|
+
pari_sp top
|
|
20
|
+
|
|
21
|
+
pari_sp avma
|
|
22
|
+
pari_mainstack * pari_mainstack
|
|
23
|
+
GEN gnil
|
|
24
|
+
|
|
25
|
+
int INIT_JMPm, INIT_SIGm, INIT_DFTm, INIT_noPRIMEm, INIT_noIMTm
|
|
26
|
+
void pari_init_opts(size_t parisize, ulong maxprime, ulong init_opts)
|
|
27
|
+
void pari_init(size_t parisize, ulong maxprime)
|
|
28
|
+
void pari_sighandler(int sig)
|
|
29
|
+
|
|
30
|
+
void (*cb_pari_err_recover)(long)
|
|
31
|
+
|
|
32
|
+
void pari_free(void*)
|
|
33
|
+
|
|
34
|
+
GEN gp_read_str_multiline(const char *t, char *last)
|
|
35
|
+
char* GENtostr(GEN x)
|
|
36
|
+
void pari_add_hist(GEN z, long t, long r)
|
|
37
|
+
long pari_nb_hist()
|
|
38
|
+
|
|
39
|
+
long timer_delay(pari_timer *T)
|
|
40
|
+
long timer_get(pari_timer *T)
|
|
41
|
+
void timer_start(pari_timer *T)
|
|
42
|
+
|
|
43
|
+
long walltimer_start(pari_timer *T)
|
|
44
|
+
long walltimer_delay(pari_timer *T)
|
|
45
|
+
|
|
46
|
+
char* gp_format_time(long delay)
|
|
47
|
+
|
|
48
|
+
void pari_puts(char*)
|
|
49
|
+
void pari_flush()
|
|
50
|
+
|
|
51
|
+
struct PariOUT:
|
|
52
|
+
void (*putch)(char)
|
|
53
|
+
void (*puts)(const char*)
|
|
54
|
+
void (*flush)()
|
|
55
|
+
PariOUT* pariOut
|
|
56
|
+
PariOUT* pariErr
|
|
57
|
+
|
|
58
|
+
entree* is_entry(char *s)
|
|
59
|
+
|
|
60
|
+
ctypedef struct PARI_plot:
|
|
61
|
+
long width
|
|
62
|
+
long height
|
|
63
|
+
long hunit
|
|
64
|
+
long vunit
|
|
65
|
+
long fwidth
|
|
66
|
+
long fheight
|
|
67
|
+
void (*draw)(PARI_plot *T, GEN w, GEN x, GEN y)
|
|
68
|
+
|
|
69
|
+
void pari_set_plot_engine(void (*T)(PARI_plot *))
|
|
70
|
+
|
|
71
|
+
char* rect2svg(GEN w, GEN x, GEN y, PARI_plot *T)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
cdef extern from "pari/paripriv.h" nogil:
|
|
75
|
+
long is_keyword_char(char c)
|
|
76
|
+
|
|
77
|
+
ctypedef struct gp_data:
|
|
78
|
+
int chrono
|
|
79
|
+
pari_timer* T
|
|
80
|
+
pari_timer* Tw
|
|
81
|
+
|
|
82
|
+
gp_data* GP_DATA
|
|
83
|
+
|
|
84
|
+
ctypedef struct pari_rl_interface:
|
|
85
|
+
pass
|
|
86
|
+
|
|
87
|
+
void pari_use_readline(pari_rl_interface)
|
|
88
|
+
char** pari_completion_matches(pari_rl_interface*, char* s, long pos, long* wordpos)
|
|
89
|
+
|
|
90
|
+
void init_graph()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# It is important that this gets included *after* all PARI includes
|
|
94
|
+
cdef extern from "parifix.h":
|
|
95
|
+
pass
|
|
Binary file
|
PARIKernel/svg.pyx
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
#cython: language_level=3
|
|
3
|
+
#
|
|
4
|
+
# Helper module to handle SVG images produced by PARI
|
|
5
|
+
#
|
|
6
|
+
# Copyright (C) 2017 Jeroen Demeyer
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
from .paridecl cimport *
|
|
24
|
+
|
|
25
|
+
cdef pari_kernel
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def init_svg(kernel):
|
|
29
|
+
global pari_kernel
|
|
30
|
+
pari_kernel = kernel
|
|
31
|
+
pari_set_plot_engine(get_plot)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
cdef void get_plot(PARI_plot* T) noexcept nogil:
|
|
35
|
+
# Values copied from src/graph/plotsvg.c in PARI sources
|
|
36
|
+
T.width = 480
|
|
37
|
+
T.height = 320
|
|
38
|
+
T.hunit = 3
|
|
39
|
+
T.vunit = 3
|
|
40
|
+
T.fwidth = 9
|
|
41
|
+
T.fheight = 12
|
|
42
|
+
|
|
43
|
+
T.draw = draw
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
cdef void draw(PARI_plot *T, GEN w, GEN x, GEN y) noexcept nogil:
|
|
47
|
+
global avma
|
|
48
|
+
cdef pari_sp av = avma
|
|
49
|
+
cdef char* svg = rect2svg(w, x, y, T)
|
|
50
|
+
with gil:
|
|
51
|
+
pari_kernel.publish_svg(svg, T.width, T.height)
|
|
52
|
+
avma = av
|