src/Tools/Graphview/mutator.scala
author wenzelm
Sat, 03 Jan 2015 20:22:27 +0100
changeset 59245 be4180f3c236
parent 59240 e411afcfaa29
child 59246 32903b99c2ef
permissions -rw-r--r--
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge; misc tuning; tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59202
711c2446dc9d clarified source location;
wenzelm
parents: 56372
diff changeset
     1
/*  Title:      Tools/Graphview/mutator.scala
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     2
    Author:     Markus Kaiser, TU Muenchen
59240
e411afcfaa29 tuned headers;
wenzelm
parents: 59228
diff changeset
     3
    Author:     Makarius
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     4
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     5
Filters and add-operations on graphs.
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     6
*/
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     7
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     8
package isabelle.graphview
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     9
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    10
49558
af7b652180d5 minimal component and build setup for graphview;
wenzelm
parents: 49557
diff changeset
    11
import isabelle._
af7b652180d5 minimal component and build setup for graphview;
wenzelm
parents: 49557
diff changeset
    12
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    13
import java.awt.Color
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    14
import scala.collection.immutable.SortedSet
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    15
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    16
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    17
object Mutator
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    18
{
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    19
  sealed case class Info(enabled: Boolean, color: Color, mutator: Mutator)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    20
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    21
  def make(visualizer: Visualizer, m: Mutator): Info =
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    22
    Info(true, visualizer.Colors.next, m)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    23
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    24
  class Graph_Filter(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    25
    val name: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    26
    val description: String,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    27
    pred: Graph_Display.Graph => Graph_Display.Graph) extends Filter
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    28
  {
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    29
    def filter(graph: Graph_Display.Graph): Graph_Display.Graph = pred(graph)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    30
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    31
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    32
  class Graph_Mutator(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    33
    val name: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    34
    val description: String,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    35
    pred: (Graph_Display.Graph, Graph_Display.Graph) => Graph_Display.Graph) extends Mutator
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    36
  {
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    37
    def mutate(complete_graph: Graph_Display.Graph, graph: Graph_Display.Graph): Graph_Display.Graph =
59228
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
    38
      pred(complete_graph, graph)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    39
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    40
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    41
  class Node_Filter(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    42
    name: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    43
    description: String,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    44
    pred: (Graph_Display.Graph, Graph_Display.Node) => Boolean)
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    45
    extends Graph_Filter(name, description, g => g.restrict(pred(g, _)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    46
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    47
  class Edge_Filter(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    48
    name: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    49
    description: String,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    50
    pred: (Graph_Display.Graph, Graph_Display.Node, Graph_Display.Node) => Boolean)
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    51
    extends Graph_Filter(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    52
      name,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    53
      description,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    54
      g => (g /: g.dest) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    55
        case (graph, ((from, _), tos)) =>
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    56
          (graph /: tos)((gr, to) =>
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    57
            if (pred(gr, from, to)) gr else gr.del_edge(from, to))
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    58
      })
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    59
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    60
  class Node_Family_Filter(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    61
    name: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    62
    description: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    63
    reverse: Boolean,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    64
    parents: Boolean,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    65
    children: Boolean,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    66
    pred: (Graph_Display.Graph, Graph_Display.Node) => Boolean)
49565
ea4308b7ef0f ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents: 49563
diff changeset
    67
    extends Node_Filter(
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    68
      name,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    69
      description,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    70
      (g, k) =>
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    71
        reverse !=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    72
          (pred(g, k) ||
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    73
            (parents && g.all_preds(List(k)).exists(pred(g, _))) ||
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    74
            (children && g.all_succs(List(k)).exists(pred(g, _)))))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    75
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    76
  case class Identity()
49565
ea4308b7ef0f ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents: 49563
diff changeset
    77
    extends Graph_Filter(
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    78
      "Identity",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    79
      "Does not change the graph.",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    80
      g => g)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    81
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    82
  case class Node_Expression(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    83
    regex: String,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    84
    reverse: Boolean,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    85
    parents: Boolean,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    86
    children: Boolean)
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    87
    extends Node_Family_Filter(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    88
      "Filter by Name",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    89
      "Only shows or hides all nodes with any family member's name matching a regex.",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    90
      reverse,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    91
      parents,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    92
      children,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    93
      (g, node) => (regex.r findFirstIn node.toString).isDefined)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    94
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    95
  case class Node_List(
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
    96
    list: List[Graph_Display.Node],
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    97
    reverse: Boolean,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    98
    parents: Boolean,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    99
    children: Boolean)
49565
ea4308b7ef0f ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents: 49563
diff changeset
   100
    extends Node_Family_Filter(
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   101
      "Filter by Name List",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   102
      "Only shows or hides all nodes with any family member's name matching any string in a comma separated list.",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   103
      reverse,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   104
      parents,
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   105
      children,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   106
      (g, node) => list.contains(node))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   107
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   108
  case class Edge_Endpoints(source: Graph_Display.Node, dest: Graph_Display.Node)
49565
ea4308b7ef0f ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents: 49563
diff changeset
   109
    extends Edge_Filter(
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   110
      "Hide edge",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   111
      "Hides the edge whose endpoints match strings.",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   112
      (g, s, d) => !(s == source && d == dest))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   113
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   114
  private def add_node_group(from: Graph_Display.Graph, to: Graph_Display.Graph,
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   115
    keys: List[Graph_Display.Node]) =
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   116
  {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   117
    // Add Nodes
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   118
    val with_nodes =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   119
      (to /: keys)((graph, key) => graph.default_node(key, from.get_node(key)))
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   120
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   121
    // Add Edges
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   122
    (with_nodes /: keys) {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   123
      (gv, key) => {
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   124
        def add_edges(g: Graph_Display.Graph, keys: from.Keys, succs: Boolean) =
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   125
          (g /: keys) {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   126
            (graph, end) => {
56372
fadb0fef09d7 more explicit iterator terminology, in accordance to Scala 2.8 library;
wenzelm
parents: 50475
diff changeset
   127
              if (!graph.keys_iterator.contains(end)) graph
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   128
              else {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   129
                if (succs) graph.add_edge(key, end)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   130
                else graph.add_edge(end, key)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   131
              }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   132
            }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   133
          }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   134
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   135
        add_edges(
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   136
          add_edges(gv, from.imm_preds(key), false),
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   137
          from.imm_succs(key), true)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   138
      }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   139
    }
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   140
  }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   141
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   142
  case class Add_Node_Expression(regex: String)
49565
ea4308b7ef0f ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents: 49563
diff changeset
   143
    extends Graph_Mutator(
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   144
      "Add by name",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   145
      "Adds every node whose name matches the regex. " +
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   146
      "Adds all relevant edges.",
59228
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   147
      (complete_graph, graph) =>
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   148
        add_node_group(complete_graph, graph,
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   149
          complete_graph.keys.filter(node => (regex.r findFirstIn node.toString).isDefined).toList))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   150
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   151
  case class Add_Transitive_Closure(parents: Boolean, children: Boolean)
49565
ea4308b7ef0f ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents: 49563
diff changeset
   152
    extends Graph_Mutator(
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   153
      "Add transitive closure",
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   154
      "Adds all family members of all current nodes.",
59228
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   155
      (complete_graph, graph) => {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   156
        val withparents =
59228
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   157
          if (parents) add_node_group(complete_graph, graph, complete_graph.all_preds(graph.keys))
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   158
          else graph
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   159
        if (children)
56b34fc7a015 more dynamic visualizer -- re-use Isabelle/jEdit options;
wenzelm
parents: 59221
diff changeset
   160
          add_node_group(complete_graph, withparents, complete_graph.all_succs(graph.keys))
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   161
        else withparents
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   162
      })
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   163
}
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   164
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   165
trait Mutator
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   166
{
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   167
  val name: String
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   168
  val description: String
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   169
  def mutate(complete_graph: Graph_Display.Graph, graph: Graph_Display.Graph): Graph_Display.Graph
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   170
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   171
  override def toString: String = name
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   172
}
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   173
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   174
trait Filter extends Mutator
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   175
{
59245
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   176
  def mutate(complete_graph: Graph_Display.Graph, graph: Graph_Display.Graph) = filter(graph)
be4180f3c236 more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
wenzelm
parents: 59240
diff changeset
   177
  def filter(graph: Graph_Display.Graph): Graph_Display.Graph
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   178
}