a
     ¬<b  ã                   @   s`   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 ddl
mZmZ G dd	„ d	eƒZd
S )é    )Ú
_sympifyit)Úglobal_parameters)Ú
fuzzy_bool)ÚS)Ú_sympifyé   )ÚSetÚ	FiniteSetc                       s`   e Zd ZdZd‡ fdd„	Zedd„ ƒZdd„ Zed	e	ƒd
d„ ƒZ
dd„ Zdd„ Zdd„ Z‡  ZS )ÚPowerSetaE  A symbolic object representing a power set.

    Parameters
    ==========

    arg : Set
        The set to take power of.

    evaluate : bool
        The flag to control evaluation.

        If the evaluation is disabled for finite sets, it can take
        advantage of using subset test as a membership test.

    Notes
    =====

    Power set `\mathcal{P}(S)` is defined as a set containing all the
    subsets of `S`.

    If the set `S` is a finite set, its power set would have
    `2^{\left| S \right|}` elements, where `\left| S \right|` denotes
    the cardinality of `S`.

    Examples
    ========

    >>> from sympy import PowerSet, S, FiniteSet

    A power set of a finite set:

    >>> PowerSet(FiniteSet(1, 2, 3))
    PowerSet({1, 2, 3})

    A power set of an empty set:

    >>> PowerSet(S.EmptySet)
    PowerSet(EmptySet)
    >>> PowerSet(PowerSet(S.EmptySet))
    PowerSet(PowerSet(EmptySet))

    A power set of an infinite set:

    >>> PowerSet(S.Reals)
    PowerSet(Reals)

    Evaluating the power set of a finite set to its explicit form:

    >>> PowerSet(FiniteSet(1, 2, 3)).rewrite(FiniteSet)
    FiniteSet(EmptySet, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3})

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Power_set

    .. [2] https://en.wikipedia.org/wiki/Axiom_of_power_set
    Nc                    s<   |d u rt j}t|ƒ}t|tƒs.td |¡ƒ‚tƒ  | |¡S )Nz{} must be a set.)	r   Úevaluater   Ú
isinstancer   Ú
ValueErrorÚformatÚsuperÚ__new__)ÚclsÚargr   ©Ú	__class__© úc/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/sets/powerset.pyr   E   s    
zPowerSet.__new__c                 C   s
   | j d S )Nr   )Úargs©Úselfr   r   r   r   P   s    zPowerSet.argc                 O   s   | j }|jr| ¡ S d S ©N)r   Zis_FiniteSetZpowerset)r   r   Úkwargsr   r   r   r   Ú_eval_rewrite_as_FiniteSetT   s    z#PowerSet._eval_rewrite_as_FiniteSetÚotherc                 C   s   t |tƒsd S t| j |¡ƒS r   )r   r   r   r   Zis_superset©r   r   r   r   r   Ú	_containsZ   s    
zPowerSet._containsc                 C   s   t |tƒr| j |j¡S d S r   )r   r
   r   Z	is_subsetr   r   r   r   Ú_eval_is_subseta   s    
zPowerSet._eval_is_subsetc                 C   s   dt | jƒ S )Né   )Úlenr   r   r   r   r   Ú__len__e   s    zPowerSet.__len__c                 c   sX   t jg}t jV  | jD ]<}g }t|ƒ}|D ]}|| }|V  | |¡ q*| |¡ qd S r   )r   ZEmptySetr   r	   ÚappendÚextend)r   ÚfoundÚxÚtempÚyÚnewr   r   r   Ú__iter__h   s    
zPowerSet.__iter__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r   ÚNotImplementedr   r    r#   r+   Ú__classcell__r   r   r   r   r
   
   s   :

r
   N)Zsympy.core.decoratorsr   Zsympy.core.parametersr   Zsympy.core.logicr   Zsympy.core.singletonr   Zsympy.core.sympifyr   Zsetsr   r	   r
   r   r   r   r   Ú<module>   s   