Read a result#

pyphi.analyze() returns an Analysis. This page walks through what it prints and what each row means, then through the system irreducibility analysis underneath it and how to interpret an unexpected value.

import pyphi

pyphi.config.progress_bars = False
substrate = pyphi.examples.iit4_2023_fig1a_substrate()
analysis = pyphi.analyze(substrate, (0, 1, 1), subset=(0, 1))
analysis
Analysis
Φ1.56269
φs0.0404968
Distinctions3
Σφd0.727763
Relations7
Σφr0.834924
Distinctions
MechanismφdCause purviewEffect purview
a0.332728 BB
B0.323594 aaB
aB0.0714404BaB
System
UnitsA,B
Current state(0, 1)
Specified cause state(1, 0)
Specified effect state(1, 0)
MIP2 parts: {A,B}
ii(s)0.0404968
Requirement bindsdifferentiation (EFFECT)

The analysis card#

  • Φ: the structure integrated information, the sum of φ over every distinction and every relation. It measures how much structure the system specifies. It is analysis.big_phi.

  • \(\varphi_s\): the system integrated information: whether the system exists as one whole, and how irreducibly. It is analysis.phi. Zero means reducible, not “no structure”: a system can have \(\varphi_s = 0\) and a nonzero Φ.

  • Distinctions, \(\Sigma\varphi_d\): how many mechanisms specify an irreducible cause–effect state, and their total φ.

  • Relations, \(\Sigma\varphi_r\): how many congruent overlaps bind those distinctions, and their total φ. Under the default analytical backend these are computed in closed form; the individual relations are not enumerated, so they cannot be listed one by one. Query relational structure shows what can be asked of them and how to enumerate when you must.

  • Formalism: appears only on a result computed under an earlier version of IIT, and gives that version (see Reproduce results from earlier versions of IIT). It is analysis.formalism.

  • The distinction table: one row per distinction: its mechanism, \(\varphi_d\), and its cause and effect purviews, each written in the state the distinction specifies. An uppercase letter is a unit ON, lowercase is OFF, and a unit with more than two states carries its state as a subscript (A₂). A cause purview a means the mechanism specifies unit A being OFF in the past.

  • System: the units and current state analyzed, the cause and effect states the system specifies, the minimum partition (the cut that makes the least difference: the system’s weakest link), the system’s intrinsic information ii(s), and, when the intrinsic-information requirement set \(\varphi_s\), which term and direction did so. The next section explains these.

The system irreducibility analysis#

sia = analysis.sia
sia
SystemIrreducibilityAnalysis
φs0.0404968
Normalized φs0.0404968
SystemA,B
Current state(0, 1)
Cause
Specified state(1, 0)
Intrinsic specification0.843228
Intrinsic differentiation0.663964
Effect
Specified state(1, 0)
Intrinsic specification1.09763
Intrinsic differentiation0.0404968
MIP
Partition2 parts: {A,B}
Tied MIPs0
AB
A·✕
B··
  • Normalized \(\varphi_s\): \(\varphi_s\) divided by the partition’s normalization; the minimum partition is chosen on this value.

  • Specified state (cause and effect): the past and future states the system specifies with maximal intrinsic information.

  • Intrinsic specification: how selectively and informatively the specified state is picked out.

  • Intrinsic differentiation: the surprisal of the specified state: how much of a repertoire of alternatives the system provides itself. Zero for a deterministic transition.

  • MIP: the partition and, in the grid, the connections it severs; “Tied MIPs” counts partitions tied with it.

\(\varphi_s\) is the smallest of three terms: the cause-side integration \(\varphi_c\), the effect-side integration \(\varphi_e\), and the intrinsic information ii(s), itself the smaller of specification and differentiation over both directions (see The intrinsic-information requirement). sia.explain() says which term won:

for finding in sia.explain().findings:
    print(finding.kind, "=", finding.value)
winning_partition = 2 parts: {A,B}
runner_up = 2 parts: {A,B}
gap = -0.02024840405900287
partition_margin = 0.21340128355945173
state_margin = 0.7608118065390782
state_margin = 1.097995033428008
effectively_tied = False
binding_direction = EFFECT
requirement_binding = differentiation

Here the effect-side differentiation is the smallest term, so it is \(\varphi_s\).

When φₛ is zero#

There are two different reasons, and the findings above tell them apart.

Ordinary reducibility. One side’s integration is already zero: some partition of the system makes no difference to its cause or effect repertoire. Then binding_direction gives that side and there is no requirement_binding finding.

The intrinsic-information requirement. Both \(\varphi_c\) and \(\varphi_e\) are positive, but the system provides itself no repertoire of alternatives (a deterministic transition has zero differentiation), so ii(s) is zero and with it \(\varphi_s\). Then a requirement_binding finding gives the term (differentiation or specification) and the direction.

basic = pyphi.analyze(pyphi.examples.basic_substrate(), (1, 1, 0), compute="sia")
print(float(basic.cause.phi), float(basic.effect.phi), basic.intrinsic_information)
[f.value for f in basic.explain().findings if f.kind == "requirement_binding"]
0.20751874963942188 0.41503749927884376 0.0
['differentiation']

Where to go next#