static void sl_all_p_g (model_t model, int *state, int *labels) { get_guard_all(model, state, labels); gb_context_t ctx = (gb_context_t) GBgetContext (model); labels[ctx->accepting_state_label_idx] = buchi_is_accepting(model, state); }
static int etf_short(model_t self,int group,int*src,TransitionCB cb,void*user_context){ gb_context_t ctx=(gb_context_t)GBgetContext(self); int len=dm_ones_in_row(GBgetDMInfo(self), group); uint32_t src_no=(uint32_t)SIlookupC(ctx->trans_key_idx[group],(char*)src,len<<2); matrix_table_t mt=ctx->trans_table[group]; if ((src_no)>=MTclusterCount(mt)) return 0; int K=MTclusterSize(mt,src_no); for(int i=0;i<K;i++){ uint32_t row[3]; MTclusterGetRow(mt,src_no,i,row); int *dst=(int*)SIgetC(ctx->trans_key_idx[group],(int)row[1],NULL); switch(ctx->edge_labels){ case 0: { transition_info_t ti = GB_TI(NULL, group); cb(user_context,&ti,dst,NULL); break; } case 1: { int lbl=(int)row[2]; transition_info_t ti = GB_TI(&lbl, group); cb(user_context,&ti,dst,NULL); break; } default: { transition_info_t ti = GB_TI((int*)SIgetC(ctx->label_idx,(int)row[2],NULL), group); cb(user_context,&ti,dst,NULL); break; } } } return K; }
static int sl_long_p_g (model_t model, int label, int *state) { gb_context_t ctx = (gb_context_t) GBgetContext (model); if (label == ctx->accepting_state_label_idx) { return buchi_is_accepting(model, state); } else { return get_guard(model, label, state); } }
static int check_all (model_t model, int *src, TransitionCB cb, void *context) { check_ctx_t *ctx = GBgetContext (model); int res = 0; for (int i = 0; i < ctx->K; i++) { res += check_long (model, i, src, cb, context); } return res; }
static int etf_transition_in_group(model_t self, int *labels, int group) { gb_context_t ctx = (gb_context_t)GBgetContext(self); matrix_table_t mt = ctx->trans_table[group]; int K = MTgetCount(mt); for(int i = 0; i < K; i++){ uint32_t row[3]; MTgetRow(mt, i, row); switch(ctx->edge_labels){ case 0: { return 1; } case 1: { if(labels[0]==(int)row[2]) return 1; else break; } default: { int* tl = (int*)SIgetC(ctx->label_idx,(int)row[2],NULL); int i = 0; int correct = 1; while(correct && i < ctx->edge_labels) { correct = (tl[i] == labels[i]); i++; } if(correct) return 1; else break; } } } return 0; }
static int check_long (model_t model, int g, int *src, TransitionCB cb, void *context) { check_ctx_t *ctx = GBgetContext (model); int count; int found; // collect ctx->src = src; ctx->group = g; ctx->user_cb = cb; ctx->user_ctx = context; ci_clear (ctx->check_must); isba_discard_int (ctx->stack, isba_size_int(ctx->stack)); HREassert (!ctx->reentrent, "INTERFACE ERROR: GBgetTransitions* is not re-entrant"); ctx->reentrent = 1; count = GBgetTransitionsLong (ctx->parent, g, src, collect, ctx); ctx->reentrent = 0; found = isba_size_int(ctx->stack); abort_if (count != found, "Wrong count returned by GBnextLong(collect): %d (Found: %d).", count, found); // compare ctx->src2 = copy_vec (ctx, g, src); ctx->comparison_failed = false; ctx->call_idx = 0; count = GBgetTransitionsLong (ctx->parent, g, ctx->src2, compare, ctx); abort_if (count != ctx->call_idx , "Wrong count returned by GBnextLong(compare): %d (Found: %d).", count, ctx->call_idx ); if (ctx->call_idx != found || ctx->comparison_failed) { find_culprit_slot (ctx, g); } return count; }
static int etf_state_short(model_t self,int label,int *state){ gb_context_t ctx=(gb_context_t)GBgetContext(self); matrix_t *sl_info = GBgetStateLabelInfo(self); int len=dm_ones_in_row(sl_info,label); return ctx->label_data[label][SIlookupC(ctx->label_key_idx[label],(char*)state,len<<2)]; }