Notas de versão do Qiskit 0.7
0.7
No Qiskit 0.7, apresentamos o Qiskit Aer e o combinamos com o Qiskit Terra.
Terra 0.7
Novos Recurso
Esta versão inclui vários recursos novos e muitas correções de bugs. Com essa versão, as interfaces para diagrama de circuito, histograma, vetores bloch e visualizações de estado são declaradas estáveis. Além disso, essa versão inclui uma ordem/endentação de bits definida e padronizada em todos os aspectos do Qiskit. Todas elas são declaradas como interfaces estáveis nesta versão, que não sofrerão alterações significativas no futuro, a menos que haja períodos de depreciação apropriados e longos avisando sobre quaisquer alterações futuras.
Há também a introdução dos seguintes novos recursos:
- Um novo modo de saída de desenho de circuito de arte ASCII
- Uma nova interface de desenho de circuitos fora dos objetos
QuantumCircuitque permite que as chamadas decircuit.draw()ouprint(circuit)renderizem um desenho de circuitos - Um visualizador para desenhar a representação DAG de um circuito
- Um novo tipo de gráfico de estado quântico para diagramas de hinton nos gráficos de estado locais baseados em matplotlib
- 2 novos métodos de construção da classe
QuantumCircuitfrom_qasm_str()efrom_qasm_file()que permitem que você crie facilmente um objeto de circuito a partir de OpenQASM - Uma nova função
plot_bloch_multivector()para plotar vetores Bloch a partir de um vetor de estado ou matriz de densidade com tensão - Os resultados de medição por disparo estão disponíveis em simuladores e dispositivos selecionados. Eles podem ser acessados definindo o kwarg
memorycomoTrueao chamarcompile()ouexecute()e, em seguida, acessados usando o métodoget_memory()no objetoResult. - Um módulo
qiskit.quantum_infocom objetos Pauli renovados e métodos para trabalhar com estados quânticos - Novas passagens de transpile para análise e transformação de circuitos:
CommutationAnalysis,CommutationTransformation,CXCancellation,Decompose,Unroll,Optimize1QGates,CheckMap,CXDirection,BarrierBeforeFinalMeasurements - Novo mapeador de troca alternativo passa no transpilador:
BasicSwap,LookaheadSwap,StochasticSwap - Infraestrutura de transpilador mais avançada com suporte para passagens de análise, passagens de transformação, um
property_setglobal para o gerenciador de passagens e controle de repetição até as passagens
Considerações de Compatibilidade
Como parte da versão 0.7, os seguintes itens foram descontinuados e serão removidos ou alterados de forma incompatível com as versões anteriores em uma versão futura. Embora não sejam estritamente necessários, esses são aspectos que devem ser ajustados antes da próxima versão para evitar uma mudança radical.
plot_circuit(),latex_circuit_drawer(),generate_latex_source(), ematplotlib_circuit_drawer()de qiskit.tools.visualization estão obsoletos. Em vez disso, a funçãocircuit_drawer()do mesmo módulo deve ser usada; há opções de kwarg para espelhar a funcionalidade de todas as funções obsoletas.- A saída padrão atual de
circuit_drawer()(usando latex e recorrendo ao python) está obsoleta e será alterada para usar apenas a saídatextpor padrão em versões futuras. - As funções
qiskit.wrapper.load_qasm_string()eqiskit.wrapper.load_qasm_file()estão obsoletas e os métodos de construçãoQuantumCircuit.from_qasm_str()eQuantumCircuit.from_qasm_file()devem ser usados em seu lugar. - As chaves
plot_barriersereverse_bitsno dicionáriostylekwarg estão obsoletas; em vez disso, os kwargsqiskit.tools.visualization.circuit_drawer()plot_barriersereverse_bitsdevem ser usados. - As funções
plot_state()eiplot_state()foram depreciadas. Em vez disso, as funçõesplot_state_*()eiplot_state_*()devem ser chamadas para o método de visualização necessário. - O argumento
skip_transpilerfoi descontinuado emcompile()eexecute(). Em vez disso, você pode usar oPassManagerdiretamente, basta definir opass_managerpara um objetoPassManagerem branco comPassManager() - A função
transpile_dag()formatkwarg para emitir diferentes formatos de saída está obsoleta; em vez disso, você deve converter o objeto de saída padrãoDAGCircuitpara o formato desejado. - Os desenroladores foram descontinuados e, daqui para frente, somente o desenrolamento de DAG para DAG será suportado.
Observe que algumas alterações incompatíveis com versões anteriores foram feitas durante esta versão. As notas a seguir contêm informações sobre como se adaptar a essas mudanças.
Alterações nos objetos Result
Como parte da reescrita do objeto Results para ser mais consistente e uma interface estável no futuro, foram feitas algumas alterações na forma como você acessa os dados armazenados no objeto result. Primeiro, o método get_data() foi renomeado para apenas data(). Acompanhando essa mudança, há uma mudança no formato de dados retornado pela função. Agora, ele está retornando os dados brutos dos back-ends em vez de fazer qualquer pós-processamento. Por exemplo, em versões anteriores, você podia chamar:
result = execute(circuit, backend).result()
unitary = result.get_data()['unitary']
print(unitary)e isso retornaria a matriz unitária como:
[[1+0j, 0+0.5j], [0-0.5j][-1+0j]]Mas agora, se você chamar (com o método renomeado):
result.data()['unitary']ele retornará algo como:
[[[1, 0], [0, -0.5]], [[0, -0.5], [-1, 0]]]Para obter os resultados pós-processados no mesmo formato de antes da versão 0.7, você deve usar os métodos get_counts(), get_statevector() e get_unitary() no objeto de resultado em vez de get_data()['counts'], get_data()['statevector'] e get_data()['unitary'] , respectivamente.
Além disso, o suporte para len() e indexação em um objeto Result foi removido. Em vez disso, você deve lidar com a saída dos métodos pós-processados nos objetos Result.
Além disso, os métodos get_snapshot() e get_snapshots() da classe Result foram removidos. Em vez disso, você pode acessar os snapshots usando Result.data()['snapshots'].
Alterações na visualização
A maior alteração feita na visualização na versão 0.7 é a remoção do Matplotlib e de outras dependências de visualização dos requisitos do projeto. Isso foi feito para simplificar os requisitos e a configuração necessários para a instalação do Qiskit. Se você planeja usar quaisquer visualizações (inclusive todas as mágicas do jupyter), exceto as saídas text, latex e latex_source para a gaveta de circuitos, será necessário garantir manualmente que as dependências de visualização estejam instaladas. Você pode aproveitar os requisitos opcionais do pacote Qiskit Terra para fazer isso:
pip install qiskit-terra[visualization]Além disso, foram feitas alterações em várias interfaces como parte da estabilização, o que pode ter um impacto no código existente. A primeira é que o kwarg basis na função circuit_drawer() não é mais aceito. Se você estava contando com o circuit_drawer() para ajustar as portas de base usadas no desenho de um diagrama de circuito, terá de fazer isso antes de chamar o circuit_drawer(). Por exemplo:
from qiskit.tools import visualization
visualization.circuit_drawer(circuit, basis_gates='x,U,CX')terá que ser ajustado para ser:
from qiskit import BasicAer
from qiskit import transpiler
from qiskit.tools import visualization
backend = BasicAer.backend('qasm_simulator')
draw_circ = transpiler.transpile(circuit, backend, basis_gates='x,U,CX')
visualization.circuit_drawer(draw_circ)No futuro, a função circuit_drawer() será a única interface para desenho de circuitos no módulo de visualização. Antes da versão 0.7, havia várias outras funções que usavam backends de saída diferentes ou alteravam a saída para desenhar circuitos. No entanto, todas essas outras funções foram descontinuadas e essa funcionalidade foi integrada como opções em circuit_drawer().
Para as outras funções de visualização, plot_histogram() e plot_state() , também há algumas alterações que devem ser verificadas durante a atualização. A primeira é que a saída dessas funções foi alterada; em versões anteriores, elas mostravam a visualização da saída de forma interativa. No entanto, isso foi alterado para retornar um objeto matplotlib.Figure . Isso proporciona muito mais flexibilidade e opções para interagir com a visualização antes de salvá-la ou exibi-la. Isso exigirá ajustes na forma como essas funções são consumidas. Por exemplo, antes desta versão, ao chamar:
plot_histogram(counts)
plot_state(rho)abriria novas janelas (dependendo do backend do matplotlib) para exibir a visualização. Entretanto, a partir do site 0.7, você terá que chamar show() na saída para espelhar esse comportamento. Por exemplo:
plot_histogram(counts).show()
plot_state(rho).show()ou:
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.show()
state_fig.show()Observe que isso é apenas para quando estiver sendo executado fora do Jupyter. Nenhum ajuste é necessário em um ambiente Jupyter porque os notebooks Jupyter entendem nativamente como renderizar objetos matplotlib.Figure .
No entanto, o retorno do objeto Figure oferece flexibilidade adicional para lidar com a saída. Por exemplo, em vez de apenas mostrar a figura, agora você pode salvá-la diretamente em um arquivo, aproveitando o método savefig() . Por exemplo:
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.savefig('histogram.png')
state_fig.savefig('state_plot.png')O outro aspecto importante que foi alterado com essas funções é a execução no jupyter. Na versão 0.6 plot_state() e plot_histogram() , quando executadas no jupyter, o comportamento padrão era usar os gráficos interativos em Javascript se a biblioteca Javascript hospedada externamente para renderizar a visualização fosse acessível pela rede. Caso contrário, ele usaria apenas a versão do matplotlib. Entretanto, na versão 0.7, esse não é mais o caso e, em vez disso, devem ser usadas funções separadas para os gráficos interativos, iplot_state() e iplot_histogram() . plot_state() e plot_histogram() sempre usam as versões do matplotlib.
Além disso, a partir desta versão, a função plot_state() foi preterida em favor da chamada de métodos individuais para cada método de plotagem de um estado quântico. Embora a função plot_state() continue a funcionar até a versão 0.9, ela emitirá um aviso sempre que for usada. Os comandos
Qiskit Terra 0.6 | Qiskit Terra 0.7 + |
|---|---|
| plot_state(rho) | plot_state_city(rho) |
| plot_state(rho, method='city') | plot_state_city(rho) |
| plot_state(rho, method='paulivec') | plotagem_estado_paulivec(rho) |
| plot_state(rho, method='qsphere') | plotar_estado_qsphere(rho) |
| plot_state(rho, method='bloch') | plot_bloch_multivector(rho) |
| plot_state(rho, method='hinton') | plot_state_hinton(rho) |
O mesmo se aplica ao equivalente interativo em JS, iplot_state(). Os nomes das funções são todos iguais, apenas com um i precedido para cada função. Por exemplo, iplot_state(rho, method='paulivec') é iplot_state_paulivec(rho).
Alterações nos back-ends
Com os aprimoramentos feitos na versão 0.7, há alguns aspectos relacionados aos back-ends que devem ser levados em consideração ao fazer a atualização. A maior mudança é a reestruturação das instâncias do provedor no namespace raiz qiskit` . O provedor Aer não é instalado por padrão e requer a instalação do pacote qiskit-aer . Este pacote contém o novo simulador de alto desempenho com todos os recursos. Se você instalou via pip install qiskit , já o terá instalado. Os simuladores python agora estão disponíveis em qiskit.BasicAer e os simuladores C++ antigos estão disponíveis em qiskit.LegacySimulators. Isso também significa que o fallback implícito para simuladores baseados em python quando os simuladores C++ não são encontrados não existe mais. Se você solicitar um back-end de simulador local baseado em C++ e ele não puder ser encontrado, será gerada uma exceção em vez de usar apenas o simulador python.
Além disso, as funções de nível superior anteriormente obsoletas register() e available_backends() foram removidas. Além disso, os métodos obsoletos backend.parameters() e backend.calibration() foram removidos em favor de backend.properties(). Consulte a seção de notas de versão do site 0.6 Trabalhar com backends para obter mais detalhes sobre essas alterações.
As chamadas backend.jobs() e backend.retrieve_jobs() não retornam mais os resultados desses trabalhos. Em vez disso, você deve chamar o método result() nos objetos de trabalho retornados.
Alterações no compilador, transpiler e unrollers
Como parte de um esforço para estabilizar as interfaces do compilador, houve várias alterações que devem ser levadas em consideração ao utilizar as funções do compilador. Primeiro, é importante observar que a função qiskit.transpiler.transpile() agora recebe um objeto QuantumCircuit (ou uma lista deles) e retorna um objeto QuantumCircuit (ou uma lista deles). O processamento do DAG é feito internamente agora.
Você também pode alternar facilmente entre circuitos, DAGs e Qobj agora usando as funções em qiskit.converters.
Aer 0.1
Novos Recurso
O Aer oferece três backends de simulador:
QasmSimulatorsimulação de experimentos e resultados de medição de retornoStatevectorSimulator: retorna o vetor de estado final para um circuito quântico que atua no estado totalmente zeroUnitarySimulatorretorna a matriz unitária para um circuito quântico
noise módulo: contém recursos avançados de modelagem de ruído para o QasmSimulator
NoiseModel,QuantumError,ReadoutErrorclasses para simular um circuito quântico Qiskit na presença de erroserrorssubmódulo que inclui funções para gerar objetosQuantumErrorpara os seguintes tipos de erros quânticos: Kraus, unitário misto, unitário coerente, Pauli, despolarização, relaxamento térmico, amortecimento de amplitude, amortecimento de fase, amortecimento combinado de fase e amplitudedevicesubmódulo para gerar automaticamente um modelo de ruído com base no siteBackendPropertiesde um dispositivo
utils módulo:
qobj_utilsfornece funções para modificar diretamente um Qobj para inserir instruções especiais do simulador que ainda não são compatíveis com a API do Qiskit Terra.
Aqua 0.4
Novos Recurso
-
APIs programáticas para algoritmos e componentes - cada componente agora pode ser instanciado e inicializado por meio de uma única chamada de construtor (não vazia)
-
QuantumInstanceAPI para desacoplamento de algoritmo/backend -QuantumInstanceencapsula um backend e suas configurações -
Documentação atualizada e Jupyter Notebooks ilustrando as novas APIs programáticas
-
Paralelização transparente para otimizadores baseados em gradiente
-
Operação com controle múltiplo (cnx)
-
Componente algorítmico acoplável
RandomDistribution -
Implementações concretas de
RandomDistribution:BernoulliDistribution,LogNormalDistribution,MultivariateDistribution,MultivariateNormalDistribution,MultivariateUniformDistribution,NormalDistribution,UniformDistribution, eUnivariateDistribution -
Implementações concretas de
UncertaintyProblem:FixedIncomeExpectedValue,EuropeanCallExpectedValue, eEuropeanCallDelta -
Algoritmo de estimativa de amplitude
-
Otimização Qiskit: Novos modelos Ising para problemas de otimização: cobertura exata, empacotamento de conjuntos, cobertura de vértices, clique e partição de grafos
-
Qiskit AI:
- Novos mapas de recursos que ampliam a interface plugável
FeatureMap:PauliExpansionePauliZExpansion - Mecanismo de serialização/desserialização do modelo de treinamento
- Novos mapas de recursos que ampliam a interface plugável
-
Qiskit Finance:
- Estimativa de amplitude para variável aleatória de Bernoulli: ilustração da estimativa de amplitude em um único problema de qubit
- Carregamento de várias distribuições aleatórias univariadas e multivariadas
- Opção de compra europeia: valor esperado e delta (usando distribuições univariadas)
- Precificação de ativos de renda fixa: valor esperado (usando distribuições multivariadas)
-
A cadeia de Pauli na classe
Operatorestá alinhada com a Terra 0.7. Agora, a ordem de uma string pauli de n-qubit éq_{n-1}...q{0}. Assim, o (de)serialier (save_to_dicteload_from_dict) na classeOperatortambém é alterado para adotar as alterações da classePauli.
Considerações de Compatibilidade
HartreeFockcomponente do tipo plugávelInitialStatemovido para o Qiskit ChemistryUCCSDcomponente do tipo plugávelVariationalFormmovido para o Qiskit Chemistry