Java source code of 'jhplot.bsom.Bsom'

package jhplot.bsom;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.Math;
import java.lang.Double;
import java.util.Vector;
import javax.swing.*;
import jhplot.P1D;
import java.lang.Math;


/**
 * Bsom is an application of Bayesian Self-Organizing Maps.
 * 
 * @author Akio Utsugi and Sergei Chekanov
 */
public class Bsom extends BsomDemo {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private BsomDrawArea bsomDrawArea;

	private JTextField inputText;
	private JTextField dstepText;
	private String input_file;
	private JButton outputButton;
	private P1D p1d = null;
	private Vector buf;
	static int INIT = 0;
	static double[][] value;

	public int getNiterations() {
		return bsomDrawArea.ntot;
	}

	public double getAlpha() {
		return bsomDrawArea.alpha;
	}

	public double getBeta() {
		return bsomDrawArea.beta;
	}

	/**
	 * 
	 * 
	 * initialize learning
	 * */

	public void initPar(double alpha, double beta, int units) {

		INIT = 0;
		n_data = 100;
		n_unit = units;
		alpha_min_power = 0.0;
		alpha_max_power = 5.0;
		beta_min_power = 0.0;
		beta_max_power = 5.0;

		xd = 250;
		yd = 175;
		scale = 80;
		dstep = 10;
		initial_weight_level = 0.1;

		input_file = "p1d";

		initial_alpha = alpha;
		initial_beta = beta;

		if (buf != null) {
			n_data = buf.size() / 2;
		} else {
			showStatus("Input is data are required.");
			stop();
		}

		// Draw area
		bsomDrawArea = new BsomDrawArea(this, xd, yd, scale);
		bsomDrawArea.n_data = n_data;
		bsomDrawArea.n_unit = n_unit;
		bsomDrawArea.dstep = dstep;
		bsomDrawArea.initial_weight_level = initial_weight_level;
		bsomDrawArea.alpha = initial_alpha;
		bsomDrawArea.beta = initial_beta;
		bsomDrawArea.buf = buf;

		// System.out.println(outputWeightP1D().toString());

		// System.out.println( drawArea.W.row );
		// System.out.println( drawArea.W.col );

		/*
		 * for (int i = 0; i < p1d.size(); i++) {
		 * drawArea.W.value[i][0]=p1d.getX(i);
		 * drawArea.W.value[i][1]=p1d.getY(i); }
		 */

		// Obtain means.
		P1D init = p1d.copy();
		int n = p1d.size();

		if (units == n) {
			INIT = 1;
			double mx = init.meanX();
			double my = init.meanY();
			value = new double[n][2];
			for (int i = 0; i < n; i++) {
				value[i][0] = init.getX(i);
				value[i][1] = init.getY(i);
			}

			// Move the means to zeros and then get the range.
			double dmax = 0;

			for (int i = 0; i < n; i++) {
				value[i][0] -= mx;
				value[i][1] -= my;
				if (Math.abs(value[i][0]) > dmax) {
					dmax = Math.abs(value[i][0]);
				}
				if (Math.abs(value[i][1]) > dmax) {
					dmax = Math.abs(value[i][1]);
				}
			}

			// Resize the data to go into a 2*2 box.
			double dscale = 2. / dmax;
			// System.out.println(dscale);
			for (int i = 0; i < n; i++) {
				value[i][0] *= dscale;
				value[i][1] *= dscale;
			}

		};
		 // end the case

		bsomDrawArea.init();

		UserData UX = (UserData) bsomDrawArea.X;
		double dscale = UX.dscale;
		// System.out.println(dscale);

		drawArea = bsomDrawArea;
		drawArea.W.init();

		/*
		 * for (int i=0; i();
		this.p1d = p1d;
		for (int i = 0; i < p1d.size(); i++) {
			buf.addElement(new Double(p1d.getX(i)));
			buf.addElement(new Double(p1d.getY(i)));
			// System.out.println(p1d.getX(i));
			// System.out.println(p1d.getY(i));
		}
	}

	public void loadData(String input_file) {

		this.buf = new Vector();
		this.p1d = new P1D(input_file);
		for (int i = 0; i < p1d.size(); i++) {
			buf.addElement(new Double(p1d.getX(i)));
			buf.addElement(new Double(p1d.getY(i)));
		}

	}

	public void reloadData(String input_file) {

		if (p1d != null)
			loadData(p1d);

		bsomDrawArea.alpha = initial_alpha;
		bsomDrawArea.beta = initial_beta;
		bsomDrawArea.buf = buf;
		bsomDrawArea.auto_learn = false;
		bsomDrawArea.learn = false;
		bsomDrawArea.initData();
		bsomDrawArea.W.init();
		bsomDrawArea.draw_new_data = true;

		autoButton.setSelected(false);
		learnButton.setSelected(false);
		alphaSlider.setValueOfSlider(initial_alpha);
		betaSlider.setValueOfSlider(initial_beta);
		repaint();
	}

	public void outputWeight() {
		int i;
		double x, y;
		Weight W = bsomDrawArea.W;
		UserData UX = (UserData) bsomDrawArea.X;
		double dscale = UX.dscale;
		double mx = UX.mx;
		double my = UX.my;

		for (i = 0; i < W.row; i++) {
			x = W.value[i][0] / dscale + mx;
			y = W.value[i][1] / dscale + my;
			System.out.println(x + " " + y);
		}
		System.out.println(" ");
	}

	/**
	 * Return results
	 * 
	 * @return P1D with results
	 */
	public P1D outputWeightP1D() {
		int i;
		double x, y;
		Weight W = bsomDrawArea.W;
		UserData UX = (UserData) bsomDrawArea.X;
		double dscale = UX.dscale;
		double mx = UX.mx;
		double my = UX.my;

		P1D p1d = new P1D("MSOM results");
		for (i = 0; i < W.row; i++) {
			x = W.value[i][0] / dscale + mx;
			y = W.value[i][1] / dscale + my;
			p1d.add(x, y);
		}
		return p1d;
	}

	/**
	 * * Generate error message * * @param a * Message
	 * */
	private void showStatus(String a) {

		JOptionPane dialogError = new JOptionPane();
		JOptionPane.showMessageDialog(dialogError, a, "Error",
				JOptionPane.ERROR_MESSAGE);
	}






}