package bsearch.app ; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; import javax.swing.BorderFactory; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.border.BevelBorder; import javax.swing.border.SoftBevelBorder; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.SwingUtilities; import org.xml.sax.SAXException; import bsearch.algorithms.SearchMethod; import bsearch.algorithms.SearchMethodLoader; import bsearch.nlogolink.NetLogoLinkException; import bsearch.representations.ChromosomeFactory; import bsearch.representations.ChromosomeTypeLoader; import bsearch.space.ParameterSpec; import bsearch.space.SearchSpace; import bsearch.util.GeneralUtils; import java.awt.FlowLayout; /* * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public strictfp class BehaviorSearchGUI extends javax.swing.JFrame { private static final long serialVersionUID = 1L; private static String getWindowTitleSuffix() { return " - BehaviorSearch " + GeneralUtils.getVersionString(); } { //Set Look & Feel try { if( System.getProperty( "os.name" ).startsWith( "Mac" ) || System.getProperty( "os.name" ).startsWith( "Windows" )) { javax.swing.UIManager.setLookAndFeel ( javax.swing.UIManager.getSystemLookAndFeelClassName() ) ; } else if (System.getProperty( "swing.defaultlaf" ) == null ) { // On Linux, I prefer the Nimbus LAF... but users can override by setting // the swing.defaultlaf property. javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); } } catch(Exception e) { e.printStackTrace(); } } private JMenuBar jMenuBar; private JMenu jMenuFile; private JMenuItem jMenuItemNew ; private JMenuItem jMenuItemSaveAs; private JMenuItem jMenuItemSave; private JMenuItem jMenuItemOpen; private JMenuItem jMenuItemExit ; private JSeparator jSeparator1; private JLabel jLabel1; private JLabel jLabel2; private JLabel jLabel3; private JLabel jLabel4; private JLabel jLabel5; private JLabel jLabel6; private JLabel jLabel7; private JLabel jLabel8; private JLabel jLabel10; private JLabel jLabel12; private JLabel jLabelSep; private JPanel jPanelSampling; private JPanel jPanelMeasureAfter; private JScrollPane jScrollPane1; private JTable jTableSearchMethodParams; private JPanel jPanel1; private JButton jButtonHelpSearchSpace; private JLabel jLabelDerivWRT; private JLabel jLabelDerivDELTA; private JTextField jTextFieldFitnessDerivativeDelta; private JComboBox<String> jComboBoxFitnessDerivativeParameter; private JCheckBox jCheckBoxTakeDerivative; private JCheckBox jCheckBoxFitnessDerivativeUseAbs; private JPanel jPanelDeriv; private JPanel jPanelDeriv2; private JButton jButtonHelpSearchSpaceRepresentation; private JSeparator jSeparator2; private JMenuItem jMenuItemOpenExample; private JMenuItem jMenuItemAbout; private JMenuItem jMenuItemTutorial; private JMenu jMenuHelp; private JTextField jTextFieldBestChecking; private JLabel jLabel19; private JCheckBox jCheckBoxCaching; private JButton jButtonSuggestParamRanges; private JButton jButtonHelpEvaluation; private JButton jButtonHelpSearchMethod; private JTextField jTextFieldEvaluationLimit; private JLabel jLabel18; private JLabel jLabel9; private JTextField jTextFieldFitnessSamplingRepetitions; private JComboBox<String> jComboBoxFitnessSamplingMethod; private JComboBox<String> jComboBoxSearchMethodType; private JTextField jTextFieldModelStepLimit; private JTextArea jTextAreaParamSpecs; private JButton jButtonBrowseModel; private JTextField jTextFieldMeasureIf; private JLabel jLabel17; private JComboBox<String> jComboBoxFitnessCombineReplications; private JLabel jLabel16; private JLabel jLabel15; private JLabel jLabel14; private JComboBox<String> jComboBoxFitnessCollecting; private JLabel jLabel13; private JComboBox<String> jComboBoxChromosomeType; private JLabel jLabel11; private JScrollPane jScrollPane2; private JTextField jTextFieldModelFile; private JTextField jTextFieldModelStopCondition; private JComboBox<String> jComboBoxFitnessMinMax; private JTextField jTextFieldFitnessMetric; private JTextField jTextFieldModelStepCommands; private JTextField jTextFieldModelSetupCommands; private JButton jButtonRunNow; public static void main(final String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { BehaviorSearchGUI bgui = new BehaviorSearchGUI(); bgui.setLocationRelativeTo(null); bgui.setVisible(true); if (args.length > 0) { File f = new File(args[0]); if (f.exists()) { bgui.openFile(f); } } } }); } public BehaviorSearchGUI() { super(); initGUI(); // mainly Jigloo-generated UI code finishInitWork(); // custom stuff } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); this.addWindowListener(new WindowListener() { public void windowActivated(WindowEvent arg0) { } public void windowClosed(WindowEvent arg0) { } public void windowClosing(WindowEvent arg0) { actionExit(); } public void windowDeactivated(WindowEvent arg0) { } public void windowDeiconified(WindowEvent arg0) { } public void windowIconified(WindowEvent arg0) { } public void windowOpened(WindowEvent arg0) { } }); GridBagLayout thisLayout = new GridBagLayout(); getContentPane().setLayout(thisLayout); this.setTitle("BehaviorSearch - Experiment Editor"); thisLayout.rowWeights = new double[] {0.0, 0.1, 0.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.0, 0.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.0, 0.1, 0.0}; thisLayout.rowHeights = new int[] {7, 25, 10, 25, 25, 25, 25, 20, 25, 10, 25, 25, 25, 25, 20, 20, 20, 23, 20, 7}; thisLayout.columnWeights = new double[] {0.0, 0.1, 0.0, 0.1, 0.0, 0.0}; thisLayout.columnWidths = new int[] {7, 300, 29, 200, 207, 7}; { jMenuBar = new JMenuBar(); setJMenuBar(jMenuBar); { jMenuFile = new JMenu(); jMenuBar.add(jMenuFile); jMenuFile.setText("File"); { jMenuItemNew = new JMenuItem(); jMenuFile.add(jMenuItemNew); jMenuItemNew.setText("New"); jMenuItemNew.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionNew(); } }); } { jMenuItemOpen = new JMenuItem(); jMenuFile.add(jMenuItemOpen); jMenuItemOpen.setText("Open..."); jMenuItemOpen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionOpen(); } }); } { jMenuItemSave = new JMenuItem(); jMenuFile.add(jMenuItemSave); jMenuItemSave.setText("Save"); jMenuItemSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionSave(); } }); } { jMenuItemSaveAs = new JMenuItem(); jMenuFile.add(jMenuItemSaveAs); jMenuItemSaveAs.setText("Save as..."); jMenuItemSaveAs.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionSaveAs(); } }); } { jSeparator1 = new JSeparator(); jMenuFile.add(jSeparator1); } { jMenuItemOpenExample = new JMenuItem(); jMenuFile.add(jMenuItemOpenExample); jMenuItemOpenExample.setText("Open Example..."); jMenuItemOpenExample.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionOpenExample(); } }); } { jSeparator2 = new JSeparator(); jMenuFile.add(jSeparator2); } { jMenuItemExit = new JMenuItem(); jMenuFile.add(jMenuItemExit); jMenuItemExit.setText("Exit"); jMenuItemExit.setMnemonic( java.awt.event.KeyEvent.VK_X); jMenuItemExit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionExit(); } }); } } { jMenuHelp = new JMenu(); jMenuBar.add(jMenuHelp); jMenuHelp.setText("Help"); { jMenuItemTutorial = new JMenuItem(); jMenuHelp.add(jMenuItemTutorial); jMenuItemTutorial.setText("Tutorial"); jMenuItemTutorial.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionHelpTutorial(); } }); } { jMenuItemAbout = new JMenuItem(); jMenuHelp.add(jMenuItemAbout); jMenuItemAbout.setText("About..."); jMenuItemAbout.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionHelpAbout(); } }); } } } { jLabel2 = new JLabel(); getContentPane().add(jLabel2, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel2.setText("Setup: "); jLabel2.setFont(new java.awt.Font("Tahoma",1,11)); } { jTextFieldModelSetupCommands = new JTextField(); getContentPane().add(jTextFieldModelSetupCommands, new GridBagConstraints(4, 3, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); jTextFieldModelSetupCommands.setText("setup"); jTextFieldModelSetupCommands.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jTextFieldModelSetupCommands.setFont(new java.awt.Font("Monospaced",0,11)); } { jTextFieldModelStepCommands = new JTextField(); getContentPane().add(jTextFieldModelStepCommands, new GridBagConstraints(4, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); jTextFieldModelStepCommands.setText("go"); jTextFieldModelStepCommands.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jTextFieldModelStepCommands.setFont(new java.awt.Font("Monospaced",0,11)); } { jLabel3 = new JLabel(); getContentPane().add(jLabel3, new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel3.setText("Step: "); jLabel3.setFont(new java.awt.Font("Tahoma",1,11)); } { jLabel10 = new JLabel(); getContentPane().add(jLabel10, new GridBagConstraints(3, 7, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel10.setText("Stop If: "); jLabel10.setFont(new java.awt.Font("SansSerif",1,11)); } { jTextFieldModelStopCondition = new JTextField(); getContentPane().add(jTextFieldModelStopCondition, new GridBagConstraints(4, 7, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); jTextFieldModelStopCondition.setFont(new java.awt.Font("Monospaced",0,11)); jTextFieldModelStopCondition.setText("count turtles > 100"); jTextFieldModelStopCondition.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); } { jLabel4 = new JLabel(); getContentPane().add(jLabel4, new GridBagConstraints(3, 5, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel4.setText("Measure: "); jLabel4.setFont(new java.awt.Font("SansSerif",1,11)); } { jTextFieldFitnessMetric = new JTextField(); getContentPane().add(jTextFieldFitnessMetric, new GridBagConstraints(4, 5, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); jTextFieldFitnessMetric.setText("mean [energy] of turtles"); jTextFieldFitnessMetric.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jTextFieldFitnessMetric.setFont(new java.awt.Font("Monospaced",0,11)); } { jLabelSep = new JLabel(); getContentPane().add(jLabelSep, new GridBagConstraints(1, 9, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); jLabelSep.setBackground(new java.awt.Color(0,0,0)); jLabelSep.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); jLabelSep.setPreferredSize(new java.awt.Dimension(0, 5)); } { jLabel6 = new JLabel(); getContentPane().add(jLabel6, new GridBagConstraints(1, 10, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel6.setText("Search Method Configuration"); jLabel6.setFont(new java.awt.Font("SansSerif",1,14)); jLabel6.setBounds(197, 32, 138, 19); } { jLabel7 = new JLabel(); getContentPane().add(jLabel7, new GridBagConstraints(3, 10, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel7.setText("Objective / Fitness Function"); jLabel7.setFont(new java.awt.Font("SansSerif",1,14)); } { jPanelSampling = new JPanel(); getContentPane().add(jPanelSampling, new GridBagConstraints(3, 13, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanelSampling.setOpaque(false); { ComboBoxModel<String> jComboBoxSamplingMethodModel = new DefaultComboBoxModel<String>( new String[] { "Fixed Sampling" }); //, "Adaptive Sampling" }); jComboBoxFitnessSamplingMethod = new JComboBox<String>(); jPanelSampling.add(jComboBoxFitnessSamplingMethod); jComboBoxFitnessSamplingMethod.setModel(jComboBoxSamplingMethodModel); jComboBoxFitnessSamplingMethod.setEditable(false); jComboBoxFitnessSamplingMethod.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { actionSamplingMethodChanged(); } }); } { jTextFieldFitnessSamplingRepetitions = new JTextField(); jPanelSampling.add(jTextFieldFitnessSamplingRepetitions); jTextFieldFitnessSamplingRepetitions.setText("10"); jTextFieldFitnessSamplingRepetitions.setPreferredSize(new java.awt.Dimension(50, 20)); jTextFieldFitnessSamplingRepetitions.setFont(new java.awt.Font("Monospaced",0,11)); jTextFieldFitnessSamplingRepetitions.setToolTipText("How many times should the model be run, for a given setting of the parameters?"); } { jLabel8 = new JLabel(); jPanelSampling.add(jLabel8); jLabel8.setText("replicates"); } } { jScrollPane1 = new JScrollPane(); getContentPane().add(jScrollPane1, new GridBagConstraints(1, 12, 1, 4, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); jScrollPane1.setPreferredSize(new java.awt.Dimension(202, 58)); { TableModel jTableSearchMethodParamsModel = new DefaultTableModel( new String[][] { { "population", "100" }, { "mutation-rate", "1.0" } , { "crossover-rate", "0.70" }}, new String[] { "Parameter", "Value" }); jTableSearchMethodParams = new JTable(); jScrollPane1.setViewportView(jTableSearchMethodParams); jTableSearchMethodParams.setModel(jTableSearchMethodParamsModel); jTableSearchMethodParams.getColumn(jTableSearchMethodParams.getColumnName(0)).setPreferredWidth(120); } } { jButtonRunNow = new JButton(); getContentPane().add(jButtonRunNow, new GridBagConstraints(3, 18, 2, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0)); jButtonRunNow.setText("Run BehaviorSearch"); jButtonRunNow.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionRunNow(); } }); } { ComboBoxModel<String> jComboBoxMinMaxModel = new DefaultComboBoxModel<String>( new String[] { "Minimize Fitness", "Maximize Fitness" }); jComboBoxFitnessMinMax = new JComboBox<String>(); getContentPane().add(jComboBoxFitnessMinMax, new GridBagConstraints(4, 11, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jComboBoxFitnessMinMax.setModel(jComboBoxMinMaxModel); } { jPanelMeasureAfter = new JPanel(); getContentPane().add(jPanelMeasureAfter, new GridBagConstraints(4, 8, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); jPanelMeasureAfter.setOpaque(false); { jTextFieldModelStepLimit = new JTextField(); jPanelMeasureAfter.add(jTextFieldModelStepLimit); jTextFieldModelStepLimit.setText("100"); jTextFieldModelStepLimit.setPreferredSize(new java.awt.Dimension(50, 20)); jTextFieldModelStepLimit.setFont(new java.awt.Font("Monospaced",0,11)); } { jLabel5 = new JLabel(); jPanelMeasureAfter.add(jLabel5); jLabel5.setText("model steps"); } } { jLabel12 = new JLabel(); getContentPane().add(jLabel12, new GridBagConstraints(1, 2, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); jLabel12.setBackground(new java.awt.Color(0,0,0)); jLabel12.setPreferredSize(new java.awt.Dimension(0,5)); jLabel12.setBorder(new SoftBevelBorder(BevelBorder.LOWERED,null,null,null,null)); } { jTextFieldModelFile = new JTextField(); getContentPane().add(jTextFieldModelFile, new GridBagConstraints(1, 1, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); jTextFieldModelFile.setText("Model.nlogo"); jTextFieldModelFile.setToolTipText("Path to .nlogo file - may be specified relative to the folder containing the '.bsearch' file"); } { jButtonBrowseModel = new JButton(); getContentPane().add(jButtonBrowseModel, new GridBagConstraints(4, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); jButtonBrowseModel.setText("Browse for model..."); jButtonBrowseModel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionBrowseModel(); } }); } { jScrollPane2 = new JScrollPane(); getContentPane().add(jScrollPane2, new GridBagConstraints(1, 4, 1, 4, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); { jTextAreaParamSpecs = new JTextArea(); jTextAreaParamSpecs.setText("[\"variable1\" [0 1 10]] \n[\"variable2\" [0.0 \"C\" 5.0]] \n[\"variable3\" \"moore\" \"vonN\"] \n[\"variable4\" true false]"); jTextAreaParamSpecs.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jTextAreaParamSpecs.setFont(new java.awt.Font("Monospaced",0,11)); jTextAreaParamSpecs.setAutoscrolls(true); jScrollPane2.setViewportView(jTextAreaParamSpecs); } } { jLabel11 = new JLabel(); getContentPane().add(jLabel11, new GridBagConstraints(1, 17, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel11.setText("Search Encoding Representation"); jLabel11.setFont(new java.awt.Font("SansSerif",1,11)); } { ComboBoxModel<String> jComboBoxChromosomeTypeModel = new DefaultComboBoxModel<String>( new String[] { "MixedTypeChromosome" }); jComboBoxChromosomeType = new JComboBox<String>(); getContentPane().add(jComboBoxChromosomeType, new GridBagConstraints(1, 18, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jComboBoxChromosomeType.setModel(jComboBoxChromosomeTypeModel); } { jLabel13 = new JLabel(); getContentPane().add(jLabel13, new GridBagConstraints(3, 12, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel13.setText("Collected measure: "); jLabel13.setFont(new java.awt.Font("SansSerif",1,11)); } { ComboBoxModel<String> jComboBox1Model = new DefaultComboBoxModel<String>( new String[] { "Item One", "Item Two" }); jComboBoxFitnessCollecting = new JComboBox<String>(); getContentPane().add(jComboBoxFitnessCollecting, new GridBagConstraints(4, 12, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jComboBoxFitnessCollecting.setModel(jComboBox1Model); } { jLabel14 = new JLabel(); getContentPane().add(jLabel14, new GridBagConstraints(3, 14, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel14.setText("Combine replicates: "); jLabel14.setFont(new java.awt.Font("SansSerif",1,11)); } { jLabel15 = new JLabel(); getContentPane().add(jLabel15, new GridBagConstraints(3, 8, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel15.setText("Step Limit: "); jLabel15.setFont(new java.awt.Font("SansSerif",1,11)); } { jLabel16 = new JLabel(); getContentPane().add(jLabel16, new GridBagConstraints(3, 11, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel16.setText("Goal: "); jLabel16.setFont(new java.awt.Font("SansSerif",1,11)); } { ComboBoxModel<String> jComboBox1Model = new DefaultComboBoxModel<String>( new String[] { "Item One", "Item Two" }); jComboBoxFitnessCombineReplications = new JComboBox<String>(); getContentPane().add(jComboBoxFitnessCombineReplications, new GridBagConstraints(4, 14, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jComboBoxFitnessCombineReplications.setModel(jComboBox1Model); } { jLabel17 = new JLabel(); getContentPane().add(jLabel17, new GridBagConstraints(3, 6, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel17.setText("Measure If: "); jLabel17.setFont(new java.awt.Font("SansSerif",1,11)); } { jTextFieldMeasureIf = new JTextField(); getContentPane().add(jTextFieldMeasureIf, new GridBagConstraints(4, 6, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); jTextFieldMeasureIf.setFont(new java.awt.Font("Monospaced",0,11)); jTextFieldMeasureIf.setText("true"); jTextFieldMeasureIf.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jTextFieldMeasureIf.setToolTipText("e.g. \"(ticks mod 100) = 0\", or \"member? ticks [50 100 200]\""); } { jLabel9 = new JLabel(); getContentPane().add(jLabel9, new GridBagConstraints(3, 16, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel9.setText("Evaluation limit: "); jLabel9.setFont(new java.awt.Font("SansSerif",1,11)); } { jPanel1 = new JPanel(); FlowLayout jPanel1Layout = new FlowLayout(); jPanel1Layout.setAlignment(FlowLayout.LEFT); jPanel1.setLayout(jPanel1Layout); getContentPane().add(jPanel1, new GridBagConstraints(4, 16, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); jPanel1.setOpaque(false); { jTextFieldEvaluationLimit = new JTextField(); jPanel1.add(jTextFieldEvaluationLimit); jTextFieldEvaluationLimit.setFont(new java.awt.Font("Monospaced",0,11)); jTextFieldEvaluationLimit.setText("300"); jTextFieldEvaluationLimit.setPreferredSize(new java.awt.Dimension(50, 20)); jTextFieldEvaluationLimit.setToolTipText("Stop the search after this many model runs have occurred."); } { jLabel18 = new JLabel(); jPanel1.add(jLabel18); jLabel18.setText("model runs"); } } { jLabel1 = new JLabel(); getContentPane().add(jLabel1, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel1.setText("Parameter Specification"); jLabel1.setBounds(197, 32, 138, 19); jLabel1.setFont(new java.awt.Font("SansSerif",1,14)); jLabel1.setForeground(new java.awt.Color(0,0,0)); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); } { jButtonHelpSearchSpace = new JButton(); getContentPane().add(jButtonHelpSearchSpace, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jButtonHelpSearchSpace.setText("?"); jButtonHelpSearchSpace.setToolTipText("Help about Search Space Specification"); jButtonHelpSearchSpace.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionHelpSearchSpace(); } }); } { jButtonHelpSearchMethod = new JButton(); getContentPane().add(jButtonHelpSearchMethod, new GridBagConstraints(1, 11, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jButtonHelpSearchMethod.setText("?"); jButtonHelpSearchMethod.setToolTipText("Help about this Search Method"); jButtonHelpSearchMethod.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionHelpSearchMethod(); } }); } { ComboBoxModel<String> jComboBoxSearchMethodModel = new DefaultComboBoxModel<String>( new String[] { "xxxx", "yyyy" }); jComboBoxSearchMethodType = new JComboBox<String>(); getContentPane().add(jComboBoxSearchMethodType, new GridBagConstraints(1, 11, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jComboBoxSearchMethodType.setModel(jComboBoxSearchMethodModel); jComboBoxSearchMethodType.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { actionUpdateSearchMethodParams(); } }); } { jButtonHelpEvaluation = new JButton(); getContentPane().add(jButtonHelpEvaluation, new GridBagConstraints(4, 10, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jButtonHelpEvaluation.setText("?"); jButtonHelpEvaluation.setToolTipText("Help about Evaluation"); jButtonHelpEvaluation.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionHelpEvaluation(); } }); } { jButtonSuggestParamRanges = new JButton(); getContentPane().add(jButtonSuggestParamRanges, new GridBagConstraints(1, 8, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jButtonSuggestParamRanges.setText("Load param ranges from model interface"); jButtonSuggestParamRanges.setToolTipText("Sets the search space specification based on sliders, choosers, etc., from model interface tab."); jButtonSuggestParamRanges.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionSuggestParamRanges(); } }); } { jCheckBoxCaching = new JCheckBox(); getContentPane().add(jCheckBoxCaching, new GridBagConstraints(1, 16, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jCheckBoxCaching.setText("Use fitness caching"); jCheckBoxCaching.setToolTipText("If fitness caching is turned on then the result of running the model with certain parameters gets saved so the model won't be re-run if a run with those same parameters are requested again."); jCheckBoxCaching.setSelected(true); } { jLabel19 = new JLabel(); getContentPane().add(jLabel19, new GridBagConstraints(3, 17, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jLabel19.setText("BestChecking replicates: "); jLabel19.setFont(new java.awt.Font("SansSerif",1,11)); } { jTextFieldBestChecking = new JTextField(); getContentPane().add(jTextFieldBestChecking, new GridBagConstraints(4, 17, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jTextFieldBestChecking.setFont(new java.awt.Font("Monospaced",0,11)); jTextFieldBestChecking.setText("10"); jTextFieldBestChecking.setPreferredSize(new java.awt.Dimension(50,20)); jTextFieldBestChecking.setOpaque(true); jTextFieldBestChecking.setMinimumSize(new java.awt.Dimension(50, 27)); jTextFieldBestChecking.setToolTipText("BestChecking: running another N independent model runs to get an unbiased estimate of the objective function for each \"best\" individual that's found."); } { jButtonHelpSearchSpaceRepresentation = new JButton(); getContentPane().add(jButtonHelpSearchSpaceRepresentation, new GridBagConstraints(1, 18, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jButtonHelpSearchSpaceRepresentation.setText("?"); jButtonHelpSearchSpaceRepresentation.setToolTipText("Help about this Search Space Representation"); jButtonHelpSearchSpaceRepresentation.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { actionHelpSearchSpaceRepresentation(); } }); } { jPanelDeriv = new JPanel(); jPanelDeriv.setBackground(new Color(214,217,223)); jPanelDeriv.setLayout(new BorderLayout()); getContentPane().add(jPanelDeriv, new GridBagConstraints(3, 15, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); { jCheckBoxTakeDerivative = new JCheckBox(); JPanel temp = new JPanel(); temp.setLayout( new FlowLayout(FlowLayout.CENTER, 40, 10) ); temp.add(jCheckBoxTakeDerivative); jPanelDeriv.add(temp, BorderLayout.NORTH); jCheckBoxTakeDerivative.setText("Take derivative?"); jCheckBoxTakeDerivative.setToolTipText("Instead of using the measure you've specified, use the *change* in that measure (with respect to a certain parameter) for your objective function."); jCheckBoxTakeDerivative.setPreferredSize(new java.awt.Dimension(134, 22)); jCheckBoxTakeDerivative.setFont(new java.awt.Font("SansSerif",1,11)); jCheckBoxTakeDerivative.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent arg0) { updateFitnessDerivativePanel(); } }); jCheckBoxFitnessDerivativeUseAbs = new JCheckBox(); jCheckBoxFitnessDerivativeUseAbs.setText("Use ABS value?"); jCheckBoxFitnessDerivativeUseAbs.setToolTipText("You might want to take the absolute value if you don't care about the direction of the measured change... e.g., for trying to find phase transitions"); jCheckBoxTakeDerivative.setFont(new java.awt.Font("SansSerif",1,11)); temp.add(jCheckBoxFitnessDerivativeUseAbs); } { jPanelDeriv2 = new JPanel(); jPanelDeriv2.setOpaque(false); jPanelDeriv.add(jPanelDeriv2,BorderLayout.CENTER); { jLabelDerivWRT = new JLabel(); jPanelDeriv2.add(jLabelDerivWRT); jLabelDerivWRT.setText("w.r.t."); } { ComboBoxModel<String> jComboBoxFitnessDerivativeParameterModel = new DefaultComboBoxModel<String>( new String[] { "----" }); jComboBoxFitnessDerivativeParameter = new JComboBox<String>(); jComboBoxFitnessDerivativeParameter.setToolTipText("Which parameter should be varied by a small amount to see how much change results?"); Dimension d = jComboBoxFitnessDerivativeParameter.getPreferredSize(); jComboBoxFitnessDerivativeParameter.setPreferredSize(new Dimension(200,d.height)); jPanelDeriv2.add(jComboBoxFitnessDerivativeParameter); jComboBoxFitnessDerivativeParameter.setModel(jComboBoxFitnessDerivativeParameterModel); jComboBoxFitnessDerivativeParameter.addFocusListener(new FocusListener() { public void focusGained(FocusEvent arg0) { updateFitnessDerivativeParameterChoices(); } public void focusLost(FocusEvent arg0) { } }); } { jLabelDerivDELTA = new JLabel(); jPanelDeriv2.add(jLabelDerivDELTA); jLabelDerivDELTA.setText("\u0394="); } { jTextFieldFitnessDerivativeDelta = new JTextField(); jPanelDeriv2.add(jTextFieldFitnessDerivativeDelta); jTextFieldFitnessDerivativeDelta.setText("0.100"); jTextFieldFitnessDerivativeDelta.setToolTipText("How much should be subtracted from the parameter's value, to get the measured change?"); int prefHeight = jTextFieldFitnessDerivativeDelta.getPreferredSize().height; jTextFieldFitnessDerivativeDelta.setPreferredSize(new Dimension(50, prefHeight)); } } } pack(); this.setSize(760, 630); } catch (Exception e) { e.printStackTrace(); } } /////////////////////////////////////////////////////////////////////////////////////////////// //the special comment on the next line marks the remaining code so the Jigloo gui builder won't try to parse it. //$hide>>$ private String defaultProtocolXMLForNewSearch; private File currentFile; private String lastSavedText; private HashMap<String,SearchMethod> searchMethodChoices = new HashMap<String, SearchMethod>(); BehaviorSearch.RunOptions runOptions = null; // keep track of what options they ran the search with last time, // and use those as the offered options when they run again. private File defaultUserDocumentsFolder = new JFileChooser().getCurrentDirectory(); public static void handleError(String msg, java.awt.Container parentContainer) { JOptionPane wrappingTextOptionPane = new JOptionPane(msg, JOptionPane.ERROR_MESSAGE) { private static final long serialVersionUID = 1L; @Override public int getMaxCharactersPerLineCount() { return 58; } }; javax.swing.JDialog dialog = wrappingTextOptionPane.createDialog(parentContainer, "Error!"); dialog.setVisible(true); // javax.swing.JOptionPane.showMessageDialog(this, msg, "ERROR!", JOptionPane.ERROR_MESSAGE); } private void handleError(String msg) { handleError(msg,this); } private void finishInitWork() { setIconImage(java.awt.Toolkit.getDefaultToolkit().getImage(GeneralUtils.getResource("icon_behaviorsearch.png").getAbsolutePath())); // Set a few keyboard shortcuts for menu item jMenuItemNew.setAccelerator( javax.swing.KeyStroke.getKeyStroke( 'N' , java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ) ) ; jMenuItemOpen.setAccelerator( javax.swing.KeyStroke.getKeyStroke( 'O' , java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ) ) ; jMenuItemSave.setAccelerator( javax.swing.KeyStroke.getKeyStroke( 'S' , java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ) ) ; // load our default 'new' search configuration from a file try { defaultProtocolXMLForNewSearch = GeneralUtils.stringContentsOfFile(GeneralUtils.getResource("defaultNewSearch.xml")); } catch (java.io.FileNotFoundException ex) { handleError(ex.getMessage()); System.exit(1); } initComboBoxes(); actionNew(); } /* * Some of the choices for combo boxes need to be filled in dynamically, based on reading files and such. */ private void initComboBoxes() { ////////////// SearchMethods DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>) jComboBoxSearchMethodType.getModel(); model.removeAllElements(); List<String> names = null; try { names = SearchMethodLoader.getAllSearchMethodNames(); } catch (BehaviorSearchException ex) { handleError(ex.getMessage()); System.exit(1); } for (String name: names) { try { searchMethodChoices.put(name, SearchMethodLoader.createFromName(name)); model.addElement(name); } catch (BehaviorSearchException ex) { handleError(ex.getMessage()); } } ////////////// ChromosomeType model = (DefaultComboBoxModel<String>) jComboBoxChromosomeType.getModel(); model.removeAllElements(); names = null; try { names = bsearch.representations.ChromosomeTypeLoader.getAllChromosomeTypes(); } catch (BehaviorSearchException ex) { handleError(ex.getMessage()); System.exit(1); } for (String name: names) { model.addElement(name); } ////////////// FitnessCollecting model = (DefaultComboBoxModel<String>) jComboBoxFitnessCollecting.getModel(); model.removeAllElements(); for (SearchProtocol.FITNESS_COLLECTING f: SearchProtocol.FITNESS_COLLECTING.values()) { model.addElement(f.toString()); } ////////////// FitnessCollecting model = (DefaultComboBoxModel<String>) jComboBoxFitnessCombineReplications.getModel(); model.removeAllElements(); for (SearchProtocol.FITNESS_COMBINE_REPLICATIONS f: SearchProtocol.FITNESS_COMBINE_REPLICATIONS.values()) { model.addElement(f.toString()); } } private void updateFitnessDerivativePanel() { boolean enabled = jCheckBoxTakeDerivative.isSelected(); jLabelDerivWRT.setEnabled(enabled); jLabelDerivDELTA.setEnabled(enabled); jComboBoxFitnessDerivativeParameter.setEnabled(enabled); jTextFieldFitnessDerivativeDelta.setEnabled(enabled); jCheckBoxFitnessDerivativeUseAbs.setEnabled(enabled); if (enabled) { updateFitnessDerivativeParameterChoices(); } } private void updateFitnessDerivativeParameterChoices() { try { Object oldChoice = jComboBoxFitnessDerivativeParameter.getSelectedItem(); SearchSpace ss = new SearchSpace(java.util.Arrays.asList(jTextAreaParamSpecs.getText().split("\n"))); DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>) jComboBoxFitnessDerivativeParameter.getModel(); model.removeAllElements(); for (ParameterSpec spec : ss.getParamSpecs()) { model.addElement(spec.getParameterName()); } model.addElement("@MUTATE@"); //TODO: Question: what if old choice not in new list of param jComboBoxFitnessDerivativeParameter.setSelectedItem(oldChoice); } catch (Exception ex) { } } private void actionNew() { if (!checkDiscardOkay()) { return; } currentFile = null; /* jTextAreaParamSpecs.setText("[\"integerParameter\" [0 1 10]] \n" + "[\"continuousParameter\" [0.0 \"C\" 1.0]] \n " + "[\"choiceParameter\" \"near\" \"far\"] \n"); */ SearchProtocol protocol; try { protocol = SearchProtocol.load(defaultProtocolXMLForNewSearch); loadProtocol(protocol); } catch (IOException e) { e.printStackTrace(); throw new IllegalStateException("Error loading default XML protocol to initialize UI!"); } catch (SAXException e) { e.printStackTrace(); throw new IllegalStateException("Error loading default XML protocol to initialize UI!"); } this.setTitle("Untitled" + getWindowTitleSuffix()); } private void actionOpen() { if (!checkDiscardOkay()) { return; } JFileChooser chooser = new JFileChooser(); if (currentFile != null) { chooser.setSelectedFile(currentFile); } chooser.addChoosableFileFilter(new javax.swing.filechooser.FileNameExtensionFilter( "Completed search configurations (*.xml)", "xml")); chooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter( "Search protocols (*.bsearch)", "bsearch")); int returnVal = chooser.showOpenDialog(this); if(returnVal == JFileChooser.APPROVE_OPTION) { openFile(chooser.getSelectedFile()); } } private void actionOpenExample() { if (!checkDiscardOkay()) { return; } JFileChooser chooser = new JFileChooser(GeneralUtils.attemptResolvePathFromBSearchRoot("examples")); chooser.addChoosableFileFilter(new javax.swing.filechooser.FileNameExtensionFilter( "Completed search configurations (*.xml)", "xml")); chooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter( "Search protocols (*.bsearch)", "bsearch")); int returnVal = chooser.showOpenDialog(this); if(returnVal == JFileChooser.APPROVE_OPTION) { openFile(chooser.getSelectedFile()); } } private void openFile(File fProtocol) { try { SearchProtocol protocol = SearchProtocol.loadFile(fProtocol.getPath()); currentFile = fProtocol; loadProtocol(protocol); this.setTitle(currentFile.getName() + getWindowTitleSuffix()); } catch (IOException e) { handleError("IO Error occurred attempting to load file: " + fProtocol.getPath()); e.printStackTrace(); } catch (SAXException e) { handleError("XML Parsing error occurred attempting to load file: " + fProtocol.getPath()); e.printStackTrace(); } } private void loadProtocol(SearchProtocol protocol) { jTextFieldModelFile.setText(protocol.modelFile); StringBuilder sb = new StringBuilder(); for (String s : protocol.paramSpecStrings) { sb.append(s); sb.append("\n"); } jTextAreaParamSpecs.setText(sb.toString()); jTextFieldModelStepCommands.setText(protocol.modelStepCommands); jTextFieldModelSetupCommands.setText(protocol.modelSetupCommands); jTextFieldModelStopCondition.setText(protocol.modelStopCondition); jTextFieldModelStepLimit.setText(Integer.toString(protocol.modelStepLimit)); jTextFieldFitnessMetric.setText(protocol.modelMetricReporter); jTextFieldMeasureIf.setText(protocol.modelMeasureIf); jComboBoxFitnessMinMax.setSelectedItem(protocol.fitnessMinimized ? "Minimize Fitness" : "Maximize Fitness"); jComboBoxFitnessCollecting.setSelectedItem(protocol.fitnessCollecting.toString()); jTextFieldFitnessSamplingRepetitions.setText(Integer.toString(protocol.fitnessSamplingReplications)); jComboBoxFitnessSamplingMethod.setSelectedItem((protocol.fitnessSamplingReplications != 0) ? "Fixed Sampling" : "Adaptive Sampling"); jComboBoxFitnessCombineReplications.setSelectedItem(protocol.fitnessCombineReplications.toString()); jCheckBoxTakeDerivative.setSelected(protocol.fitnessDerivativeParameter.length() > 0); jCheckBoxFitnessDerivativeUseAbs.setSelected(protocol.fitnessDerivativeUseAbs); updateFitnessDerivativePanel(); jComboBoxFitnessDerivativeParameter.setSelectedItem(protocol.fitnessDerivativeParameter); jTextFieldFitnessDerivativeDelta.setText(Double.toString(protocol.fitnessDerivativeDelta)); jComboBoxSearchMethodType.setSelectedItem(protocol.searchMethodType); jComboBoxChromosomeType.setSelectedItem(protocol.chromosomeType); updateSearchMethodParamTable(searchMethodChoices.get(protocol.searchMethodType),protocol.searchMethodParams); jCheckBoxCaching.setSelected(protocol.caching); jTextFieldBestChecking.setText(Integer.toString(protocol.bestCheckingNumReplications)); jTextFieldEvaluationLimit.setText(Integer.toString(protocol.evaluationLimit)); lastSavedText = protocol.toXMLString(); runOptions = null; // reset the runOptions to defaults, when a different Protocol is loaded } private void actionSave() { if (currentFile == null) { actionSaveAs(); } else { doSave(); } } private void actionSaveAs() { JFileChooser chooser = new JFileChooser("./experiments/"); if (currentFile != null) { chooser.setSelectedFile(currentFile); } else { chooser.setSelectedFile(new File("Untitled.bsearch")); } chooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter( "Search protocols (*.bsearch)", "bsearch")); int returnVal = chooser.showSaveDialog(this); if(returnVal == JFileChooser.APPROVE_OPTION) { currentFile = chooser.getSelectedFile(); doSave(); this.setTitle(currentFile.getName() + getWindowTitleSuffix()); } } private SearchProtocol createProtocolFromFormData() throws UIConstraintException { HashMap<String, String> searchMethodParams = new java.util.LinkedHashMap<String, String>(); TableModel model = jTableSearchMethodParams.getModel(); for (int i = 0; i < model.getRowCount(); i++) { searchMethodParams.put(model.getValueAt(i, 0).toString().trim(), model.getValueAt(i, 1).toString()); } int modelStepLimit = 0; try { modelStepLimit = Integer.valueOf(jTextFieldModelStepLimit.getText()); if (modelStepLimit < 0) { throw new NumberFormatException(); } } catch (NumberFormatException ex) { throw new UIConstraintException("STEP LIMIT should be a non-negative integer.", "Error: can't create search protocol"); } int fitnessSamplingRepetitions = 0; if (jComboBoxFitnessSamplingMethod.getSelectedItem().toString().equals("Fixed Sampling")) { try { fitnessSamplingRepetitions = Integer.valueOf(jTextFieldFitnessSamplingRepetitions.getText()); if (fitnessSamplingRepetitions < 0) { throw new NumberFormatException(); } } catch (NumberFormatException ex) { throw new UIConstraintException("SAMPLING REPETITIONS should be a positive integer, or 0 if using adaptive sampling.", "Error: can't create protocol"); } } boolean caching = jCheckBoxCaching.isSelected(); int evaluationLimit = 0; try { evaluationLimit = Integer.valueOf(jTextFieldEvaluationLimit.getText()); if (evaluationLimit <= 0) { throw new NumberFormatException(); } } catch (NumberFormatException ex) { throw new UIConstraintException("EVALUATION LIMIT should be a positive integer.", "Error: can't create search protocol"); } int bestCheckingNumReplications = 0; try { bestCheckingNumReplications = Integer.valueOf(jTextFieldBestChecking.getText()); if (bestCheckingNumReplications < 0) { throw new NumberFormatException(); } } catch (NumberFormatException ex) { throw new UIConstraintException("The number of 'BEST CHECKING' replicates should be a non-negative integer.", "Error: can't create search protocol"); } double fitnessDerivDelta = 0.0; if (jCheckBoxTakeDerivative.isSelected()) { try { fitnessDerivDelta = Double.valueOf(jTextFieldFitnessDerivativeDelta.getText()); } catch (NumberFormatException ex) { throw new UIConstraintException("The DELTA value (for taking the derivative of the objective fucntion with respect to a parameter) needs to be a number", "Error: can't create search protocol"); } } SearchProtocol protocol = new SearchProtocol(jTextFieldModelFile.getText(), java.util.Arrays.asList(jTextAreaParamSpecs.getText().split("\n")), jTextFieldModelStepCommands.getText(), jTextFieldModelSetupCommands.getText(), jTextFieldModelStopCondition.getText(), modelStepLimit, jTextFieldFitnessMetric.getText(), jTextFieldMeasureIf.getText(), jComboBoxFitnessMinMax.getSelectedItem().toString().equals("Minimize Fitness"), fitnessSamplingRepetitions, SearchProtocol.FITNESS_COLLECTING.valueOf(jComboBoxFitnessCollecting.getSelectedItem().toString()), SearchProtocol.FITNESS_COMBINE_REPLICATIONS.valueOf(jComboBoxFitnessCombineReplications.getSelectedItem().toString()), jCheckBoxTakeDerivative.isSelected()?jComboBoxFitnessDerivativeParameter.getSelectedItem().toString():"", fitnessDerivDelta, jCheckBoxFitnessDerivativeUseAbs.isSelected(), jComboBoxSearchMethodType.getSelectedItem().toString(), searchMethodParams, jComboBoxChromosomeType.getSelectedItem().toString(), caching, evaluationLimit, bestCheckingNumReplications ); return protocol; } private void doSave() { java.io.FileWriter fout; try { fout = new java.io.FileWriter(currentFile); SearchProtocol protocol = createProtocolFromFormData(); protocol.save(fout); fout.close(); lastSavedText = protocol.toXMLString(); javax.swing.JOptionPane.showMessageDialog(this, "Saved successfully.", "Saved.", JOptionPane.PLAIN_MESSAGE); } catch (IOException ex) { ex.printStackTrace(); handleError("IO Error occurred attempting to save file: " + currentFile.getPath()); } catch (UIConstraintException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), ex.getTitle(), JOptionPane.WARNING_MESSAGE); } } private void actionExit() { if (!checkDiscardOkay()) { return; } System.exit(0); } private boolean protocolChangedSinceLastSave() { String xmlStr = ""; try { xmlStr = createProtocolFromFormData().toXMLString(); } catch (UIConstraintException ex) { // if we can't create a valid protocol object from the form data, assume the user has changed something... return true; } //System.out.println(xmlStr); //System.out.println("--"); //System.out.println(lastSavedText); // Note: lastSavedText == null ONLY when the GUI is being loaded for the first time. return (lastSavedText != null && !lastSavedText.equals(xmlStr)); } private boolean checkDiscardOkay() { if (protocolChangedSinceLastSave()) { if (JOptionPane.showConfirmDialog(this, "Discard changes you've made to this search experiment?", "Discard changes?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.NO_OPTION) { return false; } } return true; } private void updateSearchMethodParamTable(SearchMethod searchMethod, HashMap<String,String> searchMethodParams) { //if the search method in the protocol is missing some parameters, fill them in with defaults HashMap<String, String> defaultParams = searchMethod.getSearchParams(); for (String key : defaultParams.keySet()) { if (!searchMethodParams.containsKey(key)) { searchMethodParams.put(key, defaultParams.get(key)); } } DefaultTableModel model = (DefaultTableModel) jTableSearchMethodParams.getModel(); model.setRowCount(0); for (String s: searchMethodParams.keySet()) { model.addRow(new Object[] { s , searchMethodParams.get(s) } ); } } protected void actionUpdateSearchMethodParams() { if (!searchMethodChoices.isEmpty()) // make sure everything has been initialized... { SearchMethod searchMethod = searchMethodChoices.get(jComboBoxSearchMethodType.getSelectedItem()); updateSearchMethodParamTable(searchMethod,searchMethod.getSearchParams()); } } protected void actionSamplingMethodChanged() { if (jComboBoxFitnessSamplingMethod.getSelectedItem().equals("Adaptive Sampling")) { SearchMethod searchMethod = searchMethodChoices.get(jComboBoxSearchMethodType.getSelectedItem()); if (!searchMethod.supportsAdaptiveSampling()) { JOptionPane.showMessageDialog(this, "The currently selected search method doesn't support 'Adaptive Sampling'.", "WARNING", JOptionPane.WARNING_MESSAGE); jComboBoxFitnessSamplingMethod.setSelectedItem("Fixed Sampling"); } else { jTextFieldFitnessSamplingRepetitions.setText("0"); jTextFieldFitnessSamplingRepetitions.setEnabled(false); } } else { jTextFieldFitnessSamplingRepetitions.setEnabled(true); if (jTextFieldFitnessSamplingRepetitions.getText().trim().equals("0")) { jTextFieldFitnessSamplingRepetitions.setText("10"); } } } protected void actionBrowseModel() { JFileChooser chooser = new JFileChooser("."); chooser.setSelectedFile(new File(jTextFieldModelFile.getText())); chooser.setFileFilter(new FileNameExtensionFilter("NetLogo Models", "nlogo")); int returnVal = chooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { jTextFieldModelFile.setText(chooser.getSelectedFile().getPath()); } } protected void actionSuggestParamRanges() { try { jTextAreaParamSpecs.setText(bsearch.nlogolink.Utils.getDefaultConstraintsText(jTextFieldModelFile.getText())); } catch (NetLogoLinkException e) { handleError(e.getMessage()); } } protected void actionRunNow() { SearchProtocol protocol; try { protocol = createProtocolFromFormData(); } catch (UIConstraintException e) { handleError("Error creating SearchProtocol: " + e.getMessage()); return; } /* while (currentFile == null || protocolChangedSinceLastSave()) { int choice = javax.swing.JOptionPane.showConfirmDialog(this, "Protocol must be saved before running the search. Save now?" , "Save protocol?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); if (choice == JOptionPane.OK_OPTION) { actionSave(); } else { return; } } */ if (runOptions == null) { runOptions = new BehaviorSearch.RunOptions(); //suggest a filename stem for output files, which users can change. if (currentFile != null) { String fnameStem = currentFile.getPath(); fnameStem = fnameStem.substring(0, fnameStem.lastIndexOf('.')); fnameStem = GeneralUtils.attemptResolvePathFromStartupFolder(fnameStem); runOptions.outputStem = fnameStem; } else { //TODO: Use folder where the NetLogo model is located instead? runOptions.outputStem = new File(defaultUserDocumentsFolder, "mySearchOutput").getPath(); } } if (currentFile != null) { runOptions.protocolFilename = this.currentFile.getAbsolutePath(); } if (RunOptionsDialog.showDialog(this, runOptions)) { GUIProgressDialog dialog = new GUIProgressDialog(this); dialog.setLocationRelativeTo(null); dialog.startSearchTask(protocol, runOptions); dialog.setVisible(true); } } private void actionHelpSearchMethod() { SearchMethod sm = searchMethodChoices.get(jComboBoxSearchMethodType.getSelectedItem()); HelpInfoDialog.showHelp(this, "Help about " + sm.getName(), sm.getHTMLHelpText()); } private void actionHelpSearchSpaceRepresentation() { String chromosomeType = jComboBoxChromosomeType.getSelectedItem().toString(); try { ChromosomeFactory factory = ChromosomeTypeLoader.createFromName(chromosomeType); HelpInfoDialog.showHelp(this, "Help about " + chromosomeType, factory.getHTMLHelpText() + "<BR><BR>"); } catch (BehaviorSearchException ex) { handleError(ex.toString()); } } private void actionHelpSearchSpace() { HelpInfoDialog.showHelp(this, "Help about search space specification", "<HTML><BODY>" + "Specifying the range of parameters to be searched works much the same as the BehaviorSpace tool in NetLogo:" + "<PRE> [ \"PARAM_NAME\" VALUE1 VALUE2 VALUE3 ... ] </PRE>" + "or <PRE> [ \"PARAM_NAME\" [RANGE_START INCREMENT RANGE_END] ] </PRE>" + "<P>One slight difference is that INCREMENT may be \"C\", which means to search the range continously " + "(or at least with fine resolution, if the chromosomal representation doesn't allow for continuous parameters)</P>" + "</BODY></HTML>"); } private void actionHelpEvaluation() { //TODO: Better help docs HelpInfoDialog.showHelp(this, "Help about fitness evaluation", "<HTML><BODY>" + "An objective function must condense the data collected from multiple model runs into a single number, " + "which is what the search process will either attempt to minimize or maximize." + "</BODY></HTML>"); } private void actionHelpTutorial() { org.nlogo.swing.BrowserLauncher.openURL(this, GeneralUtils.attemptResolvePathFromBSearchRoot("documentation/tutorial.html"), true); } private void actionHelpAbout() { HelpAboutDialog.showAboutDialog(this); } public class UIConstraintException extends Exception { private String title; public UIConstraintException(String msg, String title) { super(msg); this.title = title; } public String getTitle() { return title; } private static final long serialVersionUID = 1L; } //$hide<<$ }