code: def scheduling_time_index(J,p,r,w):
      
      model = Model("scheduling: time index")
      T = max(r.values()) + sum(p.values())
      X = {}   # X[j,t]=1 if job j starts processing at time t, 0 otherwise
      for j in J:
          for t in range(r[j], T-p[j]+2):
              X[j,t] = model.addVar(vtype="B", name="x(%s,%s)"%(j,t))
  
      for j in J:
          model.addCons(quicksum(X[j,t] for t in range(1,T+1) if (j,t) in X) == 1, "JobExecution(%s)"%(j))
  
      for t in range(1,T+1):
          ind = [(j,t2) for j in J for t2 in range(t-p[j]+1,t+1) if (j,t2) in X]
          if ind != []:
              model.addCons(quicksum(X[j,t2] for (j,t2) in ind) <= 1, "MachineUB(%s)"%t)
  
      model.setObjective(quicksum((w[j] * (t - 1 + p[j])) * X[j,t] for (j,t) in X), "minimize")
  
      model.data = X
      return model
docs: scheduling_time_index: model for the one machine total weighted tardiness problem
  
      Model for the one machine total weighted tardiness problem
      using the time index formulation
  
      Parameters:
          - J: set of jobs
          - p[j]: processing time of job j
          - r[j]: earliest start time of job j
          - w[j]: weighted of job j; the objective is the sum of the weighted completion time
  
      Returns a model, ready to be solved.