Ë
    &Ïêjã.  ã                  óâ  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZddlmZmZ ddlmZmZ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 ej<                  dd„«       Zej<                  dd„«       Z ej<                  dd„«       Z!ej<                  dd„«       Z" G d„ d«      Z# G d„ d«      Z$ G d„ d«      Z% G d„ d«      Z& G d„ d«      Z'e(dk(  r e) ejT                  e+g«      «      ‚y)u  Benchmarky knowledge plane (FÃ¡ze C4).

PÅ™ipravuje benchmark suite postavenou na pytest-benchmark pro:
1. Performance microbenchmarks (embedding latency, search latency, ingestion throughput)
2. Retrieval quality metrics (precision@k, recall@k, MRR, NDCG@k) z BEIR/ragcheck formÃ¡tu
3. Knowledge plane specifickÃ© metriky (entity extraction, temporal validity, graph traversal)

Vzory z vÃ½zkumu:
- pytest-benchmark (BSD, wdm0006/python-skills) â€” `--benchmark-save=main`, `--benchmark-compare`, `--benchmark-compare-fail=median:10%`
- BEIR (MIT) â€” retrieval metriky: nDCG@k, MAP@k, Recall@k, Precision@k, MRR@k
- ragcheck (MIT) â€” offline deterministic retrieval harness s regresnÃ­mi diffy
- LongMemEval (MIT) / LoCoMo (CC BY-NC) â€” pro temporal/multi-session memory metriky
- PrecisionMemBench (tenurehq) â€” izolovanÃ¡ retrieval precision metrika bez LLM-as-judge

CI integrace:
- Baseline save na main: `pytest --benchmark-save=main`
- CI regression guard: `pytest --benchmark-compare=main --benchmark-compare-fail=median:10%`
- Retrieval quality: regresnÃ­ diff s `--threshold recall@5=0.01`

PoznÃ¡mka: LLM-as-a-judge metriky (RAGAS/DeepEval) jsou vhodnÃ© jen jako volitelnÃ¡
nadÅ™azenÃ¡ vrstva, ne jako souÄ�Ã¡st CI suite (ne-deterministickÃ©, vyÅ¾aduje API klÃ­Ä�).
é    )ÚannotationsN)ÚAny)ÚBatchProcessorÚEmbeddingRetryPolicy)ÚDocumentFingerprintÚEmbeddingCacheÚSearchResultCache)ÚKnowledgeDocument©ÚEmbeddingConfig©ÚEmbeddingService©ÚKnowledgeNavigator©ÚKnowledgeVectorStorec                ó"   — t        d| dz  ¬«      S )Né   Úlancedb)Ú
vector_dimÚlancedb_directoryr   )Útmp_paths    ú@/home/oem/CyberBrain26-unified/tests/test_knowledge_benchmark.pyÚconfigr   4   s   € ä d¸hÈÑ>RÔSÐSó    c                ó   — t        | ¬«      S ©N©r   r   r   s    r   Úembedding_servicer   9   s   € ä 6Ô*Ð*r   c                ó   — t        | ¬«      S r   r   r   s    r   Úvector_storer!   >   s   € ä vÔ.Ð.r   c                 ó   — t        «       S ©Nr   © r   r   Ú	navigatorr%   C   s   € äÓÐr   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚTestEmbeddingPerformancez&Benchmark: embedding generace latency.c                ó�  — |j                  d«      }d}||u}|s™t        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}}t        |«      }d	}||k(  }|söt        j                  d
|fd||f«      dt        j                  «       v st        j
                  t        «      rt        j                  t        «      nddt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚dx}x}}y)z(Benchmark single-text embedding latency.zTest document for benchmarkingN©úis not©z%(py0)s is not %(py3)sÚresult©Úpy0Úpy3úassert %(py5)sÚpy5r   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlen©r.   Úpy1r/   Úpy6úassert %(py8)sÚpy8)
Ú
embed_textÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr5   )Úselfr   r,   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9s              r   Útest_embedding_latency_singlez6TestEmbeddingPerformance.test_embedding_latency_singleP   sø   € à"×-Ñ-Ð.NÓOˆØ!Ð!ˆv˜TÐ!×!×!Õ!ˆv˜T×!×!×!×!×!Ñ!ˆv×!×!Ó!ˆv×!×!Ô!˜T×!×!×!×!×!×!Ñ!Ü�6‹{Ð"˜dÐ"ˆ{˜dÑ"×"×"Õ"ˆ{˜d×"×"×"×"×"Ñ"Œs×"×"Ó"Œs×"×"×"×"×"Ò"�6×"×"Ó"�6×"×"Ô"ˆ{×"×"Ò"˜d×"×"×"×"×"×"Ô"r   c                ó¦  — t        d«      D �cg c]  }d|› �‘Œ	 }}t        j                  «       }|D ]  }|j                  |«       Œ t        j                  «       |z
  }t        j                  «       }|j	                  |«       t        j                  «       |z
  }|dkD  r||z  nd}	d}
|	|
kD  }|s™t        j                  d|fd|	|
f«      dt        j                  «       v st        j                  |	«      rt        j                  |	«      ndt        j                  |
«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚dx}}
yc c}w )u°   Benchmark batch vs single embedding.

        Research: batch size 32 je sweet spot (ishwarj.com). Single embedding
        je ~32Ã— slower than batch for same tokens.
        é    zBenchmark document r   ç      ð?g      à?©ú>)z%(py0)s > %(py3)sÚspeedupr-   r0   r1   N)ÚrangeÚtimeÚ	monotonicr;   Úembed_textsr<   r=   r>   r?   r@   rA   rB   rC   )rD   r   ÚiÚtextsÚsingle_startÚtÚsingle_timeÚbatch_startÚ
batch_timerS   rE   rF   rG   rH   s                 r   Útest_embedding_batch_vs_singlez7TestEmbeddingPerformance.test_embedding_batch_vs_singleV   s÷   € ô 5:¸"³IÖ>¨qÐ& q cÒ*Ð>ˆÐ>ä—~‘~Ó'ˆØò 	,ˆAØ×(Ñ(¨Õ+ð	,ä—n‘nÓ&¨Ñ5ˆä—n‘nÓ&ˆØ×%Ñ% eÔ,Ü—^‘^Ó%¨Ñ3ˆ
à.8¸1ªn�+ 
Ò*À#ˆàÐˆw˜‰}××Õˆw˜×××××Ñˆw××Óˆw××Ô˜××××××Òùò ?s   ŽEN©ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rM   r_   r$   r   r   r'   r'   M   s   „ Ù0ó#ôr   r'   c                  ó   — e Zd ZdZdd„Zy)ÚTestSearchPerformancez,Benchmark: search latency (vector + hybrid).c                óú  — ddl m} t        d«      D �cg c]#  } |d|› �dgdz  d|› �dd	|› �d
d|› �di ¬«	      ‘Œ% }}|j                  |«       dgdz  }|j	                  |d«      }t        |«      }d}||kD  }	|	söt        j                  d|	fd||f«      dt        j                  «       v st        j                  t
        «      rt        j                  t
        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚dx}x}	}yc c}w )z Benchmark vector search latency.r   )ÚVectorDocumenté
   zdoc-çš™™™™™¹?r   zDoc Útestz
/test/doc-ç        zhash-)	ÚidÚvectorÚtextÚ	source_idÚpathÚmtimeÚsha256Úchunk_indexÚmetadatarQ   )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr5   Úresultsr6   r9   r:   N)Ú)cyberbrain26.knowledge_plane.vector_storerj   rT   Úadd_documentsÚsearchr5   r<   r=   r>   r?   r@   rA   rB   rC   )rD   r!   rj   rX   ÚdocsÚquery_vectorrx   rE   rI   rJ   rK   rL   s               r   Útest_search_latencyz)TestSearchPerformance.test_search_latencyo   s'  € åLô ˜2“Yö
ð ñ Ø˜!˜�:Ø�u˜t‘|Ø˜A˜3�ZØ Ø! ! Ð%ØØ˜q˜c�{ØØö
ð
ˆð 
ð 	×"Ñ" 4Ô(à�u˜t‘|ˆØ×%Ñ% l°BÓ7ˆÜ�7‹|Ð˜aÐˆ|˜aÑ××Õˆ|˜a×××××ÑŒs××ÓŒs×××××Ò�7××Ó�7××Ôˆ|××Ò˜a××××××Ôùò%
s   ”(E8Nr`   )rc   rd   re   rf   r~   r$   r   r   rh   rh   l   s
   „ Ù6ô r   rh   c                  ó,   — e Zd ZdZ	 	 	 	 	 	 dd„Zdd„Zy)ÚTestRetrievalQualityz@Benchmark: retrieval quality metriky (BEIR/ragcheck compatible).c                ó2  ‡— |r‰sddddddœS |D �cg c]:  }|j                  d«      xs% |j                  d«      xs |j                  dd«      ‘Œ< }}‰j                  |«      }‰rt        |«      t        ‰«      z  nd}|rt        |«      t        |«      z  nd}d}t        |d¬«      D ]  \  }	}
|
‰v sŒd	|	z  } n t	        ˆfd
„t        |«      D «       t        |«      dz   «      }|dkD  rd	|z  nd}t        ˆfd„|D «       «      }|||||rd	dœS ddœS c c}w )zrCompute retrieval quality metrics.

        Returns: precision@k, recall@k, f1@k, hit_rate@k, mrr, ndcg@k
        rn   )Ú	precisionÚrecallÚmrrÚndcgÚhit_ratero   Údocument_idrs   Ú é   )ÚstartrP   c              3  ó8   •K  — | ]  \  }}|‰v sŒ|d z   –— Œ y­w)r‰   Nr$   )Ú.0rX   Údoc_idÚrelevant_idss      €r   ú	<genexpr>z8TestRetrievalQuality._compute_metrics.<locals>.<genexpr>ª   s    øè ø€ ÒQ‘y�q˜&¸&ÀLÒ:PˆQ��UÑQùs   ƒ�
r   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr#   r$   )rŒ   r�   rŽ   s     €r   r�   z8TestRetrievalQuality._compute_metrics.<locals>.<genexpr>¯   s   øè ø€ Ò?¨V�&˜LÔ(Ñ?ùs   ƒ)ÚgetÚintersectionr5   Ú	enumerateÚnextÚany)rD   rx   rŽ   ÚrÚdoc_idsr’   rƒ   r‚   r„   Úrankr�   Úfirst_relevant_rankr…   Úhits     `           r   Ú_compute_metricsz%TestRetrievalQuality._compute_metrics�   sW  ø€ ñ ™lØ!$°¸CÈÐZ]Ñ^Ð^ð OVö
ØIJˆA�E‰E�$‹KÒD˜1Ÿ5™5 Ó/ÒD°1·5±5¸ÀÓ3DÑDð
ˆð 
ð $×0Ñ0°Ó9ˆÙ:F”�\Ó"¤S¨Ó%6Ò6ÈCˆÙ8?”C˜Ó%¬¨G«Ò4ÀSˆ	ð ˆÜ% g°QÔ7ò 	‰LˆD�&Ø˜Ò%Ø˜D‘j�Ùð	ô #ÛQ¤I¨gÓ$6ÔQÜ�‹L˜1Ñó
Ðð -@À!Ò,CˆsÐ(Ò(ÈˆäÓ?°wÔ?Ó?ˆð #ØØØÙ"˜ñ
ð 	
ð
 ),ñ
ð 	
ùò/
s   ’?Dc                óJ  — dddœdddœdddœg}| j                  |ddh¬«      }|d	   }d
}||kD  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t	        t        j
                  |«      «      ‚dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t	        t        j
                  |«      «      ‚dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t	        t        j
                  |«      «      ‚dx}x}}y)z;Test retrieval quality metrics computation with known data.údoc-1çÍÌÌÌÌÌì?©ro   Úscoreúdoc-2gš™™™™™é?údoc-3gffffffæ?)rŽ   rƒ   rn   rQ   )z%(py1)s > %(py4)s©r7   Úpy4úassert %(py6)sr8   Nr†   rP   r2   ©z%(py1)s == %(py4)sr„   )r›   r<   r=   rA   rB   rC   )rD   rx   ÚmetricsÚ@py_assert0Ú@py_assert3rE   Ú@py_format5rK   s           r   Útest_retrieval_quality_basicz1TestRetrievalQuality.test_retrieval_quality_basic¹   s1  € ð  SÑ)Ø SÑ)Ø SÑ)ð
ˆð
 ×'Ñ'¨¸wÈÐ>PÐ'ÓQˆØ�xÑ Ð& 3Ð&Ð  3Ñ&×&×&Õ&Ð  3×&×&Ó&Ð ×&×&Ò& 3×&×&×&×&×&×&Ó&Ø�zÑ"Ð) cÐ)Ð" cÑ)×)×)Õ)Ð" c×)×)Ó)Ð"×)×)Ò) c×)×)×)×)×)×)Ó)Ø�u‰~Ð$ Ð$ˆ~ Ñ$×$×$Õ$ˆ~ ×$×$Ó$ˆ~×$×$Ò$ ×$×$×$×$×$×$Ô$r   N)rx   zlist[dict[str, Any]]rŽ   zset[str]ra   zdict[str, float]r`   )rc   rd   re   rf   r›   r«   r$   r   r   r€   r€   �   s(   „ ÙJð'
Ø+ð'
Ø;Cð'
à	ó'
ôR
%r   r€   c                  ó(   — e Zd ZdZdd„Zdd„Zdd„Zy)ÚTestKnowledgePlaneMetricsu/   Benchmark: knowledge plane specifickÃ© metriky.c                óü  — t        ddddddddi t        j                  «       d	z
  t        j                  «       d	z
  t        j                  «       d	z
  t        j                  «       d	z   d
¬«      }|j                  } ||«      }d}||u }|�st        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}x}}t        ddddddddi t        j                  «       d	z
  t        j                  «       d	z
  d¬«      }	|j                  } ||	«      }d}||u }|�st        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |	«      rt        j                  |	«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}x}}y)zATest temporal validity: valid docs are valid, superseded are not.z	doc-validrm   ztest://doc-validÚabc123z
text/plainÚreviewedÚpersonalÚindexedg      ¬@rˆ   )r‡   rr   Ú
source_uriÚcontent_sha256Ú
media_typeÚtrustÚsensitivityÚstatusrw   Ú
created_atÚ
updated_atÚ
valid_fromÚvalid_toÚsuperseded_byT©Úis)z]%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.check_temporal_validity
}(%(py3)s)
} is %(py8)sr%   Ú	doc_valid)r.   Úpy2r/   r1   r:   zassert %(py10)sÚpy10Nz	doc-staleztest://doc-staleÚdef456z	doc-newer)r‡   rr   r³   r´   rµ   r¶   r·   r¸   rw   r¹   rº   r½   FÚ	doc_stale)r
   rU   Úcheck_temporal_validityr<   r=   r>   r?   r@   rA   rB   rC   )
rD   r%   rÀ   rF   rJ   Ú@py_assert7Ú@py_assert6rL   Ú@py_format11rÄ   s
             r   Útest_temporal_validity_accuracyz9TestKnowledgePlaneMetrics.test_temporal_validity_accuracyÎ   sþ  € ô &Ø#ØØ)Ø#Ø#ØØ"ØØÜ—y‘y“{ VÑ+Ü—y‘y“{ VÑ+Ü—y‘y“{ VÑ+Ü—Y‘Y“[ 6Ñ)Øô
ˆ	ð  ×0Ñ0ÐCÑ0°Ó;ÐC¸tÐCÐ;¸tÐC×C×CÖCÐ;¸t×C×C×C×C×CÑCˆy×C×CÓCˆy×C×CÔCÐ0×C×C×C×C×CÐC°×C×CÓC°×C×CÔCÐ;×C×CÒC¸t×C×C×C×C×C×CÕCô &Ø#ØØ)Ø#Ø#ØØ"ØØÜ—y‘y“{ VÑ+Ü—y‘y“{ VÑ+Ø%ô
ˆ	ð ×0Ñ0ÐDÑ0°Ó;ÐD¸uÐDÐ;¸uÐD×D×DÖDÐ;¸u×D×D×D×D×DÑDˆy×D×DÓDˆy×D×DÔDÐ0×D×D×D×D×DÐD°×D×DÓD°×D×DÔDÐ;×D×DÒD¸u×D×D×D×D×D×DÖDr   c                óš  — |j                  dddd«       |j                  dddd«       |j                  dddd	«       |j                  d«      }d}||v }|s™t        j                  d
|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚dx}}d}||v }|s™t        j                  d
|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚dx}}t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚dx}x}}|j                  dd¬«      }d}||v }|s™t        j                  d
|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚dx}}|d   }t        |«      }ddh}||k(  }|sÉt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}x}}y) z.Test entity graph: add edges, query neighbors.ÚAliceÚBobÚknowsr�   ÚCharlier¡   ÚDaveÚ
works_withr¢   )Úin)z%(py1)s in %(py3)sÚ	neighbors)r7   r/   r0   r1   Né   r2   r4   r5   r6   r9   r:   r‰   )ÚdepthÚrelated)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚset)r.   rÁ   r¤   Úpy7zassert %(py9)sÚpy9)Úadd_entity_edgeÚget_entity_neighborsr<   r=   rA   r>   r?   r@   rB   rC   r5   Úget_related_entitiesrÖ   )rD   r%   rÒ   r¨   rE   rG   rH   rI   rJ   rK   rL   rÕ   rF   r©   rÇ   Ú@py_format8Ú@py_format10s                    r   Útest_entity_graph_traversalz5TestKnowledgePlaneMetrics.test_entity_graph_traversalô   s‚  € à×!Ñ! '¨5°'¸7ÔCØ×!Ñ! '¨9°g¸wÔGØ×!Ñ! %¨°¸wÔGà×2Ñ2°7Ó;ˆ	ØÐ!ˆu˜	Ð!×!×!Õ!ˆu˜	×!×!Ó!ˆu×!×!×!×!×!Ð!˜	×!×!Ó!˜	×!×!×!×!×!×!Ó!ØÐ%ˆy˜IÐ%×%×%Õ%ˆy˜I×%×%Ó%ˆy×%×%×%×%×%Ð%˜I×%×%Ó%˜I×%×%×%×%×%×%Ó%Ü�9‹~Ð" Ð"ˆ~ Ñ"×"×"Õ"ˆ~ ×"×"×"×"×"Ñ"Œs×"×"Ó"Œs×"×"×"×"×"Ò"�9×"×"Ó"�9×"×"Ô"ˆ~×"×"Ò" ×"×"×"×"×"×"Ó"à×0Ñ0°ÀÐ0ÓBˆØÐˆq�Gˆ|××Õˆq�G××Óˆq×××××Ð�G××Ó�G××××××ÓØ˜1‘:Ð4Œs�:‹Ð4 5¨)Ð"4Ð4ˆÐ"4Ñ4×4×4Õ4ˆÐ"4×4×4×4×4×4Ñ4Œs×4×4Ó4Œs×4×4Ô4�:×4×4Ò4ˆ×4×4Ò4Ð"4×4×4×4×4×4×4Ö4r   c                ó(  — t        d«      D ]  }|j                  d|› �d|dz   › �dd«       Œ! t        j                  «       }|j	                  d«      }t        j                  «       |z
  dz  }d}||k  }|s™t        j                  d	|fd
||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚dx}}y)zTest graph traversal latency.é2   zentity-r‰   rÍ   Údocz	entity-25g     @�@g      $@)ú<)z%(py0)s < %(py3)sÚ
elapsed_msr-   r0   r1   N)rT   rÙ   rU   rV   rÚ   r<   r=   r>   r?   r@   rA   rB   rC   )
rD   r%   rX   rŠ   rÒ   rã   rE   rF   rG   rH   s
             r   Útest_graph_traversal_speedz4TestKnowledgePlaneMetrics.test_graph_traversal_speed  sÊ   € ô �r“ò 	VˆAØ×%Ñ%¨°¨s m°w¸qÀ¹s¸e°_ÀgÈuÕUð	Vô —‘Ó ˆØ×2Ñ2°;Ó?ˆ	Ü—n‘nÓ&¨Ñ.°&Ñ8ˆ
à Ð ˆz˜DÑ × × Õ ˆz˜D× × × × × Ñ ˆz× × Ó ˆz× × Ô ˜D× × × × × × Ò r   Nr`   )rc   rd   re   rf   rÉ   rÞ   rä   r$   r   r   r­   r­   Ë   s   „ Ù9ó$EóL5ô
!r   r­   c                  ó(   — e Zd ZdZdd„Zdd„Zdd„Zy)ÚTestCachingEffectivenessz/Benchmark: caching hit rates and effectiveness.c                ó,  — t        |dz  ¬«      }d}d}dgdz  }|j                  |||«       |j                  ||d«      }d}||u}|s™t        j                  d|fd	||f«      d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚dx}}t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndd
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}|j                  «       }|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}|d   }d}||k\  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}|j                  «        y)z5Test embedding cache: second lookup should hit cache.zembedding_cache.sqlite)Údb_pathÚ0abc123abc123abc123abc123abc123abc123abc123abc123z
test-modelrl   r   Nr)   r+   r,   r-   r0   r1   r2   r4   r5   r6   r9   r:   Útotal_entriesr‰   r¦   r£   r¥   r8   Ú
total_hits)ú>=)z%(py1)s >= %(py4)s)r   rÖ   r‘   r<   r=   r>   r?   r@   rA   rB   rC   r5   ÚstatsÚclose)rD   r   ÚcacheÚcontent_hashÚmodelrp   r,   rE   rF   rG   rH   rI   rJ   rK   rL   rí   r¨   r©   rª   s                      r   Útest_embedding_cache_hit_ratez6TestCachingEffectiveness.test_embedding_cache_hit_rate  sæ  € ä xÐ2JÑ'JÔKˆØ#ˆØˆØ�˜‘ˆà�	‰	�,  vÔ.Ø—‘˜<¨°Ó5ˆØ!Ð!ˆv˜TÐ!×!×!Õ!ˆv˜T×!×!×!×!×!Ñ!ˆv×!×!Ó!ˆv×!×!Ô!˜T×!×!×!×!×!×!Ñ!Ü�6‹{Ð"˜dÐ"ˆ{˜dÑ"×"×"Õ"ˆ{˜d×"×"×"×"×"Ñ"Œs×"×"Ó"Œs×"×"×"×"×"Ò"�6×"×"Ó"�6×"×"Ô"ˆ{×"×"Ò"˜d×"×"×"×"×"×"Ó"à—‘“ˆØ�_Ñ%Ð*¨Ð*Ð%¨Ñ*×*×*Õ*Ð%¨×*×*Ó*Ð%×*×*Ò*¨×*×*×*×*×*×*Ó*Ø�\Ñ"Ð' aÐ'Ð" aÑ'×'×'Õ'Ð" a×'×'Ó'Ð"×'×'Ò' a×'×'×'×'×'×'Ó'à�‰�r   c                óª  — t        dd¬«      }dddœg}|j                  dd|d¬	«       |j                  ddd¬	«      }d
}||u}|s™t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d
x}}|d   d   }d}	||	k(  }|slt        j                  d|fd||	f«      t        j                  |«      t        j                  |	«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d
x}x}}	|j                  ddd¬	«      }d
}||u }|s™t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d
x}}|j                  «       }d}||k(  }|s™t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d
x}}y
)z-Test search result cache: get/set/invalidate.rk   g      N@)Úmax_sizeÚttl_secondsr�   rž   rŸ   Úqueryrm   )ÚtopicNr)   r+   Úcachedr-   r0   r1   r   ro   r2   r¦   r£   r¥   r8   zdifferent-queryr¾   )z%(py0)s is %(py3)sÚmissedr‰   )z%(py0)s == %(py3)sÚinvalidated)r	   rÖ   r‘   r<   r=   r>   r?   r@   rA   rB   rC   Ú
invalidate)rD   rï   rx   rø   rE   rF   rG   rH   r¨   r©   rª   rK   rù   rú   s                 r   Útest_search_result_cachez1TestCachingEffectiveness.test_search_result_cache*  sÄ  € ä!¨2¸4Ô@ˆØ!¨CÑ0Ð1ˆà�	‰	�'˜2˜w¨fˆ	Ô5Ø—‘˜7 B¨f�Ó5ˆØ!Ð!ˆv˜TÐ!×!×!Õ!ˆv˜T×!×!×!×!×!Ñ!ˆv×!×!Ó!ˆv×!×!Ô!˜T×!×!×!×!×!×!Ñ!Ø�a‰y˜‰Ð) 'Ð)ˆ 'Ñ)×)×)Õ)ˆ '×)×)Ó)ˆ×)×)Ò) '×)×)×)×)×)×)Ó)ð —‘Ð,¨b¸�Ó?ˆØÐˆv˜ˆ~××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××Ñà×&Ñ&Ó(ˆØÐˆ{˜aÑ××Õˆ{˜a×××××Ñˆ{××Óˆ{××Ô˜a××××××Òr   c                ó‚  — d}t        j                  |«      }t        j                  |«      }|j                  }|j                  }||k(  }|sît        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d	x}x}}|j                  }d
} ||«      }|j                  }	d}
 |	|
«      }||k7  }|�s>t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |	«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d	x}x}x}x}x}	x}
}y	)z1Test document fingerprint: stable hash for dedup.s   Hello, World!r2   )zZ%(py2)s
{%(py2)s = %(py0)s.content_sha256
} == %(py6)s
{%(py6)s = %(py4)s.content_sha256
}Úfp1Úfp2)r.   rÁ   r¤   r8   r9   r:   Nzmodel-v1zmodel-v2)ú!=)z‘%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.cache_key
}(%(py4)s)
} != %(py14)s
{%(py14)s = %(py10)s
{%(py10)s = %(py8)s.cache_key
}(%(py12)s)
})r.   rÁ   r¤   r8   r:   rÂ   Úpy12Úpy14zassert %(py16)sÚpy16)r   Úfrom_contentr´   r<   r=   r>   r?   r@   rA   rB   rC   Ú	cache_key)rD   Úcontentrþ   rÿ   rF   rI   r©   rK   rL   Ú@py_assert9Ú@py_assert11Ú@py_assert13rÆ   Ú@py_format15Ú@py_format17s                  r   Útest_document_fingerprintz2TestCachingEffectiveness.test_document_fingerprint;  s¤  € à"ˆÜ!×.Ñ.¨wÓ7ˆÜ!×.Ñ.¨wÓ7ˆØ×!Ñ!Ð7 S×%7Ñ%7Ð7Ð!Ð%7Ñ7×7×7Õ7Ð!Ð%7×7×7×7×7×7Ñ7ˆs×7×7Ó7ˆs×7×7Ô7Ð!×7×7×7×7×7Ð7 S×7×7Ó7 S×7×7Ô7Ð%7×7×7×7×7×7×7Ó7Ø�}‰}ÐE˜ZÐE‰}˜ZÓ(ÐE¨C¯M©MÐE¸*ÐE©M¸*Ó,EÐEÐ(Ð,EÑE×E×EÖEÐ(Ð,E×E×E×E×E×EÑEˆs×E×EÓEˆs×E×EÔEˆ}×E×EÒE˜Z×E×EÒEÐ(×E×E×E×E×EÐE¨C×E×EÓE¨C×E×EÔE¨M×E×EÒE¸*×E×EÒEÐ,E×E×E×E×E×E×E×EÔEr   Nr`   )rc   rd   re   rf   rò   rü   r  r$   r   r   ræ   ræ     s   „ Ù9óó$ ô"Fr   ræ   Ú__main__)ra   r   )ra   r   )ra   r   )ra   r   ),rf   Ú
__future__r   Úbuiltinsr>   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter<   rU   Útypingr   ÚpytestÚ,cyberbrain26.knowledge_plane.batch_processorr   r   Ú$cyberbrain26.knowledge_plane.cachingr   r   r	   Ú&cyberbrain26.knowledge_plane.contractsr
   Ú-cyberbrain26.knowledge_plane.embedding_configr   Ú.cyberbrain26.knowledge_plane.embedding_servicer   Ú'cyberbrain26.knowledge_plane.navigationr   ry   r   Úfixturer   r   r!   r%   r'   rh   r€   r­   ræ   rc   Ú
SystemExitÚmainÚ__file__r$   r   r   ú<module>r     s   ðñõ. #ç  „ ƒÝ ã ÷÷ñ õ
 EÝ IÝ KÝ FÝ Jð ‡�òTó ðTð ‡�ò+ó ð+ð ‡�ò/ó ð/ð ‡�ò ó ð ÷ñ ÷> ñ  ÷B6%ñ 6%÷|B!ñ B!÷T,Fñ ,Fð^ ˆzÒÙ
�[�V—[‘[ ( Ó,Ó
-Ð-ð r   