Update of /cvsroot/pure-data/externals/moocow/gfsm/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22605/src
Modified Files: gfsm_markov.pd gfsm_state-help.pd pd_state.c Log Message: v0.0402: + fixed generation in gfsm_markov.pd + added total_weight and arc_gen methods to gfsm_state
Index: gfsm_state-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/gfsm_state-help.pd,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** gfsm_state-help.pd 20 Apr 2006 09:42:14 -0000 1.2 --- gfsm_state-help.pd 30 Jan 2007 15:47:31 -0000 1.3 *************** *** 1,3 **** ! #N canvas 232 0 651 599 10; #X obj 85 569 gfsm; #X text 15 569 SEE ALSO:; --- 1,3 ---- ! #N canvas 154 10 651 599 10; #X obj 85 569 gfsm; #X text 15 569 SEE ALSO:; *************** *** 13,48 **** #X text 52 61 STATE_ID - numeric Id of the target state; #X obj 26 531 print gfsm-state-out; ! #X msg 44 182 id; ! #X text 164 185 "id" : get current state Id; ! #X text 135 205 "set ID" : set current state Id; ! #X msg 50 205 set 0; #X msg 26 127 automaton; ! #X msg 31 149 automaton fsm-help; #X text 197 128 "automaton" : use an object-local machine; ! #X text 163 151 "automaton NAME" : use a shared machine named NAME ; ! #X msg 58 239 degree; ! #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; ! #X text 229 398 arcs are output as a list:; ! #X text 277 414 NEXT_STATEID LO HI WEIGHT; ! #X text 306 359 (negative labels are ignored); ! #X msg 58 345 arc_seek 202 -1; ! #X text 208 294 "arc_first" : get first outgoing arc; ! #X text 214 318 "arc_next" : get next available outgoing arc (maybe first); ! #X text 173 344 "arc_seek LO HI" : get next arc with labels LO:HI; ! #X text 207 383 "arc_reset" : close internal arc iterator; ! #X msg 54 447 add_weight 1 -1 101 0.9; ! #X text 233 450 "add_weight ID LO HI W" : add W to 1st arc to state ID; ! #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; --- 13,55 ---- #X text 52 61 STATE_ID - numeric Id of the target state; #X obj 26 531 print gfsm-state-out; ! #X msg 44 168 id; ! #X text 164 171 "id" : get current state Id; ! #X text 135 185 "set ID" : set current state Id; ! #X msg 50 185 set 0; #X msg 26 127 automaton; ! #X msg 31 144 automaton fsm-help; #X text 197 128 "automaton" : use an object-local machine; ! #X text 163 146 "automaton NAME" : use a shared machine named NAME ; ! #X msg 58 212 degree; ! #X text 137 213 "degree" : get number of outgoing arcs (linear time) ; ! #X msg 61 325 arc_first; ! #X msg 61 342 arc_next; ! #X msg 65 412 arc_reset; #X obj 26 508 gfsm_state fsm-help 0; ! #X text 75 258 arcs are output as a list:; ! #X text 265 258 NEXT_STATEID LO HI WEIGHT; ! #X text 306 392 (negative labels are ignored); ! #X msg 64 376 arc_seek 202 -1; ! #X text 208 326 "arc_first" : get first outgoing arc; ! #X text 215 342 "arc_next" : get next available outgoing arc (maybe first); ! #X text 173 377 "arc_seek LO HI" : get next arc with labels LO:HI; ! #X text 213 413 "arc_reset" : close internal arc iterator; ! #X msg 54 467 add_weight 1 -1 101 0.9; ! #X text 233 470 "add_weight ID LO HI W" : add W to 1st arc to state ID; ! #X text 416 483 with labels LO:HI; ! #X text 271 499 (implicitly resets arc iterator); ! #X msg 61 229 cyclic; ! #X text 137 229 "cyclic" : does this state lead to any cycles?; ! #X msg 64 359 arc_nth 0; ! #X text 208 360 "arc_nth N" : seek to n-th arc (counting from zero) ! ; ! #X msg 61 278 arc_gen 42 1; ! #X text 186 281 "arc_gen W SR" : generate an arc; ! #X text 312 295 W - weight hint (0..sum(weights(state)); ! #X text 304 309 SR - boolean - whether to use gfsmSemiring; #X connect 12 0 25 0; #X connect 15 0 25 0; *************** *** 57,58 **** --- 64,67 ---- #X connect 34 0 25 0; #X connect 38 0 25 0; + #X connect 40 0 25 0; + #X connect 42 0 25 0;
Index: gfsm_markov.pd =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/gfsm_markov.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** gfsm_markov.pd 2 Feb 2006 12:44:29 -0000 1.1 --- gfsm_markov.pd 30 Jan 2007 15:47:31 -0000 1.2 *************** *** 285,409 **** #X connect 36 0 34 1; #X restore 21 186 pd gfsm_markov_add_guts; ! #N canvas 27 0 738 524 gfsm_markov_next_guts 0; ! #X obj 86 25 r $0-next; #X obj 243 464 outlet; ! #X obj 86 47 route bang; ! #X obj 151 158 * -1; ! #X obj 151 136 * 1; ! #X obj 559 376 t b b; ! #N canvas 75 18 312 424 weight_sum 0; ! #X obj 24 9 inlet; ! #X msg 24 114 arc_next; ! #X obj 24 319 f 0; ! #X obj 199 92 0; ! #X obj 89 238 unpack 0 0 0 0; ! #X obj 183 262 + 0; ! #X obj 88 263 t f f; ! #X obj 24 350 outlet; ! #X obj 60 146 r $0-state; ! #X obj 24 90 until; ! #X obj 24 214 route bang; ! #X obj 24 235 t b b; ! #X obj 24 192 route arc_next; ! #X obj 24 43 t b b b b; ! #X msg 91 114 arc_reset; ! #X obj 24 167 gfsm_state $1-fsm 0; ! #X connect 0 0 13 0; ! #X connect 1 0 15 0; ! #X connect 2 0 7 0; ! #X connect 3 0 5 1; ! #X connect 4 3 5 0; ! #X connect 5 0 6 0; ! #X connect 6 0 5 1; ! #X connect 6 1 2 1; ! #X connect 8 0 15 0; ! #X connect 9 0 1 0; ! #X connect 10 0 11 0; ! #X connect 10 1 4 0; ! #X connect 11 0 2 0; ! #X connect 11 1 9 1; ! #X connect 12 0 10 0; ! #X connect 13 0 9 0; ! #X connect 13 1 3 0; ! #X connect 13 2 14 0; ! #X connect 13 3 9 1; ! #X connect 14 0 15 0; ! #X connect 15 0 12 0; ! #X restore 167 115 pd weight_sum; ! #X obj 25 95 random 131072; ! #X obj 25 116 / 131072; ! #X obj 86 69 t b b b; ! #X obj 151 69 t f b b; ! #X msg 559 227 arc_next; ! #X obj 594 269 r $0-state; ! #X obj 559 205 until; ! #X obj 559 349 route bang; ! #X obj 559 326 route arc_next; ! #X msg 625 226 arc_reset; ! #X obj 151 180 t b b f; #X obj 405 461 outlet; #X obj 101 429 gfsm_alphabet $1-alph; #X msg 101 407 char2atom! $1; - #X obj 179 296 moses 0; - #X obj 179 251 + 0; - #X obj 179 274 t f f; #X obj 86 225 unpack 0 0 0 0; - #X obj 18 386 f 0; #X msg 18 411 set $1; #X obj 18 432 s $0-state; ! #X obj 559 292 gfsm_state $1-fsm 0; ! #X obj 559 457 outlet; #X obj 263 428 gfsm_alphabet $1-alph; #X msg 263 406 char2atom! $1; ! #X obj 263 384 f 0; ! #X obj 101 385 f 0; ! #X obj 225 316 t b b b b; #X connect 0 0 2 0; ! #X connect 2 0 9 0; ! #X connect 2 1 10 0; ! #X connect 3 0 17 0; ! #X connect 4 0 3 0; ! #X connect 5 0 29 0; ! #X connect 5 1 13 1; ! #X connect 6 0 4 1; ! #X connect 7 0 8 0; ! #X connect 8 0 4 0; ! #X connect 9 0 7 0; ! #X connect 9 1 6 0; ! #X connect 9 2 13 1; ! #X connect 10 0 4 0; ! #X connect 10 1 6 0; ! #X connect 10 2 13 1; ! #X connect 11 0 28 0; ! #X connect 12 0 28 0; ! #X connect 13 0 11 0; ! #X connect 14 0 5 0; ! #X connect 14 1 24 0; ! #X connect 15 0 14 0; ! #X connect 16 0 28 0; ! #X connect 17 0 13 0; ! #X connect 17 1 16 0; ! #X connect 17 2 22 1; ! #X connect 19 1 1 0; ! #X connect 20 0 19 0; ! #X connect 21 1 34 0; ! #X connect 22 0 23 0; ! #X connect 23 0 21 0; ! #X connect 23 1 22 1; ! #X connect 24 0 25 1; ! #X connect 24 1 33 1; ! #X connect 24 2 32 1; ! #X connect 24 3 22 0; #X connect 25 0 26 0; - #X connect 26 0 27 0; - #X connect 28 0 15 0; - #X connect 30 1 18 0; - #X connect 31 0 30 0; - #X connect 32 0 31 0; - #X connect 33 0 20 0; - #X connect 34 0 25 0; - #X connect 34 1 33 0; - #X connect 34 2 32 0; - #X connect 34 3 13 1; #X restore 22 216 pd gfsm_markov_next_guts; #X obj 185 260 outlet; --- 285,345 ---- #X connect 36 0 34 1; #X restore 21 186 pd gfsm_markov_add_guts; ! #N canvas 29 370 662 532 gfsm_markov_next_guts 0; ! #X obj 28 4 r $0-next; #X obj 243 464 outlet; ! #X obj 28 26 route bang; ! #X obj 167 138 * 1; ! #X obj 28 70 random 131072; ! #X obj 28 91 / 131072; #X obj 405 461 outlet; #X obj 101 429 gfsm_alphabet $1-alph; #X msg 101 407 char2atom! $1; #X obj 86 225 unpack 0 0 0 0; #X msg 18 411 set $1; #X obj 18 432 s $0-state; ! #X obj 512 461 outlet; #X obj 263 428 gfsm_alphabet $1-alph; #X msg 263 406 char2atom! $1; ! #X obj 424 101 gfsm_state $1-fsm 0; ! #X obj 424 20 r $0-state; ! #X obj 512 150 route bang; ! #X obj 512 172 t b; ! #X obj 424 124 route total_weight arc_gen; ! #X obj 28 48 t b; ! #X obj 153 71 t b f; ! #X obj 167 115 f 0; ! #X obj 196 114 t b f; ! #X msg 167 160 arc_gen $1; ! #X msg 153 91 arc_reset , total_weight; ! #X obj 153 187 s $0-state; #X connect 0 0 2 0; ! #X connect 2 0 20 0; ! #X connect 2 1 21 0; ! #X connect 3 0 24 0; ! #X connect 4 0 5 0; ! #X connect 5 0 21 0; ! #X connect 7 1 1 0; ! #X connect 8 0 7 0; ! #X connect 9 0 10 0; ! #X connect 9 1 8 0; ! #X connect 9 2 14 0; ! #X connect 10 0 11 0; ! #X connect 13 1 6 0; ! #X connect 14 0 13 0; ! #X connect 15 0 19 0; ! #X connect 16 0 15 0; ! #X connect 17 0 18 0; ! #X connect 17 1 9 0; ! #X connect 18 0 12 0; ! #X connect 19 0 23 0; ! #X connect 19 1 17 0; ! #X connect 20 0 4 0; ! #X connect 21 0 25 0; ! #X connect 21 1 22 1; ! #X connect 22 0 3 0; ! #X connect 23 0 22 0; ! #X connect 23 1 3 1; ! #X connect 24 0 26 0; #X connect 25 0 26 0; #X restore 22 216 pd gfsm_markov_next_guts; #X obj 185 260 outlet;
Index: pd_state.c =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/gfsm/src/pd_state.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pd_state.c 20 Apr 2006 09:42:14 -0000 1.2 --- pd_state.c 30 Jan 2007 15:47:31 -0000 1.3 *************** *** 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 --- 4,8 ---- * Description: finite state automata for Pd * ! * Copyright (c) 2004-2007 Bryan Jurish. * * For information on usage and redistribution, and for a DISCLAIMER OF ALL *************** *** 202,205 **** --- 202,290 ---- }
+ /*-------------------------------------------------------------------- + * arc_nth(n) + */ + static void pd_gfsm_state_arc_nth(t_pd_gfsm_state *x, t_float n) + { + int i = n; + gfsmState *s = gfsm_automaton_find_state(x->x_automaton_pd->x_automaton, x->x_id); + + if (s) { + gfsm_arciter_close(&x->x_arci); + for (gfsm_arciter_open(&x->x_arci, x->x_automaton_pd->x_automaton, x->x_id); + i > 0 && gfsm_arciter_ok(&x->x_arci); + gfsm_arciter_next(&x->x_arci)) + ; + } + + pd_gfsm_state_outlet_arc(x, gensym("arc_nth")); + } + + /*-------------------------------------------------------------------- + * get_total_weight(bool use_semiring) + * + low-level + */ + static t_float pd_gfsm_state_get_total_weight(t_pd_gfsm_state *x, int use_semiring) + { + gfsmAutomaton *fsm = x->x_automaton_pd->x_automaton; + gfsmState *s = gfsm_automaton_find_state(fsm, x->x_id); + gfsmSemiring *sr = fsm->sr; + gfsmWeight w = use_semiring ? sr->zero : 0.0; + + if (s) { + /*w = gfsm_sr_plus(sr,w,gfsm_automaton_get_final_weight(fsm,x->x_id));*/ //--ignore final weights! + gfsm_arciter_close(&x->x_arci); + for (gfsm_arciter_open(&x->x_arci, x->x_automaton_pd->x_automaton, x->x_id); + gfsm_arciter_ok(&x->x_arci); + gfsm_arciter_next(&x->x_arci)) + { + gfsmArc *a = gfsm_arciter_arc(&x->x_arci); + w = use_semiring ? gfsm_sr_plus(sr,w,a->weight) : (w+a->weight); + } + } + return w; + } + + /*-------------------------------------------------------------------- + * total_weight() + * + pd level + */ + static void pd_gfsm_state_total_weight(t_pd_gfsm_state *x, t_float use_semiring) + { + t_float w = pd_gfsm_state_get_total_weight(x, (int)use_semiring); + SETFLOAT(x->x_argv, (t_float)(w)); + outlet_anything(x->x_valout, gensym("total_weight"), 1, x->x_argv); + } + + + /*-------------------------------------------------------------------- + * arc_gen(weight_hint) + */ + static void pd_gfsm_state_arc_gen(t_pd_gfsm_state *x, t_float weight_hint, t_float use_semiring_f) + { + gfsmState *s = gfsm_automaton_find_state(x->x_automaton_pd->x_automaton, x->x_id); + int use_semiring = (int)use_semiring_f; + if (s) { + gfsmSemiring *sr = x->x_automaton_pd->x_automaton->sr; + gfsmWeight w = use_semiring ? sr->zero : 0; + + for (gfsm_arciter_open(&x->x_arci, x->x_automaton_pd->x_automaton, x->x_id); + gfsm_arciter_ok(&x->x_arci); + gfsm_arciter_next(&x->x_arci)) + { + gfsmArc *a = gfsm_arciter_arc(&x->x_arci); + if (use_semiring) { + w = gfsm_sr_plus(sr,w,a->weight); + if (!gfsm_sr_less(sr,w,weight_hint)) break; + } else { + w += a->weight; + if (w >= weight_hint) break; + } + } + } + pd_gfsm_state_outlet_arc(x, gensym("arc_gen")); + } + +
/*-------------------------------------------------------------------- *************** *** 316,319 **** --- 401,412 ---- gensym("arc_reset"), A_NULL);
+ //-- new arc methods + class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_arc_nth, + gensym("arc_nth"), A_DEFFLOAT, A_NULL); + class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_total_weight, + gensym("total_weight"), A_DEFFLOAT, A_DEFFLOAT, A_NULL); + class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_arc_gen, + gensym("arc_gen"), A_DEFFLOAT, A_DEFFLOAT, A_NULL); + //-- methods: manipulation class_addmethod(pd_gfsm_state_class, (t_method)pd_gfsm_state_add_weight,