Added another variant of periodicity test.
Knotkit can read the list of knots to test from a file.
This commit is contained in:
parent
f80ac2ce8e
commit
816e2eef59
7
Makefile
7
Makefile
@ -48,7 +48,7 @@ KNOTKIT_HEADERS = knotkit.h planar_diagram.h dt_code.h knot_diagram.h \
|
|||||||
|
|
||||||
PERIODICITY_HEADERS = periodicity.h
|
PERIODICITY_HEADERS = periodicity.h
|
||||||
|
|
||||||
LIBS = -lgmpxx -lgmp -lz
|
LIBS = -lgmpxx -lgmp -lz -lpthread
|
||||||
|
|
||||||
all: kk
|
all: kk
|
||||||
|
|
||||||
@ -59,7 +59,10 @@ all: kk
|
|||||||
$(CXX) -c $(CXXFLAGS) $< -o $@
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
||||||
|
|
||||||
kk: kk.o $(COMMON_OBJS)
|
kk: kk.o $(COMMON_OBJS)
|
||||||
$(CXX) $(LDFLAGS) -pg -o kk $^ $(LIBS)
|
$(CXX) $(LDFLAGS) -o kk $^ $(LIBS)
|
||||||
|
|
||||||
|
kk_from_file: kk_from_file.o $(COMMON_OBJS)
|
||||||
|
$(CXX) $(LDFLAGS) -o kk_from_file $^ $(LIBS) -lpthread
|
||||||
|
|
||||||
main: main.o $(COMMON_OBJS)
|
main: main.o $(COMMON_OBJS)
|
||||||
$(CXX) $(LDFLAGS) -o main $^ $(LIBS)
|
$(CXX) $(LDFLAGS) -o main $^ $(LIBS)
|
||||||
|
69
kk.cpp
69
kk.cpp
@ -1,10 +1,15 @@
|
|||||||
#include <knotkit.h>
|
#include <knotkit.h>
|
||||||
#include <periodicity.h>
|
#include <periodicity.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <thread>
|
||||||
|
#include <future>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
|
||||||
|
const unsigned max_threads = 4;
|
||||||
|
|
||||||
const char *program_name;
|
const char *program_name;
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -88,9 +93,9 @@ const char *invariant = 0;
|
|||||||
const char *field = "Z2";
|
const char *field = "Z2";
|
||||||
std::string periodicity_test = "Przytycki";
|
std::string periodicity_test = "Przytycki";
|
||||||
int period = 5;
|
int period = 5;
|
||||||
|
|
||||||
knot_diagram kd;
|
knot_diagram kd;
|
||||||
bool reduced = 0;
|
bool reduced = 0;
|
||||||
|
std::string in_file_name = "/home/wojtek/ownCloud/Lokalny/khovanov-homology-computation/homflypt_test/to_test_kh.txt";
|
||||||
|
|
||||||
class hg_grading_mapper
|
class hg_grading_mapper
|
||||||
{
|
{
|
||||||
@ -329,6 +334,23 @@ int compute_s_inv(knot_diagram& kd) {
|
|||||||
return qmin + 1;
|
return qmin + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline std::string parse_data_from_file(const std::string& data) {
|
||||||
|
auto p_start = data.find(":") + 2;
|
||||||
|
auto p_stop = data.find("]");
|
||||||
|
return data.substr(p_start, p_stop - p_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string perform_computations(const std::string& knot_name) {
|
||||||
|
std::ostringstream res;
|
||||||
|
knot_diagram kd = parse_knot(knot_name.c_str());
|
||||||
|
kd.marked_edge = 1;
|
||||||
|
Kh_periodicity_checker Kh_pc(kd, knot_name);
|
||||||
|
for(auto p: primes_list) {
|
||||||
|
res << "Kh criterion: " << Kh_pc(p) << std::endl;
|
||||||
|
}
|
||||||
|
return res.str();
|
||||||
|
}
|
||||||
|
|
||||||
void check_periodicity(std::string out_file) {
|
void check_periodicity(std::string out_file) {
|
||||||
if(periodicity_test == "all") {
|
if(periodicity_test == "all") {
|
||||||
Kh_periodicity_checker Kh_pc(kd, std::string(knot));
|
Kh_periodicity_checker Kh_pc(kd, std::string(knot));
|
||||||
@ -337,6 +359,41 @@ void check_periodicity(std::string out_file) {
|
|||||||
<< Kh_pc(p) << std::endl;
|
<< Kh_pc(p) << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(periodicity_test == "Kh_from_file") {
|
||||||
|
std::ifstream in_file(in_file_name);
|
||||||
|
if(!in_file) {
|
||||||
|
std::cerr << "Cannot open file " << in_file_name << "\n";
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
unsigned num_threads = std::min(max_threads, std::thread::hardware_concurrency());
|
||||||
|
std::string line;
|
||||||
|
std::string previous_knot;
|
||||||
|
std::vector<std::future<std::string>> v_future(num_threads);
|
||||||
|
bool stop = false;
|
||||||
|
while(!stop) {
|
||||||
|
unsigned i = 0;
|
||||||
|
while(i < num_threads) {
|
||||||
|
if(!in_file.eof()) {
|
||||||
|
std::getline(in_file, line);
|
||||||
|
std::string knot_name = parse_data_from_file(line);
|
||||||
|
if(knot_name == previous_knot)
|
||||||
|
continue;
|
||||||
|
else {
|
||||||
|
v_future[i] = std::async(std::launch::async, perform_computations, knot_name);
|
||||||
|
++i;
|
||||||
|
std::cerr << "Checking " << knot_name << "\n";
|
||||||
|
previous_knot = knot_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stop = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(auto& v_f : v_future)
|
||||||
|
std::cout << v_f.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(periodicity_test == "all_seq") {
|
else if(periodicity_test == "all_seq") {
|
||||||
std::string k(knot);
|
std::string k(knot);
|
||||||
// first check whether the number of crossings is bigger or lower than 10
|
// first check whether the number of crossings is bigger or lower than 10
|
||||||
@ -392,7 +449,7 @@ void check_periodicity(std::string out_file) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(period == 2 || period == 3) {
|
if(period == 2 || period == 3) {
|
||||||
std::cout << "Sorry, the criteria don't work for period "
|
std::cout << "Sorry, the criterion doesn't work for period "
|
||||||
<< period << "...\n";
|
<< period << "...\n";
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -761,6 +818,14 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
periodicity_test = argv[i];
|
periodicity_test = argv[i];
|
||||||
}
|
}
|
||||||
|
else if(!strcmp(argv[i], "-i")) {
|
||||||
|
i++;
|
||||||
|
if(i == argc) {
|
||||||
|
fprintf (stderr, "error: missing argument to option `-t'\n");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
in_file_name = argv[i];
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
fprintf (stderr, "error: unknown argument `%s'\n", argv[1]);
|
fprintf (stderr, "error: unknown argument `%s'\n", argv[1]);
|
||||||
fprintf (stderr, " use -h for usage\n");
|
fprintf (stderr, " use -h for usage\n");
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <periodicity.h>
|
#include <periodicity.h>
|
||||||
#include <simplify_chain_complex.h>
|
#include <simplify_chain_complex.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
using polynomial_tuple = std::vector<std::tuple<multivariate_laurentpoly<Z>, multivariate_laurentpoly<Z>, multivariate_laurentpoly<Z>>>;
|
using polynomial_tuple = std::vector<std::tuple<multivariate_laurentpoly<Z>, multivariate_laurentpoly<Z>, multivariate_laurentpoly<Z>>>;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user