diff --git a/examples/bdd/generators/gen_drs.py b/examples/bdd/generators/gen_drs.py new file mode 100755 index 0000000..dd0edf4 --- /dev/null +++ b/examples/bdd/generators/gen_drs.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +import sys + + +class SingleReaction: + def __init__(self, reactants=None, inhibitors=None, products=None): + self.reactants = set(reactants) if reactants is not None else set() + self.inhibitors = set(inhibitors) if inhibitors is not None else set() + self.products = set(products) if products is not None else set() + + def get_reactants(self): + return "{" + ", ".join(self.reactants) + "}" + + def get_inhibitors(self): + return "{" + ", ".join(self.inhibitors) + "}" + + def get_products(self): + return "{" + ", ".join(self.products) + "}" + + def __str__(self): + return "{" + f"{self.get_reactants()}, {self.get_inhibitors()} -> {self.get_products()}" + "};" + + +class Reactions: + def __init__(self): + self.reactions = set() + + def add(self, reaction): + self.reactions.add(reaction) + + def __str__(self): + ret = "" + for r in self.reactions: + ret += f"{r}\n" + return ret + + +class DRSGenerator: + def __init__(self, x, y, z): + assert y >= z + assert x >= 2 and y >= 2 and z >= 2 + self.x = x + self.y = y + self.z = z + self.reactions = {} + + self.generate() + + def generate_reactions_for_component(self, i): + self.reactions.setdefault(i, Reactions()) + rcts = self.reactions[i] + rcts.add(SingleReaction(["GF"], ["h"], ["GF"])) + rcts.add(SingleReaction(["GF"], ["h", f"RTK{i}"], ["RTK"])) + rcts.add(SingleReaction(["RTK"], [f"ENi:1_{i}"], [f"EN:1_{i}"])) + for j in range(1, self.x): + rcts.add(SingleReaction([f"EN:{j}_{i}"], [f"ENi:{j+1}_{i}"], [f"EN:{j+1}_{i}"])) + + def generate(self): + for i in range(1, self.y): + self.generate_reactions_for_component(i) + + for proc, reactions in self.reactions.items(): + print(f"proc={proc}") + print(reactions) + + +def main(): + if len(sys.argv) < 1 + 2: + print(f"Usage: {sys.argv[0]} ") + print("\twhere x,y,z >= 2 and y >= z") + sys.exit(1) + + g = DRSGenerator(x=int(sys.argv[1]), y=int(sys.argv[2]), z=int(sys.argv[3])) + + +if __name__ == "__main__": + main()