a
    (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 ]0}t
| jD ] }t| j||f | j	||f< q`qRt | _d S )Nr   )rowscolumnsmine_prbgamer   	neighborsnumpyfullminesunknownrangelensetinvalid)selfr   r   r
   r	   ij r   lC:\Users\mikol\Documents\GitHub\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 ]v}t| jD ]f}| j||f tkr$|||f dkrft| j||f< | ||f ||||f kr$|||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s2J d S )Nc                 3   s&   | ]}t  jD ]}||fV  qqd S r   )r   r   ).0r   r   r   r   r   	<genexpr>P       z(Player.preprocess_all.<locals>.<genexpr>)r   r   r   r   r   r   r   r'   r   preprocess_allN   s    zPlayer.preprocess_allc              	      s   j r8 j  }t fdd j| D  j|<  j| dkr  j| t fdd j| D   j|< d j| kr j|  j| ksJ  j| dkr  j|  j| kr j| D ]&} j| tkrt j|<  	| qq  j| dkr  j 
|  j| D ]} j| tkr|  S qds J q tsBdS t jD ]}t jD ]} j||f t fdd j||f D ksJ  j||f dkrZ j||f  j||f t fdd j||f D  ksZJ qZqLd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   s$   | ]} j | tkrd ndV  qdS r!   r   Nr
   r   r&   r%   r'   r   r   r(   _   r)   z'Player.preprocessing.<locals>.<genexpr>r   c                 3   s$   | ]} j | tkrd ndV  qdS r+   r
   r   r-   r'   r   r   r(   c   r)   FNc                 3   s$   | ]} j | tkrd ndV  qdS r+   r,   r-   r'   r   r   r(   }   r)   c                 3   s$   | ]} j | tkrd ndV  qdS 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   s2    
",&

4zPlayer.preprocessingc                 C   sz  t | j| jf}|| j t }t }t	| jD ]4}t	| jD ]"}| j
||f tkrld|||f< qF| j
||f dkrFd|||f< g }d}| j||f D ]t}|d }	|d }
|	| j |
 }| j
|	|
f tkr||jvr||ddg || q| j
|	|
f tkr|d7 }q| j
||f  | }t|dkrF|t|| |D ]}||vrN|| qNqFq6| }|D ]^}d|d< |D ]J}|| dkr|d  | j9  < || dkr|d  d| j 9  < qqz|D ]}|| j }	|| j }
d}d}|D ].}|| dkr"||d 7 }n||d 7 }q|}|}|| dkrVd||	|
f< nd||  }|| ||	|
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"      sh    




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
constraintr4   r1   r   r   r   r   r   <module>   s   