Blame simple/neural/nn-heli.c

Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
#include <math.h>
Ivan Mahonin ec0d7e
#include <stdio.h>
Ivan Mahonin ec0d7e
#include <stdlib.h>
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
#include <helianthus.h>
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
#include "nnlayer.inc.c"
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
NeuralLayer *nl;
Ivan Mahonin ec0d7e
Framebuffer fb, fbMin;
Ivan Mahonin ec0d7e
Animation fbAnim, fbMinAnim;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
int wasPressed;
Ivan Mahonin ec0d7e
double prevX, prevY;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
void prepareImage() {
Ivan Mahonin ec0d7e
  int w, h;
Ivan Mahonin ec0d7e
  unsigned char *pixels = NULL;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  saveState();
Ivan Mahonin ec0d7e
  target(fb);
Ivan Mahonin ec0d7e
  imageFromViewport(&w, &h, &pixels);
Ivan Mahonin ec0d7e
  restoreState();
Ivan Mahonin ec0d7e
  if (!pixels) return;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  int x0 = w, y0 = h, x1 = 0, y1 = 0;
Ivan Mahonin ec0d7e
  for(int y = 0; y < h; ++y) {
Ivan Mahonin ec0d7e
    for(int x = 0; x < w; ++x) {
Ivan Mahonin ec0d7e
      if (imageGetPixel(w, h, pixels, x, y) != 0x000000ff) {
Ivan Mahonin ec0d7e
        if (x0 > x) x0 = x;
Ivan Mahonin ec0d7e
        if (x1 < x) x1 = x;
Ivan Mahonin ec0d7e
        if (y0 > y) y0 = y;
Ivan Mahonin ec0d7e
        if (y1 < y) y1 = y;
Ivan Mahonin ec0d7e
      }
Ivan Mahonin ec0d7e
    }
Ivan Mahonin ec0d7e
  }
Ivan Mahonin ec0d7e
  free(pixels);
Ivan Mahonin ec0d7e
  pixels = NULL;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  if (x1 < x0 || y1 < y0) return;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  double wx = x1 - x0 + 1;
Ivan Mahonin ec0d7e
  double wy = y1 - y0 + 1;
Ivan Mahonin ec0d7e
  double s = 20.0/(wx > wy ? wx : wy);
Ivan Mahonin ec0d7e
  double cx = (x0 + x1)/2.0;
Ivan Mahonin ec0d7e
  double cy = (y0 + y1)/2.0;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  double xx = 14 - s*cx;
Ivan Mahonin ec0d7e
  double yy = 14 - s*cy;
Ivan Mahonin ec0d7e
  double ww = s*w;
Ivan Mahonin ec0d7e
  double hh = s*h;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  saveState();
Ivan Mahonin ec0d7e
  target(fbMin);
Ivan Mahonin ec0d7e
  noStroke();
Ivan Mahonin ec0d7e
  rectTextured(fbAnim, xx, yy, ww, hh);
Ivan Mahonin ec0d7e
  imageFromViewport(&w, &h, &pixels);
Ivan Mahonin ec0d7e
  restoreState();
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  if (!pixels) return;
Ivan Mahonin ec0d7e
  double *p = nl->a;
Ivan Mahonin ec0d7e
  for(int y = 0; y < h; ++y)
Ivan Mahonin ec0d7e
    for(int x = 0; x < w; ++x)
Ivan Mahonin ec0d7e
      *p++ = colorGetValue(imageGetPixel(w, h, pixels, x, y));
Ivan Mahonin ec0d7e
}
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
void init() {
Ivan Mahonin ec0d7e
  background(COLOR_BLACK);
Ivan Mahonin ec0d7e
  stroke(COLOR_WHITE);
Ivan Mahonin ec0d7e
  fb = createFramebufferEx(512, 512, NULL, FALSE, FALSE, TRUE);
Ivan Mahonin ec0d7e
  fbMin = createFramebufferEx(28, 28, NULL, FALSE, FALSE, TRUE);
Ivan Mahonin ec0d7e
  fbAnim = createAnimationFromFramebuffer(fb);
Ivan Mahonin ec0d7e
  fbMinAnim = createAnimationFromFramebuffer(fbMin);
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  saveState();
Ivan Mahonin ec0d7e
  target(fb);
Ivan Mahonin ec0d7e
  clear();
Ivan Mahonin ec0d7e
  target(fbMin);
Ivan Mahonin ec0d7e
  clear();
Ivan Mahonin ec0d7e
  restoreState();
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  nl = nlNew(NULL, 784, 0);
Ivan Mahonin ec0d7e
  nlNew(nl, 256, 0);
Ivan Mahonin ec0d7e
  nlNew(nl, 128, 0);
Ivan Mahonin ec0d7e
  nlNew(nl, 64, 0);
Ivan Mahonin ec0d7e
  nlNew(nl, 64, 0);
Ivan Mahonin ec0d7e
  nlNew(nl, 10, 0);
Ivan Mahonin ec0d7e
  nlLoad(nl, "data/weights.bin");
Ivan Mahonin ec0d7e
}
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
void draw() {
Ivan Mahonin ec0d7e
  saveState();
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  if (mouseDown("left")) {
Ivan Mahonin ec0d7e
    double x = mouseX(), y = mouseY();
Ivan Mahonin ec0d7e
    if (!wasPressed) prevX = x, prevY = y;
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
    saveState();
Ivan Mahonin ec0d7e
    strokeWidth(32);
Ivan Mahonin ec0d7e
    target(fb);
Ivan Mahonin ec0d7e
    line(prevX, prevY, x, y);
Ivan Mahonin ec0d7e
    restoreState();
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
    prevX = x, prevY = y;
Ivan Mahonin ec0d7e
    wasPressed = TRUE;
Ivan Mahonin ec0d7e
  } else {
Ivan Mahonin ec0d7e
    wasPressed = FALSE;
Ivan Mahonin ec0d7e
  }
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  if (keyWentDown("space")) {
Ivan Mahonin ec0d7e
    prepareImage();
Ivan Mahonin ec0d7e
    nlPass(nl);
Ivan Mahonin ec0d7e
    saveState();
Ivan Mahonin ec0d7e
    target(fb);
Ivan Mahonin ec0d7e
    clear();
Ivan Mahonin ec0d7e
    restoreState();
Ivan Mahonin ec0d7e
  }
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  noStroke();
Ivan Mahonin ec0d7e
  rectTextured(fbAnim, 0, 0, 512, 512);
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  stroke(COLOR_WHITE);
Ivan Mahonin ec0d7e
  rectTextured(fbMinAnim, 16, 16, 28, 28);
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  noFill();
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  NeuralLayer *nlb = nlBack(nl);
Ivan Mahonin ec0d7e
  textSize(8);
Ivan Mahonin ec0d7e
  int res = 0;
Ivan Mahonin ec0d7e
  for(int i = 0; i < 10; ++i) {
Ivan Mahonin ec0d7e
    if (nlb->a[i] > nlb->a[res]) res = i;
Ivan Mahonin ec0d7e
    textf(16, 90+8*i, "%d: %lf", i, nlb->a[i]);
Ivan Mahonin ec0d7e
  }
Ivan Mahonin ec0d7e
  textSize(16);
Ivan Mahonin ec0d7e
  textf(16, 60, "%d", res);
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
  restoreState();
Ivan Mahonin ec0d7e
}
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
Ivan Mahonin ec0d7e
int main(int largc, char **largv) {
Ivan Mahonin ec0d7e
  windowSetVariableFrameRate();
Ivan Mahonin ec0d7e
  windowSetInit(&init);
Ivan Mahonin ec0d7e
  windowSetDraw(&draw);
Ivan Mahonin ec0d7e
  windowRun();
Ivan Mahonin ec0d7e
  return 0;
Ivan Mahonin ec0d7e
}
Ivan Mahonin ec0d7e