scikit-complexity 0.2.0__py3-none-any.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 (1748) hide show
  1. scikit_complexity-0.2.0.dist-info/METADATA +317 -0
  2. scikit_complexity-0.2.0.dist-info/RECORD +1748 -0
  3. scikit_complexity-0.2.0.dist-info/WHEEL +4 -0
  4. scikit_complexity-0.2.0.dist-info/entry_points.txt +4 -0
  5. scikit_complexity-0.2.0.dist-info/licenses/LICENSE +21 -0
  6. skcomplex/__init__.py +1 -0
  7. skcomplex/analysis/__init__.py +101 -0
  8. skcomplex/analysis/_alignment.py +263 -0
  9. skcomplex/analysis/_automata.py +658 -0
  10. skcomplex/analysis/_base.py +841 -0
  11. skcomplex/analysis/_clusters.py +298 -0
  12. skcomplex/analysis/_coarse_grain.py +183 -0
  13. skcomplex/analysis/_collapse.py +318 -0
  14. skcomplex/analysis/_complexity.py +129 -0
  15. skcomplex/analysis/_computational_mechanics.py +220 -0
  16. skcomplex/analysis/_correlation.py +364 -0
  17. skcomplex/analysis/_defects.py +111 -0
  18. skcomplex/analysis/_discovery.py +101 -0
  19. skcomplex/analysis/_displacement.py +135 -0
  20. skcomplex/analysis/_distribution.py +327 -0
  21. skcomplex/analysis/_domains.py +220 -0
  22. skcomplex/analysis/_embedding.py +235 -0
  23. skcomplex/analysis/_emergence.py +503 -0
  24. skcomplex/analysis/_entropy.py +425 -0
  25. skcomplex/analysis/_ergodicity.py +228 -0
  26. skcomplex/analysis/_events.py +301 -0
  27. skcomplex/analysis/_fit.py +368 -0
  28. skcomplex/analysis/_groups.py +205 -0
  29. skcomplex/analysis/_information.py +488 -0
  30. skcomplex/analysis/_invariants.py +409 -0
  31. skcomplex/analysis/_irreversibility.py +421 -0
  32. skcomplex/analysis/_kramers_moyal.py +104 -0
  33. skcomplex/analysis/_large_deviations.py +378 -0
  34. skcomplex/analysis/_linearization.py +231 -0
  35. skcomplex/analysis/_local_information.py +166 -0
  36. skcomplex/analysis/_loops.py +394 -0
  37. skcomplex/analysis/_lyapunov.py +342 -0
  38. skcomplex/analysis/_markov.py +303 -0
  39. skcomplex/analysis/_mode_decomposition.py +209 -0
  40. skcomplex/analysis/_motifs.py +239 -0
  41. skcomplex/analysis/_neighbors.py +303 -0
  42. skcomplex/analysis/_networks.py +286 -0
  43. skcomplex/analysis/_operator.py +312 -0
  44. skcomplex/analysis/_partial_information.py +118 -0
  45. skcomplex/analysis/_passage.py +244 -0
  46. skcomplex/analysis/_recurrence.py +202 -0
  47. skcomplex/analysis/_reservoirs.py +387 -0
  48. skcomplex/analysis/_rolling.py +168 -0
  49. skcomplex/analysis/_scaling.py +370 -0
  50. skcomplex/analysis/_sections.py +225 -0
  51. skcomplex/analysis/_signatures.py +250 -0
  52. skcomplex/analysis/_sparse_identification.py +398 -0
  53. skcomplex/analysis/_spectrum.py +164 -0
  54. skcomplex/analysis/_stability.py +547 -0
  55. skcomplex/analysis/_surrogates.py +127 -0
  56. skcomplex/analysis/_symbolic.py +639 -0
  57. skcomplex/analysis/types.py +43 -0
  58. skcomplex/base.py +159 -0
  59. skcomplex/core/__init__.py +1 -0
  60. skcomplex/core/base.py +150 -0
  61. skcomplex/core/elements/__init__.py +21 -0
  62. skcomplex/core/elements/_base.py +84 -0
  63. skcomplex/core/elements/_compartment.py +52 -0
  64. skcomplex/core/elements/_density.py +52 -0
  65. skcomplex/core/elements/_element.py +80 -0
  66. skcomplex/core/elements/_field.py +192 -0
  67. skcomplex/core/elements/_group.py +241 -0
  68. skcomplex/core/elements/_lattice.py +115 -0
  69. skcomplex/core/elements/_point.py +66 -0
  70. skcomplex/core/interactions/__init__.py +89 -0
  71. skcomplex/core/interactions/_advection.py +134 -0
  72. skcomplex/core/interactions/_base.py +361 -0
  73. skcomplex/core/interactions/_cascade.py +195 -0
  74. skcomplex/core/interactions/_choice.py +320 -0
  75. skcomplex/core/interactions/_conservation.py +164 -0
  76. skcomplex/core/interactions/_coupling.py +741 -0
  77. skcomplex/core/interactions/_crossing.py +136 -0
  78. skcomplex/core/interactions/_diffusion.py +99 -0
  79. skcomplex/core/interactions/_encounter.py +201 -0
  80. skcomplex/core/interactions/_euler_lagrange.py +183 -0
  81. skcomplex/core/interactions/_evolution.py +520 -0
  82. skcomplex/core/interactions/_feedback.py +79 -0
  83. skcomplex/core/interactions/_gradient.py +293 -0
  84. skcomplex/core/interactions/_grouping.py +399 -0
  85. skcomplex/core/interactions/_hamiltonian.py +191 -0
  86. skcomplex/core/interactions/_hyperedge.py +96 -0
  87. skcomplex/core/interactions/_imitation.py +357 -0
  88. skcomplex/core/interactions/_impulse.py +133 -0
  89. skcomplex/core/interactions/_interaction.py +58 -0
  90. skcomplex/core/interactions/_jump.py +201 -0
  91. skcomplex/core/interactions/_life_cycle.py +424 -0
  92. skcomplex/core/interactions/_local_rule.py +134 -0
  93. skcomplex/core/interactions/_map.py +239 -0
  94. skcomplex/core/interactions/_matching.py +701 -0
  95. skcomplex/core/interactions/_movement.py +377 -0
  96. skcomplex/core/interactions/_neighbor.py +88 -0
  97. skcomplex/core/interactions/_optimization.py +206 -0
  98. skcomplex/core/interactions/_pair.py +82 -0
  99. skcomplex/core/interactions/_pair_coupling.py +169 -0
  100. skcomplex/core/interactions/_rate.py +240 -0
  101. skcomplex/core/interactions/_reaction.py +466 -0
  102. skcomplex/core/interactions/_reinforcement.py +226 -0
  103. skcomplex/core/interactions/_relaxation.py +103 -0
  104. skcomplex/core/interactions/_sampling.py +177 -0
  105. skcomplex/core/interactions/_satisfiability.py +145 -0
  106. skcomplex/core/interactions/_sign_adjustment.py +222 -0
  107. skcomplex/core/interactions/_topology.py +215 -0
  108. skcomplex/core/interactions/_training.py +184 -0
  109. skcomplex/core/interactions/_transfer.py +669 -0
  110. skcomplex/core/interactions/_transition.py +427 -0
  111. skcomplex/core/laws/__init__.py +60 -0
  112. skcomplex/core/laws/_base.py +194 -0
  113. skcomplex/core/laws/_bilinear.py +91 -0
  114. skcomplex/core/laws/_boundary.py +59 -0
  115. skcomplex/core/laws/_cascade.py +79 -0
  116. skcomplex/core/laws/_crossing.py +87 -0
  117. skcomplex/core/laws/_dissipator.py +79 -0
  118. skcomplex/core/laws/_drive.py +56 -0
  119. skcomplex/core/laws/_emission.py +81 -0
  120. skcomplex/core/laws/_encounter.py +96 -0
  121. skcomplex/core/laws/_equation.py +105 -0
  122. skcomplex/core/laws/_extremal.py +94 -0
  123. skcomplex/core/laws/_flux.py +108 -0
  124. skcomplex/core/laws/_fractional_noise.py +65 -0
  125. skcomplex/core/laws/_generator.py +66 -0
  126. skcomplex/core/laws/_gradient_step.py +89 -0
  127. skcomplex/core/laws/_jump.py +137 -0
  128. skcomplex/core/laws/_local_rule.py +92 -0
  129. skcomplex/core/laws/_match.py +321 -0
  130. skcomplex/core/laws/_noise.py +125 -0
  131. skcomplex/core/laws/_rate.py +82 -0
  132. skcomplex/core/laws/_rule.py +82 -0
  133. skcomplex/core/laws/_sample.py +65 -0
  134. skcomplex/core/laws/_transfer.py +165 -0
  135. skcomplex/core/laws/_transition.py +77 -0
  136. skcomplex/core/laws/_update.py +121 -0
  137. skcomplex/core/laws/utils/__init__.py +142 -0
  138. skcomplex/core/laws/utils/_agents.py +127 -0
  139. skcomplex/core/laws/utils/_components.py +63 -0
  140. skcomplex/core/laws/utils/_conditions.py +198 -0
  141. skcomplex/core/laws/utils/_contractions.py +74 -0
  142. skcomplex/core/laws/utils/_delays.py +170 -0
  143. skcomplex/core/laws/utils/_history.py +167 -0
  144. skcomplex/core/laws/utils/_local_operators.py +68 -0
  145. skcomplex/core/laws/utils/_lookups.py +40 -0
  146. skcomplex/core/laws/utils/_moments.py +122 -0
  147. skcomplex/core/laws/utils/_operators.py +237 -0
  148. skcomplex/core/laws/utils/_phase.py +126 -0
  149. skcomplex/core/laws/utils/_pointwise.py +160 -0
  150. skcomplex/core/laws/utils/_reductions.py +942 -0
  151. skcomplex/core/laws/utils/_signals.py +214 -0
  152. skcomplex/core/laws/utils/_tables.py +4 -0
  153. skcomplex/core/laws/utils/_tensors.py +235 -0
  154. skcomplex/core/spaces/__init__.py +52 -0
  155. skcomplex/core/spaces/_adjacency.py +34 -0
  156. skcomplex/core/spaces/_base.py +218 -0
  157. skcomplex/core/spaces/_box.py +41 -0
  158. skcomplex/core/spaces/_cayley.py +352 -0
  159. skcomplex/core/spaces/_cone.py +65 -0
  160. skcomplex/core/spaces/_continuous.py +93 -0
  161. skcomplex/core/spaces/_continuous_time.py +27 -0
  162. skcomplex/core/spaces/_discrete_time.py +53 -0
  163. skcomplex/core/spaces/_generator.py +51 -0
  164. skcomplex/core/spaces/_lattice.py +194 -0
  165. skcomplex/core/spaces/_lattice_neighborhood.py +50 -0
  166. skcomplex/core/spaces/_memory.py +45 -0
  167. skcomplex/core/spaces/_mesh.py +71 -0
  168. skcomplex/core/spaces/_moore.py +49 -0
  169. skcomplex/core/spaces/_nearest.py +41 -0
  170. skcomplex/core/spaces/_network.py +256 -0
  171. skcomplex/core/spaces/_phase.py +136 -0
  172. skcomplex/core/spaces/_radius.py +40 -0
  173. skcomplex/core/spaces/_static_time.py +34 -0
  174. skcomplex/core/spaces/_triangular.py +37 -0
  175. skcomplex/core/spaces/_von_neumann.py +51 -0
  176. skcomplex/core/specs/__init__.py +25 -0
  177. skcomplex/core/specs/_census_record_spec.py +72 -0
  178. skcomplex/core/specs/_census_spec.py +40 -0
  179. skcomplex/core/specs/_compiled_agents_spec.py +62 -0
  180. skcomplex/core/specs/_compiled_element_spec.py +59 -0
  181. skcomplex/core/specs/_compiled_interaction_spec.py +33 -0
  182. skcomplex/core/specs/_lattice_context_spec.py +40 -0
  183. skcomplex/core/specs/_lattice_state_spec.py +49 -0
  184. skcomplex/core/specs/_node_spec.py +64 -0
  185. skcomplex/core/specs/_operator_view_spec.py +135 -0
  186. skcomplex/core/specs/_scenario_spec.py +45 -0
  187. skcomplex/core/specs/_subsystem_spec.py +24 -0
  188. skcomplex/core/system.py +140 -0
  189. skcomplex/core/types.py +249 -0
  190. skcomplex/engine/__init__.py +5 -0
  191. skcomplex/engine/_utils.py +278 -0
  192. skcomplex/engine/backends/__init__.py +13 -0
  193. skcomplex/engine/backends/_base.py +329 -0
  194. skcomplex/engine/backends/_jax.py +285 -0
  195. skcomplex/engine/backends/_numba.py +601 -0
  196. skcomplex/engine/backends/_numba_components.py +67 -0
  197. skcomplex/engine/backends/_numba_loops.py +163 -0
  198. skcomplex/engine/backends/_numba_neighbours.py +435 -0
  199. skcomplex/engine/backends/_numba_printer.py +1023 -0
  200. skcomplex/engine/backends/_numba_stencils.py +66 -0
  201. skcomplex/engine/backends/_numpy.py +215 -0
  202. skcomplex/engine/compile/__init__.py +27 -0
  203. skcomplex/engine/compile/_base.py +582 -0
  204. skcomplex/engine/compile/_bound_renewal_spec.py +47 -0
  205. skcomplex/engine/compile/_compilation.py +351 -0
  206. skcomplex/engine/compile/_compile.py +100 -0
  207. skcomplex/engine/compile/_complex.py +216 -0
  208. skcomplex/engine/compile/_draw_lowering.py +373 -0
  209. skcomplex/engine/compile/_field_lowering.py +1668 -0
  210. skcomplex/engine/compile/_flows.py +691 -0
  211. skcomplex/engine/compile/_forms.py +48 -0
  212. skcomplex/engine/compile/_laws.py +42 -0
  213. skcomplex/engine/compile/_learning_compiler.py +481 -0
  214. skcomplex/engine/compile/_member_reductions.py +206 -0
  215. skcomplex/engine/compile/_members.py +244 -0
  216. skcomplex/engine/compile/_observables.py +940 -0
  217. skcomplex/engine/compile/_observer.py +185 -0
  218. skcomplex/engine/compile/_pass_compiler.py +1534 -0
  219. skcomplex/engine/compile/_probe.py +78 -0
  220. skcomplex/engine/compile/_renewal_law.py +70 -0
  221. skcomplex/engine/compile/passes/__init__.py +34 -0
  222. skcomplex/engine/compile/passes/_agents.py +111 -0
  223. skcomplex/engine/compile/passes/_agents_problem.py +143 -0
  224. skcomplex/engine/compile/passes/_census.py +808 -0
  225. skcomplex/engine/compile/passes/_check_fractional_noise.py +107 -0
  226. skcomplex/engine/compile/passes/_collect.py +31 -0
  227. skcomplex/engine/compile/passes/_compile_encounters.py +301 -0
  228. skcomplex/engine/compile/passes/_complex.py +198 -0
  229. skcomplex/engine/compile/passes/_conserved_noise.py +224 -0
  230. skcomplex/engine/compile/passes/_core.py +116 -0
  231. skcomplex/engine/compile/passes/_declare_renewals.py +84 -0
  232. skcomplex/engine/compile/passes/_draws.py +29 -0
  233. skcomplex/engine/compile/passes/_encounter_functions.py +60 -0
  234. skcomplex/engine/compile/passes/_encounter_jacobian.py +25 -0
  235. skcomplex/engine/compile/passes/_encounter_problem.py +32 -0
  236. skcomplex/engine/compile/passes/_events.py +204 -0
  237. skcomplex/engine/compile/passes/_expand_flows.py +32 -0
  238. skcomplex/engine/compile/passes/_field_functions.py +647 -0
  239. skcomplex/engine/compile/passes/_field_jacobian.py +38 -0
  240. skcomplex/engine/compile/passes/_field_problem.py +106 -0
  241. skcomplex/engine/compile/passes/_flatten.py +339 -0
  242. skcomplex/engine/compile/passes/_flows_problem.py +29 -0
  243. skcomplex/engine/compile/passes/_form.py +82 -0
  244. skcomplex/engine/compile/passes/_fractional_form.py +172 -0
  245. skcomplex/engine/compile/passes/_fractional_problem.py +91 -0
  246. skcomplex/engine/compile/passes/_functions.py +485 -0
  247. skcomplex/engine/compile/passes/_hilbert_space_error.py +10 -0
  248. skcomplex/engine/compile/passes/_hyperedges.py +598 -0
  249. skcomplex/engine/compile/passes/_jacobian.py +38 -0
  250. skcomplex/engine/compile/passes/_kernels.py +407 -0
  251. skcomplex/engine/compile/passes/_lattices.py +818 -0
  252. skcomplex/engine/compile/passes/_layout.py +667 -0
  253. skcomplex/engine/compile/passes/_lower_fields.py +225 -0
  254. skcomplex/engine/compile/passes/_lower_flows.py +28 -0
  255. skcomplex/engine/compile/passes/_markov.py +329 -0
  256. skcomplex/engine/compile/passes/_mask_requests.py +121 -0
  257. skcomplex/engine/compile/passes/_members.py +30 -0
  258. skcomplex/engine/compile/passes/_noise.py +196 -0
  259. skcomplex/engine/compile/passes/_operator_compiler.py +843 -0
  260. skcomplex/engine/compile/passes/_orders.py +409 -0
  261. skcomplex/engine/compile/passes/_owners.py +90 -0
  262. skcomplex/engine/compile/passes/_particles.py +69 -0
  263. skcomplex/engine/compile/passes/_plan.py +130 -0
  264. skcomplex/engine/compile/passes/_problem.py +802 -0
  265. skcomplex/engine/compile/passes/_reduction_lowering.py +1193 -0
  266. skcomplex/engine/compile/passes/_reductions.py +84 -0
  267. skcomplex/engine/compile/passes/_renewal_problem.py +357 -0
  268. skcomplex/engine/compile/passes/_request_jumps.py +51 -0
  269. skcomplex/engine/compile/passes/_residences.py +140 -0
  270. skcomplex/engine/compile/passes/_rows.py +162 -0
  271. skcomplex/engine/compile/passes/_set_renewals_apart.py +29 -0
  272. skcomplex/engine/compile/passes/_set_rules_apart.py +28 -0
  273. skcomplex/engine/compile/passes/_specs.py +1317 -0
  274. skcomplex/engine/compile/passes/_split_requests.py +44 -0
  275. skcomplex/engine/compile/passes/_topology_functions.py +265 -0
  276. skcomplex/engine/compile/passes/_topology_problem.py +27 -0
  277. skcomplex/engine/compile/passes/_towards.py +66 -0
  278. skcomplex/engine/compile/passes/_unpack_matches.py +29 -0
  279. skcomplex/engine/compile/passes/_unpack_renewals.py +41 -0
  280. skcomplex/engine/problems/__init__.py +61 -0
  281. skcomplex/engine/problems/_base.py +150 -0
  282. skcomplex/engine/problems/_base_problem_spec.py +153 -0
  283. skcomplex/engine/problems/_block_spec.py +48 -0
  284. skcomplex/engine/problems/_born_spec.py +24 -0
  285. skcomplex/engine/problems/_cascade_kernel.py +134 -0
  286. skcomplex/engine/problems/_collision_kernel.py +147 -0
  287. skcomplex/engine/problems/_compiled_delay_spec.py +21 -0
  288. skcomplex/engine/problems/_compiled_request_spec.py +46 -0
  289. skcomplex/engine/problems/_control_problem_spec.py +90 -0
  290. skcomplex/engine/problems/_declarations_spec.py +126 -0
  291. skcomplex/engine/problems/_delayed_state_spec.py +50 -0
  292. skcomplex/engine/problems/_diffusive_limit_spec.py +50 -0
  293. skcomplex/engine/problems/_draw_kernel.py +128 -0
  294. skcomplex/engine/problems/_drive_kernel.py +65 -0
  295. skcomplex/engine/problems/_dynamics_spec.py +28 -0
  296. skcomplex/engine/problems/_edge_row_search.py +78 -0
  297. skcomplex/engine/problems/_edge_search.py +64 -0
  298. skcomplex/engine/problems/_encounter_kernel.py +200 -0
  299. skcomplex/engine/problems/_event_kernel.py +70 -0
  300. skcomplex/engine/problems/_expression_printer.py +410 -0
  301. skcomplex/engine/problems/_extremal_kernel.py +125 -0
  302. skcomplex/engine/problems/_field_operator_kernel.py +105 -0
  303. skcomplex/engine/problems/_finite_volume_kernel.py +423 -0
  304. skcomplex/engine/problems/_flow_term_spec.py +45 -0
  305. skcomplex/engine/problems/_frame_spec.py +105 -0
  306. skcomplex/engine/problems/_jacobian_kernel.py +575 -0
  307. skcomplex/engine/problems/_kernel_spec.py +130 -0
  308. skcomplex/engine/problems/_kinetic_problem_spec.py +23 -0
  309. skcomplex/engine/problems/_law_kernel.py +604 -0
  310. skcomplex/engine/problems/_learning_problem_spec.py +67 -0
  311. skcomplex/engine/problems/_linear_term_spec.py +50 -0
  312. skcomplex/engine/problems/_loop_term_spec.py +44 -0
  313. skcomplex/engine/problems/_lowered_kernels_spec.py +59 -0
  314. skcomplex/engine/problems/_markov_kernel.py +68 -0
  315. skcomplex/engine/problems/_metric_search.py +155 -0
  316. skcomplex/engine/problems/_monte_carlo_kernel.py +213 -0
  317. skcomplex/engine/problems/_neighborhood_kernel.py +594 -0
  318. skcomplex/engine/problems/_noise_term_spec.py +26 -0
  319. skcomplex/engine/problems/_observed_spec.py +22 -0
  320. skcomplex/engine/problems/_operator_kernel.py +102 -0
  321. skcomplex/engine/problems/_operator_lowering.py +323 -0
  322. skcomplex/engine/problems/_operator_problem_spec.py +138 -0
  323. skcomplex/engine/problems/_output_spec.py +78 -0
  324. skcomplex/engine/problems/_pair_search.py +86 -0
  325. skcomplex/engine/problems/_partials_spec.py +27 -0
  326. skcomplex/engine/problems/_partition_spec.py +39 -0
  327. skcomplex/engine/problems/_printed_spec.py +24 -0
  328. skcomplex/engine/problems/_problem_functions_spec.py +102 -0
  329. skcomplex/engine/problems/_problem_spec.py +365 -0
  330. skcomplex/engine/problems/_random_stream.py +49 -0
  331. skcomplex/engine/problems/_record_spec.py +22 -0
  332. skcomplex/engine/problems/_recorded_spec.py +21 -0
  333. skcomplex/engine/problems/_reduction_kernel.py +254 -0
  334. skcomplex/engine/problems/_reduction_schedule_spec.py +97 -0
  335. skcomplex/engine/problems/_reference_spec.py +114 -0
  336. skcomplex/engine/problems/_relation_spec.py +29 -0
  337. skcomplex/engine/problems/_renewal_kernel.py +250 -0
  338. skcomplex/engine/problems/_request_spec.py +27 -0
  339. skcomplex/engine/problems/_rule_kernel.py +227 -0
  340. skcomplex/engine/problems/_set_symbol_spec.py +28 -0
  341. skcomplex/engine/problems/_source_loader.py +113 -0
  342. skcomplex/engine/problems/_static_search.py +42 -0
  343. skcomplex/engine/problems/_steps.py +39 -0
  344. skcomplex/engine/problems/_sweep_spec.py +26 -0
  345. skcomplex/engine/problems/_symmetry_spec.py +29 -0
  346. skcomplex/engine/problems/_too_dense.py +8 -0
  347. skcomplex/engine/problems/_topology_kernel.py +589 -0
  348. skcomplex/engine/problems/_transfer_network.py +4 -0
  349. skcomplex/engine/problems/_transfer_network_spec.py +50 -0
  350. skcomplex/engine/problems/_transfer_state_spec.py +68 -0
  351. skcomplex/engine/runtime/__init__.py +22 -0
  352. skcomplex/engine/runtime/_as_fast_as_possible.py +17 -0
  353. skcomplex/engine/runtime/_base.py +137 -0
  354. skcomplex/engine/runtime/_conservation.py +125 -0
  355. skcomplex/engine/runtime/_invariants.py +100 -0
  356. skcomplex/engine/runtime/_real_time.py +55 -0
  357. skcomplex/engine/runtime/_recorder.py +84 -0
  358. skcomplex/engine/runtime/_simulations.py +665 -0
  359. skcomplex/engine/runtime/_trajectories.py +314 -0
  360. skcomplex/engine/solvers/__init__.py +95 -0
  361. skcomplex/engine/solvers/_base.py +372 -0
  362. skcomplex/engine/solvers/_caputo.py +194 -0
  363. skcomplex/engine/solvers/_collocation.py +334 -0
  364. skcomplex/engine/solvers/_convolution.py +155 -0
  365. skcomplex/engine/solvers/_cosimulation.py +400 -0
  366. skcomplex/engine/solvers/_crank_nicolson.py +32 -0
  367. skcomplex/engine/solvers/_defaults.py +34 -0
  368. skcomplex/engine/solvers/_etdrk4.py +86 -0
  369. skcomplex/engine/solvers/_euler_maruyama.py +161 -0
  370. skcomplex/engine/solvers/_event_locator.py +249 -0
  371. skcomplex/engine/solvers/_external.py +94 -0
  372. skcomplex/engine/solvers/_fractional_abm.py +126 -0
  373. skcomplex/engine/solvers/_fractional_euler_maruyama.py +322 -0
  374. skcomplex/engine/solvers/_gillespie.py +135 -0
  375. skcomplex/engine/solvers/_gradient_descent.py +353 -0
  376. skcomplex/engine/solvers/_grunwald_letnikov.py +83 -0
  377. skcomplex/engine/solvers/_heun.py +89 -0
  378. skcomplex/engine/solvers/_history.py +184 -0
  379. skcomplex/engine/solvers/_horizon_error.py +10 -0
  380. skcomplex/engine/solvers/_imex2.py +40 -0
  381. skcomplex/engine/solvers/_imex_euler.py +35 -0
  382. skcomplex/engine/solvers/_jump_trajectories.py +98 -0
  383. skcomplex/engine/solvers/_kinetics.py +242 -0
  384. skcomplex/engine/solvers/_l1.py +91 -0
  385. skcomplex/engine/solvers/_lammps.py +745 -0
  386. skcomplex/engine/solvers/_lammps_fix_spec.py +41 -0
  387. skcomplex/engine/solvers/_lattice.py +79 -0
  388. skcomplex/engine/solvers/_lindblad.py +70 -0
  389. skcomplex/engine/solvers/_maps.py +105 -0
  390. skcomplex/engine/solvers/_mesa.py +1624 -0
  391. skcomplex/engine/solvers/_milstein.py +93 -0
  392. skcomplex/engine/solvers/_monte_carlo.py +43 -0
  393. skcomplex/engine/solvers/_operator.py +212 -0
  394. skcomplex/engine/solvers/_optimal_control.py +368 -0
  395. skcomplex/engine/solvers/_pontryagin.py +298 -0
  396. skcomplex/engine/solvers/_renewal.py +90 -0
  397. skcomplex/engine/solvers/_renewals.py +190 -0
  398. skcomplex/engine/solvers/_rk4.py +263 -0
  399. skcomplex/engine/solvers/_root.py +176 -0
  400. skcomplex/engine/solvers/_rows.py +49 -0
  401. skcomplex/engine/solvers/_scipy_ode.py +602 -0
  402. skcomplex/engine/solvers/_sde.py +164 -0
  403. skcomplex/engine/solvers/_semi_lagrangian.py +213 -0
  404. skcomplex/engine/solvers/_solver.py +159 -0
  405. skcomplex/engine/solvers/_split.py +394 -0
  406. skcomplex/engine/solvers/_ssprk.py +147 -0
  407. skcomplex/engine/solvers/_strang_splitting.py +178 -0
  408. skcomplex/engine/solvers/_unitary.py +68 -0
  409. skcomplex/engine/solvers/_velocity_verlet.py +171 -0
  410. skcomplex/engine/solvers/_yoshida4.py +242 -0
  411. skcomplex/engine/types.py +90 -0
  412. skcomplex/engine/viz/__init__.py +35 -0
  413. skcomplex/engine/viz/_agents.py +223 -0
  414. skcomplex/engine/viz/_axes.py +146 -0
  415. skcomplex/engine/viz/_base.py +365 -0
  416. skcomplex/engine/viz/_bodies.py +334 -0
  417. skcomplex/engine/viz/_cayley.py +133 -0
  418. skcomplex/engine/viz/_expectation.py +208 -0
  419. skcomplex/engine/viz/_histograms.py +218 -0
  420. skcomplex/engine/viz/_images.py +307 -0
  421. skcomplex/engine/viz/_matrices.py +141 -0
  422. skcomplex/engine/viz/_meshes.py +149 -0
  423. skcomplex/engine/viz/_points.py +238 -0
  424. skcomplex/engine/viz/_rerun.py +527 -0
  425. skcomplex/engine/viz/_rings.py +127 -0
  426. skcomplex/engine/viz/_scalars.py +129 -0
  427. skcomplex/engine/viz/_sites.py +228 -0
  428. skcomplex/errors.py +112 -0
  429. skcomplex/experiments/__init__.py +36 -0
  430. skcomplex/experiments/_base.py +373 -0
  431. skcomplex/experiments/_basin_stability.py +153 -0
  432. skcomplex/experiments/_calibration.py +194 -0
  433. skcomplex/experiments/_experiment.py +327 -0
  434. skcomplex/experiments/_grid.py +36 -0
  435. skcomplex/experiments/_latin_hypercube.py +44 -0
  436. skcomplex/experiments/_morris.py +50 -0
  437. skcomplex/experiments/_one_at_a_time.py +28 -0
  438. skcomplex/experiments/_orbit_diagram.py +146 -0
  439. skcomplex/experiments/_random.py +44 -0
  440. skcomplex/experiments/_results.py +148 -0
  441. skcomplex/experiments/_rows.py +45 -0
  442. skcomplex/experiments/_saltelli.py +50 -0
  443. skcomplex/experiments/_sensitivity.py +122 -0
  444. skcomplex/experiments/_sobol.py +43 -0
  445. skcomplex/experiments/specs/__init__.py +1 -0
  446. skcomplex/experiments/specs/_task_spec.py +78 -0
  447. skcomplex/experiments/types.py +14 -0
  448. skcomplex/models/__init__.py +18 -0
  449. skcomplex/models/_catalog.py +243 -0
  450. skcomplex/models/_model_catalog.py +270 -0
  451. skcomplex/models/_model_entry.py +170 -0
  452. skcomplex/models/_model_listing.py +38 -0
  453. skcomplex/models/biology/__init__.py +1 -0
  454. skcomplex/models/biology/collective_behaviour/__init__.py +48 -0
  455. skcomplex/models/biology/collective_behaviour/_alarm.py +99 -0
  456. skcomplex/models/biology/collective_behaviour/_ant.py +101 -0
  457. skcomplex/models/biology/collective_behaviour/_ant_view.py +24 -0
  458. skcomplex/models/biology/collective_behaviour/_boid.py +104 -0
  459. skcomplex/models/biology/collective_behaviour/_boid_view.py +25 -0
  460. skcomplex/models/biology/collective_behaviour/_branch.py +41 -0
  461. skcomplex/models/biology/collective_behaviour/_decisions.py +149 -0
  462. skcomplex/models/biology/collective_behaviour/_flight.py +52 -0
  463. skcomplex/models/biology/collective_behaviour/_flocking.py +75 -0
  464. skcomplex/models/biology/collective_behaviour/_flocks.py +169 -0
  465. skcomplex/models/biology/collective_behaviour/_foraging.py +232 -0
  466. skcomplex/models/biology/collective_behaviour/_ground.py +67 -0
  467. skcomplex/models/biology/collective_behaviour/_leadership.py +207 -0
  468. skcomplex/models/biology/collective_behaviour/_morse_potential.py +87 -0
  469. skcomplex/models/biology/collective_behaviour/_pheromone.py +55 -0
  470. skcomplex/models/biology/collective_behaviour/_rats.py +41 -0
  471. skcomplex/models/biology/collective_behaviour/_schooling.py +102 -0
  472. skcomplex/models/biology/collective_behaviour/_self_propulsion.py +64 -0
  473. skcomplex/models/biology/collective_behaviour/_shoal_member_view.py +25 -0
  474. skcomplex/models/biology/collective_behaviour/_swimming.py +66 -0
  475. skcomplex/models/biology/collective_behaviour/_trail_choice.py +105 -0
  476. skcomplex/models/biology/collective_behaviour/_trails.py +245 -0
  477. skcomplex/models/biology/collective_behaviour/_walker.py +97 -0
  478. skcomplex/models/biology/collective_behaviour/_walker_view.py +23 -0
  479. skcomplex/models/biology/common/__init__.py +3 -0
  480. skcomplex/models/biology/common/excitable/__init__.py +7 -0
  481. skcomplex/models/biology/common/excitable/_fitzhugh_nagumo.py +121 -0
  482. skcomplex/models/biology/common/kinetics/__init__.py +7 -0
  483. skcomplex/models/biology/common/kinetics/_michaelis_menten.py +137 -0
  484. skcomplex/models/biology/common/networks/__init__.py +9 -0
  485. skcomplex/models/biology/common/networks/_edge_draw.py +95 -0
  486. skcomplex/models/biology/common/networks/_weighted_edge.py +48 -0
  487. skcomplex/models/biology/common/pharmacokinetics/__init__.py +7 -0
  488. skcomplex/models/biology/common/pharmacokinetics/_dosing.py +125 -0
  489. skcomplex/models/biology/common/populations/__init__.py +19 -0
  490. skcomplex/models/biology/common/populations/_exponential_growth.py +66 -0
  491. skcomplex/models/biology/common/populations/_gompertz_growth.py +75 -0
  492. skcomplex/models/biology/common/populations/_growth.py +176 -0
  493. skcomplex/models/biology/common/populations/_logistic_growth.py +92 -0
  494. skcomplex/models/biology/common/populations/_mortality.py +69 -0
  495. skcomplex/models/biology/common/populations/_population.py +41 -0
  496. skcomplex/models/biology/common/populations/_power_law_growth.py +71 -0
  497. skcomplex/models/biology/common/stigmergy/__init__.py +7 -0
  498. skcomplex/models/biology/common/stigmergy/_evaporation.py +95 -0
  499. skcomplex/models/biology/ecology/__init__.py +128 -0
  500. skcomplex/models/biology/ecology/_abundance.py +52 -0
  501. skcomplex/models/biology/ecology/_agent_predation.py +170 -0
  502. skcomplex/models/biology/ecology/_cell_quota.py +163 -0
  503. skcomplex/models/biology/ecology/_clustering.py +96 -0
  504. skcomplex/models/biology/ecology/_communities.py +234 -0
  505. skcomplex/models/biology/ecology/_competition.py +95 -0
  506. skcomplex/models/biology/ecology/_cow.py +49 -0
  507. skcomplex/models/biology/ecology/_cow_view.py +15 -0
  508. skcomplex/models/biology/ecology/_emotion_marks.py +65 -0
  509. skcomplex/models/biology/ecology/_factories.py +322 -0
  510. skcomplex/models/biology/ecology/_forager.py +116 -0
  511. skcomplex/models/biology/ecology/_forager_view.py +25 -0
  512. skcomplex/models/biology/ecology/_fronts.py +128 -0
  513. skcomplex/models/biology/ecology/_generalized_lotka_volterra.py +66 -0
  514. skcomplex/models/biology/ecology/_grass.py +96 -0
  515. skcomplex/models/biology/ecology/_grass_view.py +17 -0
  516. skcomplex/models/biology/ecology/_grazing.py +66 -0
  517. skcomplex/models/biology/ecology/_habitat_patch.py +49 -0
  518. skcomplex/models/biology/ecology/_herding.py +84 -0
  519. skcomplex/models/biology/ecology/_higher_order.py +102 -0
  520. skcomplex/models/biology/ecology/_hopping.py +68 -0
  521. skcomplex/models/biology/ecology/_instability.py +180 -0
  522. skcomplex/models/biology/ecology/_linear_growth.py +70 -0
  523. skcomplex/models/biology/ecology/_meadow.py +102 -0
  524. skcomplex/models/biology/ecology/_microbe.py +47 -0
  525. skcomplex/models/biology/ecology/_microbial_communities.py +90 -0
  526. skcomplex/models/biology/ecology/_mutualism.py +81 -0
  527. skcomplex/models/biology/ecology/_neutral.py +144 -0
  528. skcomplex/models/biology/ecology/_neutral_replacement.py +54 -0
  529. skcomplex/models/biology/ecology/_organism.py +63 -0
  530. skcomplex/models/biology/ecology/_organism_view.py +15 -0
  531. skcomplex/models/biology/ecology/_parasitism.py +78 -0
  532. skcomplex/models/biology/ecology/_pasture.py +83 -0
  533. skcomplex/models/biology/ecology/_pasture_view.py +16 -0
  534. skcomplex/models/biology/ecology/_pioneer_growth.py +101 -0
  535. skcomplex/models/biology/ecology/_plant.py +56 -0
  536. skcomplex/models/biology/ecology/_plant_view.py +16 -0
  537. skcomplex/models/biology/ecology/_predation.py +290 -0
  538. skcomplex/models/biology/ecology/_predation_interaction.py +71 -0
  539. skcomplex/models/biology/ecology/_predator.py +63 -0
  540. skcomplex/models/biology/ecology/_predator_prey_events.py +120 -0
  541. skcomplex/models/biology/ecology/_predator_view.py +17 -0
  542. skcomplex/models/biology/ecology/_prey.py +52 -0
  543. skcomplex/models/biology/ecology/_prey_view.py +15 -0
  544. skcomplex/models/biology/ecology/_rosenzweig_macarthur.py +91 -0
  545. skcomplex/models/biology/ecology/_seasonal_logistic_growth.py +71 -0
  546. skcomplex/models/biology/ecology/_sequential.py +114 -0
  547. skcomplex/models/biology/ecology/_sheep.py +63 -0
  548. skcomplex/models/biology/ecology/_sheep_view.py +17 -0
  549. skcomplex/models/biology/ecology/_speciation.py +71 -0
  550. skcomplex/models/biology/ecology/_stand.py +47 -0
  551. skcomplex/models/biology/ecology/_stigmergic_predator.py +98 -0
  552. skcomplex/models/biology/ecology/_stigmergic_prey.py +54 -0
  553. skcomplex/models/biology/ecology/_stigmergy.py +413 -0
  554. skcomplex/models/biology/ecology/_succession.py +92 -0
  555. skcomplex/models/biology/ecology/_successional_growth.py +88 -0
  556. skcomplex/models/biology/ecology/_triplet.py +55 -0
  557. skcomplex/models/biology/ecology/_wolf.py +63 -0
  558. skcomplex/models/biology/ecology/_wolf_sheep.py +156 -0
  559. skcomplex/models/biology/ecology/_wolf_view.py +17 -0
  560. skcomplex/models/biology/epidemiology/__init__.py +53 -0
  561. skcomplex/models/biology/epidemiology/_active_host.py +61 -0
  562. skcomplex/models/biology/epidemiology/_adaptive.py +316 -0
  563. skcomplex/models/biology/epidemiology/_agents.py +484 -0
  564. skcomplex/models/biology/epidemiology/_carrier.py +66 -0
  565. skcomplex/models/biology/epidemiology/_degree_class.py +65 -0
  566. skcomplex/models/biology/epidemiology/_factories.py +186 -0
  567. skcomplex/models/biology/epidemiology/_host.py +49 -0
  568. skcomplex/models/biology/epidemiology/_immunity_loss.py +84 -0
  569. skcomplex/models/biology/epidemiology/_infection.py +93 -0
  570. skcomplex/models/biology/epidemiology/_networks.py +170 -0
  571. skcomplex/models/biology/epidemiology/_outbreaks.py +216 -0
  572. skcomplex/models/biology/epidemiology/_person.py +103 -0
  573. skcomplex/models/biology/epidemiology/_person_view.py +23 -0
  574. skcomplex/models/biology/epidemiology/_recovery.py +92 -0
  575. skcomplex/models/biology/epidemiology/_recurrent.py +149 -0
  576. skcomplex/models/biology/epidemiology/_spreading.py +144 -0
  577. skcomplex/models/biology/epidemiology/_subpopulation.py +92 -0
  578. skcomplex/models/biology/epidemiology/_traveller.py +65 -0
  579. skcomplex/models/biology/epidemiology/_traveller_view.py +17 -0
  580. skcomplex/models/biology/epidemiology/_vaccination.py +184 -0
  581. skcomplex/models/biology/epidemiology/_walker.py +66 -0
  582. skcomplex/models/biology/epidemiology/_walker_view.py +17 -0
  583. skcomplex/models/biology/evolution/__init__.py +60 -0
  584. skcomplex/models/biology/evolution/_adaptive_climbing.py +106 -0
  585. skcomplex/models/biology/evolution/_catalysis.py +76 -0
  586. skcomplex/models/biology/evolution/_catalytic_link.py +21 -0
  587. skcomplex/models/biology/evolution/_chemical.py +111 -0
  588. skcomplex/models/biology/evolution/_climber.py +125 -0
  589. skcomplex/models/biology/evolution/_climber_view.py +19 -0
  590. skcomplex/models/biology/evolution/_coevolution.py +148 -0
  591. skcomplex/models/biology/evolution/_cyclic_species.py +44 -0
  592. skcomplex/models/biology/evolution/_dependency_field.py +56 -0
  593. skcomplex/models/biology/evolution/_finite_populations.py +287 -0
  594. skcomplex/models/biology/evolution/_games.py +143 -0
  595. skcomplex/models/biology/evolution/_genotype_class.py +42 -0
  596. skcomplex/models/biology/evolution/_individual.py +54 -0
  597. skcomplex/models/biology/evolution/_individual_view.py +16 -0
  598. skcomplex/models/biology/evolution/_locus.py +47 -0
  599. skcomplex/models/biology/evolution/_master_sequence.py +55 -0
  600. skcomplex/models/biology/evolution/_molecule.py +47 -0
  601. skcomplex/models/biology/evolution/_moran_step.py +83 -0
  602. skcomplex/models/biology/evolution/_networks.py +194 -0
  603. skcomplex/models/biology/evolution/_prebiotic.py +169 -0
  604. skcomplex/models/biology/evolution/_replicator.py +109 -0
  605. skcomplex/models/biology/evolution/_strategy.py +42 -0
  606. skcomplex/models/biology/evolution/_substitution.py +113 -0
  607. skcomplex/models/biology/evolution/_substitutions.py +126 -0
  608. skcomplex/models/biology/evolution/_tangled_nature_life_cycle.py +159 -0
  609. skcomplex/models/biology/evolution/_taxon.py +49 -0
  610. skcomplex/models/biology/neuroscience/__init__.py +63 -0
  611. skcomplex/models/biology/neuroscience/_conductances.py +193 -0
  612. skcomplex/models/biology/neuroscience/_delayed_synapse.py +70 -0
  613. skcomplex/models/biology/neuroscience/_excitable.py +178 -0
  614. skcomplex/models/biology/neuroscience/_fitz_hugh_nagumo_neuron.py +46 -0
  615. skcomplex/models/biology/neuroscience/_global_inhibition.py +71 -0
  616. skcomplex/models/biology/neuroscience/_hodgkin_huxley.py +103 -0
  617. skcomplex/models/biology/neuroscience/_inhibitor.py +62 -0
  618. skcomplex/models/biology/neuroscience/_inhibitor_drive.py +61 -0
  619. skcomplex/models/biology/neuroscience/_izhikevich.py +77 -0
  620. skcomplex/models/biology/neuroscience/_leaky_integrate_and_fire.py +80 -0
  621. skcomplex/models/biology/neuroscience/_mutual_inhibition.py +55 -0
  622. skcomplex/models/biology/neuroscience/_networks.py +235 -0
  623. skcomplex/models/biology/neuroscience/_neural_field_site.py +66 -0
  624. skcomplex/models/biology/neuroscience/_neural_fields.py +94 -0
  625. skcomplex/models/biology/neuroscience/_neurons.py +129 -0
  626. skcomplex/models/biology/neuroscience/_polyhomeostatic_neuron.py +93 -0
  627. skcomplex/models/biology/neuroscience/_populations.py +333 -0
  628. skcomplex/models/biology/neuroscience/_pulse_coupling.py +71 -0
  629. skcomplex/models/biology/neuroscience/_rate_unit.py +67 -0
  630. skcomplex/models/biology/neuroscience/_spike_reset.py +95 -0
  631. skcomplex/models/biology/neuroscience/_spiking_neuron.py +67 -0
  632. skcomplex/models/biology/neuroscience/_synapses.py +226 -0
  633. skcomplex/models/biology/neuroscience/_terman_wang.py +113 -0
  634. skcomplex/models/biology/neuroscience/_theta_neuron.py +66 -0
  635. skcomplex/models/biology/neuroscience/_wilson_cowan.py +122 -0
  636. skcomplex/models/biology/neuroscience/types.py +8 -0
  637. skcomplex/models/biology/oncology/__init__.py +212 -0
  638. skcomplex/models/biology/oncology/_androgen_receptor_prostate.py +240 -0
  639. skcomplex/models/biology/oncology/_androgen_suppression.py +109 -0
  640. skcomplex/models/biology/oncology/_angiogenesis.py +306 -0
  641. skcomplex/models/biology/oncology/_angiogenesis_immunotherapy_tumour.py +247 -0
  642. skcomplex/models/biology/oncology/_angiogenic_tumour.py +110 -0
  643. skcomplex/models/biology/oncology/_antiangiogenic.py +227 -0
  644. skcomplex/models/biology/oncology/_bone_marrow_blood.py +196 -0
  645. skcomplex/models/biology/oncology/_cell_cycle.py +85 -0
  646. skcomplex/models/biology/oncology/_cell_kinetics.py +285 -0
  647. skcomplex/models/biology/oncology/_cell_quota_prostate.py +207 -0
  648. skcomplex/models/biology/oncology/_cell_survival.py +72 -0
  649. skcomplex/models/biology/oncology/_checkpoint_tumour.py +161 -0
  650. skcomplex/models/biology/oncology/_chemoimmunotherapy_tumour.py +251 -0
  651. skcomplex/models/biology/oncology/_chemotherapy.py +565 -0
  652. skcomplex/models/biology/oncology/_chemovirotherapy_tumour.py +139 -0
  653. skcomplex/models/biology/oncology/_clonal_tumour.py +134 -0
  654. skcomplex/models/biology/oncology/_combination_therapy.py +989 -0
  655. skcomplex/models/biology/oncology/_delayed_vaccinated_tumour.py +341 -0
  656. skcomplex/models/biology/oncology/_dormant_cell_cycle.py +95 -0
  657. skcomplex/models/biology/oncology/_erythropoiesis.py +129 -0
  658. skcomplex/models/biology/oncology/_exponential_linear_growth.py +66 -0
  659. skcomplex/models/biology/oncology/_gene_viral_therapy.py +480 -0
  660. skcomplex/models/biology/oncology/_glioma_brain.py +165 -0
  661. skcomplex/models/biology/oncology/_growth.py +378 -0
  662. skcomplex/models/biology/oncology/_her2_tumour.py +156 -0
  663. skcomplex/models/biology/oncology/_hormone_therapy.py +985 -0
  664. skcomplex/models/biology/oncology/_immune_competition.py +241 -0
  665. skcomplex/models/biology/oncology/_immunotherapy.py +1001 -0
  666. skcomplex/models/biology/oncology/_intermittent_suppression.py +130 -0
  667. skcomplex/models/biology/oncology/_irradiated_tumour.py +105 -0
  668. skcomplex/models/biology/oncology/_irradiation.py +97 -0
  669. skcomplex/models/biology/oncology/_kirschner_panetta_tumour.py +132 -0
  670. skcomplex/models/biology/oncology/_leukaemia_stem_cells.py +150 -0
  671. skcomplex/models/biology/oncology/_linear_quadratic_survival.py +112 -0
  672. skcomplex/models/biology/oncology/_log_kill.py +81 -0
  673. skcomplex/models/biology/oncology/_metastasis_chemotherapy.py +211 -0
  674. skcomplex/models/biology/oncology/_multidrug_resistance.py +201 -0
  675. skcomplex/models/biology/oncology/_oncolytic_virus.py +68 -0
  676. skcomplex/models/biology/oncology/_oncolytic_virus_dendritic.py +155 -0
  677. skcomplex/models/biology/oncology/_optimal_chemotherapy.py +157 -0
  678. skcomplex/models/biology/oncology/_optimal_immunotherapy.py +137 -0
  679. skcomplex/models/biology/oncology/_optimal_therapy.py +208 -0
  680. skcomplex/models/biology/oncology/_piecewise_linear_prostate.py +147 -0
  681. skcomplex/models/biology/oncology/_radiation_competition.py +104 -0
  682. skcomplex/models/biology/oncology/_radiotherapy.py +311 -0
  683. skcomplex/models/biology/oncology/_resistance_switching.py +148 -0
  684. skcomplex/models/biology/oncology/_resting_hunting_chemotherapy.py +136 -0
  685. skcomplex/models/biology/oncology/_sirna_tgf_beta.py +189 -0
  686. skcomplex/models/biology/oncology/_sprout.py +65 -0
  687. skcomplex/models/biology/oncology/_sprout_view.py +17 -0
  688. skcomplex/models/biology/oncology/_stem_cell_differentiation.py +262 -0
  689. skcomplex/models/biology/oncology/_stem_cells.py +548 -0
  690. skcomplex/models/biology/oncology/_suppressed_tumour.py +338 -0
  691. skcomplex/models/biology/oncology/_tamoxifen_tumour.py +172 -0
  692. skcomplex/models/biology/oncology/_tcr_gene_therapy.py +98 -0
  693. skcomplex/models/biology/oncology/_therapy_switch.py +86 -0
  694. skcomplex/models/biology/oncology/_tissue.py +71 -0
  695. skcomplex/models/biology/oncology/_tumour_cell.py +85 -0
  696. skcomplex/models/biology/oncology/_tumour_cell_view.py +21 -0
  697. skcomplex/models/biology/oncology/_tumour_immune_chemotherapy.py +169 -0
  698. skcomplex/models/biology/oncology/_vaccinated_tumour.py +180 -0
  699. skcomplex/models/biology/oncology/_vascular_support.py +71 -0
  700. skcomplex/models/biology/oncology/_vascularized_spheroid.py +264 -0
  701. skcomplex/models/biology/oncology/_vasculature.py +42 -0
  702. skcomplex/models/biology/oncology/_vessel.py +49 -0
  703. skcomplex/models/biology/oncology/_vessel_view.py +15 -0
  704. skcomplex/models/biology/physiology/__init__.py +46 -0
  705. skcomplex/models/biology/physiology/_adaptivity.py +277 -0
  706. skcomplex/models/biology/physiology/_cardiac.py +167 -0
  707. skcomplex/models/biology/physiology/_chamber.py +71 -0
  708. skcomplex/models/biology/physiology/_circulation.py +97 -0
  709. skcomplex/models/biology/physiology/_coagulation.py +130 -0
  710. skcomplex/models/biology/physiology/_contour_cell.py +61 -0
  711. skcomplex/models/biology/physiology/_contour_uptake.py +61 -0
  712. skcomplex/models/biology/physiology/_exchange.py +165 -0
  713. skcomplex/models/biology/physiology/_exchanging_cell.py +83 -0
  714. skcomplex/models/biology/physiology/_fitz_hugh_nagumo.py +46 -0
  715. skcomplex/models/biology/physiology/_glucose_control.py +136 -0
  716. skcomplex/models/biology/physiology/_mackey_glass.py +81 -0
  717. skcomplex/models/biology/physiology/_pharmacokinetics.py +104 -0
  718. skcomplex/models/biology/physiology/_physiology.py +118 -0
  719. skcomplex/models/biology/physiology/_regulation.py +251 -0
  720. skcomplex/models/biology/physiology/_resistive_flow.py +67 -0
  721. skcomplex/models/biology/physiology/_toxicity.py +164 -0
  722. skcomplex/models/biology/systems_biology/__init__.py +52 -0
  723. skcomplex/models/biology/systems_biology/_boolean.py +141 -0
  724. skcomplex/models/biology/systems_biology/_boolean_function.py +84 -0
  725. skcomplex/models/biology/systems_biology/_boolean_models.py +206 -0
  726. skcomplex/models/biology/systems_biology/_boolean_node.py +41 -0
  727. skcomplex/models/biology/systems_biology/_cascades.py +178 -0
  728. skcomplex/models/biology/systems_biology/_clocks.py +274 -0
  729. skcomplex/models/biology/systems_biology/_generalized_mass_action.py +123 -0
  730. skcomplex/models/biology/systems_biology/_genes.py +296 -0
  731. skcomplex/models/biology/systems_biology/_min_proteins.py +230 -0
  732. skcomplex/models/biology/systems_biology/_networks.py +359 -0
  733. skcomplex/models/biology/systems_biology/_phosphorylation_loop.py +121 -0
  734. skcomplex/models/biology/systems_biology/_probabilistic.py +75 -0
  735. skcomplex/models/biology/systems_biology/_probabilistic_function.py +127 -0
  736. skcomplex/models/biology/systems_biology/_probabilistic_node.py +47 -0
  737. skcomplex/models/biology/systems_biology/_repression.py +104 -0
  738. skcomplex/models/biology/systems_biology/_s_system.py +88 -0
  739. skcomplex/models/biology/systems_biology/_species.py +44 -0
  740. skcomplex/models/biology/systems_biology/_threshold_function.py +63 -0
  741. skcomplex/models/biology/systems_biology/types.py +9 -0
  742. skcomplex/models/chemistry/__init__.py +1 -0
  743. skcomplex/models/chemistry/common/__init__.py +3 -0
  744. skcomplex/models/chemistry/common/kinetics/__init__.py +9 -0
  745. skcomplex/models/chemistry/common/kinetics/_brusselator.py +61 -0
  746. skcomplex/models/chemistry/common/kinetics/_cubic_autocatalysis.py +80 -0
  747. skcomplex/models/chemistry/kinetics/__init__.py +38 -0
  748. skcomplex/models/chemistry/kinetics/_catalyst_pellet.py +60 -0
  749. skcomplex/models/chemistry/kinetics/_cubic_autocatalysis.py +60 -0
  750. skcomplex/models/chemistry/kinetics/_cyclic.py +130 -0
  751. skcomplex/models/chemistry/kinetics/_hodgepodge.py +157 -0
  752. skcomplex/models/chemistry/kinetics/_nanoparticles.py +103 -0
  753. skcomplex/models/chemistry/kinetics/_oregonator.py +76 -0
  754. skcomplex/models/chemistry/kinetics/_oscillators.py +244 -0
  755. skcomplex/models/chemistry/kinetics/_pulsed_electrode.py +107 -0
  756. skcomplex/models/chemistry/kinetics/_reactions.py +332 -0
  757. skcomplex/models/chemistry/kinetics/_reactors.py +144 -0
  758. skcomplex/models/chemistry/pattern_formation/__init__.py +15 -0
  759. skcomplex/models/chemistry/pattern_formation/_brusselator.py +62 -0
  760. skcomplex/models/chemistry/pattern_formation/_gray_scott.py +68 -0
  761. skcomplex/models/chemistry/pattern_formation/_reaction_diffusion.py +268 -0
  762. skcomplex/models/chemistry/pattern_formation/_schnakenberg.py +67 -0
  763. skcomplex/models/computer_science/__init__.py +1 -0
  764. skcomplex/models/computer_science/automata/__init__.py +56 -0
  765. skcomplex/models/computer_science/automata/_automata.py +229 -0
  766. skcomplex/models/computer_science/automata/_automaton.py +202 -0
  767. skcomplex/models/computer_science/automata/_binary_cell.py +41 -0
  768. skcomplex/models/computer_science/automata/_codes.py +73 -0
  769. skcomplex/models/computer_science/automata/_diffusion_cell.py +47 -0
  770. skcomplex/models/computer_science/automata/_group_automata.py +449 -0
  771. skcomplex/models/computer_science/automata/_groups.py +132 -0
  772. skcomplex/models/computer_science/automata/_linear_automaton.py +128 -0
  773. skcomplex/models/computer_science/automata/_noisy_elementary_cell.py +46 -0
  774. skcomplex/models/computer_science/automata/_pascal_cell.py +41 -0
  775. skcomplex/models/computer_science/automata/_subshift.py +192 -0
  776. skcomplex/models/computer_science/automata/_variants.py +292 -0
  777. skcomplex/models/computer_science/evolutionary_computation/__init__.py +27 -0
  778. skcomplex/models/computer_science/evolutionary_computation/_annealed_candidate.py +39 -0
  779. skcomplex/models/computer_science/evolutionary_computation/_bit_string.py +55 -0
  780. skcomplex/models/computer_science/evolutionary_computation/_bit_string_view.py +13 -0
  781. skcomplex/models/computer_science/evolutionary_computation/_genetic_algorithms.py +92 -0
  782. skcomplex/models/computer_science/evolutionary_computation/_landscapes.py +82 -0
  783. skcomplex/models/computer_science/evolutionary_computation/_optimisers.py +217 -0
  784. skcomplex/models/computer_science/evolutionary_computation/_reproduction.py +129 -0
  785. skcomplex/models/computer_science/evolutionary_computation/_room_cleaning.py +170 -0
  786. skcomplex/models/computer_science/evolutionary_computation/_running_best.py +30 -0
  787. skcomplex/models/computer_science/evolutionary_computation/_running_best_update.py +58 -0
  788. skcomplex/models/computer_science/evolutionary_computation/_search_candidate.py +32 -0
  789. skcomplex/models/computer_science/evolutionary_computation/_strategy.py +54 -0
  790. skcomplex/models/computer_science/evolutionary_computation/_strategy_view.py +14 -0
  791. skcomplex/models/computer_science/neural_networks/__init__.py +34 -0
  792. skcomplex/models/computer_science/neural_networks/_binary_weight.py +32 -0
  793. skcomplex/models/computer_science/neural_networks/_diluted.py +159 -0
  794. skcomplex/models/computer_science/neural_networks/_echo_state.py +173 -0
  795. skcomplex/models/computer_science/neural_networks/_elman.py +160 -0
  796. skcomplex/models/computer_science/neural_networks/_hidden_unit.py +51 -0
  797. skcomplex/models/computer_science/neural_networks/_hopfield.py +134 -0
  798. skcomplex/models/computer_science/neural_networks/_hopfield_update.py +51 -0
  799. skcomplex/models/computer_science/neural_networks/_input_coupling.py +63 -0
  800. skcomplex/models/computer_science/neural_networks/_input_unit.py +39 -0
  801. skcomplex/models/computer_science/neural_networks/_neuron_view.py +14 -0
  802. skcomplex/models/computer_science/neural_networks/_output_unit.py +51 -0
  803. skcomplex/models/computer_science/neural_networks/_perceptron.py +72 -0
  804. skcomplex/models/computer_science/neural_networks/_readout_coupling.py +69 -0
  805. skcomplex/models/computer_science/neural_networks/_recurrence_coupling.py +66 -0
  806. skcomplex/models/economics/__init__.py +1 -0
  807. skcomplex/models/economics/common/__init__.py +3 -0
  808. skcomplex/models/economics/common/forecasting/__init__.py +7 -0
  809. skcomplex/models/economics/common/forecasting/_heuristics.py +51 -0
  810. skcomplex/models/economics/common/resources/__init__.py +7 -0
  811. skcomplex/models/economics/common/resources/_regrowth.py +70 -0
  812. skcomplex/models/economics/econophysics/__init__.py +58 -0
  813. skcomplex/models/economics/econophysics/_crowd_avoidance.py +80 -0
  814. skcomplex/models/economics/econophysics/_debt_exchange.py +74 -0
  815. skcomplex/models/economics/econophysics/_diner.py +59 -0
  816. skcomplex/models/economics/econophysics/_diner_view.py +17 -0
  817. skcomplex/models/economics/econophysics/_el_farol.py +114 -0
  818. skcomplex/models/economics/econophysics/_exchange.py +82 -0
  819. skcomplex/models/economics/econophysics/_game_state_spec.py +26 -0
  820. skcomplex/models/economics/econophysics/_kinetic.py +80 -0
  821. skcomplex/models/economics/econophysics/_kolkata.py +87 -0
  822. skcomplex/models/economics/econophysics/_minority.py +123 -0
  823. skcomplex/models/economics/econophysics/_minority_game.py +161 -0
  824. skcomplex/models/economics/econophysics/_minority_player.py +79 -0
  825. skcomplex/models/economics/econophysics/_minority_player_view.py +22 -0
  826. skcomplex/models/economics/econophysics/_patron.py +105 -0
  827. skcomplex/models/economics/econophysics/_patron_view.py +18 -0
  828. skcomplex/models/economics/econophysics/_predictor_pool.py +181 -0
  829. skcomplex/models/economics/econophysics/_predictor_pool_view.py +14 -0
  830. skcomplex/models/economics/econophysics/_restaurants.py +93 -0
  831. skcomplex/models/economics/econophysics/_saving_exchange.py +73 -0
  832. skcomplex/models/economics/econophysics/_saving_trader.py +47 -0
  833. skcomplex/models/economics/econophysics/_saving_trader_view.py +12 -0
  834. skcomplex/models/economics/econophysics/_wealth_exchange.py +114 -0
  835. skcomplex/models/economics/econophysics/_welfare.py +210 -0
  836. skcomplex/models/economics/econophysics/_welfare_policy.py +99 -0
  837. skcomplex/models/economics/finance/__init__.py +41 -0
  838. skcomplex/models/economics/finance/_arbitrage.py +139 -0
  839. skcomplex/models/economics/finance/_asset.py +42 -0
  840. skcomplex/models/economics/finance/_assets.py +44 -0
  841. skcomplex/models/economics/finance/_book.py +115 -0
  842. skcomplex/models/economics/finance/_contagion.py +116 -0
  843. skcomplex/models/economics/finance/_correlated_assets.py +69 -0
  844. skcomplex/models/economics/finance/_debt_rank_cascade.py +86 -0
  845. skcomplex/models/economics/finance/_geometric_brownian_motion.py +89 -0
  846. skcomplex/models/economics/finance/_gibrat_firm.py +82 -0
  847. skcomplex/models/economics/finance/_gibrat_firm_view.py +18 -0
  848. skcomplex/models/economics/finance/_growth_processes.py +195 -0
  849. skcomplex/models/economics/finance/_interbank.py +76 -0
  850. skcomplex/models/economics/finance/_interbank_view.py +14 -0
  851. skcomplex/models/economics/finance/_kesten_firm.py +88 -0
  852. skcomplex/models/economics/finance/_kesten_firm_view.py +16 -0
  853. skcomplex/models/economics/finance/_order_book.py +164 -0
  854. skcomplex/models/economics/finance/_reflecting_floor.py +66 -0
  855. skcomplex/models/economics/finance/_stock_trader.py +205 -0
  856. skcomplex/models/economics/finance/_stock_trader_view.py +24 -0
  857. skcomplex/models/economics/finance/_wealth.py +143 -0
  858. skcomplex/models/economics/innovation/__init__.py +23 -0
  859. skcomplex/models/economics/innovation/_adoption.py +233 -0
  860. skcomplex/models/economics/innovation/_bass.py +124 -0
  861. skcomplex/models/economics/innovation/_diversity.py +104 -0
  862. skcomplex/models/economics/innovation/_household_view.py +20 -0
  863. skcomplex/models/economics/innovation/_invention.py +140 -0
  864. skcomplex/models/economics/innovation/_part.py +64 -0
  865. skcomplex/models/economics/innovation/_part_view.py +12 -0
  866. skcomplex/models/economics/innovation/_redesign.py +88 -0
  867. skcomplex/models/economics/innovation/_technology.py +203 -0
  868. skcomplex/models/economics/innovation/_technology_view.py +14 -0
  869. skcomplex/models/economics/macroeconomics/__init__.py +70 -0
  870. skcomplex/models/economics/macroeconomics/_banking.py +148 -0
  871. skcomplex/models/economics/macroeconomics/_business.py +221 -0
  872. skcomplex/models/economics/macroeconomics/_business_view.py +24 -0
  873. skcomplex/models/economics/macroeconomics/_capital.py +122 -0
  874. skcomplex/models/economics/macroeconomics/_central_bank.py +80 -0
  875. skcomplex/models/economics/macroeconomics/_central_bank_view.py +13 -0
  876. skcomplex/models/economics/macroeconomics/_circuit.py +93 -0
  877. skcomplex/models/economics/macroeconomics/_commons.py +77 -0
  878. skcomplex/models/economics/macroeconomics/_credit.py +219 -0
  879. skcomplex/models/economics/macroeconomics/_credit_market.py +83 -0
  880. skcomplex/models/economics/macroeconomics/_depositor.py +114 -0
  881. skcomplex/models/economics/macroeconomics/_depositor_view.py +19 -0
  882. skcomplex/models/economics/macroeconomics/_economy.py +42 -0
  883. skcomplex/models/economics/macroeconomics/_estate.py +88 -0
  884. skcomplex/models/economics/macroeconomics/_firm.py +184 -0
  885. skcomplex/models/economics/macroeconomics/_firm_view.py +27 -0
  886. skcomplex/models/economics/macroeconomics/_firms.py +208 -0
  887. skcomplex/models/economics/macroeconomics/_firms_element.py +67 -0
  888. skcomplex/models/economics/macroeconomics/_food_market.py +84 -0
  889. skcomplex/models/economics/macroeconomics/_growth.py +109 -0
  890. skcomplex/models/economics/macroeconomics/_households.py +52 -0
  891. skcomplex/models/economics/macroeconomics/_income.py +59 -0
  892. skcomplex/models/economics/macroeconomics/_investing_firm_view.py +21 -0
  893. skcomplex/models/economics/macroeconomics/_labour_market.py +73 -0
  894. skcomplex/models/economics/macroeconomics/_lender.py +160 -0
  895. skcomplex/models/economics/macroeconomics/_lender_view.py +18 -0
  896. skcomplex/models/economics/macroeconomics/_metaphoria.py +257 -0
  897. skcomplex/models/economics/macroeconomics/_monetary.py +140 -0
  898. skcomplex/models/economics/macroeconomics/_monetary_bank.py +57 -0
  899. skcomplex/models/economics/macroeconomics/_optimal_growth.py +173 -0
  900. skcomplex/models/economics/macroeconomics/_people_spec.py +26 -0
  901. skcomplex/models/economics/macroeconomics/_plot.py +69 -0
  902. skcomplex/models/economics/macroeconomics/_plot_view.py +15 -0
  903. skcomplex/models/economics/macroeconomics/_policy_switch.py +78 -0
  904. skcomplex/models/economics/macroeconomics/_reserve_bank.py +118 -0
  905. skcomplex/models/economics/macroeconomics/_reserve_bank_view.py +14 -0
  906. skcomplex/models/economics/macroeconomics/_settler.py +291 -0
  907. skcomplex/models/economics/macroeconomics/_settler_view.py +56 -0
  908. skcomplex/models/economics/macroeconomics/_solow_growth.py +70 -0
  909. skcomplex/models/economics/macroeconomics/_trade.py +289 -0
  910. skcomplex/models/economics/markets/__init__.py +128 -0
  911. skcomplex/models/economics/markets/_auction_ledger.py +81 -0
  912. skcomplex/models/economics/markets/_barter.py +232 -0
  913. skcomplex/models/economics/markets/_barter_networks.py +169 -0
  914. skcomplex/models/economics/markets/_barter_trader.py +136 -0
  915. skcomplex/models/economics/markets/_barter_trader_view.py +16 -0
  916. skcomplex/models/economics/markets/_bilateral_barter.py +150 -0
  917. skcomplex/models/economics/markets/_brewery.py +67 -0
  918. skcomplex/models/economics/markets/_brock_hommes.py +115 -0
  919. skcomplex/models/economics/markets/_car.py +75 -0
  920. skcomplex/models/economics/markets/_car_view.py +14 -0
  921. skcomplex/models/economics/markets/_car_wash_operation.py +141 -0
  922. skcomplex/models/economics/markets/_cobweb.py +109 -0
  923. skcomplex/models/economics/markets/_commodities.py +286 -0
  924. skcomplex/models/economics/markets/_consumer_view.py +22 -0
  925. skcomplex/models/economics/markets/_cournot_adjustment.py +65 -0
  926. skcomplex/models/economics/markets/_cournot_best_response.py +88 -0
  927. skcomplex/models/economics/markets/_customer.py +147 -0
  928. skcomplex/models/economics/markets/_customer_view.py +16 -0
  929. skcomplex/models/economics/markets/_double_auction.py +141 -0
  930. skcomplex/models/economics/markets/_duopolist.py +54 -0
  931. skcomplex/models/economics/markets/_duopolist_view.py +13 -0
  932. skcomplex/models/economics/markets/_duopoly.py +85 -0
  933. skcomplex/models/economics/markets/_echelon.py +132 -0
  934. skcomplex/models/economics/markets/_employer.py +102 -0
  935. skcomplex/models/economics/markets/_employer_view.py +20 -0
  936. skcomplex/models/economics/markets/_exchange.py +171 -0
  937. skcomplex/models/economics/markets/_exchange_interaction.py +134 -0
  938. skcomplex/models/economics/markets/_factory.py +105 -0
  939. skcomplex/models/economics/markets/_fair_food.py +205 -0
  940. skcomplex/models/economics/markets/_forager.py +64 -0
  941. skcomplex/models/economics/markets/_forager_view.py +14 -0
  942. skcomplex/models/economics/markets/_goods_trader.py +68 -0
  943. skcomplex/models/economics/markets/_goods_traders.py +139 -0
  944. skcomplex/models/economics/markets/_heuristic_pricing.py +122 -0
  945. skcomplex/models/economics/markets/_heuristic_trader.py +108 -0
  946. skcomplex/models/economics/markets/_heuristic_trader_view.py +14 -0
  947. skcomplex/models/economics/markets/_inventory.py +212 -0
  948. skcomplex/models/economics/markets/_jobseeker.py +144 -0
  949. skcomplex/models/economics/markets/_jobseeker_view.py +26 -0
  950. skcomplex/models/economics/markets/_labour.py +188 -0
  951. skcomplex/models/economics/markets/_market.py +39 -0
  952. skcomplex/models/economics/markets/_market_state_spec.py +25 -0
  953. skcomplex/models/economics/markets/_oligopoly.py +167 -0
  954. skcomplex/models/economics/markets/_patch_map_spec.py +22 -0
  955. skcomplex/models/economics/markets/_perishables.py +150 -0
  956. skcomplex/models/economics/markets/_price_point.py +95 -0
  957. skcomplex/models/economics/markets/_prices.py +151 -0
  958. skcomplex/models/economics/markets/_pricing_firm.py +48 -0
  959. skcomplex/models/economics/markets/_pricing_firm_view.py +14 -0
  960. skcomplex/models/economics/markets/_pricing_game_spec.py +81 -0
  961. skcomplex/models/economics/markets/_produce.py +94 -0
  962. skcomplex/models/economics/markets/_product.py +97 -0
  963. skcomplex/models/economics/markets/_product_view.py +13 -0
  964. skcomplex/models/economics/markets/_queues.py +101 -0
  965. skcomplex/models/economics/markets/_resident.py +119 -0
  966. skcomplex/models/economics/markets/_resident_view.py +20 -0
  967. skcomplex/models/economics/markets/_retail_demand.py +52 -0
  968. skcomplex/models/economics/markets/_retailer.py +115 -0
  969. skcomplex/models/economics/markets/_shopper.py +115 -0
  970. skcomplex/models/economics/markets/_shopper_view.py +15 -0
  971. skcomplex/models/economics/markets/_shops.py +199 -0
  972. skcomplex/models/economics/markets/_stall.py +74 -0
  973. skcomplex/models/economics/markets/_stall_view.py +14 -0
  974. skcomplex/models/economics/markets/_store.py +171 -0
  975. skcomplex/models/economics/markets/_store_view.py +27 -0
  976. skcomplex/models/economics/markets/_sugar_patch.py +61 -0
  977. skcomplex/models/economics/markets/_sugar_patch_view.py +14 -0
  978. skcomplex/models/economics/markets/_sugarscape.py +250 -0
  979. skcomplex/models/economics/markets/_supply_chains.py +217 -0
  980. skcomplex/models/economics/markets/_supply_link.py +74 -0
  981. skcomplex/models/economics/markets/_till.py +79 -0
  982. skcomplex/models/economics/markets/_till_view.py +15 -0
  983. skcomplex/models/economics/markets/_washer.py +78 -0
  984. skcomplex/models/economics/markets/_zero_intelligence_buyer.py +99 -0
  985. skcomplex/models/economics/markets/_zero_intelligence_buyer_view.py +20 -0
  986. skcomplex/models/economics/markets/_zero_intelligence_seller.py +100 -0
  987. skcomplex/models/economics/markets/_zero_intelligence_seller_view.py +20 -0
  988. skcomplex/models/economics/resources/__init__.py +50 -0
  989. skcomplex/models/economics/resources/_bid_rent.py +104 -0
  990. skcomplex/models/economics/resources/_commons.py +218 -0
  991. skcomplex/models/economics/resources/_cow.py +69 -0
  992. skcomplex/models/economics/resources/_cow_view.py +13 -0
  993. skcomplex/models/economics/resources/_extraction.py +230 -0
  994. skcomplex/models/economics/resources/_farmer.py +93 -0
  995. skcomplex/models/economics/resources/_farmer_view.py +12 -0
  996. skcomplex/models/economics/resources/_fisheries.py +384 -0
  997. skcomplex/models/economics/resources/_fishery.py +91 -0
  998. skcomplex/models/economics/resources/_food.py +370 -0
  999. skcomplex/models/economics/resources/_grazing.py +148 -0
  1000. skcomplex/models/economics/resources/_harvest.py +69 -0
  1001. skcomplex/models/economics/resources/_harvesting.py +51 -0
  1002. skcomplex/models/economics/resources/_herder.py +78 -0
  1003. skcomplex/models/economics/resources/_herder_view.py +19 -0
  1004. skcomplex/models/economics/resources/_land_cell.py +39 -0
  1005. skcomplex/models/economics/resources/_land_use.py +73 -0
  1006. skcomplex/models/economics/resources/_oil_economy.py +85 -0
  1007. skcomplex/models/economics/resources/_optimal_harvesting.py +180 -0
  1008. skcomplex/models/economics/resources/_pasture.py +98 -0
  1009. skcomplex/models/economics/resources/_pasture_view.py +15 -0
  1010. skcomplex/models/economics/resources/_plantations.py +359 -0
  1011. skcomplex/models/economics/resources/_quota_regulator.py +84 -0
  1012. skcomplex/models/economics/resources/_stock.py +67 -0
  1013. skcomplex/models/engineering/__init__.py +1 -0
  1014. skcomplex/models/engineering/circuits/__init__.py +23 -0
  1015. skcomplex/models/engineering/circuits/_chua_circuit.py +48 -0
  1016. skcomplex/models/engineering/circuits/_circuit.py +47 -0
  1017. skcomplex/models/engineering/circuits/_circuits.py +387 -0
  1018. skcomplex/models/engineering/circuits/_harvesters.py +150 -0
  1019. skcomplex/models/engineering/circuits/_kicked_circuit.py +43 -0
  1020. skcomplex/models/engineering/circuits/_memristor_circuit.py +48 -0
  1021. skcomplex/models/engineering/circuits/_mixed_mode_chua_circuit.py +54 -0
  1022. skcomplex/models/engineering/circuits/_multiscroll_chua_circuit.py +58 -0
  1023. skcomplex/models/engineering/circuits/_tunnel_diode_circuit.py +45 -0
  1024. skcomplex/models/engineering/common/__init__.py +6 -0
  1025. skcomplex/models/engineering/common/mechanics/__init__.py +7 -0
  1026. skcomplex/models/engineering/common/mechanics/_spring_damper.py +121 -0
  1027. skcomplex/models/engineering/control/__init__.py +23 -0
  1028. skcomplex/models/engineering/control/_cart_pendulum.py +119 -0
  1029. skcomplex/models/engineering/control/_control.py +266 -0
  1030. skcomplex/models/engineering/control/_controlled_process.py +72 -0
  1031. skcomplex/models/engineering/control/_driven_oscillator.py +79 -0
  1032. skcomplex/models/engineering/control/_integrator.py +39 -0
  1033. skcomplex/models/engineering/control/_pid.py +106 -0
  1034. skcomplex/models/engineering/control/_regulation.py +170 -0
  1035. skcomplex/models/engineering/control/_room.py +51 -0
  1036. skcomplex/models/engineering/control/_satellite.py +56 -0
  1037. skcomplex/models/engineering/control/_state_feedback.py +82 -0
  1038. skcomplex/models/engineering/control/_swinging_pendulum.py +60 -0
  1039. skcomplex/models/engineering/power_systems/__init__.py +11 -0
  1040. skcomplex/models/engineering/power_systems/_electromechanics.py +224 -0
  1041. skcomplex/models/engineering/power_systems/_faraday_disk.py +93 -0
  1042. skcomplex/models/engineering/power_systems/_grid_node.py +39 -0
  1043. skcomplex/models/engineering/power_systems/_grids.py +89 -0
  1044. skcomplex/models/engineering/power_systems/_rail_segment.py +80 -0
  1045. skcomplex/models/engineering/power_systems/_regenerative_car.py +55 -0
  1046. skcomplex/models/engineering/power_systems/_transmission_line.py +48 -0
  1047. skcomplex/models/engineering/processes/__init__.py +13 -0
  1048. skcomplex/models/engineering/processes/_irrigation_scheme.py +112 -0
  1049. skcomplex/models/engineering/processes/_processes.py +115 -0
  1050. skcomplex/models/engineering/processes/_relief_pipeline.py +79 -0
  1051. skcomplex/models/engineering/processes/_rice_mill.py +112 -0
  1052. skcomplex/models/engineering/processes/_stage.py +34 -0
  1053. skcomplex/models/engineering/processes/_systems.py +316 -0
  1054. skcomplex/models/engineering/processes/_tub.py +42 -0
  1055. skcomplex/models/engineering/processes/_waste_system.py +101 -0
  1056. skcomplex/models/engineering/robotics/__init__.py +12 -0
  1057. skcomplex/models/engineering/robotics/_light_sensitive_robot.py +125 -0
  1058. skcomplex/models/engineering/robotics/_robots.py +177 -0
  1059. skcomplex/models/engineering/robotics/_swarm_robot.py +211 -0
  1060. skcomplex/models/engineering/robotics/_swarm_robot_view.py +23 -0
  1061. skcomplex/models/engineering/traffic/__init__.py +43 -0
  1062. skcomplex/models/engineering/traffic/_arrival.py +117 -0
  1063. skcomplex/models/engineering/traffic/_cab.py +170 -0
  1064. skcomplex/models/engineering/traffic/_cab_view.py +21 -0
  1065. skcomplex/models/engineering/traffic/_car.py +31 -0
  1066. skcomplex/models/engineering/traffic/_car_following.py +245 -0
  1067. skcomplex/models/engineering/traffic/_careless_braking.py +87 -0
  1068. skcomplex/models/engineering/traffic/_continuum.py +429 -0
  1069. skcomplex/models/engineering/traffic/_delayed_following.py +65 -0
  1070. skcomplex/models/engineering/traffic/_driver.py +140 -0
  1071. skcomplex/models/engineering/traffic/_driver_view.py +18 -0
  1072. skcomplex/models/engineering/traffic/_drivers.py +133 -0
  1073. skcomplex/models/engineering/traffic/_gas_kinetic_traffic.py +96 -0
  1074. skcomplex/models/engineering/traffic/_intelligent_driver.py +90 -0
  1075. skcomplex/models/engineering/traffic/_kerner_konhauser.py +42 -0
  1076. skcomplex/models/engineering/traffic/_langevin.py +170 -0
  1077. skcomplex/models/engineering/traffic/_langevin_driving.py +95 -0
  1078. skcomplex/models/engineering/traffic/_lead_car.py +40 -0
  1079. skcomplex/models/engineering/traffic/_lighthill_whitham_richards.py +30 -0
  1080. skcomplex/models/engineering/traffic/_motorist.py +118 -0
  1081. skcomplex/models/engineering/traffic/_motorist_view.py +18 -0
  1082. skcomplex/models/engineering/traffic/_optimal_velocity.py +72 -0
  1083. skcomplex/models/engineering/traffic/_payne.py +38 -0
  1084. skcomplex/models/engineering/traffic/_rider.py +72 -0
  1085. skcomplex/models/engineering/traffic/_rider_view.py +16 -0
  1086. skcomplex/models/engineering/traffic/_ridesharing.py +179 -0
  1087. skcomplex/models/engineering/traffic/_traffic.py +143 -0
  1088. skcomplex/models/engineering/traffic/_traffic_moments.py +57 -0
  1089. skcomplex/models/mathematics/__init__.py +1 -0
  1090. skcomplex/models/mathematics/common/__init__.py +3 -0
  1091. skcomplex/models/mathematics/common/flows/__init__.py +7 -0
  1092. skcomplex/models/mathematics/common/flows/_lorenz.py +90 -0
  1093. skcomplex/models/mathematics/dynamical_systems/__init__.py +90 -0
  1094. skcomplex/models/mathematics/dynamical_systems/_baker_map.py +59 -0
  1095. skcomplex/models/mathematics/dynamical_systems/_blow_up.py +64 -0
  1096. skcomplex/models/mathematics/dynamical_systems/_cat_map.py +44 -0
  1097. skcomplex/models/mathematics/dynamical_systems/_chaotic_ensembles.py +186 -0
  1098. skcomplex/models/mathematics/dynamical_systems/_circle_map.py +49 -0
  1099. skcomplex/models/mathematics/dynamical_systems/_cubic_walk.py +72 -0
  1100. skcomplex/models/mathematics/dynamical_systems/_cusp.py +64 -0
  1101. skcomplex/models/mathematics/dynamical_systems/_doubling_map.py +65 -0
  1102. skcomplex/models/mathematics/dynamical_systems/_driven_flows.py +158 -0
  1103. skcomplex/models/mathematics/dynamical_systems/_flows.py +179 -0
  1104. skcomplex/models/mathematics/dynamical_systems/_henon_map.py +54 -0
  1105. skcomplex/models/mathematics/dynamical_systems/_hopf.py +77 -0
  1106. skcomplex/models/mathematics/dynamical_systems/_intermittency_map.py +44 -0
  1107. skcomplex/models/mathematics/dynamical_systems/_jerk.py +72 -0
  1108. skcomplex/models/mathematics/dynamical_systems/_koopman.py +118 -0
  1109. skcomplex/models/mathematics/dynamical_systems/_logistic_map.py +44 -0
  1110. skcomplex/models/mathematics/dynamical_systems/_maps.py +465 -0
  1111. skcomplex/models/mathematics/dynamical_systems/_newton_map.py +44 -0
  1112. skcomplex/models/mathematics/dynamical_systems/_normal_forms.py +154 -0
  1113. skcomplex/models/mathematics/dynamical_systems/_rossler.py +83 -0
  1114. skcomplex/models/mathematics/dynamical_systems/_saddle_node.py +59 -0
  1115. skcomplex/models/mathematics/dynamical_systems/_skew_tent_map.py +63 -0
  1116. skcomplex/models/mathematics/dynamical_systems/_standard_map.py +52 -0
  1117. skcomplex/models/mathematics/dynamical_systems/_subcritical_forms.py +160 -0
  1118. skcomplex/models/mathematics/dynamical_systems/_takens_bogdanov.py +74 -0
  1119. skcomplex/models/mathematics/dynamical_systems/_tent_map.py +44 -0
  1120. skcomplex/models/mathematics/dynamical_systems/_towel_map.py +59 -0
  1121. skcomplex/models/mathematics/fractals/__init__.py +61 -0
  1122. skcomplex/models/mathematics/fractals/_affine_spec.py +100 -0
  1123. skcomplex/models/mathematics/fractals/_cantor_element.py +92 -0
  1124. skcomplex/models/mathematics/fractals/_chaos_game.py +140 -0
  1125. skcomplex/models/mathematics/fractals/_geometry_spec.py +84 -0
  1126. skcomplex/models/mathematics/fractals/_geometry_visual.py +190 -0
  1127. skcomplex/models/mathematics/fractals/_group_spec.py +24 -0
  1128. skcomplex/models/mathematics/fractals/_koch_element.py +43 -0
  1129. skcomplex/models/mathematics/fractals/_module_spec.py +47 -0
  1130. skcomplex/models/mathematics/fractals/_patch_element.py +89 -0
  1131. skcomplex/models/mathematics/fractals/_patch_kernel.py +200 -0
  1132. skcomplex/models/mathematics/fractals/_patch_structure_spec.py +108 -0
  1133. skcomplex/models/mathematics/fractals/_production_law.py +105 -0
  1134. skcomplex/models/mathematics/fractals/_prototile_spec.py +53 -0
  1135. skcomplex/models/mathematics/fractals/_quadratic.py +191 -0
  1136. skcomplex/models/mathematics/fractals/_random_affine_map.py +100 -0
  1137. skcomplex/models/mathematics/fractals/_rewriting_compiler.py +300 -0
  1138. skcomplex/models/mathematics/fractals/_rewriting_error.py +10 -0
  1139. skcomplex/models/mathematics/fractals/_rewriting_loops.py +180 -0
  1140. skcomplex/models/mathematics/fractals/_rewriting_problem_spec.py +30 -0
  1141. skcomplex/models/mathematics/fractals/_rewriting_solver.py +125 -0
  1142. skcomplex/models/mathematics/fractals/_sierpinski_element.py +110 -0
  1143. skcomplex/models/mathematics/fractals/_substitution.py +130 -0
  1144. skcomplex/models/mathematics/fractals/_substitution_law.py +76 -0
  1145. skcomplex/models/mathematics/fractals/_successor_spec.py +23 -0
  1146. skcomplex/models/mathematics/fractals/_word_element.py +94 -0
  1147. skcomplex/models/mathematics/fractals/_word_kernel.py +526 -0
  1148. skcomplex/models/mathematics/fractals/_word_structure_spec.py +110 -0
  1149. skcomplex/models/mathematics/fractals/_words.py +38 -0
  1150. skcomplex/models/mathematics/fractals/types.py +12 -0
  1151. skcomplex/models/mathematics/fractional_dynamics/__init__.py +29 -0
  1152. skcomplex/models/mathematics/fractional_dynamics/_fractional.py +338 -0
  1153. skcomplex/models/mathematics/fractional_dynamics/_oscillator.py +71 -0
  1154. skcomplex/models/mathematics/fractional_dynamics/_relaxation.py +59 -0
  1155. skcomplex/models/mathematics/fractional_dynamics/_van_der_pol.py +66 -0
  1156. skcomplex/models/mathematics/networks/__init__.py +61 -0
  1157. skcomplex/models/mathematics/networks/_copying_vertex.py +50 -0
  1158. skcomplex/models/mathematics/networks/_ensemble_node.py +48 -0
  1159. skcomplex/models/mathematics/networks/_ensembles.py +195 -0
  1160. skcomplex/models/mathematics/networks/_failing.py +58 -0
  1161. skcomplex/models/mathematics/networks/_giant_component.py +52 -0
  1162. skcomplex/models/mathematics/networks/_growth.py +223 -0
  1163. skcomplex/models/mathematics/networks/_hypergraphs.py +131 -0
  1164. skcomplex/models/mathematics/networks/_link.py +21 -0
  1165. skcomplex/models/mathematics/networks/_network_measures.py +59 -0
  1166. skcomplex/models/mathematics/networks/_network_node.py +86 -0
  1167. skcomplex/models/mathematics/networks/_network_walker.py +49 -0
  1168. skcomplex/models/mathematics/networks/_network_walker_view.py +12 -0
  1169. skcomplex/models/mathematics/networks/_node_content.py +47 -0
  1170. skcomplex/models/mathematics/networks/_node_rank.py +57 -0
  1171. skcomplex/models/mathematics/networks/_processes.py +148 -0
  1172. skcomplex/models/mathematics/networks/_regulated_link.py +47 -0
  1173. skcomplex/models/mathematics/networks/_regulated_node.py +43 -0
  1174. skcomplex/models/mathematics/networks/_simplex.py +46 -0
  1175. skcomplex/models/mathematics/networks/_simplex_ageing.py +46 -0
  1176. skcomplex/models/mathematics/networks/_size_biased_move.py +44 -0
  1177. skcomplex/models/mathematics/networks/_structure.py +170 -0
  1178. skcomplex/models/mathematics/networks/_triad_vertex.py +64 -0
  1179. skcomplex/models/mathematics/networks/_triadic.py +114 -0
  1180. skcomplex/models/mathematics/networks/_triadic_regulation.py +65 -0
  1181. skcomplex/models/mathematics/networks/_vertex.py +52 -0
  1182. skcomplex/models/mathematics/networks/_walker_density.py +51 -0
  1183. skcomplex/models/mathematics/stochastic_processes/__init__.py +62 -0
  1184. skcomplex/models/mathematics/stochastic_processes/_ageing_walker.py +68 -0
  1185. skcomplex/models/mathematics/stochastic_processes/_ageing_walker_view.py +15 -0
  1186. skcomplex/models/mathematics/stochastic_processes/_bernoulli_trial.py +61 -0
  1187. skcomplex/models/mathematics/stochastic_processes/_bernoulli_trial_view.py +14 -0
  1188. skcomplex/models/mathematics/stochastic_processes/_branching.py +103 -0
  1189. skcomplex/models/mathematics/stochastic_processes/_counting.py +88 -0
  1190. skcomplex/models/mathematics/stochastic_processes/_fragment.py +91 -0
  1191. skcomplex/models/mathematics/stochastic_processes/_fragment_view.py +13 -0
  1192. skcomplex/models/mathematics/stochastic_processes/_hidden_markov_source.py +46 -0
  1193. skcomplex/models/mathematics/stochastic_processes/_individual_view.py +13 -0
  1194. skcomplex/models/mathematics/stochastic_processes/_intermittency.py +115 -0
  1195. skcomplex/models/mathematics/stochastic_processes/_markov_source.py +41 -0
  1196. skcomplex/models/mathematics/stochastic_processes/_memory_walker.py +57 -0
  1197. skcomplex/models/mathematics/stochastic_processes/_persistent_walker.py +52 -0
  1198. skcomplex/models/mathematics/stochastic_processes/_poisson_counter.py +47 -0
  1199. skcomplex/models/mathematics/stochastic_processes/_queues.py +117 -0
  1200. skcomplex/models/mathematics/stochastic_processes/_random_walker.py +52 -0
  1201. skcomplex/models/mathematics/stochastic_processes/_reducing.py +104 -0
  1202. skcomplex/models/mathematics/stochastic_processes/_reducing_ball.py +63 -0
  1203. skcomplex/models/mathematics/stochastic_processes/_reducing_ball_view.py +14 -0
  1204. skcomplex/models/mathematics/stochastic_processes/_reducing_jump.py +44 -0
  1205. skcomplex/models/mathematics/stochastic_processes/_sources.py +90 -0
  1206. skcomplex/models/mathematics/stochastic_processes/_urns.py +112 -0
  1207. skcomplex/models/mathematics/stochastic_processes/_walks.py +280 -0
  1208. skcomplex/models/mathematics/stochastic_processes/_weakening_particle.py +57 -0
  1209. skcomplex/models/mathematics/stochastic_processes/types.py +8 -0
  1210. skcomplex/models/physics/__init__.py +1 -0
  1211. skcomplex/models/physics/active_matter/__init__.py +95 -0
  1212. skcomplex/models/physics/active_matter/_active_particle.py +88 -0
  1213. skcomplex/models/physics/active_matter/_alignment.py +192 -0
  1214. skcomplex/models/physics/active_matter/_angular_alignment.py +98 -0
  1215. skcomplex/models/physics/active_matter/_angular_diffusion.py +67 -0
  1216. skcomplex/models/physics/active_matter/_binary_collisions.py +126 -0
  1217. skcomplex/models/physics/active_matter/_chemotaxis.py +173 -0
  1218. skcomplex/models/physics/active_matter/_cohesive_particle.py +132 -0
  1219. skcomplex/models/physics/active_matter/_collective.py +327 -0
  1220. skcomplex/models/physics/active_matter/_collisions.py +127 -0
  1221. skcomplex/models/physics/active_matter/_contractile_gel_site.py +81 -0
  1222. skcomplex/models/physics/active_matter/_cucker_smale_alignment.py +89 -0
  1223. skcomplex/models/physics/active_matter/_depot_particle.py +103 -0
  1224. skcomplex/models/physics/active_matter/_flocker.py +46 -0
  1225. skcomplex/models/physics/active_matter/_flocker_view.py +20 -0
  1226. skcomplex/models/physics/active_matter/_flocks.py +258 -0
  1227. skcomplex/models/physics/active_matter/_gels.py +141 -0
  1228. skcomplex/models/physics/active_matter/_heading_alignment.py +73 -0
  1229. skcomplex/models/physics/active_matter/_kinetic_flocks.py +111 -0
  1230. skcomplex/models/physics/active_matter/_landau_de_gennes_energy.py +107 -0
  1231. skcomplex/models/physics/active_matter/_model_b.py +170 -0
  1232. skcomplex/models/physics/active_matter/_nematic_density_site.py +78 -0
  1233. skcomplex/models/physics/active_matter/_nematic_gel_site.py +115 -0
  1234. skcomplex/models/physics/active_matter/_nematic_particle.py +61 -0
  1235. skcomplex/models/physics/active_matter/_nematics.py +323 -0
  1236. skcomplex/models/physics/active_matter/_nonreciprocal.py +214 -0
  1237. skcomplex/models/physics/active_matter/_ornstein_uhlenbeck_particle.py +87 -0
  1238. skcomplex/models/physics/active_matter/_particles.py +323 -0
  1239. skcomplex/models/physics/active_matter/_phoretic_attraction.py +80 -0
  1240. skcomplex/models/physics/active_matter/_polar_fluid.py +119 -0
  1241. skcomplex/models/physics/active_matter/_polar_gel_site.py +120 -0
  1242. skcomplex/models/physics/active_matter/_propulsion_step.py +64 -0
  1243. skcomplex/models/physics/active_matter/_self_propulsion.py +73 -0
  1244. skcomplex/models/physics/active_matter/_tumbler.py +100 -0
  1245. skcomplex/models/physics/active_matter/_tumbler_view.py +23 -0
  1246. skcomplex/models/physics/active_matter/_vicsek_particle.py +61 -0
  1247. skcomplex/models/physics/celestial_mechanics/__init__.py +19 -0
  1248. skcomplex/models/physics/celestial_mechanics/_dipoles.py +160 -0
  1249. skcomplex/models/physics/celestial_mechanics/_kepler_body.py +76 -0
  1250. skcomplex/models/physics/celestial_mechanics/_orbits.py +332 -0
  1251. skcomplex/models/physics/celestial_mechanics/_rotating_frame_body.py +72 -0
  1252. skcomplex/models/physics/celestial_mechanics/_sitnikov_body.py +54 -0
  1253. skcomplex/models/physics/celestial_mechanics/types.py +6 -0
  1254. skcomplex/models/physics/climate/__init__.py +60 -0
  1255. skcomplex/models/physics/climate/_carbon_cycle.py +169 -0
  1256. skcomplex/models/physics/climate/_climate_anomaly.py +55 -0
  1257. skcomplex/models/physics/climate/_daisyworld.py +158 -0
  1258. skcomplex/models/physics/climate/_delayed_oscillator.py +68 -0
  1259. skcomplex/models/physics/climate/_early_warning.py +102 -0
  1260. skcomplex/models/physics/climate/_energy_balance.py +207 -0
  1261. skcomplex/models/physics/climate/_geodynamo.py +86 -0
  1262. skcomplex/models/physics/climate/_ice_ages.py +179 -0
  1263. skcomplex/models/physics/climate/_ice_albedo_climate.py +100 -0
  1264. skcomplex/models/physics/climate/_latitude_band.py +156 -0
  1265. skcomplex/models/physics/climate/_lorenz84.py +91 -0
  1266. skcomplex/models/physics/climate/_lorenz96.py +67 -0
  1267. skcomplex/models/physics/climate/_low_order.py +162 -0
  1268. skcomplex/models/physics/climate/_net_energy.py +210 -0
  1269. skcomplex/models/physics/climate/_ramped_fold.py +92 -0
  1270. skcomplex/models/physics/climate/_saltzman_maasch.py +123 -0
  1271. skcomplex/models/physics/climate/_soil.py +116 -0
  1272. skcomplex/models/physics/climate/_stochastic_energy_balance.py +124 -0
  1273. skcomplex/models/physics/climate/_tipping.py +141 -0
  1274. skcomplex/models/physics/climate/_tipping_types.py +159 -0
  1275. skcomplex/models/physics/climate/_van_der_pol_ice_ages.py +101 -0
  1276. skcomplex/models/physics/climate/_variability.py +103 -0
  1277. skcomplex/models/physics/common/__init__.py +6 -0
  1278. skcomplex/models/physics/common/fields/__init__.py +14 -0
  1279. skcomplex/models/physics/common/fields/_landau_energy.py +76 -0
  1280. skcomplex/models/physics/common/fields/_phase_field.py +43 -0
  1281. skcomplex/models/physics/common/fields/_swift_hohenberg_energy.py +74 -0
  1282. skcomplex/models/physics/common/fields/_transports.py +119 -0
  1283. skcomplex/models/physics/common/mechanics/__init__.py +5 -0
  1284. skcomplex/models/physics/common/mechanics/_reflection.py +139 -0
  1285. skcomplex/models/physics/common/oscillators/__init__.py +13 -0
  1286. skcomplex/models/physics/common/oscillators/_kuramoto_coupling.py +140 -0
  1287. skcomplex/models/physics/common/oscillators/_phase_oscillator.py +68 -0
  1288. skcomplex/models/physics/common/oscillators/_sited_oscillator.py +55 -0
  1289. skcomplex/models/physics/common/oscillators/_stuart_landau.py +106 -0
  1290. skcomplex/models/physics/common/particles/__init__.py +28 -0
  1291. skcomplex/models/physics/common/particles/_constant_force.py +65 -0
  1292. skcomplex/models/physics/common/particles/_damping.py +72 -0
  1293. skcomplex/models/physics/common/particles/_gravity.py +74 -0
  1294. skcomplex/models/physics/common/particles/_harmonic_potential.py +77 -0
  1295. skcomplex/models/physics/common/particles/_lammps.py +47 -0
  1296. skcomplex/models/physics/common/particles/_langevin_thermostat.py +103 -0
  1297. skcomplex/models/physics/common/particles/_lennard_jones.py +87 -0
  1298. skcomplex/models/physics/common/particles/_mass_point.py +57 -0
  1299. skcomplex/models/physics/common/particles/_potential_energy.py +56 -0
  1300. skcomplex/models/physics/common/particles/_soft_sphere.py +82 -0
  1301. skcomplex/models/physics/common/particles/_spring.py +78 -0
  1302. skcomplex/models/physics/common/particles/_utils.py +25 -0
  1303. skcomplex/models/physics/common/quantum/__init__.py +18 -0
  1304. skcomplex/models/physics/common/quantum/_mode.py +46 -0
  1305. skcomplex/models/physics/common/quantum/_quantum.py +127 -0
  1306. skcomplex/models/physics/common/quantum/_qubit.py +61 -0
  1307. skcomplex/models/physics/common/quantum/_site.py +49 -0
  1308. skcomplex/models/physics/common/quantum/_spin.py +92 -0
  1309. skcomplex/models/physics/common/spins/__init__.py +15 -0
  1310. skcomplex/models/physics/common/spins/_ising_sampling.py +75 -0
  1311. skcomplex/models/physics/common/spins/_potts_sampling.py +73 -0
  1312. skcomplex/models/physics/common/spins/_spin_sampling.py +100 -0
  1313. skcomplex/models/physics/common/spins/_thermal_sampling.py +105 -0
  1314. skcomplex/models/physics/common/spins/_xy_sampling.py +67 -0
  1315. skcomplex/models/physics/cosmology/__init__.py +8 -0
  1316. skcomplex/models/physics/cosmology/_expansion.py +148 -0
  1317. skcomplex/models/physics/criticality/__init__.py +29 -0
  1318. skcomplex/models/physics/criticality/_absorbing.py +210 -0
  1319. skcomplex/models/physics/criticality/_avalanche.py +69 -0
  1320. skcomplex/models/physics/criticality/_crackling_noise.py +129 -0
  1321. skcomplex/models/physics/criticality/_criticality.py +235 -0
  1322. skcomplex/models/physics/criticality/_evolutionary_learning.py +231 -0
  1323. skcomplex/models/physics/criticality/_fire.py +70 -0
  1324. skcomplex/models/physics/criticality/_forest.py +55 -0
  1325. skcomplex/models/physics/criticality/_learning.py +175 -0
  1326. skcomplex/models/physics/criticality/_sandpile_cell.py +47 -0
  1327. skcomplex/models/physics/fluids/__init__.py +49 -0
  1328. skcomplex/models/physics/fluids/_bhatnagar_gross_krook.py +54 -0
  1329. skcomplex/models/physics/fluids/_boussinesq.py +62 -0
  1330. skcomplex/models/physics/fluids/_burgers.py +39 -0
  1331. skcomplex/models/physics/fluids/_carleman_gas.py +61 -0
  1332. skcomplex/models/physics/fluids/_flows.py +436 -0
  1333. skcomplex/models/physics/fluids/_kinetic_equations.py +327 -0
  1334. skcomplex/models/physics/fluids/_kinetics.py +147 -0
  1335. skcomplex/models/physics/fluids/_kuramoto_sivashinsky.py +41 -0
  1336. skcomplex/models/physics/fluids/_lattice_gases.py +217 -0
  1337. skcomplex/models/physics/fluids/_marangoni.py +136 -0
  1338. skcomplex/models/physics/fluids/_shallow_water.py +55 -0
  1339. skcomplex/models/physics/fluids/_vorticity.py +56 -0
  1340. skcomplex/models/physics/fluids/_wave_number.py +50 -0
  1341. skcomplex/models/physics/heat/__init__.py +13 -0
  1342. skcomplex/models/physics/heat/_cooling.py +96 -0
  1343. skcomplex/models/physics/heat/_heat.py +182 -0
  1344. skcomplex/models/physics/mechanics/__init__.py +93 -0
  1345. skcomplex/models/physics/mechanics/_ballistic_pendulum.py +80 -0
  1346. skcomplex/models/physics/mechanics/_bouncing_ball.py +51 -0
  1347. skcomplex/models/physics/mechanics/_cart_pendulum.py +92 -0
  1348. skcomplex/models/physics/mechanics/_cart_pendulum_interaction.py +57 -0
  1349. skcomplex/models/physics/mechanics/_clock_pendulum.py +94 -0
  1350. skcomplex/models/physics/mechanics/_clock_pendulum_interaction.py +60 -0
  1351. skcomplex/models/physics/mechanics/_disc_billiard.py +90 -0
  1352. skcomplex/models/physics/mechanics/_double_pendulum.py +95 -0
  1353. skcomplex/models/physics/mechanics/_double_pendulum_interaction.py +53 -0
  1354. skcomplex/models/physics/mechanics/_elastic_collision.py +78 -0
  1355. skcomplex/models/physics/mechanics/_gyroscope.py +105 -0
  1356. skcomplex/models/physics/mechanics/_gyroscope_interaction.py +57 -0
  1357. skcomplex/models/physics/mechanics/_hanging_ball.py +65 -0
  1358. skcomplex/models/physics/mechanics/_magnet.py +70 -0
  1359. skcomplex/models/physics/mechanics/_mechanics.py +426 -0
  1360. skcomplex/models/physics/mechanics/_parametric_pendulum.py +75 -0
  1361. skcomplex/models/physics/mechanics/_parametric_pendulum_interaction.py +56 -0
  1362. skcomplex/models/physics/mechanics/_pendulum.py +73 -0
  1363. skcomplex/models/physics/mechanics/_pendulum_interaction.py +52 -0
  1364. skcomplex/models/physics/mechanics/_pendulum_spring.py +68 -0
  1365. skcomplex/models/physics/mechanics/_pendulums.py +547 -0
  1366. skcomplex/models/physics/mechanics/_rotating_ball.py +66 -0
  1367. skcomplex/models/physics/mechanics/_rotating_swing.py +100 -0
  1368. skcomplex/models/physics/mechanics/_rotating_swing_interaction.py +70 -0
  1369. skcomplex/models/physics/mechanics/_rotations.py +244 -0
  1370. skcomplex/models/physics/mechanics/_springs.py +176 -0
  1371. skcomplex/models/physics/mechanics/_support_spring.py +65 -0
  1372. skcomplex/models/physics/mechanics/_wells.py +102 -0
  1373. skcomplex/models/physics/nonlinear_oscillators/__init__.py +26 -0
  1374. skcomplex/models/physics/nonlinear_oscillators/_adler_phase.py +73 -0
  1375. skcomplex/models/physics/nonlinear_oscillators/_billiards.py +137 -0
  1376. skcomplex/models/physics/nonlinear_oscillators/_duffing.py +78 -0
  1377. skcomplex/models/physics/nonlinear_oscillators/_henon_heiles.py +57 -0
  1378. skcomplex/models/physics/nonlinear_oscillators/_mushroom_billiard.py +96 -0
  1379. skcomplex/models/physics/nonlinear_oscillators/_oscillators.py +313 -0
  1380. skcomplex/models/physics/nonlinear_oscillators/_sinai_billiard.py +101 -0
  1381. skcomplex/models/physics/nonlinear_oscillators/_van_der_pol.py +92 -0
  1382. skcomplex/models/physics/oceanography/__init__.py +12 -0
  1383. skcomplex/models/physics/oceanography/_gyres.py +145 -0
  1384. skcomplex/models/physics/oceanography/_quasi_geostrophic_site.py +66 -0
  1385. skcomplex/models/physics/oceanography/_thermohaline.py +133 -0
  1386. skcomplex/models/physics/pattern_formation/__init__.py +18 -0
  1387. skcomplex/models/physics/pattern_formation/_conserved.py +168 -0
  1388. skcomplex/models/physics/pattern_formation/_ginzburg_landau.py +83 -0
  1389. skcomplex/models/physics/pattern_formation/_ordering.py +183 -0
  1390. skcomplex/models/physics/pattern_formation/_pattern_field.py +37 -0
  1391. skcomplex/models/physics/pattern_formation/_patterns.py +135 -0
  1392. skcomplex/models/physics/seismology/__init__.py +11 -0
  1393. skcomplex/models/physics/seismology/_faults.py +118 -0
  1394. skcomplex/models/physics/seismology/_spring_blocks.py +175 -0
  1395. skcomplex/models/physics/soft_matter/__init__.py +76 -0
  1396. skcomplex/models/physics/soft_matter/_anomalous.py +331 -0
  1397. skcomplex/models/physics/soft_matter/_brownian.py +137 -0
  1398. skcomplex/models/physics/soft_matter/_brownian_particle.py +58 -0
  1399. skcomplex/models/physics/soft_matter/_colored_noise.py +137 -0
  1400. skcomplex/models/physics/soft_matter/_continuous_time_walker.py +62 -0
  1401. skcomplex/models/physics/soft_matter/_diffusion.py +418 -0
  1402. skcomplex/models/physics/soft_matter/_double_well.py +57 -0
  1403. skcomplex/models/physics/soft_matter/_flashing_sawtooth.py +82 -0
  1404. skcomplex/models/physics/soft_matter/_fractional_walker.py +54 -0
  1405. skcomplex/models/physics/soft_matter/_friction.py +214 -0
  1406. skcomplex/models/physics/soft_matter/_levy_flier.py +54 -0
  1407. skcomplex/models/physics/soft_matter/_levy_walker.py +67 -0
  1408. skcomplex/models/physics/soft_matter/_modulated_particle.py +76 -0
  1409. skcomplex/models/physics/soft_matter/_optical_trap.py +93 -0
  1410. skcomplex/models/physics/soft_matter/_ratchets.py +163 -0
  1411. skcomplex/models/physics/soft_matter/_scaled_walker.py +57 -0
  1412. skcomplex/models/physics/soft_matter/_speckle_field.py +81 -0
  1413. skcomplex/models/physics/soft_matter/_thermal_noise.py +52 -0
  1414. skcomplex/models/physics/soft_matter/_tilted_washboard.py +70 -0
  1415. skcomplex/models/physics/soft_matter/_transient_walker.py +61 -0
  1416. skcomplex/models/physics/soft_matter/_traps.py +166 -0
  1417. skcomplex/models/physics/soft_matter/_wall_particle.py +72 -0
  1418. skcomplex/models/physics/statistical_mechanics/__init__.py +114 -0
  1419. skcomplex/models/physics/statistical_mechanics/_absorbing_processes.py +156 -0
  1420. skcomplex/models/physics/statistical_mechanics/_boltzmann_average.py +44 -0
  1421. skcomplex/models/physics/statistical_mechanics/_boltzmann_sum.py +83 -0
  1422. skcomplex/models/physics/statistical_mechanics/_bond_sampling.py +46 -0
  1423. skcomplex/models/physics/statistical_mechanics/_bond_spin.py +76 -0
  1424. skcomplex/models/physics/statistical_mechanics/_contact_site.py +85 -0
  1425. skcomplex/models/physics/statistical_mechanics/_dephasing.py +59 -0
  1426. skcomplex/models/physics/statistical_mechanics/_disk.py +36 -0
  1427. skcomplex/models/physics/statistical_mechanics/_driven_particles.py +250 -0
  1428. skcomplex/models/physics/statistical_mechanics/_energy_level.py +30 -0
  1429. skcomplex/models/physics/statistical_mechanics/_exclusion_hops.py +76 -0
  1430. skcomplex/models/physics/statistical_mechanics/_exclusion_site.py +61 -0
  1431. skcomplex/models/physics/statistical_mechanics/_fully_connected_spins.py +232 -0
  1432. skcomplex/models/physics/statistical_mechanics/_gases.py +156 -0
  1433. skcomplex/models/physics/statistical_mechanics/_graph_spins.py +93 -0
  1434. skcomplex/models/physics/statistical_mechanics/_ising_spin.py +63 -0
  1435. skcomplex/models/physics/statistical_mechanics/_kinetic_temperature.py +66 -0
  1436. skcomplex/models/physics/statistical_mechanics/_master_equations.py +171 -0
  1437. skcomplex/models/physics/statistical_mechanics/_mattis_spin.py +79 -0
  1438. skcomplex/models/physics/statistical_mechanics/_maxwell_boltzmann.py +96 -0
  1439. skcomplex/models/physics/statistical_mechanics/_microstate.py +102 -0
  1440. skcomplex/models/physics/statistical_mechanics/_order_parameter.py +90 -0
  1441. skcomplex/models/physics/statistical_mechanics/_particle_site.py +41 -0
  1442. skcomplex/models/physics/statistical_mechanics/_percolation.py +60 -0
  1443. skcomplex/models/physics/statistical_mechanics/_percolation_site.py +73 -0
  1444. skcomplex/models/physics/statistical_mechanics/_potts_spin.py +58 -0
  1445. skcomplex/models/physics/statistical_mechanics/_processes.py +355 -0
  1446. skcomplex/models/physics/statistical_mechanics/_q2r_spin.py +51 -0
  1447. skcomplex/models/physics/statistical_mechanics/_quantum_spins.py +153 -0
  1448. skcomplex/models/physics/statistical_mechanics/_random_energy.py +68 -0
  1449. skcomplex/models/physics/statistical_mechanics/_reservoir.py +81 -0
  1450. skcomplex/models/physics/statistical_mechanics/_spin_glasses.py +203 -0
  1451. skcomplex/models/physics/statistical_mechanics/_spins.py +200 -0
  1452. skcomplex/models/physics/statistical_mechanics/_susceptibility.py +112 -0
  1453. skcomplex/models/physics/statistical_mechanics/_traps.py +135 -0
  1454. skcomplex/models/physics/statistical_mechanics/_tree_node.py +48 -0
  1455. skcomplex/models/physics/statistical_mechanics/_urns.py +107 -0
  1456. skcomplex/models/physics/statistical_mechanics/_walker.py +81 -0
  1457. skcomplex/models/physics/statistical_mechanics/_walker_view.py +20 -0
  1458. skcomplex/models/physics/statistical_mechanics/_xxz_exchange.py +67 -0
  1459. skcomplex/models/physics/statistical_mechanics/_xy_spin.py +58 -0
  1460. skcomplex/models/physics/statistical_mechanics/_zeeman_field.py +56 -0
  1461. skcomplex/models/physics/statistical_mechanics/_zero_range_hop.py +86 -0
  1462. skcomplex/models/physics/statistical_mechanics/_zero_range_hops.py +81 -0
  1463. skcomplex/models/physics/statistical_mechanics/_zone.py +78 -0
  1464. skcomplex/models/physics/synchronization/__init__.py +64 -0
  1465. skcomplex/models/physics/synchronization/_aggregate_averaging.py +63 -0
  1466. skcomplex/models/physics/synchronization/_amplitude_death.py +278 -0
  1467. skcomplex/models/physics/synchronization/_chaos.py +152 -0
  1468. skcomplex/models/physics/synchronization/_diffusive_coupling.py +69 -0
  1469. skcomplex/models/physics/synchronization/_edge_coupling.py +50 -0
  1470. skcomplex/models/physics/synchronization/_hypergraphs.py +166 -0
  1471. skcomplex/models/physics/synchronization/_integrate_and_fire_oscillator.py +80 -0
  1472. skcomplex/models/physics/synchronization/_kuramoto.py +423 -0
  1473. skcomplex/models/physics/synchronization/_link.py +46 -0
  1474. skcomplex/models/physics/synchronization/_logistic_coupling.py +78 -0
  1475. skcomplex/models/physics/synchronization/_logistic_node.py +59 -0
  1476. skcomplex/models/physics/synchronization/_logistic_unit.py +43 -0
  1477. skcomplex/models/physics/synchronization/_networks.py +184 -0
  1478. skcomplex/models/physics/synchronization/_pulses.py +138 -0
  1479. skcomplex/models/physics/synchronization/_rossler_oscillator.py +95 -0
  1480. skcomplex/models/physics/synchronization/_swarmalator.py +48 -0
  1481. skcomplex/models/physics/synchronization/_swarmalators.py +182 -0
  1482. skcomplex/models/physics/synchronization/_utils.py +29 -0
  1483. skcomplex/models/physics/synchronization/_winfree_mean_field.py +62 -0
  1484. skcomplex/models/physics/waves/__init__.py +23 -0
  1485. skcomplex/models/physics/waves/_charged.py +203 -0
  1486. skcomplex/models/physics/waves/_driven_anchor.py +63 -0
  1487. skcomplex/models/physics/waves/_lattice_hamiltonian.py +60 -0
  1488. skcomplex/models/physics/waves/_position_dephasing.py +64 -0
  1489. skcomplex/models/physics/waves/_quantum.py +125 -0
  1490. skcomplex/models/physics/waves/_strings.py +169 -0
  1491. skcomplex/models/physics/waves/_wave_function.py +79 -0
  1492. skcomplex/models/physics/waves/_wave_string.py +52 -0
  1493. skcomplex/models/social/__init__.py +1 -0
  1494. skcomplex/models/social/cooperation/__init__.py +34 -0
  1495. skcomplex/models/social/cooperation/_contributor.py +62 -0
  1496. skcomplex/models/social/cooperation/_dilemma.py +56 -0
  1497. skcomplex/models/social/cooperation/_hyperedge_goods.py +54 -0
  1498. skcomplex/models/social/cooperation/_hypergraph_games.py +249 -0
  1499. skcomplex/models/social/cooperation/_prisoner.py +56 -0
  1500. skcomplex/models/social/cooperation/_prisoners_dilemma.py +126 -0
  1501. skcomplex/models/social/cooperation/_public_goods.py +54 -0
  1502. skcomplex/models/social/cooperation/_simplicial_dilemma.py +119 -0
  1503. skcomplex/models/social/cooperation/_spatial_games.py +159 -0
  1504. skcomplex/models/social/cooperation/_strategist.py +57 -0
  1505. skcomplex/models/social/cooperation/_strategist_view.py +14 -0
  1506. skcomplex/models/social/cooperation/_tournament.py +126 -0
  1507. skcomplex/models/social/cooperation/_tournaments.py +87 -0
  1508. skcomplex/models/social/crowds/__init__.py +46 -0
  1509. skcomplex/models/social/crowds/_criminal_contagion.py +108 -0
  1510. skcomplex/models/social/crowds/_criminality.py +223 -0
  1511. skcomplex/models/social/crowds/_crowding.py +115 -0
  1512. skcomplex/models/social/crowds/_deterrence.py +101 -0
  1513. skcomplex/models/social/crowds/_evacuation.py +196 -0
  1514. skcomplex/models/social/crowds/_guidance.py +69 -0
  1515. skcomplex/models/social/crowds/_motivation.py +67 -0
  1516. skcomplex/models/social/crowds/_pedestrians.py +85 -0
  1517. skcomplex/models/social/crowds/_recruitment.py +90 -0
  1518. skcomplex/models/social/crowds/_security_agents.py +48 -0
  1519. skcomplex/models/social/crowds/_social_repulsion.py +86 -0
  1520. skcomplex/models/social/crowds/_walking.py +186 -0
  1521. skcomplex/models/social/crowds/_walls.py +69 -0
  1522. skcomplex/models/social/language/__init__.py +13 -0
  1523. skcomplex/models/social/language/_language.py +30 -0
  1524. skcomplex/models/social/language/_least_effort.py +69 -0
  1525. skcomplex/models/social/language/_word.py +39 -0
  1526. skcomplex/models/social/language/_word_frequencies.py +48 -0
  1527. skcomplex/models/social/opinion_dynamics/__init__.py +142 -0
  1528. skcomplex/models/social/opinion_dynamics/_adopter.py +61 -0
  1529. skcomplex/models/social/opinion_dynamics/_adopter_view.py +14 -0
  1530. skcomplex/models/social/opinion_dynamics/_adoption.py +83 -0
  1531. skcomplex/models/social/opinion_dynamics/_axelrod.py +160 -0
  1532. skcomplex/models/social/opinion_dynamics/_believer.py +71 -0
  1533. skcomplex/models/social/opinion_dynamics/_believer_view.py +16 -0
  1534. skcomplex/models/social/opinion_dynamics/_bounded_confidence.py +126 -0
  1535. skcomplex/models/social/opinion_dynamics/_citizen.py +49 -0
  1536. skcomplex/models/social/opinion_dynamics/_citizen_view.py +12 -0
  1537. skcomplex/models/social/opinion_dynamics/_club_member.py +78 -0
  1538. skcomplex/models/social/opinion_dynamics/_coevolution.py +187 -0
  1539. skcomplex/models/social/opinion_dynamics/_coevolving_voter.py +63 -0
  1540. skcomplex/models/social/opinion_dynamics/_cognition.py +73 -0
  1541. skcomplex/models/social/opinion_dynamics/_complex_agent.py +58 -0
  1542. skcomplex/models/social/opinion_dynamics/_complex_agent_view.py +13 -0
  1543. skcomplex/models/social/opinion_dynamics/_confidence_coupling.py +76 -0
  1544. skcomplex/models/social/opinion_dynamics/_confident.py +50 -0
  1545. skcomplex/models/social/opinion_dynamics/_conventions.py +44 -0
  1546. skcomplex/models/social/opinion_dynamics/_conversations.py +116 -0
  1547. skcomplex/models/social/opinion_dynamics/_cultural_influence.py +93 -0
  1548. skcomplex/models/social/opinion_dynamics/_diffusion.py +205 -0
  1549. skcomplex/models/social/opinion_dynamics/_discussant.py +60 -0
  1550. skcomplex/models/social/opinion_dynamics/_discussant_view.py +14 -0
  1551. skcomplex/models/social/opinion_dynamics/_discussions.py +51 -0
  1552. skcomplex/models/social/opinion_dynamics/_encounters.py +48 -0
  1553. skcomplex/models/social/opinion_dynamics/_hypergraph_consensus.py +106 -0
  1554. skcomplex/models/social/opinion_dynamics/_influencee.py +70 -0
  1555. skcomplex/models/social/opinion_dynamics/_influencee_view.py +16 -0
  1556. skcomplex/models/social/opinion_dynamics/_kinetic_opinion.py +287 -0
  1557. skcomplex/models/social/opinion_dynamics/_majority_voter.py +43 -0
  1558. skcomplex/models/social/opinion_dynamics/_namer.py +53 -0
  1559. skcomplex/models/social/opinion_dynamics/_namer_view.py +13 -0
  1560. skcomplex/models/social/opinion_dynamics/_naming_games.py +68 -0
  1561. skcomplex/models/social/opinion_dynamics/_opinion.py +39 -0
  1562. skcomplex/models/social/opinion_dynamics/_persuader.py +52 -0
  1563. skcomplex/models/social/opinion_dynamics/_persuader_view.py +12 -0
  1564. skcomplex/models/social/opinion_dynamics/_persuasion.py +247 -0
  1565. skcomplex/models/social/opinion_dynamics/_random_pairs.py +53 -0
  1566. skcomplex/models/social/opinion_dynamics/_schedule.py +39 -0
  1567. skcomplex/models/social/opinion_dynamics/_separation.py +71 -0
  1568. skcomplex/models/social/opinion_dynamics/_social_impact.py +60 -0
  1569. skcomplex/models/social/opinion_dynamics/_standardization.py +212 -0
  1570. skcomplex/models/social/opinion_dynamics/_thinker.py +61 -0
  1571. skcomplex/models/social/opinion_dynamics/_thinker_view.py +15 -0
  1572. skcomplex/models/social/opinion_dynamics/_three_body_consensus.py +71 -0
  1573. skcomplex/models/social/opinion_dynamics/_tie.py +21 -0
  1574. skcomplex/models/social/opinion_dynamics/_variant_voter.py +67 -0
  1575. skcomplex/models/social/opinion_dynamics/_variant_voter_view.py +14 -0
  1576. skcomplex/models/social/opinion_dynamics/_variant_voting.py +63 -0
  1577. skcomplex/models/social/opinion_dynamics/_village.py +61 -0
  1578. skcomplex/models/social/opinion_dynamics/_village_view.py +14 -0
  1579. skcomplex/models/social/opinion_dynamics/_voter.py +49 -0
  1580. skcomplex/models/social/opinion_dynamics/_voter_imitation.py +48 -0
  1581. skcomplex/models/social/opinion_dynamics/_voter_view.py +12 -0
  1582. skcomplex/models/social/opinion_dynamics/_voters.py +197 -0
  1583. skcomplex/models/social/organizations/__init__.py +68 -0
  1584. skcomplex/models/social/organizations/_arms_race.py +34 -0
  1585. skcomplex/models/social/organizations/_burden.py +38 -0
  1586. skcomplex/models/social/organizations/_city_resident.py +41 -0
  1587. skcomplex/models/social/organizations/_contender_view.py +14 -0
  1588. skcomplex/models/social/organizations/_contest.py +32 -0
  1589. skcomplex/models/social/organizations/_daily_movements.py +144 -0
  1590. skcomplex/models/social/organizations/_eater.py +282 -0
  1591. skcomplex/models/social/organizations/_eater_view.py +24 -0
  1592. skcomplex/models/social/organizations/_employee.py +173 -0
  1593. skcomplex/models/social/organizations/_employee_view.py +35 -0
  1594. skcomplex/models/social/organizations/_employment.py +127 -0
  1595. skcomplex/models/social/organizations/_execution.py +79 -0
  1596. skcomplex/models/social/organizations/_gravity_contact.py +69 -0
  1597. skcomplex/models/social/organizations/_hierarchies.py +174 -0
  1598. skcomplex/models/social/organizations/_obesity.py +131 -0
  1599. skcomplex/models/social/organizations/_premises.py +75 -0
  1600. skcomplex/models/social/organizations/_premises_view.py +16 -0
  1601. skcomplex/models/social/organizations/_queues.py +52 -0
  1602. skcomplex/models/social/organizations/_restaurant.py +59 -0
  1603. skcomplex/models/social/organizations/_restaurant_view.py +14 -0
  1604. skcomplex/models/social/organizations/_sabotage.py +183 -0
  1605. skcomplex/models/social/organizations/_supervisor.py +25 -0
  1606. skcomplex/models/social/organizations/_task.py +65 -0
  1607. skcomplex/models/social/organizations/_task_view.py +15 -0
  1608. skcomplex/models/social/organizations/_trafficking.py +184 -0
  1609. skcomplex/models/social/organizations/_traps.py +322 -0
  1610. skcomplex/models/social/organizations/_traveller.py +55 -0
  1611. skcomplex/models/social/organizations/_traveller_view.py +13 -0
  1612. skcomplex/models/social/organizations/_urban_scaling.py +72 -0
  1613. skcomplex/models/social/segregation/__init__.py +21 -0
  1614. skcomplex/models/social/segregation/_block_moves.py +127 -0
  1615. skcomplex/models/social/segregation/_blocks.py +111 -0
  1616. skcomplex/models/social/segregation/_dweller.py +70 -0
  1617. skcomplex/models/social/segregation/_dweller_view.py +16 -0
  1618. skcomplex/models/social/segregation/_relocation.py +60 -0
  1619. skcomplex/models/social/segregation/_resident.py +55 -0
  1620. skcomplex/models/social/segregation/_resident_view.py +13 -0
  1621. skcomplex/models/social/segregation/_schelling.py +75 -0
  1622. skcomplex/models/social/spreading/__init__.py +37 -0
  1623. skcomplex/models/social/spreading/_cascades.py +118 -0
  1624. skcomplex/models/social/spreading/_exposure.py +166 -0
  1625. skcomplex/models/social/spreading/_growing_word.py +55 -0
  1626. skcomplex/models/social/spreading/_growing_word_view.py +13 -0
  1627. skcomplex/models/social/spreading/_growth.py +52 -0
  1628. skcomplex/models/social/spreading/_infective.py +55 -0
  1629. skcomplex/models/social/spreading/_listeners.py +41 -0
  1630. skcomplex/models/social/spreading/_participant.py +50 -0
  1631. skcomplex/models/social/spreading/_rumour_contacts.py +81 -0
  1632. skcomplex/models/social/spreading/_rumours.py +57 -0
  1633. skcomplex/models/social/spreading/_simplicial.py +120 -0
  1634. skcomplex/models/social/spreading/_simplicial_infection.py +64 -0
  1635. skcomplex/models/social/spreading/_threshold_activation.py +50 -0
  1636. skcomplex/models/social/spreading/_threshold_node_view.py +13 -0
  1637. skcomplex/models/social/spreading/_writing.py +86 -0
  1638. skcomplex/models/types.py +10 -0
  1639. skcomplex/specs/__init__.py +198 -0
  1640. skcomplex/specs/_accelerated_spec.py +46 -0
  1641. skcomplex/specs/_agent_snapshot_spec.py +34 -0
  1642. skcomplex/specs/_agent_state_spec.py +26 -0
  1643. skcomplex/specs/_arguments_spec.py +60 -0
  1644. skcomplex/specs/_axis_spec.py +59 -0
  1645. skcomplex/specs/_base_record_spec.py +16 -0
  1646. skcomplex/specs/_base_spec.py +73 -0
  1647. skcomplex/specs/_base_structure_spec.py +173 -0
  1648. skcomplex/specs/_batch_matching_spec.py +23 -0
  1649. skcomplex/specs/_breakpoints_spec.py +58 -0
  1650. skcomplex/specs/_call_spec.py +64 -0
  1651. skcomplex/specs/_capacity_rows_spec.py +120 -0
  1652. skcomplex/specs/_cardinality_spec.py +58 -0
  1653. skcomplex/specs/_cascade_record_spec.py +36 -0
  1654. skcomplex/specs/_clamp_spec.py +54 -0
  1655. skcomplex/specs/_clause_spec.py +42 -0
  1656. skcomplex/specs/_compiled_flow_spec.py +20 -0
  1657. skcomplex/specs/_composed_rule_spec.py +33 -0
  1658. skcomplex/specs/_continuous_matching_spec.py +48 -0
  1659. skcomplex/specs/_control_solution_spec.py +54 -0
  1660. skcomplex/specs/_control_spec.py +21 -0
  1661. skcomplex/specs/_covariance_adaptation_spec.py +25 -0
  1662. skcomplex/specs/_dataset_spec.py +85 -0
  1663. skcomplex/specs/_delay_spec.py +27 -0
  1664. skcomplex/specs/_dialect_spec.py +207 -0
  1665. skcomplex/specs/_differential_evolution_spec.py +33 -0
  1666. skcomplex/specs/_direction_spec.py +44 -0
  1667. skcomplex/specs/_draw_spec.py +273 -0
  1668. skcomplex/specs/_entry_spec.py +403 -0
  1669. skcomplex/specs/_event_record_spec.py +37 -0
  1670. skcomplex/specs/_evolution_strategy_spec.py +25 -0
  1671. skcomplex/specs/_extremal_record_spec.py +32 -0
  1672. skcomplex/specs/_fractional_rows_spec.py +33 -0
  1673. skcomplex/specs/_fractional_state_spec.py +30 -0
  1674. skcomplex/specs/_held_reduction_spec.py +29 -0
  1675. skcomplex/specs/_hilbert_spec.py +75 -0
  1676. skcomplex/specs/_hyperedge_reduction_spec.py +38 -0
  1677. skcomplex/specs/_issue_spec.py +52 -0
  1678. skcomplex/specs/_iterative_matching_spec.py +39 -0
  1679. skcomplex/specs/_jump_channels_spec.py +40 -0
  1680. skcomplex/specs/_jump_path_spec.py +29 -0
  1681. skcomplex/specs/_layer_spec.py +47 -0
  1682. skcomplex/specs/_layout_spec.py +158 -0
  1683. skcomplex/specs/_local_operator_spec.py +72 -0
  1684. skcomplex/specs/_lookup_spec.py +33 -0
  1685. skcomplex/specs/_loop_spec.py +17 -0
  1686. skcomplex/specs/_lowered_functions_spec.py +71 -0
  1687. skcomplex/specs/_match_spec.py +37 -0
  1688. skcomplex/specs/_matrix_law_spec.py +31 -0
  1689. skcomplex/specs/_move_spec.py +69 -0
  1690. skcomplex/specs/_neighbor_read_spec.py +83 -0
  1691. skcomplex/specs/_neighbor_reduction_spec.py +39 -0
  1692. skcomplex/specs/_network_rows_spec.py +124 -0
  1693. skcomplex/specs/_network_snapshot_spec.py +61 -0
  1694. skcomplex/specs/_noise_process_spec.py +41 -0
  1695. skcomplex/specs/_objective_spec.py +39 -0
  1696. skcomplex/specs/_observable_spec.py +79 -0
  1697. skcomplex/specs/_operator_spec.py +170 -0
  1698. skcomplex/specs/_orders_spec.py +16 -0
  1699. skcomplex/specs/_outer_totalistic_spec.py +38 -0
  1700. skcomplex/specs/_owners_spec.py +28 -0
  1701. skcomplex/specs/_pair_read_spec.py +38 -0
  1702. skcomplex/specs/_parameter_spec.py +81 -0
  1703. skcomplex/specs/_parameters_spec.py +26 -0
  1704. skcomplex/specs/_particle_swarm_spec.py +33 -0
  1705. skcomplex/specs/_partner_spec.py +98 -0
  1706. skcomplex/specs/_partner_switch_spec.py +39 -0
  1707. skcomplex/specs/_phase_spec.py +61 -0
  1708. skcomplex/specs/_phases_schedule_spec.py +59 -0
  1709. skcomplex/specs/_plan_spec.py +18 -0
  1710. skcomplex/specs/_planned_partition_spec.py +30 -0
  1711. skcomplex/specs/_queue_spec.py +46 -0
  1712. skcomplex/specs/_radius_spec.py +66 -0
  1713. skcomplex/specs/_random_search_spec.py +51 -0
  1714. skcomplex/specs/_read_spec.py +45 -0
  1715. skcomplex/specs/_reduction_spec.py +48 -0
  1716. skcomplex/specs/_renewal_record_spec.py +49 -0
  1717. skcomplex/specs/_requirement_spec.py +32 -0
  1718. skcomplex/specs/_role_spec.py +54 -0
  1719. skcomplex/specs/_run_result_spec.py +52 -0
  1720. skcomplex/specs/_run_state_spec.py +41 -0
  1721. skcomplex/specs/_sampled_draw_spec.py +32 -0
  1722. skcomplex/specs/_sampler_spec.py +57 -0
  1723. skcomplex/specs/_samples_spec.py +29 -0
  1724. skcomplex/specs/_schedule_spec.py +17 -0
  1725. skcomplex/specs/_sector_spec.py +31 -0
  1726. skcomplex/specs/_segment_spec.py +21 -0
  1727. skcomplex/specs/_series_spec.py +29 -0
  1728. skcomplex/specs/_signature_spec.py +55 -0
  1729. skcomplex/specs/_snapshots_spec.py +56 -0
  1730. skcomplex/specs/_stable_matching_spec.py +58 -0
  1731. skcomplex/specs/_state_spec.py +138 -0
  1732. skcomplex/specs/_step_spec.py +39 -0
  1733. skcomplex/specs/_structure_state_spec.py +30 -0
  1734. skcomplex/specs/_support_spec.py +76 -0
  1735. skcomplex/specs/_symmetry_spec.py +59 -0
  1736. skcomplex/specs/_table_spec.py +42 -0
  1737. skcomplex/specs/_table_values_spec.py +36 -0
  1738. skcomplex/specs/_tensor_spec.py +197 -0
  1739. skcomplex/specs/_topology_request_spec.py +97 -0
  1740. skcomplex/specs/_totalistic_spec.py +37 -0
  1741. skcomplex/specs/_unknown_spec.py +22 -0
  1742. skcomplex/specs/_validation_report_spec.py +62 -0
  1743. skcomplex/specs/_variable_spec.py +124 -0
  1744. skcomplex/specs/_visual_spec.py +30 -0
  1745. skcomplex/specs/_weight_spec.py +16 -0
  1746. skcomplex/specs/_wiener_block_spec.py +31 -0
  1747. skcomplex/specs/_wiener_process_spec.py +54 -0
  1748. skcomplex/types.py +140 -0
@@ -0,0 +1,1317 @@
1
+ """Build the kernel spec of every component of a system, the namespace and the rows its laws are lowered with."""
2
+
3
+ # Author: Georgios Douzas <gdouzas@icloud.com>
4
+ # License: MIT
5
+
6
+ import re
7
+ from collections.abc import Mapping, Sequence
8
+ from dataclasses import replace
9
+ from types import SimpleNamespace
10
+
11
+ import numpy as np
12
+ from sage.all__sagemath_symbolics import RR, SR, Expression
13
+ from sage.modules.free_module_element import FreeModuleElement
14
+
15
+ from ....core.elements import FieldElement
16
+ from ....core.interactions import (
17
+ BaseInteraction,
18
+ GroupingInteraction,
19
+ HyperedgeInteraction,
20
+ NeighborInteraction,
21
+ PairInteraction,
22
+ )
23
+ from ....core.spaces import BaseSpace, CayleySpace, ContinuousSpace, LatticeSpace, MeshSpace, NetworkSpace, PhaseSpace
24
+ from ....core.specs import NodeSpec
25
+ from ....errors import LabelError, RoleError, ValidationError
26
+ from ....specs import EntrySpec, NeighborReadSpec, WienerProcessSpec
27
+ from ....types import Indices, VariableKind
28
+ from ..._utils import bound_labels, declarations_of, domain_of, symbol, vector
29
+ from ...problems import (
30
+ BlockSpec,
31
+ DeclarationsSpec,
32
+ KernelSpec,
33
+ ObservedSpec,
34
+ ProblemSpec,
35
+ ReferenceSpec,
36
+ SetSymbolSpec,
37
+ )
38
+ from ...problems._declarations_spec import _ACTIVE, ENDS, MEMBERS
39
+ from ...problems._edge_search import EdgeSearch
40
+ from ...problems._pair_search import PairSearch
41
+ from ...problems._set_symbol_spec import _EDGE_NAMES, _MEMBER_REFERENCE
42
+ from ...types import ReadKind
43
+ from .._base import BasePass
44
+ from .._compilation import Compilation
45
+ from .._observables import ObservableEvaluator
46
+ from .._observer import Observer
47
+ from ._hyperedges import MEMBER_LAWS, HyperedgeTables, Tables
48
+ from ._layout import LayoutPass
49
+
50
+ END_SUFFIXES = ('__source', '__target')
51
+ HYPEREDGE_NAMES = ('member', 'others', 'members', 'hyperedge', 'edge', 't')
52
+ MAX_HYPEREDGE_ROLES = 2
53
+ SECOND_PARTS = ('edges', 'hyperedges')
54
+
55
+
56
+ class SpecsPass(BasePass):
57
+ """Pass that builds the kernel specs of every component, one per element set entry of an interaction."""
58
+
59
+ def _get_reads(self) -> tuple[str, ...]:
60
+ """Return the fields of the compilation the pass reads."""
61
+ return ('layout', 'nodes')
62
+
63
+ def _get_writes(self) -> tuple[str, ...]:
64
+ """Return the fields of the compilation the pass writes."""
65
+ return ('specs',)
66
+
67
+ def _run(self, inputs: object = None) -> None:
68
+ """Build the kernel specs of the declared components."""
69
+ compilation = self.compilation_
70
+ declarations = Compilation._required(compilation.layout, 'layout')
71
+ blocks = list(declarations.blocks.values())
72
+ elements = {block.node.path: block for block in blocks if not block.node.interaction}
73
+ elements.update(declarations.processes)
74
+ nodes = Compilation._required(compilation.nodes, 'nodes')
75
+ live = ObservableEvaluator._lowerable_observables(compilation.system, nodes)
76
+ observer = Observer(declarations, live).check().prepare()
77
+ compilation.specs = []
78
+ for block in blocks:
79
+ specs, declarations = self._specs_of(block, elements, declarations, observer)
80
+ compilation.specs += [(spec, block) for spec in specs]
81
+ compilation.layout = declarations
82
+
83
+ @staticmethod
84
+ def _namespace(
85
+ block: BlockSpec,
86
+ source: ReadKind,
87
+ alias: str = '',
88
+ ) -> tuple[SimpleNamespace, dict[Expression, ReferenceSpec]]:
89
+ """Return the namespace of the symbols of a block and their references for one way of reading them.
90
+
91
+ Args:
92
+ block:
93
+ The block.
94
+
95
+ source:
96
+ How the components of the block are read.
97
+
98
+ alias:
99
+ A suffix that gives the symbols of the block distinct names, used for the second member of a pair.
100
+
101
+ Returns:
102
+ namespace:
103
+ The namespace and the references of its symbols.
104
+ """
105
+ mapping = {item: symbol(f'{item}{alias}', domain_of(item)) for item in block.references}
106
+ references = {
107
+ mapping[item]: ReferenceSpec(reference.entry, reference.is_state, reference.column, source)
108
+ for item, reference in block.references.items()
109
+ }
110
+ return SpecsPass._renamed_namespace(block, mapping), references
111
+
112
+ @staticmethod
113
+ def _member_namespace(block: BlockSpec, index: int) -> tuple[SimpleNamespace, dict[Expression, ReferenceSpec]]:
114
+ """Return the namespace of one member of a group, read like a single element, and the references of its symbols.
115
+
116
+ Args:
117
+ block:
118
+ The block of the group.
119
+
120
+ index:
121
+ The index of the member.
122
+
123
+ Returns:
124
+ namespace:
125
+ The namespace and the references of its symbols, whose columns count from the group's first component.
126
+ """
127
+ mapping = {item: symbol(f'{item}__m{index}', domain_of(item)) for item in block.references}
128
+ references = {
129
+ mapping[item]: ReferenceSpec(
130
+ reference.entry,
131
+ reference.is_state,
132
+ index * reference.entry.columns + reference.column,
133
+ ReadKind.SINGLE,
134
+ )
135
+ for item, reference in block.references.items()
136
+ }
137
+ return SpecsPass._renamed_namespace(block, mapping), references
138
+
139
+ @staticmethod
140
+ def _renamed_namespace(block: BlockSpec, mapping: dict[Expression, Expression]) -> SimpleNamespace:
141
+ """Return the namespace of the variables of a block in renamed symbols, with tuples for per-entry parameters."""
142
+ symbols: dict[str, object] = {}
143
+ for name, value in block.symbols.items():
144
+ if not isinstance(value, FreeModuleElement):
145
+ symbols[name] = SpecsPass._renamed(value, mapping)
146
+ elif name in block.per:
147
+ symbols[name] = tuple(SpecsPass._renamed(item, mapping) for item in value)
148
+ elif name in block.entries and (tensor := block.entries[name].tensor) is not None:
149
+ symbols[name] = tensor.matrix_of(SpecsPass._renamed(item, mapping) for item in value)
150
+ else:
151
+ symbols[name] = vector(SpecsPass._renamed(item, mapping) for item in value)
152
+ return SimpleNamespace(**symbols)
153
+
154
+ @staticmethod
155
+ def _renamed(value: Expression, mapping: dict[Expression, Expression]) -> Expression:
156
+ """Return the renamed symbol of a variable, or a complex value with its real and imaginary symbols renamed.
157
+
158
+ A symbol without a variable, such as the handle of a Wiener process, keeps its name.
159
+ """
160
+ return mapping.get(value, value) if value.operator() is None else value.subs(mapping)
161
+
162
+ @staticmethod
163
+ def _group_space(block: BlockSpec) -> BaseSpace | None:
164
+ """Return the space of a group, its own or the enclosing one, shared by the groups of one network."""
165
+ return block.node.space
166
+
167
+ @staticmethod
168
+ def _space_period(node: NodeSpec) -> float | None:
169
+ """Return the side of the periodic box a pair interaction measures minimum image distances in, or `None`."""
170
+ space = node.space
171
+ if not isinstance(space, ContinuousSpace) or not space.periodic_:
172
+ return None
173
+ if len(set(space.extent_)) > 1:
174
+ error_msg = (
175
+ f'Pair interaction {node.path} lives in the periodic box {space.extent_}, whose sides differ. Pair '
176
+ 'searches measure minimum image distances in boxes with equal sides.'
177
+ )
178
+ raise ValidationError(error_msg)
179
+ return space.extent_[0]
180
+
181
+ @staticmethod
182
+ def _set_symbols(members: list[BlockSpec], index: int) -> dict[Expression, SetSymbolSpec]:
183
+ """Return the symbols of one element of a set with the same symbol of every element."""
184
+ label = ', '.join(member.node.path for member in members)
185
+ symbols = {}
186
+ for variable, value in members[index].symbols.items():
187
+ for column, item in enumerate(ProblemSpec._real_components_of(value)):
188
+ references = tuple(
189
+ member.references[ProblemSpec._real_components_of(member.symbols[variable])[column]]
190
+ for member in members
191
+ )
192
+ symbols[item] = SetSymbolSpec(
193
+ ProblemSpec._real_components_of(members[0].symbols[variable])[column],
194
+ references,
195
+ label,
196
+ )
197
+ return symbols
198
+
199
+ @staticmethod
200
+ def _resolve_path(node: NodeSpec, role: str, label: object, elements: dict[str, BlockSpec]) -> BlockSpec:
201
+ """Return the block of an element, a group, or Wiener processes a role of an interaction binds to by label."""
202
+ name = label.label if isinstance(label, WienerProcessSpec) else label
203
+ path = f'{node.scope}{name}' if isinstance(name, str) else None
204
+ if path not in elements:
205
+ where = node.scope.rstrip('/') or 'the root system'
206
+ error_msg = (
207
+ f'Interaction {node.path} binds the role {role!r} to {label!r}, which is not an element or group path '
208
+ f'relative to {where}.'
209
+ )
210
+ raise RoleError(error_msg)
211
+ return elements[path]
212
+
213
+ @staticmethod
214
+ def _resolve_role(node: NodeSpec, role: str, elements: dict[str, BlockSpec]) -> BlockSpec:
215
+ """Return the block of the element or group bound to a role of an interaction."""
216
+ return SpecsPass._resolve_path(node, role, getattr(node.component, role), elements)
217
+
218
+ @staticmethod
219
+ def _end_names(node: NodeSpec, ends: Sequence[str]) -> tuple[str, ...]:
220
+ """Return the names the laws of an interaction read the ends of an edge or the members of a pair under.
221
+
222
+ Each end, such as `'source'`, `'target'`, `'edge'`, `'first'`, or `'second'`, takes the name the interaction's
223
+ `_get_role` returns for it, the end itself by default.
224
+ """
225
+ component: BaseInteraction = node.component
226
+ return tuple(component._get_role(end) for end in ends)
227
+
228
+ @staticmethod
229
+ def _resolve_set(
230
+ node: NodeSpec,
231
+ role: str,
232
+ labels: Sequence[str],
233
+ elements: dict[str, BlockSpec],
234
+ ) -> list[BlockSpec]:
235
+ """Return the blocks of the single elements of one type that a role binds to as an element set."""
236
+ blocks = [SpecsPass._resolve_path(node, role, label, elements) for label in labels]
237
+ grouped = [block.node.path for block in blocks if block.node.members is not None]
238
+ if grouped or not blocks:
239
+ error_msg = (
240
+ f'Interaction {node.path} binds the role {role!r} to a set that holds the groups {", ".join(grouped)}. '
241
+ 'An element set lists single elements of one type, and a role binds to a group by its path.'
242
+ )
243
+ raise RoleError(error_msg)
244
+ types = list(dict.fromkeys(block.node.component_type.__name__ for block in blocks))
245
+ if len(types) > 1:
246
+ error_msg = (
247
+ f'Interaction {node.path} binds the role {role!r} to elements of the types {" and ".join(types)}. An '
248
+ 'element set holds elements of one type.'
249
+ )
250
+ raise RoleError(error_msg)
251
+ return blocks
252
+
253
+ @staticmethod
254
+ def _resolve_member(
255
+ node: NodeSpec,
256
+ role: str,
257
+ reference: str,
258
+ elements: dict[str, BlockSpec],
259
+ ) -> tuple[BlockSpec, int] | None:
260
+ """Return the group block and member index of a member reference such as `sites[3]`, or `None` for a path."""
261
+ match = _MEMBER_REFERENCE.match(reference)
262
+ if match is None or f'{node.scope}{reference}' in elements:
263
+ return None
264
+ block = SpecsPass._resolve_path(node, role, match['path'], elements)
265
+ index, size = int(match['index']), block.node.members
266
+ if size is None or not 0 <= index < size:
267
+ error_msg = (
268
+ f'Interaction {node.path} binds {reference!r} to its role {role!r}, but {block.node.path} holds '
269
+ f'{size or "no"} members. Give a member index from 0 to the group size minus 1.'
270
+ )
271
+ raise RoleError(error_msg)
272
+ return block, index
273
+
274
+ @staticmethod
275
+ def _resolve_entry(
276
+ node: NodeSpec,
277
+ role: str,
278
+ entry: object,
279
+ elements: dict[str, BlockSpec],
280
+ ) -> tuple[BlockSpec, int | None]:
281
+ """Return the block of one entry of a variadic role, with the member index of a member reference.
282
+
283
+ An entry that names a whole group binds its agents, which agent rules read by the role, with no member index.
284
+ """
285
+ member = SpecsPass._resolve_member(node, role, entry, elements) if isinstance(entry, str) else None
286
+ if member is not None:
287
+ return member
288
+ return SpecsPass._resolve_path(node, role, entry, elements), None
289
+
290
+ @staticmethod
291
+ def _resolve_entries(
292
+ node: NodeSpec,
293
+ role: str,
294
+ entries: object,
295
+ elements: dict[str, BlockSpec],
296
+ ) -> list[tuple[BlockSpec, int | None]]:
297
+ """Return the blocks and member indices of the entries of a variadic role, in the given order.
298
+
299
+ An entry is an element path or a group member reference, alone or paired with the name of a state, and the
300
+ entries may be the keys of a mapping, where a state name alone names a state of another role and binds nothing.
301
+ A role bound to `None` has no entries.
302
+ """
303
+ if entries is None:
304
+ return []
305
+ labels = bound_labels(entries)
306
+ if isinstance(entries, Mapping):
307
+ entries = [entry for entry in entries if not isinstance(entry, str)]
308
+ if not isinstance(entries, list | tuple) or len(labels) != len(entries):
309
+ error_msg = (
310
+ f'Interaction {node.path} binds its variadic role {role!r} to {entries!r}. Bind a list of element '
311
+ 'paths and group member references, or of pairs of one of them and a state name.'
312
+ )
313
+ raise RoleError(error_msg)
314
+ return [SpecsPass._resolve_entry(node, role, label, elements) for label in labels]
315
+
316
+ @staticmethod
317
+ def _entry_namespace(
318
+ block: BlockSpec,
319
+ index: int | None,
320
+ ) -> tuple[SimpleNamespace, dict[Expression, ReferenceSpec]]:
321
+ """Return the namespace of an entry of a variadic role, an element or one member of a group.
322
+
323
+ A whole group, whose agents rules read by the role, gives an empty namespace, since symbolic laws read single
324
+ elements or members.
325
+ """
326
+ if index is None and block.node.members is not None:
327
+ return SimpleNamespace(), {}
328
+ if index is None:
329
+ return SpecsPass._namespace(block, ReadKind.SINGLE)
330
+ return SpecsPass._member_namespace(block, index)
331
+
332
+ @staticmethod
333
+ def _source_namespace(
334
+ block: BlockSpec,
335
+ index: int | None,
336
+ bound: Mapping[str, BlockSpec],
337
+ ) -> tuple[SimpleNamespace, dict[Expression, ReferenceSpec]]:
338
+ """Return the namespace of a source of an interaction, a whole field read across a phase space or else an entry.
339
+
340
+ A field on a position lattice is read by the target on a phase space with that position, broadcast along its
341
+ class axes. A field on a phase space is read member by member by a target on a position lattice, whose laws read
342
+ its moments.
343
+ """
344
+ place = block.node.component
345
+ targets = [item.node.component for item in bound.values() if isinstance(item.node.component, FieldElement)]
346
+ if index is not None or not isinstance(place, FieldElement) or not targets:
347
+ return SpecsPass._entry_namespace(block, index)
348
+ space, target = place.space, targets[0].space
349
+ if isinstance(space, PhaseSpace) and not isinstance(target, PhaseSpace):
350
+ return SpecsPass._namespace(block, ReadKind.MEMBER, alias='__across')
351
+ if isinstance(target, PhaseSpace) and not isinstance(space, PhaseSpace):
352
+ return SpecsPass._broadcast_namespace(block, target)
353
+ return SpecsPass._entry_namespace(block, index)
354
+
355
+ @staticmethod
356
+ def _broadcast_namespace(
357
+ block: BlockSpec,
358
+ target: PhaseSpace,
359
+ ) -> tuple[SimpleNamespace, dict[Expression, ReferenceSpec]]:
360
+ """Return the namespace of a field over a position lattice read at every point of a phase space.
361
+
362
+ Args:
363
+ block:
364
+ The block of the field.
365
+
366
+ target:
367
+ The phase space that reads it.
368
+
369
+ Returns:
370
+ namespace:
371
+ The namespace and the references of its symbols, neighbour reads of the site at the same position.
372
+
373
+ Raises:
374
+ ValidationError:
375
+ The field does not have as many sites as the phase space has positions.
376
+ """
377
+ target.check().prepare()
378
+ if block.rows != target.position_size_:
379
+ error_msg = (
380
+ f'{block.node.path} has {block.rows} sites, but it is read by a field on a phase space of '
381
+ f'{target.position_size_} positions. Give the field the position lattice of the phase space.'
382
+ )
383
+ raise ValidationError(error_msg)
384
+ table = np.repeat(np.arange(block.rows), target.size_ // target.position_size_)
385
+ read = NeighborReadSpec(table, None, None, None, 0)
386
+ namespace, references = SpecsPass._namespace(block, ReadKind.NEIGHBOR, alias='__broadcast')
387
+ return namespace, {item: replace(reference, neighbor=read) for item, reference in references.items()}
388
+
389
+ @staticmethod
390
+ def _entry_path(block: BlockSpec, index: int | None) -> str:
391
+ """Return the path of an entry of a variadic role, with the member index of a member reference."""
392
+ return block.node.path if index is None else f'{block.node.path}[{index}]'
393
+
394
+ @staticmethod
395
+ def _with_other(
396
+ block: BlockSpec,
397
+ namespace: SimpleNamespace,
398
+ references: dict[Expression, ReferenceSpec],
399
+ ) -> SimpleNamespace:
400
+ """Return the namespace of a group's member with `other`, the namespace of a neighbour in reductions over them.
401
+
402
+ A group that declares a variable named `other` keeps it, and its laws reduce over neighbours without it.
403
+ """
404
+ if block.node.members is None or 'other' in vars(namespace):
405
+ return SpecsPass._with_hyperedges(block, namespace, references)
406
+ other, other_references = SpecsPass._namespace(block, ReadKind.OTHER, alias='__other')
407
+ references.update(other_references)
408
+ return SpecsPass._with_hyperedges(block, SimpleNamespace(**vars(namespace), other=other), references)
409
+
410
+ @staticmethod
411
+ def _with_hyperedges(
412
+ block: BlockSpec,
413
+ namespace: SimpleNamespace,
414
+ references: dict[Expression, ReferenceSpec],
415
+ ) -> SimpleNamespace:
416
+ """Return the namespace of a member of a group on a network with hyperedges, with the slots of one hyperedge.
417
+
418
+ The slots are `others`, the other members of a hyperedge around the member in its order, as many as the largest
419
+ hyperedge has, and `members`, all its members, which only the reductions over the hyperedges around a member
420
+ read. A group that declares a variable named like a slot keeps it.
421
+ """
422
+ space = SpecsPass._group_space(block)
423
+ if (
424
+ block.node.members is None
425
+ or not isinstance(space, NetworkSpace)
426
+ or not space.hyperedges_
427
+ or {'others', 'members'} & set(vars(namespace))
428
+ ):
429
+ return namespace
430
+ size = max(len(item) for item in space.hyperedges_)
431
+ others = []
432
+ for position in range(size - 1):
433
+ other, other_references = SpecsPass._namespace(block, ReadKind.OTHER, alias=f'__others{position}')
434
+ references.update(other_references)
435
+ others.append(other)
436
+ members, member_references = SpecsPass._namespace(block, ReadKind.OTHER, alias='__members')
437
+ references.update(member_references)
438
+ return SimpleNamespace(**vars(namespace), others=tuple(others), members=members)
439
+
440
+ @staticmethod
441
+ def _changing_search(node: NodeSpec, nodes: BlockSpec, edges: BlockSpec | None, changing: BlockSpec) -> EdgeSearch:
442
+ """Return the edge rows of a layer whose edges change, after checking the bound edge group is its group."""
443
+ if edges is not None and edges is not changing:
444
+ error_msg = (
445
+ f'Interaction {node.path} binds the edge group {edges.node.path}, but the layer changes through the '
446
+ f'variable edge group {changing.node.path}. Bind the variable edge group.'
447
+ )
448
+ raise RoleError(error_msg)
449
+ if nodes.node.active is None:
450
+ error_msg = (
451
+ f'Interaction {node.path} runs on a layer whose edges change, but its nodes {nodes.node.path} are not '
452
+ 'a variable group. Give the group on the nodes `variable=True`.'
453
+ )
454
+ raise RoleError(error_msg)
455
+ empty = np.zeros(0, dtype=np.intp)
456
+ return EdgeSearch(empty, empty, changing.entries[ENDS[0]], changing.entries[ENDS[1]]).check().prepare()
457
+
458
+ @staticmethod
459
+ def _edge_layer(node: NodeSpec, nodes: BlockSpec, edges: BlockSpec | None) -> str | None:
460
+ """Return the layer an interaction over neighbours runs on, checking it against the layer of its edge group."""
461
+ declared = getattr(node.component, 'layer', None)
462
+ if edges is None:
463
+ return declared
464
+ space, edge_space = SpecsPass._group_space(nodes), SpecsPass._group_space(edges)
465
+ if edge_space is not space:
466
+ error_msg = (
467
+ f'Interaction {node.path} binds the edge group {edges.node.path}, which lives on another space than '
468
+ f'the nodes {nodes.node.path}. Give the edge group the network of the nodes.'
469
+ )
470
+ raise RoleError(error_msg)
471
+ layer = getattr(edges.node.component, 'layer', None)
472
+ if declared is not None and declared != layer:
473
+ error_msg = (
474
+ f'Interaction {node.path} runs on the layer {declared!r}, but its edge group {edges.node.path} lives '
475
+ f'on the layer {layer!r}. Give both one layer.'
476
+ )
477
+ raise RoleError(error_msg)
478
+ return layer
479
+
480
+ @staticmethod
481
+ def _edge_roles(
482
+ node: NodeSpec,
483
+ elements: dict[str, BlockSpec],
484
+ ) -> tuple[BlockSpec, BlockSpec | None, BlockSpec | None]:
485
+ """Return the group of nodes of an interaction, its group on edges, if any, and a second group of nodes, if any.
486
+
487
+ The first role bound to a group of nodes binds the members the laws run for, and a second one the other members
488
+ that their reductions run over. A role bound to `None` binds nothing.
489
+ """
490
+ blocks = [
491
+ SpecsPass._resolve_role(node, role, elements)
492
+ for role in declarations_of(node.component, VariableKind.ROLE)
493
+ if getattr(node.component, role) is not None
494
+ ]
495
+ edges = [block for block in blocks if getattr(block.node.component, 'on', None) == 'edges']
496
+ nodes = [block for block in blocks if block not in edges]
497
+ if (
498
+ not 1 <= len(nodes) <= 1 + int(not edges)
499
+ or len(edges) > 1
500
+ or any(block.node.members is None for block in nodes)
501
+ ):
502
+ error_msg = (
503
+ f'Interaction {node.path} over neighbours binds {len(nodes)} groups of nodes and {len(edges)} groups '
504
+ 'on edges. Bind one role to a group with one member per node or site, and at most one role to a group '
505
+ 'on the edges of the same network or to a second group of nodes.'
506
+ )
507
+ raise RoleError(error_msg)
508
+ return nodes[0], next(iter(edges), None), next(iter(nodes[1:]), None)
509
+
510
+ @staticmethod
511
+ def _edge_search(
512
+ node: NodeSpec,
513
+ nodes: BlockSpec,
514
+ edges: BlockSpec | None,
515
+ elements: dict[str, BlockSpec],
516
+ ) -> EdgeSearch:
517
+ """Return the edges an interaction over neighbours runs on, after checking the sizes of its groups."""
518
+ space = SpecsPass._group_space(nodes)
519
+ layer = SpecsPass._edge_layer(node, nodes, edges)
520
+ changing = next(
521
+ (
522
+ block
523
+ for block in elements.values()
524
+ if block.node.active is not None
525
+ and getattr(block.node.component, 'on', None) == 'edges'
526
+ and block.node.space is space
527
+ and getattr(block.node.component, 'layer', None) == layer
528
+ ),
529
+ None,
530
+ )
531
+ if changing is not None:
532
+ return SpecsPass._changing_search(node, nodes, edges, changing)
533
+ if isinstance(space, NetworkSpace):
534
+ if layer not in space.edges_:
535
+ known = ', '.join(repr(label) for label in space.edges_)
536
+ error_msg = (
537
+ f'Interaction {node.path} runs on the layer {layer!r}, but the layers of its network are {known}.'
538
+ )
539
+ raise RoleError(error_msg)
540
+ sources, targets = space.edges_[layer]
541
+ size = space.size_
542
+ elif isinstance(space, LatticeSpace | CayleySpace) and edges is None and layer is None:
543
+ size = int(space.size_ or 0)
544
+ pairs = np.array(space.check().prepare()._neighbor_pairs(), dtype=np.intp).reshape(-1, 2)
545
+ sources, targets = pairs[:, 0].copy(), pairs[:, 1].copy()
546
+ else:
547
+ error_msg = (
548
+ f'Interaction {node.path} over neighbours binds {nodes.node.path}, which lives on {space!r}. Bind a '
549
+ 'group on the nodes of a network, or on the sites of a lattice without edge groups or layers.'
550
+ )
551
+ raise RoleError(error_msg)
552
+ if nodes.rows != size:
553
+ error_msg = (
554
+ f'Interaction {node.path} over neighbours binds {nodes.node.path} of {nodes.rows} members to a space '
555
+ f'of {size} nodes. Bind a group with one member per node or site.'
556
+ )
557
+ raise RoleError(error_msg)
558
+ if edges is not None and edges.rows != sources.size:
559
+ error_msg = (
560
+ f'Interaction {node.path} binds the edge group {edges.node.path} of {edges.rows} members to a layer of '
561
+ f'{sources.size} edges. Give the edge group one member per edge of its layer.'
562
+ )
563
+ raise RoleError(error_msg)
564
+ return EdgeSearch(sources, targets).check().prepare()
565
+
566
+ @staticmethod
567
+ def _degrees(nodes: BlockSpec, search: EdgeSearch) -> np.ndarray | None:
568
+ """Return the number of fixed edges of a layer at every node, both ways on a directed graph, or `None`.
569
+
570
+ A layer whose edges change has no fixed degrees.
571
+ """
572
+ if search.source is not None:
573
+ return None
574
+ size = nodes.rows
575
+ return (np.bincount(search.sources, minlength=size) + np.bincount(search.targets, minlength=size)).astype(float)
576
+
577
+ @staticmethod
578
+ def _with_degree(
579
+ namespace: SimpleNamespace,
580
+ references: dict[Expression, ReferenceSpec],
581
+ name: str,
582
+ reference: ReferenceSpec,
583
+ ) -> SimpleNamespace:
584
+ """Return the namespace of an end of an edge with `degree`, unless the members declare a variable so named."""
585
+ if 'degree' in vars(namespace):
586
+ return namespace
587
+ item = symbol(name, RR)
588
+ references[item] = reference
589
+ return SimpleNamespace(**vars(namespace), degree=item)
590
+
591
+ @staticmethod
592
+ def _declare_degrees(
593
+ node: NodeSpec,
594
+ nodes: BlockSpec,
595
+ search: EdgeSearch,
596
+ declarations: DeclarationsSpec,
597
+ ) -> tuple[DeclarationsSpec, dict[str, ReferenceSpec]]:
598
+ """Return the declarations with a hidden parameter of the degree of every node, and its references by end.
599
+
600
+ Args:
601
+ node:
602
+ The interaction over neighbours.
603
+
604
+ nodes:
605
+ The block of the group on the nodes.
606
+
607
+ search:
608
+ The edges of the interaction.
609
+
610
+ declarations:
611
+ The declarations to extend.
612
+
613
+ Returns:
614
+ degrees:
615
+ The declarations, and the reference of the degree of the source under `'source'` and of the target
616
+ under `'target'`, none for a layer whose edges change. The degree of a node is the number of edges of
617
+ the layer at it, both ways on a directed graph.
618
+ """
619
+ degrees = SpecsPass._degrees(nodes, search)
620
+ if degrees is None:
621
+ return declarations, {}
622
+ entry = EntrySpec(f'{node.path}._degree', declarations.ends[False], (nodes.rows,), RR, nodes.rows)
623
+ declarations = LayoutPass._with_entry(declarations, entry, degrees, is_state=False)
624
+ references = {
625
+ end: ReferenceSpec(entry, False, 0, source)
626
+ for end, source in zip(_EDGE_NAMES[:2], (ReadKind.FIRST, ReadKind.SECOND), strict=True)
627
+ }
628
+ return declarations, references
629
+
630
+ @staticmethod
631
+ def _end_spec(edge: KernelSpec, nodes: BlockSpec) -> KernelSpec:
632
+ """Return the spec of the laws of an interaction over neighbours that read one end of an edge.
633
+
634
+ The spec reads the laws in the namespace of an edge, and evaluates them once per member of the group on the
635
+ nodes. Every symbol of an end of an edge has a symbol of the member, and one of the other member, which the
636
+ reductions of the laws read.
637
+
638
+ Args:
639
+ edge:
640
+ The spec of the edges.
641
+
642
+ nodes:
643
+ The block of the group on the nodes.
644
+
645
+ Returns:
646
+ spec:
647
+ The spec of the laws of the members.
648
+ """
649
+ references = {
650
+ item: reference
651
+ for item, reference in edge.references.items()
652
+ if reference.source in {ReadKind.SINGLE, ReadKind.OTHER}
653
+ }
654
+ for item, reference in edge.references.items():
655
+ if reference.source not in {ReadKind.FIRST, ReadKind.SECOND}:
656
+ continue
657
+ member, other = SpecsPass._end_symbols(item)
658
+ references[member] = replace(reference, source=ReadKind.MEMBER)
659
+ references[other] = replace(reference, source=ReadKind.OTHER)
660
+ return KernelSpec(
661
+ edge.owner,
662
+ edge.namespace,
663
+ references,
664
+ nodes.rows,
665
+ roles=edge.roles,
666
+ group=nodes.node.path,
667
+ groups={nodes.node.path: nodes.rows},
668
+ edges=edge,
669
+ place=edge.place,
670
+ )
671
+
672
+ @staticmethod
673
+ def _end_symbols(item: Expression) -> tuple[Expression, Expression]:
674
+ """Return the symbols of the member and of the other member that a symbol of an end of an edge stands for.
675
+
676
+ Args:
677
+ item:
678
+ A symbol of the source or the target of an edge.
679
+
680
+ Returns:
681
+ symbols:
682
+ The symbol of the member, and the symbol of the other member.
683
+
684
+ Examples:
685
+ >>> from sage.all__sagemath_symbolics import var
686
+ >>> from skcomplex.engine.compile.passes._specs import SpecsPass
687
+ >>> SpecsPass._end_symbols(var('x_cells__source'))
688
+ (x_cells, x_cells__other)
689
+ """
690
+ name = str(item).removesuffix(END_SUFFIXES[0]).removesuffix(END_SUFFIXES[1])
691
+ return symbol(name, domain_of(item)), symbol(f'{name}__other', domain_of(item))
692
+
693
+ @staticmethod
694
+ def _ends_spec(
695
+ block: BlockSpec,
696
+ nodes: BlockSpec,
697
+ parameters: SimpleNamespace,
698
+ references: dict[Expression, ReferenceSpec],
699
+ time: Expression,
700
+ *,
701
+ others: BlockSpec | None = None,
702
+ place: FieldElement | None = None,
703
+ ) -> KernelSpec:
704
+ """Return the spec of the laws of the members of an interaction over neighbours whose members have no edges.
705
+
706
+ The laws read one end as the member and, inside their reductions, the other end as the other members, as on a
707
+ lattice or a network, and the interaction has no laws per edge. With a second group of nodes, the source end
708
+ reads its members, the other members of the reductions, and the target end the members of the first group.
709
+
710
+ Args:
711
+ block:
712
+ The block of the interaction.
713
+
714
+ nodes:
715
+ The block of the group the interaction binds.
716
+
717
+ parameters:
718
+ The namespace of the parameters of the interaction.
719
+
720
+ references:
721
+ The references of the parameters, which the references of the ends extend.
722
+
723
+ time:
724
+ The time symbol.
725
+
726
+ others:
727
+ The block of the second group of nodes, or `None` for the group itself.
728
+
729
+ place:
730
+ The field on the nodes, whose ends on a lattice have the degree of the nearest neighbours, or `None`.
731
+
732
+ Returns:
733
+ spec:
734
+ The spec of the laws of one end.
735
+ """
736
+ namespaces = {}
737
+ ends = (nodes if others is None else others, nodes)
738
+ names = SpecsPass._end_names(block.node, _EDGE_NAMES[:2])
739
+ for end, group, source, suffix in zip(
740
+ names,
741
+ ends,
742
+ (ReadKind.FIRST, ReadKind.SECOND),
743
+ END_SUFFIXES,
744
+ strict=True,
745
+ ):
746
+ namespaces[end], end_references = SpecsPass._namespace(group, source, alias=suffix)
747
+ references.update(end_references)
748
+ if place is not None and isinstance(place.space, LatticeSpace) and 'degree' not in vars(namespaces[end]):
749
+ degree = SR(2 * place.space.check().prepare().n_dim_)
750
+ namespaces[end] = SimpleNamespace(**vars(namespaces[end]), degree=degree)
751
+ namespace = SimpleNamespace(t=time, **vars(parameters), **namespaces)
752
+ paths: dict[str, str | tuple[str, ...]] = {names[0]: ends[0].node.path, names[1]: nodes.node.path}
753
+ edge = KernelSpec(block.node.path, namespace, references, 0, roles=paths, place=place)
754
+ return SpecsPass._end_spec(edge, nodes)
755
+
756
+ @staticmethod
757
+ def _edge_specs(
758
+ block: BlockSpec,
759
+ elements: dict[str, BlockSpec],
760
+ declarations: DeclarationsSpec,
761
+ ) -> tuple[list[KernelSpec], DeclarationsSpec]:
762
+ """Return the specs of an interaction over neighbours, once per edge of its layer and once per node member.
763
+
764
+ Members of a space without edges, such as a continuous space, get the spec of the laws of one end alone.
765
+
766
+ Args:
767
+ block:
768
+ The block of the interaction.
769
+
770
+ elements:
771
+ The blocks of the elements and groups by path.
772
+
773
+ declarations:
774
+ The declarations, which the degrees of the ends extend.
775
+
776
+ Returns:
777
+ specs:
778
+ The spec of the edges, if any, and the spec of the laws of one end, with the extended declarations.
779
+
780
+ Raises:
781
+ LabelError:
782
+ The interaction declares a parameter named like an end or the member of an edge.
783
+ """
784
+ node = block.node
785
+ nodes, edges, others = SpecsPass._edge_roles(node, elements)
786
+ parameters, references = SpecsPass._namespace(block, ReadKind.SINGLE)
787
+ names = SpecsPass._end_names(node, _EDGE_NAMES)
788
+ clashes = sorted(set(vars(parameters)) & {*names, 't'})
789
+ if clashes:
790
+ error_msg = (
791
+ f'Interaction {node.path} over neighbours declares the parameters {", ".join(clashes)}, whose names '
792
+ 'its laws read as the ends and the member of an edge. Rename them.'
793
+ )
794
+ raise LabelError(error_msg)
795
+ component = nodes.node.component
796
+ place = component if isinstance(component, FieldElement) and edges is None and others is None else None
797
+ spread = (
798
+ place is not None
799
+ and isinstance(place.space, LatticeSpace | MeshSpace)
800
+ and getattr(node.component, 'layer', None) is None
801
+ )
802
+ if (
803
+ others is not None
804
+ or spread
805
+ or (
806
+ edges is None
807
+ and not isinstance(SpecsPass._group_space(nodes), LatticeSpace | NetworkSpace | CayleySpace)
808
+ )
809
+ ):
810
+ spec = SpecsPass._ends_spec(
811
+ block,
812
+ nodes,
813
+ parameters,
814
+ references,
815
+ declarations.time,
816
+ others=others,
817
+ place=place,
818
+ )
819
+ return [spec], declarations
820
+ search = SpecsPass._edge_search(node, nodes, edges, elements)
821
+ declarations, degrees = SpecsPass._declare_degrees(node, nodes, search, declarations)
822
+ namespaces: dict[str, SimpleNamespace] = {}
823
+ base = re.sub(r'[^0-9A-Za-z]', '_', node.path)
824
+ ends = zip(_EDGE_NAMES[:2], names[:2], (ReadKind.FIRST, ReadKind.SECOND), END_SUFFIXES, strict=True)
825
+ for end, name, source, suffix in ends:
826
+ namespace, end_references = SpecsPass._namespace(nodes, source, alias=suffix)
827
+ references.update(end_references)
828
+ if end in degrees:
829
+ namespace = SpecsPass._with_degree(namespace, references, f'degree_{base}{suffix}', degrees[end])
830
+ namespaces[name] = SpecsPass._with_hyperedges(nodes, namespace, references)
831
+ paths: dict[str, str | tuple[str, ...]] = {names[0]: nodes.node.path, names[1]: nodes.node.path}
832
+ groups: dict[str, int] = {}
833
+ if edges is not None:
834
+ edge, edge_references = SpecsPass._namespace(edges, ReadKind.MEMBER)
835
+ references.update(edge_references)
836
+ namespaces[names[2]] = edge
837
+ paths[names[2]] = edges.node.path
838
+ groups[edges.node.path] = edges.rows
839
+ elif search.source is not None:
840
+ changing = next(block for block in elements.values() if block.entries.get(ENDS[0]) == search.source)
841
+ activity = symbol(f'active_{re.sub(r"[^0-9A-Za-z]", "_", node.path)}_edges', RR)
842
+ references[activity] = ReferenceSpec(changing.entries[_ACTIVE], False, 0, ReadKind.MEMBER)
843
+ paths[names[2]] = changing.node.path
844
+ namespace = SimpleNamespace(t=declarations.time, **vars(parameters), **namespaces)
845
+ group = edges.node.path if edges is not None else None
846
+ spec = KernelSpec(
847
+ node.path,
848
+ namespace,
849
+ references,
850
+ search.size,
851
+ search,
852
+ roles=paths,
853
+ group=group,
854
+ groups=groups,
855
+ place=place if search.source is None else None,
856
+ )
857
+ return [spec, SpecsPass._end_spec(spec, nodes)], declarations
858
+
859
+ @staticmethod
860
+ def _hyperedge_roles(node: NodeSpec, elements: dict[str, BlockSpec]) -> tuple[BlockSpec, BlockSpec | None]:
861
+ """Return the group on the nodes of a hyperedge interaction and the group its second role binds, if any."""
862
+ blocks = [
863
+ SpecsPass._resolve_role(node, role, elements)
864
+ for role in declarations_of(node.component, VariableKind.ROLE)
865
+ if getattr(node.component, role) is not None
866
+ ]
867
+ parts = [getattr(block.node.component, 'on', None) for block in blocks]
868
+ valid = (
869
+ len(blocks) <= MAX_HYPEREDGE_ROLES
870
+ and parts[0] not in SECOND_PARTS
871
+ and blocks[0].node.members is not None
872
+ and all(part in SECOND_PARTS for part in parts[1:])
873
+ )
874
+ if not valid:
875
+ error_msg = (
876
+ f'Hyperedge interaction {node.path} binds {", ".join(block.node.path for block in blocks)}. Bind its '
877
+ 'first role to a group with one member per node, and at most a second role to a group on the '
878
+ 'hyperedges or on the edges of the same network.'
879
+ )
880
+ raise RoleError(error_msg)
881
+ return blocks[0], next(iter(blocks[1:]), None)
882
+
883
+ @staticmethod
884
+ def _gathered(
885
+ block: BlockSpec,
886
+ alias: str,
887
+ table: Indices | None,
888
+ entry: EntrySpec | None = None,
889
+ order: Indices | None = None,
890
+ ) -> tuple[SimpleNamespace, dict[Expression, ReferenceSpec]]:
891
+ """Return the namespace of one slot of a hyperedge, whose symbols read a group through a gather table.
892
+
893
+ The slot of the members of the hyperedge has no table, and its symbols, which only reductions over the members
894
+ read, have no references. A table of positions in the entry of the members of a growing hypergraph reads its
895
+ members from that entry, and a table of positions in an order drawn at every step reads the members at those
896
+ positions of the order.
897
+ """
898
+ namespace, references = SpecsPass._namespace(block, ReadKind.NEIGHBOR, alias=alias)
899
+ if table is None:
900
+ return namespace, {}
901
+ read = NeighborReadSpec(table, None, None, None, 0, entry, order)
902
+ return namespace, {item: replace(reference, neighbor=read) for item, reference in references.items()}
903
+
904
+ @staticmethod
905
+ def _hyperedge_spec(
906
+ block: BlockSpec,
907
+ roles: tuple[BlockSpec, BlockSpec | None],
908
+ tables: tuple[str, Tables],
909
+ time: Expression,
910
+ *,
911
+ growing: BlockSpec | None = None,
912
+ order: Indices | None = None,
913
+ ) -> KernelSpec:
914
+ """Return the spec of the laws of one kind and one size of hyperedge, read through the tables of its rows.
915
+
916
+ On a network whose hyperedges are the rows of a variable group, the members read their nodes from the entry of
917
+ the members of the group, and the spec reads the activity of the hyperedge of every row. The tables of a
918
+ grouping drawn at every step hold positions in an order, which the spec reads through.
919
+ """
920
+ nodes, second = roles
921
+ mode, (focal, others, hyperedges, edges) = tables
922
+ entry = None if growing is None else growing.entries[MEMBERS]
923
+ parameters, references = SpecsPass._namespace(block, ReadKind.SINGLE)
924
+ namespaces: dict[str, object] = {}
925
+ namespaces['member'], gathered = SpecsPass._gathered(nodes, '__member', focal, entry, order)
926
+ references.update(gathered)
927
+ read = [
928
+ SpecsPass._gathered(nodes, f'__other{position}', table, entry, order)
929
+ for position, table in enumerate(others)
930
+ ]
931
+ namespaces['others'] = tuple(namespace for namespace, _ in read)
932
+ for _, gathered in read:
933
+ references.update(gathered)
934
+ namespaces['members'], _ = SpecsPass._gathered(nodes, '__members', None)
935
+ paths: dict[str, str | tuple[str, ...]] = {'member': nodes.node.path}
936
+ if second is not None:
937
+ part = 'edge' if getattr(second.node.component, 'on', None) == 'edges' else 'hyperedge'
938
+ table = edges if part == 'edge' else hyperedges
939
+ namespaces[part], gathered = SpecsPass._gathered(second, f'__{part}', table)
940
+ references.update(gathered)
941
+ paths[part] = second.node.path
942
+ if growing is not None:
943
+ activity = symbol(f'active_{re.sub(r"[^0-9A-Za-z]", "_", block.node.path)}_{mode}_hyperedges', RR)
944
+ read_activity = NeighborReadSpec(hyperedges, None, None, None, 0)
945
+ references[activity] = ReferenceSpec(growing.entries[_ACTIVE], False, 0, ReadKind.NEIGHBOR, read_activity)
946
+ return KernelSpec(
947
+ block.node.path,
948
+ SimpleNamespace(t=time, **vars(parameters), **namespaces),
949
+ references,
950
+ int(focal.size),
951
+ roles=paths,
952
+ hyperedge=mode,
953
+ )
954
+
955
+ @staticmethod
956
+ def _hyperedge_specs(block: BlockSpec, elements: dict[str, BlockSpec], time: Expression) -> list[KernelSpec]:
957
+ """Return the specs of a hyperedge interaction, of the laws of the focal member and of the hyperedge per size.
958
+
959
+ Args:
960
+ block:
961
+ The block of the interaction.
962
+
963
+ elements:
964
+ The blocks of the elements and groups by path.
965
+
966
+ time:
967
+ The time symbol.
968
+
969
+ Returns:
970
+ specs:
971
+ Two specs per size of hyperedge, the laws of the focal member first.
972
+
973
+ Raises:
974
+ LabelError:
975
+ The interaction declares a parameter named like a slot of a hyperedge.
976
+ """
977
+ node = block.node
978
+ roles = SpecsPass._hyperedge_roles(node, elements)
979
+ SpecsPass._check_slot_names(block)
980
+ growing = next(
981
+ (
982
+ item
983
+ for item in elements.values()
984
+ if item.node.active is not None
985
+ and getattr(item.node.component, 'on', None) == 'hyperedges'
986
+ and item.node.space is roles[0].node.space
987
+ ),
988
+ None,
989
+ )
990
+ if growing is None:
991
+ return [
992
+ SpecsPass._hyperedge_spec(block, roles, tables, time)
993
+ for tables in HyperedgeTables._tables_of(node, *roles)
994
+ ]
995
+ return [
996
+ SpecsPass._hyperedge_spec(block, roles, tables, time, growing=growing)
997
+ for tables in HyperedgeTables._growing_tables_of(node, *roles, growing)
998
+ ]
999
+
1000
+ @staticmethod
1001
+ def _check_slot_names(block: BlockSpec) -> None:
1002
+ """Raise an error for a parameter of an interaction named like a slot of a hyperedge.
1003
+
1004
+ Args:
1005
+ block:
1006
+ The block of the interaction.
1007
+
1008
+ Raises:
1009
+ LabelError:
1010
+ The interaction declares a parameter named like a slot of a hyperedge.
1011
+ """
1012
+ parameters, _ = SpecsPass._namespace(block, ReadKind.SINGLE)
1013
+ clashes = sorted(set(vars(parameters)) & set(HYPEREDGE_NAMES))
1014
+ if clashes:
1015
+ error_msg = (
1016
+ f'Interaction {block.node.path} declares the parameters {", ".join(clashes)}, whose names its laws '
1017
+ 'read as the slots of a hyperedge or a group. Rename them.'
1018
+ )
1019
+ raise LabelError(error_msg)
1020
+
1021
+ @staticmethod
1022
+ def _grouping_specs(block: BlockSpec, elements: dict[str, BlockSpec], time: Expression) -> list[KernelSpec]:
1023
+ """Return the specs of a symbolic grouping, one per size of its groups, whose rows are the members of a group.
1024
+
1025
+ Pairs and partitions read the members at positions of an order drawn at every step, and neighbourhoods read
1026
+ the members of the groups of the space.
1027
+
1028
+ Args:
1029
+ block:
1030
+ The block of the grouping.
1031
+
1032
+ elements:
1033
+ The blocks of the elements and groups by path.
1034
+
1035
+ time:
1036
+ The time symbol.
1037
+
1038
+ Returns:
1039
+ specs:
1040
+ One spec per size of group, whose update laws reduce over the groups that hold a member.
1041
+
1042
+ Raises:
1043
+ RoleError:
1044
+ The target is not a group, or its groups do not fit its space.
1045
+ """
1046
+ node = block.node
1047
+ component = node.component
1048
+ assert isinstance(component, GroupingInteraction)
1049
+ nodes = SpecsPass._resolve_role(node, component._get_role('target'), elements)
1050
+ SpecsPass._check_slot_names(block)
1051
+ groups = HyperedgeTables._groups_of(node, nodes)
1052
+ order = None if component.groups == 'neighborhood' else np.arange(nodes.rows, dtype=np.intp)
1053
+ counts = np.bincount(np.concatenate([members.ravel() for members in groups]), minlength=nodes.rows)
1054
+ specs = []
1055
+ for members in groups:
1056
+ ids = np.arange(members.shape[0], dtype=np.intp)
1057
+ focal, others, hyperedges, _ = HyperedgeTables._tables(members, ids, MEMBER_LAWS)
1058
+ tables = (MEMBER_LAWS, (focal, others, hyperedges, None))
1059
+ spec = SpecsPass._hyperedge_spec(block, (nodes, None), tables, time, order=order)
1060
+ specs.append(replace(spec, reduce=component.reduce, counts=counts[focal]))
1061
+ return specs
1062
+
1063
+ @staticmethod
1064
+ def _member_spec(block: BlockSpec, time: Expression) -> KernelSpec:
1065
+ """Return the kernel spec of the intrinsic laws of an element or group."""
1066
+ namespace, references = SpecsPass._namespace(block, ReadKind.MEMBER)
1067
+ namespace = SpecsPass._with_other(block, namespace, references)
1068
+ group = block.node.path if block.node.members is not None else None
1069
+ return KernelSpec(
1070
+ block.node.path,
1071
+ SimpleNamespace(t=time, **vars(namespace)),
1072
+ references,
1073
+ block.rows,
1074
+ group=group,
1075
+ )
1076
+
1077
+ @staticmethod
1078
+ def _pair_spec(block: BlockSpec, elements: dict[str, BlockSpec], time: Expression) -> KernelSpec:
1079
+ """Return the kernel spec of a pair interaction that is evaluated once per pair within its cutoff."""
1080
+ node = block.node
1081
+ interaction: BaseInteraction = node.component
1082
+ names = SpecsPass._end_names(node, ('first', 'second'))
1083
+ first, second = (SpecsPass._resolve_role(node, name, elements) for name in names)
1084
+ position = getattr(interaction, 'position', 'x')
1085
+ for bound in (first, second):
1086
+ entry = bound.entries.get(position)
1087
+ if entry is None or not entry.member_shape:
1088
+ error_msg = f'Pair interaction {node.path} needs the vector state {position!r} in {bound.node.path}.'
1089
+ raise ValidationError(error_msg)
1090
+ parameters, references = SpecsPass._namespace(block, ReadKind.SINGLE)
1091
+ first_namespace, first_references = SpecsPass._namespace(first, ReadKind.FIRST)
1092
+ second_namespace, second_references = SpecsPass._namespace(second, ReadKind.SECOND, alias='_pair')
1093
+ references.update(first_references)
1094
+ references.update(second_references)
1095
+ period = getattr(interaction, 'period', None)
1096
+ period = period if period is not None else SpecsPass._space_period(node)
1097
+ pairs = (
1098
+ PairSearch(first.entries[position], second.entries[position], block.entries['cutoff'], period)
1099
+ .check()
1100
+ .prepare()
1101
+ )
1102
+ namespace = SimpleNamespace(
1103
+ t=time,
1104
+ **vars(parameters),
1105
+ **{names[0]: first_namespace, names[1]: second_namespace},
1106
+ )
1107
+ paths: dict[str, str | tuple[str, ...]] = {names[0]: first.node.path, names[1]: second.node.path}
1108
+ return KernelSpec(node.path, namespace, references, 0, pairs, roles=paths)
1109
+
1110
+ @staticmethod
1111
+ def _interaction_specs(
1112
+ block: BlockSpec,
1113
+ elements: dict[str, BlockSpec],
1114
+ time: Expression,
1115
+ observer: Observer,
1116
+ ) -> list[KernelSpec]:
1117
+ """Return the kernel specs of an interaction, one per element of its element sets, or else one."""
1118
+ node = block.node
1119
+ declared = declarations_of(node.component, VariableKind.ROLE)
1120
+ labels = {
1121
+ role: getattr(node.component, role)
1122
+ for role, declaration in declared.items()
1123
+ if declaration.variadic or getattr(node.component, role) is not None
1124
+ }
1125
+ variadic = {
1126
+ role: SpecsPass._resolve_entries(node, role, labels[role], elements)
1127
+ for role, declaration in declared.items()
1128
+ if declaration.variadic
1129
+ }
1130
+ sets = {
1131
+ role: SpecsPass._resolve_set(node, role, label, elements)
1132
+ for role, label in labels.items()
1133
+ if role not in variadic and isinstance(label, list | tuple)
1134
+ }
1135
+ observed = {
1136
+ role: found
1137
+ for role, label in labels.items()
1138
+ if role not in sets
1139
+ and role not in variadic
1140
+ and isinstance(found := observer.run((node, label)).observed_, ObservedSpec)
1141
+ }
1142
+ single_members = {
1143
+ role: member
1144
+ for role, label in labels.items()
1145
+ if role not in sets and role not in observed and role not in variadic and isinstance(label, str)
1146
+ if (member := SpecsPass._resolve_member(node, role, label, elements)) is not None
1147
+ }
1148
+ bound = {
1149
+ role: SpecsPass._resolve_role(node, role, elements)
1150
+ for role in labels
1151
+ if role not in sets and role not in observed and role not in variadic and role not in single_members
1152
+ }
1153
+ sizes = {len(members) for members in sets.values()}
1154
+ if len(sizes) > 1:
1155
+ error_msg = (
1156
+ f'Interaction {node.path} binds roles to element sets of different sizes. Give the sets one size.'
1157
+ )
1158
+ raise RoleError(error_msg)
1159
+ groups = {item.node.path: item.rows for item in bound.values() if item.node.members is not None}
1160
+ group = next(iter(groups)) if len(groups) == 1 else None
1161
+ paths: dict[str, str | tuple[str, ...]] = {role: item.node.path for role, item in bound.items()}
1162
+ paths.update({role: tuple(member.node.path for member in members) for role, members in sets.items()})
1163
+ paths.update({role: f'{node.scope}{labels[role]}' for role in observed})
1164
+ paths.update(
1165
+ {role: tuple(SpecsPass._entry_path(*entry) for entry in entries) for role, entries in variadic.items()},
1166
+ )
1167
+ paths.update({role: SpecsPass._entry_path(*member) for role, member in single_members.items()})
1168
+ specs = []
1169
+ for index in range(next(iter(sizes), 1)):
1170
+ parameters, references = SpecsPass._namespace(block, ReadKind.SINGLE)
1171
+ namespaces: dict[str, SimpleNamespace | tuple[SimpleNamespace, ...]] = {}
1172
+ set_symbols: dict[Expression, SetSymbolSpec] = {}
1173
+ for role, members in sets.items():
1174
+ namespaces[role], role_references = SpecsPass._namespace(members[index], ReadKind.SINGLE)
1175
+ references.update(role_references)
1176
+ set_symbols.update(SpecsPass._set_symbols(members, index))
1177
+ for role, value in observed.items():
1178
+ namespaces[role] = value.namespace
1179
+ references.update(value.references)
1180
+ for role, entries in variadic.items():
1181
+ read = [SpecsPass._source_namespace(*entry, bound) for entry in entries]
1182
+ namespaces[role] = tuple(namespace for namespace, _ in read)
1183
+ for _, entry_references in read:
1184
+ references.update(entry_references)
1185
+ for role, (member_block, position) in single_members.items():
1186
+ namespaces[role], role_references = SpecsPass._member_namespace(member_block, position)
1187
+ references.update(role_references)
1188
+ for role, item in bound.items():
1189
+ role_namespace, role_references = SpecsPass._namespace(
1190
+ item,
1191
+ ReadKind.MEMBER if item.node.members is not None else ReadKind.SINGLE,
1192
+ )
1193
+ namespaces[role] = SpecsPass._with_other(item, role_namespace, role_references)
1194
+ references.update(role_references)
1195
+ specs.append(
1196
+ KernelSpec(
1197
+ node.path,
1198
+ SimpleNamespace(t=time, **vars(parameters), **namespaces),
1199
+ references,
1200
+ groups[group] if group is not None else 1,
1201
+ roles=paths,
1202
+ group=group,
1203
+ groups=groups,
1204
+ sets=set_symbols,
1205
+ set_index=index,
1206
+ ),
1207
+ )
1208
+ return specs
1209
+
1210
+ @staticmethod
1211
+ def _binds_separate(block: BlockSpec, bound: list[str], elements: dict[str, BlockSpec]) -> bool:
1212
+ """Check whether an interaction over neighbours binds a role to an element set or to a single element."""
1213
+ node = block.node
1214
+ for role in bound:
1215
+ label = getattr(node.component, role)
1216
+ if isinstance(label, list | tuple):
1217
+ return True
1218
+ if SpecsPass._resolve_member(node, role, label, elements) is not None:
1219
+ continue
1220
+ if SpecsPass._resolve_role(node, role, elements).node.members is None:
1221
+ return True
1222
+ return False
1223
+
1224
+ @staticmethod
1225
+ def _separate_specs(
1226
+ block: BlockSpec,
1227
+ bound: list[str],
1228
+ elements: dict[str, BlockSpec],
1229
+ time: Expression,
1230
+ observer: Observer,
1231
+ ) -> list[KernelSpec]:
1232
+ """Return the specs of an interaction over neighbours that binds separate elements, one per element of a set.
1233
+
1234
+ The first role binds `namespace.target`. When the second role binds a group, `namespace.source` reads its
1235
+ members, and otherwise it is the tuple of the namespaces of the elements the second role binds, or of the other
1236
+ elements of the set the first role binds. The ends take the names the interaction's `_get_role` returns.
1237
+ """
1238
+ node = block.node
1239
+ source_name, target_name = SpecsPass._end_names(node, _EDGE_NAMES[:2])
1240
+ first, second = bound[0], next(iter(bound[1:]), None)
1241
+ sources = getattr(node.component, second or first)
1242
+ separate = second is None or SpecsPass._binds_separate(block, [second], elements)
1243
+ specs = []
1244
+ for spec in SpecsPass._interaction_specs(block, elements, time, observer):
1245
+ namespace = dict(vars(spec.namespace))
1246
+ namespace[target_name] = namespace.pop(first)
1247
+ if second is not None:
1248
+ namespace[source_name] = namespace.pop(second)
1249
+ references = dict(spec.references)
1250
+ if separate:
1251
+ others = [sources] if isinstance(sources, str) else list(sources)
1252
+ if second is None:
1253
+ others = [label for index, label in enumerate(others) if index != spec.set_index]
1254
+ namespace[source_name] = tuple(
1255
+ SpecsPass._other_namespace(node, second or first, label, elements, references) for label in others
1256
+ )
1257
+ specs.append(replace(spec, namespace=SimpleNamespace(**namespace), references=references))
1258
+ return specs
1259
+
1260
+ @staticmethod
1261
+ def _other_namespace(
1262
+ node: NodeSpec,
1263
+ role: str,
1264
+ label: str,
1265
+ elements: dict[str, BlockSpec],
1266
+ references: dict[Expression, ReferenceSpec],
1267
+ ) -> SimpleNamespace:
1268
+ """Return the namespace of one separate element that the reductions of an interaction over neighbours read."""
1269
+ other, other_references = SpecsPass._namespace(
1270
+ SpecsPass._resolve_path(node, role, label, elements),
1271
+ ReadKind.SINGLE,
1272
+ )
1273
+ references.update(other_references)
1274
+ return other
1275
+
1276
+ @staticmethod
1277
+ def _specs_of(
1278
+ block: BlockSpec,
1279
+ elements: dict[str, BlockSpec],
1280
+ declarations: DeclarationsSpec,
1281
+ observer: Observer,
1282
+ ) -> tuple[list[KernelSpec], DeclarationsSpec]:
1283
+ """Return the kernel specs of a component: its intrinsic laws, its edges, its pairs, or its roles.
1284
+
1285
+ Args:
1286
+ block:
1287
+ The block of the component.
1288
+
1289
+ elements:
1290
+ The blocks of the elements and groups by path.
1291
+
1292
+ declarations:
1293
+ The declarations, with the time symbol, which the hidden parameters of the specs extend.
1294
+
1295
+ observer:
1296
+ The prepared observer of the observables that roles may bind to.
1297
+
1298
+ Returns:
1299
+ specs:
1300
+ The kernel specs, with the extended declarations.
1301
+ """
1302
+ time = declarations.time
1303
+ if not block.node.interaction:
1304
+ return [SpecsPass._member_spec(block, time)], declarations
1305
+ component = block.node.component
1306
+ bound = [role for role in declarations_of(component, VariableKind.ROLE) if getattr(component, role) is not None]
1307
+ if isinstance(component, NeighborInteraction) and SpecsPass._binds_separate(block, bound, elements):
1308
+ return SpecsPass._separate_specs(block, bound, elements, time, observer), declarations
1309
+ if isinstance(component, NeighborInteraction) and bound:
1310
+ return SpecsPass._edge_specs(block, elements, declarations)
1311
+ grouped = isinstance(component, GroupingInteraction) and component.form == 'symbolic'
1312
+ if (isinstance(component, HyperedgeInteraction) and bound) or (grouped and component.groups != 'state'):
1313
+ gathered = SpecsPass._grouping_specs if grouped else SpecsPass._hyperedge_specs
1314
+ return gathered(block, elements, time), declarations
1315
+ if isinstance(block.node.component, PairInteraction):
1316
+ return [SpecsPass._pair_spec(block, elements, time)], declarations
1317
+ return SpecsPass._interaction_specs(block, elements, time, observer), declarations