NAME
Gfsm::Automaton - object-oriented interface to libgfsm finite-state automata
SYNOPSIS
use
Gfsm;
##------------------------------------------------------------
## Constructors, etc.
$fsm
= Gfsm::Automaton->new();
$fsm
= Gfsm::Automaton->new(
$is_transducer
,
$srtype
,
$n_preallocated_states
);
$fsm2
=
$fsm
->clone();
# copy constructor
$fsm2
=
$fsm
->shadow();
# copy non-structural elements
$fsm2
->assign(
$fsm1
);
# assigns $fsm1 to $fsm2
$fsm
->clear();
# clear automaton structure
##------------------------------------------------------------
## Accessors/Manipulators: Properties
$bool
=
$fsm
->is_transducer();
# get 'is_transducer' flag
$bool
=
$fsm
->is_transducer(
$bool
);
# ... or set it
$bool
=
$fsm
->is_weighted(?
$bool
);
# get/set 'is_weighted' flag
$mode
=
$fsm
->sort_mode(?
$mode
);
# get/set sort-mode flag (dangerous)
$bool
=
$fsm
->is_deterministic(?
$bool
);
# get/set 'is_deterministic' flag (dangerous)
$srtype
=
$fsm
->semiring_type(?
$srtype
);
# get/set semiring type
$n
=
$fsm
->n_states();
# get number of states
$n
=
$fsm
->n_final_states();
# get number of final states
$n
=
$fsm
->n_arcs();
# get number of arcs
$id
=
$fsm
->root(?
$id
);
# get/set id of initial state
$bool
=
$fsm
->has_state(
$id
);
# check whether a state exists
$bool
=
$fsm
->is_cyclic();
# check for cyclicity
##------------------------------------------------------------
## Accessors/Manipulators: States
$id
=
$fsm
->add_state();
# add a new state
$id
=
$fsm
->ensure_state(
$id
);
# ensure that a state exists
$fsm
->remove_state(
$id
);
# remove a state from an FSM
$bool
=
$fsm
->is_final(
$id
,?
$bool
);
# get/set final-flag for state $id
$deg
=
$fsm
->out_degree(
$id
);
# get number of outgoing arcs for state $id
$w
=
$fsm
->final_weight(
$id
,?
$w
);
# get/set final weight for state $id
$fsm
->renumber_states();
# close gaps in stateid numbering
$fsm
->statesort_aff();
# ... same thing
$fsm
->statesort_dfs();
# depth-first state sort
$fsm
->statesort_bfs();
# breadth-first state sort
##------------------------------------------------------------
## Accessors/Manipulators: Arcs
$fsm
->add_arc(
$fsm
,
$id_from
,
$id_to
,
$lab_lo
,
$lab_hi
,
$weight
);
# add an arc
$fsm
->arcsort(
$fsm
,
$mode
);
# sort automaton arcs
$ai
= Gfsm::ArcIter->new();
# create new arc-iterator
$ai
= Gfsm::ArcIter->new(
$fsm
,
$stateid
);
# create & open
$ai
->
open
(
$fsm
,
$stateid
);
# open outgoing arcs from $stateid in $fsm
$ai
->
reset
();
# reset to 1st outgoing arc
$ai
->
close
();
# close an arc iterator
$bool
=
$ai
->ok();
# check iterator validity
$ai
->remove();
# remove current arc from the automaton
$stateid
=
$ai
->target(?
$stateid
);
# get/set current arc target StateId
$lab
=
$ai
->lower(?
$lab
);
# get/set current arc lower label
$lab
=
$ai
->upper(?
$lab
);
# get/set current arc upper label
$weight
=
$ai
->weight(?
$weight
);
# get/set current arc weight
$ai
->
next
();
# increment to next outgoing arc
$ai
->seek_lower(
$lab
);
# (inclusive) seek next arc with lower label $lab
$ai
->seek_upper(
$lab
);
# (inclusive) seek next arc with upper label $lab
$ai
->seek_both(
$lo
,
$hi
);
# (inclusive) seek next arc with labels $lo,$hi
##--------------------------------------------------------------
## I/O
$fsm_or_undef
=
$fsm
->load(
$filename_or_handle
);
# load binary file (class method ok)
$fsm_or_undef
=
$fsm
->save(
$filename_or_handle
);
# save binary file
$fsm_or_undef
=
$fsm
->load_string(
$buffer
);
# load from in-memory buffer $string (class method ok)
$fsm_or_undef
=
$fsm
->save_string(
$buffer
);
# save to in-memory buffer $string
$fsm_or_undef
=
$fsm
->compile(
$filename_or_handle
,
%options
);
# compile AT&T-style text format file (transducer format only; class method ok)
$fsm_or_undef
=
$fsm
->print_att(
$filename_or_handle
,
%options
);
# save AT&T-style text format file (transducer format only)
$fsm_or_undef
=
$fsm
->compile_string(
$string
, ?
$abet_lo
, ?
$abet_hi
, ?
$abet_states
);
# compile AT&T-style text format $string (class method ok)
$fsm_or_undef
=
$fsm
->print_att_string(
$string
, ?
$abet_lo
, ?
$abet_hi
, ?
$abet_states
);
# save AT&T-style text format $string
$bool
=
$fsm
->draw_vcg(
$filename_or_handle
,
%options
);
# save in VCG format
$bool
=
$fsm
->draw_dot(
$filename_or_handle
,
%options
);
# save in DOT format
$bool
=
$fsm
->viewps(
%options
);
# for debugging
##--------------------------------------------------------------
## Algebra (constructive)
$fsm
=
$fsm1
->optional();
# set optional
$fsm
=
$fsm1
->closure();
# reflexive + transitive closure
$fsm
=
$fsm1
->closure(1);
# transitive closure
$fsm
=
$fsm1
->n_closure(
$n
);
# n-ary closure
$fsm
=
$fsm1
->compact(
$rmeps
);
# heuristic compaction (encoded minimization)
$fsm
=
$fsm1
->complement();
# lower complement wrt. internal alphabet
$fsm
=
$fsm1
->complement(
$abet
);
# lower complement wrt. alphabet $abet
$sinkid
=
$fsm
->complete(
$abet
);
# complete lower wrt. $abet, returns sink-state Id
$fsm
=
$fsm1
->compose(
$fsm2
);
# transducer composition
$fsm
=
$fsm1
->concat(
$fsm2
);
# concatenate automata
$fsm
=
$fsm1
->
connect
();
# remove non co-accessible states
$fsm
=
$fsm1
->determinize();
# acceptor determinization
$fsm
=
$fsm1
->difference(
$fsm2
);
# lower difference
(
$fsm
,
$key
) =
$fsm1
->encode(
$key
,
$encode_labels
,
$encode_weights
);
# encode labels and/or weights
$fsm
=
$fsm1
->decode(
$key
,
$decode_labels
,
$decode_weights
);
# ... or decode them
$fsm
=
$fsm1
->insert_automaton(
$qfrom
,
$qto
,
$fsm2
,
$w
);
# insert a whole automaton
$fsm
=
$fsm1
->intersect(
$fsm2
);
# lower acceptor intersection
$fsm
=
$fsm1
->invert();
# invert transdcuer sides
$fsm
=
$fsm1
->minimize(
$rmeps
);
# acceptor minimization
$fsm
=
$fsm1
->product(
$fsm2
);
# compute Cartesian product of acceptors
$fsm
=
$fsm1
->project(
$side
);
# project 1 side of a transducer
$fsm
=
$fsm1
->replace(
$lo
,
$hi
,
$fsm2
);
# replace arcs over ($lo:$hi) with $fsm2 in $fsm1
$fsm
=
$fsm1
->rmepsilon();
# remove epsilon-arcs
$fsm
=
$fsm1
->union(
$fsm2
);
# compute automaton union
##--------------------------------------------------------------
## Algebra ((pseudo-)destructive)
$fsm
->_closure();
# destructive closure
#... etc.
##--------------------------------------------------------------
## Composition (low-level)
$fsmout
=
$fsm1
->compose_full(
$fsm2
,
$fsmout
);
# mid-level composition
##--------------------------------------------------------------
## Lookup
$fsm
=
$fst
->lookup(
$labs
);
# string+fst composition: $fsm=compose(id($labs),$fst)
$fsm
=
$fst
->lookup(
$labs
,
$fsm
);
# ... specifying result fsm
$fsm
=
$fst
->lookup(
$labs
,
$fsm
,
$maxq
);
# ... specifying result and result size limit
(
$fsm
,
$map
) =
$fst
->lookup_full(
$labs
);
# ... returning state-id map
(
$fsm
,
$map
) =
$fst
->lookup_full(
$labs
,
$fsm
);
# ... specifying result
(
$fsm
,
$map
) =
$fst
->lookup_full(
$labs
,
$fsm
,
$maxq
);
# ... specifying result and size limit
$map
=
$fst
->lookup_full(
$labs
,
$fsm
,
$maxq
);
# ... in scalar context returns only map.
$trellis
=
$fst
->lookup_viterbi(
$labs
);
# Viterbi trellis construction
##--------------------------------------------------------------
## Serialization
$paths
=
$fsm
->paths();
# enumerate paths (non-cyclic $fsm only!)
$paths
=
$trellis
->viterbi_trellis_paths();
# enumerate Viterbi trellis paths
$best
=
$trellis
->viterbi_trellis_bestpath();
# get best Viterbi trellis path
$arcpaths
=
$fsm
->arcpaths();
# enumerate alignments (packed)
@arcs
= Gfsm::unpack_arcpath(
$arcpath
);
# ... get all arcs in an arc-path
(
$q
,
$r
,
$lo
,
$hi
,
$w
) = Gfsm::unpack_arc(
$arc
);
# ... unpack a single arc
##--------------------------------------------------------------
## Tries
$trie
= Gfsm::Automaton->newTrie;
$qid
=
$trie
->add_path(\
@lo
,\
@hi
);
$qid
=
$trie
->add_path(\
@lo
,\
@hi
,
$w
);
$qid
=
$trie
->add_path(\
@lo
,\
@hi
,
$w
,
$add_to_arcs
,
$add_to_state_final
,
$add_to_path_final
);
(
$qid
,
$lo_i
,
$hi_i
,
$w_last
) =
$trie
->find_prefix(\
@lo
,\
@hi
);
$qids
=
$trie
->add_path_states(\
@lo
,\
@hi
);
$qids
=
$trie
->add_path_states(\
@lo
,\
@hi
,
$w
);
$qids
=
$trie
->add_path_states(\
@lo
,\
@hi
,
$w
,
$add_to_arcs
,
$add_to_state_final
,
$add_to_path_final
);
(
$qids
,
$lo_i
,
$hi_i
,
$w_last
) =
$trie
->find_prefix_states(\
@lo
,\
@hi
);
$qid_to
=
$trie
->find_arc_lower(
$qid_from
,
$lab_lo
);
##-- target state or Gfsm::noState()
$qid_to
=
$trie
->find_arc_upper(
$qid_from
,
$lab_hi
);
##-- target state or Gfsm::noState()
$qid_to
=
$trie
->get_arc_lower(
$qid_from
,
$lab_lo
);
##-- find or insert arc
$qid_to
=
$trie
->get_arc_upper(
$qid_from
,
$lab_hi
);
##-- find or insert arc
DESCRIPTION
Not yet written.
BUGS AND LIMITATIONS
Probably many.
SEE ALSO
Gfsm(3perl), gfsmutils(1).
AUTHOR
Bryan Jurish <moocow@cpan.org>
COPYRIGHT AND LICENSE
Copyright (C) 2005-2014 by Bryan Jurish
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.14.2 or, at your option, any later version of Perl 5 you may have available.