/*
* Copyright 2004-2010 Information & Software Engineering Group (188/1)
* Institute of Software Technology and Interactive Systems
* Vienna University of Technology, Austria
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package at.tuwien.ifs.somtoolbox.apps.trainer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Properties;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import com.martiansoftware.jsap.Parameter;
import at.tuwien.ifs.commons.models.ClassComboBoxModel;
import at.tuwien.ifs.somtoolbox.apps.SOMToolboxApp;
import at.tuwien.ifs.somtoolbox.apps.SOMToolboxMain;
import at.tuwien.ifs.somtoolbox.layers.metrics.DistanceMetric;
import at.tuwien.ifs.somtoolbox.layers.quality.QualityMeasure;
import at.tuwien.ifs.somtoolbox.models.AbstractNetworkModel;
import at.tuwien.ifs.somtoolbox.models.GrowingCellStructures;
import at.tuwien.ifs.somtoolbox.models.GrowingSOM;
import at.tuwien.ifs.somtoolbox.models.NetworkModel;
import at.tuwien.ifs.somtoolbox.util.StringUtils;
import at.tuwien.ifs.somtoolbox.util.SubClassFinder;
import at.tuwien.ifs.somtoolbox.util.UiUtils;
/**
* The SOMTrainer is a graphical Interface to train a new SOM. It allows setting various parameters, input and output
* data and has different SOM-Modes available.
*
* @author Jakob Frank
* @version $Id: SOMTrainer.java 3877 2010-11-02 15:43:17Z frank $
* @see AbstractNetworkModel
*/
public class SOMTrainer extends JFrame implements SOMToolboxApp {
private static final long serialVersionUID = 1L;
public static final Parameter[] OPTIONS = new Parameter[] {};
public static final String DESCRIPTION = "Graphical Interface to train a SOM";
public static final String LONG_DESCRIPTION = "The " + SOMTrainer.class.getSimpleName()
+ " provides a graphical Interface to create a SOM based on different SOM Models.";
public static final Type APPLICATION_TYPE = Type.Training;
private JPanel main = null;
private JPanel pnlMapSettings = null;
private JLabel lblTitle = null;
private JTextField txtTitle = null;
private JLabel lblModel = null;
private JComboBox cmbModel = null;
private JPanel pnlInputData = null;
private JLabel lblVecFile = null;
private JPanel pnlVec = null;
private JTextField txtInputVecotrFile = null;
private JButton btnVecFileOpen = null;
private JLabel lblTvFile = null;
private JPanel pnlTv = null;
private JTextField txtTemplateVecotrFile = null;
private JButton btnTVFileOpen = null;
private JLabel lblOutputDir = null;
private JPanel pnlOutDir = null;
private JTextField txtOutDir = null;
private JButton btnOutDirFileSaver = null;
private JPanel pnlModelSettings = null;
private JPanel pnlMisc = null;
private JLabel lblThreads = null;
private JLabel lblLogFile = null;
private JSpinner spnThreads = null;
private JPanel pnlLog = null;
private JTextField txtLogFile = null;
private JButton btnLogFileSaver = null;
private SpinnerNumberModel spnThreadsModel;
private JProgressBar pgbTraining = null;
private JPanel pnlGo = null;
private JButton btnTrain = null;
private JButton btnSave = null;
private JCheckBox chkSparse = null;
private JCheckBox chkNormalized = null;
private JPanel pnlSettings = null;
private JLabel lblXSize = null;
private JSpinner spnXSize = null;
private JLabel lblYSize = null;
private JSpinner spnYSize = null;
private JSpinner spnLearnrate = null;
private JSpinner spnSigma = null;
private JSpinner spnIterations = null;
private JLabel lblIteration = null;
private JRadioButton rdoIterations = null;
private JRadioButton rdoCycles = null;
private JLabel lblMetric = null;
private JLabel lblQuality = null;
private JComboBox cmbMetric = null;
private JComboBox cmbQualityMeasure = null;
private JLabel jLabel = null;
private JSpinner spnRandomSeed = null;
private JCheckBox chkCreateDWM = null;
private JCheckBox chkSigma = null;
private JCheckBox chkLernrate = null;
private SOMModelSettingsPanel pnlModelSpecificSettings = null;
private ClassComboBoxModel<DistanceMetric> cmbMetricModel;
private ClassComboBoxModel<QualityMeasure> cmbQualityMeasureModel;
private ClassComboBoxModel<AbstractNetworkModel> cmbModelModel; // @jve:decl-index=0:visual-constraint="635,54"
private JCheckBox chkLabelSOM = null;
private JLabel lblLabels = null;
private JSpinner spnLabels = null;
private JSpinner spnWinnerCount = null;
/**
* This method initializes
*/
public SOMTrainer() {
super();
initialize();
}
/**
* This method initializes this
*/
private void initialize() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("SOM Trainer");
this.setResizable(false);
this.setContentPane(getMain());
this.getRootPane().setDefaultButton(getBtnTrain());
this.pack();
}
/**
* This method initializes main
*
* @return javax.swing.JPanel
*/
private JPanel getMain() {
if (main == null) {
GridBagConstraints gridBagConstraints71 = new GridBagConstraints();
gridBagConstraints71.gridx = 0;
gridBagConstraints71.fill = GridBagConstraints.VERTICAL;
gridBagConstraints71.weightx = 1.0;
gridBagConstraints71.anchor = GridBagConstraints.EAST;
gridBagConstraints71.insets = new Insets(2, 2, 2, 2);
gridBagConstraints71.gridy = 5;
GridBagConstraints gridBagConstraints63 = new GridBagConstraints();
gridBagConstraints63.gridx = 0;
gridBagConstraints63.fill = GridBagConstraints.BOTH;
gridBagConstraints63.weightx = 1.0;
gridBagConstraints63.insets = new Insets(4, 2, 4, 2);
gridBagConstraints63.gridy = 4;
GridBagConstraints gridBagConstraints51 = new GridBagConstraints();
gridBagConstraints51.gridx = 0;
gridBagConstraints51.fill = GridBagConstraints.BOTH;
gridBagConstraints51.weightx = 1.0;
gridBagConstraints51.gridy = 3;
GridBagConstraints gridBagConstraints41 = new GridBagConstraints();
gridBagConstraints41.gridx = 0;
gridBagConstraints41.fill = GridBagConstraints.BOTH;
gridBagConstraints41.weightx = 1.0;
gridBagConstraints41.gridy = 2;
GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
gridBagConstraints11.gridx = 0;
gridBagConstraints11.fill = GridBagConstraints.BOTH;
gridBagConstraints11.weightx = 1.0;
gridBagConstraints11.gridy = 0;
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.gridy = 1;
main = new JPanel();
main.setLayout(new GridBagLayout());
main.setName("main");
main.add(getPnlMapSettings(), gridBagConstraints);
main.add(getPnlInputData(), gridBagConstraints11);
main.add(getPnlModelSettings(), gridBagConstraints41);
main.add(getPnlMisc(), gridBagConstraints51);
main.add(getPgbTraining(), gridBagConstraints63);
main.add(getPnlGo(), gridBagConstraints71);
}
return main;
}
/**
* This method initializes pnlMapSettings
*
* @return javax.swing.JPanel
*/
private JPanel getPnlMapSettings() {
if (pnlMapSettings == null) {
GridBagConstraints gridBagConstraints22 = new GridBagConstraints();
gridBagConstraints22.gridx = 0;
gridBagConstraints22.gridwidth = 2;
gridBagConstraints22.weightx = 1.0;
gridBagConstraints22.fill = GridBagConstraints.BOTH;
gridBagConstraints22.insets = new Insets(2, 0, 2, 0);
gridBagConstraints22.gridy = 3;
GridBagConstraints gridBagConstraints13 = new GridBagConstraints();
gridBagConstraints13.gridx = 1;
gridBagConstraints13.fill = GridBagConstraints.BOTH;
gridBagConstraints13.weightx = 1.0;
gridBagConstraints13.insets = new Insets(1, 0, 1, 0);
gridBagConstraints13.gridy = 1;
GridBagConstraints gridBagConstraints12 = new GridBagConstraints();
gridBagConstraints12.gridx = 0;
gridBagConstraints12.anchor = GridBagConstraints.WEST;
gridBagConstraints12.insets = new Insets(2, 2, 2, 4);
gridBagConstraints12.gridy = 1;
lblOutputDir = new JLabel();
lblOutputDir.setText("Output Dir *");
lblOutputDir.setToolTipText("This field is required");
GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
gridBagConstraints4.anchor = GridBagConstraints.WEST;
gridBagConstraints4.insets = new Insets(2, 2, 2, 4);
GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
gridBagConstraints3.fill = GridBagConstraints.BOTH;
gridBagConstraints3.gridy = 2;
gridBagConstraints3.weightx = 1.0;
gridBagConstraints3.insets = new Insets(1, 0, 1, 0);
gridBagConstraints3.gridx = 1;
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
gridBagConstraints2.gridx = 0;
gridBagConstraints2.anchor = GridBagConstraints.WEST;
gridBagConstraints2.insets = new Insets(2, 2, 2, 4);
gridBagConstraints2.gridy = 2;
lblModel = new JLabel();
lblModel.setText("SOM Model");
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints1.fill = GridBagConstraints.BOTH;
gridBagConstraints1.gridy = 0;
gridBagConstraints1.weightx = 1.0;
gridBagConstraints1.insets = new Insets(1, 0, 1, 0);
gridBagConstraints1.gridx = 1;
lblTitle = new JLabel();
lblTitle.setText("Title");
pnlMapSettings = new JPanel();
pnlMapSettings.setLayout(new GridBagLayout());
pnlMapSettings.setBorder(BorderFactory.createTitledBorder(null, "Map Settings",
TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,
new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
pnlMapSettings.add(lblTitle, gridBagConstraints4);
pnlMapSettings.add(getTxtTitle(), gridBagConstraints1);
pnlMapSettings.add(lblModel, gridBagConstraints2);
pnlMapSettings.add(getCmbModel(), gridBagConstraints3);
pnlMapSettings.add(lblOutputDir, gridBagConstraints12);
pnlMapSettings.add(getPnlOutDir(), gridBagConstraints13);
pnlMapSettings.add(getPnlSettings(), gridBagConstraints22);
pnlMapSettings.addPropertyChangeListener("enabled", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setEnabledToChildren(pnlMapSettings, evt.getNewValue().equals(Boolean.TRUE), true);
}
});
}
return pnlMapSettings;
}
/**
* This method initializes txtTitle
*
* @return javax.swing.JTextField
*/
private JTextField getTxtTitle() {
if (txtTitle == null) {
txtTitle = new JTextField();
txtTitle.setColumns(10);
}
return txtTitle;
}
/**
* This method initializes cmbModel
*
* @return javax.swing.JComboBox
*/
private JComboBox getCmbModel() {
if (cmbModel == null) {
cmbModel = new JComboBox();
cmbModel.setModel(getCmbModelModel());
cmbModel.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("Update \"Model Specific Settings\" Panel");
pnlModelSpecificSettings = SOMModelSettingsPanel.createModelSpecificConfigPanel(getCmbModelModel().getSelectedClass());
if (pnlModelSpecificSettings == null) {
getPnlModelSettings().removeAll();
getPnlModelSettings().setVisible(false);
} else {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
getPnlModelSettings().removeAll();
getPnlModelSettings().add(pnlModelSpecificSettings, c);
getPnlModelSettings().setVisible(true);
}
SOMTrainer.this.validate();
SOMTrainer.this.pack();
System.out.printf("Done%n");
}
});
// TODO: hard coded initial selection
cmbModel.setSelectedItem(GrowingSOM.class.getSimpleName());
}
return cmbModel;
}
/**
* @return the Model of {@link NetworkModel}s
*/
private ClassComboBoxModel<AbstractNetworkModel> getCmbModelModel() {
if (cmbModelModel == null) {
ArrayList<Class<? extends AbstractNetworkModel>> models = SubClassFinder.findSubclassesOf(AbstractNetworkModel.class);
ArrayList<Class<? extends AbstractNetworkModel>> toRemove = new ArrayList<Class<? extends AbstractNetworkModel>>();
for (Class<? extends AbstractNetworkModel> class1 : models) {
if (class1.isInterface() || Modifier.isAbstract(class1.getModifiers())) {
toRemove.add(class1);
}
}
// TODO: hard coded exclusion
toRemove.add(GrowingCellStructures.class);
models.removeAll(toRemove);
cmbModelModel = new ClassComboBoxModel<AbstractNetworkModel>(models);
}
return cmbModelModel;
}
/**
* This method initializes pnlInputData
*
* @return javax.swing.JPanel
*/
private JPanel getPnlInputData() {
if (pnlInputData == null) {
GridBagConstraints gridBagConstraints21 = new GridBagConstraints();
gridBagConstraints21.gridx = 1;
gridBagConstraints21.anchor = GridBagConstraints.WEST;
gridBagConstraints21.gridy = 1;
GridBagConstraints gridBagConstraints20 = new GridBagConstraints();
gridBagConstraints20.gridx = 0;
gridBagConstraints20.gridy = 1;
GridBagConstraints gridBagConstraints9 = new GridBagConstraints();
gridBagConstraints9.anchor = GridBagConstraints.WEST;
gridBagConstraints9.insets = new Insets(2, 2, 2, 4);
GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
gridBagConstraints8.gridx = 1;
gridBagConstraints8.fill = GridBagConstraints.BOTH;
gridBagConstraints8.weightx = 1.0;
gridBagConstraints8.gridy = 2;
GridBagConstraints gridBagConstraints7 = new GridBagConstraints();
gridBagConstraints7.gridx = 0;
gridBagConstraints7.anchor = GridBagConstraints.WEST;
gridBagConstraints7.insets = new Insets(2, 2, 2, 4);
gridBagConstraints7.gridy = 2;
lblTvFile = new JLabel();
lblTvFile.setText("Template Vector File");
GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
gridBagConstraints5.gridx = 1;
gridBagConstraints5.fill = GridBagConstraints.BOTH;
gridBagConstraints5.weightx = 1.0;
gridBagConstraints5.gridy = 0;
lblVecFile = new JLabel();
lblVecFile.setText("Input Vector File *");
lblVecFile.setToolTipText("This field is required");
pnlInputData = new JPanel();
pnlInputData.setLayout(new GridBagLayout());
pnlInputData.setBorder(BorderFactory.createTitledBorder(null, "Input Data",
TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,
new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
pnlInputData.add(lblVecFile, gridBagConstraints9);
pnlInputData.add(getPnlVec(), gridBagConstraints5);
pnlInputData.add(lblTvFile, gridBagConstraints7);
pnlInputData.add(getPnlTv(), gridBagConstraints8);
pnlInputData.add(getChkSparse(), gridBagConstraints20);
pnlInputData.add(getChkNormalized(), gridBagConstraints21);
pnlInputData.addPropertyChangeListener("enabled", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setEnabledToChildren(pnlInputData, evt.getNewValue().equals(Boolean.TRUE), true);
}
});
}
return pnlInputData;
}
/**
* This method initializes pnlVec
*
* @return javax.swing.JPanel
*/
private JPanel getPnlVec() {
if (pnlVec == null) {
GridBagConstraints gridBagConstraints10 = new GridBagConstraints();
gridBagConstraints10.insets = new Insets(0, 0, 1, 0);
gridBagConstraints10.fill = GridBagConstraints.BOTH;
GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
gridBagConstraints6.fill = GridBagConstraints.BOTH;
gridBagConstraints6.insets = new Insets(0, 0, 0, 0);
gridBagConstraints6.weightx = 1.0;
pnlVec = new JPanel();
pnlVec.setLayout(new GridBagLayout());
pnlVec.add(getTxtInputVecotrFile(), gridBagConstraints6);
pnlVec.add(getBtnVecFileOpen(), gridBagConstraints10);
}
return pnlVec;
}
/**
* This method initializes txtInputVecotrFile
*
* @return javax.swing.JTextField
*/
private JTextField getTxtInputVecotrFile() {
if (txtInputVecotrFile == null) {
txtInputVecotrFile = new JTextField();
txtInputVecotrFile.setColumns(10);
}
return txtInputVecotrFile;
}
/**
* This method initializes btnVecFileOpen
*
* @return javax.swing.JButton
*/
private JButton getBtnVecFileOpen() {
if (btnVecFileOpen == null) {
btnVecFileOpen = new JButton();
btnVecFileOpen.setText("...");
btnVecFileOpen.setMargin(new Insets(0, 0, 0, 0));
btnVecFileOpen.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
File f = execFileChooser(txtInputVecotrFile, new FileFilter() {
@Override
public String getDescription() {
return "SOMLib Vector Files";
}
@Override
public boolean accept(File f) {
if (f.isDirectory() || f.getName().endsWith(".vec") || f.getName().endsWith(".vec.gz")) {
return true;
}
return false;
}
}, false, false);
if (f != null) {
if (f.getName().contains(".norm.")) {
chkNormalized.setSelected(true);
}
}
}
});
}
return btnVecFileOpen;
}
/**
* This method initializes pnlTv
*
* @return javax.swing.JPanel
*/
private JPanel getPnlTv() {
if (pnlTv == null) {
GridBagConstraints gridBagConstraints30 = new GridBagConstraints();
gridBagConstraints30.insets = new Insets(0, 0, 1, 0);
GridBagConstraints gridBagConstraints61 = new GridBagConstraints();
gridBagConstraints61.fill = GridBagConstraints.BOTH;
gridBagConstraints61.weightx = 1.0;
pnlTv = new JPanel();
pnlTv.setLayout(new GridBagLayout());
pnlTv.add(getTxtTemplateVecotrFile(), gridBagConstraints61);
pnlTv.add(getBtnTVFileOpen(), gridBagConstraints30);
}
return pnlTv;
}
/**
* This method initializes txtTemplateVecotrFile
*
* @return javax.swing.JTextField
*/
private JTextField getTxtTemplateVecotrFile() {
if (txtTemplateVecotrFile == null) {
txtTemplateVecotrFile = new JTextField();
txtTemplateVecotrFile.setColumns(10);
}
return txtTemplateVecotrFile;
}
/**
* This method initializes btnTVFileOpen
*
* @return javax.swing.JButton
*/
private JButton getBtnTVFileOpen() {
if (btnTVFileOpen == null) {
btnTVFileOpen = new JButton();
btnTVFileOpen.setText("...");
btnTVFileOpen.setMargin(new Insets(0, 0, 0, 0));
btnTVFileOpen.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
execFileChooser(txtTemplateVecotrFile, new FileFilter() {
@Override
public String getDescription() {
return "TemplateVector Files";
}
@Override
public boolean accept(File f) {
if (f.isDirectory() || f.getName().endsWith(".tv") || f.getName().endsWith(".tv.gz")) {
return true;
}
return false;
}
}, false, false);
}
});
}
return btnTVFileOpen;
}
/**
* This method initializes pnlOutDir
*
* @return javax.swing.JPanel
*/
private JPanel getPnlOutDir() {
if (pnlOutDir == null) {
GridBagConstraints gridBagConstraints31 = new GridBagConstraints();
gridBagConstraints31.insets = new Insets(0, 0, 1, 0);
GridBagConstraints gridBagConstraints611 = new GridBagConstraints();
gridBagConstraints611.fill = GridBagConstraints.BOTH;
gridBagConstraints611.weightx = 1.0;
pnlOutDir = new JPanel();
pnlOutDir.setLayout(new GridBagLayout());
pnlOutDir.add(getTxtOutDir(), gridBagConstraints611);
pnlOutDir.add(getBtnOutDirFileSaver(), gridBagConstraints31);
}
return pnlOutDir;
}
/**
* This method initializes txtOutDir
*
* @return javax.swing.JTextField
*/
private JTextField getTxtOutDir() {
if (txtOutDir == null) {
txtOutDir = new JTextField();
txtOutDir.setColumns(10);
txtOutDir.setToolTipText("This field is required");
}
return txtOutDir;
}
/**
* This method initializes btnOutDirFileSaver
*
* @return javax.swing.JButton
*/
private JButton getBtnOutDirFileSaver() {
if (btnOutDirFileSaver == null) {
btnOutDirFileSaver = new JButton();
btnOutDirFileSaver.setMargin(new Insets(0, 0, 0, 0));
btnOutDirFileSaver.setText("...");
btnOutDirFileSaver.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
execFileChooser(txtOutDir, null, true, true);
}
});
}
return btnOutDirFileSaver;
}
/**
* This method initializes pnlModelSettings
*
* @return javax.swing.JPanel
*/
private JPanel getPnlModelSettings() {
if (pnlModelSettings == null) {
pnlModelSettings = new JPanel();
pnlModelSettings.setLayout(new GridBagLayout());
pnlModelSettings.setBorder(BorderFactory.createTitledBorder(null, "Model Specific Settings",
TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,
new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
pnlModelSettings.setVisible(false);
pnlModelSettings.addPropertyChangeListener("enabled", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setEnabledToChildren(pnlModelSettings, evt.getNewValue().equals(Boolean.TRUE), true);
}
});
}
return pnlModelSettings;
}
/**
* This method initializes pnlMisc
*
* @return javax.swing.JPanel
*/
private JPanel getPnlMisc() {
if (pnlMisc == null) {
GridBagConstraints gridBagConstraints48 = new GridBagConstraints();
gridBagConstraints48.gridx = 3;
gridBagConstraints48.fill = GridBagConstraints.HORIZONTAL;
gridBagConstraints48.weightx = 1.0;
gridBagConstraints48.gridy = 2;
GridBagConstraints gridBagConstraints44 = new GridBagConstraints();
gridBagConstraints44.gridx = 0;
gridBagConstraints44.gridwidth = GridBagConstraints.RELATIVE;
gridBagConstraints44.anchor = GridBagConstraints.EAST;
gridBagConstraints44.gridy = 2;
GridBagConstraints gridBagConstraints43 = new GridBagConstraints();
gridBagConstraints43.gridx = 3;
gridBagConstraints43.insets = new Insets(2, 0, 2, 0);
gridBagConstraints43.weightx = 0.8;
gridBagConstraints43.fill = GridBagConstraints.HORIZONTAL;
gridBagConstraints43.gridy = 0;
GridBagConstraints gridBagConstraints42 = new GridBagConstraints();
gridBagConstraints42.gridx = 2;
gridBagConstraints42.insets = new Insets(2, 2, 2, 4);
gridBagConstraints42.gridy = 0;
jLabel = new JLabel();
jLabel.setText("Random seed");
GridBagConstraints gridBagConstraints17 = new GridBagConstraints();
gridBagConstraints17.gridx = 1;
gridBagConstraints17.fill = GridBagConstraints.BOTH;
gridBagConstraints17.weightx = 1.0;
gridBagConstraints17.gridwidth = 0;
gridBagConstraints17.gridy = 1;
GridBagConstraints gridBagConstraints16 = new GridBagConstraints();
gridBagConstraints16.fill = GridBagConstraints.BOTH;
gridBagConstraints16.gridy = 0;
gridBagConstraints16.weightx = 1.2;
gridBagConstraints16.insets = new Insets(2, 0, 2, 0);
gridBagConstraints16.gridx = 1;
GridBagConstraints gridBagConstraints15 = new GridBagConstraints();
gridBagConstraints15.gridx = 0;
gridBagConstraints15.anchor = GridBagConstraints.WEST;
gridBagConstraints15.insets = new Insets(2, 2, 2, 4);
gridBagConstraints15.gridy = 1;
lblLogFile = new JLabel();
lblLogFile.setText("Logfile");
GridBagConstraints gridBagConstraints14 = new GridBagConstraints();
gridBagConstraints14.gridx = 0;
gridBagConstraints14.anchor = GridBagConstraints.WEST;
gridBagConstraints14.insets = new Insets(2, 2, 2, 4);
gridBagConstraints14.gridy = 0;
lblThreads = new JLabel();
lblThreads.setText("Training Threads");
pnlMisc = new JPanel();
pnlMisc.setLayout(new GridBagLayout());
pnlMisc.setBorder(BorderFactory.createTitledBorder(null, "Misc Settings",
TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,
new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
pnlMisc.add(lblThreads, gridBagConstraints14);
pnlMisc.add(lblLogFile, gridBagConstraints15);
pnlMisc.add(getSpnThreads(), gridBagConstraints16);
pnlMisc.add(getPnlLog(), gridBagConstraints17);
pnlMisc.add(jLabel, gridBagConstraints42);
pnlMisc.add(getSpnRandomSeed(), gridBagConstraints43);
pnlMisc.add(getChkCreateDWM(), gridBagConstraints44);
pnlMisc.add(getSpnWinnerCount(), gridBagConstraints48);
pnlMisc.addPropertyChangeListener("enabled", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setEnabledToChildren(pnlMisc, evt.getNewValue().equals(Boolean.TRUE), true);
}
});
}
return pnlMisc;
}
/**
* This method initializes spnThreads
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnThreads() {
if (spnThreads == null) {
spnThreads = new JSpinner();
Runtime r = Runtime.getRuntime();
spnThreadsModel = new SpinnerNumberModel(r.availableProcessors(), 1, r.availableProcessors() * 2, 1);
spnThreads.setModel(spnThreadsModel);
}
return spnThreads;
}
/**
* This method initializes pnlLog
*
* @return javax.swing.JPanel
*/
private JPanel getPnlLog() {
if (pnlLog == null) {
GridBagConstraints gridBagConstraints101 = new GridBagConstraints();
gridBagConstraints101.insets = new Insets(0, 0, 1, 0);
GridBagConstraints gridBagConstraints62 = new GridBagConstraints();
gridBagConstraints62.fill = GridBagConstraints.BOTH;
gridBagConstraints62.insets = new Insets(1, 0, 1, 0);
gridBagConstraints62.weightx = 1.0;
pnlLog = new JPanel();
pnlLog.setLayout(new GridBagLayout());
pnlLog.add(getTxtLogFile(), gridBagConstraints62);
pnlLog.add(getBtnLogFileSaver(), gridBagConstraints101);
}
return pnlLog;
}
/**
* This method initializes txtLogFile
*
* @return javax.swing.JTextField
*/
private JTextField getTxtLogFile() {
if (txtLogFile == null) {
txtLogFile = new JTextField();
txtLogFile.setColumns(10);
}
return txtLogFile;
}
/**
* This method initializes btnLogFileSaver
*
* @return javax.swing.JButton
*/
private JButton getBtnLogFileSaver() {
if (btnLogFileSaver == null) {
btnLogFileSaver = new JButton();
btnLogFileSaver.setMargin(new Insets(0, 0, 0, 0));
btnLogFileSaver.setText("...");
btnLogFileSaver.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
execFileChooser(txtInputVecotrFile, new FileFilter() {
@Override
public String getDescription() {
return "Logfile";
}
@Override
public boolean accept(File f) {
if (f.isDirectory() || f.getName().endsWith(".log")) {
return true;
}
return false;
}
}, true, false);
}
});
}
return btnLogFileSaver;
}
/**
* This method initializes pgbTraining
*
* @return javax.swing.JProgressBar
*/
private JProgressBar getPgbTraining() {
if (pgbTraining == null) {
pgbTraining = new JProgressBar();
pgbTraining.setStringPainted(true);
pgbTraining.setString("");
}
return pgbTraining;
}
/**
* This method initializes pnlGo
*
* @return javax.swing.JPanel
*/
private JPanel getPnlGo() {
if (pnlGo == null) {
GridBagConstraints gridBagConstraints19 = new GridBagConstraints();
gridBagConstraints19.gridx = 1;
gridBagConstraints19.insets = new Insets(0, 2, 0, 0);
gridBagConstraints19.anchor = GridBagConstraints.EAST;
GridBagConstraints gridBagConstraints18 = new GridBagConstraints();
gridBagConstraints18.gridx = 0;
gridBagConstraints18.anchor = GridBagConstraints.EAST;
gridBagConstraints18.gridy = 0;
pnlGo = new JPanel();
pnlGo.setLayout(new GridBagLayout());
pnlGo.add(getBtnTrain(), gridBagConstraints19);
pnlGo.add(getBtnSave(), gridBagConstraints18);
}
return pnlGo;
}
/**
* This method initializes btnTrain
*
* @return javax.swing.JButton
*/
private JButton getBtnTrain() {
if (btnTrain == null) {
btnTrain = new JButton();
btnTrain.setText("Start Training");
btnTrain.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startTraining();
}
});
}
return btnTrain;
}
/**
* This method initializes btnSave
*
* @return javax.swing.JButton
*/
private JButton getBtnSave() {
if (btnSave == null) {
btnSave = new JButton();
btnSave.setText("Save Settings...");
btnSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
File outDir = new File(getTxtOutDir().getText());
String basename = getTxtTitle().getText().length() > 0 ? getTxtTitle().getText() : "som";
File pFile = new File(outDir, basename + ".prop");
JFileChooser fc = new JFileChooser(outDir);
fc.setSelectedFile(pFile);
if (fc.showSaveDialog(SOMTrainer.this) == JFileChooser.APPROVE_OPTION) {
FileWriter fw = new FileWriter(fc.getSelectedFile());
String comment = fc.getSelectedFile().getName() + " prop file";
createSOMProps().store(fw, StringUtils.wrap(comment, 80, "# "));
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
return btnSave;
}
/**
* This method initializes chkSparse
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkSparse() {
if (chkSparse == null) {
chkSparse = new JCheckBox();
chkSparse.setText("sparse data");
}
return chkSparse;
}
/**
* This method initializes chkNormalized
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkNormalized() {
if (chkNormalized == null) {
chkNormalized = new JCheckBox();
chkNormalized.setText("normalized");
}
return chkNormalized;
}
/**
* This method initializes pnlSettings
*
* @return javax.swing.JPanel
*/
private JPanel getPnlSettings() {
if (pnlSettings == null) {
GridBagConstraints gridBagConstraints47 = new GridBagConstraints();
gridBagConstraints47.fill = GridBagConstraints.HORIZONTAL;
gridBagConstraints47.gridy = 6;
gridBagConstraints47.weightx = 1.0;
gridBagConstraints47.insets = new Insets(2, 0, 2, 0);
gridBagConstraints47.gridx = 1;
GridBagConstraints gridBagConstraints46 = new GridBagConstraints();
gridBagConstraints46.gridx = 2;
gridBagConstraints46.anchor = GridBagConstraints.WEST;
gridBagConstraints46.insets = new Insets(0, 2, 0, 0);
gridBagConstraints46.gridy = 6;
lblLabels = new JLabel();
lblLabels.setText("Labels");
GridBagConstraints gridBagConstraints45 = new GridBagConstraints();
gridBagConstraints45.gridx = 0;
gridBagConstraints45.gridy = 6;
GridBagConstraints gridBagConstraints28 = new GridBagConstraints();
gridBagConstraints28.gridx = 0;
gridBagConstraints28.anchor = GridBagConstraints.EAST;
gridBagConstraints28.gridy = 1;
GridBagConstraints gridBagConstraints23 = new GridBagConstraints();
gridBagConstraints23.gridx = 2;
gridBagConstraints23.anchor = GridBagConstraints.EAST;
gridBagConstraints23.gridy = 1;
GridBagConstraints gridBagConstraints40 = new GridBagConstraints();
gridBagConstraints40.fill = GridBagConstraints.VERTICAL;
gridBagConstraints40.insets = new Insets(2, 2, 2, 4);
gridBagConstraints40.anchor = GridBagConstraints.EAST;
GridBagConstraints gridBagConstraints39 = new GridBagConstraints();
gridBagConstraints39.fill = GridBagConstraints.BOTH;
gridBagConstraints39.gridy = 5;
gridBagConstraints39.weightx = 1.0;
gridBagConstraints39.gridwidth = 3;
gridBagConstraints39.insets = new Insets(1, 0, 1, 0);
gridBagConstraints39.gridx = 1;
GridBagConstraints gridBagConstraints38 = new GridBagConstraints();
gridBagConstraints38.fill = GridBagConstraints.BOTH;
gridBagConstraints38.gridy = 4;
gridBagConstraints38.weightx = 1.0;
gridBagConstraints38.gridwidth = 3;
gridBagConstraints38.insets = new Insets(1, 0, 1, 0);
gridBagConstraints38.gridx = 1;
GridBagConstraints gridBagConstraints37 = new GridBagConstraints();
gridBagConstraints37.gridx = 0;
gridBagConstraints37.fill = GridBagConstraints.VERTICAL;
gridBagConstraints37.anchor = GridBagConstraints.EAST;
gridBagConstraints37.insets = new Insets(2, 2, 2, 4);
gridBagConstraints37.gridy = 5;
lblQuality = new JLabel();
lblQuality.setText("Quality Measure");
GridBagConstraints gridBagConstraints36 = new GridBagConstraints();
gridBagConstraints36.gridx = 0;
gridBagConstraints36.fill = GridBagConstraints.VERTICAL;
gridBagConstraints36.anchor = GridBagConstraints.EAST;
gridBagConstraints36.insets = new Insets(2, 2, 2, 4);
gridBagConstraints36.gridy = 4;
lblMetric = new JLabel();
lblMetric.setText("Metric");
GridBagConstraints gridBagConstraints35 = new GridBagConstraints();
gridBagConstraints35.gridx = 3;
gridBagConstraints35.anchor = GridBagConstraints.WEST;
gridBagConstraints35.weightx = 0.25;
gridBagConstraints35.gridy = 3;
GridBagConstraints gridBagConstraints34 = new GridBagConstraints();
gridBagConstraints34.gridx = 2;
gridBagConstraints34.anchor = GridBagConstraints.WEST;
gridBagConstraints34.weightx = 0.25;
gridBagConstraints34.gridy = 3;
GridBagConstraints gridBagConstraints33 = new GridBagConstraints();
gridBagConstraints33.gridx = 0;
gridBagConstraints33.fill = GridBagConstraints.VERTICAL;
gridBagConstraints33.anchor = GridBagConstraints.EAST;
gridBagConstraints33.insets = new Insets(2, 2, 2, 4);
gridBagConstraints33.gridy = 3;
lblIteration = new JLabel();
lblIteration.setText("Train");
GridBagConstraints gridBagConstraints32 = new GridBagConstraints();
gridBagConstraints32.gridx = 1;
gridBagConstraints32.weightx = 0.5;
gridBagConstraints32.anchor = GridBagConstraints.WEST;
gridBagConstraints32.insets = new Insets(2, 0, 2, 0);
gridBagConstraints32.gridy = 3;
GridBagConstraints gridBagConstraints29 = new GridBagConstraints();
gridBagConstraints29.gridx = 3;
gridBagConstraints29.anchor = GridBagConstraints.WEST;
gridBagConstraints29.weightx = 0.5;
gridBagConstraints29.insets = new Insets(2, 0, 2, 0);
gridBagConstraints29.fill = GridBagConstraints.HORIZONTAL;
gridBagConstraints29.gridy = 1;
GridBagConstraints gridBagConstraints27 = new GridBagConstraints();
gridBagConstraints27.gridx = 1;
gridBagConstraints27.fill = GridBagConstraints.BOTH;
gridBagConstraints27.weightx = 0.5;
gridBagConstraints27.anchor = GridBagConstraints.WEST;
gridBagConstraints27.insets = new Insets(2, 0, 2, 0);
gridBagConstraints27.gridy = 1;
GridBagConstraints gridBagConstraints26 = new GridBagConstraints();
gridBagConstraints26.gridx = 3;
gridBagConstraints26.weightx = 0.5;
gridBagConstraints26.anchor = GridBagConstraints.WEST;
gridBagConstraints26.insets = new Insets(2, 0, 2, 0);
gridBagConstraints26.gridy = 0;
GridBagConstraints gridBagConstraints25 = new GridBagConstraints();
gridBagConstraints25.gridx = 2;
gridBagConstraints25.fill = GridBagConstraints.VERTICAL;
gridBagConstraints25.anchor = GridBagConstraints.EAST;
gridBagConstraints25.insets = new Insets(2, 2, 2, 4);
gridBagConstraints25.gridy = 0;
lblYSize = new JLabel();
lblYSize.setText("YSize");
GridBagConstraints gridBagConstraints24 = new GridBagConstraints();
gridBagConstraints24.gridx = 1;
gridBagConstraints24.weightx = 0.5;
gridBagConstraints24.anchor = GridBagConstraints.WEST;
gridBagConstraints24.insets = new Insets(2, 0, 2, 0);
gridBagConstraints24.gridy = 0;
lblXSize = new JLabel();
lblXSize.setText("XSize");
pnlSettings = new JPanel();
pnlSettings.setLayout(new GridBagLayout());
pnlSettings.add(lblXSize, gridBagConstraints40);
pnlSettings.add(getSpnXSize(), gridBagConstraints24);
pnlSettings.add(lblYSize, gridBagConstraints25);
pnlSettings.add(getSpnYSize(), gridBagConstraints26);
pnlSettings.add(getSpnLearnrate(), gridBagConstraints27);
pnlSettings.add(getSpnSigma(), gridBagConstraints29);
pnlSettings.add(getSpnIterations(), gridBagConstraints32);
pnlSettings.add(lblIteration, gridBagConstraints33);
pnlSettings.add(getRdoIterations(), gridBagConstraints34);
pnlSettings.add(getRdoCycles(), gridBagConstraints35);
pnlSettings.add(lblMetric, gridBagConstraints36);
pnlSettings.add(getCmbMetric(), gridBagConstraints38);
pnlSettings.add(lblQuality, gridBagConstraints37);
pnlSettings.add(getCmbQualityMeasure(), gridBagConstraints39);
pnlSettings.add(getChkSigma(), gridBagConstraints23);
pnlSettings.add(getChkLernrate(), gridBagConstraints28);
pnlSettings.add(getChkLabelSOM(), gridBagConstraints45);
pnlSettings.add(lblLabels, gridBagConstraints46);
pnlSettings.add(getSpnLabels(), gridBagConstraints47);
ButtonGroup it = new ButtonGroup();
it.add(getRdoCycles());
it.add(getRdoIterations());
lblQuality.setVisible(false);
getCmbQualityMeasure().setVisible(false);
}
return pnlSettings;
}
/**
* This method initializes spnXSize
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnXSize() {
if (spnXSize == null) {
spnXSize = new JSpinner();
spnXSize.setModel(new SpinnerNumberModel(20, 1, Integer.MAX_VALUE, 1));
}
return spnXSize;
}
/**
* This method initializes spnYSize
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnYSize() {
if (spnYSize == null) {
spnYSize = new JSpinner();
spnYSize.setModel(new SpinnerNumberModel(14, 1, Integer.MAX_VALUE, 1));
}
return spnYSize;
}
/**
* This method initializes spnLearnrate
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnLearnrate() {
if (spnLearnrate == null) {
spnLearnrate = new JSpinner() {
private static final long serialVersionUID = 1L;
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled && getChkLernrate().isSelected());
}
};
spnLearnrate.setModel(new SpinnerNumberModel(0.7, 0, 1, 0.001));
spnLearnrate.setEnabled(getChkLernrate().isSelected());
}
return spnLearnrate;
}
/**
* This method initializes spnSigma
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnSigma() {
if (spnSigma == null) {
spnSigma = new JSpinner() {
private static final long serialVersionUID = 1L;
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled && getChkSigma().isSelected());
}
};
spnSigma.setModel(new SpinnerNumberModel(1.0, 1.0, 16.0, .1));
spnSigma.setEnabled(getChkSigma().isSelected());
}
return spnSigma;
}
/**
* This method initializes spnIterations
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnIterations() {
if (spnIterations == null) {
spnIterations = new JSpinner();
spnIterations.setModel(new SpinnerNumberModel(1500, 1, Integer.MAX_VALUE, 1));
}
return spnIterations;
}
/**
* This method initializes rdoIterations
*
* @return javax.swing.JRadioButton
*/
private JRadioButton getRdoIterations() {
if (rdoIterations == null) {
rdoIterations = new JRadioButton();
rdoIterations.setText("Iterations");
rdoIterations.setSelected(true);
}
return rdoIterations;
}
/**
* This method initializes rdoCycles
*
* @return javax.swing.JRadioButton
*/
private JRadioButton getRdoCycles() {
if (rdoCycles == null) {
rdoCycles = new JRadioButton();
rdoCycles.setText("Cycles");
}
return rdoCycles;
}
/**
* This method initializes cmbMetric
*
* @return javax.swing.JComboBox
*/
private JComboBox getCmbMetric() {
if (cmbMetric == null) {
cmbMetric = new JComboBox();
cmbMetric.setModel(getCmbMetricModel());
}
return cmbMetric;
}
/**
* @return the MetricModel
*/
private ClassComboBoxModel<DistanceMetric> getCmbMetricModel() {
if (cmbMetricModel == null) {
ArrayList<Class<? extends DistanceMetric>> distances = SubClassFinder.findSubclassesOf(DistanceMetric.class);
ArrayList<Class<? extends DistanceMetric>> toRemove = new ArrayList<Class<? extends DistanceMetric>>();
for (Class<? extends DistanceMetric> class1 : distances) {
if (class1.isInterface() || Modifier.isAbstract(class1.getModifiers())) {
toRemove.add(class1);
}
}
distances.removeAll(toRemove);
cmbMetricModel = new ClassComboBoxModel<DistanceMetric>(distances);
}
return cmbMetricModel;
}
/**
* This method initializes cmbQualityMeasure
*
* @return javax.swing.JComboBox
*/
private JComboBox getCmbQualityMeasure() {
if (cmbQualityMeasure == null) {
cmbQualityMeasure = new JComboBox();
cmbQualityMeasure.setModel(getCmbQualityMeasureModel());
}
return cmbQualityMeasure;
}
/**
* @return the {@link QualityMeasure} Model
*/
private ClassComboBoxModel<QualityMeasure> getCmbQualityMeasureModel() {
if (cmbQualityMeasureModel == null) {
ArrayList<Class<? extends QualityMeasure>> qualities = SubClassFinder.findSubclassesOf(QualityMeasure.class);
ArrayList<Class<? extends QualityMeasure>> toRemove = new ArrayList<Class<? extends QualityMeasure>>();
for (Class<? extends QualityMeasure> class1 : qualities) {
if (class1.isInterface() || Modifier.isAbstract(class1.getModifiers())) {
toRemove.add(class1);
}
}
qualities.removeAll(toRemove);
cmbQualityMeasureModel = new ClassComboBoxModel<QualityMeasure>(qualities);
}
return cmbQualityMeasureModel;
}
private File execFileChooser(JTextField target, FileFilter filter, boolean isToSave, boolean directorySelect) {
File cwd = new File(target.getText());
JFileChooser c = new JFileChooser(cwd);
if (filter != null) {
c.addChoosableFileFilter(filter);
c.setFileFilter(filter);
}
if (directorySelect) {
c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
}
int returnVal;
if (isToSave) {
returnVal = c.showSaveDialog(this);
} else {
returnVal = c.showOpenDialog(this);
}
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = c.getSelectedFile();
target.setText(file.getAbsolutePath());
return file;
}
return null;
}
private Properties createSOMProps() {
Properties p = null;
if (pnlModelSpecificSettings != null) {
p = pnlModelSpecificSettings.getProperties();
} else {
p = new Properties();
}
p.setProperty("outputDirectory", getTxtOutDir().getText());
p.setProperty("workingDirectory", getTxtOutDir().getText());
p.setProperty("namePrefix", getTxtTitle().getText());
p.setProperty("vectorFileName", getTxtInputVecotrFile().getText());
p.setProperty("sparseData", getChkSparse().isSelected() ? "yes" : "no");
p.setProperty("isNormalized", getChkNormalized().isSelected() ? "yes" : "no");
if (getTxtTemplateVecotrFile().getText().length() > 0) {
p.setProperty("templateFileName", getTxtTemplateVecotrFile().getText());
}
p.setProperty("xSize", getSpnXSize().getValue().toString());
p.setProperty("ySize", getSpnYSize().getValue().toString());
if (getChkLernrate().isSelected()) {
p.setProperty("learnrate", getSpnLearnrate().getValue().toString());
}
if (getChkSigma().isSelected()) {
p.setProperty("sigma", getSpnSigma().getValue().toString());
}
p.setProperty("randomSeed", getSpnRandomSeed().getValue().toString());
ClassComboBoxModel<DistanceMetric> mm = getCmbMetricModel();
if (mm.getSelectedClass() != null) {
p.setProperty("metricName", mm.getSelectedClass().getName());
}
ClassComboBoxModel<QualityMeasure> qm = getCmbQualityMeasureModel();
if (qm.getSelectedClass() != null) {
p.setProperty("growthQualityMeasureName", qm.getSelectedClass().getName());
}
if (rdoIterations.isSelected()) {
p.setProperty("numIterations", getSpnIterations().getValue().toString());
} else {
p.setProperty("numCycles", getSpnIterations().getValue().toString());
}
return p;
}
private String[] createCmdLine(File propFile) {
ArrayList<String> l = new ArrayList<String>();
l.add(getCmbModelModel().getSelectedClass().getSimpleName());
if (pnlModelSpecificSettings != null) {
for (String string : pnlModelSpecificSettings.getAdditionalParams()) {
l.add(string);
}
}
if (getChkLabelSOM().isSelected()) {
l.add("-l");
l.add("LabelSOM");
l.add("-n");
l.add(getSpnLabels().getValue().toString());
}
if (getChkCreateDWM().isSelected()) {
l.add("--numberWinners");
l.add(getSpnWinnerCount().getValue().toString());
} else {
l.add("--skipDWM");
}
l.add("--cpus");
l.add(getSpnThreads().getValue().toString());
l.add(propFile.getAbsolutePath());
return l.toArray(new String[l.size()]);
}
private void setGuiLocked(boolean locked) {
getPnlInputData().setEnabled(!locked);
getPnlMapSettings().setEnabled(!locked);
getPnlModelSettings().setEnabled(!locked);
getPnlMisc().setEnabled(!locked);
}
private void startTraining() {
// FIXME: provide some more generic way for checking this
if (getTxtOutDir().getText().length() == 0) {
JOptionPane.showMessageDialog(this, "You need to specify the output directory!", "Error",
JOptionPane.ERROR_MESSAGE);
return;
}
if (getTxtTitle().getText().length() == 0) {
JOptionPane.showMessageDialog(this, "You need to specify the title!", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
setGuiLocked(true);
try {
File outDir = new File(getTxtOutDir().getText());
String basename = getTxtTitle().getText();
if (!outDir.exists()) {
outDir.mkdirs();
}
// Save Props
Properties prop = createSOMProps();
File pFile = new File(outDir, basename + ".prop");
String[] cmdLine = createCmdLine(pFile);
final String header = basename + " prop file\n# somtoolbox " + Arrays.deepToString(cmdLine);
prop.store(new FileWriter(pFile), StringUtils.wrap(header, 80, "# "));
System.out.printf("%s%n", Arrays.deepToString(cmdLine));
prop.store(System.out, null);
SOMToolboxMain.main(cmdLine);
} catch (Exception e) {
e.printStackTrace();
}
setGuiLocked(false);
}
/**
* This method initializes spnRandomSeed
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnRandomSeed() {
if (spnRandomSeed == null) {
spnRandomSeed = new JSpinner();
spnRandomSeed.setModel(new SpinnerNumberModel(7, 1, Integer.MAX_VALUE, 1));
}
return spnRandomSeed;
}
/**
* This method initializes chkCreateDWM
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkCreateDWM() {
if (chkCreateDWM == null) {
chkCreateDWM = new JCheckBox();
chkCreateDWM.setText("create DataWinnerMapping file");
chkCreateDWM.setSelected(true);
chkCreateDWM.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
getSpnWinnerCount().setEnabled(chkCreateDWM.isSelected());
}
});
}
return chkCreateDWM;
}
/**
* This method initializes chkSigma
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkSigma() {
if (chkSigma == null) {
chkSigma = new JCheckBox();
chkSigma.setText("sigma");
chkSigma.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getSpnSigma().setEnabled(chkSigma.isSelected());
}
});
chkSigma.setSelected(false);
}
return chkSigma;
}
/**
* This method initializes chkLernrate
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkLernrate() {
if (chkLernrate == null) {
chkLernrate = new JCheckBox();
chkLernrate.setText("lernrate");
chkLernrate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getSpnLearnrate().setEnabled(chkLernrate.isSelected());
}
});
chkLernrate.setSelected(true);
}
return chkLernrate;
}
private static void setEnabledToChildren(JPanel panel, boolean enabled, boolean recursive) {
Component[] children = panel.getComponents();
for (Component child : children) {
child.setEnabled(enabled);
if (recursive && child instanceof JPanel) {
setEnabledToChildren((JPanel) child, enabled, recursive);
}
}
}
/**
* This method initializes chkLabelSOM
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkLabelSOM() {
if (chkLabelSOM == null) {
chkLabelSOM = new JCheckBox();
chkLabelSOM.setText("label SOM");
chkLabelSOM.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getSpnLabels().setEnabled(chkLabelSOM.isSelected());
}
});
}
return chkLabelSOM;
}
/**
* This method initializes spnLabels
*
* @return javax.swing.JTextField
*/
private JSpinner getSpnLabels() {
if (spnLabels == null) {
spnLabels = new JSpinner() {
private static final long serialVersionUID = 1L;
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled && getChkLabelSOM().isSelected());
if (lblLabels != null) {
lblLabels.setEnabled(enabled && getChkLabelSOM().isSelected());
}
}
};
spnLabels.setEnabled(getChkLabelSOM().isSelected());
}
return spnLabels;
}
/**
* This method initializes spnWinnerCount
*
* @return javax.swing.JSpinner
*/
private JSpinner getSpnWinnerCount() {
if (spnWinnerCount == null) {
spnWinnerCount = new JSpinner() {
private static final long serialVersionUID = 1L;
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled && getChkCreateDWM().isSelected());
}
};
spnWinnerCount.getModel().setValue(300);
}
return spnWinnerCount;
}
public static void main(String[] args) {
UiUtils.setSOMToolboxLookAndFeel();
new SOMTrainer().setVisible(true);
}
} // @jve:decl-index=0:visual-constraint="10,10"