
    hOO                     @    d dl mZmZ d dlZd dlZ G d d          ZdS )    )IterableCallableNc                      e Zd Zed             Zed             Zed             Zed             Zed             Zed             Z	ed             Z
edd	            Zed
edefd            Zed
edefd            Zededefd            Zed             Zedd            Z	 	 d Zd Zed             Zed             Zededefd            Zed             Zed             Zed d            Zed             ZdS )!
TW_Utilityc                     d}t          dt          |                     D ]'}|t          t          | |                             z   }(|S Nr   )rangelenordstr)stringvalueis      Hc:\Users\Fabien\Documents\Programmation\testPython\classes\TW_Utility.py_string_to_intzTW_Utility._string_to_int   sI    qV%% 	0 	0ACF1I///EE    c                     t                               |           s| g} t          | t          j                  st          j        |           } | j        t          | j                  dz
           S )N   )r   is_array
isinstancenpndarrayarrayshaper
   datas    r   np_number_columnszTW_Utility.np_number_columns   sZ    ""4(( 	6D$
++ 	"8D>>Dz#dj//1,--r   c                 `    t          | t                    pt          | t          j                  S Nr   listr   r   r   s    r   r   zTW_Utility.is_array   s#    $%%ED"*)E)EEr   c                 ,    t          | t                    S r   )r   tupler   s    r   is_tuplezTW_Utility.is_tuple   s    $&&&r   c                     t          j        |           } | | |k             } t          j        | |z
                                            }| |         S r   )r   asarrayabsargmin)r   r   idxs      r   array_closest_valuezTW_Utility.array_closest_value   sH    
5!!eun%veem$$,,..Szr   c                     t          |t                    r| |                                v S t          |t          t          t
          f          r| |v S dS )NF)r   dictvaluesr!   r#   set)valeur	structures     r   in_arrayzTW_Utility.in_array&   sT    i&& 	'Y--////	D%#566 	'Y&&ur   c                     t          | t          t          j        f          r)| d         } t          | t          t          j        f          )| S )Nr    r   s    r   array_last_valuezTW_Utility.array_last_value.   sD    bj122 	8D bj122 	r   Nc                 *   d}|5| d u p/t          |           t          k    o|                                 dk    }nYt          |           t          u r!	 | |         d u p| |         dk    }n+#  d}Y n%xY wt	          | |          rt          | |          d}|S )NF T)typer   stripr,   hasattrgetattr)abisNones      r   empty_or_nonezTW_Utility.empty_or_none4   s     
	"$YF477c>#Eaggii2oFFAww$ ""qTT\7QqTRZFF"!FFFq!}} "1 "!Fs   A( (A.objnamec                     t          |           t          u rt                              | |           S t	          | |          S r   )r7   r,   r   r>   r9   r?   r@   s     r   r9   zTW_Utility.hasattrF   s>    99 	&!//T::::3%%%r   c                     t          |           t          u r)t                              | |          dk    r| |         nd S t	          | |          S )NT)r7   r,   r   r>   r:   rB   s     r   r:   zTW_Utility.getattrM   sN    99 	& * 8 8d C Ct KU3t99QUU3%%%r   iterfnc                 @    t          t          ||                     }|S r   )r!   filter)rD   rE   filteredValues      r   tw_wherezTW_Utility.tw_whereT   s    VB--..r   c                 0   g }t          | t                    st          | t          j                  s| g} t          | t          j                  st          j        |           } | j        dk    rt          d          | j        dk     rt          dt          |                     D ]o}t          | |         t                    s| |         nt                              | |                   }|dz  t          |          z  }|                    |           pnt          dt          |                     D ]}d}t          dt          | |                             D ]}t          | |         |         t                    s| |         |         n%t                              | |         |                   }|t          d|           z  }|dz  t          |          z  }|                    |           t          j        |                                          S )N   z3 Dimensions not supported yet   r   r   z1.)r   r!   r   r   r   ndim	Exceptionr	   r
   r   r   r   r'   appendfloatsum)r   scorer   r   	itemScorejs         r   dataset_total_scorezTW_Utility.dataset_total_scoreY   s   $%% 	jrz.J.J 	6D$
++ 	"8D>>D9> 	><===9q= 	,1SYY'' ( ('1$q'3'?'?gQZE^E^_cde_fEgEg!AIE

2	Y''''(
 1SYY'' , ,	#d1g,,// , ,A.8aS.I.ItDGAJJzOhOhimnoipqrisOtOtE %h1hh 7I )AI >ILL++++	, x""$$$r   c                    t          | t          j                  st          j        |           } d}d}t                              |           s;t                              | d                   rt          | d                   dk     rd}|rBd}g }t          dt          |                     D ]}|	                    | |         g           |} || fS )NFr   rL   T)
r   r   r   r   r   r>   r   r
   r	   rO   )XdesiredShapecolumnAddedshouldAddColumnnewXr   s         r   adjust_series_nbr_columnsz$TW_Utility.adjust_series_nbr_columnsw   s    !RZ(( 	A''** 	#((1..	#25ad))a-	#"O 	KDAc!ff%% $ $QqTF####AA~r   c                     g }	 t           j                            | |          }n	#  g }Y nxY wt          |          dk    rdndS )Nr   TF)r   linalgsolver
   )v1v2	solutionss      r   colinearity_checkzTW_Utility.colinearity_check   sO    			B//II	III9~~)4ttu4s    % +c                    t          j        g           }t          dt          |                     D ]}| |         }t          dt          |                     D ]}||k    r	| |         }t          j        ||          }t          j        ||d           t          |          dk    rFt                              |d         |d                   }|s|c c S t          j        |dd           |S )Nr   )axisrL   r   )	r   r   r	   r
   subtractrO   r   rc   delete)matrixcandidatesVectorr   
firstPointrT   secondPointvectoraligneds           r   get_vector_directorszTW_Utility.get_vector_directors   s   8B<<qV%% 	E 	EAJ1S[[)) E E6 E"()K[jAAFI.Q????+,,1 E",">">?OPQ?RScdeSf"g"g& E#333333I&6!DDDDE  r   c                     g }t                               |           }t          d|          D ]6}|                    t	          | |         ||         z   dz                       7|S )Nr   rL   )r   r   r	   rO   int)p1p2middlePoint
nbrColumnsr   s        r   get_middle_pointzTW_Utility.get_middle_point   si    11"55
q$$ 	9 	9AsBqEBqEMQ#6778888r   c                 J   t                               |           s| g} t                               |          s|g}t          |           t          |          k    rt          d          t	          d t          | |          D                       }t          j        |          S )Nu1   Les deux points doivent avoir la même dimension.c              3   ,   K   | ]\  }}||z
  d z  V  dS )rL   N ).0r;   r<   s      r   	<genexpr>z0TW_Utility._euclidianDistance.<locals>.<genexpr>   s.      AATQQUqLAAAAAAr   )r   r   r
   
ValueErrorrQ   zipmathsqrt)pointApointBsommes      r   _euclidianDistancezTW_Utility._euclidianDistance   s    ""6** 	XF""6** 	XFv;;#f++% 	RPQQQAAS-@-@AAAAAyr   dict1dict2c                 H    | }|                                 D ]
\  }}|||<   |S r   )items)r   r   
mergedDictkeyvals        r   mergeDictionnarieszTW_Utility.mergeDictionnaries   s5     
{{}} 	" 	"GC!JsOOr   c                 N   g }t                               | d                   }t          d|          D ]}|                    g            t          dt	          |                     D ]<}t          d|          D ])}||                             | |         |                    *=|S r   )r   r   r	   rO   r
   )	pointList
seriesListnbrDimensionr   rT   s        r   splitPointListIntoSeriez"TW_Utility.splitPointListIntoSerie   s    
!33IaLAAq&& 	" 	"Ab!!!!qY(( 	6 	6A1\** 6 61$$Yq\!_55556 r   c                    g }t                               | d                   s t                               | d                   rUt          dt	          |                     D ]6}t          d|          D ]#}|                    | |         |                    $7n.t          d|          D ]}|                    | |                    |S r   )r   r   r$   r	   r
   rO   )tuppleOrArraynbrDimensionsresr   rT   s        r   #pickNFirstDimensionFromTupleOrArrayz.TW_Utility.pickNFirstDimensionFromTupleOrArray  s    }Q/00 	-J4G4GVWHX4Y4Y 	-1c-0011 4 4q-00 4 4AJJ}Q/2333344 1m,, - -

=+,,,,
r   &.>c                    t          j        | t                    } t          j        |t                    }t          j        |t                    }t          j        |t                    }|| z
  }||z
  }|| z
  }|d         |d         z  |d         |d         z  z
  }t          |          |k     rX|d         |d         z  |d         |d         z  z
  }	t          |	          |k     rt          j        ||          }
|
|k     rPt           j                            || z
            |k     r(t           j                            || z
            |k     r| ndS d}d}t          j        || z
  |          |
z  }t          j        || z
  |          |
z  }t          ||          }t          ||          }t          ||          }t          ||          }|||z   k    r/t          ||z
            |k     r	| ||z  z   gS | ||z  z   | ||z  z   gS dS dS |d         |d         z  |d         |d         z  z
  |z  }|d         |d         z  |d         |d         z  z
  |z  }d|z
  |cxk    r	d|z   k    r#n n d|z
  |cxk    r	d|z   k    rn n
| ||z  z   }|S dS )u  
        Calcule le point d'intersection de deux segments 2D.
        Renvoie le point d'intersection [x, y] si une intersection unique existe.
        Renvoie None si les segments sont parallèles, colinéaires (non chevauchants) ou ne se coupent pas.
        Renvoie une liste de deux points si les segments sont colinéaires et se chevauchent (le segment d'intersection).
        )dtyper   r   N)	r   r   rP   r'   dotr^   normminmax)rq   rr   p3p4epsilonr`   ra   dpdetdet_collinear	len_sq_v1t_min_s1t_max_s1	s_proj_p3	s_proj_p4min_s2max_s2overlap_minoverlap_maxtuintersection_points                         r   intersect_segments_2dz TW_Utility.intersect_segments_2d  s    Xb&&&Xb&&&Xb&&&Xb&&& "W"W "W ebembebem+ s88g 2	 qEBqEMBqEBqEM9M=!!G+ - F2rNN	w& s!#R!8!87!Brry~~VX[]V]G^G^ahGhr22nrrF27B//);	F27B//);	
 Y	22Y	22 "(F33 "(F33 +"77   ;455? N "[2%5 566 "[2%5 5rK"<L7LMM4t
 URU]RURU]*c1URU]RURU]*c1
 w;! 	 	 	 	q7{ 	 	 	 	 	q7{a 	 	 	 	1w; 	 	 	 	 	!#a"f%% 4r   c                 :   t          j        |           } t          j        |          }t          j        |          }t          j        |          }|| z
  }||z
  }t          j        ||          }t           j                            |          dk     r| |z
  }t          j        ||          }t           j                            |          dk     rKd}	t          j        ||          dk    r.t          j        || z
  |          t          j        ||          z  nd}
t          j        ||          dk    r.t          j        || z
  |          t          j        ||          z  nd}t          j        ||          dk    r.t          j        || z
  |          t          j        ||          z  nd}t          |	|
g          \  }}t          ||g          \  }}t          ||          }t          ||          }||k    r||k    r| ||z  z   S | ||z  z   | ||z  z   gS dS dS t          j        || z
  |          }t          |          dk    rdS t          j        |d         |d          g|d         |d          gg          }t          j        |d         | d         z
  |d         | d         z
  g          }	 t           j        
                    ||          }|d         }|d         }n# t           j        j        $ r t          j        |d         |d          g|d         |d          gg          }t          j        |d         | d         z
  |d         | d         z
  g          }	 t           j        
                    ||          }|d         }|d         }n# t           j        j        $ r Y Y dS w xY wY nw xY wt          j        | d         ||d         z  z   |d         ||d         z  z             sdS d|cxk    rdk    rn nd|cxk    rdk    rn n
| ||z  z   }|S dS )u  
        Calcule le point d'intersection de deux segments 3D, s'il existe.

        Args:
            p1 (np.array): Premier point du premier segment [x1, y1, z1].
            p2 (np.array): Deuxième point du premier segment [x2, y2, z2].
            p3 (np.array): Premier point du deuxième segment [x3, y3, z3].
            p4 (np.array): Deuxième point du deuxième segment [x4, y4, z4].

        Returns:
            np.array or None: Le point d'intersection si les segments se coupent,
                            sinon None.
        r   g        r   Nr   rL   )r   r   crossr^   r   r   sortedr   r   r'   r_   LinAlgErrorisclose)rq   rr   r   r   r`   ra   cross_product_vv_p1_p3collinear_checkt0t1	t_p3_proj	t_p4_proj
t_seg1_min
t_seg1_max
t_seg2_min
t_seg2_maxr   r   mixed_productABt_ur   r   A_yzB_yzr   s                               r   intersect_segments_3dz TW_Utility.intersect_segments_3dt  s     Xb\\Xb\\Xb\\Xb\\ "W"W (2r**9>>/**T1 )	 2gG hw33Oy~~o..5 # =?VB^^q=PYRVBGR((26"b>>99VYDFF2rNNVWDW`BF27B//"&R..@@]`	DFF2rNNVWDW`BF27B//"&R..@@]`	 *0R)9)9&
J)/I0F)G)G&
J "*j99!*j99+-  
 #k1 N!K"$444 !#[2%5 5rK"<L7LMM4t
 R/::}$ 	4 HURUFOURUFO
  
 HqEBqEMqEBqEM
  	)//!Q''CAAAAAy$ 	 	 	 8AAAA  D 81111  DioodD11FF9(   ttt #	2 z"Q%!be)+RUQAY->?? 	4  	 	 	 	Q 	 	 	 	 	1 	 	 	 	Q 	 	 	 	 	!#a"f%% 4s7   50K& &A<N3#0NN3N-(N3,N--N32N3r   )r   )__name__
__module____qualname__staticmethodr   r   r   r$   r*   r1   r4   r>   objectr   r9   r:   r   r   rI   rU   r\   rc   rn   ru   r   r,   r   r   r   r   r   rx   r   r   r   r      s         \ . . \. F F \F ' ' \'   \   \   \
    \" &F & & & & \& &F & & & & \& h 8    \ % % \%:    \,2$5 5 5     ,   \     \   T    \   \   \ [ [ [ \[| J J \J J Jr   r   )typingr   r   numpyr   r}   r   rx   r   r   <module>r      sn    % % % % % % % %     z z z z z z z z z zr   