in automl21/scs_neural/solver/neural_scs_batched.py [0:0]
def _get_objectives(self, u, v, multi_instance, include_solution=False):
"""Compute objectives. Return (rescaled) solution if necessary"""
m, n, num_instances = multi_instance.get_sizes()
all_tau = u[:, -1].unsqueeze(1)
x, y = u[:, :n]/all_tau, u[:, n:n+m]/all_tau
s = v[:, n:n+m]/all_tau
# for c, b, unlike math in SCS paper, do not take transpose
# since the shape is already correct
c = multi_instance.c
b = multi_instance.b
prim_obj = torch.bmm(c.unsqueeze(1), x.unsqueeze(2)).squeeze()
dual_obj = -torch.bmm(b.unsqueeze(1), y.unsqueeze(2)).squeeze()
# check if instance is scaled
scaling_performed = multi_instance.scaled
if scaling_performed:
x = (x / multi_instance.E) / multi_instance.sigma
y = (y / multi_instance.D) / multi_instance.rho
s = (multi_instance.D * s) / multi_instance.sigma
c = multi_instance.orig_c
b = multi_instance.orig_b
prim_obj = torch.bmm(c.unsqueeze(1), x.unsqueeze(2)).squeeze()
dual_obj = -torch.bmm(b.unsqueeze(1), y.unsqueeze(2)).squeeze()
if prim_obj.dim() == 0:
prim_obj = prim_obj.unsqueeze(0)
if dual_obj.dim() == 0:
dual_obj = dual_obj.unsqueeze(0)
if include_solution:
return x, y, s, prim_obj, dual_obj
return prim_obj, dual_obj