def testInitInvalidInput(self):
        ''' Handles unregistered or missing ATTACK.INIT parameter.'''
        config = copy.deepcopy(self._config)
        config.ATTACK.INIT.TYPE = 'ERROR'
        with self.assertRaises(KeyError):
            attack.IFGSM(config.ADV_MODEL, config.ATTACK)

        del config.ATTACK.INIT.TYPE

        with self.assertRaises(AttributeError):
            attack.IFGSM(config.ADV_MODEL, config.ATTACK)
        del config
 def testEpsilon(self):
     config = copy.deepcopy(self._config)
     eps_type = {
         'RANDOM': attack.RandomEpsilon,
         'FIXED': attack.FixedEpsilon
     }
     for (eps, cls) in eps_type.items():
         with self.subTest(eps=eps):
             config.ATTACK.EPSILON.TYPE = eps
             c = attack.IFGSM(config.ADV_MODEL, config.ATTACK)
             self.assertIsInstance(c.epsManager, cls)
     del config
 def testInitValidInput(self):
     ''' Ensures correct Init subclass is called based on parameter configuration'''
     config = copy.deepcopy(self._config)
     init_type = {
         'RAW': attack.ZeroShift,
         'SHIFT': attack.RandomShift,
     }
     for (init, cls) in init_type.items():
         with self.subTest(type=init):
             config.ATTACK.INIT.TYPE = init
             c = attack.IFGSM(config.ADV_MODEL, config.ATTACK)
             self.assertIsInstance(c.initManager, cls)
     del config
    def testAlpha(self):
        ''' Ensures correct Alpha subclass is called based on parameter configuration.'''
        config = copy.deepcopy(self._config)
        alpha_type = {
            'DIVISOR': attack.DivisorAlpha,
        }

        for (alpha, cls) in alpha_type.items():
            with self.subTest(alpha=alpha):
                config.ATTACK.ALPHA.TYPE = alpha
                c = attack.IFGSM(config.ADV_MODEL, config.ATTACK)
                self.assertIsInstance(c.alphaManager, cls)
        del config
    def testRun(self):
        ''' Test adversarial example generation. Constraint to a batch_size of 1.'''
        # 1. Hardcoded adversarial example (torch tensor format)
        x = torch.load('raw_image_ts.pt').unsqueeze(0)
        y = torch.cuda.LongTensor([3])

        iter2adv = {
            1: torch.load('adv_image_ts.pt').unsqueeze(0),
            4: torch.load('adv4_image_ts.pt').unsqueeze(0),
            10: torch.load('adv10_image_ts.pt').unsqueeze(0)
        }

        for (n_iter, adv) in iter2adv.items():
            with self.subTest(n_iter=n_iter):
                config = copy.deepcopy(self._config)
                config.ATTACK.MAX_ITER = n_iter
                config.ATTACK.ALPHA.DIVISOR = n_iter
                c = attack.IFGSM(config.ADV_MODEL, config.ATTACK)
                # Tensor Equality
                self.assertTrue(torch.all(adv.eq(c.run(x, y))))