src/Pure/Tools/profiling_report.scala
author wenzelm
Tue, 08 Jun 2021 23:34:06 +0200
changeset 73838 0e6a5a6cc767
parent 73835 5dae03d50db1
child 74712 bcca7e3bcd0d
permissions -rw-r--r--
prefer less intrusive tracing message;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64342
53fb4a19fb98 regular user tool;
wenzelm
parents: 64311
diff changeset
     1
/*  Title:      Pure/Tools/profiling_report.scala
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     3
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
     4
Report Poly/ML profiling information from session build database.
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     5
*/
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     6
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     7
package isabelle
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     8
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     9
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    10
object Profiling_Report
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    11
{
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    12
  def profiling_report(
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    13
    options: Options,
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    14
    session_name: String,
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    15
    theories: List[String] = Nil,
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    16
    clean_name: Boolean = false,
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    17
    progress: Progress = new Progress): Unit =
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    18
  {
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    19
    val store = Sessions.store(options)
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    20
    val resources = Resources.empty
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    21
    val session = new Session(options, resources)
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    22
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    23
    using(store.open_database_context())(db_context =>
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    24
    {
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    25
      val result =
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    26
        db_context.input_database(session_name)((db, name) => Some(store.read_theories(db, name)))
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    27
      result match {
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    28
        case None => error("Missing build database for session " + quote(session_name))
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    29
        case Some(used_theories) =>
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    30
          theories.filterNot(used_theories.toSet) match {
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    31
            case Nil =>
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    32
            case bad => error("Unknown theories " + commas_quote(bad))
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    33
          }
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    34
          val reports =
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    35
            (for {
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    36
              thy <- used_theories.iterator
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    37
              if theories.isEmpty || theories.contains(thy)
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    38
              command <- Build_Job.read_theory(db_context, resources, session_name, thy).iterator
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    39
              snapshot = Document.State.init.snippet(command)
73838
0e6a5a6cc767 prefer less intrusive tracing message;
wenzelm
parents: 73835
diff changeset
    40
              (Protocol.ML_Profiling(report), _) <- snapshot.messages.iterator
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    41
            } yield if (clean_name) report.clean_name else report).toList
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    42
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    43
          for (report <- ML_Profiling.account(reports)) progress.echo(report.print)
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    44
      }
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    45
    })
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    46
  }
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    47
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    48
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    49
  /* Isabelle tool wrapper */
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    50
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    51
  val isabelle_tool =
72763
3cc73d00553c added document antiquotation @{tool};
wenzelm
parents: 71686
diff changeset
    52
    Isabelle_Tool("profiling_report", "report Poly/ML profiling information from log files",
3cc73d00553c added document antiquotation @{tool};
wenzelm
parents: 71686
diff changeset
    53
      Scala_Project.here, args =>
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    54
    {
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    55
      var theories: List[String] = Nil
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    56
      var clean_name = false
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    57
      var options = Options.init()
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    58
71686
eb44cf7ae926 tuned -- Command_Line.tool is already part of Isabelle_Tool;
wenzelm
parents: 71632
diff changeset
    59
      val getopts =
eb44cf7ae926 tuned -- Command_Line.tool is already part of Isabelle_Tool;
wenzelm
parents: 71632
diff changeset
    60
        Getopts("""
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    61
Usage: isabelle profiling_report [OPTIONS] SESSION
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    62
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    63
  Options are:
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    64
    -T NAME      restrict to given theories (multiple options possible)
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    65
    -c           clean function names
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    66
    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    67
73835
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    68
  Report Poly/ML profiling from the build database of the given session
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    69
  (without up-to-date check of sources).
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    70
""",
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    71
          "T:" -> (arg => theories = theories ::: List(arg)),
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    72
          "c" -> (_ => clean_name = true),
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    73
          "o:" -> (arg => options = options + arg))
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    74
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    75
      val more_args = getopts(args)
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    76
      val session_name =
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    77
        more_args match {
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    78
          case List(session_name) => session_name
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    79
          case _ => getopts.usage()
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    80
        }
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    81
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    82
      val progress = new Console_Progress()
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    83
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    84
      profiling_report(options, session_name, theories = theories,
5dae03d50db1 more formal ML profiling messages;
wenzelm
parents: 72763
diff changeset
    85
        clean_name = clean_name, progress = progress)
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    86
    })
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    87
}