You're reading the documentation of the v0.9. For the latest released version, please have a look at v0.12.
PostSelect
- class perceval.utils.postselect.PostSelect
PostSelect is a callable basic state predicate intended to filter out unwanted basic states. It is designed to be a user-friendly description of any post-selection logic.
- Parameters:
expression (str) – PostSelect string representation of the post-selection logic.
PostSelect Syntax
Condition
Condition syntax is [mode list] <operator> <photon count>
PostSelect expression is always composed of at least one condition.
- Mode list:
string that represented a list[int]
should be a set of positive integer
- Operator:
string that represent an operator.
- Operator within a condition can be:
Equal: “==”
Greater than: “>”
Greater or equal to: “>=”
Less than: “<”
Less or equal to: “<=”
- Photon count:
string that represent a non-negative integer
Logic operators
Within a PostSelect expression, several conditions can be composed with operators, grouped (with parenthesis) and even nested.
Condition(s) composed with an operator will is consider as a condition group.
- Available logic operators are:
- AND:
can compose 2 or more condition groups
- possible string representation:
“AND”
“and”
“&” (default serialization string representation)
- OR:
can compose 2 or more condition groups
- possible string representation:
“OR”
“or”
“|” (default serialization string representation)
- XOR:
can compose 2 or more condition groups
- possible string representation:
“XOR”
“xor”
“^” (default serialization string representation)
- NOT:
can be used in front of a condition group
- possible string representation:
“NOT”
“not”
“!” (default serialization string representation)
Different operators cannot be used within the same condition group, parenthesis are necessary in order to explicit resolution order.
Examples
>>> ps = PostSelect("[0,1] == 1 & [2] > 1") # Means "I want exactly one photon in mode 0 or 1, and at least one photon in mode 2" >>> print(ps(BasicState([0, 1, 2]))) True >>> print(ps(BasicState([0, 1, 0]))) False >>> print(ps(BasicState([1, 1, 2]))) False
>>> ps = PostSelect("([0,1] == 1 & [2] > 1) | [2] == 0") # Means "I want either exactly one photon in mode 0 or 1, and at least one photon in mode 2, or no photon in mode 2" >>> print(ps(BasicState([0, 1, 1]))) False >>> print(ps(BasicState([0, 1, 0]))) True >>> print(ps(BasicState([1, 1, 2]))) False
- __call__(state)
Return whether a state validates the defined post-selection logic.
- Parameters:
state (
FockState
) – Basic state to post select- Return type:
bool
- Returns:
Returns True if the input state validates the defined post-selection logic, returns False otherwise.
- apply_permutation(perm_vector, first_mode=0)
Apply a given permutation on the conditions. Updates the current instance.
- Parameters:
perm_vector (
list
[int
]) – Permutation vector to apply (as returned by PERM.perm_vector)first_mode (
int
) – First mode to apply the permutation on (default 0)
- can_compose_with(modes)
Check if all conditions are compatible with a composition on given modes.
Compatible means that modes list is either a subset, or doesn’t intersect with any mode list of any conditions.
- Parameters:
modes (
list
[int
]) – Mode list to check compatibility- Return type:
bool
- Returns:
True if the mode list is compatible, False otherwise
- clear()
Clear all existing conditions
- Return type:
None
- property has_condition: bool
Returns True if at least one condition is defined
- is_independent_with(other)
Check if other PostSelect instance is independent with current one.
Independent means that current and other instances does not share any modes within their conditions.
- Parameters:
other (
PostSelect
) – Another PostSelect instance- Return type:
bool
- Returns:
True if current and other instances are independent, False otherwise
- merge(other)
Merge other PostSelect with an AND operator. Updates the current instance.
- Parameters:
other (
PostSelect
) – Another PostSelect instance
- shift_modes(shift)
Shift all mode indexes on all conditions. Updates the current instance.
- Parameters:
shift (
int
) – Value to shift all mode indexes with