def test_bernoulli(self): for size in [(10,), (10, 10), (10, 10, 10)]: probs = torch.rand(size) randvec = crypten.bernoulli(probs) self.assertTrue(randvec.size() == size, "Incorrect size") tensor = randvec.get_plain_text() self.assertTrue(((tensor == 0) + (tensor == 1)).all(), "Invalid values") probs = torch.Tensor(int(1e4)).fill_(0.2) randvec = crypten.bernoulli(probs).get_plain_text() frac_zero = float((randvec == 0).sum()) / randvec.nelement() self.assertTrue(math.isclose(frac_zero, 0.8, rel_tol=1e-1, abs_tol=1e-1))
def _process_targets(self, targets): """Encrypts targets and RR to targets if necessary""" if self.rr_prob is not None: flip_probs = torch.tensor(self.rr_prob).expand(targets.size()) # Apply appropriate RR-protocol and encrypt targets if necessary if self.rr_prob is not None: flip_probs = torch.tensor(self.rr_prob).expand(targets.size()) if crypten.is_encrypted_tensor(targets): if self.rr_prob is not None: flip_mask = crypten.bernoulli(flip_probs) targets = targets + flip_probs - 2 * flip_mask * targets targets_enc = targets else: # Label provider adds RR label flips if they are plaintext if self.rr_prob is not None and self.is_label_src(): flip_mask = flip_probs.bernoulli() targets += flip_mask - 2 * targets * flip_mask # Encrypt targets: targets_enc = crypten.cryptensor(targets, src=self.label_src) return targets_enc
def score_func(scores, A_inv, b, context): explore = crypten.bernoulli(torch.tensor([epsilon])) rand_scores = crypten.rand(*scores.size()) scores.mul_(1 - explore).add_(rand_scores.mul(explore))