B
    3Rc                 @   sH   d dl Z d dlZd dlmZ G dd deZdddZedkrDe  dS )	    N)DataStructsc               @   s   e Zd ZdZdd Zdd ZeeZdd Zdd	 Z	d
d Z
dd Zdd ZeZdd ZeZdd Zdd Zdd Zd ddZdd Zdd ZdS )!VectCollectionaj	  

    >>> vc = VectCollection()
    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((1,3,5))
    >>> vc.AddVect(1,bv1)
    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((6,8))
    >>> vc.AddVect(2,bv1)
    >>> len(vc)
    10
    >>> vc.GetNumBits()
    10
    >>> vc[0]
    0
    >>> vc[1]
    1
    >>> vc[9]
    0
    >>> vc[6]
    1
    >>> vc.GetBit(6)
    1
    >>> list(vc.GetOnBits())
    [1, 3, 5, 6, 8]

    keys must be unique, so adding a duplicate replaces the
    previous values:

    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((7,9))
    >>> vc.AddVect(1,bv1)
    >>> len(vc)
    10
    >>> vc[1]
    0
    >>> vc[9]
    1
    >>> vc[6]
    1

    we can also query the children:

    >>> vc.NumChildren()
    2
    >>> cs = vc.GetChildren()
    >>> id,fp = cs[0]
    >>> id
    1
    >>> list(fp.GetOnBits())
    [7, 9]
    >>> id,fp = cs[1]
    >>> id
    2
    >>> list(fp.GetOnBits())
    [6, 8]

    attach/detach operations:

    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((5,6))
    >>> vc.AddVect(3,bv1)
    >>> vc.NumChildren()
    3
    >>> list(vc.GetOnBits())
    [5, 6, 7, 8, 9]
    >>> vc.DetachVectsNotMatchingBit(6)
    >>> vc.NumChildren()
    2
    >>> list(vc.GetOnBits())
    [5, 6, 8]


    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((7,9))
    >>> vc.AddVect(1,bv1)
    >>> vc.NumChildren()
    3
    >>> list(vc.GetOnBits())
    [5, 6, 7, 8, 9]
    >>> vc.DetachVectsMatchingBit(6)
    >>> vc.NumChildren()
    1
    >>> list(vc.GetOnBits())
    [7, 9]


    to copy VectCollections, use the copy module:

    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((5,6))
    >>> vc.AddVect(3,bv1)
    >>> list(vc.GetOnBits())
    [5, 6, 7, 9]
    >>> vc2 = copy.copy(vc)
    >>> vc.DetachVectsNotMatchingBit(6)
    >>> list(vc.GetOnBits())
    [5, 6]
    >>> list(vc2.GetOnBits())
    [5, 6, 7, 9]

    The Uniquify() method can be used to remove duplicate vectors:

    >>> vc = VectCollection()
    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((7,9))
    >>> vc.AddVect(1,bv1)
    >>> vc.AddVect(2,bv1)
    >>> bv1 = DataStructs.ExplicitBitVect(10)
    >>> bv1.SetBitsFromList((2,3,5))
    >>> vc.AddVect(3,bv1)
    >>> vc.NumChildren()
    3
    >>> vc.Uniquify()
    >>> vc.NumChildren()
    2


    c             C   s   i | _ d | _d| _d| _d S )NT)_VectCollection__vects_VectCollection__orVect_VectCollection__numBits_VectCollection__needReset)self r
   ?lib/python3.7/site-packages/rdkit/DataStructs/VectCollection.py__init__   s    zVectCollection.__init__c             C   s   | j r|   | jS )N)r   Resetr   )r	   r
   r
   r   	GetOrVect   s    zVectCollection.GetOrVectc             C   s   || j |< d| _d S )NT)r   r   )r	   idxZvectr
   r
   r   AddVect   s    
zVectCollection.AddVectc             C   s   | j s
d S d | _| jsd S tt| j}t| j|d  | _| j | _x.tdt	|D ]}|  j| j||  O  _qZW d| _ d S )Nr      F)
r   r   r   listitercopy
GetNumBitsr   rangelen)r	   Zksir
   r
   r   r      s    zVectCollection.Resetc             C   s   t | j S )N)r   r   keys)r	   r
   r
   r   NumChildren   s    zVectCollection.NumChildrenc             C   s   t | j S )N)tupler   items)r	   r
   r
   r   GetChildren   s    zVectCollection.GetChildrenc             C   s   | j r|   | j|S )N)r   r   r   GetBit)r	   r   r
   r
   r   __getitem__   s    zVectCollection.__getitem__c             C   s   | j r|   | jS )N)r   r   r   )r	   r
   r
   r   __len__   s    zVectCollection.__len__c             C   s   | j r|   | j S )N)r   r   r   	GetOnBits)r	   r
   r
   r   r!      s    zVectCollection.GetOnBitsc             C   s<   t | j }x(|D ] \}}||s| j|= d| _qW d S )NT)r   r   r   r   r   )r	   bitr   kvr
   r
   r   DetachVectsNotMatchingBit   s
    
z(VectCollection.DetachVectsNotMatchingBitc             C   s<   t | j }x(|D ] \}}||r| j|= d| _qW d S )NT)r   r   r   r   r   )r	   r"   r   r#   r$   r
   r
   r   DetachVectsMatchingBit   s
    
z%VectCollection.DetachVectsMatchingBitFc             C   s  i }x&| j  D ]\}}t| ||< qW t| j  }t|}t| j  }xtt|D ]h}|| }	|	|krZ||	 }
||	}x@t|d |D ].}|| }||kr|| }|
|kr|| qW qZW d| _	i }x|D ]}| j | ||< qW |r
t
dt| j dt| || _ d S )Nr   Tz	uniquify:z->)r   r   r   r!   r   r   r   indexremoveZ_VectCollection__needsResetprint)r	   verboseZoblsr#   r$   r   ZnKeysZkeepr   Zk1Zobl1r   jZk2Zobl2Ztmpr
   r
   r   Uniquify   s0    

zVectCollection.Uniquifyc             C   sr   t dt| j}xZ| j D ]L\}}|t d|7 }| }t|}|t d|7 }|t d| |7 }qW |S )Nz<Iz%ds)structZpackr   r   r   ZToBinary)r	   pklr#   r$   plr
   r
   r   __getstate__   s    zVectCollection.__getstate__c       
   
   C   s  t |trt|dd}i | _d | _d| _d| _td}d}t	d||||  d }||7 }xt
|D ]}t	d||||  d }||7 }t	d||||  d }||7 }td| }tt	d| ||||  d }	||7 }| ||	 qjW d S )	NZLatin1)encodingr   TIr   z<Iz%ds)
isinstancestrbytesr   r   r   r   r-   ZcalcsizeZunpackr   r   ZExplicitBitVectr   )
r	   r.   ZszIoffsetZnToRead_r#   r0   ZszZbvr
   r
   r   __setstate__   s&    

&zVectCollection.__setstate__N)F)__name__
__module____qualname____doc__r   r   propertyZorVectr   r   r   r   r   r   r    r   r!   r%   r&   r,   r1   r9   r
   r
   r
   r   r      s$   w

r   c             C   s2   dd l }dd l}|j|j| d\}}|| d S )Nr   )Zoptionflagsr*   )sysdoctestZtestmodELLIPSISexit)r*   r?   r@   Zfailedr8   r
   r
   r   _runDoctests  s    rC   __main__)N)r   r-   Zrdkitr   objectr   rC   r:   r
   r
   r
   r   <module>   s     
