Skip to content

Commit 793876b

Browse files
committed
use backend.probability_sample()
1 parent 4e2e27d commit 793876b

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

tensorcircuit/basecircuit.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -447,25 +447,27 @@ def measure_jit(
447447
sample.append(sign_complex)
448448
p = p * (pu * (-1) ** sign + sign)
449449
else:
450-
zero_r = backend.cast(backend.convert_to_tensor(0.0), rdtypestr)
451-
pu = backend.clip(backend.real(backend.diagonal(rho)), zero_r, one_r)
450+
pu = backend.clip(
451+
backend.real(backend.diagonal(rho)),
452+
backend.convert_to_tensor(0.0),
453+
backend.convert_to_tensor(1.0),
454+
)
452455
pu = pu / backend.sum(pu)
453456
if status is None:
454-
k_out = backend.implicit_randc(
457+
ind = backend.implicit_randc(
455458
a=backend.arange(self._d),
456459
shape=1,
457460
p=backend.cast(pu, rdtypestr),
458-
)[0]
459-
k_out = backend.cast(k_out, "int32")
461+
)
460462
else:
461-
r = backend.real(backend.cast(status[k], rdtypestr))
462-
cdf = backend.cumsum(pu)
463-
k_out = backend.sum(backend.cast(r >= cdf, "int32"))
464-
k_out = backend.clip(
465-
k_out,
466-
backend.cast(backend.convert_to_tensor(0), "int32"),
467-
backend.cast(backend.convert_to_tensor(self._d - 1), "int32"),
463+
one_r = backend.cast(backend.convert_to_tensor(1.0), rdtypestr)
464+
st = backend.cast(status[k : k + 1], rdtypestr)
465+
ind = backend.probability_sample(
466+
shots=1,
467+
p=backend.cast(pu, rdtypestr),
468+
status=one_r - st,
468469
)
470+
k_out = backend.cast(ind[0], "int32")
469471
sample.append(backend.cast(k_out, rdtypestr))
470472
p = p * backend.cast(pu[k_out], rdtypestr)
471473
sample = backend.real(backend.stack(sample))

tensorcircuit/mpscircuit.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,11 +1048,12 @@ def measure(
10481048
self._d, shape=1, p=backend.cast(ps, rdtypestr)
10491049
)[0]
10501050
else:
1051-
r = backend.real(backend.cast(status[k], rdtypestr))
1052-
cdf = backend.cumsum(ps)
1053-
eps = 0.31415926 * 1e-12
1054-
ge_mask = backend.cast(r + eps >= cdf, rdtypestr)
1055-
outcome = backend.cast(backend.sum(ge_mask), "int32")
1051+
one_r = backend.cast(backend.convert_to_tensor(1.0), rdtypestr)
1052+
st = backend.cast(status[k : k + 1], rdtypestr)
1053+
ind = backend.probability_sample(
1054+
shots=1, p=backend.cast(ps, rdtypestr), status=one_r - st
1055+
)
1056+
outcome = backend.cast(ind[0], "int32")
10561057

10571058
p = p * ps[outcome]
10581059
basis = backend.convert_to_tensor(np.eye(self._d).astype(dtypestr))

0 commit comments

Comments
 (0)