現状の構成

2024-07-10

  • homc: CLI

    • args
    • codegen: IR -> Go
    • homml
    • interpret: IRを実行する
    • logger
    • lower: AST -> IR
    • optimize: 複数回最適化, Sexpを受けとり最適化したSexpを返す
    • preprocess
    • report: executorの実行ログから統計情報に
  • homir: IR

    • ir
      • IrConfig
        • slot_size
        • initial_level
      • IrMeta
        • at_local
      • Operand
        • Label, Value
      • Ir
        • add $2 $1 1
    • irs
      • IRの回路の入出力, 深さ, 演算数等の統計
    • op: 演算子, 型
    • typ: 型
    • value: 値
      • スカラ, ベクトル, 集合
    • value_ops: 値の演算
  • homir-interpreter: スタックマシン

    • ctx
    • interpreter
    • lib
  • homir-profile: 回路のログ情報の定義

    • exec_log: 実行ログ
      • LogParameters: 回路パラメータ
      • LogTiming: 評価時間
      • `LogCiphertexts: レベル, 暗号数, スロット数
      • LogCiphertext: レベル, 演算, ラベル, 実行時間, modulus_level, scale, 値
      • LogPlaintext: 同上
      • LogVector
      • LogSet
      • LogScalar
    • profiles
      • ExecReport: 回路の評価に関するレポート
        • パス, パラメータ, 鍵と暗号文のサイズ, 実行時間, 演算数, 回路, 途中の値
  • homml: DSL定義

    • de
      • label: グローバル変数に値と型の対応を保持
      • parser: Sexp -> AST
    • ser
      • into_sexp: AST -> Sexp
    • const_eval: 定数評価, Sexp -> Result<Value>
      • NOTE: Sexp 入力なのはeggでも使うため
    • node: AST定義
    • sexp: Sexpのpretty print
    • type_check: ASTの型チェック
  • homml-codegen: DSL -> IRへの変換

    • config
      • `LoweringConfig: slot_size
    • ctx
      • LoweringCtx
    • lowering
      • Op::Encrypt, Op::Decrypt より内側の処理は at_local = true を設定する
  • homml-codegen-lattigo: 回路 -> lattigoのgoのシングルファイルに変換

    • ckks_params
      • 回路の深さからパラメータ選定
      • 各種ログするコードも生成
    • ir_map: IR -> Go
  • executor: Lattigoでの実行部分(go project)

  • homml-optimizer: DSLのコンパイル最適化

    • cost: 演算子に基づくコスト
    • rewrites
      • let_rules
      • lintrans
        • lintrans-cipher-add-dist: Av .+ Bv <=> (A .+ B)v
        • lintrans-cipher-mul-dist: Av .* Bv <=> A .* B .* v
          • 間違ってない?
        • replace-#-lintrans: a[i] <=> a .* 1_i
        • replace-#=-lintrans: a[i] = v <=> a = A .* 0_i + v .* 1_i
        • lintrans-ones-folding-var:
      • mod
        • 代数的な書き換え
    • transform: Sexpを対象とした書き換えパス
      • cse: CSE
      • flatten_then: (then (then a)) => a
      • fold_rep: sumをrot log N回でやる
      • loop_unroll: repをunrollする
      • replace_var: sexp[var => val] をする
    • analysis: 定数畳み込み
      • enc越しの畳み込み (op (enc v1) (enc v2) => (enc (op v1 v2)) = (enc v3)
      • 通常の畳み込み: `(op v1 v2) => v3
    • config
      • OptimizerConfig: 最適化設定
        • Rules どの規則を使うか
    • language: egg::Language
      • sexp() でSexpに変換
    • optimizer: エントリポイント
    • report: 最適化に関する統計情報
      • EGraphStat: E-node数, E-class数, 等式数, 回路コスト
      • OptimizeReport: 何回目か, it目, 飽和?, 初期/最終回路, 初期/最終コスト
  • 回路をモデル化する