apgsearch v3.1

For general discussion about Conway's Game of Life.
Post Reply
User avatar
calcyman
Moderator
Posts: 2929
Joined: June 1st, 2009, 4:32 pm

apgsearch v3.1

Post by calcyman » March 19th, 2016, 9:23 am

The latest version of apgsearch (v3.x, codenamed apgmera) is available from:

https://gitlab.com/apgoucher/apgmera/

It's basically a faster version of 2.x with plenty of extra bonus features borrowed from 1.x. This hybrid nature is the reason for the choice of codename (on the pattern of 'chimera'). It also has a penchant for self-modifying and recompiling its code whenever necessary (such as changing the rule and symmetry).

The interface is very similar to that of 2.x (with which I assume you're familiar). The only noticeable difference is that to compile the program, you run the helper script:

Code: Select all

bash recompile.sh
instead of the usual 'make'. Also, there are --rule and --symmetry options, so you can run (for example):

Code: Select all

./apgmera --rule b3s238 --symmetry D2_+1 -n 5000000
and it will perform the necessary code generation, recompilation and self-execution. This relies heavily on the Python script rule2asm.py, which generates highly-optimised assembly code for running the specified rule.
an aside wrote:(Specifically, it consults a lookup table of minimal Boolean circuits for all 32768** falsity-preserving* 4-input Boolean functions, which was precomputed in 20 minutes by another Python script.)

* That is to say, f(0000) = 0. These are the only functions that can be implemented using the assembly instructions vpor, vpand, vpandn and vpxor. Restricting to falsity-preserving functions simply means that B0 rules are forbidden (as has always been the case).

** You may be wondering that, since there are 131072 non-B0 rules but only 32768 falsity-preserving 4-input Boolean functions, from whence the extra factor of 4 is obtained. There is, in addition to the main 4-input circuit f(c, b0, b1, b2), an optional 2-input auxiliary circuit g(c, b3) whose output is XOR'd with that of the main circuit. The variable c is the current state of the centre cell; the variables b3 b2 b1 b0 are the bits of the live neighbour count (which includes the centre cell due to the way that it's implemented).
Moreover, rule2asm.py also creates versions of the rule simulation algorithm in three different instruction sets (SSE2, AVX and AVX2); apgmera chooses the highest version supported by the CPU on which it's running. This gives a particularly noticeable speed boost on machines with AVX2 support, since it processes 256 bits simultaneously instead of just 128.

Advantages over v2.x:
  • Up to 35% faster, depending on the CPU.
  • Supports arbitrary outer-totalistic rules.
  • Supports three different symmetry types (C1, D2_+2 and D2_+1).
  • Can upgrade itself to the latest online version by including the --update option!
Disadvantages compared with v2.x:
  • Requires Python 2 (for rule2asm.py) and Bash (for recompile.sh).
Advantages over v1.x:
  • Between 5x and 100x faster, depending on the rule, symmetry, and CPU.
  • Does not depend on Golly, and can run on headless machines.
  • Better handling of large objects.
Disadvantages compared with v1.x:
  • Supports fewer symmetries (3 compared with 16).
What do you do with ill crystallographers? Take them to the mono-clinic!

drc
Posts: 1664
Joined: December 3rd, 2015, 4:11 pm

Re: apgsearch v3.1

Post by drc » March 19th, 2016, 10:46 am

Code: Select all

---------------------------
Python error:
---------------------------
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\cygwin64\home\Daniel\apgmera-life\rule2asm.py", line 538, in <module>
    main()
  File "C:\cygwin64\home\Daniel\apgmera-life\rule2asm.py", line 476, in main
    rulestring = sys.argv[1]
IndexError: list index out of range

---------------------------
OK   
---------------------------
When I run rule2asm.py in Golly, I get this?

fluffykitty
Posts: 1175
Joined: June 14th, 2014, 5:03 pm
Contact:

Re: apgsearch v3.1

Post by fluffykitty » March 19th, 2016, 11:08 am

You're not supposed to run it in Golly. It's used by apgmera to generate custom assembly code for your rules and symmetries. (But still, where did g come from?)

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

Re: apgsearch v3.1

Post by calcyman » March 19th, 2016, 11:19 am

drc wrote:When I run rule2asm.py in Golly, I get this?
It's not designed to be run in Golly; it's just a helper script used by recompile.sh.

You already seem to be using Cygwin, based on the stack trace you posted, so you should be able to do the following (assuming your Cygwin installation includes Python 2):

Code: Select all

cd apgmera
bash recompile.sh
You'll probably get a lot of console output, owing to the rather complicated build process. This is what I ended up with:

Code: Select all

Skipping updates; use --update to update apgmera automatically.
Rule unspecified; assuming b3s23.
Symmetry unspecified; assuming C1.
Configuring rule b3s23; symmetry C1
Valid rulestring: b3s23
Valid symmetry: C1
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]
Success!
makefile:60: .depend: No such file or directory
rm -f ./.depend
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP -MM main.cpp includes/sha256.cpp includes/md5.cpp includes/happyhttp.cpp gollybase/bigint.cpp gollybase/lifealgo.cpp gollybase/qlifealgo.cpp gollybase/util.cpp gollybase/lifepoll.cpp gollybase/liferules.cpp gollybase/viewport.cpp gollybase/readpattern.cpp gollybase/qlifedraw.cpp>>./.depend;
make: Warning: File `.depend' has modification time 0.44 s in the future
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP main.cpp -o main.o
In file included from main.cpp:23:0:
includes/vlife.h: In member function ‘int vlife::countPopulation(VersaTile*)’:
includes/vlife.h:259:77: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
             const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);
                                                                             ^
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP includes/sha256.cpp -o includes/sha256.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP includes/md5.cpp -o includes/md5.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP includes/happyhttp.cpp -o includes/happyhttp.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/bigint.cpp -o gollybase/bigint.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/lifealgo.cpp -o gollybase/lifealgo.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/qlifealgo.cpp -o gollybase/qlifealgo.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/util.cpp -o gollybase/util.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/lifepoll.cpp -o gollybase/lifepoll.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/liferules.cpp -o gollybase/liferules.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/viewport.cpp -o gollybase/viewport.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/readpattern.cpp -o gollybase/readpattern.o
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP gollybase/qlifedraw.cpp -o gollybase/qlifedraw.o
g++ -fopenmp main.o includes/sha256.o includes/md5.o includes/happyhttp.o gollybase/bigint.o gollybase/lifealgo.o gollybase/qlifealgo.o gollybase/util.o gollybase/lifepoll.o gollybase/liferules.o gollybase/viewport.o gollybase/readpattern.o gollybase/qlifedraw.o -o apgmera
true
true                                                oo o
true                                                oo ooo
true                                                      o
true                                                oo ooo
true                                                 o o
true                                                 o o
true                                                  o
make: warning: Clock skew detected. Your build may be incomplete.
apgmera v3.13: Rule b3s23 is correctly configured.
apgmera v3.13: Symmetry C1 is correctly configured.
The last two lines:
  • apgmera v3.13: Rule b3s23 is correctly configured.
  • apgmera v3.13: Symmetry C1 is correctly configured.
indicate that the complicated build process has actually succeeded.
fluffykitty wrote:You're not supposed to run it in Golly. It's used by apgmera to generate custom assembly code for your rules and symmetries.
Indeed.
fluffykitty wrote:(But still, where did g come from?)
You mean the symbol g in the Python script? That's the output filestream, and has nothing to do with Golly. I generally use f to represent an input file (as most people do) and g for an output file (simply because g is the successor of f in the alphabet).
What do you do with ill crystallographers? Take them to the mono-clinic!

drc
Posts: 1664
Joined: December 3rd, 2015, 4:11 pm

Re: apgsearch v3.1

Post by drc » March 19th, 2016, 11:22 am

Thanks calcyman, but I get errors at the bottom:

Code: Select all

Skipping updates; use --update to update apgmera automatically.
Rule unspecified; assuming b3s23.
Symmetry unspecified; assuming C1.
Configuring rule b3s23; symmetry C1
Valid rulestring: b3s23
Valid symmetry: C1
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]
Success!
makefile:60: .depend: No such file or directory
rm -f ./.depend
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP -MM main.cpp includes/sha256.cpp includes/md5.cpp includes/happyhttp.cpp gollybase/bigint.cpp gollybase/lifealgo.cpp gollybase/qlifealgo.cpp gollybase/util.cpp gollybase/lifepoll.cpp gollybase/liferules.cpp gollybase/viewport.cpp gollybase/readpattern.cpp gollybase/qlifedraw.cpp>>./.depend;
makefile:45: recipe for target '.depend' failed
make: *** [.depend] Error 1

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

Re: apgsearch v3.1

Post by calcyman » March 19th, 2016, 3:06 pm

drc wrote:Thanks calcyman, but I get errors at the bottom:
Okay, I think I've resolved that (although it's difficult to test because I didn't get the errors).

Try running the following to upgrade to v3.14:

Code: Select all

bash recompile.sh --update
and let me know whether that works.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
isaacg
Posts: 14
Joined: August 20th, 2015, 8:47 pm

Re: apgsearch v3.1

Post by isaacg » March 20th, 2016, 11:58 pm

For some reason, linear-growth patterns always seem to come in pairs:

Code: Select all

1540000 soups processed...
1550000 soups processed...
Rare oscillator detected: xp14_j9d0d9j
Rare spaceship detected: xq4_27dee6z4eb776
1560000 soups processed...
Rare oscillator detected: xp14_j9d0d9j
Linear-growth pattern detected: yl144_1_16_afb5f3db909e60548f086e22ee3353ac
Linear-growth pattern detected: yl144_1_16_afb5f3db909e60548f086e22ee3353ac
1570000 soups processed...
Rare oscillator detected: xp14_j9d0d9j
Rare oscillator detected: xp4_8eh5e0e5he8z178a707a871
1580000 soups processed...
Linear growth patterns are repeated every single time.
I'm running this on standard game of life, with 4 threads.

User avatar
Kazyan
Posts: 1247
Joined: February 6th, 2014, 11:02 pm

Re: apgsearch v3.1

Post by Kazyan » March 21st, 2016, 3:01 am

From the other objects in that snippet, it looks like you're searching D2_+1 symmetry. Every switch engine produced under D2 will have a mirror image over the axis of symmetry, so they're always detected in pairs.
Tanner Jacobi
Coldlander, a novel, available in paperback and as an ebook. Now on Amazon.

User avatar
isaacg
Posts: 14
Joined: August 20th, 2015, 8:47 pm

Re: apgsearch v3.1

Post by isaacg » March 21st, 2016, 2:46 pm

Kazyan wrote:From the other objects in that snippet, it looks like you're searching D2_+1 symmetry. Every switch engine produced under D2 will have a mirror image over the axis of symmetry, so they're always detected in pairs.
You're right, thanks. I had just gotten confused about how switching symmetries worked.

User avatar
Saka
Posts: 3627
Joined: June 19th, 2015, 8:50 pm
Location: Indonesia
Contact:

Re: apgsearch v3.1

Post by Saka » March 22nd, 2016, 4:19 am

Why doesn't it print

Code: Select all

oo o
oo ooo
      o
oo ooo
  o o
  o o
   o
Anymore?

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

Re: apgsearch v3.1

Post by calcyman » March 22nd, 2016, 8:28 am

Saka wrote:Why doesn't it print

Code: Select all

oo o
oo ooo
      o
oo ooo
  o o
  o o
   o
Anymore?
It does...? This is my terminal output:

Code: Select all

$ ./recompile.sh --update
Checking for updates from repository...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 61844  100 61844    0     0  76305      0 --:--:-- --:--:-- --:--:-- 76256
...your copy of apgmera is already up-to-date.
Rule unspecified; assuming b3s23.
Symmetry unspecified; assuming C1.
Configuring rule b3s23; symmetry C1
Valid rulestring: b3s23
Valid symmetry: C1
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]
Success!
g++ -c -Wall -O3 -march=native -fopenmp -DUSE_OPEN_MP main.cpp -o main.o
In file included from main.cpp:23:0:
includes/vlife.h: In member function ‘int vlife::countPopulation(VersaTile*)’:
includes/vlife.h:259:77: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
             const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);
                                                                             ^
g++ -fopenmp main.o includes/sha256.o includes/md5.o includes/happyhttp.o gollybase/bigint.o gollybase/lifealgo.o gollybase/qlifealgo.o gollybase/util.o gollybase/lifepoll.o gollybase/liferules.o gollybase/viewport.o gollybase/readpattern.o gollybase/qlifedraw.o -o apgmera
true
true                                                oo o
true                                                oo ooo
true                                                      o
true                                                oo ooo
true                                                 o o
true                                                 o o
true                                                  o
apgmera v3.15: Rule b3s23 is correctly configured.
apgmera v3.15: Symmetry C1 is correctly configured.
What do you do with ill crystallographers? Take them to the mono-clinic!

drc
Posts: 1664
Joined: December 3rd, 2015, 4:11 pm

Re: apgsearch v3.1

Post by drc » March 22nd, 2016, 4:30 pm

how to key?

drc
Posts: 1664
Joined: December 3rd, 2015, 4:11 pm

Re: apgsearch v3.1

Post by drc » March 22nd, 2016, 7:04 pm

Connection is unsuccessful every time. Why? Also day and night is really freaking fast.

User avatar
Saka
Posts: 3627
Joined: June 19th, 2015, 8:50 pm
Location: Indonesia
Contact:

Re: apgsearch v3.1

Post by Saka » March 22nd, 2016, 7:47 pm

@calcyman
Not every time you run it though. I also think it does the

Code: Select all

Namaste,
thing anymore

drc
Posts: 1664
Joined: December 3rd, 2015, 4:11 pm

Re: apgsearch v3.1

Post by drc » March 22nd, 2016, 10:03 pm

Can you add what 1.0 had where you press q to quit?

User avatar
gameoflifeboy
Posts: 474
Joined: January 15th, 2015, 2:08 am

Re: apgsearch v3.1

Post by gameoflifeboy » March 23rd, 2016, 12:31 am

First of all, wow. On some rules, apgmera runs incredibly fast. (For the particular rule I linked, for example, this is about 70000 soups per second on my windows computer, and almost 10 times faster on an Ubuntu computer.)

This is because the soups in those rules usually die in about 10-20 generations. As a corollary, much fewer patterns are found, but this makes it all the more exciting to see new ones turn up, and gives some hints into commonality of patterns in a rule where objects always form in the first few generations of evolution, instead of common predecessors.

In these cases, would an option to not print the progress of the search every 10000 soups speed things up noticeably even more?

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

Re: apgsearch v3.1

Post by Apple Bottom » March 23rd, 2016, 7:43 am

Woohoo! Good to see this officially released, finally. Now all we still need is the remaining symmetries to bring it up to par with 1.x, and then support for semi-totalistic rules à la 0.54+0.21i. :)

(Also, still waiting for that custom ASIC hardware. ;))
drc wrote:Can you add what 1.0 had where you press q to quit?
Here's a patch that adds this:

Code: Select all

diff -ru apgmera-14b4/main.cpp playing-around-14b4/main.cpp
--- apgmera-14b4/main.cpp       2016-03-18 21:01:33.000000000 +0100
+++ playing-around-14b4/main.cpp        2016-03-18 22:51:02.113706700 +0100
@@ -8,6 +8,9 @@
 #include <ctime>
 #include <cmath>
 #include <unistd.h>
+#include <sys/select.h>
+#include <termios.h>
+#include <stdio.h>

 #ifdef USE_OPEN_MP
 #include <omp.h>
@@ -25,6 +28,22 @@

 #define APG_VERSION "v3.12"

+// 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);
+}
+
 /*
  * Produce a new seed based on the original seed, current time and PID:
  */
@@ -1624,7 +1643,7 @@

 #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;

@@ -1683,13 +1702,15 @@
         }
         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) {

     // Create an empty QuickLife universe:
     lifealgo *imp2 = createUniverse("QuickLife");
@@ -1705,8 +1726,9 @@

     long long i = 0;
     bool finishedSearch = false;
+    bool quitByUser = false;

-    while (finishedSearch == false) {
+    while ((finishedSearch == false) && (quitByUser == false)) {

         std::ostringstream ss;
         ss << i;
@@ -1721,9 +1743,15 @@
             std::cout << i << " soups completed (" << (int) (10000.0 / ((double) (end-start) / CLOCKS_PER_SEC)) << " soups per second)." << std::endl;

             start = clock();
+
+            if(keyWaiting()) {
+                char c = fgetc(stdin);
+                if ((c == 'q') || (c == 'Q'))
+                    quitByUser = true;
+            }
         }

-        if (i % n == 0) {
+        if ((i % n == 0) || quitByUser) {
             if (testing) {
                 finishedSearch = true;
             } else {
@@ -1742,6 +1770,8 @@
         }

     }
+
+    return quitByUser;

 }

@@ -1780,6 +1810,8 @@
     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++) {
@@ -1837,12 +1869,18 @@
         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;33mapgmera " << APG_VERSION << "\033[0m, configured for \033[1;34m" << RULESTRING << "/" << SYMMETRY << "\033[0m.\n" << std::endl;

     // Initialise QuickLife:
     qlifealgo::doInitializeAlgoInfo(staticAlgoInfo::tick());

-    while (true) {
+    while (!quitByUser) {
         if (verifications > 0) {
             std::cout << "Peer-reviewing hauls:\n" << std::endl;
             // Verify some hauls:
@@ -1856,17 +1894,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; }
     }

+    // turn on blocking reads
+    tcgetattr(STDIN_FILENO, &ttystate);
+    ttystate.c_lflag |= ICANON;
+    tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
+
     return 0;
 }
This is against 3.12, but I think it should still apply to the latest version, perhaps with some fuzz. It only works for regular searches, not parallel searches using OpenMP (further patches welcome, obviously).
gameoflifeboy wrote:In these cases, would an option to not print the progress of the search every 10000 soups speed things up noticeably even more?
Here's another patch that adds an -S <#> option to control how often progress messages are printed (default 10000, as before). Unlike the previous patch (which I already had sitting on my HD anyway), this is against 3.15:

Code: Select all

diff -ru apgmera-7c26/main.cpp playing-around-7c26/main.cpp
--- apgmera-7c26/main.cpp       2016-03-21 00:01:33.000000000 +0100
+++ playing-around-7c26/main.cpp        2016-03-23 12:53:48.704933600 +0100
@@ -1625,7 +1625,7 @@

 #ifdef USE_OPEN_MP

-void parallelSearch(int n, int m, std::string payoshaKey, std::string seed, int local_log) {
+void parallelSearch(int n, int m, std::string payoshaKey, std::string seed, int local_log, int soups_per_line) {

     SoupSearcher globalSoup;

@@ -1654,7 +1654,7 @@
             for (long long i = offset; i < offset + n; i++) {
                 long long pseudoElapsed = offset + elapsed * m + threadNumber;
                 elapsed += 1;
-                if (pseudoElapsed % 10000 == 0) {
+                if (pseudoElapsed % soups_per_line == 0) {
                     std::cout << pseudoElapsed << " soups processed..." << std::endl;
                 }
                 std::ostringstream ss;
@@ -1690,7 +1690,7 @@
 #endif


-void runSearch(int n, std::string payoshaKey, std::string seed, int local_log, bool testing) {
+void runSearch(int n, std::string payoshaKey, std::string seed, int local_log, int soups_per_line, bool testing) {

     // Create an empty QuickLife universe:
     lifealgo *imp2 = createUniverse("QuickLife");
@@ -1716,10 +1716,10 @@

         i += 1;

-        if (i % 10000 == 0) {
+        if (i % soups_per_line == 0) {
             clock_t end = clock();

-            std::cout << i << " soups completed (" << (int) (10000.0 / ((double) (end-start) / CLOCKS_PER_SEC)) << " soups per second)." << std::endl;
+            std::cout << i << " soups completed (" << (int) ((double) (soups_per_line) / ((double) (end-start) / CLOCKS_PER_SEC)) << " soups per second)." << std::endl;

             start = clock();
         }
@@ -1774,6 +1774,7 @@

     // Default values:
     int soups_per_haul = 10000000;
+    int soups_per_line = 10000;
     std::string payoshaKey = "#anon";
     std::string seed = reseed("original seed");
     int verifications = -1;
@@ -1797,6 +1798,8 @@
                 soups_per_haul = 100000000;
             }
             */
+        } else if (strcmp(argv[i], "-S") == 0) {
+            soups_per_line = atoi(argv[i+1]);
         } else if (strcmp(argv[i], "-v") == 0) {
             verifications = atoi(argv[i+1]);
         } else if (strcmp(argv[i], "-L") == 0) {
@@ -1857,12 +1860,12 @@
         std::cout << "Using seed " << seed << std::endl;
         if (parallelisation > 0) {
             #ifdef USE_OPEN_MP
-            parallelSearch(soups_per_haul, parallelisation, payoshaKey, seed, local_log);
+            parallelSearch(soups_per_haul, parallelisation, payoshaKey, seed, local_log, soups_per_line);
             #else
-            runSearch(soups_per_haul, payoshaKey, seed, local_log, false);
+            runSearch(soups_per_haul, payoshaKey, seed, local_log, soups_per_line, false);
             #endif
         } else {
-            runSearch(soups_per_haul, payoshaKey, seed, local_log, testing);
+            runSearch(soups_per_haul, payoshaKey, seed, local_log, soups_per_line, testing);
         }
         seed = reseed(seed);
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
Saka
Posts: 3627
Joined: June 19th, 2015, 8:50 pm
Location: Indonesia
Contact:

Re: apgsearch v3.1

Post by Saka » March 23rd, 2016, 8:24 am

Calcyman, how do you make the names for apgsearch versions? Do you make them by yourself, or do you use words in other languages?

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

Re: apgsearch v3.1

Post by calcyman » March 23rd, 2016, 8:37 am

Saka wrote:Calcyman, how do you make the names for apgsearch versions?
The suffix '-mera' is from 'chimera' (because v3 is a hybrid of interacting C++, Python and Bash code). And the '-nano' in v2 was to indicate how lightweight it was (compared with v1).
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
Saka
Posts: 3627
Joined: June 19th, 2015, 8:50 pm
Location: Indonesia
Contact:

Re: apgsearch v3.1

Post by Saka » March 23rd, 2016, 8:40 am

calcyman wrote:
Saka wrote:Calcyman, how do you make the names for apgsearch versions?
The suffix '-mera' is from 'chimera' (because v3 is a hybrid of interacting C++, Python and Bash code). And the '-nano' in v2 was to indicate how lightweight it was (compared with v1).
How about version 4? What are your plans? C++? Bash? Python? I would like an executable. But it would be called apgates...

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

Re: apgsearch v3.1

Post by calcyman » March 23rd, 2016, 8:51 am

Saka wrote:How about version 4? What are your plans?
GPU support, via nVidia CUDA.
What do you do with ill crystallographers? Take them to the mono-clinic!

User avatar
Saka
Posts: 3627
Joined: June 19th, 2015, 8:50 pm
Location: Indonesia
Contact:

Re: apgsearch v3.1

Post by Saka » March 23rd, 2016, 9:01 am

calcyman wrote:
Saka wrote:How about version 4? What are your plans?
GPU support, via nVidia CUDA.
Errr... What the heck is that?

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

Re: apgsearch v3.1

Post by calcyman » March 23rd, 2016, 9:07 am

Saka wrote:
calcyman wrote:
Saka wrote:How about version 4? What are your plans?
GPU support, via nVidia CUDA.
Errr... What the heck is that?
It's a programming framework to allow you to run code on a GPU (graphics processing unit).

http://www.nvidia.co.uk/object/cuda-par ... ng-uk.html
What do you do with ill crystallographers? Take them to the mono-clinic!

drc
Posts: 1664
Joined: December 3rd, 2015, 4:11 pm

Re: apgsearch v3.1

Post by drc » March 26th, 2016, 8:54 am

Each object page should say its total amount of natural C1 occurrences
calcyman wrote:Try running the following to upgrade to v3.14:
i see what you did there

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

Re: apgsearch v3.1

Post by calcyman » March 26th, 2016, 3:08 pm

Apple Bottom wrote:Woohoo! Good to see this officially released, finally. Now all we still need is the remaining symmetries to bring it up to par with 1.x, and then support for semi-totalistic rules à la 0.54+0.21i. :)
I've added D4_+4, D4_+2 and D4_+1. There's no theoretical obstacle to adding the remaining symmetries; it's just rather a lot of work as each one must be done individually.

As for isotropic non-totalistic rules, that's currently impossible (since QuickLife can't run them, and QuickLife is used for classifying objects).
What do you do with ill crystallographers? Take them to the mono-clinic!

Post Reply