Original qiskit only allow measurement along computational basis. But while using dm_simulator a plethora of measurement options can be set as decribed below.
from qiskit import *
import numpy as np
%matplotlib inline
qc = QuantumCircuit(1,1)
qc.s(0)
qc.measure(0,0,basis='X')
backend = BasicAer.get_backend('dm_simulator')
run = execute(qc,backend)
result = run.result()
result['results'][0]['data']['densitymatrix']
array([[0.5+0.j, 0. +0.j], [0. +0.j, 0.5+0.j]])
qc1 = QuantumCircuit(1,1)
qc1.s(0)
qc1.measure(0,0, basis='N', add_param=np.array([1,2,3]))
backend = BasicAer.get_backend('dm_simulator')
run1 = execute(qc1,backend)
result1 = run1.result()
result1['results'][0]['data']['densitymatrix']
Given direction for the measurement was not normalised. It has been normalised to be unit vector!!
array([[0.82142857+0.j , 0.10714286-0.21428571j], [0.10714286+0.21428571j, 0.17857143+0.j ]])
Measurement in the Bell basis $$\{\frac{|00\rangle + |11\rangle}{\sqrt(2)}, \frac{|00\rangle - |11\rangle}{\sqrt(2)}, \frac{|01\rangle + |10\rangle}{\sqrt(2)},\frac{|01\rangle - |10\rangle}{\sqrt(2)}\}$$
qc2 = QuantumCircuit(3,2)
qc2.measure(0,0,basis='Bell',add_param='01')
options2 = {
'plot': True
}
backend = BasicAer.get_backend('dm_simulator')
run2 = execute(qc2,backend,**options2)
result2 = run2.result()
result2['results'][0]['data']['bell_probabilities01']
{'Bell_1': 0.5, 'Bell_2': 0.5, 'Bell_3': 0.0, 'Bell_4': 0.0}
Ensemble measurement is used to check the states of all the qubits at once. This measurement doesnot change the densitymatrix rather prints out the probabilities of neasurement.
qc3 = QuantumCircuit(3,3)
qc3.h(0)
qc3.cx(0,1)
qc3.cx(1,2)
qc3.measure(0,0,basis='Ensemble',add_param='X')
backend = BasicAer.get_backend('dm_simulator')
options3 = {
'plot': True
}
run3 = execute(qc3,backend,**options3)
result3 = run3.result()
result3['results'][0]['data']['ensemble_probability']
{'000': 0.25, '001': 0.0, '010': 0.0, '011': 0.25, '100': 0.0, '101': 0.25, '110': 0.25, '111': 0.0}
Gives back the expectation value of a string of operators from {I,X,Y,Z} (Pauli Operators)
qc4 = QuantumCircuit(3,3)
qc4.h(0)
qc4.cx(0,1)
qc4.cx(1,2)
qc4.measure(0,0,basis='Expect',add_param='ZIZ')
backend = BasicAer.get_backend('dm_simulator')
run4 = execute(qc4,backend)
result4 = run4.result()
result4['results'][0]['data']['Pauli_string_expectation']
1.0