RSCE / tests /test_knowledge_gaps.py
LP1205's picture
Deploy RSCE backend to Hugging Face Space
5e952bb
Raw
History Blame Contribute Delete
3.63 kB
import uuid
from src.models.paper import Paper
from src.models.claim import Claim, ClaimType, Polarity, StudyDesign, Entity, EntityType
from src.models.contradiction import ContradictionPair, ContradictionType
from src.synthesis.report_generator import detect_knowledge_gaps
def make_paper(pmid: str, author: str, year: int) -> Paper:
return Paper(
pmid=pmid,
title="Sample Paper Title",
authors=[author],
year=year,
journal="Sample Journal",
abstract_text="Abstract content",
full_text=None,
doi="10.1000/xyz"
)
def make_claim(id_str: str, pmid: str, year: int, entities: list[Entity], claim_type: ClaimType = ClaimType.CAUSAL) -> Claim:
return Claim(
id=uuid.UUID(id_str),
text="Sample claim text",
paper_id=pmid,
section="Abstract",
year=year,
confidence_score=1.0,
claim_type=claim_type,
polarity=Polarity.POSITIVE,
population="humans",
context="general",
quote_anchor="anchor",
study_design=StudyDesign.RCT,
sample_size=100,
entities=entities
)
def test_detect_knowledge_gaps():
# Setup papers
paper_1 = make_paper("pmid1", "Author One", 2020)
paper_2 = make_paper("pmid2", "Author Two", 2021)
papers = [paper_1, paper_2]
# Setup entities
ent_a = Entity(text="Metformin", canonical_id="MeSH:D001241", entity_type=EntityType.DRUG)
ent_b = Entity(text="Breast Cancer", canonical_id="MeSH:D001943", entity_type=EntityType.DISEASE)
ent_c = Entity(text="Aspirin", canonical_id="MeSH:D001242", entity_type=EntityType.DRUG)
ent_d = Entity(text="Alzheimer", canonical_id="MeSH:D000544", entity_type=EntityType.DISEASE)
# Claim 1 in paper 1 (Metformin vs Breast Cancer)
claim_1 = make_claim("11111111-1111-1111-1111-111111111111", "pmid1", 2020, [ent_a, ent_b])
# Claim 2 in paper 2 (Aspirin vs Alzheimer)
claim_2 = make_claim("22222222-2222-2222-2222-222222222222", "pmid2", 2021, [ent_c, ent_d])
claims = [claim_1, claim_2]
# No contradictions initially
contradictions = []
gaps = detect_knowledge_gaps(claims, contradictions, papers)
assert len(gaps) == 2
assert any("Metformin" in g and "Breast Cancer" in g for g in gaps)
assert any("Aspirin" in g and "Alzheimer" in g for g in gaps)
# 1. Test replication: add claim 3 in paper 2 discussing the same topic (Metformin vs Breast Cancer)
claim_3 = make_claim("33333333-3333-3333-3333-333333333333", "pmid2", 2021, [ent_a, ent_b])
claims_replicated = [claim_1, claim_2, claim_3]
gaps_replicated = detect_knowledge_gaps(claims_replicated, contradictions, papers)
# Metformin vs Breast Cancer is now replicated (in pmid1 and pmid2), so only Aspirin vs Alzheimer remains as gap
assert len(gaps_replicated) == 1
assert "Aspirin" in gaps_replicated[0]
assert "Metformin" not in gaps_replicated[0]
# 2. Test contradiction: add contradiction pair involving claim 2
claim_4 = make_claim("44444444-4444-4444-4444-444444444444", "pmid1", 2020, [ent_c, ent_d])
pair = ContradictionPair(
claim_a=claim_2,
claim_b=claim_4,
contradiction_score=0.9,
contradiction_type=ContradictionType.DIRECT_NEGATION,
explanation="Opposing findings",
scope_note="",
temporal_resolution=None,
is_genuine=True
)
# Aspirin vs Alzheimer is now contradicted, so it shouldn't be a gap
gaps_contradicted = detect_knowledge_gaps([claim_2, claim_4], [pair], papers)
assert len(gaps_contradicted) == 0