AEE / aee_updater.py
NextGenC's picture
Upload 10 files
37e65d4 verified
# aee_updater.py
# AEE v2.0: Kaynak güvenilirliğini ve önerme güven skorlarını dinamik olarak günceller.
# v2.0.1: Kaynak güvenilirliği hesaplama mantığı düzeltildi/basitleştirildi.
import math
from typing import Dict, List, Optional
from collections import defaultdict
# v2.0 klasöründeki sınıfları import et
from aee_core_classes import Proposition
# --- Yardımcı Sabitler ve Parametreler ---
DEFAULT_SOURCE_RELIABILITY = 0.6 # Varsayılanı biraz artıralım
RELIABLE_SOURCE_SCORE = 0.75 # Çelişkisi olmayan kaynak skoru
UNRELIABLE_SOURCE_SCORE = 0.35 # Çelişkisi olan kaynak skoru
MIN_CONFIDENCE = 0.01
MAX_CONFIDENCE = 0.99
# MIN/MAX_RELIABILITY artık doğrudan atanıyor
# Güven güncelleme formülü için ağırlıklar (aynı)
SUPPORT_WEIGHT = 0.10
CONTRADICTION_WEIGHT = 0.35
RELIABILITY_DAMPENING_FACTOR = 0.5
# --- Kaynak Güvenilirliği Hesaplama (Düzeltilmiş/Basitleştirilmiş Mantık) ---
def calculate_source_reliability_v2(source_id: str, kb: Dict[str, Proposition]) -> float:
"""
Belirli bir kaynağın güvenilirliğini, KB'deki o kaynaktan gelen
önermelerin *herhangi bir çelişkiye karışıp karışmadığına* göre basitçe belirler.
"""
props_from_source = [p for p in kb.values() if p.epistemic_data.source_id == source_id]
if not props_from_source:
return DEFAULT_SOURCE_RELIABILITY
has_any_contradiction = False
for prop in props_from_source:
if prop.epistemic_data.contradicts: # Bu kaynaktan gelen bir önermenin çelişkisi var mı?
has_any_contradiction = True
break # Bir tane bulmak yeterli
if has_any_contradiction:
# print(f"DEBUG Reliability: Source {source_id} flagged as UNRELIABLE.")
return UNRELIABLE_SOURCE_SCORE
else:
# print(f"DEBUG Reliability: Source {source_id} flagged as RELIABLE.")
return RELIABLE_SOURCE_SCORE
# --- Önerme Güven Skoru Güncelleme (Aynı kaldı) ---
def update_proposition_confidence_v2(prop: Proposition, kb: Dict[str, Proposition], source_reliability_scores: Dict[str, float]):
"""
Bir önermenin 'computed_confidence' değerini, başlangıç güveni, kaynak
güvenilirliği ve destekleyici/çelişkili kanıtların güven skorlarına göre günceller.
Not: Bu fonksiyon doğrudan prop nesnesini değiştirir.
"""
ep_data = prop.epistemic_data
initial_conf = ep_data.initial_confidence
# Hesaplanan güvenilirliği kullan, yoksa varsayılanı kullan
source_reliability = source_reliability_scores.get(ep_data.source_id, DEFAULT_SOURCE_RELIABILITY)
# Güvenilirliği sönümlendirme faktörü ile başlangıç güvenini ayarla
adjusted_initial_conf = initial_conf * (1 - RELIABILITY_DAMPENING_FACTOR) + \
(initial_conf * source_reliability) * RELIABILITY_DAMPENING_FACTOR
current_confidence = adjusted_initial_conf
# Destekleyici kanıtların etkisini ekle
total_support_effect = 0.0
if ep_data.supports:
support_count = 0 # Debug
for supporter_id in ep_data.supports:
supporter_prop = kb.get(supporter_id)
if supporter_prop:
support_count += 1
support_gain = SUPPORT_WEIGHT * supporter_prop.epistemic_data.computed_confidence * (1 - current_confidence)
total_support_effect += support_gain
# print(f"DEBUG Confidence {prop.prop_id[:4]}: Support effect calculated from {support_count} supporters.")
current_confidence += total_support_effect
# Çelişkili kanıtların etkisini çıkar
total_contradiction_effect = 0.0
if ep_data.contradicts:
contradiction_count = 0 # Debug
for contradictor_id in ep_data.contradicts:
contradictor_prop = kb.get(contradictor_id)
if contradictor_prop:
contradiction_count += 1
contradiction_loss = CONTRADICTION_WEIGHT * contradictor_prop.epistemic_data.computed_confidence * current_confidence
total_contradiction_effect += contradiction_loss
# print(f"DEBUG Confidence {prop.prop_id[:4]}: Contradiction effect calculated from {contradiction_count} contradictors.")
current_confidence -= total_contradiction_effect
# Güveni sınırlar içinde tut
ep_data.computed_confidence = max(MIN_CONFIDENCE, min(MAX_CONFIDENCE, current_confidence))
# print(f"DEBUG Confidence {prop.prop_id[:4]}: Final computed confidence: {ep_data.computed_confidence:.3f}")
# --- Toplu Güncelleme Fonksiyonu (Aynı kaldı) ---
def run_updates_v2(kb: Dict[str, Proposition]) -> Dict[str, Proposition]:
"""
Tüm KB üzerinde kaynak güvenilirliğini hesaplar ve ardından tüm
önermelerin güven skorlarını günceller. Değiştirilmiş KB'yi döndürür.
"""
print("\nRunning v2 Updates (Reliability & Confidence)...")
if not kb:
print("Knowledge Base is empty. No updates to run.")
return kb
# 1. Adım: Tüm kaynakların güvenilirliğini hesapla
print(" Calculating source reliabilities...")
source_ids = set(p.epistemic_data.source_id for p in kb.values())
source_reliability_scores: Dict[str, float] = {}
for source_id in source_ids:
reliability = calculate_source_reliability_v2(source_id, kb)
source_reliability_scores[source_id] = reliability
# Hesaplanan güvenilirliği ilgili önermelerin EpistemicData'sına da yazalım
for prop in kb.values():
if prop.epistemic_data.source_id == source_id:
prop.epistemic_data.reliability_score = reliability
# 2. Adım: Tüm önermelerin güven skorlarını güncelle
print(" Updating proposition confidences...")
propositions_to_update = list(kb.values())
for prop in propositions_to_update:
update_proposition_confidence_v2(prop, kb, source_reliability_scores)
print("Updates complete.")
return kb
# --- Test Bloğu (Aynı kaldı) ---
if __name__ == "__main__":
# ... (Önceki test bloğu kodu burada - değişiklik yok) ...
print("\nTesting AEE Updater Module (v2.0.1 - with updated reliability)...")
from aee_core_classes import EpistemicData # Test için gerekli
# Test için sahte KB oluşturalım
kb_test: Dict[str, Proposition] = {}
# Güvenilir Kaynak 1
src_reliable = "reliable_source.com"
ed_r1 = EpistemicData(source_id=src_reliable, initial_confidence=0.9)
p_r1 = Proposition("sky is blue", "sky is blue", ed_r1, "sky", "be", "blue")
kb_test[p_r1.prop_id] = p_r1
ed_r2 = EpistemicData(source_id=src_reliable, initial_confidence=0.85)
p_r2 = Proposition("grass is green", "grass is green", ed_r2, "grass", "be", "green")
kb_test[p_r2.prop_id] = p_r2
# Güvenilmez Kaynak 1
src_unreliable = "unreliable_source.net"
ed_u1 = EpistemicData(source_id=src_unreliable, initial_confidence=0.4)
p_u1 = Proposition("sky is green", "sky is green", ed_u1, "sky", "be", "green")
kb_test[p_u1.prop_id] = p_u1
ed_u2 = EpistemicData(source_id=src_unreliable, initial_confidence=0.3)
p_u2 = Proposition("sky is not blue", "sky is not blue", ed_u2, "sky", "be", "blue", is_negated=True) # p_r1 ile çelişir
kb_test[p_u2.prop_id] = p_u2
# Güvenilir Kaynak 2
src_reliable2 = "another_reliable.org"
ed_r3 = EpistemicData(source_id=src_reliable2, initial_confidence=0.8)
p_r3 = Proposition("sky is blue", "reports say sky is blue", ed_r3, "sky", "be", "blue") # p_r1'i destekler
kb_test[p_r3.prop_id] = p_r3
print(f"\nInitial KB state (Before Linking & Updates): {len(kb_test)} propositions")
# Linkleri manuel simüle et
p_r1.epistemic_data.contradicts.append(p_u2.prop_id)
p_u2.epistemic_data.contradicts.append(p_r1.prop_id)
p_r1.epistemic_data.supports.append(p_r3.prop_id)
p_r3.epistemic_data.supports.append(p_r1.prop_id)
print("\nSimulated Linking complete.")
# Güncellemeleri çalıştır
updated_kb_test = run_updates_v2(kb_test)
print("\n--- Final KB State (After Updates) ---")
for prop_id, prop_obj in updated_kb_test.items():
print(f"ID: {prop_id[:8]} | Src: {prop_obj.epistemic_data.source_id} "
f"| InitConf: {prop_obj.epistemic_data.initial_confidence:.2f} "
f"| SrcRel: {prop_obj.epistemic_data.reliability_score:.2f} "
f"| FinalConf: {prop_obj.epistemic_data.computed_confidence:.3f} "
f"| Supports: {len(prop_obj.epistemic_data.supports)} "
f"| Contradicts: {len(prop_obj.epistemic_data.contradicts)}")
print("\nUpdater module testing complete.")