リポジトリ / emssr / independent_common_compiler
r2
| r2 emssr | 1 | # -*- coding: utf-8 -*- |
| r2 emssr | 2 | """Pyodide の中の入口。JavaScript はこの三つだけを呼ぶ。 |
| r2 emssr | 3 | |
| r2 emssr | 4 | ready() commonc の image を翻訳して待機に入る |
| r2 emssr | 5 | cell(spec) セル一つ。返りは scope の JSON 文字列 |
| r2 emssr | 6 | joint(spec) 接合秩。返りは JSON 文字列 |
| r2 emssr | 7 | |
| r2 emssr | 8 | 受け渡しは JSON の文字列で統一する。proxy を跨いで辞書を渡すと、型の対応で |
| r2 emssr | 9 | 取りこぼしが出るので、境界は文字列一本にする。 |
| r2 emssr | 10 | """ |
| r2 emssr | 11 | |
| r2 emssr | 12 | import json |
| r2 emssr | 13 | import sys |
| r2 emssr | 14 | import traceback |
| r2 emssr | 15 | |
| r2 emssr | 16 | sys.path.insert(0, "/common") |
| r2 emssr | 17 | |
| r2 emssr | 18 | import session # noqa: E402 |
| r2 emssr | 19 | import joint as joint_mod # noqa: E402 |
| r2 emssr | 20 | |
| r2 emssr | 21 | _JOINT = [None] |
| r2 emssr | 22 | |
| r2 emssr | 23 | |
| r2 emssr | 24 | def ready(): |
| r2 emssr | 25 | session.start("/common/commonc_lane64.bin") |
| r2 emssr | 26 | return json.dumps({"ok": True}) |
| r2 emssr | 27 | |
| r2 emssr | 28 | |
| r2 emssr | 29 | def _fail(e): |
| r2 emssr | 30 | return json.dumps({"ok": False, "error": str(e), |
| r2 emssr | 31 | "trace": traceback.format_exc()[-1200:]}, ensure_ascii=False) |
| r2 emssr | 32 | |
| r2 emssr | 33 | |
| r2 emssr | 34 | def cell(spec): |
| r2 emssr | 35 | s = json.loads(spec) |
| r2 emssr | 36 | try: |
| r2 emssr | 37 | out = session.cell( |
| r2 emssr | 38 | s["source"], |
| r2 emssr | 39 | dic=s.get("dic"), |
| r2 emssr | 40 | seeds=s.get("seeds"), |
| r2 emssr | 41 | words=int(s.get("words") or session.DEFAULT_WORDS), |
| r2 emssr | 42 | budget=int(s.get("budget") or session.DEFAULT_BUDGET)) |
| r2 emssr | 43 | return json.dumps(out, ensure_ascii=False) |
| r2 emssr | 44 | except Exception as e: # noqa: BLE001 画面へ出す |
| r2 emssr | 45 | return _fail(e) |
| r2 emssr | 46 | |
| r2 emssr | 47 | |
| r2 emssr | 48 | def joint(spec): |
| r2 emssr | 49 | """入力の語へ {0,1}^n を当てて頂点値の表を作り、接合秩を取る""" |
| r2 emssr | 50 | s = json.loads(spec) |
| r2 emssr | 51 | try: |
| r2 emssr | 52 | image, _need, _cm = session.compile_text(s["source"], s.get("dic")) |
| r2 emssr | 53 | words = int(s.get("words") or session.DEFAULT_WORDS) |
| r2 emssr | 54 | tbl = session.vertices(image, s["inputs"], words=words, out=int(s.get("out") or 0)) |
| r2 emssr | 55 | if _JOINT[0] is None: |
| r2 emssr | 56 | _JOINT[0] = joint_mod.Joint("/common/joinrank.bin", "/common/joinrank.dic", |
| r2 emssr | 57 | "/common/anf.bin") |
| r2 emssr | 58 | n = len(s["inputs"]) |
| r2 emssr | 59 | cut = int(s.get("cut") or (n // 2)) |
| r2 emssr | 60 | out = _JOINT[0](tbl, n, cut) |
| r2 emssr | 61 | out["table"] = tbl |
| r2 emssr | 62 | out["inputs"] = s["inputs"] |
| r2 emssr | 63 | out["ok"] = True |
| r2 emssr | 64 | return json.dumps(out, ensure_ascii=False) |
| r2 emssr | 65 | except Exception as e: # noqa: BLE001 |
| r2 emssr | 66 | return _fail(e) |