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.
- scikit_complexity-0.2.0.dist-info/METADATA +317 -0
- scikit_complexity-0.2.0.dist-info/RECORD +1748 -0
- scikit_complexity-0.2.0.dist-info/WHEEL +4 -0
- scikit_complexity-0.2.0.dist-info/entry_points.txt +4 -0
- scikit_complexity-0.2.0.dist-info/licenses/LICENSE +21 -0
- skcomplex/__init__.py +1 -0
- skcomplex/analysis/__init__.py +101 -0
- skcomplex/analysis/_alignment.py +263 -0
- skcomplex/analysis/_automata.py +658 -0
- skcomplex/analysis/_base.py +841 -0
- skcomplex/analysis/_clusters.py +298 -0
- skcomplex/analysis/_coarse_grain.py +183 -0
- skcomplex/analysis/_collapse.py +318 -0
- skcomplex/analysis/_complexity.py +129 -0
- skcomplex/analysis/_computational_mechanics.py +220 -0
- skcomplex/analysis/_correlation.py +364 -0
- skcomplex/analysis/_defects.py +111 -0
- skcomplex/analysis/_discovery.py +101 -0
- skcomplex/analysis/_displacement.py +135 -0
- skcomplex/analysis/_distribution.py +327 -0
- skcomplex/analysis/_domains.py +220 -0
- skcomplex/analysis/_embedding.py +235 -0
- skcomplex/analysis/_emergence.py +503 -0
- skcomplex/analysis/_entropy.py +425 -0
- skcomplex/analysis/_ergodicity.py +228 -0
- skcomplex/analysis/_events.py +301 -0
- skcomplex/analysis/_fit.py +368 -0
- skcomplex/analysis/_groups.py +205 -0
- skcomplex/analysis/_information.py +488 -0
- skcomplex/analysis/_invariants.py +409 -0
- skcomplex/analysis/_irreversibility.py +421 -0
- skcomplex/analysis/_kramers_moyal.py +104 -0
- skcomplex/analysis/_large_deviations.py +378 -0
- skcomplex/analysis/_linearization.py +231 -0
- skcomplex/analysis/_local_information.py +166 -0
- skcomplex/analysis/_loops.py +394 -0
- skcomplex/analysis/_lyapunov.py +342 -0
- skcomplex/analysis/_markov.py +303 -0
- skcomplex/analysis/_mode_decomposition.py +209 -0
- skcomplex/analysis/_motifs.py +239 -0
- skcomplex/analysis/_neighbors.py +303 -0
- skcomplex/analysis/_networks.py +286 -0
- skcomplex/analysis/_operator.py +312 -0
- skcomplex/analysis/_partial_information.py +118 -0
- skcomplex/analysis/_passage.py +244 -0
- skcomplex/analysis/_recurrence.py +202 -0
- skcomplex/analysis/_reservoirs.py +387 -0
- skcomplex/analysis/_rolling.py +168 -0
- skcomplex/analysis/_scaling.py +370 -0
- skcomplex/analysis/_sections.py +225 -0
- skcomplex/analysis/_signatures.py +250 -0
- skcomplex/analysis/_sparse_identification.py +398 -0
- skcomplex/analysis/_spectrum.py +164 -0
- skcomplex/analysis/_stability.py +547 -0
- skcomplex/analysis/_surrogates.py +127 -0
- skcomplex/analysis/_symbolic.py +639 -0
- skcomplex/analysis/types.py +43 -0
- skcomplex/base.py +159 -0
- skcomplex/core/__init__.py +1 -0
- skcomplex/core/base.py +150 -0
- skcomplex/core/elements/__init__.py +21 -0
- skcomplex/core/elements/_base.py +84 -0
- skcomplex/core/elements/_compartment.py +52 -0
- skcomplex/core/elements/_density.py +52 -0
- skcomplex/core/elements/_element.py +80 -0
- skcomplex/core/elements/_field.py +192 -0
- skcomplex/core/elements/_group.py +241 -0
- skcomplex/core/elements/_lattice.py +115 -0
- skcomplex/core/elements/_point.py +66 -0
- skcomplex/core/interactions/__init__.py +89 -0
- skcomplex/core/interactions/_advection.py +134 -0
- skcomplex/core/interactions/_base.py +361 -0
- skcomplex/core/interactions/_cascade.py +195 -0
- skcomplex/core/interactions/_choice.py +320 -0
- skcomplex/core/interactions/_conservation.py +164 -0
- skcomplex/core/interactions/_coupling.py +741 -0
- skcomplex/core/interactions/_crossing.py +136 -0
- skcomplex/core/interactions/_diffusion.py +99 -0
- skcomplex/core/interactions/_encounter.py +201 -0
- skcomplex/core/interactions/_euler_lagrange.py +183 -0
- skcomplex/core/interactions/_evolution.py +520 -0
- skcomplex/core/interactions/_feedback.py +79 -0
- skcomplex/core/interactions/_gradient.py +293 -0
- skcomplex/core/interactions/_grouping.py +399 -0
- skcomplex/core/interactions/_hamiltonian.py +191 -0
- skcomplex/core/interactions/_hyperedge.py +96 -0
- skcomplex/core/interactions/_imitation.py +357 -0
- skcomplex/core/interactions/_impulse.py +133 -0
- skcomplex/core/interactions/_interaction.py +58 -0
- skcomplex/core/interactions/_jump.py +201 -0
- skcomplex/core/interactions/_life_cycle.py +424 -0
- skcomplex/core/interactions/_local_rule.py +134 -0
- skcomplex/core/interactions/_map.py +239 -0
- skcomplex/core/interactions/_matching.py +701 -0
- skcomplex/core/interactions/_movement.py +377 -0
- skcomplex/core/interactions/_neighbor.py +88 -0
- skcomplex/core/interactions/_optimization.py +206 -0
- skcomplex/core/interactions/_pair.py +82 -0
- skcomplex/core/interactions/_pair_coupling.py +169 -0
- skcomplex/core/interactions/_rate.py +240 -0
- skcomplex/core/interactions/_reaction.py +466 -0
- skcomplex/core/interactions/_reinforcement.py +226 -0
- skcomplex/core/interactions/_relaxation.py +103 -0
- skcomplex/core/interactions/_sampling.py +177 -0
- skcomplex/core/interactions/_satisfiability.py +145 -0
- skcomplex/core/interactions/_sign_adjustment.py +222 -0
- skcomplex/core/interactions/_topology.py +215 -0
- skcomplex/core/interactions/_training.py +184 -0
- skcomplex/core/interactions/_transfer.py +669 -0
- skcomplex/core/interactions/_transition.py +427 -0
- skcomplex/core/laws/__init__.py +60 -0
- skcomplex/core/laws/_base.py +194 -0
- skcomplex/core/laws/_bilinear.py +91 -0
- skcomplex/core/laws/_boundary.py +59 -0
- skcomplex/core/laws/_cascade.py +79 -0
- skcomplex/core/laws/_crossing.py +87 -0
- skcomplex/core/laws/_dissipator.py +79 -0
- skcomplex/core/laws/_drive.py +56 -0
- skcomplex/core/laws/_emission.py +81 -0
- skcomplex/core/laws/_encounter.py +96 -0
- skcomplex/core/laws/_equation.py +105 -0
- skcomplex/core/laws/_extremal.py +94 -0
- skcomplex/core/laws/_flux.py +108 -0
- skcomplex/core/laws/_fractional_noise.py +65 -0
- skcomplex/core/laws/_generator.py +66 -0
- skcomplex/core/laws/_gradient_step.py +89 -0
- skcomplex/core/laws/_jump.py +137 -0
- skcomplex/core/laws/_local_rule.py +92 -0
- skcomplex/core/laws/_match.py +321 -0
- skcomplex/core/laws/_noise.py +125 -0
- skcomplex/core/laws/_rate.py +82 -0
- skcomplex/core/laws/_rule.py +82 -0
- skcomplex/core/laws/_sample.py +65 -0
- skcomplex/core/laws/_transfer.py +165 -0
- skcomplex/core/laws/_transition.py +77 -0
- skcomplex/core/laws/_update.py +121 -0
- skcomplex/core/laws/utils/__init__.py +142 -0
- skcomplex/core/laws/utils/_agents.py +127 -0
- skcomplex/core/laws/utils/_components.py +63 -0
- skcomplex/core/laws/utils/_conditions.py +198 -0
- skcomplex/core/laws/utils/_contractions.py +74 -0
- skcomplex/core/laws/utils/_delays.py +170 -0
- skcomplex/core/laws/utils/_history.py +167 -0
- skcomplex/core/laws/utils/_local_operators.py +68 -0
- skcomplex/core/laws/utils/_lookups.py +40 -0
- skcomplex/core/laws/utils/_moments.py +122 -0
- skcomplex/core/laws/utils/_operators.py +237 -0
- skcomplex/core/laws/utils/_phase.py +126 -0
- skcomplex/core/laws/utils/_pointwise.py +160 -0
- skcomplex/core/laws/utils/_reductions.py +942 -0
- skcomplex/core/laws/utils/_signals.py +214 -0
- skcomplex/core/laws/utils/_tables.py +4 -0
- skcomplex/core/laws/utils/_tensors.py +235 -0
- skcomplex/core/spaces/__init__.py +52 -0
- skcomplex/core/spaces/_adjacency.py +34 -0
- skcomplex/core/spaces/_base.py +218 -0
- skcomplex/core/spaces/_box.py +41 -0
- skcomplex/core/spaces/_cayley.py +352 -0
- skcomplex/core/spaces/_cone.py +65 -0
- skcomplex/core/spaces/_continuous.py +93 -0
- skcomplex/core/spaces/_continuous_time.py +27 -0
- skcomplex/core/spaces/_discrete_time.py +53 -0
- skcomplex/core/spaces/_generator.py +51 -0
- skcomplex/core/spaces/_lattice.py +194 -0
- skcomplex/core/spaces/_lattice_neighborhood.py +50 -0
- skcomplex/core/spaces/_memory.py +45 -0
- skcomplex/core/spaces/_mesh.py +71 -0
- skcomplex/core/spaces/_moore.py +49 -0
- skcomplex/core/spaces/_nearest.py +41 -0
- skcomplex/core/spaces/_network.py +256 -0
- skcomplex/core/spaces/_phase.py +136 -0
- skcomplex/core/spaces/_radius.py +40 -0
- skcomplex/core/spaces/_static_time.py +34 -0
- skcomplex/core/spaces/_triangular.py +37 -0
- skcomplex/core/spaces/_von_neumann.py +51 -0
- skcomplex/core/specs/__init__.py +25 -0
- skcomplex/core/specs/_census_record_spec.py +72 -0
- skcomplex/core/specs/_census_spec.py +40 -0
- skcomplex/core/specs/_compiled_agents_spec.py +62 -0
- skcomplex/core/specs/_compiled_element_spec.py +59 -0
- skcomplex/core/specs/_compiled_interaction_spec.py +33 -0
- skcomplex/core/specs/_lattice_context_spec.py +40 -0
- skcomplex/core/specs/_lattice_state_spec.py +49 -0
- skcomplex/core/specs/_node_spec.py +64 -0
- skcomplex/core/specs/_operator_view_spec.py +135 -0
- skcomplex/core/specs/_scenario_spec.py +45 -0
- skcomplex/core/specs/_subsystem_spec.py +24 -0
- skcomplex/core/system.py +140 -0
- skcomplex/core/types.py +249 -0
- skcomplex/engine/__init__.py +5 -0
- skcomplex/engine/_utils.py +278 -0
- skcomplex/engine/backends/__init__.py +13 -0
- skcomplex/engine/backends/_base.py +329 -0
- skcomplex/engine/backends/_jax.py +285 -0
- skcomplex/engine/backends/_numba.py +601 -0
- skcomplex/engine/backends/_numba_components.py +67 -0
- skcomplex/engine/backends/_numba_loops.py +163 -0
- skcomplex/engine/backends/_numba_neighbours.py +435 -0
- skcomplex/engine/backends/_numba_printer.py +1023 -0
- skcomplex/engine/backends/_numba_stencils.py +66 -0
- skcomplex/engine/backends/_numpy.py +215 -0
- skcomplex/engine/compile/__init__.py +27 -0
- skcomplex/engine/compile/_base.py +582 -0
- skcomplex/engine/compile/_bound_renewal_spec.py +47 -0
- skcomplex/engine/compile/_compilation.py +351 -0
- skcomplex/engine/compile/_compile.py +100 -0
- skcomplex/engine/compile/_complex.py +216 -0
- skcomplex/engine/compile/_draw_lowering.py +373 -0
- skcomplex/engine/compile/_field_lowering.py +1668 -0
- skcomplex/engine/compile/_flows.py +691 -0
- skcomplex/engine/compile/_forms.py +48 -0
- skcomplex/engine/compile/_laws.py +42 -0
- skcomplex/engine/compile/_learning_compiler.py +481 -0
- skcomplex/engine/compile/_member_reductions.py +206 -0
- skcomplex/engine/compile/_members.py +244 -0
- skcomplex/engine/compile/_observables.py +940 -0
- skcomplex/engine/compile/_observer.py +185 -0
- skcomplex/engine/compile/_pass_compiler.py +1534 -0
- skcomplex/engine/compile/_probe.py +78 -0
- skcomplex/engine/compile/_renewal_law.py +70 -0
- skcomplex/engine/compile/passes/__init__.py +34 -0
- skcomplex/engine/compile/passes/_agents.py +111 -0
- skcomplex/engine/compile/passes/_agents_problem.py +143 -0
- skcomplex/engine/compile/passes/_census.py +808 -0
- skcomplex/engine/compile/passes/_check_fractional_noise.py +107 -0
- skcomplex/engine/compile/passes/_collect.py +31 -0
- skcomplex/engine/compile/passes/_compile_encounters.py +301 -0
- skcomplex/engine/compile/passes/_complex.py +198 -0
- skcomplex/engine/compile/passes/_conserved_noise.py +224 -0
- skcomplex/engine/compile/passes/_core.py +116 -0
- skcomplex/engine/compile/passes/_declare_renewals.py +84 -0
- skcomplex/engine/compile/passes/_draws.py +29 -0
- skcomplex/engine/compile/passes/_encounter_functions.py +60 -0
- skcomplex/engine/compile/passes/_encounter_jacobian.py +25 -0
- skcomplex/engine/compile/passes/_encounter_problem.py +32 -0
- skcomplex/engine/compile/passes/_events.py +204 -0
- skcomplex/engine/compile/passes/_expand_flows.py +32 -0
- skcomplex/engine/compile/passes/_field_functions.py +647 -0
- skcomplex/engine/compile/passes/_field_jacobian.py +38 -0
- skcomplex/engine/compile/passes/_field_problem.py +106 -0
- skcomplex/engine/compile/passes/_flatten.py +339 -0
- skcomplex/engine/compile/passes/_flows_problem.py +29 -0
- skcomplex/engine/compile/passes/_form.py +82 -0
- skcomplex/engine/compile/passes/_fractional_form.py +172 -0
- skcomplex/engine/compile/passes/_fractional_problem.py +91 -0
- skcomplex/engine/compile/passes/_functions.py +485 -0
- skcomplex/engine/compile/passes/_hilbert_space_error.py +10 -0
- skcomplex/engine/compile/passes/_hyperedges.py +598 -0
- skcomplex/engine/compile/passes/_jacobian.py +38 -0
- skcomplex/engine/compile/passes/_kernels.py +407 -0
- skcomplex/engine/compile/passes/_lattices.py +818 -0
- skcomplex/engine/compile/passes/_layout.py +667 -0
- skcomplex/engine/compile/passes/_lower_fields.py +225 -0
- skcomplex/engine/compile/passes/_lower_flows.py +28 -0
- skcomplex/engine/compile/passes/_markov.py +329 -0
- skcomplex/engine/compile/passes/_mask_requests.py +121 -0
- skcomplex/engine/compile/passes/_members.py +30 -0
- skcomplex/engine/compile/passes/_noise.py +196 -0
- skcomplex/engine/compile/passes/_operator_compiler.py +843 -0
- skcomplex/engine/compile/passes/_orders.py +409 -0
- skcomplex/engine/compile/passes/_owners.py +90 -0
- skcomplex/engine/compile/passes/_particles.py +69 -0
- skcomplex/engine/compile/passes/_plan.py +130 -0
- skcomplex/engine/compile/passes/_problem.py +802 -0
- skcomplex/engine/compile/passes/_reduction_lowering.py +1193 -0
- skcomplex/engine/compile/passes/_reductions.py +84 -0
- skcomplex/engine/compile/passes/_renewal_problem.py +357 -0
- skcomplex/engine/compile/passes/_request_jumps.py +51 -0
- skcomplex/engine/compile/passes/_residences.py +140 -0
- skcomplex/engine/compile/passes/_rows.py +162 -0
- skcomplex/engine/compile/passes/_set_renewals_apart.py +29 -0
- skcomplex/engine/compile/passes/_set_rules_apart.py +28 -0
- skcomplex/engine/compile/passes/_specs.py +1317 -0
- skcomplex/engine/compile/passes/_split_requests.py +44 -0
- skcomplex/engine/compile/passes/_topology_functions.py +265 -0
- skcomplex/engine/compile/passes/_topology_problem.py +27 -0
- skcomplex/engine/compile/passes/_towards.py +66 -0
- skcomplex/engine/compile/passes/_unpack_matches.py +29 -0
- skcomplex/engine/compile/passes/_unpack_renewals.py +41 -0
- skcomplex/engine/problems/__init__.py +61 -0
- skcomplex/engine/problems/_base.py +150 -0
- skcomplex/engine/problems/_base_problem_spec.py +153 -0
- skcomplex/engine/problems/_block_spec.py +48 -0
- skcomplex/engine/problems/_born_spec.py +24 -0
- skcomplex/engine/problems/_cascade_kernel.py +134 -0
- skcomplex/engine/problems/_collision_kernel.py +147 -0
- skcomplex/engine/problems/_compiled_delay_spec.py +21 -0
- skcomplex/engine/problems/_compiled_request_spec.py +46 -0
- skcomplex/engine/problems/_control_problem_spec.py +90 -0
- skcomplex/engine/problems/_declarations_spec.py +126 -0
- skcomplex/engine/problems/_delayed_state_spec.py +50 -0
- skcomplex/engine/problems/_diffusive_limit_spec.py +50 -0
- skcomplex/engine/problems/_draw_kernel.py +128 -0
- skcomplex/engine/problems/_drive_kernel.py +65 -0
- skcomplex/engine/problems/_dynamics_spec.py +28 -0
- skcomplex/engine/problems/_edge_row_search.py +78 -0
- skcomplex/engine/problems/_edge_search.py +64 -0
- skcomplex/engine/problems/_encounter_kernel.py +200 -0
- skcomplex/engine/problems/_event_kernel.py +70 -0
- skcomplex/engine/problems/_expression_printer.py +410 -0
- skcomplex/engine/problems/_extremal_kernel.py +125 -0
- skcomplex/engine/problems/_field_operator_kernel.py +105 -0
- skcomplex/engine/problems/_finite_volume_kernel.py +423 -0
- skcomplex/engine/problems/_flow_term_spec.py +45 -0
- skcomplex/engine/problems/_frame_spec.py +105 -0
- skcomplex/engine/problems/_jacobian_kernel.py +575 -0
- skcomplex/engine/problems/_kernel_spec.py +130 -0
- skcomplex/engine/problems/_kinetic_problem_spec.py +23 -0
- skcomplex/engine/problems/_law_kernel.py +604 -0
- skcomplex/engine/problems/_learning_problem_spec.py +67 -0
- skcomplex/engine/problems/_linear_term_spec.py +50 -0
- skcomplex/engine/problems/_loop_term_spec.py +44 -0
- skcomplex/engine/problems/_lowered_kernels_spec.py +59 -0
- skcomplex/engine/problems/_markov_kernel.py +68 -0
- skcomplex/engine/problems/_metric_search.py +155 -0
- skcomplex/engine/problems/_monte_carlo_kernel.py +213 -0
- skcomplex/engine/problems/_neighborhood_kernel.py +594 -0
- skcomplex/engine/problems/_noise_term_spec.py +26 -0
- skcomplex/engine/problems/_observed_spec.py +22 -0
- skcomplex/engine/problems/_operator_kernel.py +102 -0
- skcomplex/engine/problems/_operator_lowering.py +323 -0
- skcomplex/engine/problems/_operator_problem_spec.py +138 -0
- skcomplex/engine/problems/_output_spec.py +78 -0
- skcomplex/engine/problems/_pair_search.py +86 -0
- skcomplex/engine/problems/_partials_spec.py +27 -0
- skcomplex/engine/problems/_partition_spec.py +39 -0
- skcomplex/engine/problems/_printed_spec.py +24 -0
- skcomplex/engine/problems/_problem_functions_spec.py +102 -0
- skcomplex/engine/problems/_problem_spec.py +365 -0
- skcomplex/engine/problems/_random_stream.py +49 -0
- skcomplex/engine/problems/_record_spec.py +22 -0
- skcomplex/engine/problems/_recorded_spec.py +21 -0
- skcomplex/engine/problems/_reduction_kernel.py +254 -0
- skcomplex/engine/problems/_reduction_schedule_spec.py +97 -0
- skcomplex/engine/problems/_reference_spec.py +114 -0
- skcomplex/engine/problems/_relation_spec.py +29 -0
- skcomplex/engine/problems/_renewal_kernel.py +250 -0
- skcomplex/engine/problems/_request_spec.py +27 -0
- skcomplex/engine/problems/_rule_kernel.py +227 -0
- skcomplex/engine/problems/_set_symbol_spec.py +28 -0
- skcomplex/engine/problems/_source_loader.py +113 -0
- skcomplex/engine/problems/_static_search.py +42 -0
- skcomplex/engine/problems/_steps.py +39 -0
- skcomplex/engine/problems/_sweep_spec.py +26 -0
- skcomplex/engine/problems/_symmetry_spec.py +29 -0
- skcomplex/engine/problems/_too_dense.py +8 -0
- skcomplex/engine/problems/_topology_kernel.py +589 -0
- skcomplex/engine/problems/_transfer_network.py +4 -0
- skcomplex/engine/problems/_transfer_network_spec.py +50 -0
- skcomplex/engine/problems/_transfer_state_spec.py +68 -0
- skcomplex/engine/runtime/__init__.py +22 -0
- skcomplex/engine/runtime/_as_fast_as_possible.py +17 -0
- skcomplex/engine/runtime/_base.py +137 -0
- skcomplex/engine/runtime/_conservation.py +125 -0
- skcomplex/engine/runtime/_invariants.py +100 -0
- skcomplex/engine/runtime/_real_time.py +55 -0
- skcomplex/engine/runtime/_recorder.py +84 -0
- skcomplex/engine/runtime/_simulations.py +665 -0
- skcomplex/engine/runtime/_trajectories.py +314 -0
- skcomplex/engine/solvers/__init__.py +95 -0
- skcomplex/engine/solvers/_base.py +372 -0
- skcomplex/engine/solvers/_caputo.py +194 -0
- skcomplex/engine/solvers/_collocation.py +334 -0
- skcomplex/engine/solvers/_convolution.py +155 -0
- skcomplex/engine/solvers/_cosimulation.py +400 -0
- skcomplex/engine/solvers/_crank_nicolson.py +32 -0
- skcomplex/engine/solvers/_defaults.py +34 -0
- skcomplex/engine/solvers/_etdrk4.py +86 -0
- skcomplex/engine/solvers/_euler_maruyama.py +161 -0
- skcomplex/engine/solvers/_event_locator.py +249 -0
- skcomplex/engine/solvers/_external.py +94 -0
- skcomplex/engine/solvers/_fractional_abm.py +126 -0
- skcomplex/engine/solvers/_fractional_euler_maruyama.py +322 -0
- skcomplex/engine/solvers/_gillespie.py +135 -0
- skcomplex/engine/solvers/_gradient_descent.py +353 -0
- skcomplex/engine/solvers/_grunwald_letnikov.py +83 -0
- skcomplex/engine/solvers/_heun.py +89 -0
- skcomplex/engine/solvers/_history.py +184 -0
- skcomplex/engine/solvers/_horizon_error.py +10 -0
- skcomplex/engine/solvers/_imex2.py +40 -0
- skcomplex/engine/solvers/_imex_euler.py +35 -0
- skcomplex/engine/solvers/_jump_trajectories.py +98 -0
- skcomplex/engine/solvers/_kinetics.py +242 -0
- skcomplex/engine/solvers/_l1.py +91 -0
- skcomplex/engine/solvers/_lammps.py +745 -0
- skcomplex/engine/solvers/_lammps_fix_spec.py +41 -0
- skcomplex/engine/solvers/_lattice.py +79 -0
- skcomplex/engine/solvers/_lindblad.py +70 -0
- skcomplex/engine/solvers/_maps.py +105 -0
- skcomplex/engine/solvers/_mesa.py +1624 -0
- skcomplex/engine/solvers/_milstein.py +93 -0
- skcomplex/engine/solvers/_monte_carlo.py +43 -0
- skcomplex/engine/solvers/_operator.py +212 -0
- skcomplex/engine/solvers/_optimal_control.py +368 -0
- skcomplex/engine/solvers/_pontryagin.py +298 -0
- skcomplex/engine/solvers/_renewal.py +90 -0
- skcomplex/engine/solvers/_renewals.py +190 -0
- skcomplex/engine/solvers/_rk4.py +263 -0
- skcomplex/engine/solvers/_root.py +176 -0
- skcomplex/engine/solvers/_rows.py +49 -0
- skcomplex/engine/solvers/_scipy_ode.py +602 -0
- skcomplex/engine/solvers/_sde.py +164 -0
- skcomplex/engine/solvers/_semi_lagrangian.py +213 -0
- skcomplex/engine/solvers/_solver.py +159 -0
- skcomplex/engine/solvers/_split.py +394 -0
- skcomplex/engine/solvers/_ssprk.py +147 -0
- skcomplex/engine/solvers/_strang_splitting.py +178 -0
- skcomplex/engine/solvers/_unitary.py +68 -0
- skcomplex/engine/solvers/_velocity_verlet.py +171 -0
- skcomplex/engine/solvers/_yoshida4.py +242 -0
- skcomplex/engine/types.py +90 -0
- skcomplex/engine/viz/__init__.py +35 -0
- skcomplex/engine/viz/_agents.py +223 -0
- skcomplex/engine/viz/_axes.py +146 -0
- skcomplex/engine/viz/_base.py +365 -0
- skcomplex/engine/viz/_bodies.py +334 -0
- skcomplex/engine/viz/_cayley.py +133 -0
- skcomplex/engine/viz/_expectation.py +208 -0
- skcomplex/engine/viz/_histograms.py +218 -0
- skcomplex/engine/viz/_images.py +307 -0
- skcomplex/engine/viz/_matrices.py +141 -0
- skcomplex/engine/viz/_meshes.py +149 -0
- skcomplex/engine/viz/_points.py +238 -0
- skcomplex/engine/viz/_rerun.py +527 -0
- skcomplex/engine/viz/_rings.py +127 -0
- skcomplex/engine/viz/_scalars.py +129 -0
- skcomplex/engine/viz/_sites.py +228 -0
- skcomplex/errors.py +112 -0
- skcomplex/experiments/__init__.py +36 -0
- skcomplex/experiments/_base.py +373 -0
- skcomplex/experiments/_basin_stability.py +153 -0
- skcomplex/experiments/_calibration.py +194 -0
- skcomplex/experiments/_experiment.py +327 -0
- skcomplex/experiments/_grid.py +36 -0
- skcomplex/experiments/_latin_hypercube.py +44 -0
- skcomplex/experiments/_morris.py +50 -0
- skcomplex/experiments/_one_at_a_time.py +28 -0
- skcomplex/experiments/_orbit_diagram.py +146 -0
- skcomplex/experiments/_random.py +44 -0
- skcomplex/experiments/_results.py +148 -0
- skcomplex/experiments/_rows.py +45 -0
- skcomplex/experiments/_saltelli.py +50 -0
- skcomplex/experiments/_sensitivity.py +122 -0
- skcomplex/experiments/_sobol.py +43 -0
- skcomplex/experiments/specs/__init__.py +1 -0
- skcomplex/experiments/specs/_task_spec.py +78 -0
- skcomplex/experiments/types.py +14 -0
- skcomplex/models/__init__.py +18 -0
- skcomplex/models/_catalog.py +243 -0
- skcomplex/models/_model_catalog.py +270 -0
- skcomplex/models/_model_entry.py +170 -0
- skcomplex/models/_model_listing.py +38 -0
- skcomplex/models/biology/__init__.py +1 -0
- skcomplex/models/biology/collective_behaviour/__init__.py +48 -0
- skcomplex/models/biology/collective_behaviour/_alarm.py +99 -0
- skcomplex/models/biology/collective_behaviour/_ant.py +101 -0
- skcomplex/models/biology/collective_behaviour/_ant_view.py +24 -0
- skcomplex/models/biology/collective_behaviour/_boid.py +104 -0
- skcomplex/models/biology/collective_behaviour/_boid_view.py +25 -0
- skcomplex/models/biology/collective_behaviour/_branch.py +41 -0
- skcomplex/models/biology/collective_behaviour/_decisions.py +149 -0
- skcomplex/models/biology/collective_behaviour/_flight.py +52 -0
- skcomplex/models/biology/collective_behaviour/_flocking.py +75 -0
- skcomplex/models/biology/collective_behaviour/_flocks.py +169 -0
- skcomplex/models/biology/collective_behaviour/_foraging.py +232 -0
- skcomplex/models/biology/collective_behaviour/_ground.py +67 -0
- skcomplex/models/biology/collective_behaviour/_leadership.py +207 -0
- skcomplex/models/biology/collective_behaviour/_morse_potential.py +87 -0
- skcomplex/models/biology/collective_behaviour/_pheromone.py +55 -0
- skcomplex/models/biology/collective_behaviour/_rats.py +41 -0
- skcomplex/models/biology/collective_behaviour/_schooling.py +102 -0
- skcomplex/models/biology/collective_behaviour/_self_propulsion.py +64 -0
- skcomplex/models/biology/collective_behaviour/_shoal_member_view.py +25 -0
- skcomplex/models/biology/collective_behaviour/_swimming.py +66 -0
- skcomplex/models/biology/collective_behaviour/_trail_choice.py +105 -0
- skcomplex/models/biology/collective_behaviour/_trails.py +245 -0
- skcomplex/models/biology/collective_behaviour/_walker.py +97 -0
- skcomplex/models/biology/collective_behaviour/_walker_view.py +23 -0
- skcomplex/models/biology/common/__init__.py +3 -0
- skcomplex/models/biology/common/excitable/__init__.py +7 -0
- skcomplex/models/biology/common/excitable/_fitzhugh_nagumo.py +121 -0
- skcomplex/models/biology/common/kinetics/__init__.py +7 -0
- skcomplex/models/biology/common/kinetics/_michaelis_menten.py +137 -0
- skcomplex/models/biology/common/networks/__init__.py +9 -0
- skcomplex/models/biology/common/networks/_edge_draw.py +95 -0
- skcomplex/models/biology/common/networks/_weighted_edge.py +48 -0
- skcomplex/models/biology/common/pharmacokinetics/__init__.py +7 -0
- skcomplex/models/biology/common/pharmacokinetics/_dosing.py +125 -0
- skcomplex/models/biology/common/populations/__init__.py +19 -0
- skcomplex/models/biology/common/populations/_exponential_growth.py +66 -0
- skcomplex/models/biology/common/populations/_gompertz_growth.py +75 -0
- skcomplex/models/biology/common/populations/_growth.py +176 -0
- skcomplex/models/biology/common/populations/_logistic_growth.py +92 -0
- skcomplex/models/biology/common/populations/_mortality.py +69 -0
- skcomplex/models/biology/common/populations/_population.py +41 -0
- skcomplex/models/biology/common/populations/_power_law_growth.py +71 -0
- skcomplex/models/biology/common/stigmergy/__init__.py +7 -0
- skcomplex/models/biology/common/stigmergy/_evaporation.py +95 -0
- skcomplex/models/biology/ecology/__init__.py +128 -0
- skcomplex/models/biology/ecology/_abundance.py +52 -0
- skcomplex/models/biology/ecology/_agent_predation.py +170 -0
- skcomplex/models/biology/ecology/_cell_quota.py +163 -0
- skcomplex/models/biology/ecology/_clustering.py +96 -0
- skcomplex/models/biology/ecology/_communities.py +234 -0
- skcomplex/models/biology/ecology/_competition.py +95 -0
- skcomplex/models/biology/ecology/_cow.py +49 -0
- skcomplex/models/biology/ecology/_cow_view.py +15 -0
- skcomplex/models/biology/ecology/_emotion_marks.py +65 -0
- skcomplex/models/biology/ecology/_factories.py +322 -0
- skcomplex/models/biology/ecology/_forager.py +116 -0
- skcomplex/models/biology/ecology/_forager_view.py +25 -0
- skcomplex/models/biology/ecology/_fronts.py +128 -0
- skcomplex/models/biology/ecology/_generalized_lotka_volterra.py +66 -0
- skcomplex/models/biology/ecology/_grass.py +96 -0
- skcomplex/models/biology/ecology/_grass_view.py +17 -0
- skcomplex/models/biology/ecology/_grazing.py +66 -0
- skcomplex/models/biology/ecology/_habitat_patch.py +49 -0
- skcomplex/models/biology/ecology/_herding.py +84 -0
- skcomplex/models/biology/ecology/_higher_order.py +102 -0
- skcomplex/models/biology/ecology/_hopping.py +68 -0
- skcomplex/models/biology/ecology/_instability.py +180 -0
- skcomplex/models/biology/ecology/_linear_growth.py +70 -0
- skcomplex/models/biology/ecology/_meadow.py +102 -0
- skcomplex/models/biology/ecology/_microbe.py +47 -0
- skcomplex/models/biology/ecology/_microbial_communities.py +90 -0
- skcomplex/models/biology/ecology/_mutualism.py +81 -0
- skcomplex/models/biology/ecology/_neutral.py +144 -0
- skcomplex/models/biology/ecology/_neutral_replacement.py +54 -0
- skcomplex/models/biology/ecology/_organism.py +63 -0
- skcomplex/models/biology/ecology/_organism_view.py +15 -0
- skcomplex/models/biology/ecology/_parasitism.py +78 -0
- skcomplex/models/biology/ecology/_pasture.py +83 -0
- skcomplex/models/biology/ecology/_pasture_view.py +16 -0
- skcomplex/models/biology/ecology/_pioneer_growth.py +101 -0
- skcomplex/models/biology/ecology/_plant.py +56 -0
- skcomplex/models/biology/ecology/_plant_view.py +16 -0
- skcomplex/models/biology/ecology/_predation.py +290 -0
- skcomplex/models/biology/ecology/_predation_interaction.py +71 -0
- skcomplex/models/biology/ecology/_predator.py +63 -0
- skcomplex/models/biology/ecology/_predator_prey_events.py +120 -0
- skcomplex/models/biology/ecology/_predator_view.py +17 -0
- skcomplex/models/biology/ecology/_prey.py +52 -0
- skcomplex/models/biology/ecology/_prey_view.py +15 -0
- skcomplex/models/biology/ecology/_rosenzweig_macarthur.py +91 -0
- skcomplex/models/biology/ecology/_seasonal_logistic_growth.py +71 -0
- skcomplex/models/biology/ecology/_sequential.py +114 -0
- skcomplex/models/biology/ecology/_sheep.py +63 -0
- skcomplex/models/biology/ecology/_sheep_view.py +17 -0
- skcomplex/models/biology/ecology/_speciation.py +71 -0
- skcomplex/models/biology/ecology/_stand.py +47 -0
- skcomplex/models/biology/ecology/_stigmergic_predator.py +98 -0
- skcomplex/models/biology/ecology/_stigmergic_prey.py +54 -0
- skcomplex/models/biology/ecology/_stigmergy.py +413 -0
- skcomplex/models/biology/ecology/_succession.py +92 -0
- skcomplex/models/biology/ecology/_successional_growth.py +88 -0
- skcomplex/models/biology/ecology/_triplet.py +55 -0
- skcomplex/models/biology/ecology/_wolf.py +63 -0
- skcomplex/models/biology/ecology/_wolf_sheep.py +156 -0
- skcomplex/models/biology/ecology/_wolf_view.py +17 -0
- skcomplex/models/biology/epidemiology/__init__.py +53 -0
- skcomplex/models/biology/epidemiology/_active_host.py +61 -0
- skcomplex/models/biology/epidemiology/_adaptive.py +316 -0
- skcomplex/models/biology/epidemiology/_agents.py +484 -0
- skcomplex/models/biology/epidemiology/_carrier.py +66 -0
- skcomplex/models/biology/epidemiology/_degree_class.py +65 -0
- skcomplex/models/biology/epidemiology/_factories.py +186 -0
- skcomplex/models/biology/epidemiology/_host.py +49 -0
- skcomplex/models/biology/epidemiology/_immunity_loss.py +84 -0
- skcomplex/models/biology/epidemiology/_infection.py +93 -0
- skcomplex/models/biology/epidemiology/_networks.py +170 -0
- skcomplex/models/biology/epidemiology/_outbreaks.py +216 -0
- skcomplex/models/biology/epidemiology/_person.py +103 -0
- skcomplex/models/biology/epidemiology/_person_view.py +23 -0
- skcomplex/models/biology/epidemiology/_recovery.py +92 -0
- skcomplex/models/biology/epidemiology/_recurrent.py +149 -0
- skcomplex/models/biology/epidemiology/_spreading.py +144 -0
- skcomplex/models/biology/epidemiology/_subpopulation.py +92 -0
- skcomplex/models/biology/epidemiology/_traveller.py +65 -0
- skcomplex/models/biology/epidemiology/_traveller_view.py +17 -0
- skcomplex/models/biology/epidemiology/_vaccination.py +184 -0
- skcomplex/models/biology/epidemiology/_walker.py +66 -0
- skcomplex/models/biology/epidemiology/_walker_view.py +17 -0
- skcomplex/models/biology/evolution/__init__.py +60 -0
- skcomplex/models/biology/evolution/_adaptive_climbing.py +106 -0
- skcomplex/models/biology/evolution/_catalysis.py +76 -0
- skcomplex/models/biology/evolution/_catalytic_link.py +21 -0
- skcomplex/models/biology/evolution/_chemical.py +111 -0
- skcomplex/models/biology/evolution/_climber.py +125 -0
- skcomplex/models/biology/evolution/_climber_view.py +19 -0
- skcomplex/models/biology/evolution/_coevolution.py +148 -0
- skcomplex/models/biology/evolution/_cyclic_species.py +44 -0
- skcomplex/models/biology/evolution/_dependency_field.py +56 -0
- skcomplex/models/biology/evolution/_finite_populations.py +287 -0
- skcomplex/models/biology/evolution/_games.py +143 -0
- skcomplex/models/biology/evolution/_genotype_class.py +42 -0
- skcomplex/models/biology/evolution/_individual.py +54 -0
- skcomplex/models/biology/evolution/_individual_view.py +16 -0
- skcomplex/models/biology/evolution/_locus.py +47 -0
- skcomplex/models/biology/evolution/_master_sequence.py +55 -0
- skcomplex/models/biology/evolution/_molecule.py +47 -0
- skcomplex/models/biology/evolution/_moran_step.py +83 -0
- skcomplex/models/biology/evolution/_networks.py +194 -0
- skcomplex/models/biology/evolution/_prebiotic.py +169 -0
- skcomplex/models/biology/evolution/_replicator.py +109 -0
- skcomplex/models/biology/evolution/_strategy.py +42 -0
- skcomplex/models/biology/evolution/_substitution.py +113 -0
- skcomplex/models/biology/evolution/_substitutions.py +126 -0
- skcomplex/models/biology/evolution/_tangled_nature_life_cycle.py +159 -0
- skcomplex/models/biology/evolution/_taxon.py +49 -0
- skcomplex/models/biology/neuroscience/__init__.py +63 -0
- skcomplex/models/biology/neuroscience/_conductances.py +193 -0
- skcomplex/models/biology/neuroscience/_delayed_synapse.py +70 -0
- skcomplex/models/biology/neuroscience/_excitable.py +178 -0
- skcomplex/models/biology/neuroscience/_fitz_hugh_nagumo_neuron.py +46 -0
- skcomplex/models/biology/neuroscience/_global_inhibition.py +71 -0
- skcomplex/models/biology/neuroscience/_hodgkin_huxley.py +103 -0
- skcomplex/models/biology/neuroscience/_inhibitor.py +62 -0
- skcomplex/models/biology/neuroscience/_inhibitor_drive.py +61 -0
- skcomplex/models/biology/neuroscience/_izhikevich.py +77 -0
- skcomplex/models/biology/neuroscience/_leaky_integrate_and_fire.py +80 -0
- skcomplex/models/biology/neuroscience/_mutual_inhibition.py +55 -0
- skcomplex/models/biology/neuroscience/_networks.py +235 -0
- skcomplex/models/biology/neuroscience/_neural_field_site.py +66 -0
- skcomplex/models/biology/neuroscience/_neural_fields.py +94 -0
- skcomplex/models/biology/neuroscience/_neurons.py +129 -0
- skcomplex/models/biology/neuroscience/_polyhomeostatic_neuron.py +93 -0
- skcomplex/models/biology/neuroscience/_populations.py +333 -0
- skcomplex/models/biology/neuroscience/_pulse_coupling.py +71 -0
- skcomplex/models/biology/neuroscience/_rate_unit.py +67 -0
- skcomplex/models/biology/neuroscience/_spike_reset.py +95 -0
- skcomplex/models/biology/neuroscience/_spiking_neuron.py +67 -0
- skcomplex/models/biology/neuroscience/_synapses.py +226 -0
- skcomplex/models/biology/neuroscience/_terman_wang.py +113 -0
- skcomplex/models/biology/neuroscience/_theta_neuron.py +66 -0
- skcomplex/models/biology/neuroscience/_wilson_cowan.py +122 -0
- skcomplex/models/biology/neuroscience/types.py +8 -0
- skcomplex/models/biology/oncology/__init__.py +212 -0
- skcomplex/models/biology/oncology/_androgen_receptor_prostate.py +240 -0
- skcomplex/models/biology/oncology/_androgen_suppression.py +109 -0
- skcomplex/models/biology/oncology/_angiogenesis.py +306 -0
- skcomplex/models/biology/oncology/_angiogenesis_immunotherapy_tumour.py +247 -0
- skcomplex/models/biology/oncology/_angiogenic_tumour.py +110 -0
- skcomplex/models/biology/oncology/_antiangiogenic.py +227 -0
- skcomplex/models/biology/oncology/_bone_marrow_blood.py +196 -0
- skcomplex/models/biology/oncology/_cell_cycle.py +85 -0
- skcomplex/models/biology/oncology/_cell_kinetics.py +285 -0
- skcomplex/models/biology/oncology/_cell_quota_prostate.py +207 -0
- skcomplex/models/biology/oncology/_cell_survival.py +72 -0
- skcomplex/models/biology/oncology/_checkpoint_tumour.py +161 -0
- skcomplex/models/biology/oncology/_chemoimmunotherapy_tumour.py +251 -0
- skcomplex/models/biology/oncology/_chemotherapy.py +565 -0
- skcomplex/models/biology/oncology/_chemovirotherapy_tumour.py +139 -0
- skcomplex/models/biology/oncology/_clonal_tumour.py +134 -0
- skcomplex/models/biology/oncology/_combination_therapy.py +989 -0
- skcomplex/models/biology/oncology/_delayed_vaccinated_tumour.py +341 -0
- skcomplex/models/biology/oncology/_dormant_cell_cycle.py +95 -0
- skcomplex/models/biology/oncology/_erythropoiesis.py +129 -0
- skcomplex/models/biology/oncology/_exponential_linear_growth.py +66 -0
- skcomplex/models/biology/oncology/_gene_viral_therapy.py +480 -0
- skcomplex/models/biology/oncology/_glioma_brain.py +165 -0
- skcomplex/models/biology/oncology/_growth.py +378 -0
- skcomplex/models/biology/oncology/_her2_tumour.py +156 -0
- skcomplex/models/biology/oncology/_hormone_therapy.py +985 -0
- skcomplex/models/biology/oncology/_immune_competition.py +241 -0
- skcomplex/models/biology/oncology/_immunotherapy.py +1001 -0
- skcomplex/models/biology/oncology/_intermittent_suppression.py +130 -0
- skcomplex/models/biology/oncology/_irradiated_tumour.py +105 -0
- skcomplex/models/biology/oncology/_irradiation.py +97 -0
- skcomplex/models/biology/oncology/_kirschner_panetta_tumour.py +132 -0
- skcomplex/models/biology/oncology/_leukaemia_stem_cells.py +150 -0
- skcomplex/models/biology/oncology/_linear_quadratic_survival.py +112 -0
- skcomplex/models/biology/oncology/_log_kill.py +81 -0
- skcomplex/models/biology/oncology/_metastasis_chemotherapy.py +211 -0
- skcomplex/models/biology/oncology/_multidrug_resistance.py +201 -0
- skcomplex/models/biology/oncology/_oncolytic_virus.py +68 -0
- skcomplex/models/biology/oncology/_oncolytic_virus_dendritic.py +155 -0
- skcomplex/models/biology/oncology/_optimal_chemotherapy.py +157 -0
- skcomplex/models/biology/oncology/_optimal_immunotherapy.py +137 -0
- skcomplex/models/biology/oncology/_optimal_therapy.py +208 -0
- skcomplex/models/biology/oncology/_piecewise_linear_prostate.py +147 -0
- skcomplex/models/biology/oncology/_radiation_competition.py +104 -0
- skcomplex/models/biology/oncology/_radiotherapy.py +311 -0
- skcomplex/models/biology/oncology/_resistance_switching.py +148 -0
- skcomplex/models/biology/oncology/_resting_hunting_chemotherapy.py +136 -0
- skcomplex/models/biology/oncology/_sirna_tgf_beta.py +189 -0
- skcomplex/models/biology/oncology/_sprout.py +65 -0
- skcomplex/models/biology/oncology/_sprout_view.py +17 -0
- skcomplex/models/biology/oncology/_stem_cell_differentiation.py +262 -0
- skcomplex/models/biology/oncology/_stem_cells.py +548 -0
- skcomplex/models/biology/oncology/_suppressed_tumour.py +338 -0
- skcomplex/models/biology/oncology/_tamoxifen_tumour.py +172 -0
- skcomplex/models/biology/oncology/_tcr_gene_therapy.py +98 -0
- skcomplex/models/biology/oncology/_therapy_switch.py +86 -0
- skcomplex/models/biology/oncology/_tissue.py +71 -0
- skcomplex/models/biology/oncology/_tumour_cell.py +85 -0
- skcomplex/models/biology/oncology/_tumour_cell_view.py +21 -0
- skcomplex/models/biology/oncology/_tumour_immune_chemotherapy.py +169 -0
- skcomplex/models/biology/oncology/_vaccinated_tumour.py +180 -0
- skcomplex/models/biology/oncology/_vascular_support.py +71 -0
- skcomplex/models/biology/oncology/_vascularized_spheroid.py +264 -0
- skcomplex/models/biology/oncology/_vasculature.py +42 -0
- skcomplex/models/biology/oncology/_vessel.py +49 -0
- skcomplex/models/biology/oncology/_vessel_view.py +15 -0
- skcomplex/models/biology/physiology/__init__.py +46 -0
- skcomplex/models/biology/physiology/_adaptivity.py +277 -0
- skcomplex/models/biology/physiology/_cardiac.py +167 -0
- skcomplex/models/biology/physiology/_chamber.py +71 -0
- skcomplex/models/biology/physiology/_circulation.py +97 -0
- skcomplex/models/biology/physiology/_coagulation.py +130 -0
- skcomplex/models/biology/physiology/_contour_cell.py +61 -0
- skcomplex/models/biology/physiology/_contour_uptake.py +61 -0
- skcomplex/models/biology/physiology/_exchange.py +165 -0
- skcomplex/models/biology/physiology/_exchanging_cell.py +83 -0
- skcomplex/models/biology/physiology/_fitz_hugh_nagumo.py +46 -0
- skcomplex/models/biology/physiology/_glucose_control.py +136 -0
- skcomplex/models/biology/physiology/_mackey_glass.py +81 -0
- skcomplex/models/biology/physiology/_pharmacokinetics.py +104 -0
- skcomplex/models/biology/physiology/_physiology.py +118 -0
- skcomplex/models/biology/physiology/_regulation.py +251 -0
- skcomplex/models/biology/physiology/_resistive_flow.py +67 -0
- skcomplex/models/biology/physiology/_toxicity.py +164 -0
- skcomplex/models/biology/systems_biology/__init__.py +52 -0
- skcomplex/models/biology/systems_biology/_boolean.py +141 -0
- skcomplex/models/biology/systems_biology/_boolean_function.py +84 -0
- skcomplex/models/biology/systems_biology/_boolean_models.py +206 -0
- skcomplex/models/biology/systems_biology/_boolean_node.py +41 -0
- skcomplex/models/biology/systems_biology/_cascades.py +178 -0
- skcomplex/models/biology/systems_biology/_clocks.py +274 -0
- skcomplex/models/biology/systems_biology/_generalized_mass_action.py +123 -0
- skcomplex/models/biology/systems_biology/_genes.py +296 -0
- skcomplex/models/biology/systems_biology/_min_proteins.py +230 -0
- skcomplex/models/biology/systems_biology/_networks.py +359 -0
- skcomplex/models/biology/systems_biology/_phosphorylation_loop.py +121 -0
- skcomplex/models/biology/systems_biology/_probabilistic.py +75 -0
- skcomplex/models/biology/systems_biology/_probabilistic_function.py +127 -0
- skcomplex/models/biology/systems_biology/_probabilistic_node.py +47 -0
- skcomplex/models/biology/systems_biology/_repression.py +104 -0
- skcomplex/models/biology/systems_biology/_s_system.py +88 -0
- skcomplex/models/biology/systems_biology/_species.py +44 -0
- skcomplex/models/biology/systems_biology/_threshold_function.py +63 -0
- skcomplex/models/biology/systems_biology/types.py +9 -0
- skcomplex/models/chemistry/__init__.py +1 -0
- skcomplex/models/chemistry/common/__init__.py +3 -0
- skcomplex/models/chemistry/common/kinetics/__init__.py +9 -0
- skcomplex/models/chemistry/common/kinetics/_brusselator.py +61 -0
- skcomplex/models/chemistry/common/kinetics/_cubic_autocatalysis.py +80 -0
- skcomplex/models/chemistry/kinetics/__init__.py +38 -0
- skcomplex/models/chemistry/kinetics/_catalyst_pellet.py +60 -0
- skcomplex/models/chemistry/kinetics/_cubic_autocatalysis.py +60 -0
- skcomplex/models/chemistry/kinetics/_cyclic.py +130 -0
- skcomplex/models/chemistry/kinetics/_hodgepodge.py +157 -0
- skcomplex/models/chemistry/kinetics/_nanoparticles.py +103 -0
- skcomplex/models/chemistry/kinetics/_oregonator.py +76 -0
- skcomplex/models/chemistry/kinetics/_oscillators.py +244 -0
- skcomplex/models/chemistry/kinetics/_pulsed_electrode.py +107 -0
- skcomplex/models/chemistry/kinetics/_reactions.py +332 -0
- skcomplex/models/chemistry/kinetics/_reactors.py +144 -0
- skcomplex/models/chemistry/pattern_formation/__init__.py +15 -0
- skcomplex/models/chemistry/pattern_formation/_brusselator.py +62 -0
- skcomplex/models/chemistry/pattern_formation/_gray_scott.py +68 -0
- skcomplex/models/chemistry/pattern_formation/_reaction_diffusion.py +268 -0
- skcomplex/models/chemistry/pattern_formation/_schnakenberg.py +67 -0
- skcomplex/models/computer_science/__init__.py +1 -0
- skcomplex/models/computer_science/automata/__init__.py +56 -0
- skcomplex/models/computer_science/automata/_automata.py +229 -0
- skcomplex/models/computer_science/automata/_automaton.py +202 -0
- skcomplex/models/computer_science/automata/_binary_cell.py +41 -0
- skcomplex/models/computer_science/automata/_codes.py +73 -0
- skcomplex/models/computer_science/automata/_diffusion_cell.py +47 -0
- skcomplex/models/computer_science/automata/_group_automata.py +449 -0
- skcomplex/models/computer_science/automata/_groups.py +132 -0
- skcomplex/models/computer_science/automata/_linear_automaton.py +128 -0
- skcomplex/models/computer_science/automata/_noisy_elementary_cell.py +46 -0
- skcomplex/models/computer_science/automata/_pascal_cell.py +41 -0
- skcomplex/models/computer_science/automata/_subshift.py +192 -0
- skcomplex/models/computer_science/automata/_variants.py +292 -0
- skcomplex/models/computer_science/evolutionary_computation/__init__.py +27 -0
- skcomplex/models/computer_science/evolutionary_computation/_annealed_candidate.py +39 -0
- skcomplex/models/computer_science/evolutionary_computation/_bit_string.py +55 -0
- skcomplex/models/computer_science/evolutionary_computation/_bit_string_view.py +13 -0
- skcomplex/models/computer_science/evolutionary_computation/_genetic_algorithms.py +92 -0
- skcomplex/models/computer_science/evolutionary_computation/_landscapes.py +82 -0
- skcomplex/models/computer_science/evolutionary_computation/_optimisers.py +217 -0
- skcomplex/models/computer_science/evolutionary_computation/_reproduction.py +129 -0
- skcomplex/models/computer_science/evolutionary_computation/_room_cleaning.py +170 -0
- skcomplex/models/computer_science/evolutionary_computation/_running_best.py +30 -0
- skcomplex/models/computer_science/evolutionary_computation/_running_best_update.py +58 -0
- skcomplex/models/computer_science/evolutionary_computation/_search_candidate.py +32 -0
- skcomplex/models/computer_science/evolutionary_computation/_strategy.py +54 -0
- skcomplex/models/computer_science/evolutionary_computation/_strategy_view.py +14 -0
- skcomplex/models/computer_science/neural_networks/__init__.py +34 -0
- skcomplex/models/computer_science/neural_networks/_binary_weight.py +32 -0
- skcomplex/models/computer_science/neural_networks/_diluted.py +159 -0
- skcomplex/models/computer_science/neural_networks/_echo_state.py +173 -0
- skcomplex/models/computer_science/neural_networks/_elman.py +160 -0
- skcomplex/models/computer_science/neural_networks/_hidden_unit.py +51 -0
- skcomplex/models/computer_science/neural_networks/_hopfield.py +134 -0
- skcomplex/models/computer_science/neural_networks/_hopfield_update.py +51 -0
- skcomplex/models/computer_science/neural_networks/_input_coupling.py +63 -0
- skcomplex/models/computer_science/neural_networks/_input_unit.py +39 -0
- skcomplex/models/computer_science/neural_networks/_neuron_view.py +14 -0
- skcomplex/models/computer_science/neural_networks/_output_unit.py +51 -0
- skcomplex/models/computer_science/neural_networks/_perceptron.py +72 -0
- skcomplex/models/computer_science/neural_networks/_readout_coupling.py +69 -0
- skcomplex/models/computer_science/neural_networks/_recurrence_coupling.py +66 -0
- skcomplex/models/economics/__init__.py +1 -0
- skcomplex/models/economics/common/__init__.py +3 -0
- skcomplex/models/economics/common/forecasting/__init__.py +7 -0
- skcomplex/models/economics/common/forecasting/_heuristics.py +51 -0
- skcomplex/models/economics/common/resources/__init__.py +7 -0
- skcomplex/models/economics/common/resources/_regrowth.py +70 -0
- skcomplex/models/economics/econophysics/__init__.py +58 -0
- skcomplex/models/economics/econophysics/_crowd_avoidance.py +80 -0
- skcomplex/models/economics/econophysics/_debt_exchange.py +74 -0
- skcomplex/models/economics/econophysics/_diner.py +59 -0
- skcomplex/models/economics/econophysics/_diner_view.py +17 -0
- skcomplex/models/economics/econophysics/_el_farol.py +114 -0
- skcomplex/models/economics/econophysics/_exchange.py +82 -0
- skcomplex/models/economics/econophysics/_game_state_spec.py +26 -0
- skcomplex/models/economics/econophysics/_kinetic.py +80 -0
- skcomplex/models/economics/econophysics/_kolkata.py +87 -0
- skcomplex/models/economics/econophysics/_minority.py +123 -0
- skcomplex/models/economics/econophysics/_minority_game.py +161 -0
- skcomplex/models/economics/econophysics/_minority_player.py +79 -0
- skcomplex/models/economics/econophysics/_minority_player_view.py +22 -0
- skcomplex/models/economics/econophysics/_patron.py +105 -0
- skcomplex/models/economics/econophysics/_patron_view.py +18 -0
- skcomplex/models/economics/econophysics/_predictor_pool.py +181 -0
- skcomplex/models/economics/econophysics/_predictor_pool_view.py +14 -0
- skcomplex/models/economics/econophysics/_restaurants.py +93 -0
- skcomplex/models/economics/econophysics/_saving_exchange.py +73 -0
- skcomplex/models/economics/econophysics/_saving_trader.py +47 -0
- skcomplex/models/economics/econophysics/_saving_trader_view.py +12 -0
- skcomplex/models/economics/econophysics/_wealth_exchange.py +114 -0
- skcomplex/models/economics/econophysics/_welfare.py +210 -0
- skcomplex/models/economics/econophysics/_welfare_policy.py +99 -0
- skcomplex/models/economics/finance/__init__.py +41 -0
- skcomplex/models/economics/finance/_arbitrage.py +139 -0
- skcomplex/models/economics/finance/_asset.py +42 -0
- skcomplex/models/economics/finance/_assets.py +44 -0
- skcomplex/models/economics/finance/_book.py +115 -0
- skcomplex/models/economics/finance/_contagion.py +116 -0
- skcomplex/models/economics/finance/_correlated_assets.py +69 -0
- skcomplex/models/economics/finance/_debt_rank_cascade.py +86 -0
- skcomplex/models/economics/finance/_geometric_brownian_motion.py +89 -0
- skcomplex/models/economics/finance/_gibrat_firm.py +82 -0
- skcomplex/models/economics/finance/_gibrat_firm_view.py +18 -0
- skcomplex/models/economics/finance/_growth_processes.py +195 -0
- skcomplex/models/economics/finance/_interbank.py +76 -0
- skcomplex/models/economics/finance/_interbank_view.py +14 -0
- skcomplex/models/economics/finance/_kesten_firm.py +88 -0
- skcomplex/models/economics/finance/_kesten_firm_view.py +16 -0
- skcomplex/models/economics/finance/_order_book.py +164 -0
- skcomplex/models/economics/finance/_reflecting_floor.py +66 -0
- skcomplex/models/economics/finance/_stock_trader.py +205 -0
- skcomplex/models/economics/finance/_stock_trader_view.py +24 -0
- skcomplex/models/economics/finance/_wealth.py +143 -0
- skcomplex/models/economics/innovation/__init__.py +23 -0
- skcomplex/models/economics/innovation/_adoption.py +233 -0
- skcomplex/models/economics/innovation/_bass.py +124 -0
- skcomplex/models/economics/innovation/_diversity.py +104 -0
- skcomplex/models/economics/innovation/_household_view.py +20 -0
- skcomplex/models/economics/innovation/_invention.py +140 -0
- skcomplex/models/economics/innovation/_part.py +64 -0
- skcomplex/models/economics/innovation/_part_view.py +12 -0
- skcomplex/models/economics/innovation/_redesign.py +88 -0
- skcomplex/models/economics/innovation/_technology.py +203 -0
- skcomplex/models/economics/innovation/_technology_view.py +14 -0
- skcomplex/models/economics/macroeconomics/__init__.py +70 -0
- skcomplex/models/economics/macroeconomics/_banking.py +148 -0
- skcomplex/models/economics/macroeconomics/_business.py +221 -0
- skcomplex/models/economics/macroeconomics/_business_view.py +24 -0
- skcomplex/models/economics/macroeconomics/_capital.py +122 -0
- skcomplex/models/economics/macroeconomics/_central_bank.py +80 -0
- skcomplex/models/economics/macroeconomics/_central_bank_view.py +13 -0
- skcomplex/models/economics/macroeconomics/_circuit.py +93 -0
- skcomplex/models/economics/macroeconomics/_commons.py +77 -0
- skcomplex/models/economics/macroeconomics/_credit.py +219 -0
- skcomplex/models/economics/macroeconomics/_credit_market.py +83 -0
- skcomplex/models/economics/macroeconomics/_depositor.py +114 -0
- skcomplex/models/economics/macroeconomics/_depositor_view.py +19 -0
- skcomplex/models/economics/macroeconomics/_economy.py +42 -0
- skcomplex/models/economics/macroeconomics/_estate.py +88 -0
- skcomplex/models/economics/macroeconomics/_firm.py +184 -0
- skcomplex/models/economics/macroeconomics/_firm_view.py +27 -0
- skcomplex/models/economics/macroeconomics/_firms.py +208 -0
- skcomplex/models/economics/macroeconomics/_firms_element.py +67 -0
- skcomplex/models/economics/macroeconomics/_food_market.py +84 -0
- skcomplex/models/economics/macroeconomics/_growth.py +109 -0
- skcomplex/models/economics/macroeconomics/_households.py +52 -0
- skcomplex/models/economics/macroeconomics/_income.py +59 -0
- skcomplex/models/economics/macroeconomics/_investing_firm_view.py +21 -0
- skcomplex/models/economics/macroeconomics/_labour_market.py +73 -0
- skcomplex/models/economics/macroeconomics/_lender.py +160 -0
- skcomplex/models/economics/macroeconomics/_lender_view.py +18 -0
- skcomplex/models/economics/macroeconomics/_metaphoria.py +257 -0
- skcomplex/models/economics/macroeconomics/_monetary.py +140 -0
- skcomplex/models/economics/macroeconomics/_monetary_bank.py +57 -0
- skcomplex/models/economics/macroeconomics/_optimal_growth.py +173 -0
- skcomplex/models/economics/macroeconomics/_people_spec.py +26 -0
- skcomplex/models/economics/macroeconomics/_plot.py +69 -0
- skcomplex/models/economics/macroeconomics/_plot_view.py +15 -0
- skcomplex/models/economics/macroeconomics/_policy_switch.py +78 -0
- skcomplex/models/economics/macroeconomics/_reserve_bank.py +118 -0
- skcomplex/models/economics/macroeconomics/_reserve_bank_view.py +14 -0
- skcomplex/models/economics/macroeconomics/_settler.py +291 -0
- skcomplex/models/economics/macroeconomics/_settler_view.py +56 -0
- skcomplex/models/economics/macroeconomics/_solow_growth.py +70 -0
- skcomplex/models/economics/macroeconomics/_trade.py +289 -0
- skcomplex/models/economics/markets/__init__.py +128 -0
- skcomplex/models/economics/markets/_auction_ledger.py +81 -0
- skcomplex/models/economics/markets/_barter.py +232 -0
- skcomplex/models/economics/markets/_barter_networks.py +169 -0
- skcomplex/models/economics/markets/_barter_trader.py +136 -0
- skcomplex/models/economics/markets/_barter_trader_view.py +16 -0
- skcomplex/models/economics/markets/_bilateral_barter.py +150 -0
- skcomplex/models/economics/markets/_brewery.py +67 -0
- skcomplex/models/economics/markets/_brock_hommes.py +115 -0
- skcomplex/models/economics/markets/_car.py +75 -0
- skcomplex/models/economics/markets/_car_view.py +14 -0
- skcomplex/models/economics/markets/_car_wash_operation.py +141 -0
- skcomplex/models/economics/markets/_cobweb.py +109 -0
- skcomplex/models/economics/markets/_commodities.py +286 -0
- skcomplex/models/economics/markets/_consumer_view.py +22 -0
- skcomplex/models/economics/markets/_cournot_adjustment.py +65 -0
- skcomplex/models/economics/markets/_cournot_best_response.py +88 -0
- skcomplex/models/economics/markets/_customer.py +147 -0
- skcomplex/models/economics/markets/_customer_view.py +16 -0
- skcomplex/models/economics/markets/_double_auction.py +141 -0
- skcomplex/models/economics/markets/_duopolist.py +54 -0
- skcomplex/models/economics/markets/_duopolist_view.py +13 -0
- skcomplex/models/economics/markets/_duopoly.py +85 -0
- skcomplex/models/economics/markets/_echelon.py +132 -0
- skcomplex/models/economics/markets/_employer.py +102 -0
- skcomplex/models/economics/markets/_employer_view.py +20 -0
- skcomplex/models/economics/markets/_exchange.py +171 -0
- skcomplex/models/economics/markets/_exchange_interaction.py +134 -0
- skcomplex/models/economics/markets/_factory.py +105 -0
- skcomplex/models/economics/markets/_fair_food.py +205 -0
- skcomplex/models/economics/markets/_forager.py +64 -0
- skcomplex/models/economics/markets/_forager_view.py +14 -0
- skcomplex/models/economics/markets/_goods_trader.py +68 -0
- skcomplex/models/economics/markets/_goods_traders.py +139 -0
- skcomplex/models/economics/markets/_heuristic_pricing.py +122 -0
- skcomplex/models/economics/markets/_heuristic_trader.py +108 -0
- skcomplex/models/economics/markets/_heuristic_trader_view.py +14 -0
- skcomplex/models/economics/markets/_inventory.py +212 -0
- skcomplex/models/economics/markets/_jobseeker.py +144 -0
- skcomplex/models/economics/markets/_jobseeker_view.py +26 -0
- skcomplex/models/economics/markets/_labour.py +188 -0
- skcomplex/models/economics/markets/_market.py +39 -0
- skcomplex/models/economics/markets/_market_state_spec.py +25 -0
- skcomplex/models/economics/markets/_oligopoly.py +167 -0
- skcomplex/models/economics/markets/_patch_map_spec.py +22 -0
- skcomplex/models/economics/markets/_perishables.py +150 -0
- skcomplex/models/economics/markets/_price_point.py +95 -0
- skcomplex/models/economics/markets/_prices.py +151 -0
- skcomplex/models/economics/markets/_pricing_firm.py +48 -0
- skcomplex/models/economics/markets/_pricing_firm_view.py +14 -0
- skcomplex/models/economics/markets/_pricing_game_spec.py +81 -0
- skcomplex/models/economics/markets/_produce.py +94 -0
- skcomplex/models/economics/markets/_product.py +97 -0
- skcomplex/models/economics/markets/_product_view.py +13 -0
- skcomplex/models/economics/markets/_queues.py +101 -0
- skcomplex/models/economics/markets/_resident.py +119 -0
- skcomplex/models/economics/markets/_resident_view.py +20 -0
- skcomplex/models/economics/markets/_retail_demand.py +52 -0
- skcomplex/models/economics/markets/_retailer.py +115 -0
- skcomplex/models/economics/markets/_shopper.py +115 -0
- skcomplex/models/economics/markets/_shopper_view.py +15 -0
- skcomplex/models/economics/markets/_shops.py +199 -0
- skcomplex/models/economics/markets/_stall.py +74 -0
- skcomplex/models/economics/markets/_stall_view.py +14 -0
- skcomplex/models/economics/markets/_store.py +171 -0
- skcomplex/models/economics/markets/_store_view.py +27 -0
- skcomplex/models/economics/markets/_sugar_patch.py +61 -0
- skcomplex/models/economics/markets/_sugar_patch_view.py +14 -0
- skcomplex/models/economics/markets/_sugarscape.py +250 -0
- skcomplex/models/economics/markets/_supply_chains.py +217 -0
- skcomplex/models/economics/markets/_supply_link.py +74 -0
- skcomplex/models/economics/markets/_till.py +79 -0
- skcomplex/models/economics/markets/_till_view.py +15 -0
- skcomplex/models/economics/markets/_washer.py +78 -0
- skcomplex/models/economics/markets/_zero_intelligence_buyer.py +99 -0
- skcomplex/models/economics/markets/_zero_intelligence_buyer_view.py +20 -0
- skcomplex/models/economics/markets/_zero_intelligence_seller.py +100 -0
- skcomplex/models/economics/markets/_zero_intelligence_seller_view.py +20 -0
- skcomplex/models/economics/resources/__init__.py +50 -0
- skcomplex/models/economics/resources/_bid_rent.py +104 -0
- skcomplex/models/economics/resources/_commons.py +218 -0
- skcomplex/models/economics/resources/_cow.py +69 -0
- skcomplex/models/economics/resources/_cow_view.py +13 -0
- skcomplex/models/economics/resources/_extraction.py +230 -0
- skcomplex/models/economics/resources/_farmer.py +93 -0
- skcomplex/models/economics/resources/_farmer_view.py +12 -0
- skcomplex/models/economics/resources/_fisheries.py +384 -0
- skcomplex/models/economics/resources/_fishery.py +91 -0
- skcomplex/models/economics/resources/_food.py +370 -0
- skcomplex/models/economics/resources/_grazing.py +148 -0
- skcomplex/models/economics/resources/_harvest.py +69 -0
- skcomplex/models/economics/resources/_harvesting.py +51 -0
- skcomplex/models/economics/resources/_herder.py +78 -0
- skcomplex/models/economics/resources/_herder_view.py +19 -0
- skcomplex/models/economics/resources/_land_cell.py +39 -0
- skcomplex/models/economics/resources/_land_use.py +73 -0
- skcomplex/models/economics/resources/_oil_economy.py +85 -0
- skcomplex/models/economics/resources/_optimal_harvesting.py +180 -0
- skcomplex/models/economics/resources/_pasture.py +98 -0
- skcomplex/models/economics/resources/_pasture_view.py +15 -0
- skcomplex/models/economics/resources/_plantations.py +359 -0
- skcomplex/models/economics/resources/_quota_regulator.py +84 -0
- skcomplex/models/economics/resources/_stock.py +67 -0
- skcomplex/models/engineering/__init__.py +1 -0
- skcomplex/models/engineering/circuits/__init__.py +23 -0
- skcomplex/models/engineering/circuits/_chua_circuit.py +48 -0
- skcomplex/models/engineering/circuits/_circuit.py +47 -0
- skcomplex/models/engineering/circuits/_circuits.py +387 -0
- skcomplex/models/engineering/circuits/_harvesters.py +150 -0
- skcomplex/models/engineering/circuits/_kicked_circuit.py +43 -0
- skcomplex/models/engineering/circuits/_memristor_circuit.py +48 -0
- skcomplex/models/engineering/circuits/_mixed_mode_chua_circuit.py +54 -0
- skcomplex/models/engineering/circuits/_multiscroll_chua_circuit.py +58 -0
- skcomplex/models/engineering/circuits/_tunnel_diode_circuit.py +45 -0
- skcomplex/models/engineering/common/__init__.py +6 -0
- skcomplex/models/engineering/common/mechanics/__init__.py +7 -0
- skcomplex/models/engineering/common/mechanics/_spring_damper.py +121 -0
- skcomplex/models/engineering/control/__init__.py +23 -0
- skcomplex/models/engineering/control/_cart_pendulum.py +119 -0
- skcomplex/models/engineering/control/_control.py +266 -0
- skcomplex/models/engineering/control/_controlled_process.py +72 -0
- skcomplex/models/engineering/control/_driven_oscillator.py +79 -0
- skcomplex/models/engineering/control/_integrator.py +39 -0
- skcomplex/models/engineering/control/_pid.py +106 -0
- skcomplex/models/engineering/control/_regulation.py +170 -0
- skcomplex/models/engineering/control/_room.py +51 -0
- skcomplex/models/engineering/control/_satellite.py +56 -0
- skcomplex/models/engineering/control/_state_feedback.py +82 -0
- skcomplex/models/engineering/control/_swinging_pendulum.py +60 -0
- skcomplex/models/engineering/power_systems/__init__.py +11 -0
- skcomplex/models/engineering/power_systems/_electromechanics.py +224 -0
- skcomplex/models/engineering/power_systems/_faraday_disk.py +93 -0
- skcomplex/models/engineering/power_systems/_grid_node.py +39 -0
- skcomplex/models/engineering/power_systems/_grids.py +89 -0
- skcomplex/models/engineering/power_systems/_rail_segment.py +80 -0
- skcomplex/models/engineering/power_systems/_regenerative_car.py +55 -0
- skcomplex/models/engineering/power_systems/_transmission_line.py +48 -0
- skcomplex/models/engineering/processes/__init__.py +13 -0
- skcomplex/models/engineering/processes/_irrigation_scheme.py +112 -0
- skcomplex/models/engineering/processes/_processes.py +115 -0
- skcomplex/models/engineering/processes/_relief_pipeline.py +79 -0
- skcomplex/models/engineering/processes/_rice_mill.py +112 -0
- skcomplex/models/engineering/processes/_stage.py +34 -0
- skcomplex/models/engineering/processes/_systems.py +316 -0
- skcomplex/models/engineering/processes/_tub.py +42 -0
- skcomplex/models/engineering/processes/_waste_system.py +101 -0
- skcomplex/models/engineering/robotics/__init__.py +12 -0
- skcomplex/models/engineering/robotics/_light_sensitive_robot.py +125 -0
- skcomplex/models/engineering/robotics/_robots.py +177 -0
- skcomplex/models/engineering/robotics/_swarm_robot.py +211 -0
- skcomplex/models/engineering/robotics/_swarm_robot_view.py +23 -0
- skcomplex/models/engineering/traffic/__init__.py +43 -0
- skcomplex/models/engineering/traffic/_arrival.py +117 -0
- skcomplex/models/engineering/traffic/_cab.py +170 -0
- skcomplex/models/engineering/traffic/_cab_view.py +21 -0
- skcomplex/models/engineering/traffic/_car.py +31 -0
- skcomplex/models/engineering/traffic/_car_following.py +245 -0
- skcomplex/models/engineering/traffic/_careless_braking.py +87 -0
- skcomplex/models/engineering/traffic/_continuum.py +429 -0
- skcomplex/models/engineering/traffic/_delayed_following.py +65 -0
- skcomplex/models/engineering/traffic/_driver.py +140 -0
- skcomplex/models/engineering/traffic/_driver_view.py +18 -0
- skcomplex/models/engineering/traffic/_drivers.py +133 -0
- skcomplex/models/engineering/traffic/_gas_kinetic_traffic.py +96 -0
- skcomplex/models/engineering/traffic/_intelligent_driver.py +90 -0
- skcomplex/models/engineering/traffic/_kerner_konhauser.py +42 -0
- skcomplex/models/engineering/traffic/_langevin.py +170 -0
- skcomplex/models/engineering/traffic/_langevin_driving.py +95 -0
- skcomplex/models/engineering/traffic/_lead_car.py +40 -0
- skcomplex/models/engineering/traffic/_lighthill_whitham_richards.py +30 -0
- skcomplex/models/engineering/traffic/_motorist.py +118 -0
- skcomplex/models/engineering/traffic/_motorist_view.py +18 -0
- skcomplex/models/engineering/traffic/_optimal_velocity.py +72 -0
- skcomplex/models/engineering/traffic/_payne.py +38 -0
- skcomplex/models/engineering/traffic/_rider.py +72 -0
- skcomplex/models/engineering/traffic/_rider_view.py +16 -0
- skcomplex/models/engineering/traffic/_ridesharing.py +179 -0
- skcomplex/models/engineering/traffic/_traffic.py +143 -0
- skcomplex/models/engineering/traffic/_traffic_moments.py +57 -0
- skcomplex/models/mathematics/__init__.py +1 -0
- skcomplex/models/mathematics/common/__init__.py +3 -0
- skcomplex/models/mathematics/common/flows/__init__.py +7 -0
- skcomplex/models/mathematics/common/flows/_lorenz.py +90 -0
- skcomplex/models/mathematics/dynamical_systems/__init__.py +90 -0
- skcomplex/models/mathematics/dynamical_systems/_baker_map.py +59 -0
- skcomplex/models/mathematics/dynamical_systems/_blow_up.py +64 -0
- skcomplex/models/mathematics/dynamical_systems/_cat_map.py +44 -0
- skcomplex/models/mathematics/dynamical_systems/_chaotic_ensembles.py +186 -0
- skcomplex/models/mathematics/dynamical_systems/_circle_map.py +49 -0
- skcomplex/models/mathematics/dynamical_systems/_cubic_walk.py +72 -0
- skcomplex/models/mathematics/dynamical_systems/_cusp.py +64 -0
- skcomplex/models/mathematics/dynamical_systems/_doubling_map.py +65 -0
- skcomplex/models/mathematics/dynamical_systems/_driven_flows.py +158 -0
- skcomplex/models/mathematics/dynamical_systems/_flows.py +179 -0
- skcomplex/models/mathematics/dynamical_systems/_henon_map.py +54 -0
- skcomplex/models/mathematics/dynamical_systems/_hopf.py +77 -0
- skcomplex/models/mathematics/dynamical_systems/_intermittency_map.py +44 -0
- skcomplex/models/mathematics/dynamical_systems/_jerk.py +72 -0
- skcomplex/models/mathematics/dynamical_systems/_koopman.py +118 -0
- skcomplex/models/mathematics/dynamical_systems/_logistic_map.py +44 -0
- skcomplex/models/mathematics/dynamical_systems/_maps.py +465 -0
- skcomplex/models/mathematics/dynamical_systems/_newton_map.py +44 -0
- skcomplex/models/mathematics/dynamical_systems/_normal_forms.py +154 -0
- skcomplex/models/mathematics/dynamical_systems/_rossler.py +83 -0
- skcomplex/models/mathematics/dynamical_systems/_saddle_node.py +59 -0
- skcomplex/models/mathematics/dynamical_systems/_skew_tent_map.py +63 -0
- skcomplex/models/mathematics/dynamical_systems/_standard_map.py +52 -0
- skcomplex/models/mathematics/dynamical_systems/_subcritical_forms.py +160 -0
- skcomplex/models/mathematics/dynamical_systems/_takens_bogdanov.py +74 -0
- skcomplex/models/mathematics/dynamical_systems/_tent_map.py +44 -0
- skcomplex/models/mathematics/dynamical_systems/_towel_map.py +59 -0
- skcomplex/models/mathematics/fractals/__init__.py +61 -0
- skcomplex/models/mathematics/fractals/_affine_spec.py +100 -0
- skcomplex/models/mathematics/fractals/_cantor_element.py +92 -0
- skcomplex/models/mathematics/fractals/_chaos_game.py +140 -0
- skcomplex/models/mathematics/fractals/_geometry_spec.py +84 -0
- skcomplex/models/mathematics/fractals/_geometry_visual.py +190 -0
- skcomplex/models/mathematics/fractals/_group_spec.py +24 -0
- skcomplex/models/mathematics/fractals/_koch_element.py +43 -0
- skcomplex/models/mathematics/fractals/_module_spec.py +47 -0
- skcomplex/models/mathematics/fractals/_patch_element.py +89 -0
- skcomplex/models/mathematics/fractals/_patch_kernel.py +200 -0
- skcomplex/models/mathematics/fractals/_patch_structure_spec.py +108 -0
- skcomplex/models/mathematics/fractals/_production_law.py +105 -0
- skcomplex/models/mathematics/fractals/_prototile_spec.py +53 -0
- skcomplex/models/mathematics/fractals/_quadratic.py +191 -0
- skcomplex/models/mathematics/fractals/_random_affine_map.py +100 -0
- skcomplex/models/mathematics/fractals/_rewriting_compiler.py +300 -0
- skcomplex/models/mathematics/fractals/_rewriting_error.py +10 -0
- skcomplex/models/mathematics/fractals/_rewriting_loops.py +180 -0
- skcomplex/models/mathematics/fractals/_rewriting_problem_spec.py +30 -0
- skcomplex/models/mathematics/fractals/_rewriting_solver.py +125 -0
- skcomplex/models/mathematics/fractals/_sierpinski_element.py +110 -0
- skcomplex/models/mathematics/fractals/_substitution.py +130 -0
- skcomplex/models/mathematics/fractals/_substitution_law.py +76 -0
- skcomplex/models/mathematics/fractals/_successor_spec.py +23 -0
- skcomplex/models/mathematics/fractals/_word_element.py +94 -0
- skcomplex/models/mathematics/fractals/_word_kernel.py +526 -0
- skcomplex/models/mathematics/fractals/_word_structure_spec.py +110 -0
- skcomplex/models/mathematics/fractals/_words.py +38 -0
- skcomplex/models/mathematics/fractals/types.py +12 -0
- skcomplex/models/mathematics/fractional_dynamics/__init__.py +29 -0
- skcomplex/models/mathematics/fractional_dynamics/_fractional.py +338 -0
- skcomplex/models/mathematics/fractional_dynamics/_oscillator.py +71 -0
- skcomplex/models/mathematics/fractional_dynamics/_relaxation.py +59 -0
- skcomplex/models/mathematics/fractional_dynamics/_van_der_pol.py +66 -0
- skcomplex/models/mathematics/networks/__init__.py +61 -0
- skcomplex/models/mathematics/networks/_copying_vertex.py +50 -0
- skcomplex/models/mathematics/networks/_ensemble_node.py +48 -0
- skcomplex/models/mathematics/networks/_ensembles.py +195 -0
- skcomplex/models/mathematics/networks/_failing.py +58 -0
- skcomplex/models/mathematics/networks/_giant_component.py +52 -0
- skcomplex/models/mathematics/networks/_growth.py +223 -0
- skcomplex/models/mathematics/networks/_hypergraphs.py +131 -0
- skcomplex/models/mathematics/networks/_link.py +21 -0
- skcomplex/models/mathematics/networks/_network_measures.py +59 -0
- skcomplex/models/mathematics/networks/_network_node.py +86 -0
- skcomplex/models/mathematics/networks/_network_walker.py +49 -0
- skcomplex/models/mathematics/networks/_network_walker_view.py +12 -0
- skcomplex/models/mathematics/networks/_node_content.py +47 -0
- skcomplex/models/mathematics/networks/_node_rank.py +57 -0
- skcomplex/models/mathematics/networks/_processes.py +148 -0
- skcomplex/models/mathematics/networks/_regulated_link.py +47 -0
- skcomplex/models/mathematics/networks/_regulated_node.py +43 -0
- skcomplex/models/mathematics/networks/_simplex.py +46 -0
- skcomplex/models/mathematics/networks/_simplex_ageing.py +46 -0
- skcomplex/models/mathematics/networks/_size_biased_move.py +44 -0
- skcomplex/models/mathematics/networks/_structure.py +170 -0
- skcomplex/models/mathematics/networks/_triad_vertex.py +64 -0
- skcomplex/models/mathematics/networks/_triadic.py +114 -0
- skcomplex/models/mathematics/networks/_triadic_regulation.py +65 -0
- skcomplex/models/mathematics/networks/_vertex.py +52 -0
- skcomplex/models/mathematics/networks/_walker_density.py +51 -0
- skcomplex/models/mathematics/stochastic_processes/__init__.py +62 -0
- skcomplex/models/mathematics/stochastic_processes/_ageing_walker.py +68 -0
- skcomplex/models/mathematics/stochastic_processes/_ageing_walker_view.py +15 -0
- skcomplex/models/mathematics/stochastic_processes/_bernoulli_trial.py +61 -0
- skcomplex/models/mathematics/stochastic_processes/_bernoulli_trial_view.py +14 -0
- skcomplex/models/mathematics/stochastic_processes/_branching.py +103 -0
- skcomplex/models/mathematics/stochastic_processes/_counting.py +88 -0
- skcomplex/models/mathematics/stochastic_processes/_fragment.py +91 -0
- skcomplex/models/mathematics/stochastic_processes/_fragment_view.py +13 -0
- skcomplex/models/mathematics/stochastic_processes/_hidden_markov_source.py +46 -0
- skcomplex/models/mathematics/stochastic_processes/_individual_view.py +13 -0
- skcomplex/models/mathematics/stochastic_processes/_intermittency.py +115 -0
- skcomplex/models/mathematics/stochastic_processes/_markov_source.py +41 -0
- skcomplex/models/mathematics/stochastic_processes/_memory_walker.py +57 -0
- skcomplex/models/mathematics/stochastic_processes/_persistent_walker.py +52 -0
- skcomplex/models/mathematics/stochastic_processes/_poisson_counter.py +47 -0
- skcomplex/models/mathematics/stochastic_processes/_queues.py +117 -0
- skcomplex/models/mathematics/stochastic_processes/_random_walker.py +52 -0
- skcomplex/models/mathematics/stochastic_processes/_reducing.py +104 -0
- skcomplex/models/mathematics/stochastic_processes/_reducing_ball.py +63 -0
- skcomplex/models/mathematics/stochastic_processes/_reducing_ball_view.py +14 -0
- skcomplex/models/mathematics/stochastic_processes/_reducing_jump.py +44 -0
- skcomplex/models/mathematics/stochastic_processes/_sources.py +90 -0
- skcomplex/models/mathematics/stochastic_processes/_urns.py +112 -0
- skcomplex/models/mathematics/stochastic_processes/_walks.py +280 -0
- skcomplex/models/mathematics/stochastic_processes/_weakening_particle.py +57 -0
- skcomplex/models/mathematics/stochastic_processes/types.py +8 -0
- skcomplex/models/physics/__init__.py +1 -0
- skcomplex/models/physics/active_matter/__init__.py +95 -0
- skcomplex/models/physics/active_matter/_active_particle.py +88 -0
- skcomplex/models/physics/active_matter/_alignment.py +192 -0
- skcomplex/models/physics/active_matter/_angular_alignment.py +98 -0
- skcomplex/models/physics/active_matter/_angular_diffusion.py +67 -0
- skcomplex/models/physics/active_matter/_binary_collisions.py +126 -0
- skcomplex/models/physics/active_matter/_chemotaxis.py +173 -0
- skcomplex/models/physics/active_matter/_cohesive_particle.py +132 -0
- skcomplex/models/physics/active_matter/_collective.py +327 -0
- skcomplex/models/physics/active_matter/_collisions.py +127 -0
- skcomplex/models/physics/active_matter/_contractile_gel_site.py +81 -0
- skcomplex/models/physics/active_matter/_cucker_smale_alignment.py +89 -0
- skcomplex/models/physics/active_matter/_depot_particle.py +103 -0
- skcomplex/models/physics/active_matter/_flocker.py +46 -0
- skcomplex/models/physics/active_matter/_flocker_view.py +20 -0
- skcomplex/models/physics/active_matter/_flocks.py +258 -0
- skcomplex/models/physics/active_matter/_gels.py +141 -0
- skcomplex/models/physics/active_matter/_heading_alignment.py +73 -0
- skcomplex/models/physics/active_matter/_kinetic_flocks.py +111 -0
- skcomplex/models/physics/active_matter/_landau_de_gennes_energy.py +107 -0
- skcomplex/models/physics/active_matter/_model_b.py +170 -0
- skcomplex/models/physics/active_matter/_nematic_density_site.py +78 -0
- skcomplex/models/physics/active_matter/_nematic_gel_site.py +115 -0
- skcomplex/models/physics/active_matter/_nematic_particle.py +61 -0
- skcomplex/models/physics/active_matter/_nematics.py +323 -0
- skcomplex/models/physics/active_matter/_nonreciprocal.py +214 -0
- skcomplex/models/physics/active_matter/_ornstein_uhlenbeck_particle.py +87 -0
- skcomplex/models/physics/active_matter/_particles.py +323 -0
- skcomplex/models/physics/active_matter/_phoretic_attraction.py +80 -0
- skcomplex/models/physics/active_matter/_polar_fluid.py +119 -0
- skcomplex/models/physics/active_matter/_polar_gel_site.py +120 -0
- skcomplex/models/physics/active_matter/_propulsion_step.py +64 -0
- skcomplex/models/physics/active_matter/_self_propulsion.py +73 -0
- skcomplex/models/physics/active_matter/_tumbler.py +100 -0
- skcomplex/models/physics/active_matter/_tumbler_view.py +23 -0
- skcomplex/models/physics/active_matter/_vicsek_particle.py +61 -0
- skcomplex/models/physics/celestial_mechanics/__init__.py +19 -0
- skcomplex/models/physics/celestial_mechanics/_dipoles.py +160 -0
- skcomplex/models/physics/celestial_mechanics/_kepler_body.py +76 -0
- skcomplex/models/physics/celestial_mechanics/_orbits.py +332 -0
- skcomplex/models/physics/celestial_mechanics/_rotating_frame_body.py +72 -0
- skcomplex/models/physics/celestial_mechanics/_sitnikov_body.py +54 -0
- skcomplex/models/physics/celestial_mechanics/types.py +6 -0
- skcomplex/models/physics/climate/__init__.py +60 -0
- skcomplex/models/physics/climate/_carbon_cycle.py +169 -0
- skcomplex/models/physics/climate/_climate_anomaly.py +55 -0
- skcomplex/models/physics/climate/_daisyworld.py +158 -0
- skcomplex/models/physics/climate/_delayed_oscillator.py +68 -0
- skcomplex/models/physics/climate/_early_warning.py +102 -0
- skcomplex/models/physics/climate/_energy_balance.py +207 -0
- skcomplex/models/physics/climate/_geodynamo.py +86 -0
- skcomplex/models/physics/climate/_ice_ages.py +179 -0
- skcomplex/models/physics/climate/_ice_albedo_climate.py +100 -0
- skcomplex/models/physics/climate/_latitude_band.py +156 -0
- skcomplex/models/physics/climate/_lorenz84.py +91 -0
- skcomplex/models/physics/climate/_lorenz96.py +67 -0
- skcomplex/models/physics/climate/_low_order.py +162 -0
- skcomplex/models/physics/climate/_net_energy.py +210 -0
- skcomplex/models/physics/climate/_ramped_fold.py +92 -0
- skcomplex/models/physics/climate/_saltzman_maasch.py +123 -0
- skcomplex/models/physics/climate/_soil.py +116 -0
- skcomplex/models/physics/climate/_stochastic_energy_balance.py +124 -0
- skcomplex/models/physics/climate/_tipping.py +141 -0
- skcomplex/models/physics/climate/_tipping_types.py +159 -0
- skcomplex/models/physics/climate/_van_der_pol_ice_ages.py +101 -0
- skcomplex/models/physics/climate/_variability.py +103 -0
- skcomplex/models/physics/common/__init__.py +6 -0
- skcomplex/models/physics/common/fields/__init__.py +14 -0
- skcomplex/models/physics/common/fields/_landau_energy.py +76 -0
- skcomplex/models/physics/common/fields/_phase_field.py +43 -0
- skcomplex/models/physics/common/fields/_swift_hohenberg_energy.py +74 -0
- skcomplex/models/physics/common/fields/_transports.py +119 -0
- skcomplex/models/physics/common/mechanics/__init__.py +5 -0
- skcomplex/models/physics/common/mechanics/_reflection.py +139 -0
- skcomplex/models/physics/common/oscillators/__init__.py +13 -0
- skcomplex/models/physics/common/oscillators/_kuramoto_coupling.py +140 -0
- skcomplex/models/physics/common/oscillators/_phase_oscillator.py +68 -0
- skcomplex/models/physics/common/oscillators/_sited_oscillator.py +55 -0
- skcomplex/models/physics/common/oscillators/_stuart_landau.py +106 -0
- skcomplex/models/physics/common/particles/__init__.py +28 -0
- skcomplex/models/physics/common/particles/_constant_force.py +65 -0
- skcomplex/models/physics/common/particles/_damping.py +72 -0
- skcomplex/models/physics/common/particles/_gravity.py +74 -0
- skcomplex/models/physics/common/particles/_harmonic_potential.py +77 -0
- skcomplex/models/physics/common/particles/_lammps.py +47 -0
- skcomplex/models/physics/common/particles/_langevin_thermostat.py +103 -0
- skcomplex/models/physics/common/particles/_lennard_jones.py +87 -0
- skcomplex/models/physics/common/particles/_mass_point.py +57 -0
- skcomplex/models/physics/common/particles/_potential_energy.py +56 -0
- skcomplex/models/physics/common/particles/_soft_sphere.py +82 -0
- skcomplex/models/physics/common/particles/_spring.py +78 -0
- skcomplex/models/physics/common/particles/_utils.py +25 -0
- skcomplex/models/physics/common/quantum/__init__.py +18 -0
- skcomplex/models/physics/common/quantum/_mode.py +46 -0
- skcomplex/models/physics/common/quantum/_quantum.py +127 -0
- skcomplex/models/physics/common/quantum/_qubit.py +61 -0
- skcomplex/models/physics/common/quantum/_site.py +49 -0
- skcomplex/models/physics/common/quantum/_spin.py +92 -0
- skcomplex/models/physics/common/spins/__init__.py +15 -0
- skcomplex/models/physics/common/spins/_ising_sampling.py +75 -0
- skcomplex/models/physics/common/spins/_potts_sampling.py +73 -0
- skcomplex/models/physics/common/spins/_spin_sampling.py +100 -0
- skcomplex/models/physics/common/spins/_thermal_sampling.py +105 -0
- skcomplex/models/physics/common/spins/_xy_sampling.py +67 -0
- skcomplex/models/physics/cosmology/__init__.py +8 -0
- skcomplex/models/physics/cosmology/_expansion.py +148 -0
- skcomplex/models/physics/criticality/__init__.py +29 -0
- skcomplex/models/physics/criticality/_absorbing.py +210 -0
- skcomplex/models/physics/criticality/_avalanche.py +69 -0
- skcomplex/models/physics/criticality/_crackling_noise.py +129 -0
- skcomplex/models/physics/criticality/_criticality.py +235 -0
- skcomplex/models/physics/criticality/_evolutionary_learning.py +231 -0
- skcomplex/models/physics/criticality/_fire.py +70 -0
- skcomplex/models/physics/criticality/_forest.py +55 -0
- skcomplex/models/physics/criticality/_learning.py +175 -0
- skcomplex/models/physics/criticality/_sandpile_cell.py +47 -0
- skcomplex/models/physics/fluids/__init__.py +49 -0
- skcomplex/models/physics/fluids/_bhatnagar_gross_krook.py +54 -0
- skcomplex/models/physics/fluids/_boussinesq.py +62 -0
- skcomplex/models/physics/fluids/_burgers.py +39 -0
- skcomplex/models/physics/fluids/_carleman_gas.py +61 -0
- skcomplex/models/physics/fluids/_flows.py +436 -0
- skcomplex/models/physics/fluids/_kinetic_equations.py +327 -0
- skcomplex/models/physics/fluids/_kinetics.py +147 -0
- skcomplex/models/physics/fluids/_kuramoto_sivashinsky.py +41 -0
- skcomplex/models/physics/fluids/_lattice_gases.py +217 -0
- skcomplex/models/physics/fluids/_marangoni.py +136 -0
- skcomplex/models/physics/fluids/_shallow_water.py +55 -0
- skcomplex/models/physics/fluids/_vorticity.py +56 -0
- skcomplex/models/physics/fluids/_wave_number.py +50 -0
- skcomplex/models/physics/heat/__init__.py +13 -0
- skcomplex/models/physics/heat/_cooling.py +96 -0
- skcomplex/models/physics/heat/_heat.py +182 -0
- skcomplex/models/physics/mechanics/__init__.py +93 -0
- skcomplex/models/physics/mechanics/_ballistic_pendulum.py +80 -0
- skcomplex/models/physics/mechanics/_bouncing_ball.py +51 -0
- skcomplex/models/physics/mechanics/_cart_pendulum.py +92 -0
- skcomplex/models/physics/mechanics/_cart_pendulum_interaction.py +57 -0
- skcomplex/models/physics/mechanics/_clock_pendulum.py +94 -0
- skcomplex/models/physics/mechanics/_clock_pendulum_interaction.py +60 -0
- skcomplex/models/physics/mechanics/_disc_billiard.py +90 -0
- skcomplex/models/physics/mechanics/_double_pendulum.py +95 -0
- skcomplex/models/physics/mechanics/_double_pendulum_interaction.py +53 -0
- skcomplex/models/physics/mechanics/_elastic_collision.py +78 -0
- skcomplex/models/physics/mechanics/_gyroscope.py +105 -0
- skcomplex/models/physics/mechanics/_gyroscope_interaction.py +57 -0
- skcomplex/models/physics/mechanics/_hanging_ball.py +65 -0
- skcomplex/models/physics/mechanics/_magnet.py +70 -0
- skcomplex/models/physics/mechanics/_mechanics.py +426 -0
- skcomplex/models/physics/mechanics/_parametric_pendulum.py +75 -0
- skcomplex/models/physics/mechanics/_parametric_pendulum_interaction.py +56 -0
- skcomplex/models/physics/mechanics/_pendulum.py +73 -0
- skcomplex/models/physics/mechanics/_pendulum_interaction.py +52 -0
- skcomplex/models/physics/mechanics/_pendulum_spring.py +68 -0
- skcomplex/models/physics/mechanics/_pendulums.py +547 -0
- skcomplex/models/physics/mechanics/_rotating_ball.py +66 -0
- skcomplex/models/physics/mechanics/_rotating_swing.py +100 -0
- skcomplex/models/physics/mechanics/_rotating_swing_interaction.py +70 -0
- skcomplex/models/physics/mechanics/_rotations.py +244 -0
- skcomplex/models/physics/mechanics/_springs.py +176 -0
- skcomplex/models/physics/mechanics/_support_spring.py +65 -0
- skcomplex/models/physics/mechanics/_wells.py +102 -0
- skcomplex/models/physics/nonlinear_oscillators/__init__.py +26 -0
- skcomplex/models/physics/nonlinear_oscillators/_adler_phase.py +73 -0
- skcomplex/models/physics/nonlinear_oscillators/_billiards.py +137 -0
- skcomplex/models/physics/nonlinear_oscillators/_duffing.py +78 -0
- skcomplex/models/physics/nonlinear_oscillators/_henon_heiles.py +57 -0
- skcomplex/models/physics/nonlinear_oscillators/_mushroom_billiard.py +96 -0
- skcomplex/models/physics/nonlinear_oscillators/_oscillators.py +313 -0
- skcomplex/models/physics/nonlinear_oscillators/_sinai_billiard.py +101 -0
- skcomplex/models/physics/nonlinear_oscillators/_van_der_pol.py +92 -0
- skcomplex/models/physics/oceanography/__init__.py +12 -0
- skcomplex/models/physics/oceanography/_gyres.py +145 -0
- skcomplex/models/physics/oceanography/_quasi_geostrophic_site.py +66 -0
- skcomplex/models/physics/oceanography/_thermohaline.py +133 -0
- skcomplex/models/physics/pattern_formation/__init__.py +18 -0
- skcomplex/models/physics/pattern_formation/_conserved.py +168 -0
- skcomplex/models/physics/pattern_formation/_ginzburg_landau.py +83 -0
- skcomplex/models/physics/pattern_formation/_ordering.py +183 -0
- skcomplex/models/physics/pattern_formation/_pattern_field.py +37 -0
- skcomplex/models/physics/pattern_formation/_patterns.py +135 -0
- skcomplex/models/physics/seismology/__init__.py +11 -0
- skcomplex/models/physics/seismology/_faults.py +118 -0
- skcomplex/models/physics/seismology/_spring_blocks.py +175 -0
- skcomplex/models/physics/soft_matter/__init__.py +76 -0
- skcomplex/models/physics/soft_matter/_anomalous.py +331 -0
- skcomplex/models/physics/soft_matter/_brownian.py +137 -0
- skcomplex/models/physics/soft_matter/_brownian_particle.py +58 -0
- skcomplex/models/physics/soft_matter/_colored_noise.py +137 -0
- skcomplex/models/physics/soft_matter/_continuous_time_walker.py +62 -0
- skcomplex/models/physics/soft_matter/_diffusion.py +418 -0
- skcomplex/models/physics/soft_matter/_double_well.py +57 -0
- skcomplex/models/physics/soft_matter/_flashing_sawtooth.py +82 -0
- skcomplex/models/physics/soft_matter/_fractional_walker.py +54 -0
- skcomplex/models/physics/soft_matter/_friction.py +214 -0
- skcomplex/models/physics/soft_matter/_levy_flier.py +54 -0
- skcomplex/models/physics/soft_matter/_levy_walker.py +67 -0
- skcomplex/models/physics/soft_matter/_modulated_particle.py +76 -0
- skcomplex/models/physics/soft_matter/_optical_trap.py +93 -0
- skcomplex/models/physics/soft_matter/_ratchets.py +163 -0
- skcomplex/models/physics/soft_matter/_scaled_walker.py +57 -0
- skcomplex/models/physics/soft_matter/_speckle_field.py +81 -0
- skcomplex/models/physics/soft_matter/_thermal_noise.py +52 -0
- skcomplex/models/physics/soft_matter/_tilted_washboard.py +70 -0
- skcomplex/models/physics/soft_matter/_transient_walker.py +61 -0
- skcomplex/models/physics/soft_matter/_traps.py +166 -0
- skcomplex/models/physics/soft_matter/_wall_particle.py +72 -0
- skcomplex/models/physics/statistical_mechanics/__init__.py +114 -0
- skcomplex/models/physics/statistical_mechanics/_absorbing_processes.py +156 -0
- skcomplex/models/physics/statistical_mechanics/_boltzmann_average.py +44 -0
- skcomplex/models/physics/statistical_mechanics/_boltzmann_sum.py +83 -0
- skcomplex/models/physics/statistical_mechanics/_bond_sampling.py +46 -0
- skcomplex/models/physics/statistical_mechanics/_bond_spin.py +76 -0
- skcomplex/models/physics/statistical_mechanics/_contact_site.py +85 -0
- skcomplex/models/physics/statistical_mechanics/_dephasing.py +59 -0
- skcomplex/models/physics/statistical_mechanics/_disk.py +36 -0
- skcomplex/models/physics/statistical_mechanics/_driven_particles.py +250 -0
- skcomplex/models/physics/statistical_mechanics/_energy_level.py +30 -0
- skcomplex/models/physics/statistical_mechanics/_exclusion_hops.py +76 -0
- skcomplex/models/physics/statistical_mechanics/_exclusion_site.py +61 -0
- skcomplex/models/physics/statistical_mechanics/_fully_connected_spins.py +232 -0
- skcomplex/models/physics/statistical_mechanics/_gases.py +156 -0
- skcomplex/models/physics/statistical_mechanics/_graph_spins.py +93 -0
- skcomplex/models/physics/statistical_mechanics/_ising_spin.py +63 -0
- skcomplex/models/physics/statistical_mechanics/_kinetic_temperature.py +66 -0
- skcomplex/models/physics/statistical_mechanics/_master_equations.py +171 -0
- skcomplex/models/physics/statistical_mechanics/_mattis_spin.py +79 -0
- skcomplex/models/physics/statistical_mechanics/_maxwell_boltzmann.py +96 -0
- skcomplex/models/physics/statistical_mechanics/_microstate.py +102 -0
- skcomplex/models/physics/statistical_mechanics/_order_parameter.py +90 -0
- skcomplex/models/physics/statistical_mechanics/_particle_site.py +41 -0
- skcomplex/models/physics/statistical_mechanics/_percolation.py +60 -0
- skcomplex/models/physics/statistical_mechanics/_percolation_site.py +73 -0
- skcomplex/models/physics/statistical_mechanics/_potts_spin.py +58 -0
- skcomplex/models/physics/statistical_mechanics/_processes.py +355 -0
- skcomplex/models/physics/statistical_mechanics/_q2r_spin.py +51 -0
- skcomplex/models/physics/statistical_mechanics/_quantum_spins.py +153 -0
- skcomplex/models/physics/statistical_mechanics/_random_energy.py +68 -0
- skcomplex/models/physics/statistical_mechanics/_reservoir.py +81 -0
- skcomplex/models/physics/statistical_mechanics/_spin_glasses.py +203 -0
- skcomplex/models/physics/statistical_mechanics/_spins.py +200 -0
- skcomplex/models/physics/statistical_mechanics/_susceptibility.py +112 -0
- skcomplex/models/physics/statistical_mechanics/_traps.py +135 -0
- skcomplex/models/physics/statistical_mechanics/_tree_node.py +48 -0
- skcomplex/models/physics/statistical_mechanics/_urns.py +107 -0
- skcomplex/models/physics/statistical_mechanics/_walker.py +81 -0
- skcomplex/models/physics/statistical_mechanics/_walker_view.py +20 -0
- skcomplex/models/physics/statistical_mechanics/_xxz_exchange.py +67 -0
- skcomplex/models/physics/statistical_mechanics/_xy_spin.py +58 -0
- skcomplex/models/physics/statistical_mechanics/_zeeman_field.py +56 -0
- skcomplex/models/physics/statistical_mechanics/_zero_range_hop.py +86 -0
- skcomplex/models/physics/statistical_mechanics/_zero_range_hops.py +81 -0
- skcomplex/models/physics/statistical_mechanics/_zone.py +78 -0
- skcomplex/models/physics/synchronization/__init__.py +64 -0
- skcomplex/models/physics/synchronization/_aggregate_averaging.py +63 -0
- skcomplex/models/physics/synchronization/_amplitude_death.py +278 -0
- skcomplex/models/physics/synchronization/_chaos.py +152 -0
- skcomplex/models/physics/synchronization/_diffusive_coupling.py +69 -0
- skcomplex/models/physics/synchronization/_edge_coupling.py +50 -0
- skcomplex/models/physics/synchronization/_hypergraphs.py +166 -0
- skcomplex/models/physics/synchronization/_integrate_and_fire_oscillator.py +80 -0
- skcomplex/models/physics/synchronization/_kuramoto.py +423 -0
- skcomplex/models/physics/synchronization/_link.py +46 -0
- skcomplex/models/physics/synchronization/_logistic_coupling.py +78 -0
- skcomplex/models/physics/synchronization/_logistic_node.py +59 -0
- skcomplex/models/physics/synchronization/_logistic_unit.py +43 -0
- skcomplex/models/physics/synchronization/_networks.py +184 -0
- skcomplex/models/physics/synchronization/_pulses.py +138 -0
- skcomplex/models/physics/synchronization/_rossler_oscillator.py +95 -0
- skcomplex/models/physics/synchronization/_swarmalator.py +48 -0
- skcomplex/models/physics/synchronization/_swarmalators.py +182 -0
- skcomplex/models/physics/synchronization/_utils.py +29 -0
- skcomplex/models/physics/synchronization/_winfree_mean_field.py +62 -0
- skcomplex/models/physics/waves/__init__.py +23 -0
- skcomplex/models/physics/waves/_charged.py +203 -0
- skcomplex/models/physics/waves/_driven_anchor.py +63 -0
- skcomplex/models/physics/waves/_lattice_hamiltonian.py +60 -0
- skcomplex/models/physics/waves/_position_dephasing.py +64 -0
- skcomplex/models/physics/waves/_quantum.py +125 -0
- skcomplex/models/physics/waves/_strings.py +169 -0
- skcomplex/models/physics/waves/_wave_function.py +79 -0
- skcomplex/models/physics/waves/_wave_string.py +52 -0
- skcomplex/models/social/__init__.py +1 -0
- skcomplex/models/social/cooperation/__init__.py +34 -0
- skcomplex/models/social/cooperation/_contributor.py +62 -0
- skcomplex/models/social/cooperation/_dilemma.py +56 -0
- skcomplex/models/social/cooperation/_hyperedge_goods.py +54 -0
- skcomplex/models/social/cooperation/_hypergraph_games.py +249 -0
- skcomplex/models/social/cooperation/_prisoner.py +56 -0
- skcomplex/models/social/cooperation/_prisoners_dilemma.py +126 -0
- skcomplex/models/social/cooperation/_public_goods.py +54 -0
- skcomplex/models/social/cooperation/_simplicial_dilemma.py +119 -0
- skcomplex/models/social/cooperation/_spatial_games.py +159 -0
- skcomplex/models/social/cooperation/_strategist.py +57 -0
- skcomplex/models/social/cooperation/_strategist_view.py +14 -0
- skcomplex/models/social/cooperation/_tournament.py +126 -0
- skcomplex/models/social/cooperation/_tournaments.py +87 -0
- skcomplex/models/social/crowds/__init__.py +46 -0
- skcomplex/models/social/crowds/_criminal_contagion.py +108 -0
- skcomplex/models/social/crowds/_criminality.py +223 -0
- skcomplex/models/social/crowds/_crowding.py +115 -0
- skcomplex/models/social/crowds/_deterrence.py +101 -0
- skcomplex/models/social/crowds/_evacuation.py +196 -0
- skcomplex/models/social/crowds/_guidance.py +69 -0
- skcomplex/models/social/crowds/_motivation.py +67 -0
- skcomplex/models/social/crowds/_pedestrians.py +85 -0
- skcomplex/models/social/crowds/_recruitment.py +90 -0
- skcomplex/models/social/crowds/_security_agents.py +48 -0
- skcomplex/models/social/crowds/_social_repulsion.py +86 -0
- skcomplex/models/social/crowds/_walking.py +186 -0
- skcomplex/models/social/crowds/_walls.py +69 -0
- skcomplex/models/social/language/__init__.py +13 -0
- skcomplex/models/social/language/_language.py +30 -0
- skcomplex/models/social/language/_least_effort.py +69 -0
- skcomplex/models/social/language/_word.py +39 -0
- skcomplex/models/social/language/_word_frequencies.py +48 -0
- skcomplex/models/social/opinion_dynamics/__init__.py +142 -0
- skcomplex/models/social/opinion_dynamics/_adopter.py +61 -0
- skcomplex/models/social/opinion_dynamics/_adopter_view.py +14 -0
- skcomplex/models/social/opinion_dynamics/_adoption.py +83 -0
- skcomplex/models/social/opinion_dynamics/_axelrod.py +160 -0
- skcomplex/models/social/opinion_dynamics/_believer.py +71 -0
- skcomplex/models/social/opinion_dynamics/_believer_view.py +16 -0
- skcomplex/models/social/opinion_dynamics/_bounded_confidence.py +126 -0
- skcomplex/models/social/opinion_dynamics/_citizen.py +49 -0
- skcomplex/models/social/opinion_dynamics/_citizen_view.py +12 -0
- skcomplex/models/social/opinion_dynamics/_club_member.py +78 -0
- skcomplex/models/social/opinion_dynamics/_coevolution.py +187 -0
- skcomplex/models/social/opinion_dynamics/_coevolving_voter.py +63 -0
- skcomplex/models/social/opinion_dynamics/_cognition.py +73 -0
- skcomplex/models/social/opinion_dynamics/_complex_agent.py +58 -0
- skcomplex/models/social/opinion_dynamics/_complex_agent_view.py +13 -0
- skcomplex/models/social/opinion_dynamics/_confidence_coupling.py +76 -0
- skcomplex/models/social/opinion_dynamics/_confident.py +50 -0
- skcomplex/models/social/opinion_dynamics/_conventions.py +44 -0
- skcomplex/models/social/opinion_dynamics/_conversations.py +116 -0
- skcomplex/models/social/opinion_dynamics/_cultural_influence.py +93 -0
- skcomplex/models/social/opinion_dynamics/_diffusion.py +205 -0
- skcomplex/models/social/opinion_dynamics/_discussant.py +60 -0
- skcomplex/models/social/opinion_dynamics/_discussant_view.py +14 -0
- skcomplex/models/social/opinion_dynamics/_discussions.py +51 -0
- skcomplex/models/social/opinion_dynamics/_encounters.py +48 -0
- skcomplex/models/social/opinion_dynamics/_hypergraph_consensus.py +106 -0
- skcomplex/models/social/opinion_dynamics/_influencee.py +70 -0
- skcomplex/models/social/opinion_dynamics/_influencee_view.py +16 -0
- skcomplex/models/social/opinion_dynamics/_kinetic_opinion.py +287 -0
- skcomplex/models/social/opinion_dynamics/_majority_voter.py +43 -0
- skcomplex/models/social/opinion_dynamics/_namer.py +53 -0
- skcomplex/models/social/opinion_dynamics/_namer_view.py +13 -0
- skcomplex/models/social/opinion_dynamics/_naming_games.py +68 -0
- skcomplex/models/social/opinion_dynamics/_opinion.py +39 -0
- skcomplex/models/social/opinion_dynamics/_persuader.py +52 -0
- skcomplex/models/social/opinion_dynamics/_persuader_view.py +12 -0
- skcomplex/models/social/opinion_dynamics/_persuasion.py +247 -0
- skcomplex/models/social/opinion_dynamics/_random_pairs.py +53 -0
- skcomplex/models/social/opinion_dynamics/_schedule.py +39 -0
- skcomplex/models/social/opinion_dynamics/_separation.py +71 -0
- skcomplex/models/social/opinion_dynamics/_social_impact.py +60 -0
- skcomplex/models/social/opinion_dynamics/_standardization.py +212 -0
- skcomplex/models/social/opinion_dynamics/_thinker.py +61 -0
- skcomplex/models/social/opinion_dynamics/_thinker_view.py +15 -0
- skcomplex/models/social/opinion_dynamics/_three_body_consensus.py +71 -0
- skcomplex/models/social/opinion_dynamics/_tie.py +21 -0
- skcomplex/models/social/opinion_dynamics/_variant_voter.py +67 -0
- skcomplex/models/social/opinion_dynamics/_variant_voter_view.py +14 -0
- skcomplex/models/social/opinion_dynamics/_variant_voting.py +63 -0
- skcomplex/models/social/opinion_dynamics/_village.py +61 -0
- skcomplex/models/social/opinion_dynamics/_village_view.py +14 -0
- skcomplex/models/social/opinion_dynamics/_voter.py +49 -0
- skcomplex/models/social/opinion_dynamics/_voter_imitation.py +48 -0
- skcomplex/models/social/opinion_dynamics/_voter_view.py +12 -0
- skcomplex/models/social/opinion_dynamics/_voters.py +197 -0
- skcomplex/models/social/organizations/__init__.py +68 -0
- skcomplex/models/social/organizations/_arms_race.py +34 -0
- skcomplex/models/social/organizations/_burden.py +38 -0
- skcomplex/models/social/organizations/_city_resident.py +41 -0
- skcomplex/models/social/organizations/_contender_view.py +14 -0
- skcomplex/models/social/organizations/_contest.py +32 -0
- skcomplex/models/social/organizations/_daily_movements.py +144 -0
- skcomplex/models/social/organizations/_eater.py +282 -0
- skcomplex/models/social/organizations/_eater_view.py +24 -0
- skcomplex/models/social/organizations/_employee.py +173 -0
- skcomplex/models/social/organizations/_employee_view.py +35 -0
- skcomplex/models/social/organizations/_employment.py +127 -0
- skcomplex/models/social/organizations/_execution.py +79 -0
- skcomplex/models/social/organizations/_gravity_contact.py +69 -0
- skcomplex/models/social/organizations/_hierarchies.py +174 -0
- skcomplex/models/social/organizations/_obesity.py +131 -0
- skcomplex/models/social/organizations/_premises.py +75 -0
- skcomplex/models/social/organizations/_premises_view.py +16 -0
- skcomplex/models/social/organizations/_queues.py +52 -0
- skcomplex/models/social/organizations/_restaurant.py +59 -0
- skcomplex/models/social/organizations/_restaurant_view.py +14 -0
- skcomplex/models/social/organizations/_sabotage.py +183 -0
- skcomplex/models/social/organizations/_supervisor.py +25 -0
- skcomplex/models/social/organizations/_task.py +65 -0
- skcomplex/models/social/organizations/_task_view.py +15 -0
- skcomplex/models/social/organizations/_trafficking.py +184 -0
- skcomplex/models/social/organizations/_traps.py +322 -0
- skcomplex/models/social/organizations/_traveller.py +55 -0
- skcomplex/models/social/organizations/_traveller_view.py +13 -0
- skcomplex/models/social/organizations/_urban_scaling.py +72 -0
- skcomplex/models/social/segregation/__init__.py +21 -0
- skcomplex/models/social/segregation/_block_moves.py +127 -0
- skcomplex/models/social/segregation/_blocks.py +111 -0
- skcomplex/models/social/segregation/_dweller.py +70 -0
- skcomplex/models/social/segregation/_dweller_view.py +16 -0
- skcomplex/models/social/segregation/_relocation.py +60 -0
- skcomplex/models/social/segregation/_resident.py +55 -0
- skcomplex/models/social/segregation/_resident_view.py +13 -0
- skcomplex/models/social/segregation/_schelling.py +75 -0
- skcomplex/models/social/spreading/__init__.py +37 -0
- skcomplex/models/social/spreading/_cascades.py +118 -0
- skcomplex/models/social/spreading/_exposure.py +166 -0
- skcomplex/models/social/spreading/_growing_word.py +55 -0
- skcomplex/models/social/spreading/_growing_word_view.py +13 -0
- skcomplex/models/social/spreading/_growth.py +52 -0
- skcomplex/models/social/spreading/_infective.py +55 -0
- skcomplex/models/social/spreading/_listeners.py +41 -0
- skcomplex/models/social/spreading/_participant.py +50 -0
- skcomplex/models/social/spreading/_rumour_contacts.py +81 -0
- skcomplex/models/social/spreading/_rumours.py +57 -0
- skcomplex/models/social/spreading/_simplicial.py +120 -0
- skcomplex/models/social/spreading/_simplicial_infection.py +64 -0
- skcomplex/models/social/spreading/_threshold_activation.py +50 -0
- skcomplex/models/social/spreading/_threshold_node_view.py +13 -0
- skcomplex/models/social/spreading/_writing.py +86 -0
- skcomplex/models/types.py +10 -0
- skcomplex/specs/__init__.py +198 -0
- skcomplex/specs/_accelerated_spec.py +46 -0
- skcomplex/specs/_agent_snapshot_spec.py +34 -0
- skcomplex/specs/_agent_state_spec.py +26 -0
- skcomplex/specs/_arguments_spec.py +60 -0
- skcomplex/specs/_axis_spec.py +59 -0
- skcomplex/specs/_base_record_spec.py +16 -0
- skcomplex/specs/_base_spec.py +73 -0
- skcomplex/specs/_base_structure_spec.py +173 -0
- skcomplex/specs/_batch_matching_spec.py +23 -0
- skcomplex/specs/_breakpoints_spec.py +58 -0
- skcomplex/specs/_call_spec.py +64 -0
- skcomplex/specs/_capacity_rows_spec.py +120 -0
- skcomplex/specs/_cardinality_spec.py +58 -0
- skcomplex/specs/_cascade_record_spec.py +36 -0
- skcomplex/specs/_clamp_spec.py +54 -0
- skcomplex/specs/_clause_spec.py +42 -0
- skcomplex/specs/_compiled_flow_spec.py +20 -0
- skcomplex/specs/_composed_rule_spec.py +33 -0
- skcomplex/specs/_continuous_matching_spec.py +48 -0
- skcomplex/specs/_control_solution_spec.py +54 -0
- skcomplex/specs/_control_spec.py +21 -0
- skcomplex/specs/_covariance_adaptation_spec.py +25 -0
- skcomplex/specs/_dataset_spec.py +85 -0
- skcomplex/specs/_delay_spec.py +27 -0
- skcomplex/specs/_dialect_spec.py +207 -0
- skcomplex/specs/_differential_evolution_spec.py +33 -0
- skcomplex/specs/_direction_spec.py +44 -0
- skcomplex/specs/_draw_spec.py +273 -0
- skcomplex/specs/_entry_spec.py +403 -0
- skcomplex/specs/_event_record_spec.py +37 -0
- skcomplex/specs/_evolution_strategy_spec.py +25 -0
- skcomplex/specs/_extremal_record_spec.py +32 -0
- skcomplex/specs/_fractional_rows_spec.py +33 -0
- skcomplex/specs/_fractional_state_spec.py +30 -0
- skcomplex/specs/_held_reduction_spec.py +29 -0
- skcomplex/specs/_hilbert_spec.py +75 -0
- skcomplex/specs/_hyperedge_reduction_spec.py +38 -0
- skcomplex/specs/_issue_spec.py +52 -0
- skcomplex/specs/_iterative_matching_spec.py +39 -0
- skcomplex/specs/_jump_channels_spec.py +40 -0
- skcomplex/specs/_jump_path_spec.py +29 -0
- skcomplex/specs/_layer_spec.py +47 -0
- skcomplex/specs/_layout_spec.py +158 -0
- skcomplex/specs/_local_operator_spec.py +72 -0
- skcomplex/specs/_lookup_spec.py +33 -0
- skcomplex/specs/_loop_spec.py +17 -0
- skcomplex/specs/_lowered_functions_spec.py +71 -0
- skcomplex/specs/_match_spec.py +37 -0
- skcomplex/specs/_matrix_law_spec.py +31 -0
- skcomplex/specs/_move_spec.py +69 -0
- skcomplex/specs/_neighbor_read_spec.py +83 -0
- skcomplex/specs/_neighbor_reduction_spec.py +39 -0
- skcomplex/specs/_network_rows_spec.py +124 -0
- skcomplex/specs/_network_snapshot_spec.py +61 -0
- skcomplex/specs/_noise_process_spec.py +41 -0
- skcomplex/specs/_objective_spec.py +39 -0
- skcomplex/specs/_observable_spec.py +79 -0
- skcomplex/specs/_operator_spec.py +170 -0
- skcomplex/specs/_orders_spec.py +16 -0
- skcomplex/specs/_outer_totalistic_spec.py +38 -0
- skcomplex/specs/_owners_spec.py +28 -0
- skcomplex/specs/_pair_read_spec.py +38 -0
- skcomplex/specs/_parameter_spec.py +81 -0
- skcomplex/specs/_parameters_spec.py +26 -0
- skcomplex/specs/_particle_swarm_spec.py +33 -0
- skcomplex/specs/_partner_spec.py +98 -0
- skcomplex/specs/_partner_switch_spec.py +39 -0
- skcomplex/specs/_phase_spec.py +61 -0
- skcomplex/specs/_phases_schedule_spec.py +59 -0
- skcomplex/specs/_plan_spec.py +18 -0
- skcomplex/specs/_planned_partition_spec.py +30 -0
- skcomplex/specs/_queue_spec.py +46 -0
- skcomplex/specs/_radius_spec.py +66 -0
- skcomplex/specs/_random_search_spec.py +51 -0
- skcomplex/specs/_read_spec.py +45 -0
- skcomplex/specs/_reduction_spec.py +48 -0
- skcomplex/specs/_renewal_record_spec.py +49 -0
- skcomplex/specs/_requirement_spec.py +32 -0
- skcomplex/specs/_role_spec.py +54 -0
- skcomplex/specs/_run_result_spec.py +52 -0
- skcomplex/specs/_run_state_spec.py +41 -0
- skcomplex/specs/_sampled_draw_spec.py +32 -0
- skcomplex/specs/_sampler_spec.py +57 -0
- skcomplex/specs/_samples_spec.py +29 -0
- skcomplex/specs/_schedule_spec.py +17 -0
- skcomplex/specs/_sector_spec.py +31 -0
- skcomplex/specs/_segment_spec.py +21 -0
- skcomplex/specs/_series_spec.py +29 -0
- skcomplex/specs/_signature_spec.py +55 -0
- skcomplex/specs/_snapshots_spec.py +56 -0
- skcomplex/specs/_stable_matching_spec.py +58 -0
- skcomplex/specs/_state_spec.py +138 -0
- skcomplex/specs/_step_spec.py +39 -0
- skcomplex/specs/_structure_state_spec.py +30 -0
- skcomplex/specs/_support_spec.py +76 -0
- skcomplex/specs/_symmetry_spec.py +59 -0
- skcomplex/specs/_table_spec.py +42 -0
- skcomplex/specs/_table_values_spec.py +36 -0
- skcomplex/specs/_tensor_spec.py +197 -0
- skcomplex/specs/_topology_request_spec.py +97 -0
- skcomplex/specs/_totalistic_spec.py +37 -0
- skcomplex/specs/_unknown_spec.py +22 -0
- skcomplex/specs/_validation_report_spec.py +62 -0
- skcomplex/specs/_variable_spec.py +124 -0
- skcomplex/specs/_visual_spec.py +30 -0
- skcomplex/specs/_weight_spec.py +16 -0
- skcomplex/specs/_wiener_block_spec.py +31 -0
- skcomplex/specs/_wiener_process_spec.py +54 -0
- 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
|