code: def gcp(V,E,K):
      
      model = Model("gcp")
      x,y = {},{}
      for k in range(K):
          y[k] = model.addVar(vtype="B", name="y(%s)"%k)
          for i in V:
              x[i,k] = model.addVar(vtype="B", name="x(%s,%s)"%(i,k))
  
      for i in V:
          model.addCons(quicksum(x[i,k] for k in range(K)) == 1, "AssignColor(%s)"%i)
  
      for (i,j) in E:
          for k in range(K):
              model.addCons(x[i,k] + x[j,k] <= y[k], "NotSameColor(%s,%s,%s)"%(i,j,k))
  
      model.setObjective(quicksum(y[k] for k in range(K)), "minimize")
  
      model.data = x
      return model
docs: gcp -- model for minimizing the number of colors in a graph
      Parameters:
          - V: set/list of nodes in the graph
          - E: set/list of edges in the graph
          - K: upper bound on the number of colors
      Returns a model, ready to be solved.