AEE / aee_updater_era.py
NextGenC's picture
Upload 10 files
37e65d4 verified
# aee_updater_era.py
# AEE Era Sürümü: Güven/Güvenilirlik güncellemeleri + Plausibility + Bias/Cycle Ceza
# v1.0.1 (Era): Bias flag kontrolü için debug print eklendi.
import math
from typing import Dict, List, Optional, Set
from collections import defaultdict
try:
from aee_core_classes_era import Proposition
except ImportError:
print("Updater Error: Could not import Proposition class from aee_core_classes_era.py.")
Proposition = None
# --- Sabitler ---
DEFAULT_SOURCE_RELIABILITY = 0.6; RELIABLE_SOURCE_SCORE = 0.75; UNRELIABLE_SOURCE_SCORE = 0.35
MIN_CONFIDENCE = 0.01; MAX_CONFIDENCE = 0.99; MIN_RELIABILITY = 0.1; MAX_RELIABILITY = 1.0
SUPPORT_WEIGHT = 0.10; CONTRADICTION_WEIGHT = 0.35; RELIABILITY_DAMPENING_FACTOR = 0.5
BIAS_PENALTY_MULTIPLIER = 0.85; CIRCULAR_SUPPORT_PENALTY_MULTIPLIER = 0.75
PLAUSIBILITY_WEIGHT_FACTOR = 1.0
# --- Güvenilirlik Hesaplama ---
def calculate_source_reliability_era(source_id: str, kb: Dict[str, Proposition]) -> float:
# ... (Aynı) ...
if not Proposition: return DEFAULT_SOURCE_RELIABILITY
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 = any(hasattr(prop.epistemic_data, 'contradicts') and prop.epistemic_data.contradicts for prop in props_from_source)
return UNRELIABLE_SOURCE_SCORE if has_any_contradiction else RELIABLE_SOURCE_SCORE
# --- Döngü Tespiti ---
def detect_circular_support_era(kb: Dict[str, Proposition]):
# ... (Aynı) ...
if not Proposition: return
# print(" Running Circular Support Detection...")
prop_ids = list(kb.keys()); visited_globally = set(); flagged_props_count = 0; circular_support_flag = "CIRCULAR_SUPPORT"
for start_node_id in prop_ids:
if start_node_id not in visited_globally:
recursion_stack = set(); path = []
def dfs_visit(current_node_id):
nonlocal flagged_props_count; visited_globally.add(current_node_id); recursion_stack.add(current_node_id); path.append(current_node_id)
current_prop = kb.get(current_node_id)
if not current_prop or not getattr(current_prop.epistemic_data, 'supports', None): recursion_stack.remove(current_node_id); path.pop(); return False
for neighbour_id in current_prop.epistemic_data.supports:
if neighbour_id not in visited_globally:
if dfs_visit(neighbour_id): return True
elif neighbour_id in recursion_stack:
# print(f" -> Circular Support Detected involving node {neighbour_id[:8]}!")
try:
cycle_start_index = path.index(neighbour_id); cycle_nodes = path[cycle_start_index:]
# print(f" Cycle: {' -> '.join([p[:8] for p in cycle_nodes])}")
for node_id_in_cycle in cycle_nodes:
node_prop = kb.get(node_id_in_cycle)
if node_prop and circular_support_flag not in node_prop.epistemic_data.bias_flags: node_prop.epistemic_data.bias_flags.append(circular_support_flag); flagged_props_count += 1
except ValueError: pass
return True
recursion_stack.remove(current_node_id); path.pop(); return False
dfs_visit(start_node_id)
print(f" Circular Support Detection complete. Flagged {flagged_props_count} propositions.")
# --- Güven Güncelleme (Era - Debug Eklendi) ---
def update_proposition_confidence_era(prop: Proposition, kb: Dict[str, Proposition], source_reliability_scores: Dict[str, float]):
if not Proposition: return
ep_data = prop.epistemic_data; initial_conf = ep_data.initial_confidence
source_reliability = source_reliability_scores.get(ep_data.source_id, DEFAULT_SOURCE_RELIABILITY)
adjusted_initial_conf = initial_conf * (1 - RELIABILITY_DAMPENING_FACTOR) + (initial_conf * source_reliability) * RELIABILITY_DAMPENING_FACTOR
current_confidence = adjusted_initial_conf
total_support_effect = 0.0
if ep_data.supports:
for supporter_id in ep_data.supports:
supporter_prop = kb.get(supporter_id)
if supporter_prop: total_support_effect += SUPPORT_WEIGHT * supporter_prop.epistemic_data.computed_confidence * (1 - current_confidence)
current_confidence += total_support_effect
total_contradiction_effect = 0.0
if ep_data.contradicts:
for contradictor_id in ep_data.contradicts:
contradictor_prop = kb.get(contradictor_id)
if contradictor_prop: total_contradiction_effect += CONTRADICTION_WEIGHT * contradictor_prop.epistemic_data.computed_confidence * current_confidence
current_confidence -= total_contradiction_effect
# !!! YENİ DEBUG PRINT !!!
print(f" !!! Checking Bias Flags for Prop {prop.prop_id[:8]} !!! Current Flags: {ep_data.bias_flags}")
# Bias ve Çıkarım Cezaları
if ep_data.bias_flags: # Bu kontrol neden False dönüyor?
print(f" -> Applying penalty for Bias Flags: {ep_data.bias_flags} to Prop {prop.prop_id[:8]}")
if "CIRCULAR_SUPPORT" in ep_data.bias_flags:
current_confidence *= CIRCULAR_SUPPORT_PENALTY_MULTIPLIER
print(f" -> Applied CIRCULAR_SUPPORT penalty. Confidence now: {current_confidence:.3f}")
if any(flag != "CIRCULAR_SUPPORT" for flag in ep_data.bias_flags):
current_confidence *= BIAS_PENALTY_MULTIPLIER
print(f" -> Applied general BIAS penalty. Confidence now: {current_confidence:.3f}")
# else: # Debug: Neden girmediğini gör
# print(f" -> No Bias Flags found for Prop {prop.prop_id[:8]} at update time.")
# Plausibility Skoru Etkisi
plausibility = ep_data.plausibility_score
if plausibility is not None:
# print(f" Applying Plausibility ({plausibility:.2f}) to Prop {prop.prop_id[:8]}. Confidence before: {current_confidence:.3f}")
current_confidence *= (plausibility * PLAUSIBILITY_WEIGHT_FACTOR + (1-PLAUSIBILITY_WEIGHT_FACTOR))
# print(f" -> Confidence after plausibility: {current_confidence:.3f}")
ep_data.computed_confidence = max(MIN_CONFIDENCE, min(MAX_CONFIDENCE, current_confidence))
# --- Toplu Güncelleme Fonksiyonu (Era) ---
def run_updates_era(kb: Dict[str, Proposition]) -> Dict[str, Proposition]:
# ... (Fonksiyonun geri kalanı aynı) ...
if not Proposition or not kb: print("Knowledge Base is empty or Proposition class not available."); return kb
print("\nRunning Era Updates (Reliability, Cycle Detection & Confidence Refinement)...")
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_era(source_id, kb); source_reliability_scores[source_id] = reliability
for prop in kb.values():
if prop.epistemic_data.source_id == source_id: prop.epistemic_data.reliability_score = reliability
detect_circular_support_era(kb)
print(" Updating proposition confidences (Era logic)...")
propositions_to_update = list(kb.values()) # Önce listeye alalım
for prop in propositions_to_update:
update_proposition_confidence_era(prop, kb, source_reliability_scores)
print("Updates complete.")
return kb
# --- Test Bloğu ---
if __name__ == "__main__":
# ... (Test bloğu öncekiyle aynı - değişiklik yok) ...
print("\nTesting AEE Updater Module (Era Version - Bias Flag Check)...")
# ... (Test kodunun geri kalanı aynı) ...