リポジトリ / emssr / independent_common_compiler
r2
| r2 emssr | 1 | # -*- coding: utf-8 -*- |
| r2 emssr | 2 | """notebooks/ の全セルを compile して実行する。 |
| r2 emssr | 3 | |
| r2 emssr | 4 | python test_notebook.py |
| r2 emssr | 5 | |
| r2 emssr | 6 | ブラウザを立てずに kernel だけを確かめる。報告が tu でないセルと、語と箱の |
| r2 emssr | 7 | 対応が崩れたセルを数えて返す。接合秩を宣言したセルは ρ まで取る。 |
| r2 emssr | 8 | """ |
| r2 emssr | 9 | |
| r2 emssr | 10 | import json |
| r2 emssr | 11 | import os |
| r2 emssr | 12 | import sys |
| r2 emssr | 13 | |
| r2 emssr | 14 | HERE = os.path.dirname(os.path.abspath(__file__)) |
| r2 emssr | 15 | for d in ("runtime", "kernel"): |
| r2 emssr | 16 | p = os.path.join(HERE, d) |
| r2 emssr | 17 | if p not in sys.path: |
| r2 emssr | 18 | sys.path.insert(0, p) |
| r2 emssr | 19 | |
| r2 emssr | 20 | import joint as joint_mod # noqa: E402 |
| r2 emssr | 21 | import session # noqa: E402 |
| r2 emssr | 22 | |
| r2 emssr | 23 | session.start(os.path.join(HERE, "runtime", "commonc_lane64.bin")) |
| r2 emssr | 24 | _J = [] |
| r2 emssr | 25 | |
| r2 emssr | 26 | |
| r2 emssr | 27 | def joint(): |
| r2 emssr | 28 | if not _J: |
| r2 emssr | 29 | _J.append(joint_mod.Joint(os.path.join(HERE, "runtime", "joinrank.bin"), |
| r2 emssr | 30 | os.path.join(HERE, "runtime", "joinrank.dic"), |
| r2 emssr | 31 | os.path.join(HERE, "runtime", "anf.bin"))) |
| r2 emssr | 32 | return _J[0] |
| r2 emssr | 33 | |
| r2 emssr | 34 | |
| r2 emssr | 35 | def gamma(sc): |
| r2 emssr | 36 | if not sc["gamma"]: |
| r2 emssr | 37 | return "(空)" |
| r2 emssr | 38 | return " ".join("語%d=%s" % (g["word"], g["num"] if g["den"] == 1 |
| r2 emssr | 39 | else "%d/%d" % (g["num"], g["den"])) |
| r2 emssr | 40 | for g in sc["gamma"]) |
| r2 emssr | 41 | |
| r2 emssr | 42 | |
| r2 emssr | 43 | def main(): |
| r2 emssr | 44 | bad = 0 |
| r2 emssr | 45 | for name in sorted(os.listdir(os.path.join(HERE, "notebooks"))): |
| r2 emssr | 46 | if not name.endswith(".json"): |
| r2 emssr | 47 | continue |
| r2 emssr | 48 | nb = json.load(open(os.path.join(HERE, "notebooks", name), encoding="utf-8")) |
| r2 emssr | 49 | print("=== %s %s" % (name, nb["title"])) |
| r2 emssr | 50 | for i, c in enumerate(nb["cells"]): |
| r2 emssr | 51 | if c.get("kind") != "cmn": |
| r2 emssr | 52 | continue |
| r2 emssr | 53 | head = " [%d]" % (i + 1) |
| r2 emssr | 54 | try: |
| r2 emssr | 55 | sc = session.cell(c["source"], dic=nb.get("dic"), |
| r2 emssr | 56 | seeds=c.get("seeds"), |
| r2 emssr | 57 | words=c.get("words") or session.DEFAULT_WORDS) |
| r2 emssr | 58 | except session.CellError as e: |
| r2 emssr | 59 | if c.get("expect") == "fail": |
| r2 emssr | 60 | print("%s 誤りの見本として止まった: %s" % (head, str(e)[:52])) |
| r2 emssr | 61 | else: |
| r2 emssr | 62 | print("%s 失敗: %s" % (head, e)) |
| r2 emssr | 63 | bad += 1 |
| r2 emssr | 64 | continue |
| r2 emssr | 65 | if c.get("expect") == "fail": |
| r2 emssr | 66 | print("%s 誤りの見本のはずが通った" % head) |
| r2 emssr | 67 | bad += 1 |
| r2 emssr | 68 | note = "" |
| r2 emssr | 69 | if sc["report"] != 0: |
| r2 emssr | 70 | note += " 報告 %s" % sc["report"] |
| r2 emssr | 71 | bad += 1 |
| r2 emssr | 72 | if not sc["align"]["ok"]: |
| r2 emssr | 73 | note += " 対応なし(%s)" % sc["align"]["why"] |
| r2 emssr | 74 | print("%s %-34s 音節%-4d 箱%-5d %s%s" |
| r2 emssr | 75 | % (head, gamma(sc), sc["size"]["syl"], sc["size"]["box"], |
| r2 emssr | 76 | sc["mark"], note)) |
| r2 emssr | 77 | if c.get("inputs"): |
| r2 emssr | 78 | image, _n, _m = session.compile_text(c["source"], nb.get("dic")) |
| r2 emssr | 79 | tbl = session.vertices(image, c["inputs"]) |
| r2 emssr | 80 | r = joint()(tbl, len(c["inputs"]), c.get("cut", len(c["inputs"]) // 2)) |
| r2 emssr | 81 | print(" 接合秩 ρ=%d カット=%d 表=%s" % (r["rho"], r["cut"], tbl)) |
| r2 emssr | 82 | # commonc では正しいが、過去に notebook 側の補助語彙だけが古く、 |
| r2 emssr | 83 | # scope.check が commonc より先に拒否していた回帰。 |
| r2 emssr | 84 | plane = "we re ka, ki sa ka, ki si ka, ki wi ka, gi ka." |
| r2 emssr | 85 | try: |
| r2 emssr | 86 | sc = session.cell(plane) |
| r2 emssr | 87 | if sc["report"] != 0 or sc["out"][:2] != [1, -1]: |
| r2 emssr | 88 | print(" [回帰] ツイ数平面: 実行結果が違う %s" % sc["out"][:2]) |
| r2 emssr | 89 | bad += 1 |
| r2 emssr | 90 | else: |
| r2 emssr | 91 | print(" [回帰] ツイ数平面: %s → %s" % (plane, sc["out"][:2])) |
| r2 emssr | 92 | except session.CellError as e: |
| r2 emssr | 93 | print(" [回帰] ツイ数平面: 失敗: %s" % e) |
| r2 emssr | 94 | bad += 1 |
| r2 emssr | 95 | |
| r2 emssr | 96 | print("") |
| r2 emssr | 97 | print("閉じなかったセル: %d" % bad) |
| r2 emssr | 98 | return 1 if bad else 0 |
| r2 emssr | 99 | |
| r2 emssr | 100 | |
| r2 emssr | 101 | if __name__ == "__main__": |
| r2 emssr | 102 | sys.exit(main()) |