diff --git a/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py b/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py
index 48fde6e1fdcd552027460bddc217ee7bb8140f18..5e022f49f1f4f232233220ceef86a811438466e2 100755
--- a/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py	
+++ b/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py	
@@ -12,6 +12,7 @@ import datetime
 import sys
 import matplotlib.pyplot as plt
 import lp_to_nx_graph
+from itertools import combinations
 
     
 class DominatingSet:
@@ -64,9 +65,6 @@ class ConnectedKHopDominatingSet(KHopDominatingSet):
         self.G = G
         super().__init__(G, k, name)
         
-        
-        # self.m.addConstr(gp.quicksum(gp.quicksum(self.nodes[w] for w in G.neighbors(v)) -2*self.nodes[v] for v in G.nodes) >= -2)  
-        
         if exclude:
             self.m.addConstrs(self.nodes[v] <= gp.quicksum(self.nodes[w] for w in G.neighbors(v)) for v in G.nodes if v not in exclude)
         else:
@@ -89,6 +87,7 @@ class ConnectedKHopDominatingSet(KHopDominatingSet):
         self.m._G = self.G
         self.m.Params.lazyConstraints = 1
         self.m.optimize(RootedConnectecKHopDominatingSet.elim_unconnectivity)    
+        # self.m.optimize()
         
         ds = {i for i,x_i in enumerate(self.m.getVars()) if x_i.x > 0.5}
         return ds
@@ -119,7 +118,102 @@ class RootedConnectecKHopDominatingSet(ConnectedKHopDominatingSet):
         
         self.m.addConstr(self.nodes[root] >= 1)
         
+        # for i in G.nodes:
+        #     if(i not in G.neighbors(root) and i is not root):
+        #         min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(G, i, root, {i})
+        #         self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[i])
+                
+        # for i in G.nodes:
+        #     for j in G.nodes:
+        #         if i != j and j not in G.neighbors(i):
+        #             min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(self.G, i, j, {i})
+        #             self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[i] + self.nodes[j] - 1)
+        
+        
+        # All Neighbor separators
+        # for v in G.nodes:
+        #     if v is not root and root not in G.neighbors(v) and v not in G.neighbors(root) and not set(G.neighbors(root)).intersection(set(G.neighbors(v))):
+        #         for i in range(2,G.degree[v]):
+        #             V = {w for w in G.neighbors(v)}
+        #             V.update([v])
+        #             # for i_neighborhood in combinations(V, 2):
+        #             for i_neighborhood in combinations(V, i):
+        #                 if v in i_neighborhood:
+        #                     min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(G, v, root, set(i_neighborhood))
+        #                     self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[v])
+        
+        # All separators from single root
+        # for v in G.nodes:
+        #     # if v is not root and root not in G.neighbors(v) and v not in G.neighbors(root) and not set(G.neighbors(root)).intersection(set(G.neighbors(v))):
+        #     for i in range(2,len(G.nodes)):
+        #         V = {w for w in G.neighbors(v)}
+        #         V.update([v])
+        #         # for i_neighborhood in combinations(V, 2):
+        #         for i_neighborhood in combinations(V, i):
+        #             if v in i_neighborhood:
+        #                 min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(G, v, root, set(i_neighborhood))
+        #                 if min_ij_sep:
+        #                     self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[v])
+                    
+        # for v in G.nodes:
+        #     # if v is not root and root not in G.neighbors(v) and v not in G.neighbors(root) and not set(G.neighbors(root)).intersection(set(G.neighbors(v))):
+        #     for i in range(2,len(G.nodes)):
+        #         V = {w for w in G.neighbors(v)}
+        #         V.update([v])
+        #         # for i_neighborhood in combinations(V, 2):
+        #         for i_neighborhood in combinations(V, i):
+        #             if v in i_neighborhood:
+        #                 for h in G.nodes:
+        #                     min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(G, v, h, set(i_neighborhood))
+        #                     if min_ij_sep:
+        #                         self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[v])
+                    
+        
+    def add_single_root_separators(self):
+        for i in self.G.nodes:
+            min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(G, i, self.root, {i})
+            if min_ij_sep:
+                self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[i])
+        
+    # ToDo: refactor!
+    def add_all_neighborhood_root_separators(self):
+        for v in self.G.nodes:
+            if v is not self.root and self.root not in self.G.neighbors(v) and v not in self.G.neighbors(self.root) and not set(self.G.neighbors(self.root)).intersection(set(self.G.neighbors(v))):
+                for i in range(2,self.G.degree[v]):
+                    V = {w for w in self.G.neighbors(v)}
+                    V.update([v])
+                    for i_neighborhood in combinations(V, i):
+                        if v in i_neighborhood:
+                            min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(self.G, v, self.root, set(i_neighborhood))
+                            self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[v])
+    
+    def add_all_combinations_root_separators(self):
+        for v in self.G.nodes:
+            for i in range(2,len(self.G.nodes)):
+                V = {w for w in self.G.neighbors(v)}
+                V.update([v])
+                for i_neighborhood in combinations(V, i):
+                    if v in i_neighborhood:
+                        min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(self.G, v, self.root, set(i_neighborhood))
+                        if min_ij_sep:
+                            self.m.addConstr(gp.quicksum(self.nodes[s] for s in min_ij_sep) >= self.nodes[v])
         
+    def add_simple_path_length_constraint(self):
+        self.m.addConstrs((self.nodes[v] * len(nx.algorithms.shortest_path(self.G, self.root, v))) <= gp.quicksum(self.nodes) for v in self.G.nodes)
+        # self.m.addConstrs((self.nodes[v] * self.nodes[w] * len(nx.algorithms.shortest_path(self.G, v, w))) <= gp.quicksum(self.nodes) for v in self.G.nodes for w in self.G.nodes)
+
+        
+    def add_gausian_sum_formula_constraint(self):
+        self.m.addConstr(gp.quicksum(self.nodes[v] * len(nx.algorithms.shortest_path(self.G, self.root, v)) for v in self.G.nodes) <= (gp.quicksum(self.nodes)+1)*gp.quicksum(self.nodes)/2)
+        # self.m.addConstr(gp.quicksum(self.nodes[v] * self.nodes[w] * len(nx.algorithms.shortest_path(self.G, v, w)) for v in self.G.nodes for w in self.G.nodes) <= (gp.quicksum(self.nodes)+1)*gp.quicksum(self.nodes)/2)
+
+    def add_neighbor_of_neighbors_constraint(self, exclude):
+        self.m.addConstrs(self.nodes[v] <= gp.quicksum(self.nodes[w] * gp.quicksum(self.nodes[h] for h in self.G.neighbors(w) if h is not v) for w in self.G.neighbors(v)) for v in self.G.nodes if v not in exclude)
+
+    def intermediate_node_constraint(self, exclude):
+        self.m.addConstrs(2 * self.nodes[v] <= gp.quicksum(self.nodes[w] for w in G.neighbors(v)) for v in G.nodes if v not in exclude)
+
+
 if __name__ == '__main__':
     G = lp_to_nx_graph.read(sys.argv[1])
     
@@ -128,5 +222,8 @@ if __name__ == '__main__':
     else:
         k = 1
         
+    
+    # G = lp_to_nx_graph.read("/home/mario/Dokumente/Uni/Bachelorarbeit/git_repo/bachelor-mario-surlemont/python/lp graphs/asymmetric.lp")
+    # k = 2
     dsProb = RootedConnectecKHopDominatingSet(G, k, 0)
     dsProb.solve_and_draw()