FAQ and troubleshooting#

Why is φₛ zero?#

Two reasons, and analysis.sia.explain() tells them apart. Either one side of the system is reducible outright (some partition makes no difference to its cause or its effect repertoire), or the system provides itself no repertoire of alternatives, so its intrinsic information is zero. Every deterministic network is in the second case: from its own perspective, its current state admits only one past and one future, so there is no difference for it to make to itself. Any indeterminism provides alternatives, so a noisy version of the same network can have positive \(\varphi_s\). Read a result walks through both cases, and The intrinsic-information requirement explains the requirement.

My numbers differ from a paper, or from PyPhi 1.x#

Check which version of IIT the paper used. Values published with the IIT 4.0 paper in 2023 need formalism="IIT_4_0_2023"; 1.x values need formalism="IIT_3_0" (1.x’s Φ is analysis.phi under that version, not analysis.big_phi). Reproduce results from earlier versions of IIT describes what each version computes, and Migrating to PyPhi 2.0 covers 1.x. If the version matches and a value still differs in the last decimals, compare with pyphi.numerics.eq, which respects the configured precision.

StateUnreachableForwardsError#

The state you asked about cannot be produced by the substrate’s own dynamics: no current state leads to it. IIT evaluates a system in a state it could have reached, so PyPhi refuses rather than assigning a structure that rests on an impossible past. Deterministic toy networks hit this often: in the three-XOR network every reachable state has even parity. Choose a reachable state (pyphi.sweep(substrate, states="all").skipped lists the unreachable ones) or check the matrix’s row order (Build a substrate).

ConditionallyDependentError#

The matrix says two units’ next states depend on each other at the same time step, which a substrate of conditionally independent units cannot express; it signals a hidden common cause. Add the shared variable as a unit, or rebuild the matrix from each unit’s own input–output function. Conditional independence.

The estimate says capped=True#

The counting walk stopped at its budget; the counts are lower bounds. Raise limit for an exact count, or read the counts as “at least this much” and reduce the work: Estimate the cost before you run.

The analysis is taking hours#

It is probably past the practical ceiling: about 10–12 units for \(\varphi_s\) and 6–8 for the full Φ-structure on a fully connected substrate. Stop it, count the work with pyphi.cost.estimate_analysis, and reduce it (Estimate the cost before you run). PyPhi has no checkpointing; a killed run loses its progress, so for long sweeps turn on the disk result cache (Cache results).

The result says “effectively tied”#

Two partitions or two specified states came within the configured precision of each other; small symmetric networks do this constantly. The selection is still deterministic and follows the postulates, and the margins say how close it was. Control tie-breaking.

Two calls with the same inputs gave different results#

Something in the configuration changed between them: an override block still open, a pyphi_config.yml in one working directory and not the other, or a preset applied in one session. print(pyphi.config) shows the active settings. Configure PyPhi.

Where is the API reference?#

Under Reference on the built site (generated from the docstrings), and in the interpreter with help().