o
    }oi                     @  s   d dl mZ d dlm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	lmZ dddZd ddZddd!ddZdS )"    )annotations)SequenceN)optuna_warn)_CONSTRAINTS_KEY)StudyDirection)
_dominates)FrozenTrial)
TrialStatetrial0r   trial1
directionsSequence[StudyDirection]returnboolc           	      C  s`  | j t}|j t}|du rtd| j d |du r&td|j d |du r4|du r4t| ||S |dur>|du r>dS |du rH|durHdS t|ttfsQJ t|ttfsZJ t	|t	|krft
d| jtjkrndS |jtjkrvd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   b/home/ubuntu/.local/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   r   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   r0   
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)r1   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 ]/}|jt}|d u r'td|j d qttt	|r6t
dt||kr@t
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    r5   anyisnanr7   r%   r$   )r1   r<   num_constraints_trial_constraintsr   r   r   _validate_constraintsi   s$   rH   )r
   r   r   r   r   r   r   r   )r1   r2   r   r3   )r1   r=   r<   r   r   r>   )
__future__r   collections.abcr   numpyr5   optuna._warningsr   optuna.samplers._baser   optuna.studyr   optuna.study._multi_objectiver   optuna.trialr   r	   r0   r;   rH   r   r   r   r   <module>   s    

I