@@ -388,10 +388,12 @@ def _rowsum(symplectic_matrix, h, i, nqubits, determined=False):
388
388
def _determined_outcome (state , q , nqubits ):
389
389
state [- 1 , :] = 0
390
390
idx = (state [:nqubits , q ].nonzero ()[0 ] + nqubits ).astype (np .uint )
391
+ if len (idx ) == 0 :
392
+ return state , state [- 1 , - 1 ]
391
393
state = _pack_for_measurements (state , nqubits )
392
394
state = _rowsum (
393
395
state ,
394
- 2 * nqubits * np .ones (idx .shape , dtype = np .uint ),
396
+ _dim_xz ( nqubits ) * np .ones (idx .shape , dtype = np .uint ),
395
397
idx ,
396
398
_packed_size (nqubits ),
397
399
True ,
@@ -427,7 +429,14 @@ def _random_outcome(state, p, q, nqubits):
427
429
@cache
428
430
def _dim (nqubits ):
429
431
"""Returns the dimension of the symplectic matrix for a given number of qubits."""
430
- return 2 * nqubits + 1
432
+ return _dim_xz (nqubits ) + 1
433
+
434
+
435
+ @cache
436
+ def _dim_xz (nqubits ):
437
+ """Returns the dimension of the symplectic matrix (only the de/stabilizers generators part,
438
+ without the phases and scratch row) for a given number of qubits."""
439
+ return 2 * nqubits
431
440
432
441
433
442
@cache
@@ -440,8 +449,8 @@ def _packbits(array, axis):
440
449
return np .packbits (array , axis = axis )
441
450
442
451
443
- def _unpackbits (array , axis ):
444
- return np .unpackbits (array , axis = axis )
452
+ def _unpackbits (array , axis , count ):
453
+ return np .unpackbits (array , axis = axis , count = count )
445
454
446
455
447
456
def _pack_for_measurements (state , nqubits ):
@@ -452,23 +461,16 @@ def _pack_for_measurements(state, nqubits):
452
461
return np .hstack ((x , z , r [:, None ]))
453
462
454
463
455
- @cache
456
- def _pad_size (n ):
457
- """Returns the size of the pad added to an array of original dimension `n` after unpacking."""
458
- return 8 - (n % 8 )
459
-
460
-
461
464
def _unpack_for_measurements (state , nqubits ):
462
465
"""Unpacks the symplectc matrix that was packed for measurements."""
463
- xz = _unpackbits (state [:, :- 1 ], axis = 1 )
464
- padding_size = _pad_size (nqubits )
465
- x , z = xz [:, :nqubits ], xz [:, nqubits + padding_size : - padding_size ]
466
+ xz = _unpackbits (state [:, :- 1 ], axis = 1 , count = _dim_xz (nqubits ))
467
+ x , z = xz [:, :nqubits ], xz [:, nqubits :]
466
468
return np .hstack ((x , z , state [:, - 1 ][:, None ]))
467
469
468
470
469
471
def _init_state_for_measurements (state , nqubits , collapse ):
470
472
if collapse :
471
- return _unpackbits (state , axis = 0 )[: _dim (nqubits )]
473
+ return _unpackbits (state , axis = 0 , count = _dim_xz ( nqubits ) )[: _dim (nqubits )]
472
474
else :
473
475
return state .copy ()
474
476
@@ -523,7 +525,7 @@ def _clifford_post_execution_reshape(state, nqubits: int):
523
525
Returns:
524
526
(np.array) The unpacked and reshaped state.
525
527
"""
526
- state = _unpackbits (state , axis = 0 )[: _dim (nqubits )]
528
+ state = _unpackbits (state , axis = 0 , count = _dim ( nqubits ) )[: _dim (nqubits )]
527
529
return state
528
530
529
531
0 commit comments