Update of /cvsroot/pure-data/externals/moocow/gfsm/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11344/src
Modified Files:
gfsm-help.pd gfsm_automaton-help.pd gfsm_state-help.pd
pd_automaton.c pd_automaton.h pd_gfsm.c pd_state.c pd_state.h
Added Files:
pd_paths.c pd_paths.h
Log Message:
v0.401: added experimental lookup() and paths()
Index: pd_automaton.h
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/pd_automaton.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pd_automaton.h 2 Feb 2006 12:44:29 -0000 1.1
--- pd_automaton.h 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 4,8 ****
* Description: finite state automata for Pd
*
! * Copyright (c) 2004 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
--- 4,8 ----
* Description: finite state automata for Pd
*
! * Copyright (c) 2004-2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
***************
*** 53,58 ****
{
t_object x_obj;
t_pd_gfsm_automaton_pd *x_automaton_pd;
! t_atom x_argv[5];
t_outlet *x_valout;
} t_pd_gfsm_automaton_obj;
--- 53,71 ----
{
t_object x_obj;
+
+ //-- underlying automaton
t_pd_gfsm_automaton_pd *x_automaton_pd;
!
! //-- for lookup()
! gfsmLabelVector *x_labels;
!
! //-- for paths()
! gfsmSet *x_paths_s;
! GPtrArray *x_paths_a;
! guint x_paths_i;
!
! //-- output-related stuff
! t_int x_argc;
! t_atom *x_argv;
t_outlet *x_valout;
} t_pd_gfsm_automaton_obj;
Index: pd_state.c
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/pd_state.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pd_state.c 2 Feb 2006 12:44:29 -0000 1.1
--- pd_state.c 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 4,8 ****
* Description: finite state automata for Pd
*
! * Copyright (c) 2004 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
--- 4,8 ----
* Description: finite state automata for Pd
*
! * Copyright (c) 2004-2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
***************
*** 129,141 ****
}
- /*--------------------------------------------------------------------
- * degree
- */
- static void pd_gfsm_state_degree(t_pd_gfsm_state *x)
- {
- gfsmState *s = gfsm_automaton_find_state(x->x_automaton_pd->x_automaton, x->x_id);
- SETFLOAT(x->x_argv, (s ? (t_float)gfsm_state_out_degree(s) : 0));
- outlet_anything(x->x_valout, gensym("degree"), 1, x->x_argv);
- }
/*=====================================================================
--- 129,132 ----
***************
*** 250,253 ****
--- 241,277 ----
}
+ /*=====================================================================
+ * Properties
+ */
+
+ /*--------------------------------------------------------------------
+ * degree
+ */
+ static void pd_gfsm_state_degree(t_pd_gfsm_state *x)
+ {
+ gfsmState *s = gfsm_automaton_find_state(x->x_automaton_pd->x_automaton, x->x_id);
+ SETFLOAT(x->x_argv, (s ? (t_float)gfsm_state_out_degree(s) : 0));
+ outlet_anything(x->x_valout, gensym("degree"), 1, x->x_argv);
+ }
+
+ /*--------------------------------------------------------------------
+ * cyclic()
+ */
+ static void pd_gfsm_state_cyclic(t_pd_gfsm_state *x)
+ {
+ gfsmAutomaton *fsm = x->x_automaton_pd->x_automaton;
+ gfsmBitVector *visited, *completed;
+ gboolean rc = FALSE;
+
+ if (gfsm_automaton_has_state(fsm,x->x_id)) {
+ visited = gfsm_bitvector_sized_new(fsm->states->len);
+ completed = gfsm_bitvector_sized_new(fsm->states->len);
+ rc = gfsm_automaton_is_cyclic_state(fsm, x->x_id, visited, completed);
+ gfsm_bitvector_free(visited);
+ gfsm_bitvector_free(completed);
+ }
+ SETFLOAT(x->x_argv, (t_float)rc);
+ outlet_anything(x->x_valout, gensym("cyclic"), 1, x->x_argv);
+ }
***************
*** 281,287 ****
gensym("set"), A_DEFFLOAT, A_NULL);
- //-- methods: degree
- class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_degree,
- gensym("degree"), A_NULL);
//-- methods: navigation
--- 305,308 ----
***************
*** 299,302 ****
--- 320,329 ----
gensym("add_weight"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_NULL);
+ //-- methods: properties
+ class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_degree,
+ gensym("degree"), A_NULL);
+ class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_cyclic,
+ gensym("cyclic"), A_NULL);
+
//-- help symbol
class_sethelpsymbol(pd_gfsm_state_class, gensym("gfsm_state-help.pd"));
Index: gfsm_state-help.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/gfsm_state-help.pd,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** gfsm_state-help.pd 2 Feb 2006 12:44:29 -0000 1.1
--- gfsm_state-help.pd 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 25,30 ****
#X text 137 240 "degree" : get number of outgoing arcs (linear time)
;
! #X msg 58 295 arc_first;
! #X msg 58 317 arc_next;
#X msg 59 382 arc_reset;
#X obj 26 508 gfsm_state fsm-help 0;
--- 25,30 ----
#X text 137 240 "degree" : get number of outgoing arcs (linear time)
;
! #X msg 61 295 arc_first;
! #X msg 61 317 arc_next;
#X msg 59 382 arc_reset;
#X obj 26 508 gfsm_state fsm-help 0;
***************
*** 43,46 ****
--- 43,48 ----
#X text 416 463 with labels LO:HI;
#X text 271 479 (implicitly resets arc iterator);
+ #X msg 59 263 cyclic;
+ #X text 141 263 "cyclic" : does this state lead to any cycles?;
#X connect 12 0 25 0;
#X connect 15 0 25 0;
***************
*** 54,55 ****
--- 56,58 ----
#X connect 29 0 25 0;
#X connect 34 0 25 0;
+ #X connect 38 0 25 0;
Index: pd_gfsm.c
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/pd_gfsm.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pd_gfsm.c 2 Feb 2006 12:44:29 -0000 1.1
--- pd_gfsm.c 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 4,8 ****
* Description: finite state automata for Pd
*
! * Copyright (c) 2004 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
--- 4,8 ----
* Description: finite state automata for Pd
*
! * Copyright (c) 2004-2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
Index: gfsm-help.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/gfsm-help.pd,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** gfsm-help.pd 2 Feb 2006 12:44:29 -0000 1.1
--- gfsm-help.pd 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 1,5 ****
! #N canvas 0 0 430 269 10;
#X obj 66 7 gfsm;
! #X text 126 232 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
#X text 21 43 EXTERNALS:;
#X obj 41 72 gfsm_alphabet;
--- 1,5 ----
! #N canvas 0 0 436 289 10;
#X obj 66 7 gfsm;
! #X text 126 241 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
#X text 21 43 EXTERNALS:;
#X obj 41 72 gfsm_alphabet;
***************
*** 9,14 ****
#X text 161 125 automaton position;
#X text 160 98 weighted finite state machine;
! #X text 21 184 SEE ALSO:;
! #X text 38 201 gfsmutils(1);
#X text 99 8 : finite state machine external library;
#X obj 40 150 gfsm_markov;
--- 9,14 ----
#X text 161 125 automaton position;
#X text 160 98 weighted finite state machine;
! #X text 21 194 SEE ALSO:;
! #X text 38 211 gfsmutils(1);
#X text 99 8 : finite state machine external library;
#X obj 40 150 gfsm_markov;
Index: pd_state.h
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/pd_state.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pd_state.h 2 Feb 2006 12:44:29 -0000 1.1
--- pd_state.h 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 4,8 ****
* Description: finite state automata for Pd
*
! * Copyright (c) 2004 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
--- 4,8 ----
* Description: finite state automata for Pd
*
! * Copyright (c) 2004-2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
***************
*** 38,42 ****
/*--------------------------------------------------------------
! * pd_fsm_automaton_pd
*/
typedef struct _pd_gfsm_state
--- 38,42 ----
/*--------------------------------------------------------------
! * pd_gfsm_state
*/
typedef struct _pd_gfsm_state
Index: pd_automaton.c
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/pd_automaton.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pd_automaton.c 2 Feb 2006 12:44:29 -0000 1.1
--- pd_automaton.c 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 4,8 ****
* Description: finite state automata for Pd
*
! * Copyright (c) 2004 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
--- 4,8 ----
* Description: finite state automata for Pd
*
! * Copyright (c) 2004-2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
***************
*** 45,48 ****
--- 45,50 ----
static t_class *pd_gfsm_automaton_obj_class;
+ #define PD_GFSM_AUTOMATON_OBJ_DEFAULT_LABELS_LENGTH 32
+
/*=====================================================================
* pd_gfsm_automaton_pd: Methods
***************
*** 151,155 ****
/*--------------------------------------------------------------------
! * Utilties: pd_gfsm_automaton_obj: outlet_symbol()
*/
void pd_gfsm_automaton_obj_outlet_symbol_float(t_pd_gfsm_automaton_obj *x, t_symbol *sel, t_symbol *sym, t_float f)
--- 153,157 ----
/*--------------------------------------------------------------------
! * Utilties: pd_gfsm_automaton_obj: outlet_symbol_float()
*/
void pd_gfsm_automaton_obj_outlet_symbol_float(t_pd_gfsm_automaton_obj *x, t_symbol *sel, t_symbol *sym, t_float f)
***************
*** 188,191 ****
--- 190,215 ----
}
+ /*--------------------------------------------------------------------
+ * Utilties: pd_gfsm_automaton_obj: outlet_labels()
+ */
+ void pd_gfsm_automaton_obj_outlet_labels(t_pd_gfsm_automaton_obj *x, t_symbol *sel, gfsmLabelVector *labs)
+ {
+
+ if (labs->len > 0) {
+ int i;
+ if (x->x_argc < labs->len) {
+ size_t newsize = labs->len * sizeof(t_atom);
+ x->x_argv = resizebytes(x->x_argv, x->x_argc*sizeof(t_atom), newsize);
+ x->x_argc = labs->len;
+ }
+ for (i=0; i < labs->len; i++) {
+ SETFLOAT(x->x_argv+i, (gfsmLabelVal)g_ptr_array_index(labs,i));
+ }
+ outlet_anything(x->x_valout, sel, labs->len, x->x_argv);
+ } else {
+ SETSYMBOL(x->x_argv, &s_bang);
+ outlet_anything(x->x_valout, sel, 1, x->x_argv);
+ }
+ }
***************
*** 212,226 ****
#endif
! //-- defaults
! //x->x_automaton_pd = NULL;
! //-- bindings
! x->x_automaton_pd = pd_gfsm_automaton_pd_get(name);
! x->x_automaton_pd->x_refcnt++;
! //-- outlets
! x->x_valout = outlet_new(&x->x_obj, &s_anything); //-- value outlet
! return (void *)x;
}
--- 236,257 ----
#endif
! //-- defaults
! //x->x_automaton_pd = NULL;
! x->x_labels = NULL;
! x->x_paths_s = NULL;
! x->x_paths_a = NULL;
! //-- bindings
! x->x_automaton_pd = pd_gfsm_automaton_pd_get(name);
! x->x_automaton_pd->x_refcnt++;
! //-- output buffer
! x->x_argc = 5;
! x->x_argv = (t_atom*)getbytes(x->x_argc * sizeof(t_atom));
! //-- outlets
! x->x_valout = outlet_new(&x->x_obj, &s_anything); //-- value outlet
!
! return (void *)x;
}
***************
*** 236,239 ****
--- 267,275 ----
pd_gfsm_automaton_pd_release(x->x_automaton_pd);
+ if (x->x_labels) g_ptr_array_free(x->x_labels,TRUE);
+ if (x->x_paths_s) gfsm_set_free(x->x_paths_s);
+ if (x->x_paths_a) g_ptr_array_free(x->x_paths_a,TRUE);
+
+ freebytes(x->x_argv, x->x_argc*sizeof(t_atom));
//-- do we need to do this?
***************
*** 340,343 ****
--- 376,393 ----
/*=====================================================================
+ * automaton_obj: automaton properties
+ */
+
+ /*--------------------------------------------------------------------
+ * pd_gfsm_automaton_obj: cyclic()
+ */
+ static void pd_gfsm_automaton_obj_cyclic(t_pd_gfsm_automaton_obj *x)
+ {
+ gboolean rc = gfsm_automaton_is_cyclic(x->x_automaton_pd->x_automaton);
+ pd_gfsm_automaton_obj_outlet_float(x, gensym("cyclic"), (t_float)rc);
+ }
+
+
+ /*=====================================================================
* automaton_obj: state properties
*/
***************
*** 644,647 ****
--- 694,883 ----
}
+ /*=====================================================================
+ * automaton_obj: lookup
+ */
+
+ /*--------------------------------------------------------------------
+ * lookup()
+ * lookup RESULT LABELS
+ */
+ static void pd_gfsm_automaton_obj_lookup(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ if (argc > 1) {
+ guint i;
+ t_pd_gfsm_automaton_pd *result_pd;
+
+ //-- get result automaton
+ result_pd = pd_gfsm_automaton_pd_get(atom_getsymbol(argv));
+ result_pd->x_refcnt++;
+
+ //-- ensure labels exists, is cleared, & is sufficiently allocated
+ if (!x->x_labels) {
+ x->x_labels = g_ptr_array_sized_new(argc-1);
+ } else if (argc > x->x_labels->len) {
+ g_ptr_array_set_size(x->x_labels, argc);
+ }
+ x->x_labels->len = 0;
+
+ //-- get labels
+ for (i=1; i < argc; i++) {
+ gfsmLabelVal lab = atom_getfloat(argv+i);
+ //if (lab==gfsmEpsilon) continue; //-- ignore epsilons (?)
+ g_ptr_array_add(x->x_labels, (gpointer)lab);
+ }
+
+ //-- actual lookup
+ gfsm_automaton_lookup(x->x_automaton_pd->x_automaton,
+ x->x_labels,
+ result_pd->x_automaton);
+
+
+ //-- outlet
+ pd_gfsm_automaton_obj_outlet_symbol(x, sel, result_pd->x_name);
+
+ //-- cleanup
+ pd_gfsm_automaton_pd_release(result_pd);
+ }
+ else {
+ //-- no result automaton specified: complain
+ error("gfsm_automaton: lookup: no result automaton specified!");
+ }
+ }
+
+
+ /*=====================================================================
+ * automaton_obj: paths
+ */
+
+ /*--------------------------------------------------------------------
+ * paths_unsafe()
+ */
+ static void pd_gfsm_automaton_obj_paths_unsafe(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ //-- clear set first
+ if (x->x_paths_s) gfsm_set_clear(x->x_paths_s);
+
+ //-- get paths
+ x->x_paths_s = gfsm_automaton_paths(x->x_automaton_pd->x_automaton, x->x_paths_s);
+
+ //-- get array of paths
+ if (!x->x_paths_a) {
+ x->x_paths_a = g_ptr_array_sized_new(gfsm_set_size(x->x_paths_s));
+ } else {
+ g_ptr_array_set_size(x->x_paths_a,0);
+ }
+ gfsm_set_to_ptr_array(x->x_paths_s, x->x_paths_a);
+
+ //-- set path index
+ x->x_paths_i = 0;
+
+ //-- report done
+ pd_gfsm_automaton_obj_outlet_float(x, sel, x->x_paths_a->len);
+ }
+
+ /*--------------------------------------------------------------------
+ * paths_safe()
+ */
+ static void pd_gfsm_automaton_obj_paths_safe(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ gfsmAutomaton *fsm = x->x_automaton_pd->x_automaton;
+
+ if (fsm && gfsm_automaton_is_cyclic(fsm)) {
+ error("gfsm_automaton: paths: automaton is cyclic!");
+ return;
+ } else if (!fsm || !gfsm_automaton_has_state(fsm,fsm->root_id)) {
+ pd_gfsm_automaton_obj_outlet_float(x, sel, 0);
+ } else {
+ pd_gfsm_automaton_obj_paths_unsafe(x,sel, 0,NULL);
+ }
+ }
+
+ /*--------------------------------------------------------------------
+ * path_first()
+ */
+ static void pd_gfsm_automaton_obj_path_first(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ x->x_paths_i = 0;
+ if (x->x_paths_a && x->x_paths_i < x->x_paths_a->len) {
+ pd_gfsm_automaton_obj_outlet_float(x, sel, x->x_paths_i);
+ } else {
+ pd_gfsm_automaton_obj_outlet_float(x, sel, -1);
+ }
+ }
+
+ /*--------------------------------------------------------------------
+ * path_next()
+ */
+ static void pd_gfsm_automaton_obj_path_next(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ if (x->x_paths_a && x->x_paths_i >= 0 && x->x_paths_i+1 < x->x_paths_a->len) {
+ x->x_paths_i++;
+ pd_gfsm_automaton_obj_outlet_float(x, sel, x->x_paths_i);
+ } else {
+ pd_gfsm_automaton_obj_outlet_float(x, sel, -1);
+ }
+ }
+
+ /*--------------------------------------------------------------------
+ * path_nth()
+ */
+ static void pd_gfsm_automaton_obj_path_nth(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ int ni = argc > 0 ? atom_getfloat(argv) : 0;
+ if (x->x_paths_a && ni >= 0 && ni < x->x_paths_a->len) {
+ x->x_paths_i = ni;
+ pd_gfsm_automaton_obj_outlet_float(x, sel, x->x_paths_i);
+ } else {
+ pd_gfsm_automaton_obj_outlet_float(x, sel, -1);
+ }
+ }
+
+ /*--------------------------------------------------------------------
+ * path_lo()
+ */
+ static void pd_gfsm_automaton_obj_path_lo(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ if (x->x_paths_a && x->x_paths_i >= 0 && x->x_paths_i < x->x_paths_a->len) {
+ gfsmPath *p = (gfsmPath*)g_ptr_array_index(x->x_paths_a,x->x_paths_i);
+ pd_gfsm_automaton_obj_outlet_labels(x, sel, p->lo);
+ }
+ else {
+ pd_gfsm_automaton_obj_outlet_bang(x, sel);
+ }
+ }
+
+ /*--------------------------------------------------------------------
+ * path_hi()
+ */
+ static void pd_gfsm_automaton_obj_path_hi(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ if (x->x_paths_a && x->x_paths_i >= 0 && x->x_paths_i < x->x_paths_a->len) {
+ gfsmPath *p = (gfsmPath*)g_ptr_array_index(x->x_paths_a,x->x_paths_i);
+ pd_gfsm_automaton_obj_outlet_labels(x, sel, p->hi);
+ }
+ else {
+ pd_gfsm_automaton_obj_outlet_bang(x, sel);
+ }
+ }
+
+ /*--------------------------------------------------------------------
+ * path_w()
+ */
+ static void pd_gfsm_automaton_obj_path_w(t_pd_gfsm_automaton_obj *x, GIMME_ARGS)
+ {
+ if (x->x_paths_a && x->x_paths_i >= 0 && x->x_paths_i < x->x_paths_a->len) {
+ gfsmPath *p = (gfsmPath*)g_ptr_array_index(x->x_paths_a,x->x_paths_i);
+ pd_gfsm_automaton_obj_outlet_float(x, sel, p->w);
+ }
+ else {
+ pd_gfsm_automaton_obj_outlet_bang(x, sel);
+ }
+ }
+
+
+ /*=====================================================================
+ * automaton_obj: setup
+ */
+
/*--------------------------------------------------------------------
* pd_gfsm_automaton_obj: setup()
***************
*** 692,695 ****
--- 928,937 ----
A_NULL);
+ //-- methods: automaton properties
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_cyclic,
+ gensym("cyclic"),
+ A_NULL);
+
//-- methods: state properties
class_addmethod(pd_gfsm_automaton_obj_class,
***************
*** 746,749 ****
--- 988,1031 ----
A_GIMME, A_NULL);
+ //-- methods: lookup
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_lookup,
+ gensym("lookup"),
+ A_GIMME, A_NULL);
+
+ //-- methods: paths
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_paths_safe,
+ gensym("paths"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_paths_unsafe,
+ gensym("paths_fast"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_path_first,
+ gensym("path_first"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_path_next,
+ gensym("path_next"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_path_nth,
+ gensym("path_nth"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_path_lo,
+ gensym("path_lo"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_path_hi,
+ gensym("path_hi"),
+ A_GIMME, A_NULL);
+ class_addmethod(pd_gfsm_automaton_obj_class,
+ (t_method)pd_gfsm_automaton_obj_path_w,
+ gensym("path_w"),
+ A_GIMME, A_NULL);
+
//-- help symbol
class_sethelpsymbol(pd_gfsm_automaton_obj_class, gensym("gfsm_automaton-help.pd"));
--- NEW FILE: pd_paths.h ---
/*=============================================================================*\
* File: pd_paths.h
* Author: Bryan Jurish <moocow(a)ling.uni-potsdam.de>
* Description: finite state automata for Pd: paths()
*
* Copyright (c) 2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* See file LICENSE for further informations on licensing terms.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*=============================================================================*/
/*=====================================================================
* Protos
*=====================================================================*/
#ifndef PD_GFSM_PATHS_H
#define PD_GFSM_PATHS_H
/*----------------------------------------------------------------------
* includes
*/
#include <pd_automaton.h>
/*--------------------------------------------------------------
* pd_gfsm_lookup
*/
typedef struct _pd_gfsm_paths
{
t_object x_obj;
t_pd_gfsm_automaton_pd *x_automaton_pd;
GPtrArray *x_paths;
t_outlet *x_out_lo;
t_outlet *x_out_hi;
t_outlet *x_out_w;
t_outlet *x_out_done;
} t_pd_gfsm_lookup;
/*----------------------------------------------------------------------
* setup routines
*/
void pd_gfsm_paths_setup(void);
#endif /* PD_GFSM_PATHS_H */
Index: gfsm_automaton-help.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/gfsm_automaton-help.pd,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** gfsm_automaton-help.pd 2 Feb 2006 12:44:29 -0000 1.1
--- gfsm_automaton-help.pd 20 Apr 2006 09:42:14 -0000 1.2
***************
*** 1,7 ****
! #N canvas 126 0 473 476 10;
#X text 89 7 gfsm_automaton : weighted finite state machine;
! #X text 173 441 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
! #X text 7 379 SEE ALSO:;
! #X obj 22 399 gfsm;
#X text 12 73 INLETS:;
#X text 30 87 1 - control messages;
--- 1,7 ----
! #N canvas 126 0 479 520 10;
#X text 89 7 gfsm_automaton : weighted finite state machine;
! #X text 183 489 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
! #X text 7 436 SEE ALSO:;
! #X obj 22 457 gfsm;
#X text 12 73 INLETS:;
#X text 30 87 1 - control messages;
***************
*** 19,23 ****
point number.;
#X obj 265 272 print fsm-help-out;
! #X obj 137 400 gfsm_alphabet;
#N canvas 192 14 651 458 help-automaton-flags 0;
#X text 167 4 gfsm_automaton : flags;
--- 19,23 ----
point number.;
#X obj 265 272 print fsm-help-out;
! #X obj 135 457 gfsm_alphabet;
#N canvas 192 14 651 458 help-automaton-flags 0;
#X text 167 4 gfsm_automaton : flags;
***************
*** 196,201 ****
#X connect 30 0 27 0;
#X connect 34 0 27 0;
! #X restore 21 342 pd help-automaton-algebra;
! #X obj 59 400 gfsm_state;
#X obj 265 230 r fsm-help-in;
#N canvas 293 117 651 504 help-automaton-access 0;
--- 196,201 ----
#X connect 30 0 27 0;
#X connect 34 0 27 0;
! #X restore 21 362 pd help-automaton-algebra;
! #X obj 58 457 gfsm_state;
#X obj 265 230 r fsm-help-in;
#N canvas 293 117 651 504 help-automaton-access 0;
***************
*** 235,239 ****
label LO and upper (output) label HI with weight WEIGHT. states FROM
and TO are implicitly created.;
! #X msg 26 390 add_arc 0 1 2 3 4;
#X msg 38 412 add_arc 0 2 42 24 0.7;
#X text 349 480 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
--- 235,239 ----
label LO and upper (output) label HI with weight WEIGHT. states FROM
and TO are implicitly created.;
! #X msg 33 390 add_arc 0 1 2 3 4;
#X msg 38 412 add_arc 0 2 42 24 0.7;
#X text 349 480 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
***************
*** 280,288 ****
#X connect 20 0 19 0;
#X restore 20 318 pd help-automaton-draw;
! #X text 239 401 gfsmutils(1);
#X obj 265 344 gfsm_automaton fsm-help-2;
#X text 248 303 PLACEHOLDERS:;
#X obj 265 323 gfsm_automaton fsm-help;
#X obj 265 251 gfsm_automaton fsm-help;
#X connect 21 0 28 0;
#X connect 28 0 14 0;
--- 280,340 ----
#X connect 20 0 19 0;
#X restore 20 318 pd help-automaton-draw;
! #X text 234 457 gfsmutils(1);
#X obj 265 344 gfsm_automaton fsm-help-2;
#X text 248 303 PLACEHOLDERS:;
#X obj 265 323 gfsm_automaton fsm-help;
#X obj 265 251 gfsm_automaton fsm-help;
+ #N canvas 0 0 450 300 help-automaton-properties 0;
+ #X msg 15 13 cyclic;
+ #X text 89 15 "cyclic" : is the fsm cyclic?;
+ #X obj 14 192 s fsm-help-in;
+ #X connect 0 0 2 0;
+ #X restore 22 340 pd help-automaton-properties;
+ #N canvas 448 142 552 352 help-automaton-lookup 0;
+ #N canvas 0 0 450 300 lookup_init 0;
+ #X obj 22 16 inlet;
+ #X msg 22 40 clear \, root 0 \, add_arc 0 0 1 2 0.5 \, add_arc 0 0
+ 2 1 0.5 \, add_arc 0 1 1 1 0 \, final 0 1 \, final 1 1;
+ #X obj 22 76 outlet;
+ #X connect 0 0 1 0;
+ #X connect 1 0 2 0;
+ #X restore 24 54 pd lookup_init;
+ #X msg 24 33 bang;
+ #X obj 24 232 gfsm_automaton lookup-help;
+ #X msg 39 93 lookup fsm-help 1 2;
+ #X obj 24 255 print lookup-help-out;
+ #N canvas 0 0 450 300 view-automaton 0;
+ #X obj 30 16 inlet;
+ #X obj 30 60 t b s;
+ #X msg 60 85 \; \$1-in draw_dot gfsm_help.dot;
+ #X msg 30 133 dotty gfsm_help.dot;
+ #X obj 30 154 shell;
+ #X obj 30 38 symbol;
+ #X connect 0 0 5 0;
+ #X connect 1 0 3 0;
+ #X connect 1 1 2 0;
+ #X connect 3 0 4 0;
+ #X connect 5 0 1 0;
+ #X restore 326 222 pd view-automaton;
+ #X msg 326 177 lookup-help;
+ #X msg 326 198 fsm-help;
+ #X text 303 145 VIEWING:;
+ #X text 321 158 (requires 'graphviz');
+ #X obj 38 209 r lookup-help-in;
+ #X text 221 92 "lookup RESULT LABELS..." : linear composition;
+ #X text 313 108 result = compose(id(labels) \, fsm);
+ #X text 243 297 Bryan Jurish <moocow(a)ling.uni-potsdam.de>;
+ #X text 135 -2 gfsm_automaton : lookup;
+ #X msg 41 117 lookup fsm-help 1 1 1;
+ #X text 137 32 <-- START HERE: create lookup transducer;
+ #X connect 0 0 2 0;
+ #X connect 1 0 0 0;
+ #X connect 2 0 4 0;
+ #X connect 3 0 2 0;
+ #X connect 6 0 5 0;
+ #X connect 7 0 5 0;
+ #X connect 10 0 2 0;
+ #X connect 15 0 2 0;
+ #X restore 22 386 pd help-automaton-lookup;
#X connect 21 0 28 0;
#X connect 28 0 14 0;
--- NEW FILE: pd_paths.c ---
/*=============================================================================*\
* File: pd_paths.c
* Author: Bryan Jurish <moocow(a)ling.uni-potsdam.de>
* Description: finite state automata for Pd: paths
*
* Copyright (c) 2006 Bryan Jurish.
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* See file LICENSE for further informations on licensing terms.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*=============================================================================*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <pd_paths.h>
/*=====================================================================
* Structures and Types
*=====================================================================*/
static t_class *pd_gfsm_paths_class;
/*=====================================================================
* pd_gfsm_paths: Methods
*=====================================================================*/
/*=====================================================================
* Constructors, etc.
*/
/*--------------------------------------------------------------------
* new()
*/
static void *pd_gfsm_paths_new(t_symbol *sel, int argc, t_atom *argv)
{
t_symbol *name = &s_;
t_symbol *rname = &s_;
t_pd_gfsm_paths *x = (t_pd_gfsm_paths*)pd_new(pd_gfsm_paths_class);
//-- defaults
x->x_automaton_pd = NULL;
x->x_result_pd = NULL;
x->x_labels = g_ptr_array_sized_new(PD_GFSM_PATHS_DEFAULT_LABELS_LENGTH);
x->x_labels->len = 0;
//-- args
if (argc > 0) name = atom_getsymbolarg(0,argc,argv);
if (argc > 1) rname = atom_getsymbolarg(1,argc,argv);
//-- bindings
x->x_automaton_pd = pd_gfsm_automaton_pd_get(name);
x->x_automaton_pd->x_refcnt++;
x->x_result_pd = pd_gfsm_automaton_pd_get(rname);
x->x_result_pd->x_refcnt++;
//-- outlets
x->x_valout = outlet_new(&x->x_obj, &s_anything); //-- value outlet
return (void *)x;
}
/*--------------------------------------------------------------------
* free
*/
static void pd_gfsm_paths_free(t_pd_gfsm_paths *x)
{
pd_gfsm_automaton_pd_release(x->x_automaton_pd);
pd_gfsm_automaton_pd_release(x->x_result_pd);
g_ptr_array_free(x->x_labels,TRUE);
//-- do we need to do this?
outlet_free(x->x_valout);
}
/*=====================================================================
* Basic Accessors
*/
/*--------------------------------------------------------------------
* automaton
*/
static void pd_gfsm_paths_automaton(t_pd_gfsm_paths *x, t_symbol *name)
{
if (name == x->x_automaton_pd->x_name) return;
pd_gfsm_automaton_pd_release(x->x_automaton_pd);
x->x_automaton_pd = pd_gfsm_automaton_pd_get(name);
++x->x_automaton_pd->x_refcnt;
}
/*--------------------------------------------------------------------
* result
*/
static void pd_gfsm_paths_result(t_pd_gfsm_paths *x, t_symbol *rname)
{
if (rname == x->x_result_pd->x_name) return;
pd_gfsm_automaton_pd_release(x->x_result_pd);
x->x_result_pd = pd_gfsm_automaton_pd_get(rname);
++x->x_result_pd->x_refcnt;
}
/*=====================================================================
* Paths
*/
static void pd_gfsm_paths_paths(t_pd_gfsm_paths *x, t_symbol *sel, int argc, t_atom *argv)
{
//gfsmAutomaton *fsm = x->x_automaton_pd->x_automaton;
guint i;
//-- ensure labels is cleared & sufficiently allocated
if (argc > x->x_labels->len) g_ptr_array_set_size(x->x_labels, argc);
x->x_labels->len = 0;
for (i=0; i < argc; i++) {
gfsmLabelVal lab = atom_getfloat(argv+i);
//if (lab==gfsmEpsilon) continue; //-- ignore epsilons (?)
g_ptr_array_add(x->x_labels, (gpointer)lab);
}
//-- actual paths
gfsm_automaton_paths(x->x_automaton_pd->x_automaton,
x->x_labels,
x->x_result_pd->x_automaton);
//-- bang: report that we're done
outlet_bang(x->x_valout);
}
/*=====================================================================
* Setup
*/
/*--------------------------------------------------------------------
* setup()
*/
void pd_gfsm_paths_setup(void)
{
//-- class
pd_gfsm_paths_class = class_new(gensym("gfsm_paths"),
(t_newmethod)pd_gfsm_paths_new,
(t_method)pd_gfsm_paths_free,
sizeof(t_pd_gfsm_paths),
CLASS_DEFAULT,
A_GIMME, A_NULL);
//-- methods: automaton, result
class_addmethod(pd_gfsm_paths_class,
(t_method)pd_gfsm_paths_automaton,
gensym("automaton"),
A_DEFSYM, A_NULL);
class_addmethod(pd_gfsm_paths_class,
(t_method)pd_gfsm_paths_result,
gensym("result"),
A_DEFSYM, A_NULL);
//-- methods: paths
class_addmethod(pd_gfsm_paths_class,
(t_method)pd_gfsm_paths_paths,
gensym("paths"),
A_GIMME, A_NULL);
class_addmethod(pd_gfsm_paths_class,
(t_method)pd_gfsm_paths_paths,
&s_list,
A_GIMME, A_NULL);
//-- help symbol
class_sethelpsymbol(pd_gfsm_paths_class, gensym("gfsm_paths-help.pd"));
}