// FixedWindow.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 FixedWindow	extends java.awt.Frame{	Panel dispArea;	Panel controls;		// Panel for user controls	Panel pPanel;		TextField[][] P;	Matrix pMat, wMat, xMat, zMat, cMat;	float[][] rls;	float[][] cls;	Matrix rows, columns1, columns2;	Label pLab, wLab;		Button go;		GridBagLayout gbl, pgbl, dgbl;	GridBagConstraints cc, pcc, dcc;		int size;		Color labC;		public FixedWindow(int s) {		super("FixedVector");		size = s;		}			// Initialize applet	public void init()	{			go = new Button("Go");				rls = new float[size][1];		for (int i = 0; i < size; i++) {			rls[i][0] = i + 1;			}				cls = new float[1][size];		for (int i = 0; i < size; i++) {			cls[0][i] = i + 1;			}				if (size == 5) {			P = new TextField[5][5];			P[0][0] = new TextField("0", 4);			P[0][1] = new TextField("1", 4);			P[0][2] = new TextField("0", 4);			P[0][3] = new TextField("0", 4);			P[0][4] = new TextField("0", 4);			P[1][0] = new TextField(".25", 4);			P[1][1] = new TextField("0", 4);			P[1][2] = new TextField(".75", 4);			P[1][3] = new TextField("0", 4);			P[1][4] = new TextField("0", 4);			P[2][0] = new TextField("0", 4);			P[2][1] = new TextField(".5", 4);			P[2][2] = new TextField("0", 4);			P[2][3] = new TextField(".5", 4);			P[2][4] = new TextField("0", 4);			P[3][0] = new TextField("0", 4);			P[3][1] = new TextField("0", 4);			P[3][2] = new TextField(".75", 4);			P[3][3] = new TextField("0", 4);			P[3][4] = new TextField(".25", 4);			P[4][0] = new TextField("0", 4);			P[4][1] = new TextField("0", 4);			P[4][2] = new TextField("0", 4);			P[4][3] = new TextField("1", 4);			P[4][4] = new TextField("0", 4);		}		else {			P = new TextField[size][size];			for (int i = 0; i < size; i++) {				for (int j = 0; j < size; j++) {					P[i][j] = new TextField("0", 4);				}			}		}						pLab = new Label("P = ");		pLab.setAlignment(Label.RIGHT);		wLab = new Label("w = ");		wLab.setAlignment(Label.RIGHT);				labC = new Color(100, 0, 0);				rows = new Matrix(rls);		rows.setColor(labC);		columns1 = new Matrix(cls);		columns1.setColor(labC);		columns2 = new Matrix(cls);		columns2.setColor(labC);				dispArea = new Panel();				// Set up window		controls = new Panel();		pPanel = new Panel();		setLayout(new BorderLayout(5, 5));				add("South", controls);		add("Center", dispArea);				pgbl = new GridBagLayout();		pcc = new GridBagConstraints();		pPanel.setLayout(pgbl);		for (int r = 0; r < size; r++) {			for (int c = 0; c < size; c++) {				pcc.gridx = c;				pcc.gridy = r;				pgbl.setConstraints(P[r][c], pcc);				pPanel.add(P[r][c]);			}			}				dgbl = new GridBagLayout();		dcc = new GridBagConstraints();		dispArea.setLayout(dgbl);		dcc.fill = GridBagConstraints.BOTH;		dcc.gridx = 0;		dcc.gridy = size / 2;		dcc.gridwidth = 2;		dcc.gridheight = 1;		dgbl.setConstraints(pLab, dcc);		dispArea.add(pLab);				dcc.gridx = 2;		dcc.gridy = 1;		dcc.gridwidth = 1;		dcc.gridheight = size;		dgbl.setConstraints(rows, dcc);		dispArea.add(rows);				dcc.gridx = 3;		dcc.gridy = 0;		dcc.gridwidth = size;		dcc.gridheight = 1;		dgbl.setConstraints(columns1, dcc);		dispArea.add(columns1);				dcc.gridx = 3;		dcc.gridy = 1;		dcc.gridwidth = size;		dcc.gridheight = size;		dgbl.setConstraints(pPanel, dcc);		dispArea.add(pPanel);				dcc.gridx = 0;		dcc.gridy = size + 2;		dcc.gridwidth = 2;			dcc.gridheight = 1;		dgbl.setConstraints(wLab, dcc);		dispArea.add(wLab);				dcc.gridx = 3;		dcc.gridy = 1 + size;		dcc.gridwidth = size;		dcc.gridheight = 1;		dgbl.setConstraints(columns2, dcc);		dispArea.add(columns2);				pMat = new Matrix(P);				xMat = Matrix.add(Matrix.subtract(Matrix.identity(size), pMat),			Matrix.con(size, size));		zMat = xMat.inverse();		cMat = Matrix.con(1, size);		wMat = Matrix.multiply(cMat, zMat);		wMat.round(.0001f);				dcc.gridx = 3;		dcc.gridy = 2 + size;		dcc.gridwidth = size;		dcc.gridheight = 1;		dgbl.setConstraints(wMat, dcc);		dispArea.add(wMat);				gbl = new GridBagLayout();		controls.setLayout(gbl);				cc = new GridBagConstraints();				cc.gridx = 0;		cc.gridy = 0;		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();        		return true;					// Generate correct number of tosses			}		}		if (evt.id == Event.WINDOW_DESTROY) {			hide();			dispose();			}		return super.handleEvent(evt);	// Handle other events as usual	}		// Calculate probabilities    public void simulate()    {	    	dispArea.remove(wMat);    	    	pMat = new Matrix(P);		float[][] qArr = pMat.toArray();		float[][] rArr = wMat.toArray();		float total;		for (int r = 0; r < qArr.length; r++) {			total = 0;			for (int c = 0; c < qArr[0].length; c++) {				total += qArr[r][c];			}				for (int c = 0; c < qArr[0].length; c++) {				qArr[r][c] = round(qArr[r][c] / total, .001f);			}				}				for (int r = 0; r < qArr.length; r++) {			for (int c = 0; c < qArr[0].length; c++) {				P[r][c].setText(String.valueOf(qArr[r][c]));			}			}				pMat = new Matrix(qArr);				xMat = Matrix.add(Matrix.subtract(Matrix.identity(size), pMat),			Matrix.con(size, size));		zMat = xMat.inverse();		cMat = Matrix.con(1, size);		wMat = Matrix.multiply(cMat, zMat);		wMat.round(.0001f);				dcc.gridx = 3;		dcc.gridy = 2 + size;		dcc.gridwidth = size;		dcc.gridheight = 1;		dgbl.setConstraints(wMat, dcc);		dispArea.add(wMat);    	   	 	validate();	}		public float round(float num, float accuracy) {		return accuracy * Math.round(num / accuracy);	}	}
