diff --git a/mod/butadien/butadien.py b/mod/butadien/butadien.py index 236d72f..7757484 100644 --- a/mod/butadien/butadien.py +++ b/mod/butadien/butadien.py @@ -1,6 +1,7 @@ config.ilp.solver="CPLEX" -butadien = Graph.fromGMLString("""graph [ +butadien = Graph.fromGMLString( +"""graph [ node [ id 0 label "C" ] node [ id 1 label "C" ] node [ id 2 label "C" ] @@ -20,7 +21,26 @@ butadien = Graph.fromGMLString("""graph [ edge [ source 2 target 7 label "-" ] edge [ source 3 target 8 label "-" ] edge [ source 3 target 9 label "-" ] -]""", name="Butadien") +]""" +, name="Butadien") + +#allene = Graph.fromGMLString( +"""graph [ + node [ id 0 label "H" ] + node [ id 1 label "H" ] + node [ id 2 label "C" ] + node [ id 3 label "C" ] + node [ id 4 label "C" ] + node [ id 5 label "H" ] + node [ id 6 label "H" ] + edge [ source 0 target 2 label "" ] + edge [ source 1 target 2 label "-" ] + edge [ source 2 target 3 label "=" ] + edge [ source 3 target 4 label "=" ] + edge [ source 4 target 5 label "-" ] + edge [ source 4 target 6 label "-" ] +]""" +#, name="Allene") #pentadien = Graph.fromGMLString( """graph @@ -36,8 +56,8 @@ butadien = Graph.fromGMLString("""graph [ node [ id 8 label "H" ] node [ id 9 label "C" ] node [ id 10 label "H" ] - node [ id 11 label "H" ] - node [ id 12 label "H" ] + node [ id 11 label "H" ] + node [ id 12 label "H" ] edge [ source 0 target 1 label "=" ] edge [ source 1 target 2 label "-" ] edge [ source 2 target 3 label "=" ] @@ -47,9 +67,9 @@ butadien = Graph.fromGMLString("""graph [ edge [ source 2 target 7 label "-" ] edge [ source 3 target 8 label "-" ] edge [ source 3 target 9 label "-" ] - edge [ source 9 target 10 label "-" ] - edge [ source 9 target 11 label "-" ] - edge [ source 9 target 12 label "-" ] + edge [ source 9 target 10 label "-" ] + edge [ source 9 target 11 label "-" ] + edge [ source 9 target 12 label "-" ] ] """ #, name="Pentadien") @@ -77,54 +97,94 @@ dielsalder = Rule.fromGMLString( """rule [ left [ edge [ source 1 target 2 label "=" ] - edge [ source 2 target 3 label "-" ] + edge [ source 2 target 3 label "-" ] edge [ source 3 target 4 label "=" ] - edge [ source 5 target 6 label "=" ] - + edge [ source 5 target 6 label "=" ] + ] context [ node [ id 1 label "C" ] node [ id 2 label "C"] node [ id 3 label "C"] node [ id 4 label "C"] - node [ id 5 label "C"] - node [ id 6 label "C"] + node [ id 5 label "C"] + node [ id 6 label "C"] ] right [ edge [ source 1 target 2 label "-" ] - edge [ source 2 target 3 label "=" ] + edge [ source 2 target 3 label "=" ] edge [ source 3 target 4 label "-" ] - edge [ source 4 target 5 label "-" ] - edge [ source 5 target 6 label "-" ] - edge [ source 6 target 1 label "-" ] + edge [ source 4 target 5 label "-" ] + edge [ source 5 target 6 label "-" ] + edge [ source 6 target 1 label "-" ] ] ]""" ) +#MCB? horton vs DePina, einfach Depth first ob nach vier cyclus +def cyclesizes(g): + cycles = [] + for edge, vertice in g.edges, g.vertices: + print(dir(edge)) + #Find all cycles and list their sizes + #Only for C + #Chordless, elemenatary + #Is there a inbuild way to ignore all H? + # + if min(cycles) < 5 or max(cycles) > 7: + return True + return False + +#Disallows Allenes (Two Doublebonds on same carbon) +def doubledoublebond(g): + for vertice in g.vertices: + if (vertice.stringLabel == "C" and vertice.degree == 2): # and vertice.edges.label == ["=", "="] + for edge in vertice.incidentEdges: + print(type(edge.bondType)) + bonds = [type(edge.bondType) for edge in vertice.incidentEdges] + if (bonds[0] == bonds[1] and len(bonds) == 2): + return True + return False + + +def restriction(dg): + #Only rings 5 to 7 + #No neighbouring double bonds. Is this already in MOD? Can this even happen? + #No Carbon in 3 rings? Better 4? + for a in dg.right: + if a.vLabelCount("C") > 6: + return False + if doubledoublebond(a): + return False + #if cyclesizes(a): + #return False + return True + flowPrinter = FlowPrinter() flowPrinter.printUnfiltered = False postSection("Loaded Graphs") for a in inputGraphs: - a.print() + a.print() postSection("Loaded Rules") for a in inputRules: - a.print() + a.print() + dg = DG(graphDatabase=inputGraphs) dg.build().execute( - addSubset(inputGraphs) - >> rightPredicate[ - lambda d: all(g.vLabelCount("C") <= 10 for g in d.right) - ]( - repeat(revive(inputRules)) #Revive not necessary - ) + addSubset(inputGraphs) + >> rightPredicate[ + restriction + ]( + repeat(revive(inputRules)) #Revive not necessary + ) ) dg.print() postSection("Product Graphs") for a in dg.vertices: - a.graph.print() + a.graph.print() #flow = Flow(dg) #flow.addSource(butadien) @@ -137,16 +197,16 @@ sys.exit(0) rc = rcEvaluator(inputRules) for dRef in dg.derivations: - der = dRef.derivation - educt = rcId(der.left[0]) - for i in range(1, len(der.left)): - educt = educt *rcParallel* rcId(der.left[i]) - product = rcId(der.right[0]) - for i in range(1, len(der.right)): - product = product *rcParallel* rcId(der.right[i]) - rcExp = educt *rcSuper(allowPartial=False)* der.rule *rcSuper(allowPartial=False)* product - res = rc.eval(rcExp) - dRef.print() - for a in res: - a.print() - a.printGML() \ No newline at end of file + der = dRef.derivation + educt = rcId(der.left[0]) + for i in range(1, len(der.left)): + educt = educt *rcParallel* rcId(der.left[i]) + product = rcId(der.right[0]) + for i in range(1, len(der.right)): + product = product *rcParallel* rcId(der.right[i]) + rcExp = educt *rcSuper(allowPartial=False)* der.rule *rcSuper(allowPartial=False)* product + res = rc.eval(rcExp) + dRef.print() + for a in res: + a.print() + a.printGML() \ No newline at end of file