diff --git a/M02_MasterTemplete/M02_Hopyo_Fit.py b/M02_MasterTemplete/M02_Hopyo_Fit.py index c740422ce..147df4691 100644 --- a/M02_MasterTemplete/M02_Hopyo_Fit.py +++ b/M02_MasterTemplete/M02_Hopyo_Fit.py @@ -40,7 +40,7 @@ W = { "율": 0.3, "단위": 0.5, "조건": 0.6, - "조항": 1.5, + "조항": 2.0, "이름": 0.6, } BETA = 1.0 @@ -256,6 +256,14 @@ def sure(e: dict, pool: list[tuple]) -> bool: def fuse(e: dict, pool: list[tuple], border: list[str]) -> list[str]: """지문 점수 + BETA × 이름 · 근거 차례 덤 → 위 다섯.""" bonus = {k: RB[i] for i, k in enumerate(border[:5])} + for ( + _, + k, + ch, + _, + ) in pool: # 인용 조항 같음 = 이름 1위와 같은 덤(782 · 이름이 다른 로직을 가리켜도) + if (ch.get("조항") or 0) >= 1.0: + bonus[k] = max(bonus.get(k, 0), RB[0]) cand = {k: s for s, k, _, _ in pool} by = {o["로직"]: o for o in prepared() or []} table = hopyo_basis.ours() diff --git a/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts b/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts index af7986578..41cdc5eeb 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts @@ -230,7 +230,8 @@ export function sangeunStep( const verdict = createBadge(word, word === GOOD ? "success" : "info"); verdict.dataset.skVerdict = String(b.번); const basis = b.근거 ? createBadge(`${L("M02_SkBasisTag")} ${b.근거.이름 ?? b.근거.로직}`, "neutral") : "—"; // prettier-ignore - if (basis instanceof HTMLElement) basis.title = `${b.근거!.로직} · ${b.근거!.판정 ?? ""}`; + if (basis instanceof HTMLElement) + basis.title = [b.근거!.로직, b.근거!.판정].filter(Boolean).join(" · "); const made = b.만든 ? createBadge(b.만든, "success") : "—"; const ok = canConfirm(b, picks); const sure = createToggle({ diff --git a/resources/tester/test_628_hopyo_clause_part.py b/resources/tester/test_628_hopyo_clause_part.py index 0dba667cd..53aea3f57 100644 --- a/resources/tester/test_628_hopyo_clause_part.py +++ b/resources/tester/test_628_hopyo_clause_part.py @@ -3,8 +3,8 @@ 책 낱말(임도 · 사방 = 옛 책 · 건설 부문 낱말) · 부문 풀이(북부청임도 단산10 → 건설 공통 1-2-7 · 영월 「건설표준품셈 9-1」 → 번호 뜻 안 맞음 = (옛)) · 임도 옛 번호 → 대응표 현행 번호 · -조항 견줌은 책 + 부문 · 예시 1(단산10 근거 = 「기초 없음 — 건설 공통 1-2-7 운반」 · -줄 금액 94,227.7 그대로) · 번호만 같은 다른 부문 · 옛 번호 로직이 1위 · 다섯 안에 안 듦 +조항 견줌은 책 + 부문 · 예시 1(단산10 근거 = 건설 공통 1-2-7 인력운반(지게) GC001140 · +782-1 새 로직 · 줄 금액 94,227.7 그대로) · 번호만 같은 다른 부문 · 옛 번호 로직이 1위 · 다섯 안에 안 듦 (봉화 깬잡석채집 · 영월 콘크리트소운반) · 여덟 파일 표지 수. 읽기만 · 서버 없음 · master_data 그대로. """ @@ -19,6 +19,7 @@ from M01_MasterData import M01_MasterData_Store as m01 from M02_MasterTemplete import M02_Hopyo_Basis as hb from M02_MasterTemplete import M02_Hopyo_Fit as fit from M02_MasterTemplete import M02_Hopyo_Match as hm +from M02_MasterTemplete import M02_Hopyo_Ours as ours from M02_MasterTemplete import M02_Hopyo_ReadEst as est from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun from M02_MasterTemplete import M02_Hopyo_SkUnit as skunit @@ -26,7 +27,11 @@ from M02_MasterTemplete import M02_Hopyo_Units as units from M02_MasterTemplete import M02_Hopyo_Verdict as verdict from resources.tester import helper_m02_hopyo_golden as golden -NO_BASIS = "근거 조항 우리 기초에 없음 — 건설품셈 공통 1-2-7 운반" + +@pytest.fixture(scope="module", autouse=True) +def _ours_ready(): + if not ours.ready(): # 맞춤셈은 우리 지문표가 있어야 돎(판이 바뀌면 다시) + ours.build() def _block(tag: str, no: int) -> dict: @@ -69,20 +74,17 @@ def test_조항_견줌_부문(): assert hb.clause([["건설품셈", "1-2-7"]], ours[code])[0] == 1.0 # 부문 모름 = 그대로 -def test_예시1_기초_없음(): +def test_예시1_근거_인력운반_지게(): block, line = _unit("북부청임도", 10) + assert hb.no_basis(block["출처"]) is None # 782-1 로직이 생겨 기초 없음 아님 got = verdict.block(block, line, hm.targets()) - assert got["기초없음"]["판정"] == "기초 없음" - assert NO_BASIS in got["판정"]["꼬리표"] - assert all(c["글"] == verdict.OUTSIDE for c in got["후보"] if c["판정"] != "맞음") + assert "기초없음" not in got + assert got["차례"][0] == "GC001140" # 지게(사람 줄) — 1141 기계설비 · 1142 벽돌 아님 maker = sangeun.Maker.__new__(sangeun.Maker) maker.first, maker.blocks, maker.whole = {10: line}, {10: block}, m01.loaded()[1] maker.cache = {fit.unit_key(line): got} - assert maker.basis(10) == { - "로직": None, - "이름": "기초 없음 — 건설 공통 1-2-7 운반", - "판정": "기초 없음", - } + basis = maker.basis(10) + assert basis["로직"] == "GC001140" and basis["이름"].startswith("인력운반(지게)") judged = skunit.judge(block, units.Units(), lambda sub: None, None, "㎡") assert judged["판정"] == "옮길 수 있음" and judged["우리금액"] == pytest.approx(94227.7, abs=1) rows = [r for r in judged["더한줄"] if r.get("요소") == "LB000002"] @@ -113,5 +115,5 @@ def test_여덟_파일_표지_수(): for tag in golden.FILES: for block in golden.read(tag)["단산"]: seen[(hb.no_basis(block["출처"]) or {}).get("판정")] += 1 - assert seen["기초 없음"] == 19 + assert seen["기초 없음"] == 18 # 782-1 로 북부청 임도 단산10(공통 1-2-7) 하나 빠짐 assert seen["옛 번호"] == 121