o
    ¦³ücÆ  ã                   @   s²   d dl Z d dlZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ	G dd„ deƒZ
G dd„ deƒZdS )é    Nc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚGridz  Interface of an abstract grid. c           
      C   s¼   |d | _ || _t|d ƒ| _tƒ | _|D ]@}ttt |¡ƒƒ}t	t|ƒd ƒD ],}t 
t	t|ƒƒ|¡D ]}|D ]}t|ƒ}|D ]	}	||	  ||	< q@| j t|ƒ¡ q8q4q(qt| jƒ| _dS )zÎ
        salt -- additional integer input to the oracle
        probability -- probability of each edge to be kept in a subgraph of a grid
        directions -- list of all neighbours of the origin
        l   ³iX r   é   N)ÚsaltÚprobabilityÚlenZ	dimensionÚsetÚ
directionsÚlistÚ	itertoolsÚpermutationsÚrangeÚcombinationsÚaddÚtuple)
Úselfr   r   r   ÚdÚpermÚnÚcÚpÚi© r   úRC:\Users\mikol\Documents\MFF-PRG\LS2023\UdAI\working\01-a_star_heuristic\graphs.pyÚ__init__   s"   
üÿÿzGrid.__init__c                 C   sZ   ||k r	||}}d}|d }||fD ]}|D ]}|| j  | | }qqt|ƒ| j| k S )z¾
            Determine whether a given two vertices are connected by an edge in a subgraph.
            Vertices must be adjacent in whole grid which is not tested since it is slow.
        iÿÿÿé   )r   Úabsr   )r   ÚuÚvÚprimeÚaccÚxÚyr   r   r   Úoracle   s   
ÿzGrid.oraclec                    s(   ‡fdd„ˆ j D ƒ}‡ ‡fdd„|D ƒS )z4 Return a list of all neighbours of a given vertex. c                    s$   g | ]}t d d„ tˆ |ƒD ƒƒ‘qS )c                 s   s    | ]	\}}|| V  qd S )Nr   )Ú.0ÚaÚbr   r   r   Ú	<genexpr>/   s   € z-Grid.neighbours.<locals>.<listcomp>.<genexpr>)r   Úzip)r#   r   )Úvertexr   r   Ú
<listcomp>/   s   $ z#Grid.neighbours.<locals>.<listcomp>c                    s   g | ]
}ˆ   ˆ|¡r|‘qS r   )r"   )r#   r   ©r   r(   r   r   r)   0   s    )r   )r   r(   Zgrid_neighboursr   r*   r   Ú
neighbours-   s   zGrid.neighboursN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r+   r   r   r   r   r      s
    r   c                       ó   e Zd Z‡ fdd„Z‡  ZS )ÚGrid2Dc                    ó   t ƒ  ||ddgg¡ d S ©Nr   r   ©Úsuperr   ©r   r   r   ©Ú	__class__r   r   r   6   ó   zGrid2D.__init__©r,   r-   r.   r   Ú__classcell__r   r   r7   r   r1   5   ó    r1   c                       r0   )ÚGridDiagonal2Dc                    s    t ƒ  ||ddgddgg¡ d S r3   r4   r6   r7   r   r   r   :   ó    zGridDiagonal2D.__init__r:   r   r   r7   r   r=   9   r<   r=   c                       r0   )Ú
GridRook2Dc                    ó"   t ƒ  ||dd„ tdƒD ƒ¡ d S )Nc                 S   s   g | ]}d |d g‘qS )r   r   r   )r#   r   r   r   r   r)   ?   s    z'GridRook2D.__init__.<locals>.<listcomp>é   ©r5   r   r   r6   r7   r   r   r   >   ó   "zGridRook2D.__init__r:   r   r   r7   r   r?   =   r<   r?   c                       r0   )ÚGridQueen2Dc                    r@   )Nc                 S   s.   g | ]}t d ƒD ]}|d |d | g‘qqS )r   r   ©r   ©r#   r   Újr   r   r   r)   C   s   . z(GridQueen2D.__init__.<locals>.<listcomp>rA   rB   r6   r7   r   r   r   B   rC   zGridQueen2D.__init__r:   r   r   r7   r   rD   A   r<   rD   c                       r0   )ÚGridGreatKing2Dc                    r@   )Nc                 S   s*   g | ]}t d ƒD ]
}|d |d g‘qqS )rA   r   rE   rF   r   r   r   r)   G   s   * z,GridGreatKing2D.__init__.<locals>.<listcomp>rA   rB   r6   r7   r   r   r   F   rC   zGridGreatKing2D.__init__r:   r   r   r7   r   rH   E   r<   rH   c                       r0   )ÚGridJumper2Dc                    r2   )Nr   é   r4   r6   r7   r   r   r   J   r9   zGridJumper2D.__init__r:   r   r   r7   r   rI   I   r<   rI   c                       r0   )ÚGrid3Dc                    s   t ƒ  ||g d¢g¡ d S )N©r   r   r   r4   r6   r7   r   r   r   N   r9   zGrid3D.__init__r:   r   r   r7   r   rK   M   r<   rK   c                       r0   )ÚGridFaceDiagonal3Dc                    s    t ƒ  ||g d¢g d¢g¡ d S )NrL   ©r   r   r   r4   r6   r7   r   r   r   R   r>   zGridFaceDiagonal3D.__init__r:   r   r   r7   r   rM   Q   r<   rM   c                       r0   )ÚGridAllDiagonal3Dc                    s&   t ƒ  ||g d¢g d¢g d¢g¡ d S )NrL   rN   )r   r   r   r4   r6   r7   r   r   r   V   s   &zGridAllDiagonal3D.__init__r:   r   r   r7   r   rO   U   r<   rO   )Úsysr
   r   r1   r=   r?   rD   rH   rI   rK   rM   rO   r   r   r   r   Ú<module>   s    1