WeightThreshold Networks¶

class
neet.boolean.
WTNetwork
(weights, thresholds=None, theta=None, names=None, metadata=None)[source]¶ WTNetwork represents weightthreshold boolean network. This type of Boolean network model is common in biology as it represents activating/inhibiting interactions between subcomponents.
In addition to methods inherited from
neet.boolean.BooleanNetwork
, WTNetwork exposes the following attributesweights
The network’s square weight matrix. thresholds
The network’s threshold vector. theta
The network’s activation function. and static methods:
read
Read a network from a pair of node/edge files. positive_threshold
Activate if the stimulus is 0 or greater. negative_threshold
Activate if the stimulus exceeds 0. split_threshold
Activates if the stimulus exceeds 0, maintaining state if it is exactly 0. At a minimum, WTNetworks accept either a weight matrix or a size. The weight matrix must be square, with the \((i,j)\) element representing the weight on the edge from \(j\)th node to the \(i\)th. If a size is provided, all weights are assumed to be \(0.0\).
>>> WTNetwork(3) <neet.boolean.wtnetwork.WTNetwork object at 0x...> >>> WTNetwork([[0, 1, 0], [1, 0, 1], [1, 1, 1]]) <neet.boolean.wtnetwork.WTNetwork object at 0x...>
Each node has associated with it a threshold value. These thresholds can be provided at initialization. If none are provided, all thresholds are assumed to be \(0.0\).
>>> net = WTNetwork(3, [0.5, 0.0, 0.5]) >>> net.thresholds array([ 0.5, 0. , 0.5]) >>> WTNetwork([[0, 1, 0], [1, 0, 1], [1, 1, 1]], thresholds=[0.5, 0.0, 0.5]) <neet.boolean.wtnetwork.WTNetwork object at 0x...>
Finally, every node of the network is assumed to use the same activation function,
theta
. This function, if not provided, is assumed to besplit_threshold()
.>>> net = WTNetwork(3) >>> net.theta <function WTNetwork.split_threshold at 0x...> >>> net = WTNetwork(3, theta=WTNetwork.negative_threshold) >>> net.theta <function WTNetwork.negative_threshold at 0x...>
This activation function must accept two arguments: the activation stimulus and the current state of the node or network. It should handle two types of arguments:
 stimulus and state are scalar
 stimulus and state are vectors (
list
ornumpy.ndarray
)
In case 2, the result should modify the state inplace and return the vector.
def theta(stimulus, state): if isinstance(stimulus, (list, numpy.ndarray)): for i, x in enumerate(stimulus): state[i] = theta(x, state[i]) return state elif stimulus < 0: return 0 else: return state net = WTNetwork(3, theta=theta) print(net.theta)
<function theta at 0x...>
As with all
neet.Network
classes, the names of the nodes and networkwide metadata can be provided.Parameters:  weights (int, list, numpy.ndarray) – a weights matrix (rows → targets, columns → sources) or a size
 thresholds (list, numpy.ndarray) – activation thresholds for the nodes
 theta (callable) – the activation function for all nodes
 names (seq) – an iterable object of the names of the nodes in the network
 metadata (dict) – metadata dictionary for the network
Raises:  ValueError – if weights is not a integer or a square matrix
 ValueError – if thresholds and weights have inconsistent dimensions
 ValueError – if theta is not callable

weights
¶ The network’s square weight matrix. The rows and columns are target and source nodes, respectively. That is, the \((i,j)\) element is the weight of the edge from the \(j\)th node to the \(i\)th.
Examples
>>> net = WTNetwork(3) >>> net.weights array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]) >>> net = WTNetwork([[1, 0, 1], [1, 1, 0], [0, 0, 1]]) >>> net.weights array([[ 1., 0., 1.], [1., 1., 0.], [ 0., 0., 1.]])
Type: numpy.ndarray

thresholds
¶ The network’s threshold vector. The \(i\)th element is the threshold for the \(i\)th node.
Examples
>>> net = WTNetwork(3) >>> net.thresholds array([0., 0., 0.]) >>> net = WTNetwork(3, thresholds=[0, 0.5, 0.5]) >>> net.thresholds array([ 0. , 0.5, 0.5])
Type: numpy.ndarray

theta
¶ The network’s activation function. Every node in the network uses this function to determine its next state, based on the simulus it recieves.
>>> WTNetwork(3).theta <function WTNetwork.split_threshold at 0x...> >>> WTNetwork(3, theta=WTNetwork.negative_threshold).theta <function WTNetwork.negative_threshold at 0x...>
This activation function must accept two arguments: the activation stimulus and the current state of the node or network. It should handle two types of arguments:
 stimulus and state are scalar
 stimulus and state are vectors (
list
ornumpy.ndarray
)
In case 2, the result should modify the state inplace and return the vector.
def theta(stimulus, state): if isinstance(stimulus, (list, numpy.ndarray)): for i, x in enumerate(stimulus): state[i] = theta(x, state[i]) return state elif stimulus < 0: return 0 else: return state net = WTNetwork(3, theta=theta) print(net.theta)
<function theta at 0x...>
As with all
neet.Network
classes, the names of the nodes and networkwide metadata can be provided.Type: callable

static
read
(nodes_path, edges_path, theta=None, metadata=None)[source]¶ Read a network from a pair of node/edge files.
>>> nodes_path = '../neet/boolean/data/s_pombenodes.txt' >>> edges_path = '../neet/boolean/data/s_pombeedges.txt' >>> net = WTNetwork.read(nodes_path, edges_path) >>> net.size 9 >>> net.names ['SK', 'Cdc2_Cdc13', 'Ste9', 'Rum1', 'Slp1', 'Cdc2_Cdc13_active', 'Wee1_Mik1', 'Cdc25', 'PP']
Parameters: Returns:

static
positive_threshold
(values, states)[source]¶ Activate if the stimulus is 0 or greater. That is, it “leans positive” if the simulus is 0:
\[\begin{split}\theta_p(x) = \begin{cases} 0 & x < 0 \\ 1 & x \geq 0. \end{cases}\end{split}\]If
values
andstates
are iterable, then apply the above function to each pair(x,y)
inzip(values, states)
and stores the result instates
.If
values
andstates
are scalar values, then simply apply the above threshold function to the pair(values, states)
and return the result.Examples
>>> ys = [0,0,0] >>> WTNetwork.positive_threshold([1, 1, 0], ys) [1, 0, 1] >>> ys [1, 0, 1] >>> ys = [1,1,1] >>> WTNetwork.positive_threshold([1, 1, 0], ys) [1, 0, 1] >>> ys [1, 0, 1] >>> WTNetwork.positive_threshold(0,0) 1 >>> WTNetwork.positive_threshold(0,1) 1 >>> WTNetwork.positive_threshold(1,0) 1 >>> WTNetwork.positive_threshold(1,0) 0
Parameters:  values – the thresholdshifted values of each node
 states – the preupdated states of the nodes
Returns: the updated states

static
negative_threshold
(values, states)[source]¶ Activate if the stimulus exceeds 0. That is, it “leans negative” if the simulus is 0:
\[\begin{split}\theta_n(x) = \begin{cases} 0 & x \leq 0 \\ 1 & x > 0. \end{cases}\end{split}\]If
values
andstates
are iterable, then apply the above function to each pair(x,y)
inzip(values, states)
and stores the result instates
.If
values
andstates
are scalar values, then simply apply the above threshold function to the pair(values, states)
and return the result.Examples
>>> ys = [0,0,0] >>> WTNetwork.negative_threshold([1, 1, 0], ys) [1, 0, 0] >>> ys [1, 0, 0] >>> ys = [1,1,1] >>> WTNetwork.negative_threshold([1, 1, 0], ys) [1, 0, 0] >>> ys [1, 0, 0] >>> WTNetwork.negative_threshold(0,0) 0 >>> WTNetwork.negative_threshold(0,1) 0 >>> WTNetwork.negative_threshold(1,0) 1 >>> WTNetwork.negative_threshold(1,1) 1
Parameters:  values – the thresholdshifted values of each node
 states – the preupdated states of the nodes
Returns: the updated states

static
split_threshold
(values, states)[source]¶ Activates if the stimulus exceeds 0, maintaining state if it is exactly 0. That is, it is a middle ground between
negative_threshold()
andpositive_threshold()
:\[\begin{split}\theta_s(x,y) = \begin{cases} 0 & x < 0 \\ y & x = 0 \\ 1 & x > 0. \end{cases}\end{split}\]If
values
andstates
are iterable, then apply the above function to each pair(x,y)
inzip(values, states)
and stores the result instates
.If
values
andstates
are scalar values, then simply apply the above threshold function to the pair(values, states)
and return the result.Examples
>>> ys = [0,0,0] >>> WTNetwork.split_threshold([1, 1, 0], ys) [1, 0, 0] >>> ys [1, 0, 0] >>> ys = [1,1,1] >>> WTNetwork.split_threshold([1, 1, 0], ys) [1, 0, 1] >>> ys [1, 0, 1] >>> WTNetwork.split_threshold(0,0) 0 >>> WTNetwork.split_threshold(0,1) 1 >>> WTNetwork.split_threshold(1,0) 1 >>> WTNetwork.split_threshold(1,1) 1
Parameters:  values – the thresholdshifted values of each node
 states – the preupdated states of the nodes
Returns: the updated states