]> matita.cs.unibo.it Git - helm.git/blob - helm/software/lambda-delta/src/toplevel/metaOutput.ml
the old intermediate language (meta) is now obsolete
[helm.git] / helm / software / lambda-delta / src / toplevel / metaOutput.ml
1 (*
2     ||M||  This file is part of HELM, an Hypertextual, Electronic        
3     ||A||  Library of Mathematics, developed at the Computer Science     
4     ||T||  Department, University of Bologna, Italy.                     
5     ||I||                                                                
6     ||T||  HELM is free software; you can redistribute it and/or         
7     ||A||  modify it under the terms of the GNU General Public License   
8     \   /  version 2 or (at your option) any later version.              
9      \ /   This software is distributed as is, NO WARRANTY.              
10       V_______________________________________________________________ *)
11
12 module P = Printf
13 module F = Format
14 module U = NUri
15 module C = Cps
16 module L = Log
17 module E = Entity
18 module M = Meta
19
20 type counters = {
21    eabsts: int;
22    eabbrs: int;
23    pabsts: int;    
24    tsorts: int;
25    tlrefs: int;
26    tgrefs: int;
27    pappls: int;
28    tappls: int;
29    tabsts: int;
30    uris  : U.uri list;
31    nodes : int;
32    xnodes: int
33 }
34
35 let initial_counters = {
36    eabsts = 0; eabbrs = 0; pabsts = 0; pappls = 0;
37    tsorts = 0; tlrefs = 0; tgrefs = 0; tappls = 0; tabsts = 0;
38    uris = []; nodes = 0; xnodes = 0
39 }
40
41 let rec count_term f c = function
42    | M.Sort _          -> 
43       f {c with tsorts = succ c.tsorts; nodes = succ c.nodes}
44    | M.LRef _          -> 
45       f {c with tlrefs = succ c.tlrefs; nodes = succ c.nodes}
46    | M.GRef (_, u, ts) -> 
47       let c = {c with tgrefs = succ c.tgrefs} in
48       let c = {c with pappls = c.pappls + List.length ts} in
49       let c = {c with nodes = c.nodes + List.length ts} in
50       let c =    
51          if Cps.list_mem ~eq:U.eq u c.uris
52          then {c with nodes = succ c.nodes}
53          else {c with xnodes = succ c.xnodes}
54       in
55       Cps.list_fold_left f count_term c ts
56    | M.Appl (v, t)     -> 
57       let c = {c with tappls = succ c.tappls; nodes = succ c.nodes} in
58       let f c = count_term f c t in
59       count_term f c v
60    | M.Abst (_, w, t)  -> 
61       let c = {c with tabsts = succ c.tabsts; nodes = succ c.nodes} in
62       let f c = count_term f c t in
63       count_term f c w
64
65 let count_par f c (_, w) = count_term f c w
66
67 let count_xterm f c = function
68    | None   -> f c
69    | Some v -> count_term f c v
70
71 let count_entity f c = function
72    | _, u, E.Abst (_, (pars, w, xv)) ->
73       let c = {c with eabsts = succ c.eabsts} in
74       let c = {c with pabsts = c.pabsts + List.length pars} in
75       let c = {c with uris = u :: c.uris; nodes = succ c.nodes + List.length pars} in
76       let f c = count_xterm f c xv in      
77       let f c = count_term f c w in
78       Cps.list_fold_left f count_par c pars   
79    | _, _, E.Abbr (pars, w, xv)      ->
80       let c = {c with eabbrs = succ c.eabbrs; xnodes = succ c.xnodes} in
81       let c = {c with pabsts = c.pabsts + List.length pars} in
82       let c = {c with nodes = c.nodes + List.length pars} in
83       let f c = count_xterm f c xv in
84       let f c = count_term f c w in
85       Cps.list_fold_left f count_par c pars
86    | _, _, E.Void                    -> assert false
87
88 let print_counters f c =
89    let terms = c.tsorts + c.tlrefs + c.tgrefs + c.tappls + c.tabsts in
90    let pars = c.pabsts + c.pappls in
91    let entries = c.eabsts + c.eabbrs in
92    let nodes = c.nodes + c.xnodes in
93    L.warn (P.sprintf "  Intermediate representation summary (meta)");
94    L.warn (P.sprintf "    Total entries:            %7u" entries);
95    L.warn (P.sprintf "      Declaration items:      %7u" c.eabsts);
96    L.warn (P.sprintf "      Definition items:       %7u" c.eabbrs);
97    L.warn (P.sprintf "    Total parameter items:    %7u" pars);
98    L.warn (P.sprintf "      Application items:      %7u" c.pappls);
99    L.warn (P.sprintf "      Abstraction items:      %7u" c.pabsts);
100    L.warn (P.sprintf "    Total term items:         %7u" terms);
101    L.warn (P.sprintf "      Sort items:             %7u" c.tsorts);
102    L.warn (P.sprintf "      Local reference items:  %7u" c.tlrefs);
103    L.warn (P.sprintf "      Global reference items: %7u" c.tgrefs);
104    L.warn (P.sprintf "      Application items:      %7u" c.tappls);
105    L.warn (P.sprintf "      Abstraction items:      %7u" c.tabsts);
106    L.warn (P.sprintf "    Global Int. Complexity:   %7u" c.nodes);
107    L.warn (P.sprintf "      + Abbreviation nodes:   %7u" nodes);
108    f ()