aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/gfsmPaths.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/gfsmPaths.h')
-rw-r--r--gfsm/gfsm/src/libgfsm/gfsmPaths.h240
1 files changed, 240 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/gfsmPaths.h b/gfsm/gfsm/src/libgfsm/gfsmPaths.h
new file mode 100644
index 0000000..27d83cf
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/gfsmPaths.h
@@ -0,0 +1,240 @@
+/*=============================================================================*\
+ * File: gfsmPaths.h
+ * Author: Bryan Jurish <moocow@ling.uni-potsdam.de>
+ * Description: finite state machine library
+ *
+ * Copyright (c) 2005-2007 Bryan Jurish.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *=============================================================================*/
+
+/** \file gfsmPaths.h
+ * \brief Path discovery & enumeration
+ */
+
+#ifndef _GFSM_PATHS_H
+#define _GFSM_PATHS_H
+
+#include <gfsmAutomaton.h>
+
+/*======================================================================
+ * Types: paths
+ */
+
+/// Type for an automaton path
+typedef struct {
+ gfsmLabelVector *lo; /**< lower label sequence */
+ gfsmLabelVector *hi; /**< upper label sequence */
+ gfsmWeight w; /**< weight attached to this path */
+} gfsmPath;
+
+
+
+/*======================================================================
+ * Methods: Path Utilities
+ */
+
+///\name Path Utilities
+//@{
+
+//------------------------------
+/** Copy gfsmLabelVector. \returns \a dst */
+gfsmLabelVector *gfsm_label_vector_copy(gfsmLabelVector *dst, gfsmLabelVector *src);
+
+/** Duplicate a gfsmLabelVector. \returns \a dst */
+#define gfsm_label_vector_dup(src) \
+ gfsm_label_vector_copy(g_ptr_array_sized_new(src->len), src)
+
+/** Reverse a gfsmLabelVector. \returns \a v */
+gfsmLabelVector *gfsm_label_vector_reverse(gfsmLabelVector *v);
+
+//------------------------------
+/** Create and return a new gfsmPath, specifying components
+ * If either of \a lo or \a hi are NULL, a new vector will be created.
+ */
+gfsmPath *gfsm_path_new_full(gfsmLabelVector *lo, gfsmLabelVector *hi, gfsmWeight w);
+
+/** Create and return a new empty gfsmPath, specifying semiring. */
+#define gfsm_path_new(sr) \
+ gfsm_path_new_full(NULL,NULL,gfsm_sr_one(sr))
+
+/** Create and return a new gfsmPath as a copy of an existing gfsmPath */
+gfsmPath *gfsm_path_new_copy(gfsmPath *p1);
+
+/** Create and return a new gfsmPath, appending to an existing path */
+gfsmPath *gfsm_path_new_append(gfsmPath *p1, gfsmLabelVal lo, gfsmLabelVal hi, gfsmWeight w, gfsmSemiring *sr);
+
+/** Create and return a new gfsmPath as a copy of an existing gfsmPath with weight multiplied by \a w */
+gfsmPath *gfsm_path_new_times_w(gfsmPath *p1, gfsmWeight w, gfsmSemiring *sr);
+
+/** Append an arc to a gfsmPath */
+void gfsm_path_push(gfsmPath *p, gfsmLabelVal lo, gfsmLabelVal hi, gfsmWeight w, gfsmSemiring *sr);
+
+/** Pop an arc from a gfsmPath */
+void gfsm_path_pop(gfsmPath *p, gfsmLabelVal lo, gfsmLabelVal hi);
+
+/** 3-way path comparison function. */
+gint gfsm_path_compare_data(const gfsmPath *p1, const gfsmPath *p2, gfsmSemiring *sr);
+
+/** Reverse a gfsmPath */
+gfsmPath *gfsm_path_reverse(gfsmPath *p);
+
+/** Destroy a gfsmPath */
+void gfsm_path_free(gfsmPath *p);
+//@}
+
+/*======================================================================
+ * Methods: Automaton Serialization
+ */
+
+///\name Automaton Serialization
+//@{
+
+//------------------------------
+/** Serialize a gfsmAutomaton to a set of (gfsmPath*)s.
+ * Really just a wrapper for gfsm_automaton_paths_full()
+ *
+ * \param fsm Acyclic automaton to be serializd
+ * \param paths output set or NULL
+ *
+ * \returns \a paths if non-NULL, otherwise a new gfsmSet*.
+ */
+gfsmSet *gfsm_automaton_paths(gfsmAutomaton *fsm, gfsmSet *paths);
+
+/** Serialize a gfsmAutomaton to a set of (gfsmPath*)s.
+ *
+ * Causes deep recursion for cyclic automata.
+ * Returns a gfsmSet whose elements are (gfsmPath*)s.
+ * allocated with g_new(). It is the caller's responsibility to free the
+ * returned objects.
+ *
+ * \param fsm Acyclic automaton to be serializd
+ * \param which Which side of arc-labels to serialize
+ * \param paths output set or NULL
+ *
+ * \returns \a paths if non-NULL, otherwise a new gfsmSet*.
+ */
+gfsmSet *gfsm_automaton_paths_full(gfsmAutomaton *fsm, gfsmSet *paths, gfsmLabelSide which);
+
+
+/** Recursive guts for gfsm_automaton_paths() */
+gfsmSet *_gfsm_automaton_paths_r(gfsmAutomaton *fsm,
+ gfsmSet *paths,
+ gfsmLabelSide which,
+ gfsmStateId q,
+ gfsmPath *path);
+
+
+//------------------------------
+/** Convert a gfsmPathSet to a list of (char*)s.
+ * \a abet_lo and \a abet_hi should be (gfsmStringAlphabet*)s.
+ */
+GSList *gfsm_paths_to_strings(gfsmSet *paths,
+ gfsmAlphabet *abet_lo,
+ gfsmAlphabet *abet_hi,
+ gfsmSemiring *sr,
+ gboolean warn_on_undefined,
+ gboolean att_style,
+ GSList *strings);
+
+/** \brief Utility struct for gfsm_paths_to_strings() */
+typedef struct gfsmPathsToStringsOptions_ {
+ gfsmAlphabet *abet_lo; ///< should be a gfsmStringAlphabet*
+ gfsmAlphabet *abet_hi; ///< should be a gfsmStringAlphabet*
+ gfsmSemiring *sr; ///< semiring for weight-based set sorting
+ gboolean warn_on_undefined; ///< warn on undefined symbols?
+ gboolean att_style; ///< use ATT-style output?
+ GSList *strings; ///< output list
+} gfsmPathsToStringsOptions;
+
+/** backwards compatible type alias */
+#define _gfsm_paths_to_strings_options gfsmPathsToStringsOptions_
+
+/** Utility for gfsm_paths_to_strings() */
+gboolean _gfsm_paths_to_strings_foreach_func(gfsmPath *path,
+ gpointer value_dummy,
+ gfsmPathsToStringsOptions *opts);
+
+/** Append string for a single gfsmPath* to a GString,
+ * which may be NULL to allocate a new string.
+ * \returns \a gs if non-NULL, otherwise a new GString*.
+ * \warning it is the caller's responsibility to free the returned GString*.
+ */
+GString *gfsm_path_to_gstring(gfsmPath *path,
+ GString *gs,
+ gfsmAlphabet *abet_lo,
+ gfsmAlphabet *abet_hi,
+ gfsmSemiring *sr,
+ gboolean warn_on_undefined,
+ gboolean att_style);
+
+/** Allocate and return a new string (char*) for a single gfsmPath*.
+ * \returns new (char*) representing \a path.
+ * \warning it is the callers responsibility to free the returned \a char*.
+ */
+char *gfsm_path_to_string(gfsmPath *path,
+ gfsmAlphabet *abet_lo,
+ gfsmAlphabet *abet_hi,
+ gfsmSemiring *sr,
+ gboolean warn_on_undefined,
+ gboolean att_style);
+
+
+//------------------------------
+
+/** Extract upper side of all paths from a Viterbi trellis.
+ *
+ * Returns a gfsmSet whose elements are (gfsmPath*)s.
+ * allocated with g_new(). It is the caller's responsibility to free the
+ * returned objects.
+ *
+ * \returns \a paths if non-NULL, otherwise a new gfsmSet*.
+ */
+#define gfsm_viterbi_trellis_paths(trellis,paths) \
+ gfsm_viterbi_trellis_paths_full((trellis),(paths),gfsmLSUpper)
+
+
+/** Extract all paths from a Viterbi trellis.
+ *
+ * Returns a gfsmSet whose elements are (gfsmPath*)s.
+ * allocated with g_new(). It is the caller's responsibility to free the
+ * returned objects.
+ *
+ * \returns \a paths if non-NULL, otherwise a new gfsmSet*.
+ */
+gfsmSet *gfsm_viterbi_trellis_paths_full(gfsmAutomaton *trellis, gfsmSet *paths, gfsmLabelSide which);
+
+
+/** Extract the upper-side of the best path from a Viterbi trellis.
+ * \returns \a path if non-NULL, otherwise a new gfsmPath*.
+ */
+#define gfsm_viterbi_trellis_bestpath(trellis,path) \
+ gfsm_viterbi_trellis_bestpath_full((trellis),(path),gfsmLSUpper)
+
+/** Extract the best path from a Viterbi trellis.
+ * \returns \a path if non-NULL, otherwise a new gfsmPath*.
+ */
+gfsmPath *gfsm_viterbi_trellis_bestpath_full(gfsmAutomaton *trellis, gfsmPath *path, gfsmLabelSide which);
+
+/** Guts for gfsm_viterbi_trellis_*path*() */
+void _gfsm_viterbi_trellis_bestpath_r(gfsmAutomaton *trellis,
+ gfsmPath *path,
+ gfsmLabelSide which,
+ gfsmStateId qid);
+
+//@}
+
+
+#endif /* _GFSM_PATHS_H */