package org.eclipse.stem.analysis.automaticexperiment;

/*******************************************************************************
 * Copyright (c) 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.stem.jobs.execution.Executable;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;



public class AutomaticExperimentJob extends Executable {
	
	protected AutomaticExperiment automaticExperiment = null;
	protected Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
	protected boolean isRunning = false;

	public AutomaticExperimentJob(String title, int sequenceNumber) {
		super(title == null ? "" : title, sequenceNumber); //$NON-NLS-1$
	}
	
	public AutomaticExperimentJob(AutomaticExperiment toRun) {
		this(toRun.getDublinCore().getTitle(), 1);
		this.automaticExperiment = toRun;
	}

	/**
	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	protected IStatus run(IProgressMonitor monitor) {
		IStatus retValue = Status.OK_STATUS;
//		isRunning = true;
//		
//		//Run
//		ErrorAnalysisAlgorithm algorithm = null;
//		String algorithmName = automaticExperiment.getErrorAnalysisAlgorithm();
//		if (algorithmName.equals("Nedler-Mead Algorithm")) {
//			algorithm = new SimplexAlgorithmExecuter(shell);
//		}
//		algorithm.setBaseScenario(automaticExperiment.getBaseScenario());
//		
//		int numOfParams = automaticExperiment.getParameters().size();
//		double[] initialParamsValues = new double[numOfParams]; 
//		double[] paramsSteps = new double[numOfParams];
//		String[] paramsNames = new String[numOfParams];
//		
//		int index = 0;
//		for (ModifiableParameter parameter:automaticExperiment.getParameters()) {
//			initialParamsValues[index] = parameter.getInitialValue();
//			paramsSteps[index] = parameter.getStep();
//			paramsNames[index] = parameter.getFeatureName();
//			index++;
//		}
//		algorithm.setInitialParametersValues(initialParamsValues);
//		algorithm.setParametersSteps(paramsSteps);
//		algorithm.setParameters(automaticExperiment.getParameters());
//		
//		double tolerance = automaticExperiment.getTolerance();
//		algorithm.setTolerance(tolerance);		
//		
//		ErrorFunction errorFunction = null;
//		String errorFunctionName = automaticExperiment.getErrorFunction();
//		if (errorFunctionName.equals("Threshold error function")) {
//			errorFunction = AnalysisFactory.eINSTANCE.createThresholdErrorFunction();
//		}
//		if (errorFunctionName.equals("Simple error function")) {
//			errorFunction = AnalysisFactory.eINSTANCE.createSimpleErrorFunction();
//		}		
//		algorithm.setErrorFunction(errorFunction);
//		
//		String refDir = automaticExperiment.getReferanceDataDir();
//		algorithm.setReferenceDataDirectory(refDir);
//		
//		algorithm.init();
//		
//		long before = System.currentTimeMillis();
//		algorithm.execute();
//		long after = System.currentTimeMillis();
//		Activator.logInformation("Time to execute the Nedler-Mead Algorithm: " + (after-before)/1000 + " seconds");
//		Activator.logInformation("Minimum value: " + algorithm.getResultValue());
//		System.out.print("Parameters values: ");
//		for (double param:algorithm.getResultParameters()) {
//			System.out.print(param + ", ");
//		}
//		Activator.logInformation();
//		
//		isRunning = false;
		return retValue;
	}

	public boolean isRunning() {
		return isRunning;
	}

	public void pause() {
		// TODO Auto-generated method stub
		
	}

	public void reset() {
		// TODO Auto-generated method stub
		
	}

	public void run() {		
		schedule();				
	}

	public void step() {
		// TODO Auto-generated method stub
		
	}

	public void stop() {
		// TODO Auto-generated method stub		
	}
	
}
