o
    ~*d)                     @   s<   d dl Z d dlmZmZmZ d dlZdZ	 G dd dZdS )    N)UNKNOWNMINEget_neighborsFc                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )Playerc                 C   s   || _ || _|| _|| _t||| _t||fd| _t||fd| _	t
| j D ]}t
| jD ]}t| j||f | j	||f< q0q)t | _d S )Nr   )rowscolumnsmine_prbgamer   	neighborsnumpyfullminesunknownrangelensetinvalid)selfr   r   r
   r	   ij r   eC:\Users\mikol\Documents\MFF-PRG\LS2023\UdAI\working\05-probability_minesweeper\minesweeper_player.py__init__   s   zPlayer.__init__c                 C   s"   |   }|s
|  }| | |S N)preprocessingprobability_playerinvalidate_with_neighborsr   posr   r   r   turn1   s
   
zPlayer.turnc                 C   s   |   }d}t| jD ];}t| jD ]3}| j||f tkrE|||f dkr3t| j||f< | ||f ||||f krE|||f }||f}qq|S )N   gH.?)get_each_mine_probabilityr   r   r   r
   r   r   r   )r   prbZmin_prbr   r   Zbest_positionr   r   r   r   9   s   zPlayer.probability_playerc                 C   s,   | j | | j| D ]}| j | qd S r   )r   addr   )r   r   neighr   r   r   r   H   s   z Player.invalidate_with_neighborsc                    s6   t  fddt jD  _  }|d ksJ d S )Nc                 3   s(    | ]}t  jD ]}||fV  q	qd S r   )r   r   ).0r   r   r   r   r   	<genexpr>P   s   & z(Player.preprocess_all.<locals>.<genexpr>)r   r   r   r   r   r   r   r'   r   preprocess_allN   s   zPlayer.preprocess_allc              	      s   j r j  }t fdd j| D  j|<  j| dkr j| t fdd j| D   j|< d j| krG j|  j| ksIJ  j| dkr j|  j| krt j| D ]} j| tkrrt j|<  	| q_n" j| dkr j 
|  j| D ]} j| tkr|  S qJ  j stsdS t jD ]L}t jD ]D} j||f t fdd j||f D ksJ  j||f dkr j||f  j||f t fdd j||f D  ksJ qqdS )	a3  
            Update precomputed information of cells in the set self.invalid.
            Using a simple counting, check cells which have to contain a mine.
            If this simple counting finds a cell which cannot contain a mine, then returns its position.
            Otherwise, returns None.
        c                 3   &    | ]} j | tkrd ndV  qdS r!   r   Nr
   r   r&   r%   r'   r   r   r(   _      $ z'Player.preprocessing.<locals>.<genexpr>r   c                 3   r*   r+   r
   r   r-   r'   r   r   r(   c   r.   FNc                 3   r*   r+   r,   r-   r'   r   r   r(   }   r.   c                 3   r*   r+   r/   r-   r'   r   r   r(      r.   )r   popsumr   r   r
   r   r   r   r   r$   	RUN_TESTSr   r   r   )r   r   r%   r   r   r   r'   r   r   T   s@   
",&

2@zPlayer.preprocessingc                 C   sf  t | j| jf}|| j t }t }t	| jD ]}t	| jD ]}| j
||f tkr4d|||f< q"| j
||f dkrd|||f< g }d}| j||f D ]:}|d }	|d }
|	| j |
 }| j
|	|
f tkr{||jvru||ddg || qN| j
|	|
f tkr|d7 }qN| j
||f  | }t|dkr|t|| |D ]}||vr|| qq"q| }|D ]+}d|d< |D ]"}|| dkr|d  | j9  < || dkr|d  d| j 9  < qq|D ]I}|| j }	|| j }
d}d}|D ]}|| dkr	||d 7 }q||d 7 }q|}|}|| dkr"d||	|
f< qd||  }|| ||	|
f< q|S )Nr!   r   r#   )r   zerosr   r   fillr	   r   ctZProblemr   r
   r   r   r   Z
_variablesZaddVariableappenditemr   ZaddConstraintZExactSumConstraintr$   ZgetSolutions)r   ZprobabilityZall_unknown_positionsZmines_position_problemr   r   Zunknown_cells_aroundZnum_of_revealed_mines_aroundZ	neighbourxyvariableZrequired_sumr   Z	solutionsZsolutionZunknown_positionZ	true_prbsZ
false_prbsZtrue_prbZ	false_prbalphar   r   r   r"      sr   



z Player.get_each_mine_probabilityN)
__name__
__module____qualname__r   r    r   r   r)   r   r"   r   r   r   r   r      s    -r   )	r   minesweeper_commonr   r   r   Z
constraintr5   r2   r   r   r   r   r   <module>   s    