
    \h[%                     T   S r SSKJrJrJrJrJrJrJr  SSK	J
r
  SSKJrJrJr  SSKJrJrJrJrJrJrJr  SS/r\\" \\45      \\" \\45      \\" \\45      \\
\\" \\\45      \\\\0r\R5                  5        V Vs0 s H  u  pX_M	     snn rS rS	 rS
 rS rS r S r!gs  snn f )a  A module for mapping operators to their corresponding eigenstates
and vice versa

It contains a global dictionary with eigenstate-operator pairings.
If a new state-operator pair is created, this dictionary should be
updated as well.

It also contains functions operators_to_state and state_to_operators
for mapping between the two. These can handle both classes and
instances of operators and states. See the individual function
descriptions for details.

TODO List:
- Update the dictionary with a complete list of state-operator pairs
    )XOpYOpZOpXKetPxOpPxKetPositionKet3D)Operator)	StateBaseBraBaseKet)JxOpJyOpJzOpJ2OpJxKetJyKetJzKetoperators_to_statestate_to_operatorsc                 z   [        U [        [        45      (       d   [        U [        5      (       d  [	        S5      e[        U [        5      (       a  U  H:  n[        U[        5      (       a  M  [        U[        5      (       a  M1  [	        S5      e   [        U 5      nU[        ;   a6   U Vs/ s H	  oD" 5       PM     nn[        [        U   [        U5      40 UD6nU$ U Vs/ s H  n[        U5      PM     nn[        U5      n	U	[        ;   a  [        [        U	   U40 UD6nU$ SnU$ U [        ;   a   U " 5       n
[        [        U    U
40 UD6nU$ [        U 5      [        ;   a  [        [        [        U 5         U 40 UD6$ gs  snf ! [         a    [        U   n U$ f = fs  snf ! [         a    [        U    n U$ f = f)a  Returns the eigenstate of the given operator or set of operators

A global function for mapping operator classes to their associated
states. It takes either an Operator or a set of operators and
returns the state associated with these.

This function can handle both instances of a given operator or
just the class itself (i.e. both XOp() and XOp)

There are multiple use cases to consider:

1) A class or set of classes is passed: First, we try to
instantiate default instances for these operators. If this fails,
then the class is simply returned. If we succeed in instantiating
default instances, then we try to call state._operators_to_state
on the operator instances. If this fails, the class is returned.
Otherwise, the instance returned by _operators_to_state is returned.

2) An instance or set of instances is passed: In this case,
state._operators_to_state is called on the instances passed. If
this fails, a state class is returned. If the method returns an
instance, that instance is returned.

In both cases, if the operator class or set does not exist in the
state_mapping dictionary, None is returned.

Parameters
==========

arg: Operator or set
     The class or instance of the operator or set of operators
     to be mapped to a state

Examples
========

>>> from sympy.physics.quantum.cartesian import XOp, PxOp
>>> from sympy.physics.quantum.operatorset import operators_to_state
>>> from sympy.physics.quantum.operator import Operator
>>> operators_to_state(XOp)
|x>
>>> operators_to_state(XOp())
|x>
>>> operators_to_state(PxOp)
|px>
>>> operators_to_state(PxOp())
|px>
>>> operators_to_state(Operator)
|psi>
>>> operators_to_state(Operator())
|psi>
z%Argument is not an Operator or a set!zSet is not all Operators!N)	
isinstancer
   set
issubclassNotImplementedError	frozenset
op_mapping
_get_statetype)	operatorsoptionssopsopop_instancesretotmpclassesop_instances              Y/var/www/auris/envauris/lib/python3.13/site-packages/sympy/physics/quantum/operatorset.pyr   r   /   s   l y8S/22jH6U6U!"IJJ)S!!Aq(++ H--)*EFF 
 	"*&/23ss3 C#l2COwO J$'(Cq47CC(nG*$ G!4cEWE J J
",'k I!6OwO J)_
*ji99PPP9  4& & oJ&
 ) ' , +J,s<   'F +E?;F  F1F# ?F FF#F:9F:c           	      r   [        U [        5      (       d   [        U [        5      (       d  [        S5      eU [        ;   a*  [        U 5      n [        U[        [        U    5      40 UD6nO[        U 5      [        ;   a'  [        U [        [        [        U 5         5      40 UD6nO[        U [        5      (       aC  U R                  5       [        ;   a+  [        U [        [        U R                  5          5      5      nOf[        U [        5      (       aO  U R                  5       [        ;   a7  [        U 5      n [        U[        [        U R                  5          5      5      nOSn[        U5      $ ! [        [        4 a    [        U    n N&f = f! [        [        4 a    [        U R                  5          n NSf = f)a  Returns the operator or set of operators corresponding to the
given eigenstate

A global function for mapping state classes to their associated
operators or sets of operators. It takes either a state class
or instance.

This function can handle both instances of a given state or just
the class itself (i.e. both XKet() and XKet)

There are multiple use cases to consider:

1) A state class is passed: In this case, we first try
instantiating a default instance of the class. If this succeeds,
then we try to call state._state_to_operators on that instance.
If the creation of the default instance or if the calling of
_state_to_operators fails, then either an operator class or set of
operator classes is returned. Otherwise, the appropriate
operator instances are returned.

2) A state instance is returned: Here, state._state_to_operators
is called for the instance. If this fails, then a class or set of
operator classes is returned. Otherwise, the instances are returned.

In either case, if the state's class does not exist in
state_mapping, None is returned.

Parameters
==========

arg: StateBase class or instance (or subclasses)
     The class or instance of the state to be mapped to an
     operator or set of operators

Examples
========

>>> from sympy.physics.quantum.cartesian import XKet, PxKet, XBra, PxBra
>>> from sympy.physics.quantum.operatorset import state_to_operators
>>> from sympy.physics.quantum.state import Ket, Bra
>>> state_to_operators(XKet)
X
>>> state_to_operators(XKet())
X
>>> state_to_operators(PxKet)
Px
>>> state_to_operators(PxKet())
Px
>>> state_to_operators(PxBra)
Px
>>> state_to_operators(XBra)
X
>>> state_to_operators(Ket)
O
>>> state_to_operators(Bra)
O
zArgument is not a state!N)r   r   r   r   state_mapping_make_default_get_ops	_make_set	TypeErrorr   r   
dual_class)stater!   
state_instr&   s       r+   r   r      s   v ui((Jui,H,H!"<=="5)
	':$]5%9:G>EGC 
e	%u tE{!;<I@GI	E7	#	#(8(8(:m(Ku u/?/?/A!BCE	E7	#	#(8(8(:m(K"5)
	4:$]53C3C3E%FGIC
 S>% $Y/ 	'&C	' $Y/ 	4 0 0 23C	4s$   E- 5*F -F	F	'F65F6c                 <     U " 5       nU$ ! [          a    U n U$ f = fN)r1   )exprr&   s     r+   r.   r.      s0    f J  Js    c                 f     U R                   " U40 UD6nU$ ! [         a    [        U 5      n U$ f = fr6   )_operators_to_stater   r.   )state_classr#   r!   r&   s       r+   r   r      sC    )--c=W= J  )K(J)s    00c                     U R                   " U40 UD6n[        U[        5      (       a  [        U5      S:X  a  US   $ U$ ! [         aB    [        U[        [        [
        45      (       a  [	        S U 5       5      n Ni[        U5      n Nvf = f)Nc              3   8   #    U  H  n[        U5      v   M     g 7fr6   )r.   ).0xs     r+   	<genexpr>_get_ops.<locals>.<genexpr>	  s     =*Qa((*s      r   )_state_to_operatorsr   r   r   tupler   r.   len)r4   
op_classesr!   r&   s       r+   r/   r/     s    ,,,ZC7C #sCA1vJ  ,j3y"9::=*==C
+C	,s   A   <B>BBc                 \    [        U [        [        [        45      (       a  [	        U 5      $ U $ r6   )r   rC   listr   r   )r#   s    r+   r0   r0     s$    #tY/003x
    N)"__doc__sympy.physics.quantum.cartesianr   r   r   r   r   r   r	   sympy.physics.quantum.operatorr
   sympy.physics.quantum.stater   r   r   sympy.physics.quantum.spinr   r   r   r   r   r   r   __all__r   r-   itemsr   r   r   r.   r   r/   r0   )kvs   00r+   <module>rR      s    < < < 3 ? ?/ / /  D$<0D$<0D$<0xCc?!;  -22454tqad45
aHUp	"O 6s   ?B$