Different ways you can control a Boolean Network
Dear @ajgates42, @xuan-w, and @tjparmer,
Here are some thoughts that I believe we need to think about moving forward with BN control. BNs can be controlled in several different ways, for example:
- You can pin a node to a specific state;
- You can perturb a node for a certain amount of time (t) and then let go;
- You can perturb a node until it reaches certain attractor;
- Or you can even have a schedule of perturbations (think of drug regimes).
All of these for single and multiple nodes. We need to figure it out a clever way to best incorporate all these different types of control into one (or little as possible) functions into CANA. One way is to redesign the self.step() function to pass on commands to individual nodes and to keep track of the schedules.
Please add here comments and things you believe might break or need to be considered.
One thing we discussed is that in general schedules would need to be time-relative since the number of iterations may be unbounded. So instead of update_schedule={t0: (node1), t1: (node1, node2), t2: (node1)}, something that captures time differences relative to last update, update_schedule={node1: t+1, node2: t+2}, or uses a generic update function update_schedule=f(node). But at the same time this needs to be usable by general researchers.