X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=src%2Fthreadgenesorter.cpp;fp=src%2Fthreadgenesorter.cpp;h=2276a2fdd271f05a04ae286831fb30ce9d0a20fc;hb=6b0585c4c6aa12aad13965d5f17be9a4a51653b5;hp=a45988c21dcc4a14f7717a9ef7b07d9757f81179;hpb=623097444fac1993a86e6d73b203bc3c6d731c11;p=germs.git diff --git a/src/threadgenesorter.cpp b/src/threadgenesorter.cpp index a45988c..2276a2f 100644 --- a/src/threadgenesorter.cpp +++ b/src/threadgenesorter.cpp @@ -21,6 +21,9 @@ #include "threadgenesorter.h" #include "sortaction.h" +#include "genealgorithms.h" + +#include using namespace std; /** @@ -131,6 +134,7 @@ void ThreadGeneSorter::sorter(const GeneOrder& go){ } void ThreadGeneSorter::worker(){ + try{ while(!_done){ Mutex m(&_queuelock); @@ -146,6 +150,33 @@ void ThreadGeneSorter::worker(){ SortUnit su = _queue.top(); _queue.pop(); m.unlock(); + + size_t dist = inversionDistance(su._go); + if (dist == 0){ + Mutex m(&_solutionslock); + _solutions.push(pair(su._score,su._al)); + pthread_cond_broadcast(&_addedSolution); + continue;; + } + + ActionList act = safeActions(su._go); + if (act.size() > 0){ + set safe(act.begin(), act.end()); + for (set::iterator sa = safe.begin(); sa != safe.end(); ++sa){ + GeneOrder go(su._go); + ActionList al(su._al); + al.push_back(*sa); + (*sa)(go); + double score = su._score + _model.score(*sa,su._go); + Mutex m(&_queuelock); + _queue.push(SortUnit(score,go,al)); + } + pthread_cond_broadcast(&_addedTask); + } //TODO: Hurdles.. + + } + }catch(const bad_alloc& e){ + _done = true; } }