o
    /wi                     @  s   d dl mZ d dlmZ d dlZd dl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 dddZdddZddd ddZdS )!    )annotations)SequenceN)_CONSTRAINTS_KEY)StudyDirection)
_dominates)FrozenTrial)
TrialStatetrial0r   trial1
directionsSequence[StudyDirection]returnboolc           	      C  sd  | j t}|j t}|du rtd| j d |du r(td|j d |du r6|du r6t| ||S |dur@|du r@dS |du rJ|durJdS t|tt	fsSJ t|tt	fs\J t
|t
|krhtd| jtjkrpdS |jtjkrxdS tdd |D }td	d |D }|r|rt| ||S |rdS |rdS td
d |D }tdd |D }||k S )af  Checks constrained-domination.

    A trial x is said to constrained-dominate a trial y, if any of the following conditions is
    true:
    1) Trial x is feasible and trial y is not.
    2) Trial x and y are both infeasible, but solution x has a smaller overall constraint
    violation.
    3) Trial x and y are feasible and trial x dominates trial y.
    NTrial K does not have constraint values. It will be dominated by the other trials.TF@Trials with different numbers of constraints cannot be compared.c                 s      | ]}|d kV  qdS r   N .0vr   r   k/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/optuna/samplers/nsgaii/_constraints_evaluation.py	<genexpr>C       z)_constrained_dominates.<locals>.<genexpr>c                 s  r   r   r   r   r   r   r   r   D   r   c                 s      | ]	}|d kr|V  qdS r   r   r   r   r   r   r   S       c                 s  r   r   r   r   r   r   r   r   T   r   )system_attrsgetr   warningswarnnumberr   
isinstancelisttuplelen
ValueErrorstater   COMPLETEallsum)	r	   r
   r   constraints0constraints1satisfy_constraints0satisfy_constraints1
violation0
violation1r   r   r   _constrained_dominates   sF   r1   
populationSequence[FrozenTrial]
np.ndarrayc                 C  sR   g }| D ]}|j t}|du r|tj q|tdd |D  qt|S )zEvaluate feasibility of trials in population.
    Returns:
        A list of feasibility status T/F/None of trials in population, where T/F means
        feasible/infeasible and None means that the trial does not have constraint values.
    Nc                 s  r   r   r   r   r   r   r   r   e   r   z$_evaluate_penalty.<locals>.<genexpr>)r   r   r   appendnpnanr*   array)r2   penaltytrialconstraintsr   r   r   _evaluate_penaltyX   s   
r<   F)is_constrainedlist[FrozenTrial]r=   Nonec                C  s   |sd S t dd | D dd}| D ]0}|jt}|d u r(td|j d qtt	t
|r7tdt||krAtdqd S )	Nc                 S  s   g | ]}t |jtg qS r   )r%   r   r   r   )r   tr   r   r   
<listcomp>r   s    z)_validate_constraints.<locals>.<listcomp>r   )defaultr   r   z*NaN is not acceptable as constraint value.r   )maxr   r   r   r   r    r!   r6   anyisnanr8   r&   r%   )r2   r=   num_constraints_trial_constraintsr   r   r   _validate_constraintsi   s$   rI   )r	   r   r
   r   r   r   r   r   )r2   r3   r   r4   )r2   r>   r=   r   r   r?   )
__future__r   collections.abcr   r   numpyr6   optuna.samplers._baser   optuna.studyr   optuna.study._multi_objectiver   optuna.trialr   r   r1   r<   rI   r   r   r   r   <module>   s    

I