/*
* Encog(tm) Workbench v3.4
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-workbench
*
* Copyright 2008-2016 Heaton Research, Inc.
*
* 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.apache.org/licenses/LICENSE-2.0
*
* 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.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.workbench.frames.document;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import org.encog.Encog;
import org.encog.mathutil.error.ErrorCalculation;
import org.encog.mathutil.error.ErrorCalculationMode;
import org.encog.mathutil.randomize.RangeRandomizer;
import org.encog.ml.MLError;
import org.encog.ml.MLMethod;
import org.encog.ml.bayesian.BayesianNetwork;
import org.encog.ml.bayesian.bif.BIFUtil;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.ml.data.buffer.BufferedMLDataSet;
import org.encog.util.Format;
import org.encog.util.file.Directory;
import org.encog.workbench.EncogWorkBench;
import org.encog.workbench.config.EncogWorkBenchConfig;
import org.encog.workbench.dialogs.BenchmarkDialog;
import org.encog.workbench.dialogs.DirChooser;
import org.encog.workbench.dialogs.EvaluateDialog;
import org.encog.workbench.dialogs.binary.DialogNoise;
import org.encog.workbench.dialogs.config.EncogConfigDialog;
import org.encog.workbench.dialogs.newdoc.CreateNewDocument;
import org.encog.workbench.dialogs.select.SelectDialog;
import org.encog.workbench.dialogs.select.SelectItem;
import org.encog.workbench.dialogs.training.ProbenDialog;
import org.encog.workbench.dialogs.trainingdata.CreateTrainingDataDialog;
import org.encog.workbench.dialogs.trainingdata.TrainingDataType;
import org.encog.workbench.dialogs.wizard.ChooseWizardDialog;
import org.encog.workbench.frames.document.tree.ProjectFile;
import org.encog.workbench.frames.document.tree.ProjectItem;
import org.encog.workbench.process.CreateTrainingData;
import org.encog.workbench.process.EncogAnalystWizard;
import org.encog.workbench.tabs.BrowserFrame;
import org.encog.workbench.tabs.EncogCommonTab;
import org.encog.workbench.tabs.SupportsClipboard;
import org.encog.workbench.tabs.files.text.BasicTextTab;
import org.encog.workbench.tabs.proben.ProbenStatusTab;
import org.encog.workbench.tabs.rbf.RadialBasisFunctionsTab;
import org.encog.workbench.util.FileUtil;
public class EncogDocumentOperations {
private EncogDocumentFrame owner;
public EncogDocumentOperations(EncogDocumentFrame owner) {
this.owner = owner;
}
private void displayBugWarning() {
EncogWorkBench
.displayError(
"Can't Delete/Modify",
"Unfortunatly, due to a limitation in Java, EGB files cannot be deleted/changed once opened.\nRestart the workbench, and you will be able to delete this file.");
}
public void performEditCopy() {
EncogCommonTab tab = EncogWorkBench.getInstance().getMainWindow().getTabManager().getCurrentTab();
if( tab instanceof SupportsClipboard ) {
((SupportsClipboard)tab).clipboardCopy();
}
}
public void performEditCut() {
EncogCommonTab tab = EncogWorkBench.getInstance().getMainWindow().getTabManager().getCurrentTab();
if( tab instanceof SupportsClipboard ) {
((SupportsClipboard)tab).clipboardCut();
}
}
public void performEditPaste() {
EncogCommonTab tab = EncogWorkBench.getInstance().getMainWindow().getTabManager().getCurrentTab();
if( tab instanceof SupportsClipboard ) {
((SupportsClipboard)tab).clipboardPaste();
}
}
public void performFileNewProject() {
CreateNewDocument dialog = new CreateNewDocument(EncogWorkBench
.getInstance().getMainWindow());
dialog.getParentDirectory().setValue(
EncogWorkBench.getInstance().getEncogFolders().toString());
dialog.getProjectFilename().setValue("MyEncogProject");
if (dialog.process()) {
File parent = new File(dialog.getParentDirectory().getValue());
File project = new File(parent, dialog.getProjectFilename()
.getValue());
Directory.deleteDirectory(project); // the user was warned!
project.mkdir();
EncogWorkBench.getInstance().getMainWindow().getTree()
.refresh(project);
}
}
public void performFileChooseDirectory() {
try {
String path = DirChooser.showDialog(
EncogWorkBench.getInstance().getMainWindow(),
"Choose Folder",
EncogWorkBench.getInstance()
.getEncogFolders());
if( path!=null ) {
EncogWorkBench.getInstance().getMainWindow()
.changeDirectory(new File(path));
}
} catch (final Throwable e) {
EncogWorkBench.displayError("Can't Change Directory", e);
e.printStackTrace();
EncogWorkBench.getInstance().getMainWindow().endWait();
}
}
public void performBrowse() {
BrowserFrame browse = new BrowserFrame();
this.owner.getTabManager().openTab(browse);
}
public void performRBF() {
RadialBasisFunctionsTab rbf = new RadialBasisFunctionsTab();
this.owner.getTabManager().openTab(rbf);
}
public void performHelpAbout() {
EncogWorkBench.getInstance().getMainWindow().displayAboutTab();
}
public void performEditConfig() {
EncogConfigDialog dialog = new EncogConfigDialog(EncogWorkBench
.getInstance().getMainWindow());
EncogWorkBenchConfig config = EncogWorkBench.getInstance().getConfig();
dialog.getDefaultError().setValue(config.getDefaultError());
dialog.getThreadCount().setValue(config.getThreadCount());
dialog.getTrainingChartHistory().setValue(config.getTrainingHistory());
dialog.getDisplayTrainingImprovement().setValue(config.isShowTrainingImprovement());
dialog.getIterationStepCount().setValue(config.getIterationStepCount());
dialog.getRootDirectory().setValue(config.getProjectRoot());
//dialog.getUseOpenCL().setValue(config.isUseOpenCL());
switch (config.getErrorCalculation()) {
case RMS:
((JComboBox) dialog.getErrorCalculation().getField())
.setSelectedIndex(0);
break;
case MSE:
((JComboBox) dialog.getErrorCalculation().getField())
.setSelectedIndex(1);
break;
}
if (dialog.process()) {
config.setDefaultError(dialog.getDefaultError().getValue());
config.setThreadCount(dialog.getThreadCount().getValue());
//config.setUseOpenCL(dialog.getUseOpenCL().getValue());
switch (((JComboBox) dialog.getErrorCalculation().getField())
.getSelectedIndex()) {
case 0:
config.setErrorCalculation(ErrorCalculationMode.RMS);
break;
case 1:
config.setErrorCalculation(ErrorCalculationMode.MSE);
break;
}
EncogWorkBench.getInstance().getConfig().saveConfig();
ErrorCalculation.setMode(EncogWorkBench.getInstance().getConfig()
.getErrorCalculation());
config.setTrainingHistory(dialog.getTrainingChartHistory().getValue());
config.setShowTrainingImprovement(dialog.getDisplayTrainingImprovement().getValue());
config.setIterationStepCount(dialog.getIterationStepCount().getValue());
config.setProjectRoot(dialog.getRootDirectory().getValue());
}
}
public void performEvaluate() {
try {
EvaluateDialog dialog = new EvaluateDialog();
if (dialog.process()) {
MLMethod method = dialog.getNetwork();
MLDataSet training = dialog.getTrainingSet();
MLDataSet validation = dialog.getValidationSet();
double errorTraining = 0;
double errorValidation = 0;
if (method instanceof MLError) {
errorTraining = ((MLError) method).calculateError(training);
errorValidation = ((MLError) method).calculateError(training);
if( validation==null ) {
EncogWorkBench.displayMessage("Error For this Network", ""
+ Format.formatPercent(errorTraining));
} else {
StringBuilder str = new StringBuilder();
str.append("Training Error: ");
str.append(Format.formatPercent(errorTraining));
str.append("\n");
str.append("Validation Error: ");
str.append(Format.formatPercent(errorValidation));
EncogWorkBench.displayMessage("Result",str.toString());
}
} else {
EncogWorkBench.displayMessage("Result",
"The Machine Learning method "
+ method.getClass().getSimpleName()
+ " does not support error calculation.");
}
}
} catch (Throwable t) {
EncogWorkBench.displayError("Error Evaluating Network", t);
}
}
public void performBenchmark() {
if (EncogWorkBench
.askQuestion(
"Benchmark",
"Would you like to benchmark Encog on this machine?\nThis process will take several minutes to complete.")) {
BenchmarkDialog dialog = new BenchmarkDialog();
dialog.setVisible(true);
}
}
public void performCreateTrainingData() throws IOException {
CreateTrainingDataDialog dialog = new CreateTrainingDataDialog(
EncogWorkBench.getInstance().getMainWindow());
dialog.setTheType(TrainingDataType.CopyCSV);
if (dialog.process()) {
String name = dialog.getFilenameName();
if (name.trim().length() == 0) {
EncogWorkBench
.displayError("Error", "Must specify a filename.");
return;
}
name = FileUtil.forceExtension(name, "csv");
File targetFile = new File(EncogWorkBench.getInstance()
.getProjectDirectory(), name);
if (!EncogWorkBench.getInstance().getMainWindow().getTabManager()
.queryViews(targetFile)) {
return;
}
switch (dialog.getTheType()) {
case CopyCSV:
CreateTrainingData.copyCSV(name);
break;
case MarketWindow:
CreateTrainingData.downloadMarketData(name);
break;
case Random:
CreateTrainingData.generateRandom(name);
break;
case XORTemp:
CreateTrainingData.generateXORTemp(name);
break;
case XOR:
CreateTrainingData.copyXOR(name);
break;
case Iris:
CreateTrainingData.copyIris(name);
break;
case Sunspots:
CreateTrainingData.downloadSunspots(name);
break;
case Digits:
CreateTrainingData.copyDigits(name);
break;
case Patterns1:
CreateTrainingData.copyPatterns1(name);
break;
case Patterns2:
CreateTrainingData.copyPatterns2(name);
break;
case Download:
CreateTrainingData.downloadURL(name);
break;
case Encoder:
CreateTrainingData.generateEncoder(name);
break;
case Linear:
CreateTrainingData.generateLinear(name);
break;
case Formula:
CreateTrainingData.generateFormula(name);
break;
case SineWave:
CreateTrainingData.generateSineWave(name);
break;
}
EncogWorkBench.getInstance().refresh();
}
}
public void performQuit() {
EncogWorkBench.getInstance().getMainWindow().getTabManager().closeAll();
System.exit(0);
}
public void performFileProperties(ProjectFile selected) {
String name = selected.getFile().getName();
String newName = EncogWorkBench
.displayInput("What would you like to rename the file \""
+ name + "\" to?");
if (newName != null) {
// maybe clean out any file channels that were not cleaned out before
System.gc();
File oldFile = selected.getFile();
File dir = oldFile.getParentFile();
File newFile = new File(dir, newName);
if( !oldFile.renameTo(newFile) ) {
if( oldFile.getName().toLowerCase().endsWith(".egb")) {
displayBugWarning();
} else {
EncogWorkBench.displayError("Error", "Rename failed.");
}
}
EncogWorkBench.getInstance().refresh();
}
}
public void performSave() {
EncogCommonTab tab = this.owner.getTabManager().getCurrentTab();
if (tab != null) {
tab.save();
}
}
public void performDelete() {
boolean first = true;
List<ProjectItem> list = this.owner.getTree().getSelectedValue();
// maybe clean out any file channels that were not cleaned out before
System.gc();
for (ProjectItem selected : list) {
if (first
&& !EncogWorkBench.askQuestion("Warning",
"Are you sure you want to delete these file(s)?")) {
return;
}
first = false;
if (selected instanceof ProjectFile) {
File f = ((ProjectFile) selected).getFile();
EncogWorkBench.getInstance().getMainWindow().getTabManager().closeAll(f);
if (!f.delete()) {
if (FileUtil.getFileExt(f).equalsIgnoreCase("egb")) {
displayBugWarning();
} else {
EncogWorkBench.displayError("Can't Delete",
f.toString());
}
}
}
EncogWorkBench.getInstance().getMainWindow().getTree().refresh();
}
}
public void performEditFind() {
EncogCommonTab tab = EncogWorkBench.getInstance().getMainWindow()
.getTabManager().getCurrentTab();
if (tab instanceof BasicTextTab) {
((BasicTextTab) tab).find();
}
}
public void importFile() {
SelectItem selectBIF;
List<SelectItem> list = new ArrayList<SelectItem>();
list.add(selectBIF = new SelectItem("Bayesian Network",
"Bayesian Network contained in XML-BIF."));
SelectDialog sel = new SelectDialog(EncogWorkBench.getInstance()
.getMainWindow(), list);
sel.setVisible(true);
if (sel.getSelected() == selectBIF) {
importBIF();
}
}
public void importBIF() {
try {
final JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(EncogWorkBench.getInstance()
.getEncogFolders());
final int result = fc.showOpenDialog(owner);
if (result == JFileChooser.APPROVE_OPTION) {
BayesianNetwork net = BIFUtil.readBIF(fc.getSelectedFile());
File path = new File(EncogWorkBench.getInstance()
.getProjectDirectory(), FileUtil.forceExtension(fc
.getSelectedFile().getName(), "eg"));
EncogWorkBench.getInstance().save(path, net);
EncogWorkBench.getInstance().refresh();
}
} catch (final Throwable e) {
EncogWorkBench.displayError("Can't Change Directory", e);
e.printStackTrace();
EncogWorkBench.getInstance().getMainWindow().endWait();
}
}
public void performProben() {
ProbenDialog dialog = new ProbenDialog();
if( dialog.process() ) {
ProbenStatusTab tab = new ProbenStatusTab(
dialog.getTrainingRuns(),
dialog.getMaxIterations(),
dialog.getMethodName(),
dialog.getMethodArchitecture(),
dialog.getTrainingName(),
dialog.getTrainingArgs());
EncogWorkBench.getInstance().getMainWindow().getTabManager().openTab(tab);
}
}
public void performNoise() {
DialogNoise dialog = new DialogNoise();
if( dialog.process() ) {
File sourceFile = dialog.getSourceFile();
File targetFile = new File(sourceFile.getParent(),dialog.getTargetFile().getValue());
double inputPercent = dialog.getInputNoise().getValue();
double idealPercent = dialog.getIdealNoise().getValue();
BufferedMLDataSet sourceData = new BufferedMLDataSet(sourceFile);
BufferedMLDataSet targetData = new BufferedMLDataSet(targetFile);
targetData.beginLoad(sourceData.getInputSize(), sourceData.getIdealSize());
for(MLDataPair pair : sourceData) {
// add noise to the input
if (inputPercent > Encog.DEFAULT_DOUBLE_EQUAL) {
for (int i = 0; i < pair.getInput().size(); i++) {
double d = pair.getInput().getData(i);
double r = d * inputPercent;
d += RangeRandomizer.randomize(-r, r);
pair.getInput().setData(i, d);
}
}
// add noise to the ideal
if (idealPercent > Encog.DEFAULT_DOUBLE_EQUAL) {
for (int i = 0; i < pair.getIdeal().size(); i++) {
double d = pair.getIdeal().getData(i);
double r = d * idealPercent;
d += RangeRandomizer.randomize(-r, r);
pair.getIdeal().setData(i, d);
}
}
// write it
targetData.add(pair);
}
sourceData.close();
targetData.close();
EncogWorkBench.getInstance().getMainWindow().getTree().refresh();
}
}
public void performWizard() {
ChooseWizardDialog choose = new ChooseWizardDialog();
if( choose.process() ) {
switch(choose.getTheType()) {
case AnalystWizard:
EncogAnalystWizard.createEncogAnalyst(null);
break;
case RealTimeAnalystWizard:
ProjectFile existingEGA = EncogWorkBench.getInstance().getMainWindow().getTree().findFirstEGA();
String defName = "indicator.ega";
if( existingEGA!=null ) {
defName = existingEGA.getName();
}
String name = EncogWorkBench.displayInput("Choose a name for this file (*.ega)", defName);
if( name!=null ) {
File basePath = EncogWorkBench.getInstance().getMainWindow()
.getTree().getPath();
name = FileUtil.forceExtension(new File(name).getName(), "ega");
File path = new File(basePath, name);
EncogAnalystWizard.createRealtimeEncogAnalyst(path);
}
break;
}
}
}
public void performEditSelectAll() {
EncogCommonTab tab = EncogWorkBench.getInstance().getMainWindow().getTabManager().getCurrentTab();
if( tab instanceof SupportsClipboard ) {
((SupportsClipboard)tab).clipboardSelectAll();
}
}
}