def test_fast_population_count(self, name):
        nwr_dict = hwc.get_circuit_for_qubits_weight_get_pattern(len(name))
        result_bit_length = len(nwr_dict['results'])
        a = QuantumRegister(nwr_dict['n_lines'], 'a')
        cin = QuantumRegister(1, 'cin')
        cout = QuantumRegister(nwr_dict['n_couts'], 'cout')
        cr = ClassicalRegister(len(nwr_dict['results']))
        qc = QuantumCircuit(cin, a, cout, cr, name='test_fpt_{0}'.format(name))

        _ = qregs.initialize_qureg_given_bitstring(name, a, qc)

        to_measure_qubits = hwc.get_circuit_for_qubits_weight(
            qc, a, cin, cout, nwr_dict)

        for i, qb in enumerate(to_measure_qubits):
            qc.measure(qb, cr[i])

        result = CircuitTestCase.execute_qasm(qc, 2048)
        counts = result.get_counts()
        self.logger.info(counts)
        exp_w = name.count("1")
        exp_w_bitstring = binary.get_bitstring_from_int(
            exp_w, result_bit_length)
        self.assertEqual(len(counts), 1)
        self.assertIn(exp_w_bitstring, counts)
    def test_fast_population_count_w_hadamards(self, name, weight_int, n_bits):
        nwr_dict = hwc.get_circuit_for_qubits_weight_get_pattern(n_bits)
        result_bit_length = len(nwr_dict['results'])
        a = QuantumRegister(nwr_dict['n_lines'], 'a')
        cin = QuantumRegister(1, 'cin')
        cout = QuantumRegister(nwr_dict['n_couts'], 'cout')
        qc = QuantumCircuit(cin, a, cout, name='test_fpt_{0}'.format(name))

        eq = QuantumRegister(1, 'eq')
        anc = QuantumRegister(1, 'anc')

        # Have to measure a and eq
        cr = ClassicalRegister(a.size + eq.size, "ans")
        qc.add_register(eq, anc, cr)

        qc.h(a)
        result_qubits = hwc.get_circuit_for_qubits_weight_check(
            qc, a, cin, cout, eq, anc, weight_int, nwr_dict)
        hwc.get_circuit_for_qubits_weight_check_i(qc,
                                                  a,
                                                  cin,
                                                  cout,
                                                  eq,
                                                  anc,
                                                  weight_int,
                                                  nwr_dict,
                                                  result_qubits,
                                                  uncomputeEq=False)

        qc.measure([aq for aq in a] + [eq[0]], cr)

        # QASM
        result = CircuitTestCase.execute_qasm(qc, 2048)
        counts = result.get_counts()
        self.logger.debug(counts)
        total_actives = 0
        for i in counts.keys():
            if i[0] == '1':
                total_actives += 1
                self.logger.debug("Eq active, full state is {0}".format(i))
                self.assertEqual(i[1:].count('1'), weight_int)
        exp_actives = factorial(n_bits) / factorial(weight_int) / factorial(
            n_bits - weight_int)
        self.assertEqual(total_actives, exp_actives)
    def test_fast_population_count_i(self, name):
        nwr_dict = hwc.get_circuit_for_qubits_weight_get_pattern(len(name))
        result_bit_length = len(nwr_dict['results'])
        a = QuantumRegister(nwr_dict['n_lines'], 'a')
        cin = QuantumRegister(1, 'cin')
        cout = QuantumRegister(nwr_dict['n_couts'], 'cout')
        cr = ClassicalRegister(len(a))
        qc = QuantumCircuit(cin, a, cout, cr, name='test_fpt_{0}'.format(name))

        _ = qregs.initialize_qureg_given_bitstring(name, a, qc)
        to_measure_qubits = hwc.get_circuit_for_qubits_weight(
            qc, a, cin, cout, nwr_dict)
        hwc.get_circuit_for_qubits_weight_i(qc, a, cin, cout, nwr_dict)

        qc.measure(a, cr)

        result = CircuitTestCase.execute_qasm(qc, 2048)
        counts = result.get_counts()
        self.logger.debug(counts)
        self.assertEqual(len(counts), 1)
        self.assertIn(name, counts)
    def test_fast_population_count_w_hadamards_and_reset(
            self, name, weight_int, n_bits):
        nwr_dict = hwc.get_circuit_for_qubits_weight_get_pattern(n_bits)
        result_bit_length = len(nwr_dict['results'])
        a = QuantumRegister(nwr_dict['n_lines'], 'a')
        cin = QuantumRegister(1, 'cin')
        cout = QuantumRegister(nwr_dict['n_couts'], 'cout')
        qc = QuantumCircuit(cin, a, cout, name='test_fpt_{0}'.format(name))

        eq = QuantumRegister(1, 'eq')
        anc = QuantumRegister(1, 'anc')

        # Have to measure a and eq
        cr = ClassicalRegister(a.size + eq.size, "ans")
        qc.add_register(eq, anc, cr)

        qc.h(a)
        result_qubits = hwc.get_circuit_for_qubits_weight_check(
            qc, a, cin, cout, eq, anc, weight_int, nwr_dict)
        hwc.get_circuit_for_qubits_weight_check_i(qc,
                                                  a,
                                                  cin,
                                                  cout,
                                                  eq,
                                                  anc,
                                                  weight_int,
                                                  nwr_dict,
                                                  result_qubits,
                                                  uncomputeEq=True)
        qc.h(a)

        qc.measure([aq for aq in a] + [eq[0]], cr)

        # QASM
        result = CircuitTestCase.execute_qasm(qc, 2048)
        counts = result.get_counts()
        self.logger.debug(counts)
        exp_state = '0' * len(cr)
        self.assertEqual(len(counts), 1)
        self.assertIn(exp_state, counts)
    def _initialize_circuit(self):
        """
        Initialize the circuit with n qubits. The n is the same n of the H parity matrix and it is used to represent the choice of the column of the matrix.

        :param n: The number of qubits
        :returns: the quantum circuit and the selectors_q register
        :rtype:

        """
        self.circuit = QuantumCircuit(
            name="bruteforce_{0}_{1}_{2}_{3}_{4}".format(
                self.n, self.r, self.w, self.mct_mode, self.nwr_mode))
        # TODO
        qubits_involved_in_multicontrols = []
        if self.nwr_mode == self.NWR_BENES:
            # To compute benes_flip_q size and the permutation pattern
            self.benes_dict = hwg.generate_qubits_with_given_weight_benes_get_pattern(
                self.n, self.w)

            # We don't use only n qubits, but the nearest power of 2
            self.selectors_q = QuantumRegister(self.benes_dict['n_lines'],
                                               'select')
            self.benes_flip_q = QuantumRegister(self.benes_dict['n_flips'],
                                                "flip")
            self.n_func_domain = len(self.benes_flip_q) + self.w
            self.circuit.add_register(self.selectors_q)
            self.circuit.add_register(self.benes_flip_q)
            self.inversion_about_zero_qubits = self.benes_flip_q
        elif self.nwr_mode == self.NWR_FPC:
            self.fpc_dict = hwc.get_circuit_for_qubits_weight_get_pattern(
                self.n)
            self.selectors_q = QuantumRegister(self.fpc_dict['n_lines'],
                                               'select')
            self.fpc_cout_q = QuantumRegister(self.fpc_dict['n_couts'], 'cout')
            self.fpc_cin_q = QuantumRegister(1, 'cin')
            self.fpc_eq_q = QuantumRegister(1, 'eq')
            self.fpc_two_eq_q = QuantumRegister(1, 'f2eq')
            self.n_func_domain = 2**len(self.selectors_q)
            self.circuit.add_register(self.fpc_cin_q)
            self.circuit.add_register(self.selectors_q)
            self.circuit.add_register(self.fpc_cout_q)
            self.circuit.add_register(self.fpc_eq_q)
            self.circuit.add_register(self.fpc_two_eq_q)
            self.inversion_about_zero_qubits = self.selectors_q
            qubits_involved_in_multicontrols.append(
                len(self.fpc_dict['results']))

        # We should implement a check on n if it's not a power of 2
        if len(self.selectors_q) != self.n:
            raise Exception("A.T.M. we can't have less registers")

        qubits_involved_in_multicontrols.append(
            len(self.inversion_about_zero_qubits[1:]))

        self.sum_q = QuantumRegister(self.r, 'sum')
        self.circuit.add_register(self.sum_q)

        if self.mct_mode == self.MCT_ADVANCED:
            self.mct_anc = QuantumRegister(1, 'mctAnc')
            self.circuit.add_register(self.mct_anc)
        elif self.mct_mode == self.MCT_BASIC:
            _logger.debug("qubits involved in multicontrols are {}".format(
                qubits_involved_in_multicontrols))
            self.mct_anc = QuantumRegister(
                max(qubits_involved_in_multicontrols) - 2, 'mctAnc')
            self.circuit.add_register(self.mct_anc)
        elif self.mct_mode == self.MCT_NOANCILLA:
            # no ancilla to add
            self.mct_anc = None

        self.to_measure = self.selectors_q