Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
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);
    }
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
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;
}
Пример #7
0
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)];
}