src/Pure/Admin/afp.scala
author wenzelm
Mon, 09 Oct 2017 21:43:27 +0200
changeset 66823 f529719cc47d
parent 66821 c0e8c199cb2e
child 66824 49a3a0a6ffaf
permissions -rw-r--r--
operations for graph display;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Admin/afp.scala
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     3
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     4
Administrative support for the Archive of Formal Proofs.
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     5
*/
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     6
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     7
package isabelle
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     8
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
     9
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    10
object AFP
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    11
{
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    12
  def init(base_dir: Path = Path.explode("$AFP_BASE")): AFP =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    13
    new AFP(base_dir)
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    14
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    15
  sealed case class Entry(name: String, sessions: List[String])
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    16
  {
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    17
    def sessions_deps(afp_sessions: Sessions.T): List[String] =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    18
      sessions.flatMap(afp_sessions.imports_graph.imm_preds(_)).distinct.sorted
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    19
  }
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    20
}
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    21
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    22
class AFP private(val base_dir: Path)
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    23
{
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    24
  override def toString: String = base_dir.expand.toString
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    25
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    26
  val main_dir: Path = base_dir + Path.explode("thys")
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    27
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    28
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    29
  /* entries and sessions */
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    30
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    31
  val entries: List[AFP.Entry] =
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    32
    (for (name <- Sessions.parse_roots(main_dir + Sessions.ROOTS)) yield {
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    33
      val sessions =
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    34
        Sessions.parse_root_entries(main_dir + Path.explode(name) + Sessions.ROOT).map(_.name)
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    35
      AFP.Entry(name, sessions)
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    36
    }).sortBy(_.name)
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    37
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    38
  val sessions: List[String] = entries.flatMap(_.sessions)
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    39
  val sessions_set: Set[String] = sessions.toSet
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    40
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    41
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    42
  /* dependencies */
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    43
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    44
  def dependencies(options: Options): Dependencies =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    45
  {
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    46
    val (_, afp_sessions) =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    47
      Sessions.load(options, dirs = List(main_dir)).
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    48
        selection(Sessions.Selection(sessions = sessions.toList))
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    49
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    50
    val session_entries =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    51
      (Multi_Map.empty[String, String] /: entries) { case (m1, e) =>
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    52
        (m1 /: e.sessions) { case (m2, s) => m2.insert(s, e.name) }
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    53
      }
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    54
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    55
    val entries_graph: Graph[String, Unit] =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    56
      (Graph.empty[String, Unit] /: entries) { case (g, e1) =>
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    57
        val name1 = e1.name
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    58
        val g1 = g.default_node(name1, ())
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    59
        (g1 /: e1.sessions_deps(afp_sessions)) { case (g2, s2) =>
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    60
          (g2 /: session_entries.get_list(s2)) { case (g3, name2) =>
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    61
            if (name1 == name2) g3 else g3.default_node(name2, ()).add_edge(name2, name1)
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    62
          }
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    63
        }
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    64
      }
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    65
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    66
    new Dependencies(afp_sessions, entries_graph)
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    67
  }
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    68
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    69
  final class Dependencies private [AFP](
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    70
    val afp_sessions: Sessions.T,
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    71
    val entries_graph: Graph[String, Unit])
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    72
  {
66823
f529719cc47d operations for graph display;
wenzelm
parents: 66821
diff changeset
    73
    def entries_graph_display: Graph_Display.Graph =
f529719cc47d operations for graph display;
wenzelm
parents: 66821
diff changeset
    74
      Graph_Display.make_graph(entries_graph)
f529719cc47d operations for graph display;
wenzelm
parents: 66821
diff changeset
    75
66821
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    76
    def entries_json_text: String =
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    77
      (for (entry <- entries)
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    78
      yield {
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    79
        val distrib_deps = entry.sessions_deps(afp_sessions).filterNot(sessions_set)
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    80
        val afp_deps = entries_graph.imm_preds(entry.name).toList
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    81
        """
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    82
 {""" + JSON.Format(entry.name) + """:
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    83
  {"distrib_deps": """ + JSON.Format(distrib_deps) + """,
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    84
   "afp_deps": """ + JSON.Format(afp_deps) + """
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    85
  }
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    86
 }"""
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    87
      }).mkString("[", ", ", "\n]\n")
c0e8c199cb2e dependencies of entries vs. sessions;
wenzelm
parents: 66820
diff changeset
    88
  }
66820
fc516da7ee4f some administrative support for AFP;
wenzelm
parents:
diff changeset
    89
}