Ejemplo n.º 1
0
    def matmul(self, weights: Tensor) -> 'Ele':
        """ A much faster trick:
                L' = max(0, w) * L + min(0, w) * U
                U' = max(0, w) * U + min(0, w) * L
        """
        pos_ws, neg_ws = divide_pos_neg(weights)

        newl_pos = self._lb.matmul(pos_ws)
        newl_neg = self._ub.matmul(neg_ws)
        newl = newl_pos + newl_neg

        newu_pos = self._ub.matmul(pos_ws)
        newu_neg = self._lb.matmul(neg_ws)
        newu = newu_pos + newu_neg
        return Ele(newl, newu)
Ejemplo n.º 2
0
    def __mul__(self, flt) -> 'Ele':
        if isinstance(flt, Tensor) and flt.dim() == 1 and flt.shape[0] == self.size()[-1]:
            # each output vector dimension has its own factor
            pos_ws, neg_ws = divide_pos_neg(flt)

            newl_pos = self._lb * (pos_ws)
            newl_neg = self._ub * (neg_ws)
            newl = newl_pos + newl_neg

            newu_pos = self._ub * (pos_ws)
            newu_neg = self._lb * (neg_ws)
            newu = newu_pos + newu_neg
            return Ele(newl, newu)
        elif not (isinstance(flt, float) or isinstance(flt, int)):
            raise ValueError('Unsupported multiplication with', str(flt), type(flt))

        flt = float(flt)
        if flt >= 0:
            return Ele(self._lb * flt, self._ub * flt)
        else:
            return Ele(self._ub * flt, self._lb * flt)