// Imp-Pi example program by Mathias John, adapted Andrew Phillips's example for Spim
model repressilator

reactions

// reaction for one reactant reactions
delay;
// blocking of gene
lockGene;


variables

// rate constant for protein production
rProd: 0.1;
// rate constant for protein decay
rDec: 0.001;
// rate constant for unblocking gene
rFree: 0.0001;
// rate constant for locking gene
rLock: 1.0;


species 

gene(me,peer) {

   free: delay[rProd]?(){add 1 of new protein(peer)}.free + 
         lockGene[func(n1,r,n2) {if(n1=n2) r} me rLock]?().locked;
  
   locked: delay[rFree]?().free; 
}

protein(n) { 
  
  m: lockGene[n]!().m + 
     delay[rDec]?().null;   

}

timer() {
  m: delay!().m;
  }



solution {
  add 1 of new gene("A","B");
  add 1 of new gene("B","C");
  add 1 of new gene("C","A");
  add 1 of new timer()
}