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.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. 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).")