def test_copy(self): size = 3 mp = DropoutMask((size, )) new_mp = mp.copy() mp[0] = True assert pnp.sum(mp.mask) > pnp.sum(new_mp.mask) assert pnp.sum(new_mp.mask) == 0
def test_shrink_nd(self): size = 3 mp = DropoutMask((size, size - 1)) for amount in range(mp.mask.size + 1): mp[:] = True mp.shrink(amount) assert pnp.sum(mp.mask) == mp.mask.size - amount
def test_perturbation_mode(self, mode): size = 3 mp = DropoutMask((size, )) for amount in [0, size, size + 1]: mp.perturb(amount=amount, mode=mode[0]) mp.perturb(amount=amount, mode=mode[1]) assert pnp.sum(mp.mask) == 0
def test_init(self): size = 3 with pytest.raises(AssertionError): DropoutMask((size, ), mask=pnp.array([True, True, False, False])) with pytest.raises(AssertionError): DropoutMask((size, ), mask=pnp.array([0, 1, 3])) preset = [False, True, False] mp = DropoutMask((size, ), mask=pnp.array(preset)) assert pnp.array_equal(mp.mask, preset)
def test_perturbation_remove_add(self): size = 3 mp = DropoutMask((size, )) for amount in [random.randrange(size), 0, size, size + 1]: mp.perturb(amount=amount, mode=PerturbationMode.RESET) assert pnp.sum(mp.mask) == 0 mp.perturb(amount=amount, mode=PerturbationMode.SET) assert pnp.sum(mp.mask) == min(amount, size) mp.clear()
def _create_circuit_with_entangling_gates(self, size): parameters = pnp.random.uniform(low=-pnp.pi, high=pnp.pi, size=(size, size)) return MaskedCircuit.full_circuit( parameters=parameters, layers=size, wires=size, entangling_mask=DropoutMask(shape=(size, size - 1)), )
def test_wrong_percentage_perturbation(self): size = 3 mp = DropoutMask((size, )) for i in [1.1, 1.5, 3.1]: mp.perturb(amount=i) assert pnp.sum(mp.mask) == round(i) mp.clear()
def test_percentage_perturbation(self): size = 3 mp = DropoutMask((size, )) for i in [0.01, 0.1, 0.5, 0.9]: mp.perturb(amount=i) assert pnp.sum(mp.mask) == round(i * mp.mask.size) mp.clear()
def test_perturbation(self): size = 3 mp = DropoutMask((size, )) for i in range(1, size + 1): mp.perturb(i) mp.perturb(i, mode=PerturbationMode.RESET) assert pnp.sum(mp.mask) == 0
def test_perturbation_invert_remove(self): size = 3 mp = DropoutMask((size, )) for amount in [random.randrange(size), 0, size, size + 1]: mp.perturb(amount=amount, mode=PerturbationMode.INVERT) reversed_amount = pnp.sum(mp.mask).unwrap() # unwrap tensor mp.perturb(amount=reversed_amount, mode=PerturbationMode.RESET) assert pnp.sum(mp.mask) == 0
def test_apply_mask(self): size = 3 mp = DropoutMask((size, )) with pytest.raises(IndexError): mp.apply_mask(pnp.ones((size - 1, size))) mp.mask[1] = True result = mp.apply_mask(pnp.ones((size, ), dtype=bool)) assert pnp.sum(mp.mask) == 1 assert pnp.sum(result) == size - 1
def init_parameters( layers: int, current_layers: int, wires: int, default_value: Optional[float], dynamic_parameters: bool = True, mask_type: Type[Mask] = DropoutMask, ) -> MaskedCircuit: params_uniform = np.random.uniform(low=-np.pi, high=np.pi, size=(current_layers, wires)) params_zero = np.zeros((layers - current_layers, wires)) params_combined = np.concatenate((params_uniform, params_zero)) mc = MaskedCircuit.full_circuit( parameters=params_combined, layers=layers, wires=wires, default_value=default_value, entangling_mask=DropoutMask(shape=(layers, wires - 1)), dynamic_parameters=dynamic_parameters, mask_type=mask_type, ) mc.mask(Axis.LAYERS, mask_type=mask_type)[current_layers:] = True return mc
def test_setting(self): size = 3 mp = DropoutMask((size, )) assert mp assert len(mp.mask) == mp.mask.size assert pnp.sum(mp.mask) == 0 mp[1] = True assert mp[1] == True # noqa: E712 with pytest.raises(IndexError): mp[size] = True assert pnp.sum(mp.mask) == 1 mp.clear() assert pnp.sum(mp.mask) == 0 mp[:] = True result = mp[:] assert len(result) == size assert pnp.all(result) assert pnp.sum(mp.mask) == size mp.clear() with pytest.raises(IndexError): mp[1, 2] = True
def test_negative_perturbation(self): mp = DropoutMask((3, )) with pytest.raises(AssertionError): mp.perturb(amount=-1)
def test_wrong_mode(self): mp = DropoutMask((3, )) with pytest.raises(NotImplementedError): mp.perturb(mode=10, amount=1)
def test_init(self): mp = self._create_circuit(3) assert mp assert len(mp.mask(Axis.WIRES)) == 3 assert len(mp.mask(Axis.LAYERS)) == 3 assert mp.mask(Axis.PARAMETERS).shape == (3, 3) size = 3 with pytest.raises(AssertionError): MaskedCircuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size - 1, wires=size, ) with pytest.raises(AssertionError): MaskedCircuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size + 1, wires=size, ) with pytest.raises(AssertionError): MaskedCircuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size, wires=size - 1, ) with pytest.raises(AssertionError): MaskedCircuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size, wires=size + 1, ) with pytest.raises(AssertionError): MaskedCircuit.full_circuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size, wires=size, entangling_mask=DropoutMask(shape=(size + 1, size)), ) with pytest.raises(NotImplementedError): MaskedCircuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size, wires=size, masks=[(Axis.ENTANGLING, DropoutMask)], ) mc = MaskedCircuit.full_circuit( parameters=pnp.random.uniform(low=0, high=1, size=(size, size)), layers=size, wires=size, wire_mask=DropoutMask(shape=(size, ), mask=pnp.ones((size, ), dtype=bool)), ) assert pnp.array_equal(mc.mask(Axis.WIRES), pnp.ones((size, ), dtype=bool))