Algorithm-ConstructDFA2
view release on metacpan or search on metacpan
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
return @{ $self->_json->decode($vertex_str) };
}
sub _find_state_id_by_vertex_str {
my ($self, $vertex_str) = @_;
my $sth = $self->_dbh->prepare(q{
SELECT state_id FROM State WHERE vertex_str = ?
});
return $self->_dbh->selectrow_array($sth, {}, $vertex_str);
}
sub _find_or_create_state_from_vertex_str {
my ($self, $vertex_str) = @_;
my $state_id = _find_state_id_by_vertex_str($self, $vertex_str);
return $state_id if defined $state_id;
$self->_dbh->begin_work();
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
sub _vertex_str_from_partial_list {
my ($self, @vertices) = @_;
return $self->_vertex_str_from_vertices() unless @vertices;
my $escaped_roots = join ", ", map {
$self->_dbh->quote($_)
} @vertices;
my ($vertex_str) = $self->_dbh->selectrow_array(qq{
SELECT _canonical(json_group_array(closure.e_reachable))
FROM Closure
WHERE root IN ($escaped_roots)
});
return $vertex_str;
}
sub find_or_create_state_id {
my ($self, @vertices) = @_;
my $vertex_str = _vertex_str_from_partial_list($self, @vertices);
return _find_or_create_state_from_vertex_str($self, $vertex_str);
}
sub vertices_in_state {
my ($self, $state_id) = @_;
return map { @$_ } $self->_dbh->selectall_array(q{
SELECT vertex FROM Configuration WHERE state = ?
}, {}, $state_id);
}
sub cleanup_dead_states {
my ($self, $vertices_accept) = @_;
$self->_dbh->sqlite_create_function( '_vertices_accept', 1, sub {
my @vertices = $self->_vertex_str_to_vertices(@_);
return !! $vertices_accept->(@vertices);
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
$self->_dbh->begin_work();
$self->_dbh->do(q{
CREATE TEMPORARY TABLE accepting AS
SELECT state_id AS state
FROM State
WHERE _vertices_accept(vertex_str)+0 = 1
});
my @accepting = map { @$_ } $self->_dbh->selectall_array(q{
SELECT state FROM accepting
});
# NOTE: this also renames states in transitions involving
# possible start states, but they would then simply have no
# transitions, which should be fine.
$self->_dbh->do(q{
WITH RECURSIVE all_living(state) AS (
SELECT state FROM accepting
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
ON (t.src = s.state_id AND t.input = i.value)
WHERE
t.dst IS NULL
GROUP BY
s.state_id, i.rowid
ORDER BY
s.state_id, i.rowid
LIMIT ?
});
my @new = $self->_dbh->selectall_array($sth, {}, $limit);
my $find_or_create = memoize(sub {
_find_or_create_state_from_vertex_str($self, @_);
});
my $sth2 = $self->_dbh->prepare(q{
INSERT INTO Transition(src, input, dst) VALUES (?, ?, ?)
});
my @transitions;
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
$self->_dbh->begin_work();
$sth2->execute(@$_) for @transitions;
$self->_dbh->commit();
return scalar @new;
}
sub transitions_as_3tuples {
my ($self) = @_;
return $self->_dbh->selectall_array(q{
SELECT src, input, dst FROM transition
});
}
sub transitions_as_5tuples {
my ($self) = @_;
return $self->_dbh->selectall_array(q{
SELECT * FROM view_transitions_as_5tuples
});
}
sub backup_to_file {
my ($self, $schema_version, $file) = @_;
die unless $schema_version eq 'v0';
$self->_dbh->sqlite_backup_to_file($file);
}
FROM random_path
WHERE next IS NOT NULL
)
SELECT vertex
FROM random_path
LIMIT ?
});
while (1) {
my @path = map { @$_ } $dbh->selectall_array($sth,
{}, $start, $max_length);
my @endpoints = indexes { $_ eq $final } @path;
my $last_elem = random_element( @endpoints );
next unless defined $last_elem;
splice @path, $last_elem + 1;
return @path;
)
SELECT state
FROM random_dfa_path
LIMIT ?
});
my %accepting = map { $_ => 1 } @accepting;
while (1) {
my @path = map { @$_ } $dbh->selectall_array($sth,
{}, $start_id, $max_length);
my @endpoints = indexes { %accepting{$_} } @path;
my $last_elem = random_element( @endpoints );
next unless defined $last_elem;
splice @path, $last_elem + 1;
return @path;
$dfa->_dbh->do(q{
CREATE TEMPORARY TABLE temp_test_input(value);
});
my $sth = $dfa->_dbh->prepare(q{
INSERT INTO temp_test_input(value) VALUES(?)
});
$sth->execute($_) for @inputs;
my @dfa_trail = $dfa->_dbh->selectall_array(q{
WITH RECURSIVE dfa_trail(pos, src, input, dst) AS (
SELECT p.rowid AS pos, t.src, t.input, t.dst
FROM temp_test_input p
LEFT JOIN Transition t
ON (t.input = p.value)
WHERE t.src = ? AND p.rowid = 1
UNION ALL
$dfa->_dbh->do(q{
CREATE TEMPORARY TABLE temp_dfa_path(state)
});
my $sth = $dfa->_dbh->prepare(q{
INSERT INTO temp_dfa_path(state) VALUES(?)
});
$sth->execute($_) for @dfa_path;
my @result = $dfa->_dbh->selectall_array(q{
SELECT
p1.rowid AS src_pos,
v.src_state, v.src_vertex,
v.via,
IFNULL(p2.rowid, p1.rowid) AS dst_pos,
v.dst_state, v.dst_vertex
FROM
temp_dfa_path p1
LEFT JOIN temp_dfa_path p2
ON (p1.rowid + 1 = p2.rowid)
( run in 1.284 second using v1.01-cache-2.11-cpan-49f99fa48dc )