Hi Tom,
you were close. Below is the code which implements plan B - I used ancilla as random generator, combined with your implicit loop mapping hw to index in pL[.]. The results are as expected. It is 1 circuit with 8k shots, rather than 8k circuits with 1 shot (as I wanted it). Will it run on a real HW ?- I’ll investigate it next.
I think this thread is long enough - so I’ll stop posting here
You suggested I learn Catalyst. Perhaps you can point me to a tutorial showing it works for a non-trivial feed-forward circuit executed on a real HW from any cloud vendor?
Thanks
Jan
dev = qml.device("default.qubit",wires=4,shots=8000)
@qml.qnode(dev)
def f5():
ninp=3
qout=ninp
mL=[None for i in range(ninp)] # locks memory
for i in range(ninp):
qml.Hadamard(i)
mL[i]=qml.measure(i)
hw=sum(mL)
pL=np.array([0.5, 0.7, 0., 1.])
angL=np.arccos(1-2*pL)
[qml.cond(hw ==i, qml.RX)(angL[i],qout) for i in range(ninp+1)]
return qml.sample()
print(qml.draw(f5)())
samples = f5()
counts = qml.counts(wires=[0, 1, 2, 3])._samples_to_counts(samples)
pprint(counts)
Output:
0: ──H──┤↗├─────────────────────────────────────────────────────────┤ Sample
1: ──────║───H──┤↗├─────────────────────────────────────────────────┤ Sample
2: ──────║───────║───H──┤↗├─────────────────────────────────────────┤ Sample
3: ──────║───────║───────║───RX(1.57)──RX(1.98)──RX(0.00)──RX(3.14)─┤ Sample
╚═══════║═══════║═══╬═════════╬═════════╬═════════╣ Sample
╚═══════║═══╬═════════╬═════════╬═════════╣ Sample
╚═══╩═════════╩═════════╩═════════╝ Sample
{'0000': 497,
'0001': 522,
'0010': 322,
'0011': 690,
'0100': 308,
'0101': 708,
'0110': 994,
'1000': 316,
'1001': 694,
'1010': 1016,
'1100': 948,
'1111': 985}
Analysis of the output for requested probability vs. hw : pL=[0.5, 0.7, 0., 1.]
- hw=0 has one input ‘000’ should have appended 1 with 50% prob - it is the case:
'0000': 497,
'0001': 522, --> p=0.5
- hw=1 has 3 inputs: 001, 010, 110, all should have attached ‘1’ with prob 0.7 - it is the case
'0010': 322,
'0011': 690, -->p=0.7
'0100': 308,
'0101': 708, -->p=0.7
'1000': 316,
'1001': 694, -->p=0.7
- hw=2 has inputs 011, 101, 110, should never have ‘1’ attached, correct, this are only strings I see
'0110': 994,
'1010': 1016,
'1100': 948,
- hw=3 has one input 111 should always have attached 1, correct, I see only
'1111': 985
→ p=1.0