def boxBetween(self, o1, o2,  *args, **kargs):
        batches = o1.size()[0]
        num_elem = h.product(o1.size()[1:])
        ei = h.getEi(batches, num_elem)
        
        if len(o1.size()) > 2:
            ei = ei.contiguous().view(num_elem, *o1.size())

        return self.domain((o1 + o2) / 2, None, ei * (o2 - o1).abs() / 2).checkSizes()
Example #2
0
 def line(o1, o2, w=None):
     ln = ((o2 - o1) / 2).unsqueeze(0)
     if not w is None and w > 0.0:
         batches = o1.size()[0]
         num_elem = h.product(o1.size()[1:])
         ei = h.getEi(batches, num_elem)
         if len(o1.size()) > 2:
             ei = ei.contiguous().view(num_elem, *o1.size())
         ln = torch.cat([ln, ei * w])
     return HBox((o1 + o2) / 2, None, ln).checkSizes()
Example #3
0
    def applySuper(self, ret):
        batches = ret.head.size()[0]
        num_elem = h.product(ret.head.size()[1:])
        ei = h.getEi(batches, num_elem)

        if len(ret.head.size()) > 2:
            ei = ei.contiguous().view(num_elem, *ret.head.size())

        ret.errors = torch.cat([ ret.errors, ei * ret.beta ]) if not ret.beta is None else ret.errors
        ret.beta = None
        return ret.checkSizes()
Example #4
0
    def box(original, radius):
        """
        This version of it is slow, but keeps correlation down the line.
        """
        batches = original.size()[0]
        num_elem = h.product(original.size()[1:])
        ei = h.getEi(batches, num_elem)

        if len(original.size()) > 2:
            ei = ei.contiguous().view(num_elem, *original.size())

        return HBox(original, None, ei * radius).checkSizes()
    def line(self, o1, o2, **kargs):
        w = self.w.getVal(c = 0, **kargs)

        ln = ((o2 - o1) / 2).unsqueeze(0)
        if not w is None and w > 0.0:
            batches = o1.size()[0]
            num_elem = h.product(o1.size()[1:])
            ei = h.getEi(batches,num_elem)
            if len(o1.size()) > 2:
                ei = ei.contiguous().view(num_elem, *o1.size())
            ln = torch.cat([ln, ei * w])
        return self.domain((o1 + o2) / 2, None, ln ).checkSizes()
    def box(self, original, w, **kargs):
        """
        This version of it is slow, but keeps correlation down the line.
        """
        radius = self.w.getVal(c = w, **kargs)

        batches = original.size()[0]
        num_elem = h.product(original.size()[1:])
        ei = h.getEi(batches,num_elem)
        
        if len(original.size()) > 2:
            ei = ei.contiguous().view(num_elem, *original.size())

        return self.domain(original, None, ei * radius).checkSizes()
Example #7
0
    def hybrid_to_zono(self, *args, correlate=True, customRelu=None, **kargs):
        beta = self.beta
        errors = self.errors
        if correlate and beta is not None:
            batches = beta.shape[0]
            num_elem = h.product(beta.shape[1:])
            ei = h.getEi(batches, num_elem)

            if len(beta.shape) > 2:
                ei = ei.contiguous().view(num_elem, *beta.shape)
            err = ei * beta
            errors = torch.cat(
                (err, errors), dim=0) if errors is not None else err
            beta = None

        return Zonotope(
            self.head,
            beta,
            errors if errors is not None else (self.beta * 0).unsqueeze(0),
            customRelu=self.customRelu if customRelu is None else None)