Samplex
class samplomatic.samplex.Samplex
Basi: object
Rappresenta una distribuzione di probabilità relativa ai parametri del circuito e ad altri campi.
Samplex è il tipo principale della libreria Samplomatic. È un termine composto derivante da “sampling complex”.
In termini astratti, un samplex rappresenta una distribuzione di probabilità parametrica sui parametri di un determinato circuito modello, oltre ad altri campi con valori vettoriali da utilizzare nella post-elaborazione dei dati raccolti dall'esecuzione del circuito modello associato. In pratica, implementa un metodo sample() che attinge da questa distribuzione per generare un insieme di array che include almeno un array di angoli (casuali) validi per il circuito modello. Ad esempio, un’istanza di Samplex potrebbe implementare il “twirling” di Pauli su tutti i livelli di un circuito di base, comprese le misurazioni finali, in modo che gli angoli restituiti dal campionamento corrispondano a porte di Pauli composte con qualsiasi porta a singolo qubit presente nel circuito di base, insieme ad array booleani che descrivono come invertire i risultati delle misurazioni capovolti dal “twirling” delle misurazioni. Tuttavia, la sua semantica non si limita a questo e la sua struttura è altamente estensibile: alla libreria è possibile aggiungere nuovi tipi di gruppi, nuove distribuzioni e nuove tecniche di propagazione dei gate virtuali.
A livello interno, un samplex utilizza una rappresentazione sotto forma di grafo aciclico diretto (DAG) che descrive il processo di campionamento in modo procedurale. Ogni nodo del grafo interagisce con un insieme di VirtualRegisters, e le connessioni tra i nodi indicano una dipendenza tra i registri: se , allora richiede che abbia agito sui registri prima che gli sia consentito agire. Ciò implica che il flusso del grafo non sia temporale rispetto all’esecuzione, come nel caso del DAG di un circuito quantistico, ma che scorra invece dai nodi responsabili della generazione delle randomizzazioni ai nodi responsabili della restituzione delle randomizzazioni elaborate come output. Esistono tre tipi di nodi:
SamplingNodei sono responsabili dell'istanziazione di nuovi registri a partire dagli input,EvaluationNodesono responsabili della trasformazione, della combinazione e della rimozione dei registri,CollectionNodeI sono responsabili della lettura dei registri e della scrittura dei valori di uscita disample().
I Samplex vengono in genere generati passando alla funzione build() un circuito di base con istruzioni annotate all'interno di riquadri. È possibile generarne uno manualmente, sebbene sia un’operazione laboriosa, e l’utente è quindi anche responsabile della costruzione di un circuito quantistico parametrico compatibile da utilizzare come circuito modello. L'esempio seguente mostra un semplice circuito realizzato in una coppia di samplex e template utilizzando la funzione build() , e traccia il DAG risultante del samplex. I tre diversi tipi di nodi descritti sopra sono indicati da forme diverse.
>>> from samplomatic import build, Twirl
>>> from qiskit import QuantumCircuit
>>>
>>> circuit = QuantumCircuit(2)
>>> with circuit.box([Twirl()]):
... circuit.cz(0, 1)
>>> with circuit.box([Twirl()]):
... circuit.measure_all()
>>>
>>> template, samplex = build(circuit)
>>> samplex.draw()Sebbene il DAG sia la componente principale del modello di dati di questo oggetto, vengono memorizzate anche altre informazioni:
- I samplex stessi possono essere parametrici (vedi
parameters) e valutare espressioni con parametri, il cui contenuto viene interamente memorizzato dal samplex. Ad esempio, se costruito tramitebuild(), un samplex accetterà valori per tutti i parametri accettati dal circuito di base. - Specifiche di input e output che descrivono esattamente quali valori sono previsti in ingresso in un determinato momento
sample()e quali valori verranno restituiti; si vedano einputs()outputs(). - Requisiti relativi ai modelli di rumore che specificano quali tipi di modelli di rumore sono compatibili con le esigenze di campionamento di un samplex.
Riepilogo degli attributi
Rubrica 1 | Rubrica 2 |
|---|---|
num_parameters | Il numero di parametri previsti al momento del campionamento. |
param_table | Il ParameterExpressionTable possesso delle espressioni dei parametri di questo samplex. |
parameters | I parametri ordinati che richiedono valori al momento del campionamento. |
passthrough_params | La mappatura degli indici che gestisce i parametri dei modelli in passthrough. |
Sintesi dei metodi
Rubrica 1 | Rubrica 2 |
|---|---|
add_edge(a, b) | Aggiungi un spigolo al grafo di Samplex. |
add_input(specifiche) | Aggiungi un ingresso di campionamento a questo samplex. |
add_node(nodo) | Aggiungi un nodo al grafico di Samplex. |
add_output(specifiche) | Aggiungi un'uscita di campionamento a questo samplex. |
append_parameter_expression(espressione) | Aggiungi un'espressione di parametro al samplex. |
draw([cols, subgraph_idxs, layout_method]) | Disegna il grafico in questo esempio utilizzando il metodo plot_graph() . |
finalize() | Segnalare che tutti i nodi e gli archi sono stati aggiunti e determinare l'ordine di percorrenza dei nodi. |
inputs() | Restituisce un oggetto che specifica e aiuta a creare gli input richiesti da sample(). |
outputs() | Restituisce un oggetto che specifica i risultati previsti di sample(). |
sample([samplex_input, num_randomizations, ...]) | Esempio. |
set_passthrough_params(passthrough_params) | Imposta la mappatura dei parametri di passthrough. |
Documentazione sugli attributi
num_parameters
Il numero di parametri previsti al momento del campionamento.
param_table
Il ParameterExpressionTable possesso delle espressioni dei parametri di questo samplex.
I nodi parametrici vengono aggiunti alle voci di riferimento samplex di questa tabella in base all'indice e la tabella viene sample() valutata al momento del campionamento. In combinazione con passthrough_params, chi chiama la funzione può valutare solo il sottoinsieme deterministico dei parametri del template (ad esempio, gli angoli RZZGate ) senza richiamare sample(). Vedi anche e parameters append_parameter_expression().
parameters
I parametri ordinati che richiedono valori al momento del campionamento.
passthrough_params
La mappatura degli indici che gestisce i parametri dei modelli in passthrough.
Restituisce una coppia di array di interi di uguale lunghezza e allineati posizionalmente (template_idxs, expression_idxs): il valore all'indice del parametro del modello template_idxs[i] viene impostato durante l'esecuzione a partire sample() dal valore dell'espressione param_table all'indice expression_idxs[i] (vedi set_passthrough_params()).
Se non sono stati registrati parametri di passthrough, entrambi gli array risultano vuoti. Gli array restituiti sono copie indipendenti dello stato interno.
Documentazione sui metodi
add_edge
add_edge(a: int, b: int) → int
Aggiungi un spigolo al grafo di Samplex.
Parametri
- a – L'indice del nodo di origine.
- b – L'indice del nodo di destinazione.
Risultati
L'indice intero del bordo aggiunto.
add_input
add_input(specification: Specification)
Aggiungi un ingresso di campionamento a questo samplex.
Parametri
specifica – Una specifica relativa al nome e al tipo dell'input.
add_node
add_node(node: Node) → int
Aggiungi un nodo al grafico di Samplex.
Parametri
nodo – Il nodo da aggiungere.
Risultati
L'indice intero del nodo aggiunto.
add_output
add_output(specification: Specification)
Aggiungi un'uscita di campionamento a questo samplex.
Parametri
specifica – Una specifica relativa al nome e al tipo dell'output.
append_parameter_expression
append_parameter_expression(expression: ParameterExpression) → int
Aggiungi un'espressione di parametro al samplex.
È necessario aggiungere un'espressione a un samplex prima di poter aggiungere un nodo che faccia riferimento ad essa. Per ogni nuovo parametro che compare nell'espressione data, verrà inserita una voce in parameters ordine di ordinamento.
Parametri
espressione – Un parametro o un'espressione di parametro.
Risultati
Un indice che i nodi parametrici possono utilizzare per fare riferimento all'espressione valutata.
draw
draw(cols: int = 2, subgraph_idxs: None | int | Sequence[int] = None, layout_method: Literal['auto', 'spring', 'graphviz', 'graphviz_curved', 'graphviz_line'] | LayoutMethod = 'auto') → Figure
Disegna il grafico in questo esempio utilizzando il metodo plot_graph() .
Parametri
- cols – Il numero di colonne nella figura restituita.
- subgraph_idxs – Gli indici dei sottografi da includere nel grafico, oppure
Noneper includere tutti i sottografi. - layout_method – Un metodo di layout predefinito specificato per nome, oppure un oggetto richiamabile che implementa un layout.
Risultati
Un grafico Plotly.
finalize
finalize() → Self
Segnalare che tutti i nodi e gli archi sono stati aggiunti e determinare l'ordine di percorrenza dei nodi.
Aumenti
SamplexError : se vengono rilevati conflitti tra le dipendenze dei nodi.
Risultati
La stessa istanza, per il concatenamento.
inputs
inputs() → TensorInterface
Restituisce un oggetto che specifica e aiuta a creare gli input richiesti da sample().
Risultati
L'interfaccia di ingresso per questo samplex.
outputs
outputs() → TensorInterface
Restituisce un oggetto che specifica i risultati previsti di sample().
Risultati
L'interfaccia di uscita per questo samplex.
sample
sample(samplex_input: Mapping[str, Any] | None = None, num_randomizations: int = 1, rng: int | SeedSequence | Generator | None = None, keep_registers: bool = False, max_workers: int | None = None) → SamplexOutput
Esempio.
L'esempio seguente integra un semplice circuito con due parametri in un "samplex" per illustrare come richiamare questo metodo. In particolare, si noti che gli input richiesti dai nodi samplex, che includono sia le informazioni sul tipo che sulla forma dell'array, sono elencati in inputs(), e devono essere associati a dei valori.
>>> from samplomatic import build, Twirl
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>>
>>> # quickly make a circuit and build it to construct an example simplex
>>> circuit = QuantumCircuit(2)
>>> with circuit.box([Twirl()]):
... circuit.rx(Parameter("a"), 0)
... circuit.rx(Parameter("b"), 0)
... circuit.cz(0, 1)
>>> with circuit.box([Twirl()]):
... circuit.measure_all()
>>>
>>> template, samplex = build(circuit)
>>>
>>> # query the samplex for the expected inputs at sample time, and note that we
>>> # are required to pass a length-2 vector of floats for 'a' and 'b' (alphabetical)
>>> print(inputs := samplex.inputs())
TensorInterface(<
- 'parameter_values' <float64[2]>: Input parameter values to use during sampling.
>)>>> # after binding required values, we can sample 123 randomizations
>>> samplex.sample(
... inputs.bind(parameter_values=[0.1, 0.2]),
... num_randomizations=123,
... )
SamplexOutput({'measurement_flips.meas': ..., 'parameter_values': ...})>>> # alternatively, we can provide any mapping object directly to specify inputs
>>> samplex.sample(
... {"parameter_values": [0.1, 0.2]},
... num_randomizations=123,
... )
SamplexOutput({'measurement_flips.meas': ..., 'parameter_values': ...})Parametri
- samplex_input – Una mappatura dai nomi degli input ai valori corrispondenti, come descritto in
inputs()(vedi anche la guida agli input e agli output di Samplex ), oppureNonese non è richiesto alcun input. I nomi che contengono un punto possono utilizzare l'espansione a dizionario annidata. Si noti cheTensorInterfaceè un oggetto di mappatura e, pertanto, costituisce un argomento di input valido quando è completamente associato. - num_randomizations – Il numero di randomizzazioni da campionare.
- keep_registers – Indica se conservare i registri virtuali utilizzati durante il campionamento e includerli nell'output sotto la chiave dei metadati
"registers". - rng – Un numero intero per l'inizializzazione di un generatore di numeri casuali, il generatore stesso oppure
Nonel'utilizzo del generatore predefinito fornito dal modulo. - max_workers – Il numero massimo di thread che possono essere utilizzati per l'esecuzione parallela dei nodi di campionamento, valutazione e raccolta.
set_passthrough_params
set_passthrough_params(passthrough_params: list[tuple[int | None, ParameterExpression]]) → int
Imposta la mappatura dei parametri di passthrough.
Alcuni parametri non sono influenzati dalla propagazione del gate virtuale e non vengono impostati dai nodi di raccolta. Questi parametri vengono semplicemente mappati dai parametri del circuito originale a quelli del circuito modello. Questa funzione imposta la mappatura di questi parametri.
Parametri
passthrough_params – ParamSpec per i parametri di passthrough.
Ritorna: l'indice massimo del parametro del template in passthrough\_params.