# DiaRescueMiner-Kor (디아레스큐마이너코어)

> **참고용·연구용 가설 생성 도구입니다. 임상 의사결정 도구가 아닙니다.**
> 약물명과 역사적 중단 사유는 공개된 사실(ClinicalTrials.gov, FDA/EMA 조치, post-mortem 문헌)에
> 기반하나, **모든 점수·세부 수치·sample size 제안은 규칙기반 휴리스틱이 만든 합성(synthetic) 데모값**이며
> 검증된 근거가 아닙니다.

## 한 줄 소개
당뇨·합병증 신약 개발에서 **효능부족·안전성으로 종료(terminated)/중단(withdrawn)된** 프로그램
(glitazar/dual PPARα/γ, DKD 표적 ERA·Nrf2, 11β-HSD1, glucokinase activator, GPR40 agonist 등)을
`ClinicalTrials.gov terminated/withdrawn + why_stopped + post-mortem 문헌`으로 구조화하고,
**"실패원인 → 부활레버" 온톨로지**로 검증가능한 rescue 연구 가설을 ranked 로 생성하는 standalone 도구.

- **도메인**: DM (당뇨 및 합병증)
- **카테고리**: 연구 아이디어 생성 (가설 생성 · 문헌 갭 분석 · 온톨로지 기반 새 연구 도출)

## 핵심 기능 (5)
1. **중단 program 레지스트리** — 약물·표적·class·phase·종료사유로 구조화 (`data/terminated_programs.json`, 13종)
2. **실패원인 귀속 온톨로지** — efficacy-insufficient / safety(CV·hepatic·renal·oncologic·skeletal) /
   endpoint-design / commercial / futility-interim 다축 라벨 + why_stopped 규칙기반 NLP 교차검증 +
   표적 무효 여부 cross-check(Open Targets genetic support · MR · 동일표적 타약 성패)
3. **부활 레버 매핑** — biomarker-stratified responder / 대안 endpoint / 조합 de-risking /
   조직·말초 선택 reformulation / 대안 dosing·chronotherapy
4. **가설 ranking · 최소검증설계** — plausibility·feasibility·impact + 표적유효성 보너스로 `rescue_score`
   계산, 각 가설마다 "이 가설을 깰/세울 최소 confirmatory 연구(design·N·endpoint)" 자동 초안
5. **근거 추적(audit)** — 모든 귀속·레버의 출처(trial/논문/필드)를 audit 링크로 추적

## 구성
```
2026-06-05-1-dia-rescue-miner-kor/
├── main.py        # CLI 진입점 (표준 라이브러리만으로 완전 동작)
├── app.py         # Streamlit UI (main.py 로직 재사용)
├── data/
│   └── terminated_programs.json   # curated/synthetic 중단 약물 13종
├── README.md
├── QA.md          # 검수 로그
└── CHANGELOG.md
```

## 실행법

### CLI (의존성 없음 — 표준 라이브러리만)
```bash
python3 main.py --help
python3 main.py --list           # 중단 프로그램 레지스트리
python3 main.py --summary        # 요약 통계(클래스/실패축/표적유효성 분포)
python3 main.py --top 8          # rescue_score 상위 8개 가설
python3 main.py --top 5 --verbose   # audit 근거추적 포함
python3 main.py --drug fasiglifam   # 약물/표적/클래스별 상세
python3 main.py --drug PPAR --json  # JSON 출력(후처리용)
```
> `main.py` 는 streamlit/networkx 가 **설치되어 있지 않아도** 전체 기능이 동작합니다.

### Streamlit UI (선택)
```bash
streamlit run app.py
```
> streamlit 미설치 시에도 CLI(`main.py`)가 동일한 기능을 모두 제공합니다.
> networkx 미설치 시 온톨로지 그래프는 텍스트 경로로 자동 대체됩니다.

## 동작 방식 (온톨로지)
`실패원인 축(axis) → 부활 레버(lever)` 규칙 매핑(`AXIS_TO_LEVER`)으로 후보 레버를 도출하고,
`rescue_score = 0.40·plaus + 0.20·feas + 0.25·impact + 0.15·lever_weight + 표적유효성 보너스 + 다축지지 보너스`
로 가설을 ranking 합니다. why_stopped 자유텍스트는 별도 규칙기반 NLP(`classify_why_stopped`)로 재분류해
curated attribution 과 교차검증(cross-check)합니다.

## 데이터 / 출처 (모두 무료 공개)
- **ClinicalTrials.gov API v2** — terminated/withdrawn status + why_stopped 자유텍스트
- **Inxight Drugs / NCATS** — 개발 단계(development status)
- **Open Targets Platform** — 표적의 genetic / MR 근거
- **PubMed / Europe PMC** — post-mortem · 기전 문헌

수록 약물(공개 역사적 사실 기반): muraglitazar, tesaglitazar, aleglitazar(glitazar/PPAR),
fasiglifam/TAK-875(GPR40, 간독성), piragliatin(glucokinase activator), MK-0916(11β-HSD1),
atrasentan·avosentan(DKD/ERA), bardoxolone(Nrf2/DKD), torcetrapib(CETP), sotagliflozin(SGLT1/2 T1D)
+ 합성 데모 backup 2종.

## 검수 체크리스트
- [x] `python3 -c "import ast; ast.parse(open('main.py').read())"` 통과
- [x] `python3 main.py --help` 동작
- [x] `python3 main.py --top 8` / `--list` / `--summary` / `--drug` / `--json` 동작
- [x] `python3 -c "import ast; ast.parse(open('app.py').read())"` 통과
- [x] 데이터 파일 로드 (13 programs)
- [x] `main.py` 는 streamlit/networkx 없이 동작 (stdlib only)
- 상세 로그: `QA.md`

## 한계 / 디스클레이머 (재강조)
- 외부 네트워크 호출 없음. 전부 오프라인 mock/synthetic 데이터 데모.
- 모든 점수·N·설계 초안은 **연구 아이디어 발상 보조용**이며 임상·규제·투자 의사결정 근거가 아님.
- 실제 활용 시 원 trial 레코드와 1차 문헌으로 반드시 직접 검증 필요.
