Getting started¶
This page provides a walkthrough of how to use PyPhi in an interactive Python session.
Tip
An illustrated tutorial on how Φ is calculated is available as a supplement to the formal PyPhi paper.
To explore the following examples, install IPython by running pip install ipython on the
command line. Then run it with the command ipython.
Lines of code beginning with >>> and ... can be pasted directly into
IPython.
Basic Usage¶
Let’s make a simple 3-node network and compute its \(\Phi\).
To make a network, we need a TPM and (optionally) a connectivity matrix. The
TPM can be in more than one form; see the documentation for Network. Here
we’ll use the 2-dimensional state-by-node form.
>>> import pyphi
>>> import numpy as np
>>> tpm = np.array([
... [0, 0, 0],
... [0, 0, 1],
... [1, 0, 1],
... [1, 0, 0],
... [1, 1, 0],
... [1, 1, 1],
... [1, 1, 1],
... [1, 1, 0]
... ])
The connectivity matrix is a square matrix such that the \((i,j)^{\textrm{th}}\) entry is 1 if there is a connection from node \(i\) to node \(j\), and 0 otherwise.
>>> cm = np.array([
... [0, 0, 1],
... [1, 0, 1],
... [1, 1, 0]
... ])
We’ll also make labels for the network nodes so that PyPhi’s output is easier to read.
>>> labels = ('A', 'B', 'C')
Now we construct the network itself with the arguments we just created:
>>> network = pyphi.Network(tpm, cm=cm, node_labels=labels)
The next step is to define a subsystem for which we want to evaluate \(\Phi\). To make a subsystem, we need the network that it belongs to, the state of that network, and the indices of the subset of nodes which should be included.
The state should be an \(n\)-tuple, where \(n\) is the number of nodes in the network, and where the \(i^{\textrm{th}}\) element is the state of the \(i^{\textrm{th}}\) node in the network.
>>> state = (1, 0, 0)
In this case, we want the \(\Phi\) of the entire network, so we simply include every node in the network in our subsystem:
>>> node_indices = (0, 1, 2)
>>> subsystem = pyphi.Subsystem(network, state, node_indices)
Tip
If you do not explicitly provide node indices to a Subsystem the system
will, by default, cover the entire network. For example, the following is
equivalent to the above definition of subsystem:
>>> subsystem = pyphi.Subsystem(network, state)
Tip
Node labels can be used instead of indices when constructing a Subsystem:
>>> pyphi.Subsystem(network, state, ('B', 'C'))
Subsystem(B, C)
Now we use the phi() function to compute the \(\Phi\) of our
subsystem:
>>> pyphi.compute.phi(subsystem)
2.3125
If we want to take a deeper look at the integrated-information-theoretic
properties of our network, we can access all the intermediate quantities and
structures that are calculated in the course of arriving at a final \(\Phi\)
value by using sia(). This returns a nested object,
SystemIrreducibilityAnalysis, that contains data about the subsystem’s
cause-effect structure, cause and effect repertoires, etc.
>>> sia = pyphi.compute.sia(subsystem)
For instance, we can see that this network has 4 concepts:
>>> len(sia.ces)
4
See the documentation for SystemIrreducibilityAnalysis and Concept for more
information on these objects.
Tip
The network and subsystem discussed here are returned by the
pyphi.examples.basic_network() and
pyphi.examples.basic_subsystem() functions.