// ConvolutionDemo.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 ConvolutionDemo extends java.applet.Applet { SpikeGraph sg; // AWT elements Float[] xc; Float[] yc; Panel dispArea; Panel controls; // Panel for user controls Panel prob; Label[] pl; Label numl1, numl2; TextField num1, num2; TextField[] p1; TextField[] p2; Button go; GridBagLayout gbl, gblp; GridBagConstraints cc, ccp; // Initialize applet public void init() { go = new Button("Go"); pl = new Label[10]; p1 = new TextField[10]; p2 = new TextField[10]; for (int i = 0; i < 10; i++) { pl[i] = new Label("P(" + i + ") ="); p1[i] = new TextField("0", 4); p2[i] = new TextField("0", 4); } numl1 = new Label("No."); numl2 = new Label("No."); num1 = new TextField("0", 4); num2 = new TextField("O", 4); sg = new SpikeGraph(); 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(sg); 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(p1[i], ccp); prob.add(p1[i]); ccp.gridx = 2; gblp.setConstraints(p2[i], ccp); prob.add(p2[i]); } ccp.gridx = 1; ccp.gridy = 10; gblp.setConstraints(numl1, ccp); prob.add(numl1); ccp.gridy = 11; gblp.setConstraints(num1, ccp); prob.add(num1); ccp.gridx = 2; ccp.gridy = 10; gblp.setConstraints(numl2, ccp); prob.add(numl2); ccp.gridy = 11; gblp.setConstraints(num2, ccp); prob.add(num2); gbl = new GridBagLayout(); controls.setLayout(gbl); cc = new GridBagConstraints(); gbl.setConstraints(go, cc); controls.add(go); validate(); } public float[] convolve(float[] d1, float[] d2) { float[] results = new float[d1.length + d2.length - 1]; for (int i = 0; i < results.length; i++) { results[i] = 0; } for (int i = 0; i < d1.length; i++) { for (int j = 0; j < d2.length; j++) { results[i + j] += d1[i] * d2[j]; } } return results; } // 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(num1.getText()).intValue(), Integer.valueOf(num2.getText()).intValue()); return true; // Generate correct number of tosses } } return super.handleEvent(evt); // Handle other events as usual } // Calculate probabilities public void simulate(int num1, int num2) { xc = new Float[9 * (num1 + num2) + 1]; yc = new Float[9 * (num1 + num2) + 1]; float[] temp1 = new float[10]; float[] temp2 = new float[10]; float[] probs; float sum1 = 0, sum2 = 0; for (int i = 0; i < 10; i++) { temp1[i] = Float.valueOf(p1[i].getText()).floatValue(); temp2[i] = Float.valueOf(p2[i].getText()).floatValue(); sum1 += temp1[i]; sum2 += temp2[i]; } for (int i = 0; i < 10; i++) { temp1[i] = round(temp1[i] / sum1, .001f); p1[i].setText(String.valueOf(temp1[i])); temp2[i] = round(temp2[i] / sum2, .001f); p2[i].setText(String.valueOf(temp2[i])); } probs = new float[1]; probs[0] = 1; for (int i = 0; i < num1; i++) { probs = convolve(temp1, probs); } for (int i = 0; i < num2; i++) { probs = convolve(temp2, probs); } for (int i = 0; i < xc.length; i++) { xc[i] = new Float(i); yc[i] = new Float(probs[i]); } dispArea.remove(sg); sg = new SpikeGraph(xc, yc); // Create new SpikeGraph dispArea.add(sg); // Put up the graph validate(); } public float round(float num, float accuracy) { return accuracy * Math.round(num / accuracy); } }