class ChaosDetector::Graphing::Graphs

Top-level Chaos-detection graphing and rendering

Constants

GRAPH_TYPE_ATTRS

Attributes

chaos_graph[R]
navigator[R]

Public Class Methods

new(options: nil) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 21
def initialize(options: nil)
  @options = options || ChaosDetector::Options.new
  @render_folder = @options.path_with_root(key: :graph_render_folder)
  # @render_folder = @options.graph_render_folder
  ChaosDetector::Utils::FSUtil.ensure_dirpath(@render_folder)
  @navigator = ChaosDetector::Navigator.new(options: @options)
end

Public Instance Methods

adjacency_graph(graph_type, graph: nil, graph_name: 'adj-matrix') click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 52
def adjacency_graph(graph_type, graph: nil, graph_name: 'adj-matrix')
  the_matrix = ChaosDetector::Graphing::MatrixGraphs.new(chaos_graph, render_folder: @render_folder)
  graph, appraiser = @chaos_graph.graph_data_for(graph_type: graph_type)
  matrix = appraiser.adjacency_matrix
  the_matrix.render_adjacency(matrix, graph_name: graph_name)
end
playback(row_range: nil) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 29
def playback(row_range: nil)
  fn_graph, mod_graph = @navigator.playback(row_range: row_range)
  @chaos_graph = ChaosDetector::ChaosGraphs::ChaosGraph.new(fn_graph, mod_graph)
  @chaos_graph.infer_all
end
render_dep_graph(graph_type, graph: nil, as_cluster: false, domains: false, name: nil, root: true, metrics_table: false) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 59
def render_dep_graph(graph_type, graph: nil, as_cluster: false, domains: false, name: nil, root: true, metrics_table: false)
  g, _appraiser = chaos_graph.graph_data_for(graph_type: graph_type)
  rgraph = graph ? graph : g
  graph_name = name ? name : "#{graph_type}-dep"

  graph_attrs = GRAPH_TYPE_ATTRS[graph_type]

  dgraph = if domains #&& graph_type != :cluster
    build_domain_dgraph(graph_name, rgraph.nodes, rgraph.edges, graph_attrs: graph_attrs, metrics_table: metrics_table)
  else
    build_dgraph(graph_name, rgraph.nodes, rgraph.edges, as_cluster: as_cluster, graph_attrs: graph_attrs, metrics_table: metrics_table)
  end

  dgraph.rendered_path
end
render_domain_dep(graph_name: 'domain-dep', domain_graph: nil, metrics_table: false) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 75
def render_domain_dep(graph_name: 'domain-dep', domain_graph: nil, metrics_table: false)
  render_dep_graph(:domain, as_cluster: true, graph: domain_graph, name: graph_name, metrics_table: metrics_table)
end
render_fn_dep(graph_name: 'fn-dep', function_graph: nil, domains: false, metrics_table: false) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 79
def render_fn_dep(graph_name: 'fn-dep', function_graph: nil, domains: false, metrics_table: false)
  render_dep_graph(:function, as_cluster: true, graph: function_graph, domains: domains, name: graph_name, metrics_table: metrics_table)
end
render_mod_dep(graph_name: 'module-dep', module_graph: nil, domains: false, metrics_table: false) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 83
def render_mod_dep(graph_name: 'module-dep', module_graph: nil, domains: false, metrics_table: false)
  render_dep_graph(:module, graph: module_graph, domains: domains, name: graph_name, metrics_table: metrics_table)
end

Private Instance Methods

build_dgraph(label, nodes, edges, as_cluster: false, render: true, graph_attrs: nil, metrics_table: false) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 89
def build_dgraph(label, nodes, edges, as_cluster: false, render: true, graph_attrs: nil, metrics_table: false)
  # nodes.each do |n|
  #   p("#{label} Nodes: #{ChaosUtils.decorate(n.title)}")
  # end

  # edges.each do |e|
  #   p("#{label} Edges: #{ChaosUtils.decorate(e.src_node.title)} -> #{ChaosUtils.decorate(e.dep_node.title)}")
  # end
  puts("Building #{label} with as_cluster: #{as_cluster}")
  dgraph = ChaosDetector::Graphing::DirectedGraphs.new(render_folder: @render_folder)
  dgraph.create_directed_graph(label, graph_attrs: graph_attrs)
  dgraph.append_nodes(nodes, as_cluster: as_cluster, metrics_table: metrics_table)
  dgraph.add_edges(edges)
  dgraph.render_graph if render
  dgraph
end
build_domain_dgraph(graph_name, nodes, edges, render: true, graph_attrs: nil, metrics_table: false) click to toggle source
# File lib/chaos_detector/graphing/graphs.rb, line 106
def build_domain_dgraph(graph_name, nodes, edges, render: true, graph_attrs: nil, metrics_table: false)
  # Add domains as cluster/subgraph nodes:
  domain_nodes = nodes.map{|node| chaos_graph.domain_node_for(name: node.domain_name) }
  dgraph = build_dgraph(graph_name, domain_nodes, [], as_cluster: true, render: false, graph_attrs: graph_attrs, metrics_table: metrics_table)

  # Add nodes to domains:
  dgraph.append_nodes(nodes, metrics_table: false) do |node|
    chaos_graph.domain_node_for(name: node.domain_name)
  end
  dgraph.add_edges(edges)
  dgraph.render_graph if render
  dgraph
  # dgraph.rendered_path

  # fn_nodes = chaos_graph.function_graph.nodes.group_by(&:domain_name)
  # fn_nodes.map do |dom_nm, fn_nodes|
  #   dom_node = ChaosUtils.aught?(dom_nm) && chaos_graph.domain_node_for(name: dom_nm)
  #   dgraph.add_node_to_parent(fn_node, dom_node)
  # end
end