def make_excitation_generator(self, indices: typing.Iterable[typing.Tuple[(int, int)]], form: str=None, remove_constant_term: bool=True) -> QubitHamiltonian:
    "\n        Notes\n        ----------\n        Creates the transformed hermitian generator of UCC type unitaries:\n              M(a^\\dagger_{a_0} a_{i_0} a^\\dagger{a_1}a_{i_1} ... - h.c.)\n              where the qubit map M depends is self.transformation\n\n        Parameters\n        ----------\n        indices : typing.Iterable[typing.Tuple[int, int]] :\n            List of tuples [(a_0, i_0), (a_1, i_1), ... ] - recommended format, in spin-orbital notation (alpha odd numbers, beta even numbers)\n            can also be given as one big list: [a_0, i_0, a_1, i_1 ...]\n        form : str : (Default value None):\n            Manipulate the generator to involution or projector\n            set form='involution' or 'projector'\n            the default is no manipulation which gives the standard fermionic excitation operator back\n        remove_constant_term: bool: (Default value True):\n            by default the constant term in the qubit operator is removed since it has no effect on the unitary it generates\n            if the unitary is controlled this might not be true!\n        Returns\n        -------\n        type\n            1j*Transformed qubit excitation operator, depends on self.transformation\n        "
    if (type(self.transformation).__name__ == 'BravyiKitaevFast'):
        raise TequilaException('The Bravyi-Kitaev-Superfast transformation does not support general FermionOperators yet')
    if (len(indices) == 0):
        raise TequilaException('make_excitation_operator: no indices given')
    elif (not isinstance(indices[0], typing.Iterable)):
        if ((len(indices) % 2) != 0):
            raise TequilaException('make_excitation_generator: unexpected input format of indices\nuse list of tuples as [(a_0, i_0),(a_1, i_1) ...]\nor list as [a_0, i_0, a_1, i_1, ... ]\nyou gave: {}'.format(indices))
        converted = [(indices[(2 * i)], indices[((2 * i) + 1)]) for i in range((len(indices) // 2))]
    else:
        converted = indices
    converted = [(int(pair[0]), int(pair[1])) for pair in converted]
    ofi = []
    dag = []
    for pair in converted:
        assert (len(pair) == 2)
        ofi += [(int(pair[0]), 1), (int(pair[1]), 0)]
        dag += [(int(pair[0]), 0), (int(pair[1]), 1)]
    op = openfermion.FermionOperator(tuple(ofi), 1j)
    op += openfermion.FermionOperator(tuple(reversed(dag)), (- 1j))
    if (isinstance(form, str) and (form.lower() != 'fermionic')):
        Na = [x for pair in converted for x in [(pair[0], 1), (pair[0], 0)]]
        Ma = [x for pair in converted for x in [(pair[0], 0), (pair[0], 1)]]
        Ni = [x for pair in converted for x in [(pair[1], 1), (pair[1], 0)]]
        Mi = [x for pair in converted for x in [(pair[1], 0), (pair[1], 1)]]
        if (form.lower() == 'p+'):
            op *= 0.5
            op += openfermion.FermionOperator((Na + Mi), 0.5)
            op += openfermion.FermionOperator((Ni + Ma), 0.5)
        elif (form.lower() == 'p-'):
            op *= 0.5
            op += openfermion.FermionOperator((Na + Mi), (- 0.5))
            op += openfermion.FermionOperator((Ni + Ma), (- 0.5))
        elif (form.lower() == 'g+'):
            op += openfermion.FermionOperator([], 1.0)
            op += openfermion.FermionOperator((Na + Mi), (- 1.0))
            op += openfermion.FermionOperator((Ni + Ma), (- 1.0))
        elif (form.lower() == 'g-'):
            op += openfermion.FermionOperator([], (- 1.0))
            op += openfermion.FermionOperator((Na + Mi), 1.0)
            op += openfermion.FermionOperator((Ni + Ma), 1.0)
        elif (form.lower() == 'p0'):
            op = openfermion.FermionOperator([], 1.0)
            op += openfermion.FermionOperator((Na + Mi), (- 1.0))
            op += openfermion.FermionOperator((Ni + Ma), (- 1.0))
        else:
            raise TequilaException('Unknown generator form {}, supported are G, P+, P-, G+, G- and P0'.format(form))
    qop = self.transformation(op)
    if remove_constant_term:
        qop.qubit_operator.terms[tuple()] = 0.0
    assert qop.is_hermitian()
    for (k, v) in qop.qubit_operator.terms.items():
        qop.qubit_operator.terms[k] = to_float(v)
    qop = qop.simplify()
    if (len(qop) == 0):
        warnings.warn(('Excitation generator is a unit operator.\nNon-standard transformations might not work with general fermionic operators\nindices = ' + str(indices)), category=TequilaWarning)
    return qop
Notes
----------
Creates the transformed hermitian generator of UCC type unitaries:
      M(a^\dagger_{a_0} a_{i_0} a^\dagger{a_1}a_{i_1} ... - h.c.)
      where the qubit map M depends is self.transformation

Parameters
----------
indices : typing.Iterable[typing.Tuple[int, int]] :
    List of tuples [(a_0, i_0), (a_1, i_1), ... ] - recommended format, in spin-orbital notation (alpha odd numbers, beta even numbers)
    can also be given as one big list: [a_0, i_0, a_1, i_1 ...]
form : str : (Default value None):
    Manipulate the generator to involution or projector
    set form='involution' or 'projector'
    the default is no manipulation which gives the standard fermionic excitation operator back
remove_constant_term: bool: (Default value True):
    by default the constant term in the qubit operator is removed since it has no effect on the unitary it generates
    if the unitary is controlled this might not be true!
Returns
-------
type
    1j*Transformed qubit excitation operator, depends on self.transformation
def make_excitation_generator(self, indices: typing.Iterable[typing.Tuple[(int, int)]], form: str=None, remove_constant_term: bool=True) -> QubitHamiltonian:
    "\n        Notes\n        ----------\n        Creates the transformed hermitian generator of UCC type unitaries:\n              M(a^\\dagger_{a_0} a_{i_0} a^\\dagger{a_1}a_{i_1} ... - h.c.)\n              where the qubit map M depends is self.transformation\n\n        Parameters\n        ----------\n        indices : typing.Iterable[typing.Tuple[int, int]] :\n            List of tuples [(a_0, i_0), (a_1, i_1), ... ] - recommended format, in spin-orbital notation (alpha odd numbers, beta even numbers)\n            can also be given as one big list: [a_0, i_0, a_1, i_1 ...]\n        form : str : (Default value None):\n            Manipulate the generator to involution or projector\n            set form='involution' or 'projector'\n            the default is no manipulation which gives the standard fermionic excitation operator back\n        remove_constant_term: bool: (Default value True):\n            by default the constant term in the qubit operator is removed since it has no effect on the unitary it generates\n            if the unitary is controlled this might not be true!\n        Returns\n        -------\n        type\n            1j*Transformed qubit excitation operator, depends on self.transformation\n        "
    if (type(self.transformation).__name__ == 'BravyiKitaevFast'):
        raise TequilaException('The Bravyi-Kitaev-Superfast transformation does not support general FermionOperators yet')
    if (len(indices) == 0):
        raise TequilaException('make_excitation_operator: no indices given')
    elif (not isinstance(indices[0], typing.Iterable)):
        if ((len(indices) % 2) != 0):
            raise TequilaException('make_excitation_generator: unexpected input format of indices\nuse list of tuples as [(a_0, i_0),(a_1, i_1) ...]\nor list as [a_0, i_0, a_1, i_1, ... ]\nyou gave: {}'.format(indices))
        converted = [(indices[(2 * i)], indices[((2 * i) + 1)]) for i in range((len(indices) // 2))]
    else:
        converted = indices
    converted = [(int(pair[0]), int(pair[1])) for pair in converted]
    ofi = []
    dag = []
    for pair in converted:
        assert (len(pair) == 2)
        ofi += [(int(pair[0]), 1), (int(pair[1]), 0)]
        dag += [(int(pair[0]), 0), (int(pair[1]), 1)]
    op = openfermion.FermionOperator(tuple(ofi), 1j)
    op += openfermion.FermionOperator(tuple(reversed(dag)), (- 1j))
    if (isinstance(form, str) and (form.lower() != 'fermionic')):
        Na = [x for pair in converted for x in [(pair[0], 1), (pair[0], 0)]]
        Ma = [x for pair in converted for x in [(pair[0], 0), (pair[0], 1)]]
        Ni = [x for pair in converted for x in [(pair[1], 1), (pair[1], 0)]]
        Mi = [x for pair in converted for x in [(pair[1], 0), (pair[1], 1)]]
        if (form.lower() == 'p+'):
            op *= 0.5
            op += openfermion.FermionOperator((Na + Mi), 0.5)
            op += openfermion.FermionOperator((Ni + Ma), 0.5)
        elif (form.lower() == 'p-'):
            op *= 0.5
            op += openfermion.FermionOperator((Na + Mi), (- 0.5))
            op += openfermion.FermionOperator((Ni + Ma), (- 0.5))
        elif (form.lower() == 'g+'):
            op += openfermion.FermionOperator([], 1.0)
            op += openfermion.FermionOperator((Na + Mi), (- 1.0))
            op += openfermion.FermionOperator((Ni + Ma), (- 1.0))
        elif (form.lower() == 'g-'):
            op += openfermion.FermionOperator([], (- 1.0))
            op += openfermion.FermionOperator((Na + Mi), 1.0)
            op += openfermion.FermionOperator((Ni + Ma), 1.0)
        elif (form.lower() == 'p0'):
            op = openfermion.FermionOperator([], 1.0)
            op += openfermion.FermionOperator((Na + Mi), (- 1.0))
            op += openfermion.FermionOperator((Ni + Ma), (- 1.0))
        else:
            raise TequilaException('Unknown generator form {}, supported are G, P+, P-, G+, G- and P0'.format(form))
    qop = self.transformation(op)
    if remove_constant_term:
        qop.qubit_operator.terms[tuple()] = 0.0
    assert qop.is_hermitian()
    for (k, v) in qop.qubit_operator.terms.items():
        qop.qubit_operator.terms[k] = to_float(v)
    qop = qop.simplify()
    if (len(qop) == 0):
        warnings.warn(('Excitation generator is a unit operator.\nNon-standard transformations might not work with general fermionic operators\nindices = ' + str(indices)), category=TequilaWarning)
    return qop