o
    Ďi<B                     @   s   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ZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&d!Z'd"Z(d#Z)d$Z*G d%d& d&Z+dS )'    N)Classification)PredictionTypeSpeciesNetEnsemble)get_ancestor_at_level)load_rgb_imagez/f1856211-cfb7-4a5b-9158-c0f72fd09ee6;;;;;;blankz;;;;zS990ae9dd-7a59-4344-afcb-1b7b21368000;mammalia;primates;hominidae;homo;sapiens;humanz(mammalia;primates;hominidae;homo;sapiensz1e2895ed5-780b-48f6-8a11-9e27cb594511;;;;;;vehiclezQddf59264-185a-4d35-b647-2785792bdf54;mammalia;carnivora;felidae;panthera;leo;lionz'mammalia;carnivora;felidae;panthera;leozZfbb23d07-6677-43db-b650-f99ac452c50f;mammalia;carnivora;felidae;panthera;;panthera speciesz$mammalia;carnivora;felidae;panthera;zLdf8514b0-10a5-411f-8ed6-0f415e8153a3;mammalia;carnivora;felidae;;;cat familyzmammalia;carnivora;felidae;;zMeeeb5d26-2a47-4d01-a3de-10b33ec0aee4;mammalia;carnivora;;;;carnivorous mammalzmammalia;carnivora;;;z8f2d233e3-80e3-433d-9687-e29ecc7a467a;mammalia;;;;;mammalzmammalia;;;;z01f689929-883d-4dae-958c-3d57ab5b6c16;;;;;;animalzW330bb1e9-84d6-4e41-afa9-938aee17ea29;mammalia;carnivora;ursidae;ursus;arctos;brown bearz'mammalia;carnivora;ursidae;ursus;arctoszZe7f83bf6-df2c-4ce0-97fc-2f233df23ec4;mammalia;carnivora;ursidae;ursus;maritimus;polar bearz*mammalia;carnivora;ursidae;ursus;maritimuszb85662682-67c1-4ecb-ba05-ba12e2df6b65;mammalia;carnivora;ursidae;ailuropoda;melanoleuca;giant pandaz1mammalia;carnivora;ursidae;ailuropoda;melanoleucazT5a0f5e3f-c634-4b86-910a-b105cb526a24;mammalia;carnivora;ursidae;ursus;;ursus speciesz!mammalia;carnivora;ursidae;ursus;zMec1a70f4-41c0-4aba-9150-292fb2b7a324;mammalia;carnivora;ursidae;;;bear familyzmammalia;carnivora;ursidae;;zR9c564562-9429-405c-8529-04cff7752282;mammalia;carnivora;felidae;puma;concolor;pumaz(mammalia;carnivora;felidae;puma;concolorzXe588253d-d61d-4149-a96c-8c245927a80f;mammalia;carnivora;felidae;felis;margarita;sand catz*mammalia;carnivora;felidae;felis;margaritac                   @   s   e Zd ZdZejdddedefddZejdefdd	Z	ejdefd
dZ
ejdefddZdddZdddZdddZdS )TestEnsemblez!Tests for the ensemble component.class)scope
model_namereturnc                 C   s   t |S )Nr   )selfr    r   T/home/jeff/fluffinator/venv/lib/python3.10/site-packages/speciesnet/ensemble_test.pyensembleJ   s   zTestEnsemble.ensemblec                 C   s   t ttttttttt	t
ttttttttttttttttti}||d| tdg g ditdg g ddgdit
g g g g dg dgd	d
tddg iitddg iii}||d| |S )Ntaxonomy_mapallow)KENTZAAKCA)r   r   USA)FRAr   r   r   NY)r   r   )r   blockr   AUSGBRgeofence_map)BLANK_FCBLANKHUMAN_FCHUMAN
VEHICLE_FCVEHICLELION_FCLIONPANTHERA_GENUS_FCPANTHERA_GENUSFELIDAE_FAMILY_FCFELIDAE_FAMILYCARNIVORA_ORDER_FCCARNIVORA_ORDERMAMMALIA_CLASS_FCMAMMALIA_CLASSANIMAL_KINGDOM_FCANIMAL_KINGDOMBROWN_BEAR_FC
BROWN_BEARPOLAR_BEAR_FC
POLAR_BEARGIANT_PANDA_FCGIANT_PANDAURSUS_GENUS_FCURSUS_GENUSURSIDAE_FAMILY_FCURSIDAE_FAMILYsetattrSAND_CAT_FC)r   monkeypatchr   r   r   r   r   r   mock_ensembleN   sh   %zTestEnsemble.mock_ensemblec                 C   s   | |dd |S )Nenable_geofenceF)r:   )r   r<   r=   r   r   r   mock_ensemble_no_geofence   s   z&TestEnsemble.mock_ensemble_no_geofencec                 C   s,   dt ttf dtfdd}||d| |S )Nclassificationsr   c                 _   s   ~~| d d | d d dfS )Nclassesr   scoresmockr   )r@   argskwargsr   r   r   prediction_combiner_mock   s   z=TestEnsemble.mock_ensemble2.<locals>.prediction_combiner_mockprediction_combiner)dictstrlistr   r:   )r   r<   r   rF   r   r   r   mock_ensemble2   s   

zTestEnsemble.mock_ensemble2Nc                 C   s6  t d}t d}t d}|r|r|sJ |jj}g d}ddgddg d	g d
dddg dg ddddg dg ddddg dg dddd}ddgdddddg ddgdddddg d dgdddddg d dgddg dd!}d"d#id"d$id"d%id"d&id"d'id(}	ddd)gd*gdg d)d+d,|d-i}
|||||	|
dddgd#|d.ddgd$dddg ddg|d/ddgd%g d	g d
d|d0dd1gg dg dddddg d dgd2dd3|d4dd&g dg dddddg d dgd5d6d3|d7dd)gd*gdg d)d+d,|d-gksJ d S )8Nztest_data/blank.jpgztest_data/blank2.jpgztest_data/blank3.jpg)a.jpgb.jpgc.jpgd.jpge.jpgf.jpgrM   
CLASSIFIER)filepathfailuresrN   )XYZ)      ?333333?皙?)rA   rB   )rS   r@   rO   )RST)ffffff?rZ   皙?rP   )KLM)?r_           rQ   )rM   rN   rO   rP   rQ   rL   DETECTOR1animalrX   )rd   r_   rZ   rY   )categorylabelconfbbox)rS   
detections2humanr^   )r_   rZ   rY   皙?)rL   rM   rO   rP   rQ   country	COUNTRY_A	COUNTRY_B	COUNTRY_C	COUNTRY_E	COUNTRY_F)rL   rM   rN   rP   rQ   XYZg?ro   partial)rS   r@   rl   
predictionprediction_scoreprediction_sourcemodel_version)rS   rT   rp   r{   )rS   rT   rp   rl   r{   )rS   rT   rp   r@   r{   GEOLOCATIONr[   rC   )rS   rT   r@   rl   rx   ry   rz   r{   r`   rc   )rS   rp   r@   rl   rx   ry   rz   r{   )r   
model_infoversioncombine)r   rK   	blank_img
blank2_img
blank3_imgexpected_model_version	filepathsclassifier_resultsdetector_resultsgeolocation_resultspartial_predictionsr   r   r   test_combine   s>  
$-zTestEnsemble.test_combinec                 C   s  t  }ddddddd}dtd	tfd
d}dtd	tfdd}dtdtd	tfdd}t|jjddd}dd | D }W d    n1 sFw   Y  tjtj	fD ]}	||	}
|
|j
v s^J |j
|
 |	ksgJ qQtjfD ]}	||	}
|
|j
vsyJ ql|D ]6}	|	tjtjtjfv rq|||	}| D ] \}}t|	||j
}||kr|s|||	| q|d u sJ qq||rttddt|  d S d S )Nr                  )kingdomr	   orderfamilygenusspeciesri   r   c                 S      d | ddd S N;r      joinsplitri   r   r   r   _taxa_from_label     z=TestEnsemble.test_complete_taxonomy.<locals>._taxa_from_labelc                 S   s0   |  d}tdddD ]
}|| r|  S qdS )Nr   r   r   )r   range)ri   label_partsidxr   r   r   _level_idx_from_label  s   
zBTestEnsemble.test_complete_taxonomy.<locals>._level_idx_from_label	level_idxc                 S   ,   |  d}d|d|d  dd|   S Nr   r   r   r   r   ri   r   r   r   r   r   _ancestor_from_label     
"zATestEnsemble.test_complete_taxonomy.<locals>._ancestor_from_labelrutf-8modeencodingc                 S      g | ]}|  qS r   strip.0liner   r   r   
<listcomp>      z7TestEnsemble.test_complete_taxonomy.<locals>.<listcomp>zMissing from taxonomy: 

)setrI   intopenr}   classifier_labels	readlinesr   r!   ANIMALr   UNKNOWNr   r#   itemsr   addwarningswarnUserWarningr   sorted)r   r   missing_ancestorstaxonomy_levelsr   r   r   fpr   ri   taxamax_level_idxtaxonomy_leveltaxonomy_level_idxancestorr   r   r   test_complete_taxonomy|  sf   	
z#TestEnsemble.test_complete_taxonomyc                 C   s@  t  }dtdtfdd}dtdtdtfdd}t|jjdd	d
}dd | D }W d    n1 s4w   Y  tjtj	tj
tjfD ]}||}||jvsPJ qCtjfD ]}||}||jv sbJ qU|D ]&}|tjtj	tj
tjfv rtqetddD ]}	|||	}
|
|jvr||
 qyqe|rttddt|  d S d S )Nri   r   c                 S   r   r   r   r   r   r   r   r     r   z=TestEnsemble.test_complete_geofence.<locals>._taxa_from_labelr   c                 S   r   r   r   r   r   r   r   r     r   zATestEnsemble.test_complete_geofence.<locals>._ancestor_from_labelr   r   r   c                 S   r   r   r   r   r   r   r   r     r   z7TestEnsemble.test_complete_geofence.<locals>.<listcomp>r   r   zMissing from geofence: 
r   )r   rI   r   r   r}   r   r   r   r   r   r#   r   r   r!   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   ri   r   r   r   r   r   r   test_complete_geofence  sP   



z#TestEnsemble.test_complete_geofence)r   N)__name__
__module____qualname____doc__pytestfixturerI   r   r   r=   r?   rK   r   r   r   r   r   r   r   r   G   s     
<
 
ZEr   ),r   r   speciesnet.constantsr   speciesnet.ensembler   r   speciesnet.taxonomy_utilsr   speciesnet.utilsr   r   r   r!   r    r#   r"   r%   r$   r'   r&   r)   r(   r+   r*   r-   r,   r/   r.   r1   r0   r3   r2   r5   r4   r7   r6   r9   r8   PUMAPUMA_FCSAND_CATr;   r   r   r   r   r   <module>   sP   