passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.geometry.polyhedron
|
|
3
|
+
r"""
|
|
4
|
+
Generic Backend for SDP solvers
|
|
5
|
+
|
|
6
|
+
This class only lists the methods that should be defined by any
|
|
7
|
+
interface with a SDP Solver. All these methods immediately raise
|
|
8
|
+
:exc:`NotImplementedError` exceptions when called, and are obviously
|
|
9
|
+
meant to be replaced by the solver-specific method. This file can also
|
|
10
|
+
be used as a template to create a new interface : one would only need
|
|
11
|
+
to replace the occurrences of ``"Nonexistent_SDP_solver"`` by the
|
|
12
|
+
solver's name, and replace ``GenericSDPBackend`` by
|
|
13
|
+
``SolverName(GenericSDPBackend)`` so that the new solver extends this
|
|
14
|
+
class.
|
|
15
|
+
|
|
16
|
+
AUTHORS:
|
|
17
|
+
|
|
18
|
+
- Ingolfur Edvardsson (2014-07): initial implementation
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
#*****************************************************************************
|
|
22
|
+
# Copyright (C) 2014 Ingolfur Edvardsson <ingolfured@gmail.com>
|
|
23
|
+
#
|
|
24
|
+
# This program is free software: you can redistribute it and/or modify
|
|
25
|
+
# it under the terms of the GNU General Public License as published by
|
|
26
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
27
|
+
# (at your option) any later version.
|
|
28
|
+
# http://www.gnu.org/licenses/
|
|
29
|
+
#*****************************************************************************
|
|
30
|
+
|
|
31
|
+
cdef class GenericSDPBackend:
|
|
32
|
+
|
|
33
|
+
cpdef base_ring(self):
|
|
34
|
+
"""
|
|
35
|
+
The base ring.
|
|
36
|
+
|
|
37
|
+
TESTS::
|
|
38
|
+
|
|
39
|
+
sage: from sage.numerical.backends.generic_sdp_backend import GenericSDPBackend
|
|
40
|
+
sage: GenericSDPBackend().base_ring()
|
|
41
|
+
Real Double Field
|
|
42
|
+
"""
|
|
43
|
+
from sage.rings.real_double import RDF
|
|
44
|
+
return RDF
|
|
45
|
+
|
|
46
|
+
cpdef zero(self):
|
|
47
|
+
"""
|
|
48
|
+
Zero of the base ring.
|
|
49
|
+
|
|
50
|
+
TESTS::
|
|
51
|
+
|
|
52
|
+
sage: from sage.numerical.backends.generic_sdp_backend import GenericSDPBackend
|
|
53
|
+
sage: GenericSDPBackend().zero()
|
|
54
|
+
0.0
|
|
55
|
+
"""
|
|
56
|
+
return self.base_ring().zero()
|
|
57
|
+
|
|
58
|
+
cpdef int add_variable(self, obj=0.0, name=None) except -1:
|
|
59
|
+
"""
|
|
60
|
+
Add a variable.
|
|
61
|
+
|
|
62
|
+
This amounts to adding a new column to the matrix. By default,
|
|
63
|
+
the variable is both positive and real.
|
|
64
|
+
|
|
65
|
+
INPUT:
|
|
66
|
+
|
|
67
|
+
- ``obj`` -- (optional) coefficient of this variable in the objective
|
|
68
|
+
function (default: 0.0)
|
|
69
|
+
|
|
70
|
+
- ``name`` -- an optional name for the newly added variable (default:
|
|
71
|
+
``None``)
|
|
72
|
+
|
|
73
|
+
OUTPUT: the index of the newly created variable
|
|
74
|
+
|
|
75
|
+
EXAMPLES::
|
|
76
|
+
|
|
77
|
+
sage: # optional - nonexistent_lp_solver
|
|
78
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
79
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
80
|
+
sage: p.ncols()
|
|
81
|
+
0
|
|
82
|
+
sage: p.add_variable()
|
|
83
|
+
0
|
|
84
|
+
sage: p.ncols()
|
|
85
|
+
1
|
|
86
|
+
sage: p.add_variable(name='x', obj=1.0)
|
|
87
|
+
3
|
|
88
|
+
sage: p.col_name(3)
|
|
89
|
+
'x'
|
|
90
|
+
sage: p.objective_coefficient(3)
|
|
91
|
+
1.0
|
|
92
|
+
"""
|
|
93
|
+
raise NotImplementedError()
|
|
94
|
+
|
|
95
|
+
cpdef int add_variables(self, int n, names=None) except -1:
|
|
96
|
+
"""
|
|
97
|
+
Add ``n`` variables.
|
|
98
|
+
|
|
99
|
+
This amounts to adding new columns to the matrix. By default,
|
|
100
|
+
the variables are both positive and real.
|
|
101
|
+
|
|
102
|
+
INPUT:
|
|
103
|
+
|
|
104
|
+
- ``n`` -- the number of new variables (must be > 0)
|
|
105
|
+
|
|
106
|
+
- ``obj`` -- coefficient of all variables in the objective function (default: 0.0)
|
|
107
|
+
|
|
108
|
+
- ``names`` -- list of names (default: ``None``)
|
|
109
|
+
|
|
110
|
+
OUTPUT: the index of the variable created last
|
|
111
|
+
|
|
112
|
+
EXAMPLES::
|
|
113
|
+
|
|
114
|
+
sage: # optional - nonexistent_lp_solver
|
|
115
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
116
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
117
|
+
sage: p.ncols()
|
|
118
|
+
0
|
|
119
|
+
sage: p.add_variables(5)
|
|
120
|
+
4
|
|
121
|
+
sage: p.ncols()
|
|
122
|
+
5
|
|
123
|
+
sage: p.add_variables(2, lower_bound=-2.0, integer=True, names=['a','b'])
|
|
124
|
+
6
|
|
125
|
+
"""
|
|
126
|
+
raise NotImplementedError()
|
|
127
|
+
|
|
128
|
+
cpdef set_sense(self, int sense):
|
|
129
|
+
"""
|
|
130
|
+
Set the direction (maximization/minimization).
|
|
131
|
+
|
|
132
|
+
INPUT:
|
|
133
|
+
|
|
134
|
+
- ``sense`` -- integer:
|
|
135
|
+
|
|
136
|
+
* `+1` => Maximization
|
|
137
|
+
* `-1` => Minimization
|
|
138
|
+
|
|
139
|
+
EXAMPLES::
|
|
140
|
+
|
|
141
|
+
sage: # optional - nonexistent_lp_solver
|
|
142
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
143
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
144
|
+
sage: p.is_maximization()
|
|
145
|
+
True
|
|
146
|
+
sage: p.set_sense(-1)
|
|
147
|
+
sage: p.is_maximization()
|
|
148
|
+
False
|
|
149
|
+
"""
|
|
150
|
+
raise NotImplementedError()
|
|
151
|
+
|
|
152
|
+
cpdef objective_coefficient(self, int variable, coeff=None):
|
|
153
|
+
"""
|
|
154
|
+
Set or get the coefficient of a variable in the objective
|
|
155
|
+
function
|
|
156
|
+
|
|
157
|
+
INPUT:
|
|
158
|
+
|
|
159
|
+
- ``variable`` -- integer; the variable's id
|
|
160
|
+
|
|
161
|
+
- ``coeff`` -- double; its coefficient
|
|
162
|
+
|
|
163
|
+
EXAMPLES::
|
|
164
|
+
|
|
165
|
+
sage: # optional - nonexistent_lp_solver
|
|
166
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
167
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
168
|
+
sage: p.add_variable()
|
|
169
|
+
1
|
|
170
|
+
sage: p.objective_coefficient(0)
|
|
171
|
+
0.0
|
|
172
|
+
sage: p.objective_coefficient(0,2)
|
|
173
|
+
sage: p.objective_coefficient(0)
|
|
174
|
+
2.0
|
|
175
|
+
"""
|
|
176
|
+
raise NotImplementedError()
|
|
177
|
+
|
|
178
|
+
cpdef set_objective(self, list coeff, d=0.0):
|
|
179
|
+
"""
|
|
180
|
+
Set the objective function.
|
|
181
|
+
|
|
182
|
+
INPUT:
|
|
183
|
+
|
|
184
|
+
- ``coeff`` -- list of real values, whose i-th element is the
|
|
185
|
+
coefficient of the i-th variable in the objective function
|
|
186
|
+
|
|
187
|
+
- ``d`` -- double; the constant term in the linear function (set to `0`
|
|
188
|
+
by default)
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: # optional - nonexistent_lp_solver
|
|
193
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
194
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
195
|
+
sage: p.add_variables(5)
|
|
196
|
+
5
|
|
197
|
+
sage: p.set_objective([1, 1, 2, 1, 3])
|
|
198
|
+
sage: [p.objective_coefficient(x) for x in range(5)]
|
|
199
|
+
[1.0, 1.0, 2.0, 1.0, 3.0]
|
|
200
|
+
|
|
201
|
+
Constants in the objective function are respected.
|
|
202
|
+
"""
|
|
203
|
+
raise NotImplementedError()
|
|
204
|
+
|
|
205
|
+
cpdef add_linear_constraint(self, coefficients, name=None):
|
|
206
|
+
"""
|
|
207
|
+
Add a linear constraint.
|
|
208
|
+
|
|
209
|
+
INPUT:
|
|
210
|
+
|
|
211
|
+
- ``coefficients`` an iterable with ``(c,v)`` pairs where ``c``
|
|
212
|
+
is a variable index (integer) and ``v`` is a value (real
|
|
213
|
+
value).
|
|
214
|
+
|
|
215
|
+
- ``lower_bound`` -- a lower bound, either a real value or ``None``
|
|
216
|
+
|
|
217
|
+
- ``upper_bound`` -- an upper bound, either a real value or ``None``
|
|
218
|
+
|
|
219
|
+
- ``name`` -- an optional name for this row (default: ``None``)
|
|
220
|
+
|
|
221
|
+
EXAMPLES::
|
|
222
|
+
|
|
223
|
+
sage: # optional - nonexistent_lp_solver
|
|
224
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
225
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
226
|
+
sage: p.add_variables(5)
|
|
227
|
+
4
|
|
228
|
+
sage: p.add_linear_constraint(zip(range(5), range(5)), 2.0, 2.0)
|
|
229
|
+
sage: p.row(0)
|
|
230
|
+
([4, 3, 2, 1], [4.0, 3.0, 2.0, 1.0]) # optional - Nonexistent_LP_solver
|
|
231
|
+
sage: p.row_bounds(0)
|
|
232
|
+
(2.0, 2.0)
|
|
233
|
+
sage: p.add_linear_constraint( zip(range(5), range(5)), 1.0, 1.0, name='foo')
|
|
234
|
+
sage: p.row_name(-1)
|
|
235
|
+
"foo"
|
|
236
|
+
"""
|
|
237
|
+
raise NotImplementedError()
|
|
238
|
+
|
|
239
|
+
cpdef add_linear_constraints(self, int number, names=None):
|
|
240
|
+
"""
|
|
241
|
+
Add constraints.
|
|
242
|
+
|
|
243
|
+
INPUT:
|
|
244
|
+
|
|
245
|
+
- ``number`` -- integer; the number of constraints to add
|
|
246
|
+
|
|
247
|
+
- ``lower_bound`` -- a lower bound, either a real value or ``None``
|
|
248
|
+
|
|
249
|
+
- ``upper_bound`` -- an upper bound, either a real value or ``None``
|
|
250
|
+
|
|
251
|
+
- ``names`` -- an optional list of names (default: ``None``)
|
|
252
|
+
|
|
253
|
+
EXAMPLES::
|
|
254
|
+
|
|
255
|
+
sage: # optional - nonexistent_lp_solver
|
|
256
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
257
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
258
|
+
sage: p.add_variables(5)
|
|
259
|
+
5
|
|
260
|
+
sage: p.add_linear_constraints(5, None, 2)
|
|
261
|
+
sage: p.row(4)
|
|
262
|
+
([], [])
|
|
263
|
+
sage: p.row_bounds(4)
|
|
264
|
+
(None, 2.0)
|
|
265
|
+
"""
|
|
266
|
+
raise NotImplementedError()
|
|
267
|
+
|
|
268
|
+
cpdef int solve(self) except -1:
|
|
269
|
+
"""
|
|
270
|
+
Solve the problem.
|
|
271
|
+
|
|
272
|
+
.. NOTE::
|
|
273
|
+
|
|
274
|
+
This method raises :class:`SDPSolverException` exceptions when
|
|
275
|
+
the solution cannot be computed for any reason (none
|
|
276
|
+
exists, or the LP solver was not able to find it, etc...)
|
|
277
|
+
|
|
278
|
+
EXAMPLES::
|
|
279
|
+
|
|
280
|
+
sage: # optional - nonexistent_lp_solver
|
|
281
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
282
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
283
|
+
sage: p.add_linear_constraints(5, 0, None)
|
|
284
|
+
sage: p.add_col(range(5), range(5))
|
|
285
|
+
sage: p.solve()
|
|
286
|
+
0
|
|
287
|
+
sage: p.objective_coefficient(0,1)
|
|
288
|
+
sage: p.solve()
|
|
289
|
+
Traceback (most recent call last):
|
|
290
|
+
...
|
|
291
|
+
SDPSolverException: ...
|
|
292
|
+
"""
|
|
293
|
+
raise NotImplementedError()
|
|
294
|
+
|
|
295
|
+
cpdef get_objective_value(self):
|
|
296
|
+
"""
|
|
297
|
+
Return the value of the objective function.
|
|
298
|
+
|
|
299
|
+
.. NOTE::
|
|
300
|
+
|
|
301
|
+
Behaviour is undefined unless ``solve`` has been called before.
|
|
302
|
+
|
|
303
|
+
EXAMPLES::
|
|
304
|
+
|
|
305
|
+
sage: # optional - nonexistent_lp_solver
|
|
306
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
307
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
308
|
+
sage: p.add_variables(2)
|
|
309
|
+
2
|
|
310
|
+
sage: p.add_linear_constraint([(0,1), (1,2)], None, 3)
|
|
311
|
+
sage: p.set_objective([2, 5])
|
|
312
|
+
sage: p.solve()
|
|
313
|
+
0
|
|
314
|
+
sage: p.get_objective_value()
|
|
315
|
+
7.5
|
|
316
|
+
sage: p.get_variable_value(0)
|
|
317
|
+
0.0
|
|
318
|
+
sage: p.get_variable_value(1)
|
|
319
|
+
1.5
|
|
320
|
+
"""
|
|
321
|
+
raise NotImplementedError()
|
|
322
|
+
|
|
323
|
+
cpdef get_variable_value(self, int variable):
|
|
324
|
+
"""
|
|
325
|
+
Return the value of a variable given by the solver.
|
|
326
|
+
|
|
327
|
+
.. NOTE::
|
|
328
|
+
|
|
329
|
+
Behaviour is undefined unless ``solve`` has been called before.
|
|
330
|
+
|
|
331
|
+
EXAMPLES::
|
|
332
|
+
|
|
333
|
+
sage: # optional - nonexistent_lp_solver
|
|
334
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
335
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
336
|
+
sage: p.add_variables(2)
|
|
337
|
+
2
|
|
338
|
+
sage: p.add_linear_constraint([(0,1), (1, 2)], None, 3)
|
|
339
|
+
sage: p.set_objective([2, 5])
|
|
340
|
+
sage: p.solve()
|
|
341
|
+
0
|
|
342
|
+
sage: p.get_objective_value()
|
|
343
|
+
7.5
|
|
344
|
+
sage: p.get_variable_value(0)
|
|
345
|
+
0.0
|
|
346
|
+
sage: p.get_variable_value(1)
|
|
347
|
+
1.5
|
|
348
|
+
"""
|
|
349
|
+
|
|
350
|
+
raise NotImplementedError()
|
|
351
|
+
|
|
352
|
+
cpdef int ncols(self) noexcept:
|
|
353
|
+
"""
|
|
354
|
+
Return the number of columns/variables.
|
|
355
|
+
|
|
356
|
+
EXAMPLES::
|
|
357
|
+
|
|
358
|
+
sage: # optional - nonexistent_lp_solver
|
|
359
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
360
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
361
|
+
sage: p.ncols()
|
|
362
|
+
0
|
|
363
|
+
sage: p.add_variables(2)
|
|
364
|
+
2
|
|
365
|
+
sage: p.ncols()
|
|
366
|
+
2
|
|
367
|
+
"""
|
|
368
|
+
|
|
369
|
+
raise NotImplementedError()
|
|
370
|
+
|
|
371
|
+
cpdef int nrows(self) noexcept:
|
|
372
|
+
"""
|
|
373
|
+
Return the number of rows/constraints.
|
|
374
|
+
|
|
375
|
+
EXAMPLES::
|
|
376
|
+
|
|
377
|
+
sage: # optional - nonexistent_lp_solver
|
|
378
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
379
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
380
|
+
sage: p.nrows()
|
|
381
|
+
0
|
|
382
|
+
sage: p.add_linear_constraints(2, 2.0, None)
|
|
383
|
+
sage: p.nrows()
|
|
384
|
+
2
|
|
385
|
+
"""
|
|
386
|
+
raise NotImplementedError()
|
|
387
|
+
|
|
388
|
+
cpdef bint is_maximization(self) noexcept:
|
|
389
|
+
"""
|
|
390
|
+
Test whether the problem is a maximization
|
|
391
|
+
|
|
392
|
+
EXAMPLES::
|
|
393
|
+
|
|
394
|
+
sage: # optional - nonexistent_lp_solver
|
|
395
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
396
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
397
|
+
sage: p.is_maximization()
|
|
398
|
+
True
|
|
399
|
+
sage: p.set_sense(-1)
|
|
400
|
+
sage: p.is_maximization()
|
|
401
|
+
False
|
|
402
|
+
"""
|
|
403
|
+
raise NotImplementedError()
|
|
404
|
+
|
|
405
|
+
cpdef problem_name(self, name=None):
|
|
406
|
+
"""
|
|
407
|
+
Return or define the problem's name.
|
|
408
|
+
|
|
409
|
+
INPUT:
|
|
410
|
+
|
|
411
|
+
- ``name`` -- string; the problem's name. When set to
|
|
412
|
+
``NULL`` (default), the method returns the problem's name.
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: # optional - nonexistent_lp_solver
|
|
417
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
418
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
419
|
+
sage: p.problem_name("There once was a french fry")
|
|
420
|
+
sage: print(p.problem_name())
|
|
421
|
+
There once was a french fry
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
raise NotImplementedError()
|
|
425
|
+
|
|
426
|
+
cpdef row(self, int i):
|
|
427
|
+
"""
|
|
428
|
+
Return a row.
|
|
429
|
+
|
|
430
|
+
INPUT:
|
|
431
|
+
|
|
432
|
+
- ``index`` -- integer; the constraint's id
|
|
433
|
+
|
|
434
|
+
OUTPUT:
|
|
435
|
+
|
|
436
|
+
A pair ``(indices, coeffs)`` where ``indices`` lists the
|
|
437
|
+
entries whose coefficient is nonzero, and to which ``coeffs``
|
|
438
|
+
associates their coefficient on the model of the
|
|
439
|
+
``add_linear_constraint`` method.
|
|
440
|
+
|
|
441
|
+
EXAMPLES::
|
|
442
|
+
|
|
443
|
+
sage: # optional - nonexistent_lp_solver
|
|
444
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
445
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
446
|
+
sage: p.add_variables(5)
|
|
447
|
+
5
|
|
448
|
+
sage: p.add_linear_constraint(zip(range(5), range(5)), 2, 2)
|
|
449
|
+
sage: p.row(0)
|
|
450
|
+
([4, 3, 2, 1], [4.0, 3.0, 2.0, 1.0])
|
|
451
|
+
sage: p.row_bounds(0)
|
|
452
|
+
(2.0, 2.0)
|
|
453
|
+
"""
|
|
454
|
+
raise NotImplementedError()
|
|
455
|
+
|
|
456
|
+
cpdef row_name(self, int index):
|
|
457
|
+
"""
|
|
458
|
+
Return the ``index``-th row name.
|
|
459
|
+
|
|
460
|
+
INPUT:
|
|
461
|
+
|
|
462
|
+
- ``index`` -- integer; the row's id
|
|
463
|
+
|
|
464
|
+
EXAMPLES::
|
|
465
|
+
|
|
466
|
+
sage: # optional - nonexistent_lp_solver
|
|
467
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
468
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
469
|
+
sage: p.add_linear_constraints(1, 2, None, name="Empty constraint 1")
|
|
470
|
+
sage: p.row_name(0)
|
|
471
|
+
'Empty constraint 1'
|
|
472
|
+
"""
|
|
473
|
+
raise NotImplementedError()
|
|
474
|
+
|
|
475
|
+
cpdef col_name(self, int index):
|
|
476
|
+
"""
|
|
477
|
+
Return the ``index``-th col name.
|
|
478
|
+
|
|
479
|
+
INPUT:
|
|
480
|
+
|
|
481
|
+
- ``index`` -- integer; the col's id
|
|
482
|
+
|
|
483
|
+
- ``name`` -- (``char *``) its name; when set to ``NULL``
|
|
484
|
+
(default), the method returns the current name
|
|
485
|
+
|
|
486
|
+
EXAMPLES::
|
|
487
|
+
|
|
488
|
+
sage: # optional - nonexistent_lp_solver
|
|
489
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
490
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
491
|
+
sage: p.add_variable(name="I am a variable")
|
|
492
|
+
1
|
|
493
|
+
sage: p.col_name(0)
|
|
494
|
+
'I am a variable'
|
|
495
|
+
"""
|
|
496
|
+
raise NotImplementedError()
|
|
497
|
+
|
|
498
|
+
cpdef dual_variable(self, int i, sparse=False):
|
|
499
|
+
"""
|
|
500
|
+
The `i`-th dual variable.
|
|
501
|
+
|
|
502
|
+
Available after ``self.solve()`` is called, otherwise the result is undefined
|
|
503
|
+
|
|
504
|
+
- ``index`` -- integer; the constraint's id
|
|
505
|
+
|
|
506
|
+
OUTPUT: the matrix of the `i`-th dual variable
|
|
507
|
+
|
|
508
|
+
EXAMPLES::
|
|
509
|
+
|
|
510
|
+
sage: # optional - nonexistent_lp_solver
|
|
511
|
+
sage: p = SemidefiniteProgram(maximization=False, solver="Nonexistent_LP_solver")
|
|
512
|
+
sage: x = p.new_variable()
|
|
513
|
+
sage: p.set_objective(x[0] - x[1])
|
|
514
|
+
sage: a1 = matrix([[1, 2.], [2., 3.]])
|
|
515
|
+
sage: a2 = matrix([[3, 4.], [4., 5.]])
|
|
516
|
+
sage: a3 = matrix([[5, 6.], [6., 7.]])
|
|
517
|
+
sage: b1 = matrix([[1, 1.], [1., 1.]])
|
|
518
|
+
sage: b2 = matrix([[2, 2.], [2., 2.]])
|
|
519
|
+
sage: b3 = matrix([[3, 3.], [3., 3.]])
|
|
520
|
+
sage: p.add_constraint(a1*x[0] + a2*x[1] <= a3)
|
|
521
|
+
sage: p.add_constraint(b1*x[0] + b2*x[1] <= b3)
|
|
522
|
+
sage: p.solve()
|
|
523
|
+
-3.0
|
|
524
|
+
sage: B = p.get_backend()
|
|
525
|
+
sage: x = p.get_values(x).values()
|
|
526
|
+
sage: -(a3*B.dual_variable(0)).trace()-(b3*B.dual_variable(1)).trace()
|
|
527
|
+
-3.0
|
|
528
|
+
sage: g = sum((B.slack(j)*B.dual_variable(j)).trace() for j in range(2)); g
|
|
529
|
+
0.0
|
|
530
|
+
|
|
531
|
+
TESTS::
|
|
532
|
+
|
|
533
|
+
sage: B.dual_variable(7) # optional - Nonexistent_LP_solver
|
|
534
|
+
...
|
|
535
|
+
Traceback (most recent call last):
|
|
536
|
+
...
|
|
537
|
+
IndexError: list index out of range
|
|
538
|
+
sage: abs(g - B._get_answer()['gap']) # optional - Nonexistent_LP_solver # tol 1e-22
|
|
539
|
+
0.0
|
|
540
|
+
"""
|
|
541
|
+
raise NotImplementedError()
|
|
542
|
+
|
|
543
|
+
cpdef slack(self, int i, sparse=False):
|
|
544
|
+
"""
|
|
545
|
+
Slack of the `i`-th constraint.
|
|
546
|
+
|
|
547
|
+
Available after ``self.solve()`` is called, otherwise the result is
|
|
548
|
+
undefined.
|
|
549
|
+
|
|
550
|
+
- ``index`` -- integer; the constraint's id
|
|
551
|
+
|
|
552
|
+
OUTPUT: the matrix of the slack of the `i`-th constraint
|
|
553
|
+
|
|
554
|
+
EXAMPLES::
|
|
555
|
+
|
|
556
|
+
sage: # optional - nonexistent_lp_solver
|
|
557
|
+
sage: p = SemidefiniteProgram(maximization=False, solver="Nonexistent_LP_solver")
|
|
558
|
+
sage: x = p.new_variable()
|
|
559
|
+
sage: p.set_objective(x[0] - x[1])
|
|
560
|
+
sage: a1 = matrix([[1, 2.], [2., 3.]])
|
|
561
|
+
sage: a2 = matrix([[3, 4.], [4., 5.]])
|
|
562
|
+
sage: a3 = matrix([[5, 6.], [6., 7.]])
|
|
563
|
+
sage: b1 = matrix([[1, 1.], [1., 1.]])
|
|
564
|
+
sage: b2 = matrix([[2, 2.], [2., 2.]])
|
|
565
|
+
sage: b3 = matrix([[3, 3.], [3., 3.]])
|
|
566
|
+
sage: p.add_constraint(a1*x[0] + a2*x[1] <= a3)
|
|
567
|
+
sage: p.add_constraint(b1*x[0] + b2*x[1] <= b3)
|
|
568
|
+
sage: p.solve()
|
|
569
|
+
-3.0
|
|
570
|
+
sage: B = p.get_backend()
|
|
571
|
+
sage: B1 = B.slack(1); B1
|
|
572
|
+
[0.0 0.0]
|
|
573
|
+
[0.0 0.0]
|
|
574
|
+
sage: B1.is_positive_definite()
|
|
575
|
+
True
|
|
576
|
+
sage: x = p.get_values(x).values()
|
|
577
|
+
sage: x[0]*b1 + x[1]*b2 - b3 + B1
|
|
578
|
+
[0.0 0.0]
|
|
579
|
+
[0.0 0.0]
|
|
580
|
+
|
|
581
|
+
TESTS::
|
|
582
|
+
|
|
583
|
+
sage: B.slack(7) # optional - Nonexistent_LP_solver
|
|
584
|
+
...
|
|
585
|
+
Traceback (most recent call last):
|
|
586
|
+
...
|
|
587
|
+
IndexError: list index out of range
|
|
588
|
+
"""
|
|
589
|
+
raise NotImplementedError()
|
|
590
|
+
|
|
591
|
+
cpdef solver_parameter(self, name, value=None):
|
|
592
|
+
"""
|
|
593
|
+
Return or define a solver parameter.
|
|
594
|
+
|
|
595
|
+
INPUT:
|
|
596
|
+
|
|
597
|
+
- ``name`` -- string; the parameter
|
|
598
|
+
|
|
599
|
+
- ``value`` -- the parameter's value if it is to be defined,
|
|
600
|
+
or ``None`` (default) to obtain its current value
|
|
601
|
+
|
|
602
|
+
.. NOTE::
|
|
603
|
+
|
|
604
|
+
The list of available parameters is available at
|
|
605
|
+
:meth:`~sage.numerical.sdp.SemidefiniteProgram.solver_parameter`.
|
|
606
|
+
|
|
607
|
+
EXAMPLES::
|
|
608
|
+
|
|
609
|
+
sage: # optional - nonexistent_lp_solver
|
|
610
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
611
|
+
sage: p = get_solver(solver="Nonexistent_LP_solver")
|
|
612
|
+
sage: p.solver_parameter("timelimit")
|
|
613
|
+
sage: p.solver_parameter("timelimit", 60)
|
|
614
|
+
sage: p.solver_parameter("timelimit")
|
|
615
|
+
"""
|
|
616
|
+
raise NotImplementedError()
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
default_solver = None
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
def default_sdp_solver(solver=None):
|
|
623
|
+
"""
|
|
624
|
+
Return/set the default SDP solver used by Sage.
|
|
625
|
+
|
|
626
|
+
INPUT:
|
|
627
|
+
|
|
628
|
+
- ``solver`` -- one of the following:
|
|
629
|
+
|
|
630
|
+
- the string ``'CVXOPT'``, to make the use of the CVXOPT solver
|
|
631
|
+
(see the `CVXOPT <http://cvxopt.org/>`_ web site) the default;
|
|
632
|
+
|
|
633
|
+
- a subclass of
|
|
634
|
+
:class:`sage.numerical.backends.generic_sdp_backend.GenericSDPBackend`,
|
|
635
|
+
to make it the default; or
|
|
636
|
+
|
|
637
|
+
- ``None`` -- (default) in which case the current default solver
|
|
638
|
+
(a string or a class) is returned
|
|
639
|
+
|
|
640
|
+
OUTPUT:
|
|
641
|
+
|
|
642
|
+
This function returns the current default solver (a string or a
|
|
643
|
+
class) if ``solver = None`` (default). Otherwise, it sets the
|
|
644
|
+
default solver to the one given. If this solver does not exist, or
|
|
645
|
+
is not available, a :exc:`ValueError` exception is raised.
|
|
646
|
+
|
|
647
|
+
EXAMPLES::
|
|
648
|
+
|
|
649
|
+
sage: former_solver = default_sdp_solver()
|
|
650
|
+
sage: default_sdp_solver("Cvxopt")
|
|
651
|
+
sage: default_sdp_solver()
|
|
652
|
+
'Cvxopt'
|
|
653
|
+
sage: default_sdp_solver("Yeahhhhhhhhhhh")
|
|
654
|
+
Traceback (most recent call last):
|
|
655
|
+
...
|
|
656
|
+
ValueError: 'solver' should be set to ...
|
|
657
|
+
sage: default_sdp_solver(former_solver)
|
|
658
|
+
sage: from sage.numerical.backends.generic_sdp_backend import GenericSDPBackend
|
|
659
|
+
sage: class my_sdp_solver(GenericSDPBackend): pass
|
|
660
|
+
sage: default_sdp_solver(my_sdp_solver)
|
|
661
|
+
sage: default_sdp_solver() is my_sdp_solver
|
|
662
|
+
True
|
|
663
|
+
"""
|
|
664
|
+
global default_solver
|
|
665
|
+
|
|
666
|
+
if solver is None:
|
|
667
|
+
|
|
668
|
+
if default_solver is not None:
|
|
669
|
+
return default_solver
|
|
670
|
+
|
|
671
|
+
else:
|
|
672
|
+
for s in ["Cvxopt"]:
|
|
673
|
+
try:
|
|
674
|
+
default_sdp_solver(s)
|
|
675
|
+
return s
|
|
676
|
+
except ValueError:
|
|
677
|
+
pass
|
|
678
|
+
|
|
679
|
+
from warnings import warn
|
|
680
|
+
warn("default_sdp_solver set to 'Matrix' (MatrixSDPBackend), which can construct but not solve problems. Install cvxopt for actual solver functionality")
|
|
681
|
+
default_sdp_solver("Matrix")
|
|
682
|
+
|
|
683
|
+
if callable(solver):
|
|
684
|
+
default_solver = solver
|
|
685
|
+
return
|
|
686
|
+
|
|
687
|
+
solver = solver.capitalize()
|
|
688
|
+
|
|
689
|
+
if solver == "Cvxopt":
|
|
690
|
+
try:
|
|
691
|
+
from sage.numerical.backends.cvxopt_sdp_backend import CVXOPTSDPBackend
|
|
692
|
+
default_solver = solver
|
|
693
|
+
except ImportError:
|
|
694
|
+
raise ValueError("CVXOPT is not available. Please refer to the documentation to install it.")
|
|
695
|
+
elif solver == "Matrix":
|
|
696
|
+
default_solver = solver
|
|
697
|
+
|
|
698
|
+
else:
|
|
699
|
+
raise ValueError("'solver' should be set to 'CVXOPT', 'Matrix', a class, or None.")
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
cpdef GenericSDPBackend get_solver(solver=None, base_ring=None):
|
|
703
|
+
"""
|
|
704
|
+
Return a solver according to the given preferences.
|
|
705
|
+
|
|
706
|
+
INPUT:
|
|
707
|
+
|
|
708
|
+
- ``solver`` -- one of the following:
|
|
709
|
+
|
|
710
|
+
- the string ``'CVXOPT'``, designating the use of the CVXOPT solver
|
|
711
|
+
(see the `CVXOPT <http://cvxopt.org/>`_ web site);
|
|
712
|
+
|
|
713
|
+
- a subclass of
|
|
714
|
+
:class:`sage.numerical.backends.generic_sdp_backend.GenericSDPBackend`
|
|
715
|
+
|
|
716
|
+
- ``None`` -- (default) in which case the default solver is used (see
|
|
717
|
+
:func:`default_sdp_solver`)
|
|
718
|
+
|
|
719
|
+
.. SEEALSO::
|
|
720
|
+
|
|
721
|
+
- :func:`default_sdp_solver` -- returns/sets the default SDP solver
|
|
722
|
+
|
|
723
|
+
EXAMPLES::
|
|
724
|
+
|
|
725
|
+
sage: from sage.numerical.backends.generic_sdp_backend import get_solver
|
|
726
|
+
sage: p = get_solver()
|
|
727
|
+
|
|
728
|
+
Passing a class::
|
|
729
|
+
|
|
730
|
+
sage: from sage.numerical.backends.generic_sdp_backend import GenericSDPBackend
|
|
731
|
+
sage: class MockSDPBackend(GenericSDPBackend):
|
|
732
|
+
....: def solve(self):
|
|
733
|
+
....: raise RuntimeError("SDP is too slow")
|
|
734
|
+
sage: P = SemidefiniteProgram(solver=MockSDPBackend)
|
|
735
|
+
sage: P.solve()
|
|
736
|
+
Traceback (most recent call last):
|
|
737
|
+
...
|
|
738
|
+
RuntimeError: SDP is too slow
|
|
739
|
+
"""
|
|
740
|
+
if solver is None:
|
|
741
|
+
solver = default_sdp_solver()
|
|
742
|
+
|
|
743
|
+
if callable(solver):
|
|
744
|
+
return solver(base_ring=base_ring)
|
|
745
|
+
|
|
746
|
+
solver = solver.capitalize()
|
|
747
|
+
|
|
748
|
+
if solver == "Cvxopt":
|
|
749
|
+
from sage.numerical.backends.cvxopt_sdp_backend import CVXOPTSDPBackend
|
|
750
|
+
return CVXOPTSDPBackend(base_ring=base_ring)
|
|
751
|
+
elif solver == "Matrix":
|
|
752
|
+
from sage.numerical.backends.matrix_sdp_backend import MatrixSDPBackend
|
|
753
|
+
return MatrixSDPBackend(base_ring=base_ring)
|
|
754
|
+
else:
|
|
755
|
+
raise ValueError("'solver' should be set to 'CVXOPT', 'Matrix', a class, or None (in which case the default one is used).")
|