'Returns the graph implementation of the object.
Marks the top level constraint as the dual_holder,
so the dual value will be saved to the EqConstraint.
Returns:
A tuple of (affine expression, [constraints]).'

def canonicalize(self):

    (obj, constraints) = self._expr.canonical_form
    half = lu.create_const(0.5, (1, 1))
    symm = lu.mul_expr(half, lu.sum_expr([obj, lu.transpose(obj)]), obj.size)
    dual_holder = SDP(symm, enforce_sym=False, constr_id=self.id)
    return (None, (constraints + [dual_holder]))
