📦 Out of Context リポジトリ

リポジトリ / emssr / independent_common_compiler

r2
r2 emssr1
# -*- coding: utf-8 -*-
r2 emssr2
"""Pyodide の中の入口。JavaScript はこの三つだけを呼ぶ。
r2 emssr3
r2 emssr4
    ready()               commonc の image を翻訳して待機に入る
r2 emssr5
    cell(spec)            セル一つ。返りは scope の JSON 文字列
r2 emssr6
    joint(spec)           接合秩。返りは JSON 文字列
r2 emssr7
r2 emssr8
受け渡しは JSON の文字列で統一する。proxy を跨いで辞書を渡すと、型の対応で
r2 emssr9
取りこぼしが出るので、境界は文字列一本にする。
r2 emssr10
"""
r2 emssr11
r2 emssr12
import json
r2 emssr13
import sys
r2 emssr14
import traceback
r2 emssr15
r2 emssr16
sys.path.insert(0, "/common")
r2 emssr17
r2 emssr18
import session   # noqa: E402
r2 emssr19
import joint as joint_mod   # noqa: E402
r2 emssr20
r2 emssr21
_JOINT = [None]
r2 emssr22
r2 emssr23
r2 emssr24
def ready():
r2 emssr25
    session.start("/common/commonc_lane64.bin")
r2 emssr26
    return json.dumps({"ok": True})
r2 emssr27
r2 emssr28
r2 emssr29
def _fail(e):
r2 emssr30
    return json.dumps({"ok": False, "error": str(e),
r2 emssr31
                       "trace": traceback.format_exc()[-1200:]}, ensure_ascii=False)
r2 emssr32
r2 emssr33
r2 emssr34
def cell(spec):
r2 emssr35
    s = json.loads(spec)
r2 emssr36
    try:
r2 emssr37
        out = session.cell(
r2 emssr38
            s["source"],
r2 emssr39
            dic=s.get("dic"),
r2 emssr40
            seeds=s.get("seeds"),
r2 emssr41
            words=int(s.get("words") or session.DEFAULT_WORDS),
r2 emssr42
            budget=int(s.get("budget") or session.DEFAULT_BUDGET))
r2 emssr43
        return json.dumps(out, ensure_ascii=False)
r2 emssr44
    except Exception as e:                       # noqa: BLE001  画面へ出す
r2 emssr45
        return _fail(e)
r2 emssr46
r2 emssr47
r2 emssr48
def joint(spec):
r2 emssr49
    """入力の語へ {0,1}^n を当てて頂点値の表を作り、接合秩を取る"""
r2 emssr50
    s = json.loads(spec)
r2 emssr51
    try:
r2 emssr52
        image, _need, _cm = session.compile_text(s["source"], s.get("dic"))
r2 emssr53
        words = int(s.get("words") or session.DEFAULT_WORDS)
r2 emssr54
        tbl = session.vertices(image, s["inputs"], words=words, out=int(s.get("out") or 0))
r2 emssr55
        if _JOINT[0] is None:
r2 emssr56
            _JOINT[0] = joint_mod.Joint("/common/joinrank.bin", "/common/joinrank.dic",
r2 emssr57
                                        "/common/anf.bin")
r2 emssr58
        n = len(s["inputs"])
r2 emssr59
        cut = int(s.get("cut") or (n // 2))
r2 emssr60
        out = _JOINT[0](tbl, n, cut)
r2 emssr61
        out["table"] = tbl
r2 emssr62
        out["inputs"] = s["inputs"]
r2 emssr63
        out["ok"] = True
r2 emssr64
        return json.dumps(out, ensure_ascii=False)
r2 emssr65
    except Exception as e:                       # noqa: BLE001
r2 emssr66
        return _fail(e)