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()
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()
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()
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()
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)