Page 1 of 15

apgsearch v3.1

Posted: March 19th, 2016, 9:23 am
by calcyman
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).

Re: apgsearch v3.1

Posted: March 19th, 2016, 10:46 am
by drc

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?

Re: apgsearch v3.1

Posted: March 19th, 2016, 11:08 am
by fluffykitty
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?)

Re: apgsearch v3.1

Posted: March 19th, 2016, 11:19 am
by calcyman
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).

Re: apgsearch v3.1

Posted: March 19th, 2016, 11:22 am
by drc
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

Re: apgsearch v3.1

Posted: March 19th, 2016, 3:06 pm
by calcyman
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.

Re: apgsearch v3.1

Posted: March 20th, 2016, 11:58 pm
by isaacg
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.

Re: apgsearch v3.1

Posted: March 21st, 2016, 3:01 am
by Kazyan
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.

Re: apgsearch v3.1

Posted: March 21st, 2016, 2:46 pm
by isaacg
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.

Re: apgsearch v3.1

Posted: March 22nd, 2016, 4:19 am
by Saka
Why doesn't it print

Code: Select all

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

Re: apgsearch v3.1

Posted: March 22nd, 2016, 8:28 am
by calcyman
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.

Re: apgsearch v3.1

Posted: March 22nd, 2016, 4:30 pm
by drc
how to key?

Re: apgsearch v3.1

Posted: March 22nd, 2016, 7:04 pm
by drc
Connection is unsuccessful every time. Why? Also day and night is really freaking fast.

Re: apgsearch v3.1

Posted: March 22nd, 2016, 7:47 pm
by Saka
@calcyman
Not every time you run it though. I also think it does the

Code: Select all

Namaste,
thing anymore

Re: apgsearch v3.1

Posted: March 22nd, 2016, 10:03 pm
by drc
Can you add what 1.0 had where you press q to quit?

Re: apgsearch v3.1

Posted: March 23rd, 2016, 12:31 am
by gameoflifeboy
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?

Re: apgsearch v3.1

Posted: March 23rd, 2016, 7:43 am
by Apple Bottom
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);

Re: apgsearch v3.1

Posted: March 23rd, 2016, 8:24 am
by Saka
Calcyman, how do you make the names for apgsearch versions? Do you make them by yourself, or do you use words in other languages?

Re: apgsearch v3.1

Posted: March 23rd, 2016, 8:37 am
by calcyman
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).

Re: apgsearch v3.1

Posted: March 23rd, 2016, 8:40 am
by Saka
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...

Re: apgsearch v3.1

Posted: March 23rd, 2016, 8:51 am
by calcyman
Saka wrote:How about version 4? What are your plans?
GPU support, via nVidia CUDA.

Re: apgsearch v3.1

Posted: March 23rd, 2016, 9:01 am
by Saka
calcyman wrote:
Saka wrote:How about version 4? What are your plans?
GPU support, via nVidia CUDA.
Errr... What the heck is that?

Re: apgsearch v3.1

Posted: March 23rd, 2016, 9:07 am
by calcyman
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

Re: apgsearch v3.1

Posted: March 26th, 2016, 8:54 am
by drc
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

Re: apgsearch v3.1

Posted: March 26th, 2016, 3:08 pm
by calcyman
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).