# A single relation, useful for initial testing and debugging.
1-1 1-2
####
use diagnostics;
use strict;
use Vertex;
use Edge;
sub make_vertex($);
sub make_edge($$$);
if (1) {}; # Emacs Perl-mode does not like prototypes; indentation destroyed.
my ( @data, $i, $comment, $nr_edges, $nr_verteces );
my ( $v1, $v2 );
my ( @verteces, %verteces, @edges, %edges );
$comment = '#.*$';
while (<>) {
my ( $vertex_1, $vertex_2, $edge, $key);
$i++;
s/$comment//;
next if /^\s*$/;
/^\s*(\S+)\s+(\S+)/;
if (!$1 || !$2) {
print STDERR "Non-valid data on line $i.\n";
next;
}
($v1, $v2) = ($1, $2);
$vertex_1 = $verteces{$v1};
if (!$vertex_1) {
$vertex_1 = make_vertex($v1);
$verteces{$v1} = $vertex_1;
push @verteces, $vertex_1;
}
$vertex_2 = $verteces{$v2};
if (!$vertex_2) {
$vertex_2 = make_vertex($v2);
$verteces{$v2} = $vertex_2;
push @verteces, $vertex_2;
}
$key = $v1 . '_' . $v2;
$edge = $edges{$key};
if (!$edge) {
$edge = make_edge($vertex_1, $vertex_2, $key);
$edges{$key} = $edge;
push @edges, $edge;
}
$vertex_1 -> add_edge_reference($edge);
$vertex_2 -> add_edge_reference($edge);
}
$verteces[0] -> print_vertex(2);
#--------------------------------------
# Subroutines and functions.
sub make_vertex ($) {
my ( $label ) = @_;
return Vertex->new('x' => int(rand(100)),
'y' => int(rand(100)),
'label' => $label);
} # make_vertex
sub make_edge ($$$) {
my ( $vertex_1, $vertex_2, $label ) = @_;
return Edge->new('vertex_1' => $vertex_1,
'vertex_2' => $vertex_2,
'label' => $label
);
} # make_vertex
####
package Vertex;
use strict;
sub new {
my ($class, %params) = @_;
bless {
'_x' => $params{'x'} || 0,
'_y' => $params{'y'} || 0,
'_label' => $params{'label'} || '',
'_edges' => {}, # Neighbouring verteces connected through an edge.
'_verteces' => {}, # Neighbouring verteces not connected through an edge.
'_fx' => 0,
'_fy' => 0,
'_dx' => 0,
'_dy' => 0,
}, $class;
} # new
sub print_vertex {
my ($class, $i) = @_;
my $is;
if (!defined($i)) {
$is = '';
}
else {
$is = sprintf('%' . $i . 's', '');
}
print $is, 'label=', $_[0]->{'_label'}, "\n";
print $is, 'x=' , $_[0]->{'_x'}, "\n";
print $is, 'y=' , $_[0]->{'_y'}, "\n";
print $is, 'fx=' , $_[0]->{'_fx'}, "\n";
print $is, 'fy=' , $_[0]->{'_fy'}, "\n";
my @tmp = keys %{$_[0]->{'_edges'}};
my $tmp;
if ($#tmp >= 0) {
print $is, 'Edges: (', 1+$#tmp, ") \n";
for $tmp ( @tmp ) {
print " ", $tmp->query_label(), "\n"; ### ERROR OCCURS HERE.
}
}
else {
print $is, "No edges.\n";
}
@tmp = keys %{$_[0]->{'_verteces'}};
if ($#tmp >= 0) {
print $is, 'Verteces:', "\n";
for ( @tmp ) {
print $is, " ", $_->query_label(), "\n";
}
}
else {
print $is, "No verteces.\n";
}
} # print_vertex
# Only neighbours not connected through an edge should be added here.
sub add_neighbour_reference {
my ($self, @params) = @_;
my $key;
for $key ( @params ) {
$self->{_neighbours}[$key] = 1;
}
} # add_neighbour
sub add_edge_reference {
my ($self, @params) = @_;
my $key;
for $key ( @params ) {
$self->{_edges}{$key} = 1;
}
} # add_edge_references
sub query_x {
$_[0]->{_x};
} # query_x
sub set_x {
$_[0]->{_x} = $_[1] if defined($_[1]);
} # set_x
sub query_y {
$_[0]->{_y};
} # query_y
sub set_y {
$_[0]->{_y} = $_[1] if defined($_[1]);
} # set_y
sub query_label {
$_[0]->{_label};
} # query_label
sub set_label {
$_[0]->{_label} = $_[1] if defined($_[1]);
} # set_label
1;
####
package Edge;
use strict;
sub new {
my ($class, %params) = @_;
bless {
'_strength' => $params{'strength'} || 1,
'_length' => $params{'length'} || 1,
'_vertex_1' => $params{'vertex_1'} || 0,
'_vertex_2' => $params{'vertex_2'} || 0,
'_label' => $params{'label'} || '',
}, $class;
} # new
sub print_edge {
print 'label=' , $_[0]->{'_label'} , "\n";
print 'strength=', $_[0]->{'_strength'}, "\n";
print 'length=' , $_[0]->{'_length'} , "\n";
print 'vertex_1=', $_[0]->{'_vertex_1'}->query_label(), "\n";
print 'vertex_2=', $_[0]->{'_vertex_2'}->query_label(), "\n";
} # print_edge
# ------------------------------------------------------------------
# Set functions.
sub set_strength {
$_[0]->{_strength} = $_[1] if defined($_[1]);
} # set_strength
sub set_length {
$_[0]->{_length} = $_[1] if defined($_[1]);
} # set_length
sub set_label {
$_[0]->{_label} = $_[1] if defined($_[1]);
} # set_label
sub set_vertex_1 {
$_[0]->{_vertex_1} = $_[1] if defined($_[1]);
} # set_vertex_1
sub set_vertex_2 {
$_[0]->{_vertex_2} = $_[1] if defined($_[1]);
} # set_vertex_2
sub set_verteces {
$_[0]->{_vertex_1} = $_[1] if defined($_[1]);
$_[0]->{_vertex_2} = $_[2] if defined($_[2]);
} # set_verteces
# ------------------------------------------------------------------
# Query functions.
sub query_strength {
$_[0]->{_strength};
} # query_strength
sub query_length {
$_[0]->{_length};
} # query_length
sub query_label {
$_[0]->{_label};
} # query_label
sub query_vertex_1 {
$_[0]->{_vertex_1};
} # query_vertex_1
sub query_vertex_2 {
$_[0]->{_vertex_2};
} # query_vertex_2
sub query_verteces {
( $_[0]->{_vertex_1}, $_[0]->{_vertex_2} );
} # query_verteces
1;