Funções de filtragem
qf_ferm_op_filter_diagonal_terms
void qf_ferm_op_filter_diagonal_terms(QfFermionOperator *op)
Filtra os termos de um operador que são diagonais na base de números de ocupação.
Isso remove todos os termos da expressão fornecida QfFermionOperator que sejam um produto de operadores numéricos ( ). Isso inclui o termo constante (um produto de zero operadores numéricos), operadores numéricos isolados, bem como produtos de ordem superior, como .
Uma das principais razões para filtrar esses termos surge durante a evolução temporal dos operadores, na qual esses termos diagonais não afetam a evolução temporal, a não ser pela introdução de uma fase global. Consequentemente, as sequências de bits amostradas a partir de um estado que sofreu evolução temporal permanecem inalteradas. Recomenda-se, portanto, removê-los, por exemplo, ao preparar um hamiltoniano de estrutura eletrônica para a evolução temporal do tipo “ qDRIFT ” () utilizada por SqDRIFT,, pois isso evita uma sobrecarga de amostragem que, de outra forma, seria desnecessária.
O operador fornecido deve ser ordenado normalmente! Essa é uma suposição subjacente à implementação que não está sendo verificada! Veja qf_ferm_op_normal_ordered() como obter um operador dessa forma.
1QfFCIDump *fcidump = qf_fcidump_from_file("molecule.fcidump");
2QfFermionOperator *op = qf_ferm_op_from_fcidump(fcidump);
3
4QfFermionOperator *normal = qf_ferm_op_normal_ordered(op, NULL);
5
6qf_ferm_op_filter_diagonal_terms(normal);O operador é modificado no próprio local. Se ele rastrear índices de grupo (ver qf_ferm_op_get_groups()), os termos remanescentes mantêm seu agrupamento relativo, mas os índices de grupo são reatribuídos a um intervalo contíguo a partir de 0. Portanto, você não deve contar com a preservação do índice de grupo específico de qualquer termo ao longo de uma chamada a esta função.
Parâmetros
- op – Um ponteiro para o operador fermiónico ordenado normalmente cujos termos devem ser filtrados (modificados no próprio local).