diff --git a/pyproject.toml b/pyproject.toml index 53c7bda..1fcb487 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,17 +6,7 @@ build-backend = "setuptools.build_meta" name = "didactopus" version = "0.1.0" requires-python = ">=3.10" -dependencies = [ - "pydantic>=2.7", - "fastapi>=0.115", - "uvicorn>=0.30", - "sqlalchemy>=2.0", - "passlib[bcrypt]>=1.7", - "python-jose[cryptography]>=3.3" -] - -[project.scripts] -didactopus-api = "didactopus.api:main" +dependencies = ["pydantic>=2.7", "pyyaml>=6.0"] [tool.setuptools.packages.find] where = ["src"] diff --git a/src/didactopus/progression_engine.py b/src/didactopus/progression_engine.py index 9dac940..07326cf 100644 --- a/src/didactopus/progression_engine.py +++ b/src/didactopus/progression_engine.py @@ -1,10 +1,6 @@ from __future__ import annotations -from datetime import datetime, timezone from .learner_state import LearnerState, EvidenceEvent, MasteryRecord -def _parse_ts(ts: str) -> datetime: - return datetime.fromisoformat(ts.replace("Z", "+00:00")) - def apply_evidence( state: LearnerState, event: EvidenceEvent, @@ -23,34 +19,13 @@ def apply_evidence( ) state.records.append(rec) - prev_score = rec.score - prev_conf = rec.confidence - - # weighted incremental update weight = max(0.05, min(1.0, event.confidence_hint)) - rec.score = ((prev_score * rec.evidence_count) + (event.score * weight)) / max(1, rec.evidence_count + 1) - - # confidence grows with repeated evidence and quality, but is bounded + rec.score = ((rec.score * rec.evidence_count) + (event.score * weight)) / max(1, rec.evidence_count + 1) rec.confidence = min( 1.0, - max( - 0.0, - prev_conf * (1.0 - decay) + reinforcement * weight + 0.10 * max(0.0, min(1.0, event.score)) - ), + max(0.0, rec.confidence * (1.0 - decay) + reinforcement * weight + 0.10 * max(0.0, min(1.0, event.score))), ) - rec.evidence_count += 1 rec.last_updated = event.timestamp state.history.append(event) return state - -def decay_confidence(state: LearnerState, now_ts: str, daily_decay: float = 0.0025) -> LearnerState: - now = _parse_ts(now_ts) - for rec in state.records: - if not rec.last_updated: - continue - then = _parse_ts(rec.last_updated) - delta_days = max(0.0, (now - then).total_seconds() / 86400.0) - factor = max(0.0, 1.0 - daily_decay * delta_days) - rec.confidence = max(0.0, rec.confidence * factor) - return state diff --git a/tests/test_ui_files.py b/tests/test_ui_files.py index 7a06f82..ceba475 100644 --- a/tests/test_ui_files.py +++ b/tests/test_ui_files.py @@ -2,5 +2,5 @@ from pathlib import Path def test_ui_files_exist(): assert Path("webui/src/App.jsx").exists() - assert Path("webui/src/storage.js").exists() - assert Path("webui/public/packs/bayes-pack.json").exists() + assert Path("webui/src/domainData.js").exists() + assert Path("webui/src/engine.js").exists() diff --git a/webui/index.html b/webui/index.html index 7b86087..65b360d 100644 --- a/webui/index.html +++ b/webui/index.html @@ -3,8 +3,10 @@
-