View this PageEdit this PageUploads to this PageHistory of this PageTop of the SwikiRecent ChangesSearch the SwikiHelp Guide

HopfieldApp

//  A Simple Binary Hopfield Artificial Neural Network
//  by Matt Hill, written for fun, to learn Java, ie, no guarantees
//  or stylistic endrosements.
//  Based on an a-life program by A.F. Slater (http://www.cee.hw.ac.uk/~afs/)
//

import java.applet.*;
import java.awt.*;
import java.lang.*;

class SettleThread extends Thread {
	PatternClass pat;
	HopMem	hop;
	final int itermax = 10;
	final int thresh  = 0;
	
  SettleThread(HopMem Hmem, PatternClass c_p) {
	pat = c_p;
	hop = Hmem; 
	//outp.init(c_p);
  }

  public void run() {
	int iter=0;

	PatternClass lastpat = new PatternClass();

	lastpat.init(pat);

	// System.out.println("About to settle");
	while ((iter < itermax) && (hop.ham(pat, lastpat) > thresh)) {
		lastpat = pat.myclone();
		pat     = hop.iterate(pat);
		iter++;
	}
	// System.out.println("Done settling");

  }
}	// End class SettleThread


class HopMem {
	boolean settling;
	int size;
	int weights[][];
	SettleThread sthread;
	HopfieldApp happ;

  public void debug(PatternClass pat) {
	int x, y;

	System.out.println("Current Pattern: ");
	for (x=0;x 0) {
      // System.out.println("Hopfield: paint: loc "+loc+" xpos "+xpos+" ypos "+ypos);
	g.fillRect(xpos, ypos, current_pattern.blocksize, current_pattern.blocksize);
	}
     } // End for loc

    //g.drawRect(1, 1, xsize - 3, ysize - 3);
    g.setColor(Color.black);
    g.drawRect(0, 0, xsize, ysize - 1);
  }

  /**
   * Mouse methods
   */

  public boolean mouseDown(Event evt, int x, int y) {
    Graphics hop_graphics;

    // getFocus();

    // System.out.println("Mouse Down!");

    int click_loc = (int)((x/current_pattern.blocksize) + 
 		    ((int)(y/current_pattern.blocksize) * (int)(xsize/current_pattern.blocksize)) );

    if ((x <= xsize) && (y <=ysize)) {

      current_pattern.toggle(click_loc);

      hop_graphics = mem.happ.getGraphics();

      if (current_pattern.pattern[click_loc] > 0)	{
  	  hop_graphics.setColor(Color.red);
	  hop_graphics.fillRect(x-(x % current_pattern.blocksize), y-(y%current_pattern.blocksize),
	  	     current_pattern.blocksize, current_pattern.blocksize );
      } else {
 	  hop_graphics.clearRect(x-(x % current_pattern.blocksize), y-(y%current_pattern.blocksize),
		     current_pattern.blocksize, current_pattern.blocksize);
      }
    }
    return true;
  }

/*  public void mouseDrag(int x, int y) {
    mouseDown(x,y);
  } */

  public void toggle_settle() {
	if (!mem.settling) {
		mem.settling=true;
		mem.settledown(current_pattern);
		mem.settling=false;
		} else {
		current_pattern = mem.stopsettle();
		mem.settling=false;
		}
  }

  public boolean keyDown(Event evt, int key) {
    char c=(char)key;

	switch (c) {
		case 's' :  toggle_settle();
			    break;
		case ' ' :  current_pattern = mem.iterate(current_pattern);
			    //repaint();
			    //System.out.println("mack was 2.  is now "+mack);
			    break;
		case 'r' :  current_pattern.randomize();
      			    //mem.init(current_pattern);
      			    repaint();
			    break;
		case 'c' :  current_pattern.init();
      			    repaint();
			    break;
		case 'n' :  mem.init(current_pattern);
			    break;
		case 'i' :  mem.impose(current_pattern);
			    break;
		case 'd' :  mem.debug(current_pattern);
			    break;
		case 'q' :  repaint();
			    break;
	} 	// End switch (c)

	return true;

  }	// End keyDown

}  	// End applet HopfieldApp




Links to this Page