Blame projects/neural/test.inc.cpp

b579b3
#ifndef TEST_INC_CPP
b579b3
#define TEST_INC_CPP
b579b3
b579b3
b579b3
#include "common.inc.cpp"
b579b3
b579b3
b579b3
b579b3
class Test {
b579b3
public:
b579b3
  class Stage {
b579b3
  public:
b579b3
    const int errors;
b579b3
    inline explicit Stage(const char *name): errors(Test::errors) {
b579b3
      for(int i = 0; i < level; ++i) printf("- ");
b579b3
      printf("%s\n", name);
b579b3
      fflush(stdout);
b579b3
      ++level;
b579b3
    }
b579b3
    inline ~Stage() {
b579b3
      --level;
b579b3
      if (!*this) {
b579b3
        for(int i = 0; i < level; ++i) printf("- ");
b579b3
        printf("FAILED\n");
b579b3
      }
b579b3
      fflush(stdout);
b579b3
    }
b579b3
    operator bool() { return Test::errors == errors; }
b579b3
  };
b579b3
b579b3
private:
b579b3
  static int level;
b579b3
b579b3
protected:
b579b3
  static std::vector<neuron> c_neurons;</neuron>
b579b3
  static std::vector<neuron> p_neurons;</neuron>
b579b3
  static std::vector<weight> weights;</weight>
b579b3
  static std::vector<neuronreal> values;</neuronreal>
b579b3
b579b3
public:
b579b3
  static int errors;
b579b3
b579b3
b579b3
  static void init(int c_count, int p_count, int w_count, int v_count = 0) {
b579b3
    Neuron n = {};
b579b3
    Weight w = {};
b579b3
b579b3
    c_neurons.clear();
b579b3
    p_neurons.clear();
b579b3
    weights.clear();
b579b3
    values.clear();
b579b3
    
b579b3
    c_neurons.resize(c_count, n);
b579b3
    p_neurons.resize(p_count, n);
b579b3
    weights.resize(w_count, w);
b579b3
    values.resize(v_count, 0);
b579b3
  }
b579b3
b579b3
b579b3
  static bool verifyNeurons(const char *name, const Layout &l, const Neuron *neurons, bool ignorePadded = false) {
b579b3
    Stage st(name);
b579b3
    for(int y = 0; y < l.sy; ++y)
b579b3
    for(int x = 0; x < l.sx; ++x)
b579b3
    for(int z = 0; z < l.sz; ++z) {
b579b3
      int n = neurons[ (y*l.sx + x)*l.sz + z ].a.i;
b579b3
      int i = x >= l.x0 && x < l.x1
b579b3
           && y >= l.y0 && y < l.y1
b579b3
           && z >= l.z0 && z < l.z1;
b579b3
      if (ignorePadded ? i && n != i : n != i) {
b579b3
        printf(
b579b3
          "wrong neuron mark %d, expected %d (%d, %d, %d)\n",
b579b3
          n, i, y, x, z );
b579b3
        l.printYXZ("layout");
b579b3
        ++errors;
b579b3
        return st;
b579b3
      }
b579b3
    }
b579b3
    return st;
b579b3
  }
b579b3
  
b579b3
  
b579b3
  static bool verifyNeuronIndices(const char *name, const Layout &l, const Neuron *neurons, int base = 1, int stride = 1) {
b579b3
    Stage st(name);
b579b3
    for(int y = 0; y < l.sy; ++y)
b579b3
    for(int x = 0; x < l.sx; ++x)
b579b3
    for(int z = 0; z < l.sz; ++z) {
b579b3
      bool active = x >= l.x0 && x < l.x1
b579b3
                 && y >= l.y0 && y < l.y1
b579b3
                 && z >= l.z0 && z < l.z1;
b579b3
      
b579b3
      int n = neurons[ (y*l.sx + x)*l.sz + z ].a.i;
b579b3
      int i = (((y - l.y0)*l.getW() + x - l.x0)*l.getD() + z - l.z0)*stride + base;
b579b3
      
b579b3
      if (!active) i = 0;
b579b3
      
b579b3
      if (n != i) {
b579b3
        printf(
b579b3
          "wrong neuron mark %d, expected %d (%d, %d, %d)\n",
b579b3
          n, i, y, x, z );
b579b3
        l.printYXZ("layout");
b579b3
        ++errors;
b579b3
        return st;
b579b3
      }
b579b3
    }
b579b3
    return st;
b579b3
  }
b579b3
  
b579b3
  
b579b3
  static bool verifyNeuronsAccum(const Layout &l, Neuron *neurons, int accum = 1, bool ignoreBounds = false) {
b579b3
    for(int y = 0; y < l.sy; ++y)
b579b3
    for(int x = 0; x < l.sx; ++x)
b579b3
    for(int z = 0; z < l.sz; ++z) {
b579b3
      Neuron &n = neurons[ (y*l.sx + x)*l.sz + z ];
b579b3
      int i = ( x >= l.x0 && x < l.x1
b579b3
             && y >= l.y0 && y < l.y1
b579b3
             && z >= l.z0 && z < l.z1 )*accum;
b579b3
      if (ignoreBounds) i = accum;
b579b3
      if (n.v != 0 && n.v != i) {
b579b3
        printf(
b579b3
          "wrong neuron mark %g, expected 0 or %d (%d, %d, %d)\n",
b579b3
          n.v, i, y, x, z );
b579b3
        l.printYXZ("layout");
b579b3
        ++errors;
b579b3
        return false;
b579b3
      }
b579b3
      if (n.v) n.a.i = 1;
b579b3
      n.v = 0;
b579b3
    }
b579b3
    return true;
b579b3
  }
b579b3
};
b579b3
b579b3
b579b3
int Test::level = 0;
b579b3
std::vector<neuron> Test::c_neurons;</neuron>
b579b3
std::vector<neuron> Test::p_neurons;</neuron>
b579b3
std::vector<weight> Test::weights;</weight>
b579b3
std::vector<neuronreal> Test::values;</neuronreal>
b579b3
int Test::errors = 0;
b579b3
b579b3
b579b3
b579b3
#endif
b579b3