// Branch.java

// Written by Julian Devlin, 8/97, for the text book
// "Introduction to Probability," by Charles M. Grinstead & J. Laurie Snell

import java.applet.Applet;
import java.awt.*;

public class Branch
	extends java.applet.Applet
{
	TextArea ta;				// AWT elements
	
	Panel dispArea;
	Panel controls;		// Panel for user controls
	Panel prob;
	
	Label numl;			// Controls
	TextField num;
	
	Label[] pl;
	TextField[] p;
	
	Button go;
	
	GridBagLayout gbl, gblp;
	GridBagConstraints cc, ccp;
	
	float[] density;
	float mean, std;
		
	// Initialize applet
	public void init()
	{	
		numl = new Label("Maximum generations = ");			// Create controls
		num = new TextField("10", 4);
		go = new Button("Go");
		
		pl = new Label[10];
		p = new TextField[10];
		for (int i = 0; i < 10; i++) {
			pl[i] = new Label("P(" + i + ") =");
			p[i] = new TextField("0", 4);	
		}
		p[0].setText(".2");
		p[1].setText(".5");
		p[2].setText(".3");
		
		ta = new TextArea(15, 20);
		
		dispArea = new Panel();				// Set up window
		controls = new Panel();
		prob = new Panel();
		setLayout(new BorderLayout(5, 5));
		
		add("South", controls);
		add("West", prob);
		add("Center", dispArea);
		
		dispArea.setLayout(new GridLayout(1, 1));
		dispArea.add(ta);
		
		gblp = new GridBagLayout();
		ccp = new GridBagConstraints();
		prob.setLayout(gblp);
		for (int i = 0; i < 10; i++) {
			ccp.gridx = 0;
			ccp.gridy = i;
			gblp.setConstraints(pl[i], ccp);
			prob.add(pl[i]);
			ccp.gridx = 1;
			gblp.setConstraints(p[i], ccp);
			prob.add(p[i]);	
		}
		
		gbl = new GridBagLayout();
		controls.setLayout(gbl);
		
		cc = new GridBagConstraints();
		
		cc.gridx = 0;
		cc.gridy = 0;
		gbl.setConstraints(numl, cc);
		controls.add(numl);
		
		cc.gridx = 1;
		gbl.setConstraints(num, cc);
		controls.add(num);
		
		cc.gridx = 0;
		cc.gridy = 1;
		cc.gridwidth = 2;
		gbl.setConstraints(go, cc);
		controls.add(go);
		
		validate();
	}
	
	// Handle events
	public boolean handleEvent(Event evt)
	{
		String minStr, maxStr;
		if (evt.target instanceof Button)
		{
			if (evt.target == go && evt.id == Event.ACTION_EVENT)	// When button is clicked
			{
        		simulate(Integer.valueOf(num.getText()).intValue());
        		return true;					// Generate correct number of tosses
			}
		}
		return super.handleEvent(evt);	// Handle other events as usual
	}
	
	public float genFunctionDiscrete(float[] prob, float x) {
		float sum = 0;
		for (int i = 0; i < prob.length; i++) {
			if (x == 0 && i == 0)
				sum += prob[i];			// 0^0 must be defined as one
			else
				sum += prob[i] * (float) Math.pow((double) x, (double) i);
		}
		return sum;
	}
	
	// Calculate probabilities
    public void simulate(int num)
    {	
    	ta.setText("");
    	float[] prob = new float[10];
		float probability = 0;
		float sum = 0;
		for (int i = 0; i < 10; i++) {
			prob[i] = Float.valueOf(p[i].getText()).floatValue();	
			sum += prob[i];
		}
		for (int i = 0; i < 10; i++) {
			prob[i] = round(prob[i] / sum, .001f);
			p[i].setText(String.valueOf(prob[i]));
		}
		
		for (int g = 1; g <= num; g++) {
			probability = genFunctionDiscrete(prob, probability);
			ta.appendText(g + "                   " + probability + "\n");	
		}
		
		validate();
	}
	
	public float round(float num, float accuracy) {
		return accuracy * Math.round(num / accuracy);
	}
	
}




