Ë
    £èhõU  ã                  ó  — d dl mZ d dlmZmZmZmZmZ d dlZd dl	Z	d dl
mZ d dlZd dlZd dlZ G d„ dej                  «      Zd;d„Z G d„ d	ej                  «      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ dej                  «      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zd<d„Zd<d„Zd<d „Z G d!„ d"e«      Z  G d#„ d$e«      Z! G d%„ d&e«      Z" G d'„ d(e«      Z# G d)„ d*ej                  «      Z$ G d+„ d,ej                  «      Z% G d-„ d.«      Z& G d/„ d0«      Z'	 	 	 	 	 	 	 	 d=d1„Z( G d2„ d3«      Z)d>d4„Z* G d5„ d6e$«      Z+ G d7„ d8e+«      Z, G d9„ d:e$«      Z-y)?é    )Úannotations)ÚSequenceÚIterableÚOptionalÚCallableÚUnionN)Ú	dataclassc                  óÖ   — e Zd ZU dZdZded<   ded<   ej                  dd„«       Ze	ej                  dd„«       «       Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zej                  dd„«       Zy)ÚDNAzAbstract DNA class.NzOptional[float]ÚfitnessÚlistÚ_datac                 ó   — y ©N© ©ÚselfÚvaluess     ú>lib/python3.12/site-packages/ezdxf/addons/genetic_algorithm.pyÚresetz	DNA.reset   ó   € àó    c                 ó   — y r   r   ©r   s    r   Úis_validzDNA.is_valid!   s   € ð 	r   c                ó,   — t        j                  | «      S r   )ÚcopyÚdeepcopyr   s    r   r   zDNA.copy&   s   € Ü�}‰}˜TÓ"Ð"r   c                ó   — d | _         y r   ©r   r   s    r   Ú_taintz
DNA._taint)   s	   € Øˆ�r   c                ó`   — | j                   j                  › dt        | j                  «      › d�S )NÚ(Ú))Ú	__class__Ú__name__Ústrr   r   s    r   Ú__repr__zDNA.__repr__,   s)   € Ø—.‘.×)Ñ)Ð*¨!¬C°·
±
«OÐ+<¸AÐ>Ð>r   c                ód   — t        || j                  «      sJ ‚| j                  |j                  k(  S r   )Ú
isinstancer%   r   )r   Úothers     r   Ú__eq__z
DNA.__eq__/   s)   € Ü˜% §¡Ô0Ð0Ð0Ø�z‰z˜UŸ[™[Ñ(Ð(r   c                ó,   — t        | j                  «      S r   )Úlenr   r   s    r   Ú__len__zDNA.__len__3   s   € Ü�4—:‘:‹Ðr   c                ó8   — | j                   j                  |«      S r   )r   Ú__getitem__)r   Úitems     r   r1   zDNA.__getitem__6   s   € Ø�z‰z×%Ñ% dÓ+Ð+r   c                ó\   — | j                   j                  ||«       | j                  «        y r   )r   Ú__setitem__r!   )r   ÚkeyÚvalues      r   r4   zDNA.__setitem__9   s   € Ø�
‰
×Ñ˜s EÔ*Ø�‰�r   c                ó,   — t        | j                  «      S r   )Úiterr   r   s    r   Ú__iter__zDNA.__iter__=   s   € Ü�D—J‘JÓÐr   c                 ó   — y r   r   ©r   Úindexs     r   Úflip_mutate_atzDNA.flip_mutate_at@   r   r   ©r   r   ©ÚreturnÚbool©r<   Úintr@   ÚNone)r&   Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__ÚabcÚabstractmethodr   Úpropertyr   r   r!   r(   r,   r/   r1   r4   r9   r=   r   r   r   r   r      s�   … Ùà#€Gˆ_Ó#ØƒKà×Ñòó ðð Ø×Ñòó ó ðò#òò?ò)òò,òò ð 	×Ñòó ñr   r   c                ó   — | j                   S r   r    )Údnas    r   Údna_fitnessrN   E   s   € Ø�;‰;Ðr   c                  ó6   — e Zd ZdZej
                  dd„«       Zy)ÚMutatezAbstract mutation.c                 ó   — y r   r   )r   rM   Úrates      r   ÚmutatezMutate.mutateL   r   r   N©rM   r   rR   Úfloat)r&   rE   rF   rG   rI   rJ   rS   r   r   r   rP   rP   I   s   „ Ùà×Ñòó ñr   rP   c                  ó   — e Zd ZdZdd„Zy)Ú
FlipMutatezFlip one bit mutation.c                óˆ   — t        t        |«      «      D ]+  }t        j                  «       |k  sŒ|j                  |«       Œ- y r   )Úranger.   Úrandomr=   )r   rM   rR   r<   s       r   rS   zFlipMutate.mutateT   s0   € Üœ3˜s›8–_ˆEÜ�}‰}‹ Ó%Ø×"Ñ" 5Õ)ñ %r   NrT   ©r&   rE   rF   rG   rS   r   r   r   rW   rW   Q   s
   „ Ù ô*r   rW   c                  ó   — e Zd ZdZdd„Zy)ÚNeighborSwapMutatezSwap two neighbors mutation.c                ó”   — t        t        |«      «      D ]1  }t        j                  «       |k  sŒ|dz
  }||   }||   ||<   |||<   Œ3 y ©Né   ©rY   r.   rZ   )r   rM   rR   r<   Úi2Útmps         r   rS   zNeighborSwapMutate.mutate]   sJ   € Üœ3˜s›8–_ˆEÜ�}‰}‹ Ó%Ø˜Q‘Y�Ø˜"‘g�Ø˜e™*��B‘Ø ��E’
ñ %r   NrT   r[   r   r   r   r]   r]   Z   s
   „ Ù&ô!r   r]   c                  ó   — e Zd ZdZdd„Zy)ÚRandomSwapMutatez Swap two random places mutation.c                óÎ   — t        |«      }t        |«      D ]L  }t        j                  «       |k  sŒt        j                  d|«      }||k(  r|dz  }||   }||   ||<   |||<   ŒN y )Nr   r`   )r.   rY   rZ   Ú	randrange)r   rM   rR   Úlengthr<   rb   rc   s          r   rS   zRandomSwapMutate.mutatei   sh   € Ü�S“ˆÜ˜6–]ˆEÜ�}‰}‹ Ó%Ü×%Ñ% a¨Ó0�Ø˜’;Ø˜!‘G�BØ˜"‘g�Ø˜e™*��B‘Ø ��E’
ñ #r   NrT   r[   r   r   r   re   re   f   s
   „ Ù*ô	!r   re   c                  ó"   — e Zd ZdZddd„Zdd„Zy)ÚReverseMutatez'Reverse some consecutive bits mutation.c                ó8   — t        t        |d«      «      | _        y r_   ©rC   ÚmaxÚ_bits©r   Úbitss     r   Ú__init__zReverseMutate.__init__x   ó   € Üœ˜T 1›Ó&ˆ�
r   c                óò   — t        |«      }t        j                  «       ||| j                  z  z  k  rEt        j                  || j                  z
  «      }|| j                  z   }||| }t	        |«      ||| y y r   )r.   rZ   rn   rg   Úreversed©r   rM   rR   rh   Úi1rb   rp   s          r   rS   zReverseMutate.mutate{   ss   € Ü�S“ˆÜ�=‰=‹?˜TØ�T—Z‘ZÑñ
ò 
ô ×!Ñ! &¨4¯:©:Ñ"5Ó6ˆBØ�d—j‘j‘ˆBØ�r˜"�:ˆDÜ! $›ˆC��2‰Jð
r   N©é   ©rp   rC   rT   ©r&   rE   rF   rG   rq   rS   r   r   r   rj   rj   u   s   „ Ù1ô'ô(r   rj   c                  ó"   — e Zd ZdZddd„Zdd„Zy)ÚScrambleMutatez(Scramble some consecutive bits mutation.c                ó8   — t        t        |d«      «      | _        y r_   rl   ro   s     r   rq   zScrambleMutate.__init__‰   rr   r   c                ó
  — t        |«      }t        j                  «       ||| j                  z  z  k  rQt        j                  || j                  z
  «      }|| j                  z   }||| }t        j                  |«       |||| y y r   )r.   rZ   rn   rg   Úshuffleru   s          r   rS   zScrambleMutate.mutateŒ   s{   € Ü�S“ˆÜ�=‰=‹?˜TØ�T—Z‘ZÑñ
ò 
ô ×!Ñ! &¨4¯:©:Ñ"5Ó6ˆBØ�d—j‘j‘ˆBØ�r˜"�:ˆDÜ�N‰N˜4Ô ØˆC��2‰Jð
r   Nrw   ry   rT   rz   r   r   r   r|   r|   †   s   „ Ù2ô'ô	r   r|   c                  ó6   — e Zd ZdZej
                  dd„«       Zy)ÚMatezAbstract recombination.c                 ó   — y r   r   ©r   Údna1Údna2s      r   Ú	recombinezMate.recombine›   s   € àr   N©r„   r   r…   r   )r&   rE   rF   rG   rI   rJ   r†   r   r   r   r�   r�   ˜   s   „ Ù!à×Ñòó ñr   r�   c                  ó   — e Zd ZdZdd„Zy)ÚMate1pCXz"One point crossover recombination.c                ób   — t        |«      }t        j                  d|«      }t        ||||«       y ©Nr   ©r.   rZ   rg   Úrecombine_dna_2pcx)r   r„   r…   rh   r<   s        r   r†   zMate1pCX.recombine£   s+   € Ü�T“ˆÜ× Ñ   FÓ+ˆÜ˜4  u¨fÕ5r   Nr‡   ©r&   rE   rF   rG   r†   r   r   r   r‰   r‰       s
   „ Ù,ô6r   r‰   c                  ó   — e Zd ZdZdd„Zy)ÚMate2pCXz"Two point crossover recombination.c                ó    — t        |«      }t        j                  d|«      }t        j                  d|«      }||kD  r||}}t        ||||«       y r‹   rŒ   ©r   r„   r…   rh   rv   rb   s         r   r†   zMate2pCX.recombine¬   óM   € Ü�T“ˆÜ×Ñ˜a Ó(ˆÜ×Ñ˜a Ó(ˆØ�Š7Ø˜�ˆBÜ˜4  r¨2Õ.r   Nr‡   rŽ   r   r   r   r�   r�   ©   s
   „ Ù,ô/r   r�   c                  ó   — e Zd ZdZdd„Zy)ÚMateUniformCXzUniform recombination.c                óŠ   — t        t        |«      «      D ],  }t        j                  «       dkD  sŒ||   }||   ||<   |||<   Œ. y )Ng      à?ra   )r   r„   r…   r<   rc   s        r   r†   zMateUniformCX.recombine¸   sB   € Üœ3˜t›9Ö%ˆEÜ�}‰}‹ Ó$Ø˜5‘k�Ø" 5™k��U‘Ø!��U’ñ	 &r   Nr‡   rŽ   r   r   r   r•   r•   µ   s
   „ Ù ô"r   r•   c                  ó   — e Zd ZdZdd„Zy)ÚMateOrderedCXz8Recombination class for ordered DNA like UniqueIntDNA().c                ó    — t        |«      }t        j                  d|«      }t        j                  d|«      }||kD  r||}}t        ||||«       y r‹   )r.   rZ   rg   Úrecombine_dna_ocx1r’   s         r   r†   zMateOrderedCX.recombineÃ   r“   r   Nr‡   rŽ   r   r   r   r˜   r˜   À   s
   „ ÙBô/r   r˜   c                ó,   — | || }||| }|| || |||| y)zTwo point crossover.Nr   )r„   r…   rv   rb   Úpart1Úpart2s         r   r�   r�   Ì   s.   € à��BˆK€EØ��BˆK€EØ€DˆˆB€KØ€DˆˆB�Kr   c                ó\   — | j                  «       }t        | |||«       t        ||||«       y)zOrdered crossover.N)r   Úreplace_dna_ocx1)r„   r…   rv   rb   Úcopy1s        r   rš   rš   Ô   s)   € à�I‰I‹K€EÜ�T˜4  RÔ(Ü�T˜5 " bÕ)r   c                óŒ   — | j                  «       }||| }|| || d}t        |«      }|D ]  }||v rŒ||k(  r|}|| |<   |dz  }Œ y)zWReplace a part in dna1 by dna2 and preserve order of remaining values in
    dna1.
    r   r`   N)r   Úset)	r„   r…   rv   rb   ÚoldÚnewr<   Únew_setr6   s	            r   rŸ   rŸ   Û   sf   € ð �)‰)‹+€CØ
ˆr�"ˆ+€CØ€DˆˆB€KØ€EÜ�#‹h€GÛˆØ�GÑØØ�BŠ;ØˆEØˆˆU‰Ø�‰
‰ñ r   c                  ón   — e Zd ZdZdZdd„Zedd„«       Zedd„«       Ze	dd„«       Z
d„ Zd„ Zdd	„Zdd
„Zy)ÚFloatDNAz,Arbitrary float numbers in the range [0, 1].©r   r   c                óR   — t        |«      | _        | j                  «        d | _        y r   )r   r   Ú_check_valid_datar   r   s     r   rq   zFloatDNA.__init__ò   s    € Ü"& v£,ˆŒ
Ø×ÑÔ Ø(,ˆ�r   c                ó2   —  | d„ t        |«      D «       «      S )Nc              3  óD   K  — | ]  }t        j                   «       –— Œ y ­wr   )rZ   ©Ú.0Ú_s     r   Ú	<genexpr>z"FloatDNA.random.<locals>.<genexpr>ù   s   è ø€ Ð;©]¨”F—M‘M—O©]ùs   ‚ ©rY   ©Úclsrh   s     r   rZ   zFloatDNA.random÷   s   € áÑ;¬U°6¬]Ó;Ó<Ð<r   c                ó\   — t        |«      D �cg c]  }| j                  |«      ‘Œ c}S c c}w r   ©rY   rZ   ©r³   Únrh   r¯   s       r   Ún_randomzFloatDNA.n_randomû   ó'   € ä,1°!¬HÓ5©H q�—
‘
˜6Õ"¨HÑ5Ð5ùÒ5ó   Ž)c                ó:   — t        d„ | j                  D «       «      S )Nc              3  ó<   K  — | ]  }d |cxk  xr dk  nc –— Œ y­w©ç        ç      ð?Nr   ©r®   Úvs     r   r°   z$FloatDNA.is_valid.<locals>.<genexpr>  s   è ø€ Ð7©J q�3˜!–?˜s—?�?©Jùs   ‚©Úallr   r   s    r   r   zFloatDNA.is_validÿ   s   € äÑ7¨D¯JªJÓ7Ó7Ð7r   c                ó2   — | j                   st        d«      ‚y )Nzdata value out of range)r   Ú
ValueErrorr   s    r   rª   zFloatDNA._check_valid_data  s   € Ø�}Š}ÜÐ6Ó7Ð7ð r   c           	     ó¬   — | j                   €d}nd| j                   d›�}t        | j                  D �cg c]  }t        |d«      ‘Œ c}«      › |› �S c c}w )Nú, fitness=Noneú
, fitness=ú.4fé   )r   r'   r   Úround©r   r   rÁ   s      r   Ú__str__zFloatDNA.__str__  sU   € Ø�<‰<ÐØ&‰Gà" 4§<¡<°Ð"4Ð5ˆGÜ¨D¯JªJÓ7©J q”u˜Q •{¨JÑ7Ó8Ð9¸'¸ÐCÐCùÒ7s   ³Ac                ód   — t        |«      | _        | j                  «        | j                  «        y r   )r   r   rª   r!   r   s     r   r   zFloatDNA.reset  s"   € Ü˜&“\ˆŒ
Ø×ÑÔ Ø�‰�r   c                óB   — d| j                   |   z
  | j                   |<   y ©Nr¿   ©r   r;   s     r   r=   zFloatDNA.flip_mutate_at  s   € Ø $§*¡*¨UÑ"3Ñ3ˆ�
‰
�5Òr   N)r   úIterable[float])rh   rC   r@   r§   )r·   rC   rh   rC   r@   zlist[FloatDNA]r?   rB   )r&   rE   rF   rG   Ú	__slots__rq   ÚclassmethodrZ   r¸   rK   r   rª   rÍ   r   r=   r   r   r   r§   r§   í   s`   „ Ù6à$€Ió-ð
 ò=ó ð=ð ò6ó ð6ð ò8ó ð8ò8òDóô
4r   r§   c                  óh   — e Zd ZdZdZdd„Zedd„«       Zedd„«       Z	edd„«       Z
d„ Zdd„Zdd	„Zy
)ÚBitDNAzOne bit DNA.r¨   c                ó@   — t        d„ |D «       «      | _        d | _        y )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   ©rA   rÀ   s     r   r°   z"BitDNA.__init__.<locals>.<genexpr>  s   è ø€ Ð%>±v°!¤d¨1§g±vùó   ‚)r   r   r   r   s     r   rq   zBitDNA.__init__  s   € Ü!%Ñ%>±vÓ%>Ó!>ˆŒ
Ø(,ˆ�r   c                 ó   — y)NTr   r   s    r   r   zBitDNA.is_valid   s   € àr   c                ó2   —  | d„ t        |«      D «       «      S )Nc              3  óZ   K  — | ]#  }t        t        j                  d d«      «      –— Œ% y­w)r   r`   N)rA   rZ   Úrandintr­   s     r   r°   z BitDNA.random.<locals>.<genexpr>&  s!   è ø€ ÐE±}°!”4œŸ™ q¨!Ó,×-±}ùs   ‚)+r±   r²   s     r   rZ   zBitDNA.random$  s   € áÑE´u¸V´}ÓEÓEÐEr   c                ó\   — t        |«      D �cg c]  }| j                  |«      ‘Œ c}S c c}w r   rµ   r¶   s       r   r¸   zBitDNA.n_random(  r¹   rº   c                óª   — | j                   €d}nd| j                   d›�}t        | j                  D �cg c]  }t        |«      ‘Œ c}«      › |› �S c c}w ©NrÇ   rÈ   rÉ   ©r   r'   r   rC   rÌ   s      r   rÍ   zBitDNA.__str__,  óS   € Ø�<‰<ÐØ&‰Gà" 4§<¡<°Ð"4Ð5ˆGÜ t§z¢zÓ2¡z !”s˜1•v zÑ2Ó3Ð4°W°IÐ>Ð>ùÒ2ó   ³Ac                óR   — t        d„ |D «       «      | _        | j                  «        y )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   rÙ   rÀ   s     r   r°   zBitDNA.reset.<locals>.<genexpr>4  s   è ø€ Ð2©6 aœ$˜qŸ'©6ùrÚ   ©r   r   r!   r   s     r   r   zBitDNA.reset3  s   € ÜÑ2©6Ó2Ó2ˆŒ
Ø�‰�r   c                ó>   — | j                   |    | j                   |<   y r   rÑ   r;   s     r   r=   zBitDNA.flip_mutate_at7  s   € Ø $§
¡
¨5Ñ 1Ð1ˆ�
‰
�5Òr   Nr>   r?   )rh   rC   r@   rÖ   )r·   rC   rh   rC   r@   zlist[BitDNA]©r   r   r@   rD   rB   )r&   rE   rF   rG   rÓ   rq   rK   r   rÔ   rZ   r¸   rÍ   r   r=   r   r   r   rÖ   rÖ     s\   „ Ùà$€Ió-ð òó ðð òFó ðFð ò6ó ð6ò?óô2r   rÖ   c                  óh   — e Zd ZdZdZdd„Zedd„«       Zedd„«       Ze	dd„«       Z
d„ Zdd„Zdd	„Zy
)ÚUniqueIntDNAaU  Unique integer values in the range from 0 to length-1.
    E.g. UniqueIntDNA(10) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    Requires MateOrderedCX() as recombination class to preserve order and
    validity after DNA recombination.

    Requires mutation by swapping like SwapRandom(), SwapNeighbors(),
    ReversMutate() or ScrambleMutate()
    r¨   c                ó   — |  t        |t        «      r!t        t        |«      «      | _        d | _        y |D �cg c]  }t        |«      ‘Œ c}| _        | j
                  st        | j                  «      ‚d | _        y c c}w r   )r*   rC   r   rY   r   r   Ú	TypeErrorr   )r   r   rÁ   s      r   rq   zUniqueIntDNA.__init__H  sf   € ÙÜ�fœcÔ"Üœe F›mÓ,ˆDŒJð
 )-ˆ�ñ +1Ó1©& Qœ#˜a�&¨&Ñ1ˆDŒJØ—=’=Ü §
¡
Ó+Ð+Ø(,ˆ�ùò 2s   ¸A;c                óT   —  | |«      }t        j                  |j                  «       |S r   )rZ   r   r   )r³   rh   rM   s      r   rZ   zUniqueIntDNA.randomR  s    € á�&‹kˆÜ�‰�s—y‘yÔ!Øˆ
r   c                ó\   — t        |«      D �cg c]  }| j                  |«      ‘Œ c}S c c}w r   rµ   r¶   s       r   r¸   zUniqueIntDNA.n_randomX  r¹   rº   c                ój   — t        t        | j                  «      «      t        | j                  «      k(  S r   )r.   r¢   r   r   s    r   r   zUniqueIntDNA.is_valid\  s"   € ä”3�t—z‘z“?Ó#¤s¨4¯:©:£Ñ6Ð6r   c                óª   — | j                   €d}nd| j                   d›�}t        | j                  D �cg c]  }t        |«      ‘Œ c}«      › |› �S c c}w rá   râ   rÌ   s      r   rÍ   zUniqueIntDNA.__str__`  rã   rä   c                óR   — t        d„ |D «       «      | _        | j                  «        y )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   ©rC   rÀ   s     r   r°   z%UniqueIntDNA.reset.<locals>.<genexpr>h  ó   è ø€ Ð1©& Qœ#˜aŸ&©&ùrÚ   rç   r   s     r   r   zUniqueIntDNA.resetg  ó   € ÜÑ1©&Ó1Ó1ˆŒ
Ø�‰�r   c                ó   — t        d«      ‚)Nzflip mutation not supported)rí   r;   s     r   r=   zUniqueIntDNA.flip_mutate_atk  s   € ÜÐ5Ó6Ð6r   N)r   zUnion[int, Iterable])rh   rC   r@   rë   )r·   rC   rh   rC   r@   zlist[UniqueIntDNA]r?   ré   rB   )r&   rE   rF   rG   rÓ   rq   rÔ   rZ   r¸   rK   r   rÍ   r   r=   r   r   r   rë   rë   ;  s^   „ ñð %€Ió-ð òó ðð
 ò6ó ð6ð ò7ó ð7ò?óô7r   rë   c                  ón   — e Zd ZdZdZdd„Zedd„«       Zedd„«       Ze	dd„«       Z
d„ Zd„ Zdd	„Zdd
„Zy)Ú
IntegerDNAzkInteger values in the range from 0 to max_ - 1.
    E.g. IntegerDNA([0, 1, 2, 3, 4, 0, 1, 2, 3, 4], 5)
    r¨   c                ó”   — t        |«      | _        t        |«      | _        | j                  st        | j                  «      ‚d | _        y r   )rC   Ú_maxr   r   r   rí   r   )r   r   Úmax_s      r   rq   zIntegerDNA.__init__v  s5   € Ü˜“IˆŒ	Ü $ V£ˆŒ
Ø�}Š}Ü˜DŸJ™JÓ'Ð'Ø(,ˆ�r   c                óP   ‡— t        |«      Š | ˆfd„t        |«      D «       ‰«      S )Nc              3  óJ   •K  — | ]  }t        j                  d ‰«      –— Œ y­w©r   N)rZ   rg   )r®   r¯   Úimaxs     €r   r°   z$IntegerDNA.random.<locals>.<genexpr>€  s   øè ø€ ÐE±}°!”F×$Ñ$ Q¨×-±}ùs   ƒ #)rC   rY   )r³   rh   rü   r   s      @r   rZ   zIntegerDNA.random}  s#   ø€ ä�4‹yˆÙÓE´u¸V´}ÓEÀtÓLÐLr   c                ó^   — t        |«      D �cg c]  }| j                  ||«      ‘Œ c}S c c}w r   rµ   )r³   r·   rh   rü   r¯   s        r   r¸   zIntegerDNA.n_random‚  s)   € ä27¸´(Ó;±(¨Q�—
‘
˜6 4Õ(°(Ñ;Ð;ùÒ;s   Ž*c                ó@   ‡ — t        ˆ fd„‰ j                  D «       «      S )Nc              3  óR   •K  — | ]  }d |cxk  xr ‰j                   k  nc –— Œ  y­wrÿ   )rû   )r®   rÁ   r   s     €r   r°   z&IntegerDNA.is_valid.<locals>.<genexpr>ˆ  s#   øè ø€ Ð:©z¨!�1˜Ö%˜DŸI™I×%Ð%©zùs   ƒ$'rÂ   r   s   `r   r   zIntegerDNA.is_valid†  s   ø€ äÓ:¨t¯zªzÓ:Ó:Ð:r   c                óz   — | j                   j                  › dt        | j                  «      › d| j                  › d�S )Nr#   z, r$   )r%   r&   r'   r   rû   r   s    r   r(   zIntegerDNA.__repr__Š  s3   € Ø—.‘.×)Ñ)Ð*¨!¬C°·
±
«OÐ+<¸B¸t¿y¹y¸kÈÐKÐKr   c                óª   — | j                   €d}nd| j                   d›�}t        | j                  D �cg c]  }t        |«      ‘Œ c}«      › |› �S c c}w rá   râ   rÌ   s      r   rÍ   zIntegerDNA.__str__�  rã   rä   c                óR   — t        d„ |D «       «      | _        | j                  «        y )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   rô   rÀ   s     r   r°   z#IntegerDNA.reset.<locals>.<genexpr>•  rõ   rÚ   rç   r   s     r   r   zIntegerDNA.reset”  rö   r   c                ó\   — | j                   | j                  |   z
  dz
  | j                  |<   y r_   )rû   r   r;   s     r   r=   zIntegerDNA.flip_mutate_at˜  s'   € Ø ŸI™I¨¯
©
°5Ñ(9Ñ9¸AÑ=ˆ�
‰
�5Òr   N)r   zIterable[int]rü   rC   )rh   rC   rü   rC   r@   rù   )r·   rC   rh   rC   rü   rC   r@   zlist[IntegerDNA]r?   ré   rB   )r&   rE   rF   rG   rÓ   rq   rÔ   rZ   r¸   rK   r   r(   rÍ   r   r=   r   r   r   rù   rù   o  sf   „ ñð %€Ió-ð òMó ðMð ò<ó ð<ð ò;ó ð;òLò?óô>r   rù   c                  ó\   — e Zd ZdZej
                  dd„«       Zej
                  dd„«       Zy)Ú	SelectionzAbstract selection class.c                 ó   — y r   r   ©r   Úcounts     r   ÚpickzSelection.pickŸ  r   r   c                 ó   — y r   r   ©r   Ú
candidatess     r   r   zSelection.reset£  r   r   N©r  rC   r@   úIterable[DNA]©r  r  )r&   rE   rF   rG   rI   rJ   r  r   r   r   r   r
  r
  œ  s7   „ Ù#à×Ñòó ðð 	×Ñòó ñr   r
  c                  ó6   — e Zd ZdZej
                  dd„«       Zy)Ú	EvaluatorzAbstract evaluation class.c                 ó   — y r   r   ©r   rM   s     r   ÚevaluatezEvaluator.evaluate«  r   r   N©rM   r   r@   rU   )r&   rE   rF   rG   rI   rJ   r  r   r   r   r  r  ¨  s   „ Ù$à×Ñòó ñr   r  c                  óT   — e Zd Ze G d„ d«      «       Zdd„Zd	d„Zd
d„Zedd„«       Z	y)ÚLogc                  ó,   — e Zd ZU ded<   ded<   ded<   y)ú	Log.EntryrU   Úruntimer   Úavg_fitnessN)r&   rE   rF   rH   r   r   r   ÚEntryr  ±  s   … à‹Ø‹ØÔr   r!  c                ó   — g | _         y r   )Úentriesr   s    r   rq   zLog.__init__·  s	   € Ø(*ˆ�r   c                ód   — | j                   j                  t        j                  |||«      «       y r   )r#  Úappendr  r!  )r   r  r   r   s       r   ÚaddzLog.addº  s!   € Ø�‰×ÑœCŸI™I g¨w¸ÓDÕEr   c                óô   — | j                   D �cg c]%  }|j                  |j                  |j                  f‘Œ' }}t	        |d«      5 }t        j                  ||d¬«       d d d «       y c c}w # 1 sw Y   y xY w)NÚwtrÊ   )Úindent)r#  r  r   r   ÚopenÚjsonÚdump)r   ÚfilenameÚeÚdataÚfps        r   r,  zLog.dump½  s^   € Ø?C¿|º|ÓL¹|¸!�—‘˜AŸI™I q§}¡}Ò5¸|ˆÐLÜ�(˜DÔ! RÜ�I‰I�d˜B qÕ)÷ "Ð!ùò Mß!Ð!ús   �*A)ÁA.Á.A7c                óÂ   — t        |d«      5 }t        j                  |«      }d d d «       t        «       }D ]  \  }}}|j	                  |||«       Œ |S # 1 sw Y   Œ3xY w)NÚrt)r*  r+  Úloadr  r&  )r³   r-  r0  r/  Úlogr  r   r   s           r   r3  zLog.loadÂ  sV   € ä�(˜DÔ! RÜ—9‘9˜R“=ˆD÷ "ä‹eˆÛ-1Ñ)ˆG�W˜kØ�G‰G�G˜W kÕ2ð .2àˆ
÷ "Ð!ús   �AÁAN©r@   rD   )r  rU   r   rU   r   rU   r@   rD   )r-  r'   r@   rD   )r-  r'   r@   r  )
r&   rE   rF   r	   r!  rq   r&  r,  rÔ   r3  r   r   r   r  r  °  s=   „ Ø÷ð ó ðó
+óFó*ð
 òó ñr   r  c                  ó4   — e Zd Zd„ Zd„ Zd„ Zdd„Zd	d„Zd„ Zy)
Ú
HallOfFamec                ó0   — || _         t        «       | _        y r   )r  ÚdictÚ_unique_entriesr  s     r   rq   zHallOfFame.__init__Í  s   € ØˆŒ
Ü#›vˆÕr   c                óP   ‡ — ˆ fd„‰ j                  «       d ‰ j                   D «       S )Nc              3  ó<   •K  — | ]  }‰j                   |   –— Œ y ­wr   )r:  )r®   Úkr   s     €r   r°   z&HallOfFame.__iter__.<locals>.<genexpr>Ò  s!   øè ø€ ð 
Ù-N¨ˆD× Ñ  Õ#Ñ-Nùs   ƒ)Ú_sorted_keysr  r   s   `r   r9   zHallOfFame.__iter__Ñ  s)   ø€ ó
Ø-1×->Ñ->Ó-@ÀÀ4Ç:Á:Ñ-Nó
ð 	
r   c                óL   — t        | j                  j                  «       d¬«      S )NT)Úreverse)Úsortedr:  Úkeysr   s    r   r>  zHallOfFame._sorted_keysÖ  s   € Ü�d×*Ñ*×/Ñ/Ó1¸4Ô@Ð@r   c                óR   — |j                   €J ‚|| j                  |j                   <   y r   )r   r:  r  s     r   r&  zHallOfFame.addÙ  s&   € Ø�{‰{Ð&Ð&Ð&Ø,/ˆ×Ñ˜SŸ[™[Ò)r   c                ó˜   — | j                   }| j                  «       }|d t        || j                  «       D �cg c]  }||   ‘Œ	 c}S c c}w r   )r:  r>  Úminr  )r   r  r#  rB  r=  s        r   ÚgetzHallOfFame.getÝ  sL   € Ø×&Ñ&ˆØ× Ñ Ó"ˆØ$(Ð)A¬3¨u°d·j±jÓ+AÑ$BÓCÑ$B˜q�˜“
Ð$BÑCÐCùÒCs   ¸Ac                óØ   — t        | j                  «      | j                  k  ry | j                  }| j                  «       }|d | j                   D �ci c]  }|||   “Œ
 c}| _        y c c}w r   )r.   r:  r  r>  )r   r#  rB  r=  s       r   ÚpurgezHallOfFame.purgeâ  sd   € Üˆt×#Ñ#Ó$¨¯
©
Ò2ØØ×&Ñ&ˆØ× Ñ Ó"ˆØ7;¸L¸d¿j¹jÑ7IÓJÑ7I°!  7¨1¡:¡Ð7IÑJˆÕùÒJs   ÁA'N)rM   r   )r  rC   r@   z	list[DNA])	r&   rE   rF   rq   r9   r>  r&  rF  rH  r   r   r   r7  r7  Ì  s#   „ ò&ò
ò
Aó0óDó
Kr   r7  c                óv   ‡— |dk  r$t        | t        ¬«      }d|z
  |j                  z  Šn||z  Šˆfd„| D «       S )Nr¾   ©r5   r¿   c              3  óB   •K  — | ]  }|j                   ‰kD  sŒ|–— Œ y ­wr   r    )r®   ÚcÚ	min_values     €r   r°   z#threshold_filter.<locals>.<genexpr>ò  s   øè ø€ Ð;‘z�! Q§Y¡Y°Ó%:ŒA‘zùs   ƒ˜)rE  rN   r   )r  Úbest_fitnessÚ	thresholdÚminimumrM  s       @r   Úthreshold_filterrQ  ê  s@   ø€ ð �sÒÜ�j¤kÔ2ˆØ˜9‘_¨¯©Ñ7‰	à  9Ñ,ˆ	Û;‘zÓ;Ð;r   c                  óš   — e Zd ZdZ	 d	 	 	 	 	 dd„Zdd„Zedd„«       Zedd„«       Zdd„Z		 	 d	 	 	 	 	 dd„Z
dd	„Zdd
„Zdd„Zdd„Zdd„Zy)ÚGeneticOptimizera÷  A genetic algorithm (GA) is a meta-heuristic inspired by the process of
    natural selection. Genetic algorithms are commonly used to generate
    high-quality solutions to optimization and search problems by relying on
    biologically inspired operators such as mutation, crossover and selection.

    Source: https://en.wikipedia.org/wiki/Genetic_algorithm

    This implementation searches always for the maximum fitness, fitness
    comparisons are always done by the "greater than" operator (">").
    The algorithm supports negative values to search for the minimum fitness
    (e.g. Travelling Salesmen Problem: -900 > -1000). Reset the start fitness
    by the method :meth:`reset_fitness` accordingly::

        optimizer.reset_fitness(-1e99)

    c                óà  — |dk  rt        d«      ‚d| _        t        «       | _        g | _        || _        t        «       | _        t        «       | _	        t        «       | _        t        |«      | _        t        |«      | _        d| _        d| _        d| _        d| _        d| _        d	| _        d
| _        d	| _        d	| _        t3        g «      | _        d	| _        d
| _        t;        d«      | _        y )Nr`   zrequires max_generations > 0rS  g.Ÿ‡¢®B}Téd   gffffffæ?g{®Gáz„?é   r¾   r   é
   )rÅ   Únamer  r4  r  Ú	evaluatorÚRouletteSelectionÚ	selectionr�   ÚmaterW   ÚmutationrC   Úmax_generationsrU   Úmax_fitnessÚmax_runtimeÚmax_stagnationÚcrossover_rateÚmutation_rateÚelitismrO  Ú
generationÚ
start_timer  rÖ   Úbest_dnarN  Ú
stagnationr7  Úhall_of_fame)r   rY  r^  r_  s       r   rq   zGeneticOptimizer.__init__  sÝ   € ð ˜QÒÜÐ;Ó<Ð<à&ˆŒ	Ü“5ˆŒØ%'ˆŒð %.ˆŒÜ$5Ó$7ˆŒÜ"›*ˆŒ	Ü"›ˆŒô  # ?Ó3ˆÔÜ"'¨Ó"4ˆÔØ"&ˆÔØ!ˆÔØ"ˆÔØ!ˆÔØˆŒð !$ˆŒð  !ˆŒØˆŒØ!ˆŒÜ# B›ZˆŒØ#&ˆÔØ ˆŒÜ& r›NˆÕr   c                ó$   — t        |«      | _        y r   )rU   rN  )r   r6   s     r   Úreset_fitnesszGeneticOptimizer.reset_fitness/  s   € Ü! %›LˆÕr   c                ó,   — t        | j                  «      S r   )rA   re  r   s    r   Úis_executedzGeneticOptimizer.is_executed2  s   € ä�D—O‘OÓ$Ð$r   c                ó,   — t        | j                  «      S r   )r.   r  r   s    r   r  zGeneticOptimizer.count6  s   € ä�4—?‘?Ó#Ð#r   c                óh   — | j                   s| j                  j                  |«       y t        d«      ‚)Nzalready executed)rm  r  Úextendrí   r  s     r   Úadd_candidateszGeneticOptimizer.add_candidates:  s)   € Ø×ÒØ�O‰O×"Ñ" 3Õ'äÐ.Ó/Ð/r   Nc                ó2  — | j                   rt        d«      ‚| j                  st        d«       t	        j
                  «       }|| _        t        d| j                  dz   «      D ]²  | _	        | j                  «        t	        j
                  «       }|| j                  z
  | _        | j                  | j                  k\  s2| j                  | j                  k\  s| j                  | j                   k\  r y |r||z
  |kD  r || «      r y |}| j#                  «        Œ´ y )Nzcan only run oncezno DNA defined!r`   )rm  rí   r  ÚprintÚtimeÚperf_counterrf  rY   r^  re  Úmeasure_fitnessr  rN  r_  r`  rh  ra  Únext_generation)r   ÚfeedbackÚintervalÚt0Út1s        r   ÚexecutezGeneticOptimizer.execute@  së   € ð
 ×ÒÜÐ/Ó0Ð0Ø�ŠÜÐ#Ô$Ü×ÑÓ ˆØˆŒÜ$ Q¨×(<Ñ(<¸qÑ(@ÖAˆDŒOØ× Ñ Ô"Ü×"Ñ"Ó$ˆBØ §¡Ñ/ˆDŒLà×!Ñ! T×%5Ñ%5Ò5Ø—<‘< 4×#3Ñ#3Ò3Ø—?‘? d×&9Ñ&9Ò9áÙ˜B ™G hÒ.Ù˜D”>ÙØ�Ø× Ñ Õ"ñ  Br   c                ón  — | xj                   dz  c_         d}| j                  D ]…  }|j                  �||j                  z  }Œ| j                  j	                  |«      }||_        ||z  }| j
                  j                  |«       || j                  kD  sŒq|| _        || _        d| _         Œ‡ | j
                  j                  «        	 |t        | j                  «      z  }| j                  j                  t        j                  «       | j                  z
  | j                  |«       y # t        $ r d}Y ŒTw xY w)Nr`   r¾   r   )rh  r  r   rY  r  ri  r&  rN  rg  rH  r.   ÚZeroDivisionErrorr4  rt  ru  rf  )r   Úfitness_sumrM   r   r   s        r   rv  z GeneticOptimizer.measure_fitness[  s  € Ø�Š˜1Ñ�Ø ˆØ—?”?ˆCØ�{‰{Ð&Ø˜sŸ{™{Ñ*�ØØ—n‘n×-Ñ-¨cÓ2ˆGØ!ˆCŒKØ˜7Ñ"ˆKØ×Ñ×!Ñ! #Ô&Ø˜×*Ñ*Ó*Ø$+�Ô!Ø #�”Ø"#�•ð #ð 	×Ñ×ÑÔ!ð	Ø%¬¨D¯O©OÓ(<Ñ<ˆKð 	�‰�‰Ü×ÑÓ $§/¡/Ñ1Ø×ÑØõ	
øô !ò 	ØŠKð	ús   ÃD& Ä&D4Ä3D4c                ó`  — t        | j                  «      }g }| j                  }|j                  | j	                  | j                  «      «       | j
                  dkD  r4|j                  | j                  j                  | j
                  «      «       t        |«      |k  r‰|j                  d«      \  }}|j                  «       }|j                  «       }| j                  ||«       | j                  ||«       |j                  |«       |j                  |«       t        |«      |k  rŒ‰|| _        y )Nr   rV  )r.   r  r[  r   Úfilter_thresholdrd  rp  ri  rF  r  r   r†   rS   r%  )r   r  r  Úselectorr„   r…   s         r   rw  z GeneticOptimizer.next_generationv  së   € Ü�D—O‘OÓ$ˆØ "ˆ
Ø—>‘>ˆØ�‰�t×,Ñ,¨T¯_©_Ó=Ô>à�<‰<˜!ÒØ×Ñ˜d×/Ñ/×3Ñ3°D·L±LÓAÔBä�*‹o Ò%Ø!Ÿ™ qÓ)‰JˆD�$Ø—9‘9“;ˆDØ—9‘9“;ˆDØ�N‰N˜4 Ô&Ø�K‰K˜˜dÔ#Ø×Ñ˜dÔ#Ø×Ñ˜dÔ#ô �*‹o Ó%ð %ˆ�r   c                óf   — | j                   dkD  r!t        || j                  | j                   «      S |S )Nr¾   )rO  rQ  rN  r  s     r   r�  z!GeneticOptimizer.filter_threshold‰  s4   € Ø�>‰>˜CÒÜ#Ø˜D×-Ñ-¨t¯~©~óð ð Ðr   c                ó€   — t        j                   «       | j                  k  r| j                  j                  ||«       y y r   )rZ   rb  r\  r†   rƒ   s      r   r†   zGeneticOptimizer.recombine‘  s/   € Ü�=‰=‹?˜T×0Ñ0Ò0Ø�I‰I×Ñ  dÕ+ð 1r   c                óœ   — | j                   j                  || j                  «       | j                   j                  || j                  «       y r   )r]  rS   rc  rƒ   s      r   rS   zGeneticOptimizer.mutate•  s6   € Ø�‰×Ñ˜T 4×#5Ñ#5Ô6Ø�‰×Ñ˜T 4×#5Ñ#5Õ6r   )r¿   )rY  r  r^  rC   r_  rU   )r6   rU   r@   rD   r?   )r@   rC   )rM   r  rÐ   )rx  z,Optional[Callable[[GeneticOptimizer], bool]]ry  rU   r@   rD   r5  )r  úSequence[DNA]r@   r  r‡   )r&   rE   rF   rG   rq   rk  rK   rm  r  rq  r|  rv  rw  r�  r†   rS   r   r   r   rS  rS  õ  s¤   „ ñð* !ð	&+àð&+ð ð&+ð ó	&+óP)ð ò%ó ð%ð ò$ó ð$ó0ð BFØð#à>ð#ð ð#ð 
ó	#ó6
ó6%ó&ó,ô7r   rS  c                ó   — d„ | D «       S )Nc              3  óF   K  — | ]  }|d k(  rd ndt        |«      z  –— Œ y­wr½   )Úabs)r®   Úws     r   r°   z(conv_negative_weights.<locals>.<genexpr>œ  s$   è ø€ Ð?±w°!�1˜’8‰C ¤s¨1£v¡Ó-±wùs   ‚!r   )Úweightss    r   Úconv_negative_weightsrŒ  š  s   € á?±wÓ?Ð?r   c                  ó*   — e Zd ZdZddd„Zdd„Zd	d„Zy)
rZ  zSelection by fitness values.c                ó@   — g | _         g | _        t        |«      | _        y r   )Ú_candidatesÚ_weightsrA   Ú_negative_values)r   Únegative_valuess     r   rq   zRouletteSelection.__init__¢  s   € Ø&(ˆÔØ%'ˆŒÜ $ _Ó 5ˆÕr   c                óî   — t        |«      | _        | j                  r+t        t        d„ | j                  D «       «      «      | _        y | j                  D �cg c]  }|j
                  ‘Œ c}| _        y c c}w )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr   r    )r®   rM   s     r   r°   z*RouletteSelection.reset.<locals>.<genexpr>¬  s   è ø€ Ð%NÑ=M°c c§k¥kÑ=Mùs   ‚)r   r�  r‘  rŒ  r�  r   )r   r  rM   s      r   r   zRouletteSelection.reset§  s_   € ä 
Ó+ˆÔØ× Ò Ü Ü%Ñ%N¸T×=MÒ=MÓ%NÓNóˆD�Mð 59×4DÒ4DÓEÑ4D¨S˜SŸ[›[Ð4DÑEˆD�MùÒEs   ÁA2c                óZ   — t        j                  | j                  | j                  |¬«      S )N)r=  )rZ   Úchoicesr�  r�  r  s     r   r  zRouletteSelection.pick±  s   € Ü�~‰~˜d×.Ñ.°·±ÀÔGÐGr   N)F)r’  rA   r@   rD   r  r  ©r&   rE   rF   rG   rq   r   r  r   r   r   rZ  rZ  Ÿ  s   „ Ù&ô6ó
FôHr   rZ  c                  ó   — e Zd ZdZdd„Zy)ÚRankBasedSelectionzSelection by rank of fitness.c                óÄ   — t        |«      | _        | j                  j                  t        ¬«       t        t	        dt        | j                  «      dz   «      «      | _        y )NrJ  r`   )r   r�  ÚsortrN   rY   r.   r�  r  s     r   r   zRankBasedSelection.reset¸  sK   € ä 
Ó+ˆÔØ×Ñ×Ñ¤+ÐÔ.ô œU 1¤c¨$×*:Ñ*:Ó&;¸aÑ&?Ó@ÓAˆ�r   Nr  )r&   rE   rF   rG   r   r   r   r   r™  r™  µ  s   „ Ù'ôBr   r™  c                  ó(   — e Zd ZdZdd„Zdd„Zdd„Zy)	ÚTournamentSelectionz@Selection by choosing the best of a certain count of candidates.c                ó    — g | _         || _        y r   )r�  r  r  s     r   rq   zTournamentSelection.__init__Ä  s   € Ø&(ˆÔØ$ˆ�r   c                ó$   — t        |«      | _        y r   )r   r�  r  s     r   r   zTournamentSelection.resetÈ  s   € Ü 
Ó+ˆÕr   c              #  óî   K  — t        |«      D ]^  }t        | j                  «      D �cg c]!  }t        j                  | j                  «      ‘Œ# }}|j                  t        ¬«       |d   –— Œ` y c c}w ­w)NrJ  éÿÿÿÿ)rY   r  rZ   Úchoicer�  r›  rN   )r   r  r¯   r   s       r   r  zTournamentSelection.pickË  sh   è ø€ Ü�u–ˆAä9>¸t¿¹Ô9OóÙ9O°A”—‘˜d×.Ñ.Õ/Ð9Oð ð ð �K‰KœKˆKÔ(Ø˜‘*Óñ ùòùs   ‚&A5¨&A0Á'A5N)r  rC   r  r  r—  r   r   r   r�  r�  Á  s   „ ÙJó%ó,ôr   r�  r  )
r„   r   r…   r   rv   rC   rb   rC   r@   rD   )r  r†  rN  rU   rO  rU   r@   r  )r‹  rÒ   r@   rÒ   ).Ú
__future__r   Útypingr   r   r   r   r   rI   r   Údataclassesr	   r+  rZ   rt  ÚABCr   rN   rP   rW   r]   re   rj   r|   r�   r‰   r�   r•   r˜   r�   rš   rŸ   r§   rÖ   rë   rù   r
  r  r  r7  rQ  rS  rŒ  rZ  r™  r�  r   r   r   Ú<module>r§     s¤  ðõ #÷õ ó Û Ý !Û Û Û ô+ˆ#�'‰'ô +ó\ôˆS�W‰Wô ô*�ô *ô	!˜ô 	!ô!�vô !ô(�Fô (ô"�Vô ô$ˆ3�7‰7ô ô6ˆtô 6ô	/ˆtô 	/ô"�Dô "ô	/�Dô 	/óó*óô$'4ˆsô '4ôT!2ˆSô !2ôH17�3ô 17ôh*>�ô *>ôZ	�—‘ô 	ô�—‘ô ÷ñ ÷8Kñ Kð<<Øð<Ø-2ð<Ø?Dð<àó<÷b7ñ b7óJ@ô
H˜	ô Hô,	BÐ*ô 	Bô˜)õ r   