aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/gfsmSemiring.c
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/gfsmSemiring.c')
-rw-r--r--gfsm/gfsm/src/libgfsm/gfsmSemiring.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/gfsmSemiring.c b/gfsm/gfsm/src/libgfsm/gfsmSemiring.c
new file mode 100644
index 0000000..a1620dc
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/gfsmSemiring.c
@@ -0,0 +1,104 @@
+/*=============================================================================*\
+ * File: gfsmSemiring.c
+ * Author: Bryan Jurish <moocow@ling.uni-potsdam.de>
+ * Description: finite state machine library
+ *
+ * Copyright (c) 2004-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
+ *=============================================================================*/
+
+#include <gfsmSemiring.h>
+
+//-- no-inline definitions
+#ifndef GFSM_INLINE_ENABLED
+# include <gfsmSemiring.hi>
+#endif
+
+/*======================================================================
+ * Semiring: methods: constructors etc.
+ */
+
+
+
+/*======================================================================
+ * Semiring: methods: general accessors
+ */
+
+/*--------------------------------------------------------------
+ * compare()
+ */
+gint gfsm_sr_compare(gfsmSemiring *sr, gfsmWeight x, gfsmWeight y)
+{
+ switch (sr->type) {
+ case gfsmSRTLog:
+ case gfsmSRTTropical: return (x < y ? -1 : (x > y ? 1 : 0));
+ case gfsmSRTTrivial: return 0;
+
+ case gfsmSRTPLog: return (x < y ? 1 : (x > y ? -1 : 0));
+
+ case gfsmSRTUser:
+ return (gfsm_sr_compare(sr,x,y) ? -1 : (gfsm_sr_compare(sr,y,x) ? 1 : 0));
+ if (((gfsmUserSemiring*)sr)->less_func) {
+ if ((*((gfsmUserSemiring*)sr)->less_func)(sr,x,y)) return -1;
+ if ((*((gfsmUserSemiring*)sr)->less_func)(sr,y,x)) return 1;
+ return 0;
+ }
+
+ case gfsmSRTBoolean:
+ case gfsmSRTReal:
+ default: return (x > y ? -1 : (x < y ? 1 : 0));
+ }
+ return 0; //-- should never happen
+}
+
+/*======================================================================
+ * Semiring: string utilities
+ */
+
+/*--------------------------------------------------------------
+ * name_to_type()
+ */
+gfsmSRType gfsm_sr_name_to_type(const char *name)
+{
+ if (strcmp(name,"boolean") ==0) return gfsmSRTBoolean;
+ else if (strcmp(name,"log") ==0) return gfsmSRTLog;
+ else if (strcmp(name,"plog") ==0) return gfsmSRTPLog;
+ else if (strcmp(name,"real") ==0) return gfsmSRTReal;
+ else if (strcmp(name,"trivial") ==0) return gfsmSRTTrivial;
+ else if (strcmp(name,"tropical") ==0) return gfsmSRTTropical;
+ else if (strcmp(name,"user") ==0) return gfsmSRTUser;
+ return gfsmSRTUnknown;
+}
+
+/*--------------------------------------------------------------
+ * type_to_name()
+ */
+gchar *gfsm_sr_type_to_name(gfsmSRType type)
+{
+ switch (type) {
+ case gfsmSRTBoolean: return "boolean";
+ case gfsmSRTLog: return "log";
+ case gfsmSRTPLog: return "plog";
+ case gfsmSRTTrivial: return "trivial";
+ case gfsmSRTTropical: return "tropical";
+ case gfsmSRTReal: return "real";
+ default: return "unknown";
+ }
+}
+
+/*======================================================================
+ * Semiring: general utilities
+ */