Skip to content

Commit 80003ca

Browse files
2 parents c5c7fa2 + fb85a0f commit 80003ca

52 files changed

Lines changed: 867 additions & 35 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Makefile

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,42 @@ report: check-python check-uv
9797
@uv run python scripts/report_ratio_extremes.py
9898
@echo "✅ Graphs generated."
9999

100+
# report_confidence.py (相対時間の長いTop 30) を実行するターゲット
101+
# デフォルト値を設定(コマンドラインから上書き可能)
102+
BASE ?= STATICENC
103+
COMP ?= ALHC
104+
report-longest: check-python check-uv
105+
@if [ ! -f scripts/requirements.txt ]; then \
106+
printf "%s\n" numpy matplotlib scipy > scripts/requirements.txt; \
107+
fi
108+
@uv venv
109+
@uv pip install -q -r scripts/requirements.txt
110+
@uv run python scripts/report_confidence.py --base $(BASE) --comp $(COMP)
111+
@echo "✅ Longest execution time report generated."
112+
113+
# report_absolute_times.py (絶対時間の長いTop 30) を実行するターゲット
114+
# デフォルト値を設定(コマンドラインから上書き可能)
115+
TARGET ?= SLHC
116+
TOP ?= 30
117+
METRICS ?= mem cast inference
118+
119+
report-absolute: check-python check-uv
120+
@if [ ! -f scripts/requirements.txt ]; then \
121+
printf "%s\n" numpy matplotlib scipy > scripts/requirements.txt; \
122+
fi
123+
@uv venv
124+
@uv pip install -q -r scripts/requirements.txt
125+
@uv run python scripts/report_absolute_times.py --target $(TARGET) --top $(TOP) --metrics $(METRICS)
126+
@echo "✅ Absolute longest execution time report generated."
127+
128+
plot_caption: check-python check-uv
129+
@uv run python scripts/plot_caption.py
130+
@echo "✅ 縦並びの凡例画像を生成しました。"
131+
132+
plot_caption_horiz: check-python check-uv
133+
@uv run python scripts/plot_caption.py --horizontal
134+
@echo "✅ 横並びの凡例画像を生成しました。"
135+
100136
# お掃除
101137
clean:
102138
@dune clean || true

bin/bench.ml

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,27 @@ let mem_json mode file idx ~compile ~eager ~hash =
139139
(* | SC | AC | BC -> *)
140140

141141
(* -------- Parsing & mutation (1回で両モードに使い回す) --------------- *)
142-
let parse_and_mutate (file : string) =
142+
let parse_and_mutate ~is_compare (file : string) =
143+
(* is_compare が true なら compare用のディレクトリを、falseなら通常ディレクトリを見る *)
144+
let target_path =
145+
if is_compare then Printf.sprintf "samples/church_compare/%s.ml" file
146+
else Printf.sprintf "samples/src/%s.ml" file
147+
in
148+
let _, lexeme = Pipeline.lex Format.std_formatter (Some target_path) in
149+
let decl = Parser.toplevel Lexer.main lexeme in
150+
151+
(* is_compare が true ならミュータントを作らず、元の1つのプログラムだけ返す *)
152+
let lst_mutated =
153+
if is_compare then [decl]
154+
else Mutate.mutate_all decl
155+
in
156+
(lst_mutated : Syntax.ITGL.program list)
157+
(* let parse_and_mutate (file : string) =
143158
let target_path = Printf.sprintf "samples/src/%s.ml" file in
144159
let _, lexeme = Pipeline.lex Format.std_formatter (Some target_path) in
145160
let decl = Parser.toplevel Lexer.main lexeme in
146161
let lst_mutated = Mutate.mutate_all decl in
147-
(lst_mutated : Syntax.ITGL.program list)
162+
(lst_mutated : Syntax.ITGL.program list) *)
148163

149164
(* -------- 1ファイル × 1モード(ターゲット)を実行 ------------------ *)
150165
let bench_file_mode
@@ -234,11 +249,15 @@ let bench_file_mode
234249
let c_code, decl, tyenv =
235250
if config.intoB then
236251
let _, tyenv, kfunenvs, _ = Stdlib.pervasives_LB ~config in
252+
let p, u = Typing.ITGL.type_of_program tyenv p in
253+
let tyenv, p, _ = Typing.ITGL.normalize tyenv p u in
237254
let _, decl, _ = Pipeline.translate_to_CC ppf tyenv p ~config ~bench_ppf:fmt in
238255
let c_code = Pipeline.cc_compile ppf [decl] tyenv kfunenvs ~config ~bench_ppf:fmt ~bench:idx in
239256
c_code, decl, tyenv
240257
else
241258
let _, tyenv, kfunenvs, _ = Stdlib.pervasives_LS ~config in
259+
let p, u = Typing.ITGL.type_of_program tyenv p in
260+
let tyenv, p, _ = Typing.ITGL.normalize tyenv p u in
242261
let _, decl, _ = Pipeline.translate_to_CC ppf tyenv p ~config ~bench_ppf:fmt in
243262
let c_code = Pipeline.cc_compile ppf [decl] tyenv kfunenvs ~config ~bench_ppf:fmt ~bench:idx in
244263
c_code, decl, tyenv
@@ -250,6 +269,8 @@ let bench_file_mode
250269
decl, tyenv
251270
end else
252271
let _, tyenv, _, _ = Stdlib.pervasives_LB ~config in
272+
let p, u = Typing.ITGL.type_of_program tyenv p in
273+
let tyenv, p, _ = Typing.ITGL.normalize tyenv p u in
253274
let _, decl, _ = Pipeline.translate_to_CC ppf tyenv p ~config ~bench_ppf:fmt in
254275
let decl = Pipeline.CC.tv_renew decl in
255276
decl, tyenv
@@ -326,11 +347,13 @@ let bench_file_mode
326347
Bench_utils.Target_progress.tick prog; (* ← 変異1件完了ごとに更新 *)
327348
)
328349
with
329-
| Failure message -> Format.fprintf fmt "Failure: %s\n" message
350+
| e ->
351+
Format.fprintf Format.std_formatter "\n[Error] %s 変換中にエラーが発生しました: %s\n" file (Printexc.to_string e)
352+
(* | Failure message -> Format.fprintf fmt "Failure: %s\n" message
330353
| Translate.Translation_bug str -> Format.fprintf fmt "translation_bug: %s\n" str
331354
| Syntax.Blame _ -> Format.fprintf fmt "evaluation blame \n"
332355
| Eval.Eval_bug _ -> Format.fprintf fmt "evaluation bug!! \n"
333-
| _ -> Format.fprintf fmt "some error was happened\n"
356+
| _ -> Format.fprintf fmt "some error was happened\n" *)
334357
) mutants;
335358

336359
Option.iter Out_channel.close oc_opt;
@@ -358,6 +381,7 @@ let () =
358381
let static = ref false in
359382
let dynamize = ref false in
360383
let grift = ref false in
384+
let is_compare = ref false in
361385
let specs = [
362386
("-m", Arg.String (fun s -> modes_ref := mode_of_string s :: !modes_ref), " Select mode");
363387
("-i", Arg.Int (fun i -> itr_ref := i), " Specify itration");
@@ -371,6 +395,7 @@ let () =
371395
("--lazy", Arg.Unit (fun () -> list_ref := false :: !list_ref), " Run lazy mode");
372396
("--hash", Arg.Unit (fun () -> hash_ref := true :: !hash_ref), " Run hash-consing mode");
373397
("--no-hash", Arg.Unit (fun () -> hash_ref := false :: !hash_ref), " Run no-hash-consing mode");
398+
("--compare", Arg.Unit (fun () -> is_compare := true), " Run church comparison mode without mutation");
374399
]
375400
in
376401
Arg.parse specs (fun f -> files_ref := f :: !files_ref) " Usage: ./bench [file...] [-m mode]";
@@ -385,7 +410,7 @@ let () =
385410
(* 1. 前処理: 全ファイルを parse→mutate *)
386411
Format.fprintf Format.std_formatter "debug: parse->mutate\n";
387412
let prepared : (string * Syntax.ITGL.program list) list =
388-
List.map (fun file -> (file, parse_and_mutate file)) files
413+
List.map (fun file -> (file, parse_and_mutate ~is_compare:!is_compare file)) files
389414
in
390415
Format.fprintf Format.std_formatter "debug: parse->mutate done\n";
391416

@@ -414,8 +439,15 @@ let () =
414439
(tm.tm_year + 1900) (tm.tm_mon + 1) tm.tm_mday (tm.tm_hour) (tm.tm_min) (tm.tm_sec)
415440
in
416441
let log_base_dir = "logs" in
417-
let log_dir = Printf.sprintf "%s/%s" log_base_dir timestamp in
442+
let ts_dir = Printf.sprintf "%s/%s" log_base_dir timestamp in
443+
444+
(* `--compare` の場合はタイムスタンプの下にさらに `compare` ディレクトリを掘る *)
445+
let log_dir =
446+
(* if !is_compare then Printf.sprintf "%s/compare" ts_dir else *)
447+
ts_dir in
448+
418449
if not (Sys.file_exists log_base_dir) then Core_unix.mkdir log_base_dir;
450+
if not (Sys.file_exists ts_dir) then Core_unix.mkdir ts_dir;
419451
if not (Sys.file_exists log_dir) then Core_unix.mkdir log_dir;
420452

421453
(* 3. 実行: 各ターゲットを順番に *)

compile_test/dotests.sh

100644100755
File mode changed.

lib/kNormal.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ module CC = struct
166166
| ConsExp (f1, f2) ->
167167
let f1 = k_normalize_exp tvsenv f1 in
168168
let f2 = k_normalize_exp tvsenv f2 in
169-
insert_let f1 @@ fun x -> insert_let f2 @@ fun y -> KNorm.Cons (x, y)
169+
insert_let f2 @@ fun y -> insert_let f1 @@ fun x -> KNorm.Cons (x, y)
170170
| LetExp (x, tvs, f1, f2) ->
171171
begin match f1 with
172172
| FunExp (x', _, f1) ->
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
let realnat (n : ?) = n (fun (x : ?) -> x + 1) 0 in
2+
let exp1 (m : (int -> int) -> int -> int) (n : ?) (f : int -> int) (x : int) : int = n m f x in
3+
let two1 (f : ?) (x : int) : int = f (f x) in
4+
let two2 (f : ?) (x : int -> int) : int -> int = f (f x) in
5+
let four1 (x : ?) : int -> int = exp1 two1 two2 x in
6+
let exp2 (m : ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (n : ?) (f : (int -> int) -> int -> int) (x : int -> int) : int -> int = n m f x in
7+
let two3 (f : ?) (x : int -> int) : int -> int = f (f x) in
8+
let two4 (f : ?) (x : (int -> int) -> int -> int) : (int -> int) -> int -> int = f (f x) in
9+
let four2 (x : ?) : (int -> int) -> int -> int = exp2 two3 two4 x in
10+
let twoHundredFiftySix (y : ?) : int -> int = exp1 four1 four2 y in
11+
let sixtyFiveThousandAndFiveHundredsThirtySix (z : ?) : int -> int = exp1 twoHundredFiftySix two2 z in
12+
print_int (realnat sixtyFiveThousandAndFiveHundredsThirtySix);;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
let realnat (n : ?) = n (fun (x : ?) -> x + 1) 0 in
2+
let exp1 (m : ?) (n : ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (f : ?) (x : ?) : int = n m f x in
3+
let two1 (f : ?) (x : int) : int = f (f x) in
4+
let two2 (f : ?) (x : int -> int) : int -> int = f (f x) in
5+
let four1 (x : ?) : int -> int = exp1 two1 two2 x in
6+
let exp2 (m : ?) (n : (((int -> int) -> int -> int) -> (int -> int) -> int -> int) -> ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (f : ?) (x : ?) : int -> int = n m f x in
7+
let two3 (f : ?) (x : int -> int) : int -> int = f (f x) in
8+
let two4 (f : ?) (x : (int -> int) -> int -> int) : (int -> int) -> int -> int = f (f x) in
9+
let four2 (x : ?) : (int -> int) -> int -> int = exp2 two3 two4 x in
10+
let twoHundredFiftySix (y : ?) : int -> int = exp1 four1 four2 y in
11+
let sixtyFiveThousandAndFiveHundredsThirtySix (z : ?) : int -> int = exp1 twoHundredFiftySix two2 z in
12+
print_int (realnat sixtyFiveThousandAndFiveHundredsThirtySix);;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
let realnat (n : ?) = n (fun (x : ?) -> x + 1) 0 in
2+
let exp1 (m : ?) (n : ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (f : ?) (x : ?) : int = n m f x in
3+
let two1 (f : ?) (x : int) : int = f (f x) in
4+
let two2 (f : ?) (x : int -> int) : int -> int = f (f x) in
5+
let four1 (x : ?) : int -> int = exp1 two1 two2 x in
6+
let exp2 (m : ?) (n : (((int -> int) -> int -> int) -> (int -> int) -> int -> int) -> ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (f : ?) (x : ?) : int -> int = n m f x in
7+
let two3 (f : ?) (x : int -> int) : int -> int = f (f x) in
8+
let two4 (f : ?) (x : (int -> int) -> int -> int) : (int -> int) -> int -> int = f (f x) in
9+
let four2 (x : ?) : (int -> int) -> int -> int = exp2 two3 two4 x in
10+
let twoHundredFiftySix (y : ?) : int -> int = exp1 four1 four2 y in
11+
let sixtyFiveThousandAndFiveHundredsThirtySix (z : int -> int) : int -> int = exp1 twoHundredFiftySix two2 z in
12+
print_int (realnat sixtyFiveThousandAndFiveHundredsThirtySix);;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
let realnat (n : (int -> int) -> int -> int) = n (fun (x : ?) -> x + 1) 0 in
2+
let exp1 (m : (int -> int) -> int -> int) (n : ?) (f : int -> int) (x : int) : int = n m f x in
3+
let two1 (f : ?) (x : int) : int = f (f x) in
4+
let two2 (f : ?) (x : int -> int) : int -> int = f (f x) in
5+
let four1 (x : ?) : int -> int = exp1 two1 two2 x in
6+
let exp2 (m : ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (n : ?) (f : (int -> int) -> int -> int) (x : int -> int) : int -> int = n m f x in
7+
let two3 (f : ?) (x : int -> int) : int -> int = f (f x) in
8+
let two4 (f : ?) (x : (int -> int) -> int -> int) : (int -> int) -> int -> int = f (f x) in
9+
let four2 (x : ?) : (int -> int) -> int -> int = exp2 two3 two4 x in
10+
let twoHundredFiftySix (y : ?) : int -> int = exp1 four1 four2 y in
11+
let sixtyFiveThousandAndFiveHundredsThirtySix (z : ?) : int -> int = exp1 twoHundredFiftySix two2 z in
12+
print_int (realnat sixtyFiveThousandAndFiveHundredsThirtySix);;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
let realnat (n : ?) = n (fun (x : ?) -> x + 1) 0 in
2+
let exp1 (m : (int -> int) -> int -> int) (n : ?) (f : int -> int) (x : ?) : int = n m f x in
3+
let two1 (f : ?) (x : int) : int = f (f x) in
4+
let two2 (f : ?) (x : int -> int) : int -> int = f (f x) in
5+
let four1 (x : ?) : int -> int = exp1 two1 two2 x in
6+
let exp2 (m : ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (n : ?) (f : (int -> int) -> int -> int) (x : ?) : int -> int = n m f x in
7+
let two3 (f : ?) (x : int -> int) : int -> int = f (f x) in
8+
let two4 (f : ?) (x : (int -> int) -> int -> int) : (int -> int) -> int -> int = f (f x) in
9+
let four2 (x : ?) : (int -> int) -> int -> int = exp2 two3 two4 x in
10+
let twoHundredFiftySix (y : ?) : int -> int = exp1 four1 four2 y in
11+
let sixtyFiveThousandAndFiveHundredsThirtySix (z : ?) : int -> int = exp1 twoHundredFiftySix two2 z in
12+
print_int (realnat sixtyFiveThousandAndFiveHundredsThirtySix);;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
let realnat (n : (int -> int) -> int -> int) = n (fun (x : ?) -> x + 1) 0 in
2+
let exp1 (m : ?) (n : ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (f : ?) (x : ?) : int = n m f x in
3+
let two1 (f : ?) (x : int) : int = f (f x) in
4+
let two2 (f : ?) (x : int -> int) : int -> int = f (f x) in
5+
let four1 (x : ?) : int -> int = exp1 two1 two2 x in
6+
let exp2 (m : ?) (n : (((int -> int) -> int -> int) -> (int -> int) -> int -> int) -> ((int -> int) -> int -> int) -> (int -> int) -> int -> int) (f : ?) (x : ?) : int -> int = n m f x in
7+
let two3 (f : ?) (x : int -> int) : int -> int = f (f x) in
8+
let two4 (f : ?) (x : (int -> int) -> int -> int) : (int -> int) -> int -> int = f (f x) in
9+
let four2 (x : ?) : (int -> int) -> int -> int = exp2 two3 two4 x in
10+
let twoHundredFiftySix (y : ?) : int -> int = exp1 four1 four2 y in
11+
let sixtyFiveThousandAndFiveHundredsThirtySix (z : ?) : int -> int = exp1 twoHundredFiftySix two2 z in
12+
print_int (realnat sixtyFiveThousandAndFiveHundredsThirtySix);;

0 commit comments

Comments
 (0)