#!/usr/bin/env perl
die "Usage: $0 outfile\n" if !@ARGV;
use strict;
use PDL::PP qw(math.pd Math PDL::Math);
PDL::PP::pp_def('dummy', Code=>'', Pars=>'a()'); # lazy-loads stuff
use Graph;
use Scalar::Util qw(refaddr);
my $g = Graph->new; # should really be hypergraph but GraphViz2 not do yet
$PDL::PP::deftbl = $PDL::PP::deftbl; # suppress warning
for my $r (@{$PDL::PP::deftbl}) {
my $r_addr = refaddr $r;
my $r_label = ref($r) =~ s/^PDL::PP:://r;
$g->set_vertex_attribute($r_addr, graphviz => { shape => 'box', label => $r_label });
$g->add_edge($_, $r_addr) for @{$r->{targets}};
for my $c (@{$r->{conditions}||[]}) {
my $maybe = $c =~ s/\?//g;
$g->add_edge($r_addr, $c);
$g->set_edge_attribute($r_addr, $c,
graphviz => { style => 'dashed' },
) if $maybe;
}
}
my ($fmt) = $ARGV[0] =~ /\.([^.]+)$/;
$g->set_graph_attribute(graphviz=>{graph=>{rankdir=>'LR'}});
GraphViz2->from_graph($g)->run(format=>$fmt,output_file=>$ARGV[0]);
=head1 NAME
doc-pp - Generate graph of pp_def key dependencies with graphviz
=head1 SYNOPSIS
doc-pp deps.svg
=head1 DESCRIPTION
Uses L<Graph> and L<GraphViz2> to visualise the dependencies between
keys in L<PDL::PP/pp_def>.