2
#include "../DependencyGraph/Configuration.h"
3
#include "../DependencyGraph/Edge.h"
8
bool Algorithm::LocalFPA::search(DependencyGraph::BasicDependencyGraph &t_graph)
10
using namespace DependencyGraph;
13
Configuration *v = graph->initialConfiguration();
16
while (!strategy->empty())
18
while (auto e = strategy->popEdge()) {
20
if (v->assignment == DependencyGraph::ONE) {
25
Configuration *lastUndecided = nullptr;
27
for (DependencyGraph::Configuration *c : e->targets) {
28
if (c->assignment != DependencyGraph::ONE) {
35
_processedNegationEdges += 1;
36
//Process negation edge
38
else if(!e->processed){
39
addDependency(e, lastUndecided);
40
if(lastUndecided->assignment == UNKNOWN){
41
explore(lastUndecided);
43
strategy->pushNegation(e);
46
finalAssign(e->source, ONE);
53
finalAssign(e->source, ONE);
55
addDependency(e, lastUndecided);
56
if (lastUndecided->assignment == UNKNOWN) {
57
explore(lastUndecided);
62
if(e->refcnt == 0) graph->release(e);
64
if(!strategy->trivialNegation())
66
strategy->releaseNegationEdges(strategy->maxDistance());
70
return (v->assignment == ONE) ? true : false;
73
void Algorithm::LocalFPA::finalAssign(DependencyGraph::Configuration *c, DependencyGraph::Assignment a)
75
assert(a == DependencyGraph::ONE);
78
for(DependencyGraph::Edge *e : c->dependency_set){
81
strategy->pushNegation(e);
85
strategy->pushDependency(e);
88
if(e->refcnt == 0) graph->release(e);
91
c->dependency_set.clear();
94
void Algorithm::LocalFPA::explore(DependencyGraph::Configuration *c)
96
assert(c->assignment == DependencyGraph::UNKNOWN);
97
c->assignment = DependencyGraph::ZERO;
98
auto succs = graph->successors(c);
100
for (DependencyGraph::Edge *succ : succs) {
101
strategy->pushEdge(succ);
103
if(succ->refcnt == 0) graph->release(succ);
106
_exploredConfigurations += 1;
107
_numberOfEdges += succs.size();
110
void Algorithm::LocalFPA::addDependency(DependencyGraph::Edge *e, DependencyGraph::Configuration *target)
112
unsigned int sDist = e->is_negated ? e->source->getDistance() + 1 : e->source->getDistance();
113
unsigned int tDist = target->getDistance();
115
target->setDistance(std::max(sDist, tDist));
117
auto lb = std::lower_bound(std::begin(target->dependency_set), std::end(target->dependency_set), e);
118
if(lb == std::end(target->dependency_set) || *lb != e)
120
target->dependency_set.insert(lb, e);