def _get_objectives()

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