using namespace std;
#include <unistd.h>
+#include <signal.h>
#include "geneorder.h"
#include "modelidentifier.h"
#include "genealgorithms.h"
#include "model.h"
+static bool g_cancel = false;
+
+void handler(int signal)
+{
+
+ if (signal == SIGINT){
+ cerr << "Interrupted" << endl;
+ g_cancel = true;
+ }
+
+ /* signal(SIGINT, handler); */
+}
+
int main(int argc, char** argv){
+ signal(SIGINT, handler);
string ann = "default.ann";
Model model(0);
bool detectModel = true;
}
cout << "Using model: " << model.name() << endl;
- cout << "Distance: " << inversionDistance(go) << endl;
+ size_t dist = inversionDistance(go);
+ cout << "Distance: " << dist << endl;
//copy(go.begin(), go.end(), ostream_iterator<int>(cout, " "));
//cout << endl;
if (threads){
ThreadGeneSorter so(model, threads);
so.start(go);
+ cout << "Press CTRL+C to stop" << endl;
+ while (!g_cancel && so.running()){
+ double score = so.wait(5,1000);
+ cout << "\r" << "Solutions: " << so.size()
+ << " Best score: " << score / dist;
+ cout.flush();
+ }
+ cout << endl << "DONE: Waiting for threads to stop." << endl;
+ so.stop();
so.join();
ThreadGeneSorter::SolutionsQueue solutions = so.solutions();
- while (solutions.size() > 0){
+ for (int i = 0; i < 10 && solutions.size() > 0; ++i){
pair<double,GeneSorter::ActionList> s = solutions.top();
solutions.pop();
cout << "Actions: ";
- for (GeneSorter::ActionList::iterator sa = s.second.begin(); sa != s.second.end(); ++sa){
+ for (GeneSorter::ActionList::iterator sa = s.second.begin();
+ sa != s.second.end(); ++sa){
cout << sa->toString() << " ";
-
}
- cout << endl << "Score: " << s.first << endl;
+ cout << endl << "Score: " << s.first / dist << endl;
}
-
}else{
//Sort
GeneSorter so;
#include "genealgorithms.h"
+#include <sys/time.h>
+#include <errno.h>
+
#include <set>
using namespace std;
}
void ThreadGeneSorter::stop(){
+ Mutex m(&_queuelock);
_done = true;
+ pthread_cond_signal(&_waiting);
}
size_t ThreadGeneSorter::size(){
- //TODO: thread safety..
+ Mutex m(&_solutionslock);
return _solutions.size();
}
-double progress(int time, int solutions = 1){
+bool ThreadGeneSorter::running(){
+ return !_done;
+}
+
+double ThreadGeneSorter::wait(time_t time, size_t solutions){
+
+ timeval now;
+ gettimeofday(&now, NULL);
+ timespec timeout;
+ timeout.tv_sec = now.tv_sec + time;
+ timeout.tv_nsec = 0;
+
+ int err = 0;
+
+ Mutex m(&_solutionslock);
+ size_t n = _solutions.size();
+
+ while (!_done && err != ETIMEDOUT
+ && _solutions.size() - n < solutions){
+ err = pthread_cond_timedwait(&_addedSolution,&_solutionslock
+ , &timeout);
+ }
+ if (_solutions.size() == 0)
+ return 0.0;
+ return _solutions.top().first;
}
ThreadGeneSorter::SolutionsQueue ThreadGeneSorter::solutions(){
*/
void join();
+ /**
+ * Returns true while the sorter is running.
+ */
+ bool running();
+
/**
* Tell the sorter to stop execution.
*/
/**
* Waits for progress.
*
- * \param time Max time to wait for.
+ * \param time Max time to wait for, in seconds.
* \param solutions The minimum number of solutions we'll wait for.
+ * \return The best score so far.
*/
- double progress(int time, int solutions = 1);
+ double wait(time_t time, size_t solutions = 1);
/**
* Get the full list of solutions.