~tapaal-dist-ctl/verifypn/warning_fix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "CertainZeroFPA.h"

namespace ctl{

bool CertainZeroFPA::search(DependencyGraph &t_graph, AbstractSearchStrategy &W)
{
    PriorityQueue N;

    Configuration &v = t_graph.initialConfiguration();
    v.assignment = ZERO;

    for(Edge *e : t_graph.successors(v)){
        W.push(e);
        if(e->source->IsNegated)
            N.push(e);
    }

    while(!W.empty() || !N.empty()){
        Edge *e;

        if(!W.empty()) {
            e = W.pop();
        }
        else if (!N.empty()) {
            e = N.top();
            N.pop();
        }

//        e->edgePrinter();

        /*****************************************************************/
        /*Data handling*/
        int targetONEassignments = 0;
        int targetZEROassignments = 0;
        Configuration * lastUnknown = NULL;
        bool czero = false;

        for(auto c : e->targets){
            if (c->assignment == ONE) {
                targetONEassignments++;
            }
            else if (c->assignment == ZERO) {
                targetZEROassignments++;
            }
            else if (c->assignment == CZERO){
                czero = true;
                break;
            }
            else if(c-> assignment == UNKNOWN){
                lastUnknown = c;
            }

        }
        /*****************************************************************/

        if(e->isDeleted || e->source->assignment == ONE || e->source->assignment == CZERO){
            //std::cout << "== Ignored ==\n" << std::flush;
        }
        /*****************************************************************/

        else if(e->targets.size() == targetONEassignments){

            if(e->source->IsNegated){
                e->source->assignment = CZERO;
                e->source->removeSuccessor(e);
            }
            else{
                e->source->assignment = ONE;
            }
            if(e->source == &v) break;

            for(Edge *de : e->source->DependencySet){
                W.push_dependency(de);
            }
            e->source->DependencySet.clear();
        }
        else if(czero){
            if(e->source->IsNegated){
                e->source->assignment = ONE;
                if(e->source == &v) break;

                for(Edge *de : e->source->DependencySet){
                    W.push_dependency(de);
                }
                e->source->DependencySet.clear();
            }
            else{
                if(e->source->Successors.size() <= 1){
                    e->source->assignment = CZERO;
                    if(e->source == &v) break;

                    for(Edge *de : e->source->DependencySet){
                        W.push_dependency(de);
                    }
                    e->source->DependencySet.clear();
                }
            }
            e->source->removeSuccessor(e);
        }
        else if(targetZEROassignments > 0){
            if(e->source->IsNegated && e->processed){
                e->source->assignment = ONE;
                if(e->source == &v) break;
                for(Edge *de : e->source->DependencySet){
                    W.push_dependency(de);
                }
                e->source->DependencySet.clear();
            }
            else {
                for(auto c : e->targets){
                    if(c->assignment == ZERO) {
                        c->DependencySet.push_back(e);
                    }
                }
            }
        }
        else if(lastUnknown != NULL){
            Configuration *tc = lastUnknown;
            tc->assignment = ZERO;
            tc->DependencySet.push_back(e);
            t_graph.successors(*tc);

            if(tc->Successors.empty()){
                tc->assignment = CZERO;
               W.push_dependency(e);
            }
            else {
                for(Edge *succ : tc->Successors){
                    W.push(succ);
                    if(succ->source->IsNegated){
                        N.push(succ);
                    }
                }
            }
        }
        e->processed = true;
    }

//    std::cout << "Final Assignment: " << v.assignment << " " << ((v.assignment == ONE) ? true : false) << std::endl;
    return (v.assignment == ONE) ? true : false;
}

}