std::vector<int> solve() { auto flips = 0; auto start = std::clock(); auto state = initializer_(clauses_, variable_count_); while(!sls::util::is_interrupted() && state.unsat().size() > 0) { state.before_pick(flips); selector_->is_applicable(state); auto pick = selector_->select(state); ++flips; state.after_pick(flips, pick); transitor_(state, pick); state.flush(); } auto end = std::clock(); auto time = static_cast<double>(end - start) / static_cast<double>(CLOCKS_PER_SEC); std::cout << "c " << variable_count_ << "," << clauses_.size() << "," << flips << "," << (!sls::util::is_interrupted() ? time : -1.0) << "," << static_cast<int>(static_cast<double>(flips)/time) << std::endl; std::vector<int> model(variable_count_); for(auto i = 0; i < variable_count_; ++i) model[i] = (i + 1) * (static_cast<int>(state.truth(sat_type::make_variable(i + 1))) * 2 - 1); return model; }
T *Allocate() { Descriptor *descriptor; ScopedLock lock(lock_); if (free_objects_.size() == 0) { descriptor = new Descriptor(); descriptor->data = new T(); all_objects_.insert( PointerToDescriptorMap::value_type(descriptor->data, descriptor)); } else { DescriptorSet::iterator first = free_objects_.begin(); descriptor = *first; free_objects_.erase(first); // TODO: Should we initialize it when returning to the pool instead? initializer_(descriptor->data); } descriptor->used = true; return descriptor->data; }