void test_const_rnd_iterators(const Index& i,int target) { typedef typename Index::const_iterator const_iterator; typedef typename Index::const_reverse_iterator const_reverse_iterator; typedef typename Index::difference_type difference_type; BOOST_TEST(i.cbegin()==i.begin()); BOOST_TEST(i.cend()==i.end()); BOOST_TEST(i.crbegin()==i.rbegin()); BOOST_TEST(i.crend()==i.rend()); const_iterator middle=i.begin()+(i.end()-i.begin())/2; difference_type off=middle-i.begin(); const_reverse_iterator rmiddle=i.rbegin()+off; bool odd=((i.end()-i.begin())%2)!=0; int n=0; for(const_iterator it=i.begin();it!=middle;++it){ BOOST_TEST(i.iterator_to(*it)==it); n+=it->id; n+=it[off].id; } if(odd)n+=(boost::prior(i.end()))->id; int m=0; for(const_reverse_iterator rit=i.rbegin();rit!=rmiddle;++rit){ m+=rit->id; m+=(rit+off)->id; } if(odd)m+=(boost::prior(i.rend()))->id; int p=0; for(const_iterator it2=i.end();it2!=middle;){ --it2; p+=it2->id; p+=(it2-off)->id; } if(odd)p-=middle->id; int q=0; for(const_reverse_iterator rit2=i.rend();rit2!=rmiddle;){ --rit2; q+=rit2->id; q+=(rit2-off)->id; } if(odd)q-=rmiddle->id; BOOST_TEST(n==target&&n==m&&n==p&&n==q); }
void py_add_bud(size_t pid, const Index& attractors, real_t level){ add_bud(pid, AttractorList(attractors.begin(),attractors.end()),level); }
void build_index(void) { IndexSort _sort(distances); std::sort<Index::iterator,IndexSort>(index.begin(), index.end(), _sort); }
// infer until fixpoint, which may not be appropriate in the presence of retraction void infer(vector<Rule> &rules) { bool changed = true; map<constint_t, size_t> sizes; map<constint_t, Index>::const_iterator atomit = atoms.begin(); for (; atomit != atoms.end(); ++atomit) { sizes[atomit->first] = atomit->second.size(); } size_t ncycles = 0; while (changed) { cerr << " Cycle " << ++ncycles << "..." << endl; changed = false; #ifndef ANY_ORDER Index assertions (Order(0, 1, 2)); Index retractions (Order(0, 1, 2)); #endif int rulecount = 0; vector<Rule>::iterator rule = rules.begin(); for (; rule != rules.end(); ++rule) { cerr << " Rule " << (rule - rules.begin()) + 1 << "..." << endl; #ifdef ANY_ORDER Index assertions (Order(0, 1, 2)); Index retractions (Order(0, 1, 2)); #endif Relation results; set<varint_t> allvars; query(rule->condition, allvars, results); act(rule->action_block, results, assertions, retractions); #ifndef ANY_ORDER } #endif size_t nretractions = 0; Index::iterator it = retractions.begin(); for (; it != retractions.end(); ++it) { if (idxspo.erase(*it) > 0) { idxpos.erase(*it); idxosp.erase(*it); changed = true; ++nretractions; } } cerr << " " << nretractions << " retractions, "; size_t nassertions = 0; it = assertions.begin(); for (; it != assertions.end(); ++it) { if (idxspo.insert(*it).second) { idxpos.insert(*it); idxosp.insert(*it); changed = true; ++nassertions; } } cerr << nassertions << " assertions." << endl; #ifdef ANY_ORDER } #endif atomit = atoms.begin(); for (; atomit != atoms.end(); ++atomit) { changed = changed || sizes[atomit->first] != atomit->second.size(); sizes[atomit->first] = atomit->second.size(); } }