Skip to content

Commit

Permalink
Merge pull request #853 from Shivansh20128/847-function-equivalency
Browse files Browse the repository at this point in the history
Replacing "pure_to_mixed" with "vector_to_density_matrix" and then renaming to "to_density_matrix"
  • Loading branch information
vprusso authored Oct 11, 2024
2 parents 7b15429 + c92c661 commit 2f9602f
Show file tree
Hide file tree
Showing 15 changed files with 35 additions and 140 deletions.
2 changes: 1 addition & 1 deletion toqito/matrix_ops/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
from toqito.matrix_ops.vectors_from_gram_matrix import vectors_from_gram_matrix
from toqito.matrix_ops.vectors_to_gram_matrix import vectors_to_gram_matrix
from toqito.matrix_ops.calculate_vector_matrix_dimension import calculate_vector_matrix_dimension
from toqito.matrix_ops.vector_to_density_matrix import vector_to_density_matrix
from toqito.matrix_ops.to_density_matrix import to_density_matrix
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"""Test vector_to_density_matrix."""
"""Test to_density_matrix."""

import numpy as np
import pytest

from toqito.matrix_ops import vector_to_density_matrix
from toqito.matrix_ops import to_density_matrix


@pytest.mark.parametrize(
Expand All @@ -23,11 +23,11 @@
(np.array([[[1, 0], [0, 1]]]), None, ValueError),
],
)
def test_vector_to_density_matrix(input_vector, expected_output, exception):
def test_to_density_matrix(input_vector, expected_output, exception):
"""Test vector to density matrix functionality."""
if exception:
with pytest.raises(exception):
vector_to_density_matrix(input_vector)
to_density_matrix(input_vector)
else:
computed_density_matrix = vector_to_density_matrix(input_vector)
computed_density_matrix = to_density_matrix(input_vector)
assert (np.abs(computed_density_matrix - expected_output) <= 1e-3).all()
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np


def vector_to_density_matrix(input_array: np.ndarray) -> np.ndarray:
def to_density_matrix(input_array: np.ndarray) -> np.ndarray:
"""Convert a given vector to a density matrix or return the density matrix if already given.
If the input is a vector, this function computes the outer product to form a density matrix.
Expand All @@ -15,9 +15,9 @@ def vector_to_density_matrix(input_array: np.ndarray) -> np.ndarray:
As an example, consider one of the Bell states.
>>> from toqito.states import bell
>>> from toqito.matrix_ops import vector_to_density_matrix
>>> from toqito.matrix_ops import to_density_matrix
>>>
>>> vector_to_density_matrix(bell(0))
>>> to_density_matrix(bell(0))
array([[0.5, 0. , 0. , 0.5],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
Expand Down
4 changes: 2 additions & 2 deletions toqito/measurements/pretty_good_measurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import scipy

from toqito.matrix_ops import vector_to_density_matrix
from toqito.matrix_ops import to_density_matrix


def pretty_good_measurement(states: list[np.ndarray], probs: list[float] | None = None) -> list[np.ndarray]:
Expand Down Expand Up @@ -69,7 +69,7 @@ def pretty_good_measurement(states: list[np.ndarray], probs: list[float] | None
if not np.isclose(sum(probs), 1):
raise ValueError("Probability vector should sum to 1.")

states = [vector_to_density_matrix(state) for state in states]
states = [to_density_matrix(state) for state in states]
p_var = sum(probs[i] * states[i] for i in range(n))

p_var_sqrt = scipy.linalg.fractional_matrix_power(p_var, -1 / 2)
Expand Down
1 change: 0 additions & 1 deletion toqito/state_ops/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
"""Operations on quantum states."""

from toqito.state_ops.pure_to_mixed import pure_to_mixed
from toqito.state_ops.schmidt_decomposition import schmidt_decomposition
69 changes: 0 additions & 69 deletions toqito/state_ops/pure_to_mixed.py

This file was deleted.

35 changes: 0 additions & 35 deletions toqito/state_ops/tests/test_pure_to_mixed.py

This file was deleted.

6 changes: 3 additions & 3 deletions toqito/state_opt/ppt_distinguishability.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import picos

from toqito.matrix_ops import calculate_vector_matrix_dimension, vector_to_density_matrix
from toqito.matrix_ops import calculate_vector_matrix_dimension, to_density_matrix
from toqito.matrix_props import has_same_dimension


Expand Down Expand Up @@ -156,7 +156,7 @@ def _min_error_primal(
]
)

dms = [vector_to_density_matrix(vector) for vector in vectors]
dms = [to_density_matrix(vector) for vector in vectors]
if strategy == "unambig":
for i in range(n):
for j in range(n):
Expand Down Expand Up @@ -189,7 +189,7 @@ def _min_error_dual(
y_var = picos.HermitianVariable("Y", (d, d))
problem.add_list_of_constraints(
[
y_var - probs[i] * vector_to_density_matrix(vectors[i])
y_var - probs[i] * to_density_matrix(vectors[i])
>> picos.partial_transpose(
q_var,
subsystems=subsystems,
Expand Down
6 changes: 3 additions & 3 deletions toqito/state_opt/state_distinguishability.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import picos

from toqito.matrix_ops import calculate_vector_matrix_dimension, vector_to_density_matrix, vectors_to_gram_matrix
from toqito.matrix_ops import calculate_vector_matrix_dimension, to_density_matrix, vectors_to_gram_matrix
from toqito.matrix_props import has_same_dimension


Expand Down Expand Up @@ -167,7 +167,7 @@ def _min_error_primal(
problem.add_list_of_constraints([meas >> 0 for meas in measurements])
problem.add_constraint(picos.sum(measurements) == picos.I(dim))

dms = [vector_to_density_matrix(vector) for vector in vectors]
dms = [to_density_matrix(vector) for vector in vectors]

problem.set_objective("max", np.real(picos.sum([(probs[i] * dms[i] | measurements[i]) for i in range(n)])))
solution = problem.solve(solver=solver, **kwargs)
Expand All @@ -188,7 +188,7 @@ def _min_error_dual(
# Set up variables and constraints for SDP:
y_var = picos.HermitianVariable("Y", (dim, dim))
problem.add_list_of_constraints(
[y_var >> probs[i] * vector_to_density_matrix(vector) for i, vector in enumerate(vectors)]
[y_var >> probs[i] * to_density_matrix(vector) for i, vector in enumerate(vectors)]
)

# Objective function:
Expand Down
10 changes: 5 additions & 5 deletions toqito/state_opt/state_exclusion.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import picos

from toqito.matrix_ops import calculate_vector_matrix_dimension, vector_to_density_matrix, vectors_to_gram_matrix
from toqito.matrix_ops import calculate_vector_matrix_dimension, to_density_matrix, vectors_to_gram_matrix
from toqito.matrix_props import has_same_dimension


Expand Down Expand Up @@ -185,7 +185,7 @@ def _min_error_primal(
problem.add_list_of_constraints([meas >> 0 for meas in measurements])
problem.add_constraint(picos.sum(measurements) == picos.I(dim))

dms = [vector_to_density_matrix(vector) for vector in vectors]
dms = [to_density_matrix(vector) for vector in vectors]
# # Numerical inaccuracies can make it so the trace of the density matrices aren't unital, which messes up with
# # cvxopt
# dms = [state / np.trace(state) for state in dms]
Expand All @@ -209,7 +209,7 @@ def _min_error_dual(
# Set up variables and constraints for SDP:
y_var = picos.HermitianVariable("Y", (dim, dim))
problem.add_list_of_constraints(
[y_var << probs[i] * vector_to_density_matrix(vector) for i, vector in enumerate(vectors)]
[y_var << probs[i] * to_density_matrix(vector) for i, vector in enumerate(vectors)]
)

# Objective function:
Expand Down Expand Up @@ -239,7 +239,7 @@ def _unambiguous_primal(
problem.add_list_of_constraints([meas >> 0 for meas in measurements])
problem.add_constraint(inconclusive_measurement >> 0)

unnormalized_dms = [p * vector_to_density_matrix(vector) for (p, vector) in zip(probs, vectors)]
unnormalized_dms = [p * to_density_matrix(vector) for (p, vector) in zip(probs, vectors)]
sums_of_unnormalized_dms = picos.sum(unnormalized_dms)

problem.add_list_of_constraints(m | rho == 0 for (m, rho) in zip(measurements, unnormalized_dms))
Expand Down Expand Up @@ -268,7 +268,7 @@ def _unambiguous_dual(

problem.add_constraint(lagrangian_variable_big_n >> 0)

dms = [vector_to_density_matrix(vector) for (p, vector) in zip(probs, vectors)]
dms = [to_density_matrix(vector) for (p, vector) in zip(probs, vectors)]
unnormalized_dms = [proba * rho for (proba, rho) in zip(probs, dms)]
sum_of_unnormalized_dms = picos.sum(unnormalized_dms)

Expand Down
4 changes: 2 additions & 2 deletions toqito/state_opt/tests/test_state_distinguishability.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pytest

from toqito.matrices import standard_basis
from toqito.matrix_ops import vector_to_density_matrix
from toqito.matrix_ops import to_density_matrix
from toqito.state_opt import state_distinguishability
from toqito.states import bb84, bell

Expand All @@ -14,7 +14,7 @@
# Bell states (should be perfectly distinguishable)
([bell(0), bell(1), bell(2), bell(3)], 1),
# Bell states as density matrices
([vector_to_density_matrix(bell(i)) for i in range(4)], 1),
([to_density_matrix(bell(i)) for i in range(4)], 1),
# BB84 states
(bb84()[0] + bb84()[1], .5),
]
Expand Down
10 changes: 5 additions & 5 deletions toqito/state_opt/tests/test_state_exclusion.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pytest

from toqito.matrices import standard_basis
from toqito.state_ops import pure_to_mixed
from toqito.matrix_ops import to_density_matrix
from toqito.state_opt import state_exclusion
from toqito.states import bell

Expand All @@ -14,8 +14,8 @@
# Bell states are perfectly distinguishable, so the probability of error should be nil
([bell(0), bell(1), bell(2), bell(3)], None, 0, {}),
([bell(0), bell(1), bell(2), bell(3)], [1 / 4, 1 / 4, 1 / 4, 1 / 4], 0, {}),
([pure_to_mixed(bell(0)), pure_to_mixed(bell(1))], None, 0, {"cvxopt_kktsolver": "ldl"}),
([pure_to_mixed(bell(0)), pure_to_mixed(bell(1))], [1 / 2, 1 / 2], 0, {"cvxopt_kktsolver": "ldl"}),
([to_density_matrix(bell(0)), to_density_matrix(bell(1))], None, 0, {"cvxopt_kktsolver": "ldl"}),
([to_density_matrix(bell(0)), to_density_matrix(bell(1))], [1 / 2, 1 / 2], 0, {"cvxopt_kktsolver": "ldl"}),
# For |0> and |+>, this probability is 1/2 - 1/(2*sqrt(2))
(
[np.array([[1.], [0.]]), np.array([[1.], [1.]]) / np.sqrt(2)],
Expand All @@ -35,8 +35,8 @@
# Bell states are perfectly distinguishable, so the probability of error should be nil
([bell(0), bell(1), bell(2), bell(3)], None, 0, {}),
([bell(0), bell(1), bell(2), bell(3)], [1 / 4, 1 / 4, 1 / 4, 1 / 4], 0, {}),
([pure_to_mixed(bell(0)), pure_to_mixed(bell(1))], None, 0, {}),
([pure_to_mixed(bell(0)), pure_to_mixed(bell(1))], [1 / 2, 1 / 2], 0, {}),
([to_density_matrix(bell(0)), to_density_matrix(bell(1))], None, 0, {}),
([to_density_matrix(bell(0)), to_density_matrix(bell(1))], [1 / 2, 1 / 2], 0, {}),
# For |0> and |+>, this probability is 1/sqrt(2)
(
[np.array([[1.], [0.]]), np.array([[1.], [1.]]) / np.sqrt(2)],
Expand Down
4 changes: 2 additions & 2 deletions toqito/state_props/l1_norm_coherence.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import numpy as np

from toqito.state_ops import pure_to_mixed
from toqito.matrix_ops import to_density_matrix


def l1_norm_coherence(rho: np.ndarray) -> float:
Expand Down Expand Up @@ -49,5 +49,5 @@ def l1_norm_coherence(rho: np.ndarray) -> float:
:return: The l1-norm coherence of :code:`rho`.
"""
rho = pure_to_mixed(rho)
rho = to_density_matrix(rho)
return np.sum(np.sum(np.abs(rho))) - np.trace(rho)
4 changes: 2 additions & 2 deletions toqito/state_props/log_negativity.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
from picos import partial_transpose

from toqito.state_ops import pure_to_mixed
from toqito.matrix_ops import to_density_matrix


def log_negativity(rho: np.ndarray, dim: list[int] | int = None) -> float:
Expand Down Expand Up @@ -46,7 +46,7 @@ def log_negativity(rho: np.ndarray, dim: list[int] | int = None) -> float:
"""
# Allow the user to input either a pure state vector or a density matrix.
rho = pure_to_mixed(rho)
rho = to_density_matrix(rho)
rho_dims = rho.shape
round_dim = np.round(np.sqrt(rho_dims))

Expand Down
4 changes: 2 additions & 2 deletions toqito/state_props/negativity.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
from picos import partial_transpose

from toqito.state_ops import pure_to_mixed
from toqito.matrix_ops import to_density_matrix


def negativity(rho: np.ndarray, dim: list[int] | int = None) -> float:
Expand Down Expand Up @@ -47,7 +47,7 @@ def negativity(rho: np.ndarray, dim: list[int] | int = None) -> float:
"""
# Allow the user to input either a pure state vector or a density matrix.
rho = pure_to_mixed(rho)
rho = to_density_matrix(rho)
rho_dims = rho.shape
round_dim = np.round(np.sqrt(rho_dims))

Expand Down

0 comments on commit 2f9602f

Please sign in to comment.