def __init__(self, model, **kwargs):
"""Initialize a slack form of an :class:`NLPModel`.
:parameters:
:model: Original model to be transformed into a slack form.
"""
self.model = model
# Save number of variables and constraints prior to transformation
self.original_n = model.n
self.original_m = model.m
# Number of slacks for the constaints
n_slacks = model.nlowerC + model.nupperC + model.nrangeC
self.n_slacks = n_slacks
# Update effective number of variables and constraints
n = self.original_n + n_slacks
m = self.original_m
Lvar = -np.infty * np.ones(n)
Uvar = +np.infty * np.ones(n)
# Copy orignal bounds
Lvar[:self.original_n] = model.Lvar
Uvar[:self.original_n] = model.Uvar
# Add bounds corresponding to lower constraints
bot = self.original_n
self.sL = range(bot, bot + model.nlowerC)
Lvar[bot:bot + model.nlowerC] = model.Lcon[model.lowerC]
# Add bounds corresponding to upper constraints
bot += model.nlowerC
self.sU = range(bot, bot + model.nupperC)
Uvar[bot:bot + model.nupperC] = model.Ucon[model.upperC]
# Add bounds corresponding to range constraints
bot += model.nupperC
self.sR = range(bot, bot + model.nrangeC)
Lvar[bot:bot + model.nrangeC] = model.Lcon[model.rangeC]
Uvar[bot:bot + model.nrangeC] = model.Ucon[model.rangeC]
# No more inequalities. All constraints are now equal to 0
Lcon = Ucon = np.zeros(m)
super(SlackModel, self).__init__(n=n, m=m, name='Slack-' + model.name,
Lvar=Lvar, Uvar=Uvar,
Lcon=Lcon, Ucon=Ucon)
# Redefine primal and dual initial guesses
self.original_x0 = model.x0[:]
self.x0 = np.zeros(self.n)
self.x0[:self.original_n] = self.original_x0[:]
self.original_pi0 = model.pi0[:]
self.pi0 = np.zeros(self.m)
self.pi0[:self.original_m] = self.original_pi0[:]
return
评论列表
文章目录