8 # $region{NAME}{Colour}
11 # $region{NAME}{Adj}[]{Name}
12 # $region{NAME}{Adj}[]{Pattern}
13 # $region{NAME}{Adj}[]{Regexp}
14 # $region{NAME}{Adj}[]{Dikes}
15 # $region{NAME}{Adj}[]{L}
18 # $edges{EARLIER}{LATER}{Dikes}
19 # $edges{EARLIER}{LATER}{L}[]
33 if (my ($name, $water) = m{^\t(\S.*\w)(?: \[(\d+)\])?$}) {
34 confess unless defined $ccolour;
35 confess "$name ?" if $region{$name};
36 $region{$name}{Colour} = $ccolour;
37 $region{$name}{Water} = $water;
38 $region{$name}{L} = $.;
42 if (my ($aref, $adikes) = m{^\t\t(\S.*[A-Za-z.])(?: (\+\+?))?$}) {
43 my $adj = { Dikes => (length $adikes // 0), L => $. };
45 $adj->{Pattern} = $aref;
46 $aref =~ s{\-}{[^- ]*-}g;
48 length $& eq 1 ? qr{[^- ]* ?} :
49 length $& eq 2 ? qr{.*} : confess "$aref"
51 $adj->{Regexp} = $aref;
55 push @{ $region{$cregion}{Adj} }, $adj;
62 sub unique_aref ($$) {
64 my $re = $adja->{Regexp};
65 return $adja->{Name} unless defined $re;
67 foreach my $rb (sort keys %region) {
68 #print STDERR "?? $ra -> $re $rb ?\n";
69 foreach my $adjb (@{ $region{$rb}{Adj} }) {
70 my $adjbn = $adjb->{Name};
71 next unless defined $adjbn;
72 #print STDERR "?? $ra -> $re $rb ?? $adjbn\n";
73 next unless $adjbn eq $ra;
74 push @cands, [ $rb, "$region{$rb}{L},$adjb->{L}" ];
77 my @found = grep { $_->[0] =~ m{^$re$} } @cands;
79 join ' / ', map { "$_->[0] ($_->[1])" } @_;
81 confess "$adja->{L} $adja->{Pattern} /$re/ | ".$pr->(@cands)
82 ." | ".$pr->(@found)." | ?"
85 print STDERR "resolve $ra -> $adja->{Pattern} = $r\n";
89 sub resolve_arefs () {
90 #print Dumper(\%region);
91 foreach my $ra (sort keys %region) {
92 foreach my $adj (@{ $region{$ra}{Adj} }) {
93 next if defined $adj->{Name};
94 $adj->{ProspectiveName} = unique_aref $ra, $adj;
97 foreach my $ra (sort keys %region) {
98 foreach my $adj (@{ $region{$ra}{Adj} }) {
99 $adj->{Name} //= $adj->{ProspectiveName};
102 foreach my $ra (sort keys %region) {
103 foreach my $adj (@{ $region{$ra}{Adj} }) {
104 confess unless $adj->{Name} eq unique_aref $ra, $adj;
110 foreach my $ra (sort keys %region) {
111 foreach my $adja (@{ $region{$ra}{Adj} }) {
112 my $rb = $adja->{Name};
113 my ($r0,$r1) = sort {
114 ($a eq 'NZ') <=> ($b eq 'NZ') or
117 push @{ $edges{$r0}{$r1}{L} }, $adja->{L};
118 my $e = $edges{$r0}{$r1};
119 $e->{Dikes} //= $adja->{Dikes};
120 confess "$r0 - $r1 | @{ $e->{L} } | $e->{Dikes} $adja->{Dikes} ?"
121 unless $e->{Dikes} == $adja->{Dikes};
125 foreach my $r0 (sort keys %edges) {
126 foreach my $r1 (sort keys %{ $edges{$r0} }) {
127 my $e = $edges{$r0}{$r1};
128 confess "$r0 / $r1 : @{ $e->{L} } ?" unless @{ $e->{L} } == 2;
129 $ndikes += $e->{Dikes};
132 print STDERR "total $ndikes dikes\n";
135 sub o { print @_ or die $!; }
138 o "strict graph \"map\" {\n";
139 foreach my $r0 (sort keys %edges) {
140 foreach my $r1 (sort keys %{ $edges{$r0} }) {
141 my $e = $edges{$r0}{$r1};
146 o "\"$r0\" -- \"$r1n\";\n";
158 # cperl-indent-level: 2