code: def sils_cut(T,f,c,d,h, conshdlr):
      
      Ts = range(1,T+1)
  
      model = sils(T,f,c,d,h)
      y,x,I = model.data
  
      # relax integer variables
      for t in Ts:
          model.chgVarType(y[t], "C")
      model.addVar(vtype="B", name="fake")        # for making the problem MIP
  
      # compute D[i,j] = sum_{t=i}^j d[t]
      D = {}
      for t in Ts:
          s = 0
          for j in range(t,T+1):
              s += d[j]
              D[t,j] = s
  
      #include the lot sizing constraint handler
      model.includeConshdlr(conshdlr, "SILS", "Constraint handler for single item lot sizing",
                            sepapriority = 0, enfopriority = -1, chckpriority = -1, sepafreq = -1, propfreq = -1,
                            eagerfreq = -1, maxprerounds = 0, delaysepa = False, delayprop = False, needscons = False,
                            presoltiming = SCIP_PRESOLTIMING.FAST, proptiming = SCIP_PROPTIMING.BEFORELP)
      conshdlr.data = D,Ts
  
      model.data = y,x,I
      return model
docs: solve_sils -- solve the lot sizing problem with cutting planes
         - start with a relaxed model
         - used lazy constraints to elimitate fractional setup variables with cutting planes
      Parameters:
          - T: number of periods
          - P: set of products
          - f[t]: set-up costs (on period t)
          - c[t]: variable costs
          - d[t]: demand values
          - h[t]: holding costs
      Returns the final model solved, with all necessary cuts added.