src/Pure/Tools/task_statistics.scala
author wenzelm
Fri, 18 Jan 2013 23:33:17 +0100
changeset 51997 a7aa17a1f721
parent 51995 bc746aa3e8d5
child 52004 a7f6ce0493b7
permissions -rw-r--r--
use inlined session name as title for charts;
tuned signature;
wenzelm@51995
     1
/*  Title:      Pure/ML/task_statistics.ML
wenzelm@51995
     2
    Author:     Makarius
wenzelm@51995
     3
wenzelm@51995
     4
Future task runtime statistics.
wenzelm@51995
     5
*/
wenzelm@51995
     6
wenzelm@51995
     7
package isabelle
wenzelm@51995
     8
wenzelm@51995
     9
wenzelm@51995
    10
import scala.swing.{Frame, Component}
wenzelm@51995
    11
wenzelm@51995
    12
import org.jfree.data.statistics.HistogramDataset
wenzelm@51995
    13
import org.jfree.chart.{JFreeChart, ChartPanel, ChartFactory}
wenzelm@51995
    14
import org.jfree.chart.plot.{XYPlot, PlotOrientation}
wenzelm@51995
    15
import org.jfree.chart.renderer.xy.{XYBarRenderer, StandardXYBarPainter}
wenzelm@51995
    16
wenzelm@51995
    17
wenzelm@51995
    18
object Task_Statistics
wenzelm@51995
    19
{
wenzelm@51997
    20
  def apply(name: String, tasks: List[Properties.T]): Task_Statistics =
wenzelm@51997
    21
    new Task_Statistics(name, tasks)
wenzelm@51997
    22
wenzelm@51997
    23
  def apply(info: Build.Log_Info): Task_Statistics =
wenzelm@51997
    24
    apply(info.name, info.tasks)
wenzelm@51995
    25
}
wenzelm@51995
    26
wenzelm@51997
    27
final class Task_Statistics private(val name: String, val tasks: List[Properties.T])
wenzelm@51995
    28
{
wenzelm@51997
    29
  private val Task_Name = new Properties.String("task_name")
wenzelm@51997
    30
  private val Run = new Properties.Int("run")
wenzelm@51995
    31
wenzelm@51995
    32
  def chart(bins: Int = 100): JFreeChart =
wenzelm@51995
    33
  {
wenzelm@51997
    34
    val values = new Array[Double](tasks.length)
wenzelm@51997
    35
    for ((Run(x), i) <- tasks.iterator.zipWithIndex) values(i) =
wenzelm@51995
    36
      Math.log10(x.toDouble / 1000000)
wenzelm@51995
    37
wenzelm@51995
    38
    val data = new HistogramDataset
wenzelm@51995
    39
    data.addSeries("tasks", values, bins)
wenzelm@51995
    40
wenzelm@51995
    41
    val c =
wenzelm@51995
    42
      ChartFactory.createHistogram("Task runtime distribution",
wenzelm@51995
    43
        "log10(runtime / s)", "number of tasks", data,
wenzelm@51995
    44
        PlotOrientation.VERTICAL, true, true, true)
wenzelm@51995
    45
wenzelm@51995
    46
    val renderer = c.getPlot.asInstanceOf[XYPlot].getRenderer.asInstanceOf[XYBarRenderer]
wenzelm@51995
    47
    renderer.setMargin(0.1)
wenzelm@51995
    48
    renderer.setBarPainter(new StandardXYBarPainter)
wenzelm@51995
    49
wenzelm@51995
    50
    c
wenzelm@51995
    51
  }
wenzelm@51995
    52
wenzelm@51995
    53
  def show_frame(bins: Int = 100): Unit =
wenzelm@51995
    54
    Swing_Thread.later {
wenzelm@51995
    55
      new Frame {
wenzelm@51995
    56
        iconImage = Isabelle_System.get_icon().getImage
wenzelm@51997
    57
        title = name
wenzelm@51995
    58
        contents = Component.wrap(new ChartPanel(chart(bins)))
wenzelm@51995
    59
        visible = true
wenzelm@51995
    60
      }
wenzelm@51995
    61
    }
wenzelm@51995
    62
}
wenzelm@51995
    63