Riferimento API di Aqarios Constrained Quantum Optimizer
Qiskit Functions — strumenti preconfigurati realizzati da organizzazioni partner — astraggono alcune parti del flusso di lavoro di sviluppo software per semplificare e accelerare la scoperta di algoritmi e lo sviluppo di applicazioni su scala industriale. Clicca qui per visualizzare la guida relativa a questa funzione di Qiskit.
Guida all'ottimizzatore quantistico con vincoli Aqarios
L'Aqarios Constrained Quantum Optimizer risolve problemi di ottimizzazione binaria con vincoli su hardware IBM Quantum®. Accetta problemi in formato LP, MPS o Luna Model e gestisce internamente tutte le operazioni di riformulazione, sintesi dei circuiti, transpilazione e avvio a caldo iterativo utilizzando il metodo QAOA ad angolo fisso con mixer XY.
La funzione viene caricata e richiamata come segue:
optimizer = catalog.load("aqarios/constrained-quantum-optimizer")
job = optimizer.run(problem=lp_str, backend_name="ibm_phoenix")
result = job.result()L'ottimizzatore quantistico con vincoli Aqarios è disponibile solo per gli utenti dei piani " IBM Quantum® Premium Plan ", "Flex Plan" e " On-Prem Plan ". È una versione in anteprima e soggetta a modifiche.
Input
Consulta l'elenco seguente per conoscere tutti i parametri di input accettati da questa API. I parametri obbligatori devono essere specificati in ogni chiamata; tutti gli altri sono facoltativi.
problem
Tipo: str
Il problema di ottimizzazione serializzato da risolvere. Sono supportati tre formati:
- LP (
*.lp): Formato di file LP standard esportato come stringa, ad esempio tramite DOcplex'sexport_as_lp_string() - MPS (
*.mps): Formato file MPS standard esportato come stringa, ad esempio tramite DOcplex'sexport_as_mps_string() - Modello Luna : serializzazione Base64-encoded di un oggetto Aqarios Luna Model, ottenuta tramite
model.encode_b64()
Il modello deve rappresentare un problema di ottimizzazione binaria, sia che si tratti di massimizzazione che di minimizzazione. I vincoli possono essere disuguaglianze o uguaglianze su variabili binarie. Le variabili intere sono supportate solo se vengono specificati chiaramente i limiti superiore e inferiore. Le variabili continue (a valori reali) non sono supportate e un modello che le contenga genera un errore con codice 4710. L'obiettivo e i vincoli possono essere di ordine superiore e non devono necessariamente essere solo lineari.
- Obbligatorio: sì
- Esempio di LP:
\Problem name: MIS
Minimize
obj: ...
Subject To
c1: ...
...
Binaries
x_0 x_1
End
backend_name
Tipo: str or None
Valore predefinito: None
Il nome del backend di IBM Quantum su cui eseguire l'operazione (ad esempio "ibm_phoenix"). Se impostata su None, la funzione seleziona automaticamente il dispositivo disponibile meno utilizzato.
- Obbligatorio: No
- Esempio:
"ibm_phoenix"
options
Tipo: dict or None
Valore predefinito: None
Opzioni di configurazione dell'algoritmo che regolano il comportamento del QAOA iterativo con avvio a caldo. Le opzioni sono specificate sotto forma di dizionario. Consulta l' elenco delle opzioni riportato di seguito per conoscere tutti i parametri disponibili e i relativi valori predefiniti.
- Obbligatorio: No
- Esempio:
{"reps": 2, "num_parallel": 10, "postprocessing_level": 1}
Elenco opzioni
reps
Tipo: int
Valore predefinito: 1
Numero di ripetizioni dello strato QAOA (parametro di profondità del circuito ). Valori più elevati migliorano la qualità della soluzione, ma comportano circuiti più complessi e tempi di esecuzione più lunghi, il che può generare un maggiore rumore.
- Opzioni: numero intero compreso in un intervallo
[1, 10]
num_parallel
Tipo: int
Valore predefinito: 5
Numero di catene indipendenti di avvio a caldo eseguite in parallelo. Aumentando questo valore si migliora la probabilità di trovare soluzioni di alta qualità, ma si aumenta il consumo totale del budget di tentativi.
- Opzioni: numero intero compreso in un intervallo
[1, 100]
shots
Tipo: int
Valore predefinito: 500
Numero di misurazioni per iterazione per catena.
- Opzioni: numero intero compreso in un intervallo
[1, 10000]
total_shots
Tipo: int
Valore predefinito: 5000
Budget totale delle riprese per tutte le iterazioni di una singola catena di avvio a caldo. Il ciclo di iterazione termina per una catena una volta esaurito tale budget.
- Opzioni: numero intero compreso in un intervallo
[1, 1000000]
epsilon
Tipo: float
Valore predefinito: 0.1
Parametro di regolarizzazione per le probabilità di avvio a caldo. Impedisce che la distribuzione di probabilità si riduca a uno stato deterministico, preservando l'esplorazione nel corso delle iterazioni.
- Opzioni: Intervallo di galleggiamento
(0.01, 1)
beta
Tipo: float
Valore predefinito: 10
Temperatura inversa per la ponderazione di Boltzmann utilizzata per ricavare nuovi stati di avvio a caldo dai campioni di misura. Valori più elevati concentrano la massa di probabilità sui campioni a energia più bassa.
- Opzioni: Galleggiante soddisfacente
beta > 0
approximation_degree
Tipo: float
Valore predefinito: 1.0
Controlla il livello di approssimazione applicato alla funzione di costo e durante la transpilazione. Valori più bassi riducono la profondità del circuito introducendo approssimazioni che possono influire sulla qualità della soluzione.
- Opzioni: Intervallo di galleggiamento
[0.0, 1.0]
postprocessing_level
Tipo: int
Valore predefinito: 3
Efficacia della post-elaborazione classica applicata dopo ogni fase di campionamento per migliorare la qualità della soluzione. Livelli più elevati applicano una ricerca locale più aggressiva, a scapito di un aumento del tempo di elaborazione classico.
- Opzioni: numero intero compreso in un intervallo
[0, 3]0: Disattiva la post-elaborazione.1: Ricerca locale a passaggio singolo. Cerca di capovolgere ogni bit una volta in ordine casuale e mantieni i capovolgimenti che riducono l'energia.2: Ricerca locale a tre passaggi. Applicare il livello tre1volte in ordini casuali diversi.3: Ricerca locale avida. Applicare ripetutamente il bit-flip che comporta la massima riduzione di energia fino a quando non è più possibile ottenere ulteriori miglioramenti.
penalty_override
Tipo: float or None
Valore predefinito: None
Sovrascrive manualmente il valore della penalità utilizzato durante la conversione dei vincoli in termini di penalità aggiunti all'obiettivo. Per impostazione predefinita, la penalità viene calcolata automaticamente in base alla struttura del problema. Utilizzare questa opzione solo se il valore automatico produce risultati non validi.
- Opzioni: impostare il valore desiderato
penalty_override > 0oppureNoneutilizzare il valore automatico
use_session
Tipo: bool
Valore predefinito: False
Se utilizzare la modalità di sessione del servizi IBM Quantum Compute per l'esecuzione dei lavori. L’attivazione delle sessioni riduce il sovraccarico di esecuzione dei circuiti mantenendo aperta una connessione dedicata alla QPU durante tutte le iterazioni, il che può ridurre il tempo di esecuzione complessivo.
- Opzioni:
True/False
seed_transpiler
Tipo: int or None
Valore predefinito: None
Seed passato al transpiler che mappa il circuito sul backend selezionato. Impostare un valore fisso per garantire la riproducibilità della sintesi e del routing dei circuiti tra una sessione e l'altra. Quando è impostato su None, il transpiler genera i propri semi in modo non deterministico, pertanto l'esecuzione ripetuta dello stesso problema può produrre layout di circuiti diversi.
- Opzioni: un numero intero qualsiasi, oppure
Noneper un seme non deterministico
job_tags
Tipo: list[str]
Valore predefinito: []
Tag aggiuntivi associati a ogni processo di calcolo quantistico che la funzione invia alla QPU. La funzione assegna sempre ai propri lavori l'ID del lavoro "aqarios/constrained-quantum-optimizer"e il nome del problema; le voci qui riportate vengono aggiunte a tale elenco. Utilizza questa funzione per raggruppare o filtrare i lavori primitivi sottostanti nell'elenco dei carichi di lavoro.
- Opzioni: Elenco di stringhe
- Esempio:
["my-experiment", "mis-benchmark"]
Output
Il risultato di questa API è un dizionario restituito da job.result(), contenente le soluzioni ottimali individuate e i metadati associati.
Tipo: dict[str, Any]
Dizionario dei risultati contenente le assegnazioni delle soluzioni, il valore dell'obiettivo, lo stato di fattibilità e i metadati relativi al tempo di esecuzione.
Esempio:
{
'solutions': [{'x_1': 0, 'x_2': 1, 'x_3': 0, 'x_4': 1, 'x_5': 1}],
'solution_bitstrings': ['01011'],
'raw_energy': -6.0,
'objective_value': -6.0,
'feasible': True,
'metadata': {
'resource_usage': {
'RUNNING: MAPPING': {'CPU': 5.405},
'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU': 9.902},
'RUNNING: WAITING_FOR_QPU': {'CPU': 25.456},
'RUNNING: EXECUTING_QPU': {'QPU': 25.202},
'RUNNING: POST_PROCESSING': {'CPU': 6.481}
},
'circuit_metrics': {
'before_transpilation': {
'num_qubits': 6,
'gate_count': 42,
'depth': 15,
'two_qubit_gate_count': 12,
'two_qubit_gate_depth': 7,
'operations': {'rz': 12, 'p': 8, 'ry': 7, 'rzz': 4, 'cx': 3,
'xx_plus_yy': 3, 'global_phase': 2, 'cry': 2, 'x': 1}
},
'after_transpilation': {
'num_qubits': 6,
'gate_count': 254,
'depth': 100,
'two_qubit_gate_count': 48,
'two_qubit_gate_depth': 33,
'operations': {'rz': 78, 'sx': 122, 'cz': 48, 'measure': 6, 'x': 0}
}
},
'solver_info': {
'variable_mapping': {'x_1': 0, 'x_2': 1, 'x_3': 2, 'x_4': 3, 'x_5': 4}
}
}
}Struttura dell'output
solutions
Tipo: list[dict[str, int]]
Un elenco delle migliori soluzioni individuate. Ogni voce è una mappatura che associa i nomi delle variabili (ad esempio, "x_0") alle loro assegnazioni binarie (0 o 1). L'elenco contiene più di una voce solo quando sono stati individuati più ottimi degeneri.
- Esempio:
[{"x_0": 1, "x_1": 0, "x_2": 1}]
solution_bitstrings
Tipo: list[str]
Le stesse soluzioni di solutions, codificate come stringhe di bit. La voce di questo elenco corrisponde alla voce di solutions. Utilizza metadata.solver_info.variable_mapping per verificare quale posizione di carattere di una stringa di bit corrisponda a quale variabile: il valore della variabile v è bitstring[variable_mapping[v]].
- Esempio:
["101"]
objective_value
Tipo: float
Il valore oggettivo della soluzione ottimale individuata, espresso in termini del problema originale. Nei problemi di massimizzazione, questo valore è maggiore quando le soluzioni sono migliori; nei problemi di minimizzazione, invece, è minore.
- Esempio:
42.0
raw_energy
Tipo: float
L'energia QAOA grezza della soluzione ottimale, sempre espressa come valore di minimizzazione. Ciò include eventuali clausole di penalità aggiunte durante la riformulazione del problema ed è utile per individuare le violazioni dei vincoli.
- Esempio:
-38.5
feasible
Tipo: bool
Se le soluzioni restituite soddisfano tutti i vincoli del modello di input originale. Un risultato può risultare non realizzabile se i valori di penalità non sono sufficienti a garantire il rispetto di tutti i vincoli a livello hardware.
- Esempio:
True
metadata
resource_usage
Tipo: dict
Consumo di risorse quantistiche e classiche suddiviso per fase dell'algoritmo (mappatura, ottimizzazione hardware, esecuzione su QPU, post-elaborazione).
- Esempio:
{'RUNNING: MAPPING': {'CPU': 4.57},
'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU': 0.177},
'RUNNING: WAITING_FOR_QPU': {'CPU': 9.238},
'RUNNING: EXECUTING_QPU': {'QPU': 30},
'RUNNING: POST_PROCESSING': {'CPU': 0.093}}circuit_metrics
Tipo: dict or None
Numero di porte e profondità dei circuiti QAOA, riportati sia nella versione sintetizzata che in quella eseguita sul dispositivo. Il valore è quando None il problema è stato risolto durante la pre-elaborazione e non è stato eseguito alcun circuito (codice di errore 4712).
before_transpilation
Tipo: dict
Metriche del circuito QAOA astratto, così come sintetizzato dal problema, prima che venga mappato al backend.
after_transpilation
Tipo: dict
Parametri dei circuiti effettivamente inviati al dispositivo. Media calcolata su tutti i circuiti eseguiti durante l'ottimizzazione e arrotondata al numero intero superiore.
Entrambe le voci contengono gli stessi campi: ( num_qubits numero di qubit nel circuito), gate_count (numero totale di operazioni), depth (profondità del circuito), two_qubit_gate_count (numero di porte a due qubit), two_qubit_gate_depth (profondità considerando solo le porte a due qubit) e ( operations nome della porta associato al numero delle sue occorrenze).
solver_info
Tipo: dict or None
Ulteriori informazioni su come il risolutore ha rappresentato il problema.
variable_mapping
Tipo: dict[str, int]
Assegna a ciascun nome di variabile la posizione del carattere corrispondente nelle voci di solution_bitstrings.
- Esempio:
{"x_0": 0, "x_1": 1, "x_2": 2}
Gestione degli errori
Codice | Descrizione |
|---|---|
4710 | Il modello di input non è supportato. Il modello contiene variabili continue (a valori reali), che la funzione non è in grado di risolvere, oppure variabili intere prive di limiti espliciti. |
4711 | La stringa immessa non può essere analizzata per ottenere un modello. Verifica che problem sia una stringa valida di tipo LP, MPS o Luna Model. |
4712 | Il modello è stato risolto in modo ottimale durante la fase di pre-elaborazione e non è stato eseguito alcun calcolo quantistico. Il risultato viene comunque restituito, con impostato metadata.circuit_metrics su None. |
4719 | Errore imprevisto nella funzione interna. Contatta [email protected] indicando il tuo ID lavoro. |
- Tipi di variabili non supportati : la funzione risolve solo problemi discreti. Le variabili continue (a valori reali) non sono supportate, mentre le variabili intere devono avere un limite inferiore e uno superiore espliciti. Un modello che non rispetta questa regola genera un errore con codice
4710. - Formato del problema non valido : se la
problemstringa non può essere analizzata come un modello LP, MPS o Luna valido, il processo fallisce con il codice di errore4711. - Errori di convalida delle opzioni : se le chiavi o i valori delle opzioni esulano dagli intervalli specificati nella documentazione, il processo fallisce immediatamente con il codice di errore
1221.