code: def tsp(V,c):
      
      model = Model("TSP_lazy")
      conshdlr = TSPconshdlr()
  
      x = {}
      for i in V:
          for j in V:
              if j > i:
                  x[i,j] = model.addVar(vtype = "B",name = "x(%s,%s)" % (i,j))
  
      for i in V:
          model.addCons(quicksum(x[j, i] for j in V if j < i) +
                        quicksum(x[i, j] for j in V if j > i) == 2, "Degree(%s)" % i)
  
      model.setObjective(quicksum(c[i, j] * x[i, j] for i in V for j in V if j > i), "minimize")
  
      model.data = x
      return model, conshdlr
docs: tsp -- model for solving the traveling salesman problem with callbacks
         - start with assignment model
         - add cuts until there are no sub-cycles
      Parameters:
          - V: set/list of nodes in the graph
          - c[i,j]: cost for traversing edge (i,j)
      Returns the optimum objective value and the list of edges used.