`tfq_ps_decompose` corrupts `PhasedISwapPowGate` when `exponent` is numeric and `phase_exponent` is symbolic
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- python, tensorflow
- Ambito
- backend, machine-learning
Direzione di ricerca
Leggi tensorflow_quantum/core/ops/tfq_ps_decompose_op.cc, in particolare getOpForISP e il relativo punto di chiamata a tfq_ps_decompose in TfqPsDecomposeOp::Compute. Confronta come gestisce gli esponenti simbolici e numerici con getOpForPXP, getOpForPISP e getOpForFSIM. Riproduci il problema con il circuito fornito e l’esempio di risoluzione dei parametri; il lavoro è completato quando le operazioni decomposte mantengono l’esponente numerico corretto e vengono risolte senza l’errore segnalato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
In TfqPsDecomposeOp::Compute (tensorflow_quantum/core/ops/tfq_ps_decompose_op.cc, lines 75–97), a PISP (cirq.PhasedISwapPowGate) operation is decomposed whenever either exponent or phase_exponent is symbolic (Arg::ArgCase::kSymbol):
if (exponent.arg_case() == Arg::ArgCase::kSymbol ||
phase_exponent.arg_case() == Arg::ArgCase::kSymbol) {
// Decompose cirq.PhasedISwapPowGate only if it is
// parameterized.
num_extra_moments = 5;
Operation new_op;
new_op = getOpForPISP(cur_op, 0, 0);
cur_moment.mutable_operations()->at(k) = new_op;
new_op = getOpForPISP(cur_op, 1, 1);
*temp_moment_list[0].add_operations() = new_op;
new_op = getOpForISP(cur_op, "XXP", exponent.symbol());
*temp_moment_list[1].add_operations() = new_op;
new_op = getOpForISP(cur_op, "YYP", exponent.symbol());
*temp_moment_list[2].add_operations() = new_op;
new_op = getOpForPISP(cur_op, 1, 0);
*temp_moment_list[3].add_operations() = new_op;
new_op = getOpForPISP(cur_op, 0, 1);
*temp_moment_list[4].add_operations() = new_op;
}
However, getOpForISP (lines 164–187) was written for ISP, where exponent is guaranteed to be symbolic, and unconditionally writes new_op_map["exponent"].set_symbol(symbol).
When phase_exponent is a sympy.Symbol and exponent is a numeric constant (Arg::ArgCase::kArgValue — including Cirq's default exponent=1.0, or any non-unit float such as 0.5):
exponent.symbol()evaluates to""(empty string), andexponent.arg_value().float_value()is ignored.- The decomposed
XXPandYYPoperations receive a symbolicexponentwith empty symbol name""(sympy.Symbol('')after deserialization) instead of a numeric float-0.5 * exponent.arg_value().float_value(). - Resolving circuit parameters leaves unresolved
sympy.Symbol('')expressions on theXXPowGateandYYPowGateoperations, corrupting the decomposed circuit and breakingParameterShiftdifferentiation wheneverPhasedISwapPowGatehas a symbolicphase_exponentand numericexponent.
Minimal Reproduction
import cirq
import sympy
import tensorflow_quantum as tfq
from tensorflow_quantum.core.ops import tfq_ps_util_ops
q0, q1 = cirq.GridQubit.rect(1, 2)
beta = sympy.Symbol("beta")
# Numeric exponent with symbolic phase_exponent.
circuit = cirq.Circuit(
cirq.PhasedISwapPowGate(phase_exponent=beta, exponent=0.5).on(q0, q1)
)
decomposed_tensor = tfq_ps_util_ops.tfq_ps_decompose(
tfq.convert_to_tensor([circuit])
)
decomposed_circuit = tfq.from_tensor(decomposed_tensor)[0]
print(decomposed_circuit)
# Raises TypeError because XXPowGate and YYPowGate contain sympy.Symbol('').
cirq.unitary(cirq.resolve_parameters(decomposed_circuit, {"beta": 0.72}))
Observed decomposed circuit:
(0, 0): ───Z^beta───────────────XX───────────YY───────────Z^(-beta)────────────
│ │
(0, 1): ────────────Z^(-beta)───XX^(-0.5*)───YY^(-0.5*)───────────────Z^beta───
Possible Fix
Update getOpForISP to read exponent from cur_op directly (or accept const Arg& instead of std::string symbol) and switch on exponent.arg_case(), consistent with getOpForPXP, getOpForPISP, and getOpForFSIM: keep set_symbol(...) and exponent_scalar = -0.5 * cur_exponent_scalar for Arg::ArgCase::kSymbol, and set exponent to -0.5 * exponent.arg_value().float_value() with exponent_scalar = 1.0 for Arg::ArgCase::kArgValue.
- Lingua principale
- Python
- Stelle
- 2.2k
- Fork
- 674
- Merge medio
- 1g 14h
- PR unite (30g)
- 5
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di tensorflow/quantum
-
Avoid hard-coding "quantum" in `scripts/` scriptsForse già presa @openbotgit l’ha presa 23 giorni fa. Apertaarea/devops help wanted no QC knowledge needed priority/before-0.7.7
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
tensorflow/quantum#1082 · 2 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
area/c++ area/core kind/bug-report
Difficoltà 3/5 1-2 giorni Idoneità per principianti 74/100
tensorflow/quantum#1141 ·
I maintainer di solito rispondono entro 1 giorno
-
Bug (likely typo) in `core/serialize/serializer_test.py`Forse già presa @mhucka l’ha presa 15 giorni fa. Apertaarea/serialization area/tests
tensorflow/quantum#1129 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Support Keras 3Forse di nuovo libera @rosspeili l’ha presa 118 giorni fa e non c’è nessuna pull request aperta. Apertaarea/keras help wanted skill-level/intermediate
tensorflow/quantum#1090 · 5 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
area/circuits priority/after-0.7.7 skill-level/expert
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
tensorflow/quantum#1087 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di tensorflow/quantum
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
UKGovernmentBEIS/inspect_ai#6512 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 68/100
Kav-K/GPTDiscord#501 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
UKGovernmentBEIS/inspect_evals#2863 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug]: graphify query loads every language extractor just for _file_stem (about 34 ms per call)Forse già presa @rohit-jsfreaky l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
Graphify-Labs/graphify#5160 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni