/* main */ int main(int argc, char *argv[]) { std::ios_base::sync_with_stdio(false); // arguments: p1 p2 [y|(* \ {y})] [true|false] size_t p1 = argc > 2 ? fast_atoi(argv[1]) : 1; // default = 1 size_t p2 = argc > 2 ? fast_atoi(argv[2]) : 1; // default = 1 bool has_constraints = false; // if there are constraints if (argc > 3) has_constraints = strcmp(argv[3],"1") || strcmp(argv[3], "y"); /* if default_constraints_mode is true: * constraints in input mean ONLY THESE MATCH * otherwise: * constraints in input mean ALL EXCEPT THESE MATCH */ bool default_constraints_mode = false; // the semantic of the constraints //if (has_constraints) default_constraints_mode = strcmp(argv[4], "t"); /* (1) read strings, extract sigmas and constraints too */ std::string s1, s2; std::string sigma1(""), sigma2(""); read_stdin(s1, s2); extract_sigma(s1, sigma1); extract_sigma(s2, sigma2); size_t sigma1l = sigma1.size(); size_t sigma2l = sigma2.size(); size_t s1l = s1.size(); size_t s2l = s2.size(); std::vector<p_constr> constraints; if (has_constraints) read_constraints(constraints); /* define the mapping from char -> int */ std::map<char, int> map1; std::map<char, int> map2; define_mapping(sigma1, map1); define_mapping(sigma2, map2); /* integer representations of strings and sigmas */ unsigned* s1i = new unsigned[s1l]; unsigned* s2i = new unsigned[s2l]; unsigned* sigma1i = new unsigned[sigma1l]; unsigned* sigma2i = new unsigned[sigma2l]; for (size_t i = 0; i < sigma1l; ++i) sigma1i[i] = i; // sigma1 for (size_t i = 0; i < sigma2l; ++i) sigma2i[i] = i; // sigma2 for (size_t i = 0; i < s1l; ++i) s1i[i] = map1[s1[i]]; // s1 for (size_t i = 0; i < s2l; ++i) s2i[i] = map2[s2[i]]; // s2 if (_DEBUG) { std::cout << "strings: " << s1 << ", " << s2 << endl; std::cout << "sigmas: " << sigma1 << ", " << sigma2 << endl; std::cout << "int rep (s1): "; for (size_t i = 0; i < s1l; ++i) std::cout << s1i[i]; std::cout << endl; std::cout << "int rep (s2): "; for (size_t i = 0; i < s2l; ++i) std::cout << s2i[i]; std::cout << endl; std::cout << "int rep (sigma1): "; for (size_t i = 0; i < sigma1l; ++i) std::cout << sigma1i[i]; std::cout << endl; std::cout << "int rep (sigma2): "; for (size_t i = 0; i < sigma2l; ++i) std::cout << sigma2i[i]; std::cout << endl; } /* identity (classical) matching schema */ matching_schema<bool> ms(sigma1l, sigma2l, p1, p2, true, default_constraints_mode); ms.set_general(sigma1, sigma2, false); if (has_constraints) ms.set_constraints(map1, map2, constraints, !default_constraints_mode); if (_DEBUG) { if (has_constraints) { std::cout << "Constraints: "; for(std::vector<p_constr>::size_type i = 0; i < constraints.size(); ++i) std::cout << constraints[i].first << ", " << constraints[i].second << endl; } ms.print_matching_schema(sigma1, sigma2); } //int d = bruteforce(s1i, s2i, s1l, s2l, sigma1i, sigma2i, sigma1l, sigma2l, ms); int d = hill_climbing(s1i, s2i, s1l, s2l, sigma1i, sigma2i, sigma1l, sigma2l, p1, ms); std::cout << d << endl; //Alignment<int> a = compute_alignment(s1i, s2i, s1l, s2l, ms); //std::cout << distance_from_alignment(a, sigma1, sigma2, ms, false) << endl; return 0; }
void extract_state_and_sigma(const BeliefT& belief, StateT* output_state, VarianceT* output_sigma) const { extract_state(belief, output_state); extract_sigma(belief, output_sigma); }