apgsearch v4.0

For general discussion about Conway's Game of Life.
User avatar
Saka
Posts: 3627
Joined: June 19th, 2015, 8:50 pm
Location: Indonesia
Contact:

Re: apgsearch v4.0

Post by Saka » August 23rd, 2017, 8:52 am

please Calcyman,
Update the seperation

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » August 23rd, 2017, 9:36 am

Saka wrote:please Calcyman,
Update the seperation [sic]
Fixed in the latest version of lifelib (ll1.12) for oscillators in LtL rules.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
gmc_nxtman
Posts: 1150
Joined: May 26th, 2015, 7:20 pm

Re: apgsearch v4.0

Post by gmc_nxtman » August 23rd, 2017, 9:44 am

calcyman wrote:Amended (run './recompile.sh --update').
Apologies for dumping more code into this thread, but this happened. This is only a small portion of the errors as it goes over the 60k character limit.

Code: Select all

#C everything else up to this point compiled successfully...

gcc  main.o includes/sha256.o includes/md5.o includes/happyhttp.o -o apgmera
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from:
      apg::rule2int(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::comprep(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      authenticate(char const*, char const*) in main.o
      apg::hashsoup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, ...ng<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      apg::lifetree_abstract<unsigned int>::advance(apg::hypernode<unsigned int>, unsigned long long, unsigned long long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      ...
 ...
      void std::__1::vector<apg::VTile28*, std::__1::allocator<apg::VTile28*> >::__push_back_slow_path<apg::VTile28*>(apg::VTile28*&&) in main.o
      std::__1::vector<apg::bitworld, std::__1::allocator<apg::bitworld> >::vector(unsigned long) in main.o
      std::__1::enable_if<(__is_forward_iterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>::value) && (is_constructible<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::iterator_traits<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>::reference>::value), void>::type std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::assign<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in main.o
      std::__1::vector<apg::bitworld, std::__1::allocator<apg::bitworld> >::vector(std::__1::vector<apg::bitworld, std::__1::allocator<apg::bitworld> > const&) in main.o
...
      ...
  "std::__1::__next_prime(unsigned long)", referenced from:
      std::__1::__hash_table<std::__1::__hash_value_type<unsigned long long, apg::VTile28>, std::__1::__unordered_map_hasher<unsigned long long, std::__1::__hash_value_type<unsigned long long, apg::VTile28>, std::__1::hash<unsigned long long>, true>, std::__1::__unordered_map_equal<unsigned long long, std::__1::__hash_value_type<unsigned long long, apg::VTile28>, std::__1::equal_to<unsigned long long>, true>, std::__1::allocator<std::__1::__hash_value_type<unsigned long long, apg::VTile28> > >::rehash(unsigned long) in main.o
...std::__1::allocator<char> > > > >, std::__1::__unordered_map_hasher<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::__unordered_map_equal<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > > >::rehash(unsigned long) in main.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, ...
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in main.o
      apg::base_classifier<1>::base_classifier(apg::lifetree_abstract<unsigned int>*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in md5.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*)", referenced from:
...
      _main in main.o
      apg::lifetree<unsigned int, 2>::string_recurse(apg::hypernode<unsigned int>) in main.o
      apg::lifetree<unsigned int, 1>::string_recurse(apg::hypernode<unsigned int>) in main.o
      apg::base_classifier<1>::base_classifier(apg::lifetree_abstract<unsigned int>*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      happyhttp::Response::ProcessHeaderLine(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in happyhttp.o
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::resize(unsigned long, char)", referenced from:
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.o
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in main.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::replace(unsigned long, unsigned long, char const*, unsigned long)", referenced from:
      apg::replace(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::reserve(unsigned long)", referenced from:
      apg::bitworld::canonise_orientation(int, int, int, int, int, int, int, int) in main.o
      apg::wechslerise(std::__1::vector<apg::bitworld, std::__1::allocator<apg::bitworld> >&, long long*) in main.o
      apg::sanirule(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::pattern::operator=(apg::pattern const&) in main.o
      classifyAperiodic(apg::pattern) in main.o
      _main in main.o
      apg::pattern::pattern(apg::pattern const&) in main.o
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::push_back(char)", referenced from:
      apg::bitworld::canonise_orientation(int, int, int, int, int, int, int, int) in main.o
 ...tor<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, std::__1::allocator<char> const&)", referenced from:
      apg::bitworld::canonise_orientation(int, int, int, int, int, int, int, int) in main.o
      apg::sanirule(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::lifetree_abstract<unsigned int>::advance(apg::hypernode<unsigned int>, unsigned long long, unsigned long long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::lifetree<unsigned int, 2>::read_macrocell(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in main.o
      apg::lifetree<unsigned int, 2>::invstring_recurse(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, unsigned long long&) in main.o
     r, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::sanirule(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      apg::pattern::disjunction(apg::pattern const&) in main.o
      apg::pattern::minus(apg::pattern const&) in main.o
      apg::pattern::conjunction(apg::pattern const&) in main.o
      apg::pattern::exclusive_disjunction(apg::pattern const&) in main.o
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.o
      apg::pattern::shift(long long, long long) in main.o
      apg::pattern::advance(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned long long) in main.o
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(char)", referenced from:
      apg::lifetree<unsigned int, 2>::string_recurse(apg::hypernode<unsigned int>) in main.o
      apg::lifetree<unsigned int, 1>::string_recurse(apg::hypernode<unsigned int>) in main.o
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_istream<char, std::__1::char_traits<char> >&, bool)", referenced from:
      std::__1::basic_istream<char, std::__1::char_traits<char> >& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in main.o
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::operator>>(unsigned int&)", referenced from:
      apg::lifetree<unsigned int, 2>::read_macrocell(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in main.o
      apg::lifetree<unsigned int, 1>::read_macrocell(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in main.o
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::operator>>(unsigned long long&)", referenced from:
      apg::lifetree<unsigned int, 2>::read_macrocell(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in main.o
      apg::lifetree<unsigned int, 1>::read_macrocell(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      stabilise3(apg::upattern<apg::VTile28, 28>&) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      stabilise3(apg::upattern<apg::VTile28, 28>&) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in md5.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in md5.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      authenticate(char const*, char const*) in main.o
      std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_ostringstream() in main.o
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      linearlyse(apg::pattern, int, int) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      ...
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(int)", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      linearlyse(apg::pattern, int, int) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(unsigned int)", referenced from:
      apg::lifetree<unsigned int, 2>::write_macrocell_recurse(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, apg::hypernode<unsigned int>, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::map<std::__1::pair<unsigned int, unsigned int>, unsigned long long, std::__1::less<std::__1::pair<unsigned int, unsigned int> >, std::__1::allocator<std::__1::pair<std::__1::pair<unsigned int, unsigned int> const, unsigned long long> > >*, unsigned long long&) in main.o
      apg::lifetree<unsigned int, 1>::write_macrocell_recurse(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, apg::hypernode<unsigned int>, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::map<std::__1::pair<unsigned int, unsigned int>, unsigned long long, std::__1::less<std::__1::pair<unsigned int, unsigned int> >, std::__1::allocator<std::__1::pair<std::__1::pair<unsigned int, unsigned int> const, unsigned long long> > >*, unsigned long long&) in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(long)", referenced from:
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(unsigned long)", referenced from:
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(long long)", referenced from:
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(unsigned long long)", referenced from:
      apg::lifetree_abstract<unsigned int>::advance(apg::hypernode<unsigned int>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned long long, unsigned long long) in main.o
      apg::pattern::apgcode() in main.o
      apg::lifetree<unsigned int, 2>::write_macrocell_recurse(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, apg::hypernode<unsigned int>, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::map<std::__1::pair<unsigned int, unsigned int>, unsigned long long, std::__1::less<std::__1::pair<unsigned int, unsigned int> >, std::__1::allocator<std::__1::pair<std::__1::pair<unsigned int, unsigned int> const, unsigned long long> > >*, unsigned long long&) in main.o
      apg::lifetree<unsigned int, 1>::write_macrocell_recurse(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, apg::hypernode<unsigned int>, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::map<std::__1::pair<unsigned int, unsigned int>, unsigned long long, std::__1::less<std::__1::pair<unsigned int, unsigned int> >, std::__1::allocator<std::__1::pair<std::__1::pair<unsigned int, unsigned int> const, unsigned long long> > >*, unsigned long long&) in main.o
  "std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      ProcessedResponse::ProcessedResponse() in main.o
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in main.o
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in main.o
      ...
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::sync()", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::imbue(std::__1::locale const&)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::uflow()", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      vtable for std::__1::basic_filebuf<char, std::__1::char_traits<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::setbuf(char*, long)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::xsgetn(char*, long)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      vtable for std::__1::basic_filebuf<char, std::__1::char_traits<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::xsputn(char const*, long)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      vtable for std::__1::basic_filebuf<char, std::__1::char_traits<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::showmanyc()", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      vtable for std::__1::basic_filebuf<char, std::__1::char_traits<char> > in main.o
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::basic_streambuf()", referenced from:
      authenticate(char const*, char const*) in main.o
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      linearlyse(apg::pattern, int, int) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::~basic_streambuf()", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in main.o
      std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_ostringstream() in main.o
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      linearlyse(apg::pattern, int, int) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      ...
  "std::__1::cerr", referenced from:
      apg::lifetree_abstract<unsigned int>::advance(apg::hypernode<unsigned int>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned long long, unsigned long long) in main.o
      apg::base_classifier<1>::pbbosc(apg::pattern, unsigned long long, unsigned long long) in main.o
      apg::lifetree<unsigned int, 2>::_string32(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::lifetree<unsigned int, 2>::read_macrocell(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::map<unsigned long long, unsigned long long, std::__1::less<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, unsigned long long> > >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in main.o
      apg::kivtable<apg::nicearray<unsigned long long, 8>, unsigned int, apg::lifemeta<unsigned int> >::getfreenode() in main.o
      apg::kivtable<apg::nicearray<unsigned long long, 8>, unsigned int, apg::lifemeta<unsigned int> >::resize_hash(unsigned long long) in main.o
      apg::kivtable<apg::nicearray<unsigned int, 4>, unsigned int, apg::lifemeta<unsigned int> >::init(unsigned long long) in main.o
      ...
  "std::__1::cout", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      stabilise3(apg::upattern<apg::VTile28, 28>&) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::ctype<char>::id", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      stabilise3(apg::upattern<apg::VTile28, 28>&) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::locale::locale(std::__1::locale const&)", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf() in main.o
  "std::__1::locale::~locale()", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      stabilise3(apg::upattern<apg::VTile28, 28>&) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::codecvt<char, char, __mbstate_t>::id", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::imbue(std::__1::locale const&) in main.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_istream<char, std::__1::char_traits<char> >& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in md5.o
  "std::__1::ios_base::init(void*)", referenced from:
      authenticate(char const*, char const*) in main.o
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      linearlyse(apg::pattern, int, int) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      verifySearch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      runSearch(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, bool) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      ...
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_istream<char, std::__1::char_traits<char> >& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in main.o
      SoupSearcher::submitResults(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long long, int, bool) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in md5.o
  "std::__1::basic_ios<char, std::__1::char_traits<char> >::~basic_ios()", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      authenticate(char const*, char const*) in main.o
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in main.o
      std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_ostringstream() in main.o
      reseed(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      linearlyse(apg::pattern, int, int) in main.o
      obtainWork(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      ...
  "std::bad_cast::bad_cast()", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::sync() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::underflow() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::overflow(int) in main.o
  "std::bad_cast::~bad_cast()", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::sync() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::underflow() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::overflow(int) in main.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in main.o
      ___clang_call_terminate in md5.o
      ___clang_call_terminate in happyhttp.o
  "typeinfo for std::__1::basic_istream<char, std::__1::char_traits<char> >", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "typeinfo for std::__1::basic_ostream<char, std::__1::char_traits<char> >", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      typeinfo for std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
      typeinfo for std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
  "typeinfo for std::__1::basic_iostream<char, std::__1::char_traits<char> >", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "typeinfo for std::__1::basic_streambuf<char, std::__1::char_traits<char> >", referenced from:
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      typeinfo for std::__1::basic_filebuf<char, std::__1::char_traits<char> > in main.o
  "typeinfo for std::bad_cast", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::sync() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::underflow() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::overflow(int) in main.o
  "vtable for __cxxabiv1::__class_type_info", referenced from:
      typeinfo for happyhttp::Wobbly in main.o
      typeinfo for apg::lifetree_abstract<unsigned int> in main.o
      typeinfo for happyhttp::Wobbly in happyhttp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for __cxxabiv1::__si_class_type_info", referenced from:
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      typeinfo for std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      typeinfo for apg::lifetree<unsigned int, 2> in main.o
      typeinfo for apg::lifetree<unsigned int, 1> in main.o
      typeinfo for std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
      typeinfo for std::__1::basic_filebuf<char, std::__1::char_traits<char> > in main.o
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "non-virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "non-virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "virtual thunk to std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "virtual thunk to std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "virtual thunk to std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
  "virtual thunk to std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_ofstream<char, std::__1::char_traits<char> > in main.o
  "virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in main.o
  "operator delete[](void*)", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::imbue(std::__1::locale const&) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::setbuf(char*, long) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf() in main.o
  "operator delete(void*)", referenced from:
      apg::rle2vec(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::_shift_left(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_right(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_down(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_up(apg::bitworld const&, unsigned int) in main.o
      apg::bitworld::getbbox(long long*) in main.o
      apg::bitworld::population() in main.o
      ...
  "operator new[](unsigned long)", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::imbue(std::__1::locale const&) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::setbuf(char*, long) in main.o
  "operator new(unsigned long)", referenced from:
      apg::bitworld::setcell(unsigned long long, unsigned long long, bool) in main.o
      apg::_shift_left(apg::bitworld const&, unsigned int) in main.o
      std::__1::map<std::__1::pair<int, int>, unsigned long long, std::__1::less<std::__1::pair<int, int> >, std::__1::allocator<std::__1::pair<std::__1::pair<int, int> const, unsigned long long> > >::operator[](std::__1::pair<int, int> const&) in main.o
      apg::_shift_right(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_down(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_up(apg::bitworld const&, unsigned int) in main.o
      apg::bleed(apg::bitworld const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      ...
  "___cxa_allocate_exception", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::sync() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::underflow() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::overflow(int) in main.o
      happyhttp::BailOnSocketError(char const*) in happyhttp.o
      happyhttp::Connection::connect() in happyhttp.o
      happyhttp::Connection::putrequest(char const*, char const*) in happyhttp.o
      ...
  "___cxa_begin_catch", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      ___clang_call_terminate in main.o
      std::__1::basic_istream<char, std::__1::char_traits<char> >& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in main.o
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf() in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in md5.o
      ...
  "___cxa_end_catch", referenced from:
      catagolueRequest(char const*, char const*) in main.o
      std::__1::basic_istream<char, std::__1::char_traits<char> >& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_istream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in main.o
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf() in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.o
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in md5.o
  "___cxa_throw", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::sync() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::underflow() in main.o
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::overflow(int) in main.o
      happyhttp::BailOnSocketError(char const*) in happyhttp.o
      happyhttp::Connection::connect() in happyhttp.o
      happyhttp::Connection::putrequest(char const*, char const*) in happyhttp.o
      ...
  "___gxx_personality_v0", referenced from:
      apg::rle2vec(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::_shift_left(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_right(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_down(apg::bitworld const&, unsigned int) in main.o
      apg::_shift_up(apg::bitworld const&, unsigned int) in main.o
      apg::bleed(apg::bitworld const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
      apg::shift_bitworld(apg::bitworld const&, long long, long long) in main.o
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [apgmera] Error 1
If necessary, I'll add an attachment containing the whole thing, but it's probably a simple fix again. The important part(s) seem to be this:

Code: Select all

Undefined symbols for architecture x86_64:
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [apgmera] Error 1

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » August 23rd, 2017, 9:53 am

gmc_nxtman wrote:
calcyman wrote:Amended (run './recompile.sh --update').
Apologies for dumping more code into this thread, but this happened. This is only a small portion of the errors as it goes over the 60k character limit.
Why are you trying to link using gcc instead of g++? The top line of the makefile should say g++, and it should be invoked at every step of the compilation (including linkage).
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
gmc_nxtman
Posts: 1150
Joined: May 26th, 2015, 7:20 pm

Re: apgsearch v4.0

Post by gmc_nxtman » August 23rd, 2017, 7:50 pm

Because I'm a complete noob with anything related to compilation/installation. (This has been and will be demonstrated many times during my time on conwaylife.com forums)

I tried a fresh install of both gcc and OpenMPI and replaced "g++" at the beginning of the makefile with "g++-7.1.0" (my version) as implied in the readme but the makefile doesn't seem to find that:

Code: Select all

$ ./recompile.sh --fopenmp
Skipping updates; use --update to update apgmera automatically.
Ensuring lifelib is up-to-date...
Rule unspecified; assuming b3s23.
Symmetry unspecified; assuming C1.
Configuring rule b3s23; symmetry C1
Valid rulestring: b3s23
Rule integer:     6152
Rule circuit:     [-131-124-450-014-672]
Rule integer:     6152
Rule circuit:     [-131-124-450-014-672]
Rule integer:     6152
Rule circuit:     [-131-124-450-014-672]
Valid symmetry: C1
Success!
g++-7.1.0 -c -Wall -O3 -march=native --std=c++11 main.cpp -o main.o
make: g++-7.1.0: No such file or directory
make: *** [main.o] Error 1

User avatar
dvgrn
Moderator
Posts: 10612
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI
Contact:

Re: apgsearch v4.0

Post by dvgrn » August 23rd, 2017, 9:50 pm

gmc_nxtman wrote:I tried a fresh install of both gcc and OpenMPI and replaced "g++" at the beginning of the makefile with "g++-7.1.0" (my version) as implied in the readme but the makefile doesn't seem to find that...
Did you try not editing the plain "g++" in the makefile? I haven't looked for the readme, but it doesn't seem like it would be normal to have to call a compiler by a different name every time you upgrade +.0.0.1. And that minus sign in front of the 7 seems unusual too.

Not that I'm saying I know anything, mind you. I still haven't built 4.0 myself.

User avatar
gmc_nxtman
Posts: 1150
Joined: May 26th, 2015, 7:20 pm

Re: apgsearch v4.0

Post by gmc_nxtman » August 23rd, 2017, 10:23 pm

dvgrn wrote:Did you try not editing the plain "g++" in the makefile? I haven't looked for the readme, but it doesn't seem like it would be normal to have to call a compiler by a different name every time you upgrade +.0.0.1. And that minus sign in front of the 7 seems unusual too.
I tried that before and it simply doesn't compile with OpenMP:

Code: Select all

Warning: apgluxe has not been compiled with OpenMP support.

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » August 24th, 2017, 12:59 am

gmc_nxtman wrote:Because I'm a complete noob with anything related to compilation/installation. (This has been and will be demonstrated many times during my time on conwaylife.com forums)
In that case, it's probably easier to leave the OpenMP support out of apgluxe, and run multiple instances whenever you want to use multiple cores.
I tried a fresh install of both gcc and OpenMPI and replaced "g++" at the beginning of the makefile with "g++-7.1.0" (my version) as implied in the readme but the makefile doesn't seem to find that:
You'll need to add the directory containing g++-7.1.0 to your $PATH environment variable. Or alternatively include the fully qualified path at the top of the file, e.g.: CC='/full/path/to/executable/g++-7.1.0'
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
Apple Bottom
Posts: 1034
Joined: July 27th, 2015, 2:06 pm
Contact:

Re: apgsearch v4.0

Post by Apple Bottom » August 24th, 2017, 6:01 am

Something weird's going on with chaotic growth pattern detection -- two zz_REPLICATORs showed up in 2x128, supposedly in the following soups:

Code: Select all

x = 128, y = 2, rule = B3/S23
bobobbobbbbbobobboobobbooboooboooboboooobobooobobbobobboooooooobobbbbobooooobbboobboobobboobobbboboboboobbobbbooobbbooooobbbbbob$
oooooooboobobbbbobobboooboobbbbboobbbbbooboboooooooobbboobbboboboobbobooboobbooobbbbobobboboobboobobbbobobbbbbboooobobooobooobbb!

Code: Select all

x = 128, y = 2, rule = B3/S23
boobooobbobooobboobbobboobbbbboooboooobbbbbbbbobbobooobobbbobobobbbobobbobbbbobobooobbbbbobbbbbbbbbbbbbbbooboobboboobbbooobobobb$
bbobbobbbbbooobooboobbobbbbobbobbobbooboooobboboobbbbbbboooooooobbobbooboobobobobooobboboboobobbooobboobobooobobbooooooobbbboobo!
There's also a PATHOLOGICAL:

Code: Select all

x = 128, y = 2, rule = B3/S23
bobbobbbbboboobobooooboobbooboboobobboobbboooooobbooobbboboobbobbbobbbbobobbbbbbboobobooobobobbboooobobobbobboooobobbobbbbboobbo$
oobobbooooobbobobbbobbobooobbboooboooboobobobobbooobobbboobooooobbbboooobbbbooooobbooobobobbbobbbbobbobboobobbbboboobobbbooboobo!
None of these appear to be what apgluxe thinks they are.
If you speak, your speech must be better than your silence would have been. — Arabian proverb

Catagolue: Apple Bottom • Life Wiki: Apple Bottom • Twitter: @_AppleBottom_

Proud member of the Pattern Raiders!

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » August 24th, 2017, 7:04 am

Apple Bottom wrote:Something weird's going on with chaotic growth pattern detection -- two zz_REPLICATORs showed up in 2x128, supposedly in the following soups:
None of these appear to be what apgluxe thinks they are.
Whoops. This is what happens when you write:

Code: Select all

pat.advance(10000, 0, 0);
when you actually meant:

Code: Select all

pat.advance(0, 0, 10000);
Fixed in version v4.13; please upgrade immediately.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
Apple Bottom
Posts: 1034
Joined: July 27th, 2015, 2:06 pm
Contact:

Re: apgsearch v4.0

Post by Apple Bottom » August 24th, 2017, 9:32 am

calcyman wrote:Fixed in version v4.13; please upgrade immediately.
Done, thanks for the quick fix!
If you speak, your speech must be better than your silence would have been. — Arabian proverb

Catagolue: Apple Bottom • Life Wiki: Apple Bottom • Twitter: @_AppleBottom_

Proud member of the Pattern Raiders!

User avatar
muzik
Posts: 5614
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: apgsearch v4.0

Post by muzik » August 24th, 2017, 3:23 pm

Could apgsearch be made able to search certain explosive rules, maybe by deleting patterns that exceed a certain bounding box or ignoring soups that last more than a set amount of generations?

User avatar
Apple Bottom
Posts: 1034
Joined: July 27th, 2015, 2:06 pm
Contact:

Re: apgsearch v4.0

Post by Apple Bottom » August 25th, 2017, 7:00 am

Calcyman recently asked people to not submit hauls too often so in order to ease the load on Catagolue. In order to make it easier to spin up searchers and shut them down gracefully without losing hours' worth of results, I've ported the "allow-the-user-to-hit-q-to-stop-searching-and-submit-partial-results" patch to apgluxe:

Code: Select all

diff -ru apgmera/includes/searching.h allowquit-7a75/includes/searching.h
--- apgmera/includes/searching.h	2017-08-20 22:14:28.002363900 +0200
+++ allowquit-7a75/includes/searching.h	2017-08-23 22:08:40.334331800 +0200
@@ -1,8 +1,27 @@
+#include <stdio.h>
+#include <sys/select.h>
+
+// determine whether there's a keystroke waiting
+int keyWaiting() {
+    struct timeval tv;
+    fd_set fds;
+
+    tv.tv_sec = 0;
+    tv.tv_usec = 0;
+
+    FD_ZERO(&fds);
+    FD_SET(STDIN_FILENO, &fds); // STDIN_FILENO is 0
+
+    select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
+
+    return FD_ISSET(STDIN_FILENO, &fds);
+}
+
 #pragma once
 
 #ifdef USE_OPEN_MP
 
-void parallelSearch(int n, int m, std::string payoshaKey, std::string seed, int local_log) {
+bool parallelSearch(int n, int m, std::string payoshaKey, std::string seed, int local_log) {
 
     SoupSearcher globalSoup;
 
@@ -54,12 +73,14 @@
         }
         std::cout << "----------------------------------------------------------------------" << std::endl;
     }
+    
+    return false;
 
 }
 
 #endif
 
-void runSearch(int n, std::string payoshaKey, std::string seed, int local_log, bool testing) {
+bool runSearch(int n, std::string payoshaKey, std::string seed, int local_log, bool testing) {
 
     SoupSearcher soup;
     apg::lifetree<uint32_t, BITPLANES> lt(400);
@@ -73,8 +94,9 @@
     int64_t lasti = 0;
 
     bool finishedSearch = false;
+    bool quitByUser = false;
 
-    while (finishedSearch == false) {
+    while ((finishedSearch == false) && (quitByUser == false)) {
 
         std::ostringstream ss;
         ss << i;
@@ -89,9 +111,16 @@
             std::cout << i << " soups completed (" << ((int) ((i - lasti) / elapsed)) << " soups per second)." << std::endl;
             lasti = i;
             start = clock();
+
+            if(keyWaiting()) {
+                char c = fgetc(stdin);
+                if ((c == 'q') || (c == 'Q'))
+                    quitByUser = true;
+            }
+            
         }
 
-        if (i % n == 0) {
+        if ((i % n == 0) || quitByUser) {
             std::cout << "----------------------------------------------------------------------" << std::endl;
             std::cout << i << " soups completed." << std::endl;
             std::cout << "Attempting to contact payosha256." << std::endl;
@@ -108,6 +137,8 @@
         }
 
     }
+    
+    return quitByUser;
 
 }
 
diff -ru apgmera/main.cpp allowquit-7a75/main.cpp
--- apgmera/main.cpp	2017-08-23 20:30:17.385160100 +0200
+++ allowquit-7a75/main.cpp	2017-08-24 11:49:32.570166800 +0200
@@ -7,6 +7,7 @@
 #include <ctime>
 #include <cmath>
 #include <unistd.h>
+#include <termios.h>
 
 #ifdef USE_OPEN_MP
 #include <omp.h>
@@ -41,7 +42,9 @@
     int local_log = 0;
     bool testing = false;
     int nullargs = 1;
-
+    bool quitByUser = false;
+    struct termios ttystate;
+    
     // Extract options:
     for (int i = 1; i < argc - 1; i++) {
         if (strcmp(argv[i], "-k") == 0) {
@@ -95,6 +98,12 @@
     if (verifications < 0) {
         verifications = (parallelisation <= 4) ? 3 : 0;
     }
+    
+    // turn on non-blocking reads
+    tcgetattr(STDIN_FILENO, &ttystate);
+    ttystate.c_lflag &= ~ICANON;
+    ttystate.c_cc[VMIN] = 1;
+    tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
 
     std::cout << "\nGreetings, this is \033[1;33mapgluxe " << APG_VERSION;
     std::cout << "\033[0m, configured for \033[1;34m" << RULESTRING << "/";
@@ -106,7 +115,7 @@
 
     std::cout << std::endl;
 
-    while (true) {
+    while (!quitByUser) {
         if (verifications > 0) {
             std::cout << "Peer-reviewing hauls:\n" << std::endl;
             // Verify some hauls:
@@ -120,17 +129,22 @@
         std::cout << "Using seed " << seed << std::endl;
         if (parallelisation > 0) {
             #ifdef USE_OPEN_MP
-            parallelSearch(soups_per_haul, parallelisation, payoshaKey, seed, local_log);
+            quitByUser = parallelSearch(soups_per_haul, parallelisation, payoshaKey, seed, local_log);
             #else
-            runSearch(soups_per_haul, payoshaKey, seed, local_log, false);
+            quitByUser = runSearch(soups_per_haul, payoshaKey, seed, local_log, false);
             #endif
         } else {
-            runSearch(soups_per_haul, payoshaKey, seed, local_log, testing);
+            quitByUser = runSearch(soups_per_haul, payoshaKey, seed, local_log, testing);
         }
         seed = reseed(seed);
 
         if (testing) { break; }
     }
 
-    return 0;
+    // turn on blocking reads
+    tcgetattr(STDIN_FILENO, &ttystate);
+    ttystate.c_lflag |= ICANON;
+    tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
+
+    return quitByUser ? 1 : 0;
 }
Apply this the usual way:

Code: Select all

$ cd apgmera
$ patch -p1 <../apgluxe-7a75-allowquit.patch
patching file includes/searching.h
patching file main.cpp
$ 
and then use recompile.sh as usual. Automatic updates to lifelib should not be affected, though you may get conflicts if pulling in a newer version of apgluxe itself from git, so I recommend keeping a "clean" copy checked out and working with a copy (use e.g. `cp -a´).

With the patched version, when you hit q, apgluxe will submit partial results and stop searching, the same way that apgsearch 1.x does. (This only applies to regular searches, not parallel searches using OpenMP, on the assumption that if you use OpenMP rather than running individual searcher instances you won't care so much about being able to adjust the number of active searchers anyway.) If the submission fails, it will quit anyway, so you will lose your results. Occasionally hitting q doesn't work, I have no idea why (non-blocking terminal input is a bit of a thorny issue anyway, and C++, by default, provides no means to do this at all).

But most of the time it works as intended, so you can safely increase your haul sizes (and go easier on Catagolue in the process!) and run as many searchers as your computer has (hyperthreading) cores -- and if you need a core or two for something else, you can shut down searcher instances immediately without losing any of the work they've accumulated.
If you speak, your speech must be better than your silence would have been. — Arabian proverb

Catagolue: Apple Bottom • Life Wiki: Apple Bottom • Twitter: @_AppleBottom_

Proud member of the Pattern Raiders!

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » August 25th, 2017, 7:41 am

Apple Bottom wrote:Calcyman recently asked people to not submit hauls too often so in order to ease the load on Catagolue. In order to make it easier to spin up searchers and shut them down gracefully without losing hours' worth of results, I've ported the "allow-the-user-to-hit-q-to-stop-searching-and-submit-partial-results" patch to apgluxe:
Thank you very much! Tested on Linux and committed to the repository:

https://gitlab.com/apgoucher/apgmera/co ... 9a3aeecefe

Can someone verify that this works correctly on Mac OS X?
muzik wrote:Could apgsearch be made able to search certain explosive rules, maybe by deleting patterns that exceed a certain bounding box or ignoring soups that last more than a set amount of generations?
I intend to add support for power-of-two torus sizes in the future, which will allow searching rules such as B37/S23. This will require quite a few significant changes to lifelib, though, to allow toroidal patterns.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
muzik
Posts: 5614
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: apgsearch v4.0

Post by muzik » August 25th, 2017, 9:25 am

Minor, extremely insignificant issue that doesn't really affect anything: pressing q still returns the "Connection was successful; starting new search..." message, where it would make a lot more sense for it to say something along the lines of "Connection was successful; stopping search...".
calcyman wrote:
muzik wrote:Could apgsearch be made able to search certain explosive rules, maybe by deleting patterns that exceed a certain bounding box or ignoring soups that last more than a set amount of generations?
I intend to add support for power-of-two torus sizes in the future, which will allow searching rules such as B37/S23. This will require quite a few significant changes to lifelib, though, to allow toroidal patterns.
There's a few different types of explosions, though. Imagine I wanted to search for this legendary beast:

Code: Select all

x = 12, y = 14, rule = B3457/S4568
4bo2bo$4b4o$2b8o$2b2ob2ob2o$obobo2bobobo$2ob6ob2o$ob3o2b3obo$3ob4ob3o$
2ob6ob2o$b3o4b3o$b3o4b3o$3b2o2b2o$3bo4bo$5b2o!
Let's say that a future version of apgsearch has the ability to search a new type of symmetry, which resembles two 1x256 soups stacked on top of each other to form a D2_+2 symmetric pattern.

Code: Select all

x = 255, y = 2, rule = B3457/S4568
o2bo2b2o3b8o2bobob2ob4obobob5ob6o3b3o4b3o3b2ob2obobo3bob3obo3b3o2bo4b
4ob3obo2b4o2bo2b2ob2ob3o3bob2ob3ob2obobob2ob2obobob3o2b2o4b6o2b3ob2o4b
o2b4ob5o2b3o2b2ob2o4b4obo4bo3b6ob2ob4o2b2ob2obobobo$o2bo2b2o3b8o2bobob
2ob4obobob5ob6o3b3o4b3o3b2ob2obobo3bob3obo3b3o2bo4b4ob3obo2b4o2bo2b2ob
2ob3o3bob2ob3ob2obobob2ob2obobob3o2b2o4b6o2b3ob2o4bo2b4ob5o2b3o2b2ob2o
4b4obo4bo3b6ob2ob4o2b2ob2obobobo!
Note how an explosive pattern pops up on the left. What I'm thinking is that this object would be recognised as oscillating with a higher period than, say, 10000, and would be automatically deleted from the plane. Searching for the c/5648 spaceship on a torus would be fairly problematic, since large random soups tend to give way to large masses of chaos, and even if this symmetry could be searched on a torus, the ship would likely crash into another object and explode (granted this would also be fairly likely on an infinite plane, but if the search took place on a torus this would mean that absolutely no other objects must be there at all, whilst on an infinite plane it can just escape off the edge).

Would searching a rule in this way be plausible at all?

User avatar
Apple Bottom
Posts: 1034
Joined: July 27th, 2015, 2:06 pm
Contact:

Re: apgsearch v4.0

Post by Apple Bottom » August 26th, 2017, 6:29 am

muzik wrote:Minor, extremely insignificant issue that doesn't really affect anything: pressing q still returns the "Connection was successful; starting new search..." message, where it would make a lot more sense for it to say something along the lines of "Connection was successful; stopping search...".
True, that's a bit confusing. Just a cosmetic issue, though.

I've actually been thinking it would be nice to implement both "q" (lower-case) for "attempt to submit partial haul and quit, but continue searching if not successful", and "Q" (upper-case) for "attempt to submit partial haul, then quit no matter what" (the current behavior).

This would be useful for when your Internet connection is unstable, and quitting isn't all that urgent -- you could then just keep on hitting "q" until the submission succeeds. If you needed to quit RIGHT NOW, there'd still be "Q" (or Ctrl-C).

Now, this said--

Two questions.

One -- since apgluxe supports pluggable backends, is there a way to ask it to use a different backend? The reason I'm asking is that searching some (?) higher symmetries of B3/S23 is quite a bit slower compared to 3.x (e.g. D8_1 gets ~2.5k soups/sec in 4.14-ll1.12, compared to ~6.2k in 3.28), and I'm wondering why, or whether there's anything I can do to speed it up.

Two -- apgluxe also occasionally produces messages such as the following:
apgluxe wrote: xs120_y2gg39e0e93ggzo80g6kk303303303kk6g08ozol5d0ddy5dd0d5lozy0319e0mm0mm0e913zy46430346 would take infeasibly long to brute-force separate.
Should I be concerned? ;) (Also, looking at lifelib, this is produced by a routine checking whether an oscillator is a pseudo-oscillator. Should this even be called for still lifes? I suppose they are technically period-1 oscillators...!)
If you speak, your speech must be better than your silence would have been. — Arabian proverb

Catagolue: Apple Bottom • Life Wiki: Apple Bottom • Twitter: @_AppleBottom_

Proud member of the Pattern Raiders!

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » August 26th, 2017, 10:02 am

The reason for 3.x being faster is the object detection code; v4.x is genuinely faster at running patterns (I think by about 8% on Lidka). I'm ruminating over how to accelerate object clustering, but haven't yet implemented it.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
muzik
Posts: 5614
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: apgsearch v4.0

Post by muzik » August 27th, 2017, 8:01 am

So does this mean that 4.x is faster at searching b3s23/C1 overall?

User avatar
muzik
Posts: 5614
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: apgsearch v4.0

Post by muzik » August 31st, 2017, 7:24 pm

Possible pseudosymmetry suggestion: "inflated" soups, where each cell takes up a 2x2 space.

Code: Select all

x = 75, y = 32, rule = B3/S5
o5b4o2bo30b2o10b8o4b2o$o3bo9b2o27b2o10b8o4b2o$o4b3o4b2obo27b2o6b2o18b
4o$2bo2b2o2bo2b4o27b2o6b2o18b4o$obobo2b2o3bo2bo27b2o8b6o8b4o2b2o$3obob
2ob5o29b2o8b6o8b4o2b2o$3bobo9bo31b2o4b4o4b2o4b8o$o4bo2bob5o32b2o4b4o4b
2o4b8o$3b2obob3o4bo27b2o2b2o2b2o4b4o6b2o4b2o$obo2b2o2b2o4bo27b2o2b2o2b
2o4b4o6b2o4b2o$bobo2bob2obob2o28b6o2b2o2b4o2b10o$2bob2obo2bob3o28b6o2b
2o2b4o2b10o$obob2o4bobo2bo33b2o2b2o18b2o$b3o2b10o33b2o2b2o18b2o$2bo7bo
3bo28b2o8b2o4b2o2b10o$b2o6b6o28b2o8b2o4b2o2b10o$49b4o2b2o2b6o8b2o$49b
4o2b2o2b6o8b2o$43b2o2b2o4b4o4b4o8b2o$43b2o2b2o4b4o4b4o8b2o$45b2o2b2o4b
2o2b4o2b2o2b4o$45b2o2b2o4b2o2b4o2b2o2b4o$47b2o2b4o2b2o4b2o2b6o$47b2o2b
4o2b2o4b2o2b6o$43b2o2b2o2b4o8b2o2b2o4b2o$43b2o2b2o2b4o8b2o2b2o4b2o$45b
6o4b20o$45b6o4b20o$47b2o14b2o6b2o$47b2o14b2o6b2o$45b4o12b12o$45b4o12b
12o!
This could be especially useful for rules which simulate margolus rules with 2x2 blocks (although I don't see much evil in searching rules without this property using this pseudosymmetry). It could possibly also be made subject to the additional symmetries and size rectangle (8x32, 4x64, 2x128) options the 1x1-cell soups face, obviously scaled up for it to make sense.

User avatar
Apple Bottom
Posts: 1034
Joined: July 27th, 2015, 2:06 pm
Contact:

Re: apgsearch v4.0

Post by Apple Bottom » September 1st, 2017, 6:37 am

muzik wrote:Possible pseudosymmetry suggestion: "inflated" soups, where each cell takes up a 2x2 space.

This could be especially useful for rules which simulate margolus rules with 2x2 blocks (although I don't see much evil in searching rules without this property using this pseudosymmetry). It could possibly also be made subject to the additional symmetries and size rectangle (8x32, 4x64, 2x128) options the 1x1-cell soups face, obviously scaled up for it to make sense.
I like that idea. Haven't looked at the 4.x code yet, but it didn't take long to implement this in apgsearch 1.x (well, 0.54+0.x).

Any brown paper bag bugs, typos and thinkos are mine. ;)
If you speak, your speech must be better than your silence would have been. — Arabian proverb

Catagolue: Apple Bottom • Life Wiki: Apple Bottom • Twitter: @_AppleBottom_

Proud member of the Pattern Raiders!

User avatar
muzik
Posts: 5614
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: apgsearch v4.0

Post by muzik » September 2nd, 2017, 6:24 am

Well, here's hoping it gets added officially to apgluxe.

On the topic of symmetries: will the SS symmetry ever be officially implemented? The only problem I can see with it is the fact that it's obviously going to fail in rules where the glider isn't a spaceship, so maybe the rule should default to b3s23 if the symmetry is specified.

Also, how about these 256x256 and 16x32 symmetries AB has been trying out, and WW's 32x32?

User avatar
Apple Bottom
Posts: 1034
Joined: July 27th, 2015, 2:06 pm
Contact:

Re: apgsearch v4.0

Post by Apple Bottom » September 2nd, 2017, 7:05 am

muzik wrote:Also, how about these 256x256 and 16x32 symmetries AB has been trying out, and WW's 32x32?
Unlikely to be implemented in apgluxe, I'd wager, unless you want to do it yourself, but 0.54+0.32i-ab2 supports my earlier "test" symmetries, so you can use that to search those if you're so inclined.

wwei23's 32x32 isn't supported by my patched version, but that symmetry is just four C1 soups glued together, so it would be very easy to implement -- mind, if you do so I'd suggest using a different name for the symmetry, as "32x32" sounds too official, and there's probably better ways of generating 32x32 soups anyway.

(If you want to search *actual* asymmetric 32x32 soups, then -- absent a suitable hash function that will produce 1024 bit hashes; unfortunately there isn't an SHA-1024 -- I'd just hash the same input string several times, with suffixes appended:

Code: Select all

s = hashlib.sha256(instring).digest() + hashlib.sha256(instring + "_2").digest() + hashlib.sha256(instring + "_3").digest() + ...
...and then proceed to generate a larger soup from the result. The nice thing about this is that you could increase the size of the soups arbitrarily by appending subsequent suffixes to instring, so if anyone ever wanted to search, say, 128x32 soups... no problem, just get SHA-256 hashes of instring, ..., instring + "_15", and convert the concatenation to a soup of the right size.)
If you speak, your speech must be better than your silence would have been. — Arabian proverb

Catagolue: Apple Bottom • Life Wiki: Apple Bottom • Twitter: @_AppleBottom_

Proud member of the Pattern Raiders!

User avatar
calcyman
Moderator
Posts: 2932
Joined: June 1st, 2009, 4:32 pm

Re: apgsearch v4.0

Post by calcyman » September 2nd, 2017, 11:37 am

Regarding how best to implement non-totalistic rules, I have two possible algorithms:
  • A low-memory SSSE3-based solution, similar to apgluxe's LtL algorithm, but with a 64-byte lookup table;
  • A high-memory lookup-table solution using a 16-megabyte lookup table to return the 4-by-2 interior of a 6-by-4 block of cells (computing 8 cells simultaneously in one instruction), similar to QuickLife;
I'm inclined to implement both of these, and see which one turns out to be faster. My bet is on the second one -- my intuition is that you'll only see a small portion of the 2^24 different 6-by-4 blocks, so it won't give your processor cache too much trouble. QuickLife in Golly uses a similar idea, but with 4-by-4 blocks and a 2^16-entry lookup table.

Ignoring memory accesses (which we can't in reality), I get something like the following:
  • 28 instructions (12 for creating the byte of neighbours, and 16 for evaluating the rule) per 16 cells (SSSE3) or per 32 cells (AVX2);
  • A few instructions per 8 cells (independent of instruction set).
There's a further speedup with AVX2 for the second algorithm, using a VGATHERDPS instruction to load 8 lookup table entries simultaneously. So provided it isn't memory-bound, the second algorithm should blow the first algorithm out of the water. It will also work on processors lacking SSSE3.

I estimate it will be slightly faster than QuickLife, and maybe half the speed of vlife.
muzik wrote:On the topic of symmetries: will the SS symmetry ever be officially implemented? The only problem I can see with it is the fact that it's obviously going to fail in rules where the glider isn't a spaceship, so maybe the rule should default to b3s23 if the symmetry is specified.
It won't ever be implemented in apgluxe. That symmetry was an experiment to dump HoneySearch results to Catagolue; however, I reached the decision that running HS for two days on a 72-physical-core machine with hundreds of gigabytes of memory and saving results to disk was the way to go. There was then several additional hours of post-processing and filtering, culminating in the 'data' directory of slmake (which is what Dave Greene has been using for his latest self-constructing projects).

The inflated 2x2 symmetry, on the other hand, is something I'll consider adding to apgluxe. (For rules without the 2x2 property, it will double up as a 32x32 asymmetric seed.)
muzik wrote:So does this mean that 4.x is faster at searching b3s23/C1 overall?
It will be, once I enhance the code for collecting objects.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
muzik
Posts: 5614
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: apgsearch v4.0

Post by muzik » September 2nd, 2017, 3:40 pm

Will C1 be the only such symmetry which can be inflated, or will it be applicable to all existing symmetries? I would quite like an inflated 1x256 symmetry at the very least.

User avatar
praosylen
Posts: 2443
Joined: September 13th, 2014, 5:36 pm
Location: Pembina University, Home of the Gliders
Contact:

Re: apgsearch v4.0

Post by praosylen » September 2nd, 2017, 4:14 pm

muzik wrote:I would quite like an inflated 1x256 symmetry at the very least.
Inflated 1x256 is worthless. You can get the same results just by running all 2x(2n) solid blocks of cells from n=1–256, which can be achieved using a simple script.
former username: A for Awesome
praosylen#5847 (Discord)

The only decision I made was made
of flowers, to jump universes to one of springtime in
a land of former winter, where no invisible walls stood,
or could stand for more than a few hours at most...

Post Reply