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,940 @@
|
|
|
1
|
+
"""Compile the observables of a system tree into one evaluator called at every frame."""
|
|
2
|
+
|
|
3
|
+
# Author: Georgios Douzas <gdouzas@icloud.com>
|
|
4
|
+
# License: MIT
|
|
5
|
+
|
|
6
|
+
import copy
|
|
7
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
8
|
+
from types import SimpleNamespace
|
|
9
|
+
from typing import Annotated, Self
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
import numpy.typing as npt
|
|
13
|
+
from sage.all__sagemath_symbolics import SR, Expression, I
|
|
14
|
+
|
|
15
|
+
from ...core.elements import Element
|
|
16
|
+
from ...core.laws.utils import has_operator, local_operator
|
|
17
|
+
from ...core.specs import NodeSpec
|
|
18
|
+
from ...core.system import System
|
|
19
|
+
from ...errors import ValidationError
|
|
20
|
+
from ...specs import EntrySpec, NeighborReadSpec, ObservableSpec, ReadSpec, RunStateSpec, StateSpec
|
|
21
|
+
from ...specs._held_reduction_spec import _HeldReductionSpec
|
|
22
|
+
from ...types import Array, FormKind, Indices, VariableKind
|
|
23
|
+
from .._utils import bound_labels, declarations_of, symbol, symbols_of
|
|
24
|
+
from ..problems import (
|
|
25
|
+
BaseProblemSpec,
|
|
26
|
+
ExpressionPrinter,
|
|
27
|
+
OperatorProblemSpec,
|
|
28
|
+
ProblemSpec,
|
|
29
|
+
ReductionScheduleSpec,
|
|
30
|
+
ReferenceSpec,
|
|
31
|
+
)
|
|
32
|
+
from ..problems._law_kernel import LawKernel
|
|
33
|
+
from ..problems._operator_kernel import OperatorKernel
|
|
34
|
+
from ..problems._operator_lowering import OperatorLowering
|
|
35
|
+
from ..problems._recorded_spec import _RecordedSpec
|
|
36
|
+
from ..problems._reduction_kernel import ReductionKernel
|
|
37
|
+
from ..types import AgentsFunction, Declared, ObservableFunction, ReadKind
|
|
38
|
+
from ._base import BaseCompiler, BasePass
|
|
39
|
+
from ._complex import _is_zero, _split_complex
|
|
40
|
+
from ._flows import TransferLowering
|
|
41
|
+
from ._member_reductions import _MemberReductions
|
|
42
|
+
from ._members import MemberLowering
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _role_paths(system: System, scope: str = '') -> set[str]:
|
|
46
|
+
"""Return the paths from the root of everything that roles of a system tree bind to."""
|
|
47
|
+
paths = set()
|
|
48
|
+
for interaction in system.interactions:
|
|
49
|
+
for name in declarations_of(interaction, VariableKind.ROLE):
|
|
50
|
+
labels = bound_labels(getattr(interaction, name))
|
|
51
|
+
paths |= {f'{scope}/{label}' if scope else label for label in labels}
|
|
52
|
+
for child in system.systems:
|
|
53
|
+
paths |= _role_paths(child, f'{scope}/{child.label}' if scope else child.label)
|
|
54
|
+
return paths
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _readers_of(problem: ProblemSpec, path: str) -> set[str]:
|
|
58
|
+
"""Return the paths of the elements and groups that interactions reading an observable bind their other roles to."""
|
|
59
|
+
readers: set[str] = set()
|
|
60
|
+
for interaction in problem.interactions:
|
|
61
|
+
bound = [
|
|
62
|
+
item for value in interaction.roles.values() for item in ([value] if isinstance(value, str) else value)
|
|
63
|
+
]
|
|
64
|
+
if path in bound:
|
|
65
|
+
readers |= set(bound) - {path}
|
|
66
|
+
return readers
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _held_label(reduction: '_HeldReductionSpec', labels: set[str]) -> str:
|
|
70
|
+
"""Return a label for the element that holds a reduction of a group, unique among the labels of its system."""
|
|
71
|
+
base = f'{reduction.group.rpartition("/")[2]}_{reduction.reduce}'
|
|
72
|
+
label, index = base, 1
|
|
73
|
+
while label in labels:
|
|
74
|
+
label, index = f'{base}_{index}', index + 1
|
|
75
|
+
return label
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _with_held_reductions(system: System, reductions: Sequence['_HeldReductionSpec'], scope: str = '') -> System:
|
|
79
|
+
"""Return a system tree that holds every reduction of agents in an element of the system of its group.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
system:
|
|
83
|
+
The system.
|
|
84
|
+
|
|
85
|
+
reductions:
|
|
86
|
+
The held reductions.
|
|
87
|
+
|
|
88
|
+
scope:
|
|
89
|
+
The path of the system, empty for the root.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
system:
|
|
93
|
+
The system tree with the elements that hold the reductions.
|
|
94
|
+
"""
|
|
95
|
+
own = [reduction for reduction in reductions if reduction.group.rpartition('/')[0] == scope]
|
|
96
|
+
children = [
|
|
97
|
+
_with_held_reductions(child, reductions, ObservableEvaluator._join(scope, child.label))
|
|
98
|
+
for child in system.systems
|
|
99
|
+
]
|
|
100
|
+
if not own and all(new is old for new, old in zip(children, system.systems, strict=True)):
|
|
101
|
+
return system
|
|
102
|
+
labels = {part.label for part in (*system.elements, *system.interactions, *system.systems)}
|
|
103
|
+
held = []
|
|
104
|
+
for reduction in own:
|
|
105
|
+
label = _held_label(reduction, labels)
|
|
106
|
+
labels.add(label)
|
|
107
|
+
held.append(_HeldElement(label, reduction=reduction))
|
|
108
|
+
copied = copy.copy(system)
|
|
109
|
+
copied.elements = [*system.elements, *held]
|
|
110
|
+
copied.systems = children
|
|
111
|
+
return copied
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _with_held_observables(system: System, read: set[str], scope: str = '') -> tuple[System, list[str]]:
|
|
115
|
+
"""Return a system tree in which every observable in `read` is also held in an element, and their paths."""
|
|
116
|
+
held: list[str] = []
|
|
117
|
+
elements = []
|
|
118
|
+
for observable in getattr(system, 'observables', ()):
|
|
119
|
+
path = f'{scope}/{observable.label}' if scope else observable.label
|
|
120
|
+
if path not in read:
|
|
121
|
+
continue
|
|
122
|
+
if observable.group is None or observable.expression is not None:
|
|
123
|
+
error_msg = (
|
|
124
|
+
f'A role binds to the observable {path}, which reads agents through an expression or an earlier '
|
|
125
|
+
'observable. Laws read observables of agents only when they reduce a variable or count the agents. '
|
|
126
|
+
'Declare it with `group` and `variable`.'
|
|
127
|
+
)
|
|
128
|
+
raise ValidationError(error_msg)
|
|
129
|
+
variables = (observable.variable,) if observable.variable is not None else ()
|
|
130
|
+
reduction = _HeldReductionSpec(ObservableEvaluator._join(scope, observable.group), observable.reduce, variables)
|
|
131
|
+
elements.append(_HeldElement(observable.label, reduction=reduction))
|
|
132
|
+
held.append(path)
|
|
133
|
+
children = []
|
|
134
|
+
for child in system.systems:
|
|
135
|
+
new_child, child_held = _with_held_observables(child, read, f'{scope}/{child.label}' if scope else child.label)
|
|
136
|
+
children.append(new_child)
|
|
137
|
+
held += child_held
|
|
138
|
+
if not held:
|
|
139
|
+
return system, held
|
|
140
|
+
copied = copy.copy(system)
|
|
141
|
+
copied.elements = [*system.elements, *elements]
|
|
142
|
+
copied.systems = children
|
|
143
|
+
return copied, held
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _held_observables(system: System, nodes: list[NodeSpec]) -> set[str]:
|
|
147
|
+
"""Return the paths of the observables that roles bind to and laws read only at synchronisation points.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
system:
|
|
151
|
+
The system, with the observables of the run.
|
|
152
|
+
|
|
153
|
+
nodes:
|
|
154
|
+
The nodes of the system.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
paths:
|
|
158
|
+
The paths of the held observables.
|
|
159
|
+
"""
|
|
160
|
+
lowerable = ObservableEvaluator._lowerable_observables(system, nodes)
|
|
161
|
+
declared = {
|
|
162
|
+
ObservableEvaluator._join(scope, observable.label) for scope, observable in BaseCompiler._observables_of(system)
|
|
163
|
+
}
|
|
164
|
+
return (_role_paths(system) & declared) - set(lowerable)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _check_held_reads(problem: ProblemSpec, held: list[str]) -> None:
|
|
168
|
+
"""Raise an error when a law reads an observable that cannot be lowered from the partition that computes it."""
|
|
169
|
+
if problem.system is None:
|
|
170
|
+
return
|
|
171
|
+
groups = {
|
|
172
|
+
ObservableEvaluator._join(scope, observable.label): ObservableEvaluator._join(scope, observable.group or '')
|
|
173
|
+
for scope, observable in BaseCompiler._observables_of(problem.system)
|
|
174
|
+
}
|
|
175
|
+
for path in held:
|
|
176
|
+
readers = _readers_of(problem, path)
|
|
177
|
+
partitions = problem.partitions if isinstance(problem, ProblemSpec) else ()
|
|
178
|
+
shared = [item.name for item in partitions if groups[path] in item.owners and readers & item.owners]
|
|
179
|
+
if problem.form != FormKind.COUPLED or shared:
|
|
180
|
+
error_msg = (
|
|
181
|
+
f'A law reads the observable {path} in the partition that computes it, but the observable is a Python '
|
|
182
|
+
'function of the values or reduces agents, which laws cannot read at the current state. Write it '
|
|
183
|
+
'symbolically with a variable or an expression of the members, or move the reading law into another '
|
|
184
|
+
'subsystem of a different form.'
|
|
185
|
+
)
|
|
186
|
+
raise ValidationError(error_msg)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class _HeldElement(Element):
|
|
190
|
+
"""Element that holds the value of a held reduction in its state `value`, which laws of other partitions read."""
|
|
191
|
+
|
|
192
|
+
def __init__(
|
|
193
|
+
self,
|
|
194
|
+
label: str,
|
|
195
|
+
value: Annotated[float, StateSpec()] = 0.0,
|
|
196
|
+
*,
|
|
197
|
+
reduction: '_HeldReductionSpec | None' = None,
|
|
198
|
+
) -> None:
|
|
199
|
+
super().__init__(label)
|
|
200
|
+
self.value = value
|
|
201
|
+
self.reduction = reduction
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class ObservableEvaluator:
|
|
205
|
+
"""Evaluator of every observable of a problem from a state vector, a parameter vector, and the agents.
|
|
206
|
+
|
|
207
|
+
Preparing compiles every observable into a getter, in declaration order, the prepared `getters_`.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
problem:
|
|
211
|
+
The compiled problem.
|
|
212
|
+
|
|
213
|
+
Examples:
|
|
214
|
+
>>> from skcomplex.core.elements import GroupElement
|
|
215
|
+
>>> from skcomplex.engine.compile import ObservableEvaluator, compile_system
|
|
216
|
+
>>> from skcomplex.specs import ObservableSpec
|
|
217
|
+
>>> from skcomplex.core.system import System
|
|
218
|
+
>>> from skcomplex.models.biology.common.populations import PopulationElement
|
|
219
|
+
>>> system = System(
|
|
220
|
+
... elements=[GroupElement('herd', element=PopulationElement, size=2, values={'n': [2.0, 6.0]})]
|
|
221
|
+
... )
|
|
222
|
+
>>> total = ObservableSpec('total', group='herd', reduce='sum', variable='n')
|
|
223
|
+
>>> problem = compile_system(system, observables=[total])
|
|
224
|
+
>>> ObservableEvaluator(problem).prepare().evaluate(0.0, problem.initial_state, problem.initial_parameters)
|
|
225
|
+
{'total': 8.0}
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
def __init__(self, problem: BaseProblemSpec) -> None:
|
|
229
|
+
self.problem = problem
|
|
230
|
+
|
|
231
|
+
def prepare(self) -> Self:
|
|
232
|
+
"""Compile every observable into a getter, in declaration order.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
evaluator:
|
|
236
|
+
The evaluator, with the getter of every observable path in `getters_`.
|
|
237
|
+
|
|
238
|
+
Raises:
|
|
239
|
+
ValidationError:
|
|
240
|
+
Two observables share a path, an observable has neither an expression nor a group, or an expression
|
|
241
|
+
reads a symbol it cannot.
|
|
242
|
+
"""
|
|
243
|
+
self.getters_: dict[str, ObservableFunction] = {}
|
|
244
|
+
if isinstance(self.problem, OperatorProblemSpec):
|
|
245
|
+
self._scalars = {}
|
|
246
|
+
self.getters_ = self._operator_getters(self.problem)
|
|
247
|
+
return self
|
|
248
|
+
self._scalars = self._scalar_sources()
|
|
249
|
+
for scope, observable in self.problem.observables:
|
|
250
|
+
path = self._join(scope, observable.label)
|
|
251
|
+
if path in self.getters_:
|
|
252
|
+
error_msg = f'Two observables have the path {path}. Give observables of one system distinct labels.'
|
|
253
|
+
raise ValidationError(error_msg)
|
|
254
|
+
if observable.function is not None:
|
|
255
|
+
self.getters_[path] = self._function_getter(path, observable.function)
|
|
256
|
+
continue
|
|
257
|
+
if observable.group is None and observable.expression is None:
|
|
258
|
+
error_msg = (
|
|
259
|
+
f'ObservableSpec {path} has neither an expression, a function, nor a group. Give one of them.'
|
|
260
|
+
)
|
|
261
|
+
raise ValidationError(error_msg)
|
|
262
|
+
observed = self.problem.observed if isinstance(self.problem, ProblemSpec) else {}
|
|
263
|
+
if observable.group is None:
|
|
264
|
+
self.getters_[path] = self._expression_getter(scope, path, observable)
|
|
265
|
+
elif path in observed:
|
|
266
|
+
self.getters_[path] = self._observed_getter(observed[path], observable)
|
|
267
|
+
else:
|
|
268
|
+
self.getters_[path] = self._reduction_getter(scope, path, observable)
|
|
269
|
+
problems = (self.problem, *self.problem.partition_problems)
|
|
270
|
+
for renewal in (renewal for problem in problems for renewal in problem.renewals):
|
|
271
|
+
self.getters_[f'{renewal.label}.renewals'] = self._renewal_counter(renewal.counts)
|
|
272
|
+
transfer_network = self.problem.transfer_network
|
|
273
|
+
for recorded in transfer_network.recorded if transfer_network is not None else ():
|
|
274
|
+
self.getters_[recorded.path] = self._recorded_getter(recorded)
|
|
275
|
+
return self
|
|
276
|
+
|
|
277
|
+
def _function_getter(
|
|
278
|
+
self,
|
|
279
|
+
path: str,
|
|
280
|
+
function: Callable[[float, Mapping[str, object]], object],
|
|
281
|
+
) -> ObservableFunction:
|
|
282
|
+
"""Return a getter that calls a function of time and the values of the states and parameters by name."""
|
|
283
|
+
problem = self.problem
|
|
284
|
+
if not isinstance(problem, ProblemSpec) or problem.agents:
|
|
285
|
+
error_msg = (
|
|
286
|
+
f'ObservableSpec {path} is a function of the values of a system, which a system with agents or a '
|
|
287
|
+
'operator system does not hold as a vector. Give an expression, or an expression of each agent.'
|
|
288
|
+
)
|
|
289
|
+
raise ValidationError(error_msg)
|
|
290
|
+
states, parameters = problem.states, problem.parameters
|
|
291
|
+
|
|
292
|
+
def get(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
293
|
+
del done
|
|
294
|
+
value = np.asarray(function(t, {**states.values(x), **parameters.values(p)}))
|
|
295
|
+
return float(value) if value.ndim == 0 else value
|
|
296
|
+
|
|
297
|
+
return get
|
|
298
|
+
|
|
299
|
+
def _scalar_sources(self) -> dict[Expression, tuple[str, int]]:
|
|
300
|
+
"""Return the vector and flat index of every symbol of a single element or interaction."""
|
|
301
|
+
sources: dict[Expression, tuple[str, int]] = {}
|
|
302
|
+
for name, layout in (('x', self.problem.states), ('p', self.problem.parameters)):
|
|
303
|
+
for entry in layout.entries:
|
|
304
|
+
if entry.members is not None or entry.name not in self.problem.symbols:
|
|
305
|
+
continue
|
|
306
|
+
for column, item in enumerate(ProblemSpec._real_components_of(self.problem.symbols[entry.name])):
|
|
307
|
+
sources[item] = (name, entry.start + column)
|
|
308
|
+
return sources
|
|
309
|
+
|
|
310
|
+
def _compile(
|
|
311
|
+
self,
|
|
312
|
+
path: str,
|
|
313
|
+
expression: object,
|
|
314
|
+
observables: Mapping[Expression, str],
|
|
315
|
+
members: Mapping[Expression, Callable[[Array, Array], Array]],
|
|
316
|
+
) -> ObservableFunction:
|
|
317
|
+
"""Return a getter that evaluates an expression from scalars, observables, and member arrays."""
|
|
318
|
+
expression = self._joined_complex(expression, f'observable {path}')
|
|
319
|
+
arguments = sorted(symbols_of([expression]) - {self.problem.time}, key=str)
|
|
320
|
+
readers: list[Callable[[Array, Array, Mapping[str, object]], object]] = []
|
|
321
|
+
for item in arguments:
|
|
322
|
+
if item in observables:
|
|
323
|
+
readers.append(self._from_done(observables[item]))
|
|
324
|
+
elif item in members:
|
|
325
|
+
readers.append(self._from_members(members[item]))
|
|
326
|
+
elif item in self._scalars:
|
|
327
|
+
vector, index = self._scalars[item]
|
|
328
|
+
readers.append(self._from_members(self._from_vector(vector == 'x', index)))
|
|
329
|
+
else:
|
|
330
|
+
error_msg = (
|
|
331
|
+
f'ObservableSpec {path} uses the symbol {item}, which is neither a variable of a single element or '
|
|
332
|
+
'interaction nor an earlier observable. Use the namespace that the expression receives.'
|
|
333
|
+
)
|
|
334
|
+
raise ValidationError(error_msg)
|
|
335
|
+
function = (
|
|
336
|
+
ExpressionPrinter(time=self.problem.time, compiled=True).check().prepare(arguments).run([expression]).code_
|
|
337
|
+
)
|
|
338
|
+
if not callable(function):
|
|
339
|
+
error_msg = f'A compiled printer returns a function, not a {type(function).__name__}.'
|
|
340
|
+
raise TypeError(error_msg)
|
|
341
|
+
|
|
342
|
+
def get(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
343
|
+
values = function(t, *(read(x, p, done) for read in readers))
|
|
344
|
+
if not isinstance(values, list):
|
|
345
|
+
error_msg = f'A compiled function returns a list of values, not a {type(values).__name__}.'
|
|
346
|
+
raise TypeError(error_msg)
|
|
347
|
+
value = np.real_if_close(values[0])
|
|
348
|
+
return float(value) if np.ndim(value) == 0 and np.isrealobj(value) else value
|
|
349
|
+
|
|
350
|
+
return get
|
|
351
|
+
|
|
352
|
+
def _recorded_getter(self, recorded: _RecordedSpec) -> ObservableFunction:
|
|
353
|
+
"""Return the getter of a flow or an objective, one value for a single component and one per group member.
|
|
354
|
+
|
|
355
|
+
A flow along the edges of a group reads members at an offset, which the getter reads from the member columns.
|
|
356
|
+
"""
|
|
357
|
+
expression, members = self._read_offsets(recorded)
|
|
358
|
+
for item in symbols_of([expression]) - {self.problem.time} - set(members):
|
|
359
|
+
reference = recorded.references.get(item)
|
|
360
|
+
if reference is None or reference.source not in {ReadKind.SINGLE, ReadKind.MEMBER}:
|
|
361
|
+
error_msg = (
|
|
362
|
+
f'{recorded.path} reads {item}, which is neither a variable of its component nor of a member of '
|
|
363
|
+
'its group, so trajectories cannot record it. Record it with an observable instead.'
|
|
364
|
+
)
|
|
365
|
+
raise ValidationError(error_msg)
|
|
366
|
+
entry = reference.entry
|
|
367
|
+
indices: int | Indices = entry.start + reference.column
|
|
368
|
+
if reference.entry.members is not None and reference.source is ReadKind.MEMBER:
|
|
369
|
+
indices = entry.start + np.arange(entry.members or 1) * entry.columns + reference.column
|
|
370
|
+
members[item] = self._from_vector(reference.is_state, indices)
|
|
371
|
+
return self._compile(recorded.path, expression, {}, members)
|
|
372
|
+
|
|
373
|
+
def _read_offsets(
|
|
374
|
+
self,
|
|
375
|
+
recorded: _RecordedSpec,
|
|
376
|
+
) -> tuple[object, dict[Expression, Callable[[Array, Array], Array]]]:
|
|
377
|
+
"""Return a recorded expression with every member offset read replaced by a symbol, and its reader."""
|
|
378
|
+
expression = recorded.expression
|
|
379
|
+
if not isinstance(expression, Expression):
|
|
380
|
+
return expression, {}
|
|
381
|
+
members: dict[Expression, Callable[[Array, Array], Array]] = {}
|
|
382
|
+
for index, call in enumerate(BasePass._calls_of(expression, 'shift_member')):
|
|
383
|
+
base, offset, boundary, fill = MemberLowering._shift_arguments(call)
|
|
384
|
+
reference = recorded.references.get(base)
|
|
385
|
+
if reference is None or reference.source is not ReadKind.MEMBER:
|
|
386
|
+
error_msg = f'{recorded.path} reads {base} at a member offset, but it is no variable of a group member.'
|
|
387
|
+
raise ValidationError(error_msg)
|
|
388
|
+
read = MemberLowering._neighbor_read(reference.entry.rows, offset, boundary, fill)
|
|
389
|
+
column = self._from_vector(reference.is_state, reference.flat_indices)
|
|
390
|
+
item = symbol(f'_recorded_shift{index}')
|
|
391
|
+
members[item] = self._from_offset(column, read)
|
|
392
|
+
expression = SR(expression).subs({call: item})
|
|
393
|
+
return expression, members
|
|
394
|
+
|
|
395
|
+
def _expression_getter(self, scope: str, path: str, observable: ObservableSpec) -> ObservableFunction:
|
|
396
|
+
"""Return the getter of an expression of the system's symbols."""
|
|
397
|
+
prefix = f'{scope}/' if scope else ''
|
|
398
|
+
earlier = {
|
|
399
|
+
other: symbol(f'_observable_{index}')
|
|
400
|
+
for index, other in enumerate(self.getters_)
|
|
401
|
+
if other.startswith(prefix) and '/' not in other[len(prefix) :]
|
|
402
|
+
}
|
|
403
|
+
namespace = self._namespace_of(self.problem, scope)
|
|
404
|
+
for other, item in earlier.items():
|
|
405
|
+
setattr(namespace, other[len(prefix) :], item)
|
|
406
|
+
expression = observable.expression(namespace) if callable(observable.expression) else observable.expression
|
|
407
|
+
expression, stages = self._read_delays(path, expression)
|
|
408
|
+
return self._compile(path, expression, {item: other for other, item in earlier.items()}, stages)
|
|
409
|
+
|
|
410
|
+
def _read_delays(
|
|
411
|
+
self,
|
|
412
|
+
path: str,
|
|
413
|
+
expression: object,
|
|
414
|
+
) -> tuple[object, dict[Expression, Callable[[Array, Array], Array]]]:
|
|
415
|
+
"""Return an expression with the delays of the laws read from their hidden states, and their readers."""
|
|
416
|
+
transfer_network = self.problem.transfer_network
|
|
417
|
+
if transfer_network is None or not isinstance(expression, Expression):
|
|
418
|
+
return expression, {}
|
|
419
|
+
references: dict[Expression, ReferenceSpec] = {}
|
|
420
|
+
for delay in transfer_network.delays:
|
|
421
|
+
expression = SR(expression).subs({delay.call: delay.output})
|
|
422
|
+
references.update(delay.references)
|
|
423
|
+
delays = TransferLowering._delay_calls(expression)
|
|
424
|
+
if delays:
|
|
425
|
+
error_msg = (
|
|
426
|
+
f'ObservableSpec {path} reads {delays[0]}, a delay that no law of the '
|
|
427
|
+
'system uses. Observe a delay that a law of the same element reads.'
|
|
428
|
+
)
|
|
429
|
+
raise ValidationError(error_msg)
|
|
430
|
+
stages = {
|
|
431
|
+
item: self._from_vector(True, references[item].entry.start + references[item].column)
|
|
432
|
+
for item in symbols_of([expression])
|
|
433
|
+
if item in references
|
|
434
|
+
}
|
|
435
|
+
return expression, stages
|
|
436
|
+
|
|
437
|
+
def _entry(self, name: str) -> EntrySpec:
|
|
438
|
+
"""Return the entry of a state or parameter by name.
|
|
439
|
+
|
|
440
|
+
Args:
|
|
441
|
+
name:
|
|
442
|
+
The dotted name of the state or parameter.
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
entry:
|
|
446
|
+
The entry.
|
|
447
|
+
|
|
448
|
+
Raises:
|
|
449
|
+
ValidationError:
|
|
450
|
+
The problem has no state or parameter of that name.
|
|
451
|
+
"""
|
|
452
|
+
entry = self._entry_of(self.problem, name)
|
|
453
|
+
if entry is None:
|
|
454
|
+
error_msg = f'The problem has no state or parameter named {name!r}.'
|
|
455
|
+
raise ValidationError(error_msg)
|
|
456
|
+
return entry
|
|
457
|
+
|
|
458
|
+
def _reduction_getter(self, scope: str, path: str, observable: ObservableSpec) -> ObservableFunction:
|
|
459
|
+
"""Return the getter of a reduction over a group of elements or agents."""
|
|
460
|
+
group = self._join(scope, observable.group or '')
|
|
461
|
+
element = next((item for item in self.problem.elements if item.path == group), None)
|
|
462
|
+
if element is None:
|
|
463
|
+
return self._agent_getter(group, path, observable)
|
|
464
|
+
names = {**element.states, **element.parameters}
|
|
465
|
+
if observable.variable is not None:
|
|
466
|
+
if observable.variable not in names:
|
|
467
|
+
error_msg = f'ObservableSpec {path} reduces {observable.variable}, which {group} does not declare.'
|
|
468
|
+
raise ValidationError(error_msg)
|
|
469
|
+
name = names[observable.variable]
|
|
470
|
+
is_state = self.problem.states.has(name)
|
|
471
|
+
layout = self.problem.states if is_state else self.problem.parameters
|
|
472
|
+
|
|
473
|
+
def read_variable(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
474
|
+
del t, done
|
|
475
|
+
values = np.asarray(layout.read(x if is_state else p, name))
|
|
476
|
+
return ReductionKernel._reduce_values(
|
|
477
|
+
values if element.members is not None else values[np.newaxis],
|
|
478
|
+
observable.reduce,
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
return read_variable
|
|
482
|
+
size = element.members or 1
|
|
483
|
+
if observable.expression is None:
|
|
484
|
+
if observable.reduce != 'count':
|
|
485
|
+
error_msg = f'ObservableSpec {path} reduces {group} with {observable.reduce!r} but names no variable.'
|
|
486
|
+
raise ValidationError(error_msg)
|
|
487
|
+
return lambda t, x, p, done: float(size)
|
|
488
|
+
members: dict[Expression, ReadSpec] = {}
|
|
489
|
+
for name in names.values():
|
|
490
|
+
entry = self._entry(name)
|
|
491
|
+
is_state = self.problem.states.has(name)
|
|
492
|
+
for column, item in enumerate(ProblemSpec._real_components_of(self.problem.symbols[name])):
|
|
493
|
+
indices = (entry.start + np.arange(size) * entry.columns + column).astype(np.intp)
|
|
494
|
+
members[item] = ReadSpec(is_state, indices, entry, column, entry.columns)
|
|
495
|
+
namespace = SimpleNamespace(
|
|
496
|
+
**{variable: self.problem.symbols[name] for variable, name in names.items()},
|
|
497
|
+
t=self.problem.time,
|
|
498
|
+
)
|
|
499
|
+
expression = observable.expression(namespace) if callable(observable.expression) else observable.expression
|
|
500
|
+
scalars = {item: ReadSpec(vector == 'x', index) for item, (vector, index) in self._scalars.items()}
|
|
501
|
+
parameters = len(self.problem.initial_parameters)
|
|
502
|
+
lowering = _MemberReductions(
|
|
503
|
+
path=path,
|
|
504
|
+
group=group,
|
|
505
|
+
size=size,
|
|
506
|
+
reads={**scalars, **members},
|
|
507
|
+
time=self.problem.time,
|
|
508
|
+
parameters=parameters,
|
|
509
|
+
)
|
|
510
|
+
expression = lowering.check().prepare().run(expression).expression_
|
|
511
|
+
readers = {item: self._read_of(read) for item, read in lowering.reads_.items() if item not in scalars}
|
|
512
|
+
evaluate = self._compile(path, expression, {}, readers)
|
|
513
|
+
reductions = ReductionScheduleSpec(tuple(lowering.found_.values()), parameters)
|
|
514
|
+
|
|
515
|
+
def read_expression(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
516
|
+
values = np.broadcast_to(np.asarray(evaluate(t, x, reductions.extend(t, x, p), done)), (size,))
|
|
517
|
+
return ReductionKernel._reduce_values(values, observable.reduce)
|
|
518
|
+
|
|
519
|
+
return read_expression
|
|
520
|
+
|
|
521
|
+
@staticmethod
|
|
522
|
+
def _observed_getter(kernel: LawKernel, observable: ObservableSpec) -> ObservableFunction:
|
|
523
|
+
"""Return the getter of a reduction of an expression of a field with field operators, from its kernel."""
|
|
524
|
+
|
|
525
|
+
def read_field(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
526
|
+
del done
|
|
527
|
+
_, _, values = kernel.run(RunStateSpec(t, x, p)).values_
|
|
528
|
+
return ReductionKernel._reduce_values(values[0], observable.reduce)
|
|
529
|
+
|
|
530
|
+
return read_field
|
|
531
|
+
|
|
532
|
+
def _agent_getter(self, group: str, path: str, observable: ObservableSpec) -> ObservableFunction:
|
|
533
|
+
"""Return the getter of a reduction over an agent group, which the evaluation's agents give."""
|
|
534
|
+
if not any(spec.path == group for spec in self.problem.agents) and not self.problem.partition_problems:
|
|
535
|
+
error_msg = f'ObservableSpec {path} reduces {group}, which is neither an element group nor an agent group.'
|
|
536
|
+
raise ValidationError(error_msg)
|
|
537
|
+
objects = {name for spec in self.problem.agents if spec.path == group for name in spec.objects}
|
|
538
|
+
|
|
539
|
+
def read_agents(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
540
|
+
del t, x, p
|
|
541
|
+
agents_of = done['__agents__']
|
|
542
|
+
if not callable(agents_of):
|
|
543
|
+
error_msg = f'The agents of an evaluation are given by a function, not a {type(agents_of).__name__}.'
|
|
544
|
+
raise TypeError(error_msg)
|
|
545
|
+
found = agents_of(group)
|
|
546
|
+
agents: list[object] = list(found) if isinstance(found, list | tuple) else []
|
|
547
|
+
values: list[object]
|
|
548
|
+
if observable.variable is not None:
|
|
549
|
+
values = [getattr(agent, observable.variable) for agent in agents]
|
|
550
|
+
elif callable(observable.expression):
|
|
551
|
+
values = [observable.expression(agent) for agent in agents]
|
|
552
|
+
else:
|
|
553
|
+
values = agents
|
|
554
|
+
if observable.variable in objects:
|
|
555
|
+
return ReductionKernel._reduce_values(
|
|
556
|
+
np.fromiter(values, dtype=object, count=len(values)),
|
|
557
|
+
observable.reduce,
|
|
558
|
+
)
|
|
559
|
+
return ReductionKernel._reduce_values(values, observable.reduce)
|
|
560
|
+
|
|
561
|
+
return read_agents
|
|
562
|
+
|
|
563
|
+
@staticmethod
|
|
564
|
+
def _operator_getters(problem: OperatorProblemSpec) -> dict[str, ObservableFunction]:
|
|
565
|
+
"""Return the getters of the observables of an operator problem, with the energy, and the purity when open.
|
|
566
|
+
|
|
567
|
+
An observable gives an operator, a Sage expression of local operators, as a function of the namespace of its
|
|
568
|
+
system, of its element, or of every member of its group, or names a local operator of its element or of every
|
|
569
|
+
member of its group with `variable`, such as `ObservableSpec('z', element='q', variable='z')`. Its value is the
|
|
570
|
+
expectation of the operator, reduced over the members of a group.
|
|
571
|
+
|
|
572
|
+
Args:
|
|
573
|
+
problem:
|
|
574
|
+
The operator problem.
|
|
575
|
+
|
|
576
|
+
Returns:
|
|
577
|
+
getters:
|
|
578
|
+
The getters by observable path.
|
|
579
|
+
|
|
580
|
+
Raises:
|
|
581
|
+
ValidationError:
|
|
582
|
+
Two observables share a path, or an observable does not give an operator.
|
|
583
|
+
"""
|
|
584
|
+
getters: dict[str, ObservableFunction] = {}
|
|
585
|
+
for scope, observable in problem.observables:
|
|
586
|
+
label = observable.label if observable.element is None else f'{observable.element}.{observable.label}'
|
|
587
|
+
path = ObservableEvaluator._join(scope, label)
|
|
588
|
+
if path in getters:
|
|
589
|
+
error_msg = f'Two observables have the path {path}. Give observables of one system distinct labels.'
|
|
590
|
+
raise ValidationError(error_msg)
|
|
591
|
+
if observable.group is not None:
|
|
592
|
+
group = ObservableEvaluator._join(scope, observable.group)
|
|
593
|
+
getters[path] = ObservableEvaluator._operator_member_getter(problem, path, observable, group)
|
|
594
|
+
continue
|
|
595
|
+
if observable.element is not None and observable.variable is not None:
|
|
596
|
+
element = ObservableEvaluator._join(scope, observable.element)
|
|
597
|
+
terms = ObservableEvaluator._local_terms(problem, element, observable.variable)[0]
|
|
598
|
+
getters[path] = ObservableEvaluator._expectation_getter(problem, terms)
|
|
599
|
+
continue
|
|
600
|
+
expression = observable.expression
|
|
601
|
+
value = expression(problem.namespaces[scope]) if callable(expression) else expression
|
|
602
|
+
terms = ObservableEvaluator._terms_of(problem, ObservableEvaluator._operator_of(path, value), path)
|
|
603
|
+
getters[path] = ObservableEvaluator._expectation_getter(problem, terms)
|
|
604
|
+
getters.setdefault('energy', ObservableEvaluator._expectation_getter(problem, problem.generator))
|
|
605
|
+
if not problem.pure:
|
|
606
|
+
getters.setdefault('purity', ObservableEvaluator._purity_getter(problem))
|
|
607
|
+
return getters
|
|
608
|
+
|
|
609
|
+
@staticmethod
|
|
610
|
+
def _local_terms(problem: OperatorProblemSpec, path: str, name: str) -> list[tuple[OperatorKernel, ...]]:
|
|
611
|
+
"""Return the terms of the local operator of a name of every member of an operator element or group."""
|
|
612
|
+
lowering = ObservableEvaluator._lowering_of(problem)
|
|
613
|
+
subsystems = [item for key, item in lowering.subsystems.items() if key == path or key.startswith(f'{path}[')]
|
|
614
|
+
if not subsystems:
|
|
615
|
+
error_msg = f'Observable of {path} reads {path}, which is not an operator element or group of the system.'
|
|
616
|
+
raise ValidationError(error_msg)
|
|
617
|
+
return [
|
|
618
|
+
ObservableEvaluator._terms_of(problem, local_operator(item.symbol, SR.symbol(name)), path)
|
|
619
|
+
for item in subsystems
|
|
620
|
+
]
|
|
621
|
+
|
|
622
|
+
@staticmethod
|
|
623
|
+
def _lowering_of(problem: OperatorProblemSpec) -> OperatorLowering:
|
|
624
|
+
"""Return the lowering of the operators of an operator problem, raising an error for a problem without one.
|
|
625
|
+
|
|
626
|
+
Args:
|
|
627
|
+
problem:
|
|
628
|
+
The operator problem.
|
|
629
|
+
|
|
630
|
+
Returns:
|
|
631
|
+
lowering:
|
|
632
|
+
The lowering of its operators.
|
|
633
|
+
|
|
634
|
+
Raises:
|
|
635
|
+
ValidationError:
|
|
636
|
+
The problem holds no lowering of its operators.
|
|
637
|
+
"""
|
|
638
|
+
if problem.lowering is None:
|
|
639
|
+
error_msg = 'The operator problem holds no lowering of its operators. Compile it with OperatorCompiler.'
|
|
640
|
+
raise ValidationError(error_msg)
|
|
641
|
+
return problem.lowering
|
|
642
|
+
|
|
643
|
+
@staticmethod
|
|
644
|
+
def _terms_of(problem: OperatorProblemSpec, operator: Expression, path: str) -> tuple[OperatorKernel, ...]:
|
|
645
|
+
"""Return the terms of an operator of an operator problem, lowered by its lowering.
|
|
646
|
+
|
|
647
|
+
Args:
|
|
648
|
+
problem:
|
|
649
|
+
The operator problem.
|
|
650
|
+
|
|
651
|
+
operator:
|
|
652
|
+
The operator.
|
|
653
|
+
|
|
654
|
+
path:
|
|
655
|
+
The path of the observable the operator belongs to.
|
|
656
|
+
|
|
657
|
+
Returns:
|
|
658
|
+
terms:
|
|
659
|
+
The terms of the operator.
|
|
660
|
+
"""
|
|
661
|
+
return ObservableEvaluator._lowering_of(problem).run((operator, path)).kernels_
|
|
662
|
+
|
|
663
|
+
@staticmethod
|
|
664
|
+
def _operator_member_getter(
|
|
665
|
+
problem: OperatorProblemSpec,
|
|
666
|
+
path: str,
|
|
667
|
+
observable: ObservableSpec,
|
|
668
|
+
group: str,
|
|
669
|
+
) -> ObservableFunction:
|
|
670
|
+
"""Return the getter of an operator observable evaluated member by member and reduced.
|
|
671
|
+
|
|
672
|
+
The observable gives the operator of a member as a function of its namespace, or names a local operator of every
|
|
673
|
+
member with `variable`.
|
|
674
|
+
"""
|
|
675
|
+
if group not in problem.members:
|
|
676
|
+
error_msg = f'Observable {path} reduces {group}, which is not an operator group of the system.'
|
|
677
|
+
raise ValidationError(error_msg)
|
|
678
|
+
expression = observable.expression
|
|
679
|
+
if observable.variable is not None:
|
|
680
|
+
terms = ObservableEvaluator._local_terms(problem, group, observable.variable)
|
|
681
|
+
elif callable(expression):
|
|
682
|
+
terms = [
|
|
683
|
+
ObservableEvaluator._terms_of(problem, ObservableEvaluator._operator_of(path, expression(member)), path)
|
|
684
|
+
for member in problem.members[group]
|
|
685
|
+
]
|
|
686
|
+
else:
|
|
687
|
+
error_msg = f'Observable {path} of an operator group needs a function of a member namespace or a variable.'
|
|
688
|
+
raise ValidationError(error_msg)
|
|
689
|
+
|
|
690
|
+
def get(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
691
|
+
del done
|
|
692
|
+
values = np.asarray([problem._expect(item, t, x, p) for item in terms])
|
|
693
|
+
return ReductionKernel._reduce_values(values, observable.reduce)
|
|
694
|
+
|
|
695
|
+
return get
|
|
696
|
+
|
|
697
|
+
@staticmethod
|
|
698
|
+
def _operator_of(path: str, value: object) -> Expression:
|
|
699
|
+
"""Return the operator an observable expression of an operator system gives, after checking that it is one."""
|
|
700
|
+
if not isinstance(value, Expression) or not has_operator(value):
|
|
701
|
+
error_msg = f'Observable {path} of an operator system gives {value!r}, but it must give an operator.'
|
|
702
|
+
raise ValidationError(error_msg)
|
|
703
|
+
return value
|
|
704
|
+
|
|
705
|
+
@staticmethod
|
|
706
|
+
def _expectation_getter(problem: OperatorProblemSpec, terms: Sequence[OperatorKernel]) -> ObservableFunction:
|
|
707
|
+
"""Return the getter of the expectation value of an operator at the state of an operator problem."""
|
|
708
|
+
|
|
709
|
+
def get(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
710
|
+
del done
|
|
711
|
+
return problem._expect(terms, t, x, p)
|
|
712
|
+
|
|
713
|
+
return get
|
|
714
|
+
|
|
715
|
+
@staticmethod
|
|
716
|
+
def _purity_getter(problem: OperatorProblemSpec) -> ObservableFunction:
|
|
717
|
+
"""Return the getter of the purity `Tr(rho^2)` of the state of an operator problem."""
|
|
718
|
+
|
|
719
|
+
def get(t: float, x: Array, p: Array, done: Mapping[str, object]) -> object:
|
|
720
|
+
del t, p, done
|
|
721
|
+
state = problem._state_of(x)
|
|
722
|
+
return 1.0 if problem.pure else float(np.sum(np.abs(state) ** 2))
|
|
723
|
+
|
|
724
|
+
return get
|
|
725
|
+
|
|
726
|
+
def evaluate(self, t: float, x: Array, p: Array, agents_of: AgentsFunction | None = None) -> dict[str, object]:
|
|
727
|
+
"""Return the value of every observable by path.
|
|
728
|
+
|
|
729
|
+
Args:
|
|
730
|
+
t:
|
|
731
|
+
The time.
|
|
732
|
+
|
|
733
|
+
x:
|
|
734
|
+
The state vector.
|
|
735
|
+
|
|
736
|
+
p:
|
|
737
|
+
The parameter vector.
|
|
738
|
+
|
|
739
|
+
agents_of:
|
|
740
|
+
A function that returns the views of the agents of an agent group by path, or `None` without agents.
|
|
741
|
+
|
|
742
|
+
Returns:
|
|
743
|
+
values:
|
|
744
|
+
A mapping from observable path to its value.
|
|
745
|
+
"""
|
|
746
|
+
done: dict[str, object] = {'__agents__': agents_of or (lambda group: None)}
|
|
747
|
+
for path, get in self.getters_.items():
|
|
748
|
+
done[path] = get(t, x, p, done)
|
|
749
|
+
del done['__agents__']
|
|
750
|
+
return done
|
|
751
|
+
|
|
752
|
+
@staticmethod
|
|
753
|
+
def _from_done(name: str) -> Callable[[Array, Array, Mapping[str, object]], object]:
|
|
754
|
+
"""Return a reader of an observable computed earlier in the same frame."""
|
|
755
|
+
return lambda x, p, done: done[name]
|
|
756
|
+
|
|
757
|
+
@staticmethod
|
|
758
|
+
def _from_members(read: Callable[[Array, Array], Array]) -> Callable[[Array, Array, Mapping[str, object]], object]:
|
|
759
|
+
"""Return a reader of one member variable over a group."""
|
|
760
|
+
return lambda x, p, done: read(x, p)
|
|
761
|
+
|
|
762
|
+
@staticmethod
|
|
763
|
+
def _read_of(read: ReadSpec) -> Callable[[Array, Array], Array]:
|
|
764
|
+
"""Return a reader of the values a reduction read stands for, from the state or the extended parameters."""
|
|
765
|
+
return ObservableEvaluator._from_vector(read.is_state, read.index)
|
|
766
|
+
|
|
767
|
+
@staticmethod
|
|
768
|
+
def _from_offset(
|
|
769
|
+
column: Callable[[Array, Array], Array],
|
|
770
|
+
read: NeighborReadSpec,
|
|
771
|
+
) -> Callable[[Array, Array], Array]:
|
|
772
|
+
"""Return a reader of the values of a member column at the member an offset away from every member."""
|
|
773
|
+
return lambda x, p: read.read(column(x, p), p)
|
|
774
|
+
|
|
775
|
+
@staticmethod
|
|
776
|
+
def _from_vector(is_state: bool, indices: int | Indices) -> Callable[[Array, Array], Array]:
|
|
777
|
+
"""Return a reader of components of the state or the parameter vector."""
|
|
778
|
+
return lambda x, p: (x if is_state else p)[indices]
|
|
779
|
+
|
|
780
|
+
@staticmethod
|
|
781
|
+
def _renewal_counter(counts: npt.NDArray[np.intp]) -> ObservableFunction:
|
|
782
|
+
"""Return the getter of the number of renewals of a renewal law over all its members."""
|
|
783
|
+
|
|
784
|
+
def count_renewals(t: float, x: Array, p: Array, done: Mapping[str, object]) -> float:
|
|
785
|
+
del t, p, done
|
|
786
|
+
return float(np.sum(x[counts]))
|
|
787
|
+
|
|
788
|
+
return count_renewals
|
|
789
|
+
|
|
790
|
+
@staticmethod
|
|
791
|
+
def _joined_complex(expression: object, owner: str) -> Expression:
|
|
792
|
+
"""Return an expression as its real part plus the imaginary unit times its imaginary part, both real.
|
|
793
|
+
|
|
794
|
+
Args:
|
|
795
|
+
expression:
|
|
796
|
+
The expression, whose symbols are all real.
|
|
797
|
+
|
|
798
|
+
owner:
|
|
799
|
+
The owner of the expression, used in error messages.
|
|
800
|
+
|
|
801
|
+
Returns:
|
|
802
|
+
expression:
|
|
803
|
+
The expression with every complex function written out, ready to print with complex numbers.
|
|
804
|
+
|
|
805
|
+
Raises:
|
|
806
|
+
ValidationError:
|
|
807
|
+
The expression cannot be split into real and imaginary parts.
|
|
808
|
+
"""
|
|
809
|
+
real, imaginary = _split_complex(expression, owner)
|
|
810
|
+
return real if _is_zero(imaginary) else real + I * imaginary
|
|
811
|
+
|
|
812
|
+
@staticmethod
|
|
813
|
+
def _entry_of(problem: BaseProblemSpec, name: str) -> EntrySpec | None:
|
|
814
|
+
"""Return the entry of a state or parameter of a problem by name, or `None`."""
|
|
815
|
+
for layout in (problem.states, problem.parameters):
|
|
816
|
+
if layout.has(name):
|
|
817
|
+
return layout.entry(name)
|
|
818
|
+
return None
|
|
819
|
+
|
|
820
|
+
@staticmethod
|
|
821
|
+
def _tree(items: Mapping[str, object], **root: object) -> SimpleNamespace:
|
|
822
|
+
"""Return nested namespaces from paths such as `forest/foxes.n` mapped to values, extra values at the root.
|
|
823
|
+
|
|
824
|
+
Args:
|
|
825
|
+
items:
|
|
826
|
+
The values, by their path from the root.
|
|
827
|
+
|
|
828
|
+
**root:
|
|
829
|
+
The extra values of the root namespace, such as the time.
|
|
830
|
+
|
|
831
|
+
Returns:
|
|
832
|
+
namespace:
|
|
833
|
+
The namespace of every element and nested system, with the extra values.
|
|
834
|
+
"""
|
|
835
|
+
systems: dict[str, dict[str, object]] = {}
|
|
836
|
+
elements: dict[str, dict[str, object]] = {}
|
|
837
|
+
for path, value in items.items():
|
|
838
|
+
head, slash, rest = path.partition('/')
|
|
839
|
+
if slash:
|
|
840
|
+
systems.setdefault(head, {})[rest] = value
|
|
841
|
+
continue
|
|
842
|
+
element, _, variable = path.partition('.')
|
|
843
|
+
elements.setdefault(element, {})[variable] = value
|
|
844
|
+
namespaces = {name: SimpleNamespace(**values) for name, values in elements.items()}
|
|
845
|
+
namespaces.update({name: ObservableEvaluator._tree(values) for name, values in systems.items()})
|
|
846
|
+
return SimpleNamespace(**namespaces, **root)
|
|
847
|
+
|
|
848
|
+
@staticmethod
|
|
849
|
+
def _namespace_of(problem: BaseProblemSpec, scope: str = '') -> SimpleNamespace:
|
|
850
|
+
"""Return the namespace of the states and parameters of the single elements and interactions of a system.
|
|
851
|
+
|
|
852
|
+
The namespace nests the symbols by their dotted names, so `s.plant.x` is the state `plant.x`, and
|
|
853
|
+
`s.forest.foxes.n` the state `forest/foxes.n`. It also holds the time `s.t`.
|
|
854
|
+
|
|
855
|
+
Args:
|
|
856
|
+
problem:
|
|
857
|
+
The compiled problem.
|
|
858
|
+
|
|
859
|
+
scope:
|
|
860
|
+
The path of the nested system whose symbols the namespace holds, empty for the root.
|
|
861
|
+
|
|
862
|
+
Returns:
|
|
863
|
+
namespace:
|
|
864
|
+
The namespace.
|
|
865
|
+
|
|
866
|
+
Examples:
|
|
867
|
+
>>> from skcomplex.engine.compile import compile_system
|
|
868
|
+
>>> from skcomplex.engine.compile import ObservableEvaluator
|
|
869
|
+
>>> from skcomplex.core.system import System
|
|
870
|
+
>>> from skcomplex.models.biology.common.populations import PopulationElement
|
|
871
|
+
>>> problem = compile_system(System(elements=[PopulationElement('rabbits')]))
|
|
872
|
+
>>> ObservableEvaluator._namespace_of(problem).rabbits.n
|
|
873
|
+
n_rabbits
|
|
874
|
+
"""
|
|
875
|
+
prefix = f'{scope}/' if scope else ''
|
|
876
|
+
items: dict[str, object] = {
|
|
877
|
+
name[len(prefix) :]: problem.symbols[name]
|
|
878
|
+
for name in problem.symbols
|
|
879
|
+
if name.startswith(prefix)
|
|
880
|
+
and (entry := ObservableEvaluator._entry_of(problem, name)) is not None
|
|
881
|
+
and entry.members is None
|
|
882
|
+
}
|
|
883
|
+
return ObservableEvaluator._tree(items, t=problem.time)
|
|
884
|
+
|
|
885
|
+
@staticmethod
|
|
886
|
+
def _join(scope: str, path: str) -> str:
|
|
887
|
+
"""Return a path relative to a system as a path from the root."""
|
|
888
|
+
return f'{scope}/{path}' if scope else path
|
|
889
|
+
|
|
890
|
+
@staticmethod
|
|
891
|
+
def _is_lowerable(scope: str, observable: ObservableSpec, nodes: dict[str, NodeSpec]) -> bool:
|
|
892
|
+
"""Check whether laws can read an observable at the current state, as an expression or a symbolic reduction."""
|
|
893
|
+
if observable.group is None:
|
|
894
|
+
return True
|
|
895
|
+
node = nodes.get(ObservableEvaluator._join(scope, observable.group))
|
|
896
|
+
return node is not None and not node.is_agent and isinstance(observable.reduce, str)
|
|
897
|
+
|
|
898
|
+
@staticmethod
|
|
899
|
+
def _lowerable_observables(system: System, nodes: list[NodeSpec]) -> Declared:
|
|
900
|
+
"""Return every observable of a system tree that laws can read at the current state, by path.
|
|
901
|
+
|
|
902
|
+
An expression of a system's symbols is lowerable when every observable declared before it in its system is.
|
|
903
|
+
"""
|
|
904
|
+
by_path = {node.path: node for node in nodes}
|
|
905
|
+
lowerable: Declared = {}
|
|
906
|
+
blocked: set[str] = set()
|
|
907
|
+
for scope, observable in BaseCompiler._observables_of(system):
|
|
908
|
+
if scope in blocked or not ObservableEvaluator._is_lowerable(scope, observable, by_path):
|
|
909
|
+
blocked.add(scope)
|
|
910
|
+
continue
|
|
911
|
+
lowerable[ObservableEvaluator._join(scope, observable.label)] = (scope, observable)
|
|
912
|
+
return lowerable
|
|
913
|
+
|
|
914
|
+
@staticmethod
|
|
915
|
+
def _held_reductions_of(problem: BaseProblemSpec) -> list[tuple[str, '_HeldReductionSpec']]:
|
|
916
|
+
"""Return the reductions that a co-simulation computes at every synchronisation point, with where it holds them.
|
|
917
|
+
|
|
918
|
+
A law of one partition reads a reduction of the agents of another, such as `count(s.farmers)`, through an
|
|
919
|
+
element that holds its value in the state `value` between synchronisation points.
|
|
920
|
+
|
|
921
|
+
Args:
|
|
922
|
+
problem:
|
|
923
|
+
The problem.
|
|
924
|
+
|
|
925
|
+
Returns:
|
|
926
|
+
reductions:
|
|
927
|
+
The path of every element that holds a reduction, with the reduction.
|
|
928
|
+
|
|
929
|
+
Examples:
|
|
930
|
+
>>> from skcomplex.engine.compile import compile_system
|
|
931
|
+
>>> from skcomplex.engine.compile import ObservableEvaluator
|
|
932
|
+
>>> from skcomplex.models import create
|
|
933
|
+
>>> [path for path, _ in ObservableEvaluator._held_reductions_of(compile_system(create('harvesting')))]
|
|
934
|
+
['village/farmers_count']
|
|
935
|
+
"""
|
|
936
|
+
return [
|
|
937
|
+
(element.path, reduction)
|
|
938
|
+
for element in problem.elements
|
|
939
|
+
if isinstance(element.element, _HeldElement) and (reduction := element.element.reduction) is not None
|
|
940
|
+
]
|