git-svn-id: http://dev.eclipse.org/svnroot/technology/org.eclipse.stem/tags/STEM_1_3_1_RELEASE@3130 92a21009-5b66-0410-b83a-dc787c41c6e9
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/.classpath b/analysis/org.eclipse.stem.analysis.automaticexperiment/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/.project b/analysis/org.eclipse.stem.analysis.automaticexperiment/.project
new file mode 100644
index 0000000..31a21f4
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>org.eclipse.stem.analysis.automaticexperiment</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.jdt.core.javabuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.ManifestBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.SchemaBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.pde.PluginNature</nature>

+		<nature>org.eclipse.jdt.core.javanature</nature>

+	</natures>

+</projectDescription>

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/META-INF/MANIFEST.MF b/analysis/org.eclipse.stem.analysis.automaticexperiment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1c3fbfd
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.stem.analysis.automaticexperiment;singleton:=true
+Bundle-Version: 1.3.1
+Bundle-Activator: org.eclipse.stem.analysis.automaticexperiment.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore,
+ org.eclipse.stem.core,
+ org.eclipse.stem.analysis,
+ org.eclipse.stem.diseasemodels,
+ org.eclipse.stem.util.loggers,
+ org.eclipse.stem.ui,
+ org.eclipse.stem.analysis,
+ org.eclipse.ui.navigator.resources
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ClassPath: .
+Import-Package: org.eclipse.emf.ecore.provider
+Export-Package: org.eclipse.stem.analysis.automaticexperiment,
+ org.eclipse.stem.analysis.automaticexperiment,
+ org.eclipse.stem.analysis.automaticexperiment.views
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/build.properties b/analysis/org.eclipse.stem.analysis.automaticexperiment/build.properties
new file mode 100644
index 0000000..f2684c5
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/build.properties
@@ -0,0 +1,12 @@
+source.. = src/

+output.. = bin/

+bin.includes = META-INF/,\

+               .,\

+               plugin.xml,\

+               plugin.properties,\

+               icons/,\

+               epl-v10.html,\

+               notice.html,\

+               plugin_zh.properties,\

+               plugin_kr.properties,\

+               plugin_de.properties

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/epl-v10.html b/analysis/org.eclipse.stem.analysis.automaticexperiment/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+  <o:Revision>2</o:Revision>
+  <o:TotalTime>3</o:TotalTime>
+  <o:Created>2004-03-05T23:03:00Z</o:Created>
+  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+  <o:Pages>4</o:Pages>
+  <o:Words>1626</o:Words>
+  <o:Characters>9270</o:Characters>
+   <o:Lines>77</o:Lines>
+  <o:Paragraphs>18</o:Paragraphs>
+  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+  <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+  <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+@font-face
+	{font-family:Tahoma;
+	panose-1:2 11 6 4 3 5 4 4 2 4;
+	mso-font-charset:0;
+	mso-generic-font-family:swiss;
+	mso-font-pitch:variable;
+	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+	{mso-style-parent:"";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	font-family:"Times New Roman";
+	mso-fareast-font-family:"Times New Roman";}
+p
+	{margin-right:0in;
+	mso-margin-top-alt:auto;
+	mso-margin-bottom-alt:auto;
+	margin-left:0in;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	font-family:"Times New Roman";
+	mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+	{mso-style-name:"Balloon Text";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:8.0pt;
+	font-family:Tahoma;
+	mso-fareast-font-family:"Times New Roman";}
+@page Section1
+	{size:8.5in 11.0in;
+	margin:1.0in 1.25in 1.0in 1.25in;
+	mso-header-margin:.5in;
+	mso-footer-margin:.5in;
+	mso-paper-source:0;}
+div.Section1
+	{page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor (&quot;Commercial
+Contributor&quot;) hereby agrees to defend and indemnify every other
+Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
+costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_ErrorFunction.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_ErrorFunction.gif
new file mode 100644
index 0000000..7be6ec4
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_ErrorFunction.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_SimpleErrorFunction.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_SimpleErrorFunction.gif
new file mode 100644
index 0000000..d63245c
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_SimpleErrorFunction.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_ThresholdErrorFunction.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_ThresholdErrorFunction.gif
new file mode 100644
index 0000000..9a3eff9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/ctool16/CreateAutomaticExperiment_errorFunc_ThresholdErrorFunction.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/AutomaticExperiment.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/AutomaticExperiment.gif
new file mode 100644
index 0000000..87fc678
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/AutomaticExperiment.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/AutomaticexperimentModelFile.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/AutomaticexperimentModelFile.gif
new file mode 100755
index 0000000..d721ef0
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/AutomaticexperimentModelFile.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/ModifiableParameter.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/ModifiableParameter.gif
new file mode 100644
index 0000000..936d56f
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/customobj16/ModifiableParameter.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/Algorithm.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/Algorithm.gif
new file mode 100644
index 0000000..a26660e
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/Algorithm.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AnalysisModelFile.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AnalysisModelFile.gif
new file mode 100644
index 0000000..4ef24bd
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AnalysisModelFile.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AutomaticExperiment.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AutomaticExperiment.gif
new file mode 100644
index 0000000..87fc678
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AutomaticExperiment.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AutomaticexperimentModelFile.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AutomaticexperimentModelFile.gif
new file mode 100644
index 0000000..d721ef0
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/AutomaticexperimentModelFile.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ErrorFunction.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ErrorFunction.gif
new file mode 100644
index 0000000..badaab0
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ErrorFunction.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ErrorResult.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ErrorResult.gif
new file mode 100644
index 0000000..98b351f
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ErrorResult.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ModifiableParameter.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ModifiableParameter.gif
new file mode 100644
index 0000000..45731fe
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ModifiableParameter.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/OptimizerAlgorithm.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/OptimizerAlgorithm.gif
new file mode 100644
index 0000000..ed87474
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/OptimizerAlgorithm.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ReferenceScenarioDataMap.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ReferenceScenarioDataMap.gif
new file mode 100644
index 0000000..ed87474
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ReferenceScenarioDataMap.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/SimpleErrorFunction.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/SimpleErrorFunction.gif
new file mode 100644
index 0000000..2124f3e
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/SimpleErrorFunction.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ThresholdErrorFunction.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ThresholdErrorFunction.gif
new file mode 100644
index 0000000..498364f
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/obj16/ThresholdErrorFunction.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/wizban/NewAnalysis.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/wizban/NewAnalysis.gif
new file mode 100644
index 0000000..440f369
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/wizban/NewAnalysis.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/wizban/NewAutomaticexperiment.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/wizban/NewAutomaticexperiment.gif
new file mode 100644
index 0000000..87fc678
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/full/wizban/NewAutomaticexperiment.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/sample.gif b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/sample.gif
new file mode 100644
index 0000000..34fb3c9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/icons/sample.gif
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/model/automaticexperience.genmodel b/analysis/org.eclipse.stem.analysis.automaticexperiment/model/automaticexperience.genmodel
new file mode 100644
index 0000000..d0787c2
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/model/automaticexperience.genmodel
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.stem.analysis.automaticexperiment/src"
+    editDirectory="/org.eclipse.stem.analysis.automaticexperiment/src" editorDirectory="/org.eclipse.stem.analysis.automaticexperiment/src"
+    modelPluginID="org.eclipse.stem.analysis.automaticexperiment" modelName="Automaticexperience"
+    importerID="org.eclipse.emf.importer.ecore" complianceLevel="6.0" copyrightFields="false"
+    usedGenPackages="../../org.eclipse.stem.analysis/model/analysis.genmodel#//analysis ../../org.eclipse.stem.core/model/core.genmodel#//common ../../org.eclipse.stem.core/model/core.genmodel#//graph ../../org.eclipse.stem.core/model/core.genmodel#//model ../../org.eclipse.stem.core/model/core.genmodel#//modifier ../../org.eclipse.stem.core/model/core.genmodel#//scenario ../../org.eclipse.stem.core/model/core.genmodel#//sequencer ../../org.eclipse.stem.core/model/core.genmodel#//solver platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore">
+  <foreignModel>automaticexperiment.ecore</foreignModel>
+  <genPackages prefix="Automaticexperiment" basePackage="org.eclipse.stem.analysis"
+      disposableProviderFactory="true" generateExampleClass="false" multipleEditorPages="false"
+      generateModelWizard="false" ecorePackage="automaticexperiment.ecore#/">
+    <genClasses ecoreClass="automaticexperiment.ecore#//AutomaticExperiment">
+      <genFeatures notify="false" children="true" createChild="false" propertySortChoices="true"
+          ecoreFeature="ecore:EReference automaticexperiment.ecore#//AutomaticExperiment/baseScenario"/>
+      <genFeatures notify="false" children="true" createChild="false" propertyCategory=""
+          propertySortChoices="true" ecoreFeature="ecore:EReference automaticexperiment.ecore#//AutomaticExperiment/parameters"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//AutomaticExperiment/errorAnalysisAlgorithm"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//AutomaticExperiment/errorFunction"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//AutomaticExperiment/tolerance"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//AutomaticExperiment/referanceDataDir"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//AutomaticExperiment/maximumNumberOfIterations"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//AutomaticExperiment/reInit"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference automaticexperiment.ecore#//AutomaticExperiment/errorFunc"/>
+    </genClasses>
+    <genClasses ecoreClass="automaticexperiment.ecore#//ModifiableParameter">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//ModifiableParameter/initialValue"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference automaticexperiment.ecore#//ModifiableParameter/feature"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//ModifiableParameter/step"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//ModifiableParameter/featureName"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//ModifiableParameter/lowerBound"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//ModifiableParameter/upperBound"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute automaticexperiment.ecore#//ModifiableParameter/targetURI"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/model/automaticexperiment.ecore b/analysis/org.eclipse.stem.analysis.automaticexperiment/model/automaticexperiment.ecore
new file mode 100644
index 0000000..83c3048
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/model/automaticexperiment.ecore
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="automaticexperiment"
+    nsURI="http:///org/eclipse/stem/core/automaticexperiment.ecore" nsPrefix="org.eclipse.stem.analysis.automaticexperiment">
+  <eClassifiers xsi:type="ecore:EClass" name="AutomaticExperiment" eSuperTypes="#//OptimizerAlgorithm">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="baseScenario" lowerBound="1"
+        eType="ecore:EClass ../../org.eclipse.stem.core/model/scenario.ecore#//Scenario"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" lowerBound="1"
+        upperBound="-1" eType="#//ModifiableParameter" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="errorAnalysisAlgorithm"
+        lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="errorFunction" lowerBound="1"
+        eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="tolerance" lowerBound="1"
+        eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="referanceDataDir" lowerBound="1"
+        eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maximumNumberOfIterations"
+        lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//ELong"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reInit" lowerBound="1"
+        eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="errorFunc" lowerBound="1"
+        eType="ecore:EClass ../../org.eclipse.stem.analysis/model/analysis.ecore#//ErrorFunction"
+        containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ModifiableParameter">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="initialValue" lowerBound="1"
+        eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="feature" lowerBound="1"
+        eType="ecore:EClass platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EStructuralFeature"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="step" lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="featureName" lowerBound="1"
+        eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lowerBound" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EDouble"
+        defaultValueLiteral="-1"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="upperBound" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EDouble"
+        defaultValueLiteral="-1"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="targetURI" eType="ecore:EDataType ../../org.eclipse.stem.core/model/common.ecore#//URI"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="OptimizerAlgorithm" eSuperTypes="../../org.eclipse.stem.core/model/common.ecore#//Identifiable"/>
+</ecore:EPackage>
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/notice.html b/analysis/org.eclipse.stem.analysis.automaticexperiment/notice.html
new file mode 100644
index 0000000..c6af966
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/notice.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+   
+<h3>Applicable Licenses</h3>   
+   
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
+   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+   
+<ul>
+	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>   
+ 
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+	<li>The top-level (root) directory</li>
+	<li>Plug-in and Fragment directories</li>
+	<li>Inside Plug-ins and Fragments packaged as JARs</li>
+	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+	<li>Feature directories</li>
+</ul>
+		
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
+	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+   
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+</body>
+</html>
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/plugin.properties b/analysis/org.eclipse.stem.analysis.automaticexperiment/plugin.properties
new file mode 100644
index 0000000..a8ab47f
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/plugin.properties
Binary files differ
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/plugin.xml b/analysis/org.eclipse.stem.analysis.automaticexperiment/plugin.xml
new file mode 100644
index 0000000..9957ddf
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/plugin.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?eclipse version="3.2"?>

+<plugin>

+	

+	<extension-point id="algorithm" name="%EP_Algorithm" schema="schema/algorithm.exsd"/>

+	

+   <extension

+         point="org.eclipse.ui.newWizards">

+         <wizard

+            category="org.eclipse.stem.ui.wizards.stemcategory"

+            class="org.eclipse.stem.analysis.automaticexperiment.ui.NewAutomaticExperimentWizard"

+            icon="icons/full/customobj16/AutomaticExperiment.gif"

+            id="org.eclipse.stem.ui.wizards.newautoexperiment"

+            name="Automatic Experiment">

+      </wizard>

+   </extension>

+   

+	<extension

+        point="org.eclipse.ui.menus">      

+      <menuContribution

+            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">

+         <toolbar

+               id="org.eclipse.stem.ui.toolbar.newwizards">

+            <command

+                  commandId="org.eclipse.stem.ui.command.wiz.autoexperiment"

+                  icon="icons/full/customobj16/AutomaticExperiment.gif"

+                  label="Automatic Experiment"

+                  style="push"

+                  tooltip="Automatic Experiment">

+            </command>

+            <separator

+                  name="additions">

+            </separator>

+         </toolbar>

+      </menuContribution>

+     

+  </extension>

+  

+  <extension

+        id="org.eclipse.stem.ui.STEMPerspective"

+        point="org.eclipse.ui.perspectives">

+     <perspective

+           class="org.eclipse.stem.analysis.automaticexperiment.perspectives.AutomaticExperiment"

+           icon="icons/full/customobj16/AutomaticExperiment.gif"

+           id="org.eclipse.stem.analysis.automaticexperiment.perspective"

+           name="%_UI_AutomaticExperiment_Perspective">

+     </perspective>

+  </extension>

+  <extension

+         point="org.eclipse.ui.views">

+      <view

+            allowMultiple="true"

+            category="org.eclipse.stem.ui.views"

+            class="org.eclipse.stem.analysis.automaticexperiment.views.AutoExpView"

+            icon="icons/full/customobj16/AutomaticExperiment.gif"

+            id="org.eclipse.stem.analysis.automaticexperiment"

+            name="%AE_View">

+      </view>

+   </extension>

+  <extension

+        point="org.eclipse.ui.commands">

+     <category

+           description="%_UI_STEM_WizCmd_Cat_Desc"

+           id="org.eclipse.stem.ui.wizards"

+           name="%_UI_STEM_WizCmd_Cat_Name">

+     </category>     

+     <command

+           defaultHandler="org.eclipse.stem.analysis.automaticexperiment.ui.NewAutomaticExperimentWizard$NewAutomaticExperimentWizardCommandHandler"

+           description="New Automatic Experiment"

+           id="org.eclipse.stem.ui.command.wiz.autoexperiment"

+           name="New Automatic Experiment">

+     </command>

+  </extension>

+  <extension

+        point="org.eclipse.ui.editors">

+     <editor

+          class="org.eclipse.stem.analysis.automaticexperiment.presentation.AutomaticexperimentEditor"

+          contributorClass="org.eclipse.stem.analysis.automaticexperiment.presentation.AutomaticexperimentActionBarContributor"

+          default="false"

+          extensions="automaticexperiment"

+          icon="icons/full/customobj16/AutomaticExperiment.gif"

+          id="automaticexperiment.presentation.AutomaticExperimentEditorID"

+          name="Automatic Experiment Editor">

+    </editor>

+  </extension>

+  

+  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">

+      <factory

+            uri="http:///org/eclipse/stem/core/automaticexperiment.ecore"

+            class="org.eclipse.stem.analysis.automaticexperiment.provider.AutomaticexperimentItemProviderAdapterFactory"

+            supportedTypes=

+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider

+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider

+               org.eclipse.emf.edit.provider.ITreeItemContentProvider

+               org.eclipse.emf.edit.provider.IItemLabelProvider

+               org.eclipse.emf.edit.provider.IItemPropertySource"/>

+   </extension>

+   

+   <extension point="org.eclipse.emf.ecore.generated_package">

+      <package

+            uri="http:///org/eclipse/stem/core/automaticexperiment.ecore"

+            class="org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage"

+            genModel="model/automaticexperiment.genmodel"/>

+   </extension>

+  

+  <extension

+        point="org.eclipse.core.runtime.adapters">

+          <factory 

+            class="org.eclipse.stem.jobs.adapters.executable.IdentifiableExecutableAdapterFactory" 

+            adaptableType="org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl">

+            <adapter type="org.eclipse.stem.jobs.execution.IExecutable"/>

+         </factory>

+	</extension>

+	

+	<extension

+        point="org.eclipse.stem.analysis.automaticexperiment.algorithm">

+     <classdef class="org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl"/>

+     <dublin_core

+           category_id="/"

+           creator="%dc_creator_edlund"

+           description="%dc_desc_NELDER"

+           identifier="foo"

+           title="%dc_desc_NELDER"/>

+  </extension>

+  

+</plugin>

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/schema/algorithm.exsd b/analysis/org.eclipse.stem.analysis.automaticexperiment/schema/algorithm.exsd
new file mode 100644
index 0000000..c4f8edc
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/schema/algorithm.exsd
@@ -0,0 +1,100 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.stem.analysis.automaticexperiment" xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.stem.analysis.automaticexperiment" id="org.eclipse.stem.analysis.automaticexperiment.algorithm" name="Algorithm"/>
+      </appInfo>
+      <documentation>
+         The expension point is used for adding new algorithms for numerical optimization of STEM models
+      </documentation>
+   </annotation>
+
+   <include schemaLocation="schema://org.eclipse.stem.core/schema/dublin_core.exsd"/>
+
+    <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="classdef"/>
+            <element ref="dublin_core"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="classdef">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.stem.diseasemodels.standard.impl.DiseaseModelImpl:org.eclipse.stem.diseasemodels.standard.DiseaseModel"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ALGORITHM_STATUS.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ALGORITHM_STATUS.java
new file mode 100644
index 0000000..0971476
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ALGORITHM_STATUS.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+
+package org.eclipse.stem.analysis.automaticexperiment;
+
+public enum ALGORITHM_STATUS {
+	STARTING_SIMULATION,
+	FINISHED_SIMULATION,
+	FINISHED_ALGORITHM,
+	RESTARTED_ALGORITHM;
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AbstractErrorAnalysisAlgorithm.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AbstractErrorAnalysisAlgorithm.java
new file mode 100644
index 0000000..5973f59
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AbstractErrorAnalysisAlgorithm.java
@@ -0,0 +1,127 @@
+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 java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.stem.analysis.AnalysisFactory;

+import org.eclipse.stem.analysis.ErrorFunction;

+import org.eclipse.stem.core.scenario.Scenario;

+

+

+public abstract class AbstractErrorAnalysisAlgorithm implements

+		ErrorAnalysisAlgorithm {

+	

+	protected Scenario baseScenario = null;

+	protected SimplexAlgorithm simplexAlgorithm = new NelderMeadAlgorithm();

+	protected SimplexFunction simplexFnToMinimize = null;

+	protected ErrorFunction errorFunction = null;

+	protected double[] initialParamsValues = null;

+	protected double[] paramsInitialSteps = null;

+	protected double tolerance = -1;

+	protected String referenceDataDirectory = null;

+	protected long maxNumOfIterations = -1;

+	protected List<ModifiableParameter> parameters = null;

+	boolean repeat = false;

+	private ArrayList<ErrorAnalysisAlgorithmListener> listeners = new ArrayList<ErrorAnalysisAlgorithmListener>();

+	

+	abstract public void execute();

+

+	public void setBaseScenario(Scenario baseScenario) {

+		this.baseScenario = baseScenario;

+	}

+

+	public void setTolerance(double tolerance) {

+		this.tolerance = tolerance;

+	}

+

+	public void setErrorFunction(ErrorFunction errorFunction) {

+		this.errorFunction = errorFunction;

+	}

+

+	public void setReferenceDataDirectory(String referenceDataDir) {

+		this.referenceDataDirectory = referenceDataDir;

+	}

+

+	public void init(AutomaticExperiment automaticExperiment) {

+		setBaseScenario(automaticExperiment.getBaseScenario());

+		setParameters(automaticExperiment.getParameters());

+		

+		double tolerance = automaticExperiment.getTolerance();

+		setTolerance(tolerance);		

+		long maxIterations = automaticExperiment.getMaximumNumberOfIterations();

+		setMaximumNumberOfIterations(maxIterations);

+		

+		boolean repeatUntilNoImprovement = automaticExperiment.isReInit();

+		setReInit(repeatUntilNoImprovement);

+		

+		ErrorFunction errorFunction = null;

+		String errorFunctionName = automaticExperiment.getErrorFunction();

+		errorFunction = automaticExperiment.getErrorFunc();

+		if(errorFunction == null) {

+			// This is for backwards compatability with old versions of automated experiments 

+			if (errorFunctionName.equals("Threshold error function")) { //$NON-NLS-1$

+				errorFunction = AnalysisFactory.eINSTANCE.createThresholdErrorFunction();

+			}

+			if (errorFunctionName.equals("Simple error function")) { //$NON-NLS-1$

+				errorFunction = AnalysisFactory.eINSTANCE.createSimpleErrorFunction();

+			}		

+		}

+		setErrorFunction(errorFunction);

+		

+		String refDir = automaticExperiment.getReferanceDataDir();

+		setReferenceDataDirectory(refDir);

+	}

+

+	public void reinitStartParams(AutomaticExperiment experiment, double [] vals) {

+		int i=0;

+		for(ModifiableParameter p:experiment.getParameters()) {

+			p.setInitialValue(vals[i++]);

+		}

+		init(experiment);

+	}

+	public double[] getResultParameters() {

+		return simplexAlgorithm.getMinimumParametersValues();

+	}

+

+	public double getResultValue() {

+		return simplexAlgorithm.getMinimumFunctionValue();

+	}

+

+	public void setMaximumNumberOfIterations(long maxNumOfIterations) {

+		this.maxNumOfIterations = maxNumOfIterations;

+	}

+

+	public void setReInit(boolean repeat) {

+		this.repeat = repeat;

+	}

+	public void setParameters(List<ModifiableParameter> parameters) {

+		this.parameters = parameters;

+		paramsInitialSteps = new double[parameters.size()];

+		initialParamsValues = new double[parameters.size()];

+		int i=0;

+		for (final ModifiableParameter param:parameters) {

+			paramsInitialSteps[i] = param.getStep();

+			initialParamsValues[i] = param.getInitialValue();

+			i++;

+		}

+	}

+	

+	public void addListener(ErrorAnalysisAlgorithmListener l) {this.listeners.add(l);}

+	public void clearListeners() {this.listeners.clear();}

+	

+	protected void fireEvent(ErrorAnalysisAlgorithmEvent evt) {

+		for(ErrorAnalysisAlgorithmListener l:listeners) l.eventReceived(evt);

+	}

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/Activator.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/Activator.java
new file mode 100644
index 0000000..17de2d8
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/Activator.java
@@ -0,0 +1,167 @@
+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.IStatus;

+import org.eclipse.core.runtime.Status;

+import org.eclipse.jface.resource.ImageDescriptor;

+import org.eclipse.stem.analysis.automaticexperiment.executable.AutomaticExperimentExecutableAdapterFactory;

+import org.eclipse.stem.analysis.automaticexperiment.ui.AutomaticExperimentCompositeEditorAdapterFactory;

+import org.eclipse.ui.plugin.AbstractUIPlugin;

+import org.osgi.framework.BundleContext;

+

+/**

+ * The activator class controls the plug-in life cycle

+ */

+public class Activator extends AbstractUIPlugin {

+

+	// The plug-in ID

+	public static final String PLUGIN_ID = "org.eclipse.stem.analysis.automaticexperiment"; //$NON-NLS-1$

+

+	// The shared instance

+	private static Activator plugin;

+	

+	/**

+	 * The constructor

+	 */

+	public Activator() {

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)

+	 */

+	@Override

+	public void start(BundleContext context) throws Exception {

+		super.start(context);

+		plugin = this;

+		new AutomaticExperimentExecutableAdapterFactory();

+		new AutomaticExperimentCompositeEditorAdapterFactory();

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)

+	 */

+	@Override

+	public void stop(BundleContext context) throws Exception {

+		plugin = null;

+		super.stop(context);

+	}

+

+	/**

+	 * Returns the shared instance

+	 *

+	 * @return the shared instance

+	 */

+	public static Activator getDefault() {

+		return plugin;

+	}

+	

+	/**

+	 * Returns an image descriptor for the image file at the given plug-in

+	 * relative path

+	 * 

+	 * @param path

+	 *            the path

+	 * @return the image descriptor

+	 */

+	public static ImageDescriptor getImageDescriptor(String path) {

+		return imageDescriptorFromPlugin(PLUGIN_ID, path);

+	}

+

+	/**

+	 * Log an error to the ILog for this plugin

+	 * 

+	 * @param message

+	 *            the localized error message text

+	 * @param exception

+	 *            the associated exception, or null

+	 */

+	public static void logError(String message, Throwable exception) {

+		// Do we have a plugin?

+		if (plugin != null) {

+			// Yes

+			plugin.getLog().log(

+					new Status(IStatus.ERROR, plugin.getBundle()

+							.getSymbolicName(), 0, message, exception));

+		} else {

+			// No

+			System.out.println(message);

+			// Exception?

+			if (exception != null) {

+				// Yes

+				System.out.println(exception.getMessage());

+			} // if

+		}

+	} // logError

+	

+	

+

+	/**

+	 * Log information to the ILog for this plugin

+	 * 

+	 * @param message

+	 *            the localized information message text

+	 * @param exception

+	 *            the associated exception, or null

+	 */

+	public static void logInformation(String message, Throwable exception) {

+		// Do we have a plugin?

+		if (plugin != null) {

+			// Yes

+			plugin.getLog().log(

+					new Status(IStatus.INFO, plugin.getBundle().getSymbolicName(),

+							0, message, exception));

+		}

+		else {

+			// No

+			System.out.println(message);

+			// Exception?

+			if (exception != null) {

+				// Yes

+				System.out.println(exception.getMessage());

+			} // if 

+		}

+	} // logInformation

+	

+	

+	/**

+	 * Log information to the ILog for this plugin

+	 * The method is overloaded to allow for logInformation without an error 

+	 * method sets the error to null. This should be used instead of System.out.println

+	 * throughout the code.

+	 * @param message

+	 *            the localized information message text

+	 *

+	 */

+	public static void logInformation(String message) {

+		// Do we have a plugin?

+		if (plugin != null) {

+			// Yes

+			plugin.getLog().log(

+					new Status(IStatus.INFO, plugin.getBundle().getSymbolicName(),

+							0, message, null));

+		}

+		else {

+			// No

+			System.out.println(message);

+		}

+	} // logInformation

+

+	

+	

+

+

+	

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperiment.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperiment.java
new file mode 100644
index 0000000..00467bf
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperiment.java
@@ -0,0 +1,271 @@
+package org.eclipse.stem.analysis.automaticexperiment;
+
+/******************************************************************************* 
+ * Copyright (c) 2011 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.emf.common.util.EList;
+import org.eclipse.stem.analysis.ErrorFunction;
+import org.eclipse.stem.core.scenario.Scenario;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Automatic Experiment</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getBaseScenario <em>Base Scenario</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getParameters <em>Parameters</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorAnalysisAlgorithm <em>Error Analysis Algorithm</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunction <em>Error Function</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getTolerance <em>Tolerance</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getReferanceDataDir <em>Referance Data Dir</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getMaximumNumberOfIterations <em>Maximum Number Of Iterations</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#isReInit <em>Re Init</em>}</li>
+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunc <em>Error Func</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment()
+ * @model
+ * @generated
+ */
+public interface AutomaticExperiment extends OptimizerAlgorithm {
+	/**
+	 * Returns the value of the '<em><b>Base Scenario</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Scenario</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Scenario</em>' reference.
+	 * @see #setBaseScenario(Scenario)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_BaseScenario()
+	 * @model required="true"
+	 * @generated
+	 */
+	Scenario getBaseScenario();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getBaseScenario <em>Base Scenario</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Scenario</em>' reference.
+	 * @see #getBaseScenario()
+	 * @generated
+	 */
+	void setBaseScenario(Scenario value);
+
+	/**
+	 * Returns the value of the '<em><b>Parameters</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parameters</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parameters</em>' containment reference list.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_Parameters()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	EList<ModifiableParameter> getParameters();
+
+	/**
+	 * Returns the value of the '<em><b>Error Analysis Algorithm</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Error Analysis Algorithm</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Error Analysis Algorithm</em>' attribute.
+	 * @see #setErrorAnalysisAlgorithm(String)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_ErrorAnalysisAlgorithm()
+	 * @model required="true"
+	 * @generated NOT
+	 * @deprecated
+	 */
+	String getErrorAnalysisAlgorithm();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorAnalysisAlgorithm <em>Error Analysis Algorithm</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Error Analysis Algorithm</em>' attribute.
+	 * @see #getErrorAnalysisAlgorithm()
+	 * @generated NOT
+	 * @deprecated
+	 */
+	void setErrorAnalysisAlgorithm(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Error Function</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Error Function</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Error Function</em>' attribute.
+	 * @see #setErrorFunction(String)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_ErrorFunction()
+	 * @model required="true"
+	 * @generated NOT
+	 * @deprecated
+	 */
+	String getErrorFunction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunction <em>Error Function</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Error Function</em>' attribute.
+	 * @see #getErrorFunction()
+	 * @generated NOT
+	 * @deprecated
+	 */
+	void setErrorFunction(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Tolerance</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Tolerance</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Tolerance</em>' attribute.
+	 * @see #setTolerance(double)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_Tolerance()
+	 * @model required="true"
+	 * @generated
+	 */
+	double getTolerance();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getTolerance <em>Tolerance</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Tolerance</em>' attribute.
+	 * @see #getTolerance()
+	 * @generated
+	 */
+	void setTolerance(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Referance Data Dir</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Referance Data Dir</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Referance Data Dir</em>' attribute.
+	 * @see #setReferanceDataDir(String)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_ReferanceDataDir()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getReferanceDataDir();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getReferanceDataDir <em>Referance Data Dir</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Referance Data Dir</em>' attribute.
+	 * @see #getReferanceDataDir()
+	 * @generated
+	 */
+	void setReferanceDataDir(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Maximum Number Of Iterations</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Maximum Number Of Iterations</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Maximum Number Of Iterations</em>' attribute.
+	 * @see #setMaximumNumberOfIterations(long)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_MaximumNumberOfIterations()
+	 * @model required="true"
+	 * @generated
+	 */
+	long getMaximumNumberOfIterations();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getMaximumNumberOfIterations <em>Maximum Number Of Iterations</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Maximum Number Of Iterations</em>' attribute.
+	 * @see #getMaximumNumberOfIterations()
+	 * @generated
+	 */
+	void setMaximumNumberOfIterations(long value);
+
+	/**
+	 * Returns the value of the '<em><b>Re Init</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Re Init</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Re Init</em>' attribute.
+	 * @see #setReInit(boolean)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_ReInit()
+	 * @model required="true"
+	 * @generated
+	 */
+	boolean isReInit();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#isReInit <em>Re Init</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Re Init</em>' attribute.
+	 * @see #isReInit()
+	 * @generated
+	 */
+	void setReInit(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Error Func</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Error Func</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Error Func</em>' containment reference.
+	 * @see #setErrorFunc(ErrorFunction)
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getAutomaticExperiment_ErrorFunc()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	ErrorFunction getErrorFunc();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunc <em>Error Func</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Error Func</em>' containment reference.
+	 * @see #getErrorFunc()
+	 * @generated
+	 */
+	void setErrorFunc(ErrorFunction value);
+
+} // AutomaticExperiment
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentJob.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentJob.java
new file mode 100644
index 0000000..c06d572
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentJob.java
@@ -0,0 +1,130 @@
+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		

+	}

+	

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManager.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManager.java
new file mode 100644
index 0000000..524a9f9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManager.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+package org.eclipse.stem.analysis.automaticexperiment;
+
+import java.util.ArrayList;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+
+public class AutomaticExperimentManager {
+	private static final AutomaticExperimentManager instance = new AutomaticExperimentManager();
+	protected static boolean QUIT_NOW = false;
+	protected static boolean PAUSE_NOW = false;
+	protected static ErrorAnalysisAlgorithm currentRunningAlgorithm = null;
+	protected static AutomaticExperiment currentRunningExperient;
+	
+	public void quitNow() {
+		QUIT_NOW = true;
+	}
+	
+	public static void pause() {
+		PAUSE_NOW = true;
+		// TODO  Please pause now if we want pause
+	}
+	public static void continueRun() {
+		PAUSE_NOW = false;
+		// TODO  Please continue now if we want Continue
+	}
+	
+	public void restartNow(double[] restartParamValues) {
+		// TODO   Restart with the valued provided
+		QUIT_NOW = false;
+		currentRunningAlgorithm.reinitStartParams(currentRunningExperient, restartParamValues);
+		currentRunningAlgorithm.clearListeners();
+		// Stefan fix, we can't hold up the UI thread, it causes memory leaks
+		Job j = new Job("Minimizer algorith") {
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				currentRunningAlgorithm.execute();
+				return Status.OK_STATUS;
+			}
+		};
+		
+		AutomaticExperimentManagerEvent newEvent = new AutomaticExperimentManagerEvent(currentRunningExperient, currentRunningAlgorithm, MANAGER_STATUS.SCHEDULED);
+		fireEvent(newEvent);
+		j.schedule();
+	}
+
+	private ArrayList<AutomaticExperimentManagerListener> listeners = new ArrayList<AutomaticExperimentManagerListener>();
+	
+	private AutomaticExperimentManager() {
+	}
+	public static AutomaticExperimentManager getInstance() 
+	{
+		return instance;
+	}
+	
+	public ErrorAnalysisAlgorithm createAlgorithm(OptimizerAlgorithm alg) {
+		QUIT_NOW = false; // in case RESTARTING
+		PAUSE_NOW = false;
+		ErrorAnalysisAlgorithm result = ErrorAnalysisAlgorithmFactory.INSTANCE.createErrorAnalysisAlgorithm(alg);
+		return result;
+	}
+	
+	public void executeAlgorithm(final ErrorAnalysisAlgorithm algorithm, final AutomaticExperiment automaticExperiment) {
+		QUIT_NOW = false; // in case RESTARTING
+		PAUSE_NOW = false;
+		currentRunningAlgorithm = algorithm;
+		currentRunningExperient = automaticExperiment;
+		
+		algorithm.init(automaticExperiment, algorithm);
+		// Stefan fix, we can't hold up the UI thread, it causes memory leaks
+		Job j = new Job("Minimizer algorith") {
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				algorithm.execute();
+				return Status.OK_STATUS;
+			}
+		};
+		
+		AutomaticExperimentManagerEvent newEvent = new AutomaticExperimentManagerEvent(automaticExperiment, algorithm, MANAGER_STATUS.SCHEDULED);
+		fireEvent(newEvent);
+		j.schedule();
+	}
+	
+	private  void fireEvent(AutomaticExperimentManagerEvent evt) {
+		for(AutomaticExperimentManagerListener l:listeners) l.eventReceived(evt);
+	}
+	
+	public void addListener(AutomaticExperimentManagerListener l) {
+		this.listeners.add(l);
+	}
+	
+	public void clearListeners() {
+		this.listeners.clear();
+	}
+	public static void main() {
+		QUIT_NOW = false; // in case RESTARTING
+		PAUSE_NOW = false;
+		AutomaticExperimentManager manager = AutomaticExperimentManager.getInstance();
+		manager.addListener(new AutomaticExperimentManagerListener() {
+			
+			public void eventReceived(AutomaticExperimentManagerEvent evt) {
+				if(evt.status == MANAGER_STATUS.SCHEDULED) {
+					ErrorAnalysisAlgorithm alg = evt.algorithm;
+					
+					alg.addListener(new ErrorAnalysisAlgorithmListener() {
+						
+						public void eventReceived(ErrorAnalysisAlgorithmEvent evt) {
+							if(evt.status == ALGORITHM_STATUS.FINISHED_ALGORITHM) {
+								// The algorithm has finished. Smallest value in 
+								//evt.result
+							} else if(evt.status == ALGORITHM_STATUS.FINISHED_SIMULATION) {
+								// One simulation is done. The result is in evt.result
+							} else if(evt.status == ALGORITHM_STATUS.RESTARTED_ALGORITHM) {
+								// The algorithm has restarted. Smallest value in 
+								// evt.result
+							}
+						}
+					});
+				}
+			}
+		});
+	}
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManagerEvent.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManagerEvent.java
new file mode 100644
index 0000000..9633491
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManagerEvent.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+package org.eclipse.stem.analysis.automaticexperiment;
+
+
+public class AutomaticExperimentManagerEvent {
+
+	public AutomaticExperiment experiment;
+	public ErrorAnalysisAlgorithm algorithm;
+	public MANAGER_STATUS status;
+	
+	public AutomaticExperimentManagerEvent(AutomaticExperiment automaticExperiment, ErrorAnalysisAlgorithm algorithm, MANAGER_STATUS stat) {
+		this.experiment = automaticExperiment;
+		this.algorithm = algorithm;
+		this.status = stat;
+	}
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManagerListener.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManagerListener.java
new file mode 100644
index 0000000..33c8e24
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticExperimentManagerListener.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+package org.eclipse.stem.analysis.automaticexperiment;
+
+public interface AutomaticExperimentManagerListener {
+
+	public void eventReceived(AutomaticExperimentManagerEvent evt);
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticexperimentFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticexperimentFactory.java
new file mode 100644
index 0000000..e4eb2f1
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticexperimentFactory.java
@@ -0,0 +1,69 @@
+package org.eclipse.stem.analysis.automaticexperiment;
+
+/******************************************************************************* 
+ * Copyright (c) 2011 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.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage
+ * @generated
+ */
+public interface AutomaticexperimentFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	AutomaticexperimentFactory eINSTANCE = org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Automatic Experiment</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Automatic Experiment</em>'.
+	 * @generated
+	 */
+	AutomaticExperiment createAutomaticExperiment();
+
+	/**
+	 * Returns a new object of class '<em>Modifiable Parameter</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Modifiable Parameter</em>'.
+	 * @generated
+	 */
+	ModifiableParameter createModifiableParameter();
+
+	/**
+	 * Returns a new object of class '<em>Optimizer Algorithm</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Optimizer Algorithm</em>'.
+	 * @generated
+	 */
+	OptimizerAlgorithm createOptimizerAlgorithm();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	AutomaticexperimentPackage getAutomaticexperimentPackage();
+
+} //AutomaticexperimentFactory
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticexperimentPackage.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticexperimentPackage.java
new file mode 100644
index 0000000..dcae907
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/AutomaticexperimentPackage.java
@@ -0,0 +1,712 @@
+package org.eclipse.stem.analysis.automaticexperiment;
+
+/******************************************************************************* 
+ * Copyright (c) 2011 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.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.stem.core.common.CommonPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface AutomaticexperimentPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "automaticexperiment";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http:///org/eclipse/stem/core/automaticexperiment.ecore";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "org.eclipse.stem.analysis.automaticexperiment";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	AutomaticexperimentPackage eINSTANCE = org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.stem.analysis.automaticexperiment.impl.OptimizerAlgorithmImpl <em>Optimizer Algorithm</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.stem.analysis.automaticexperiment.impl.OptimizerAlgorithmImpl
+	 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl#getOptimizerAlgorithm()
+	 * @generated
+	 */
+	int OPTIMIZER_ALGORITHM = 2;
+
+	/**
+	 * The feature id for the '<em><b>URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OPTIMIZER_ALGORITHM__URI = CommonPackage.IDENTIFIABLE__URI;
+
+	/**
+	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OPTIMIZER_ALGORITHM__TYPE_URI = CommonPackage.IDENTIFIABLE__TYPE_URI;
+
+	/**
+	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OPTIMIZER_ALGORITHM__DUBLIN_CORE = CommonPackage.IDENTIFIABLE__DUBLIN_CORE;
+
+	/**
+	 * The number of structural features of the '<em>Optimizer Algorithm</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OPTIMIZER_ALGORITHM_FEATURE_COUNT = CommonPackage.IDENTIFIABLE_FEATURE_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl <em>Automatic Experiment</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl
+	 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl#getAutomaticExperiment()
+	 * @generated
+	 */
+	int AUTOMATIC_EXPERIMENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__URI = OPTIMIZER_ALGORITHM__URI;
+
+	/**
+	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__TYPE_URI = OPTIMIZER_ALGORITHM__TYPE_URI;
+
+	/**
+	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__DUBLIN_CORE = OPTIMIZER_ALGORITHM__DUBLIN_CORE;
+
+	/**
+	 * The feature id for the '<em><b>Base Scenario</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__BASE_SCENARIO = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Parameters</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__PARAMETERS = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Error Analysis Algorithm</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Error Function</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__ERROR_FUNCTION = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Tolerance</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__TOLERANCE = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Referance Data Dir</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Maximum Number Of Iterations</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>Re Init</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__RE_INIT = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 7;
+
+	/**
+	 * The feature id for the '<em><b>Error Func</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT__ERROR_FUNC = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 8;
+
+	/**
+	 * The number of structural features of the '<em>Automatic Experiment</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUTOMATIC_EXPERIMENT_FEATURE_COUNT = OPTIMIZER_ALGORITHM_FEATURE_COUNT + 9;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl <em>Modifiable Parameter</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl
+	 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl#getModifiableParameter()
+	 * @generated
+	 */
+	int MODIFIABLE_PARAMETER = 1;
+
+	/**
+	 * The feature id for the '<em><b>Initial Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__INITIAL_VALUE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Feature</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__FEATURE = 1;
+
+	/**
+	 * The feature id for the '<em><b>Step</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__STEP = 2;
+
+	/**
+	 * The feature id for the '<em><b>Feature Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__FEATURE_NAME = 3;
+
+	/**
+	 * The feature id for the '<em><b>Lower Bound</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__LOWER_BOUND = 4;
+
+	/**
+	 * The feature id for the '<em><b>Upper Bound</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__UPPER_BOUND = 5;
+
+	/**
+	 * The feature id for the '<em><b>Target URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER__TARGET_URI = 6;
+
+	/**
+	 * The number of structural features of the '<em>Modifiable Parameter</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIABLE_PARAMETER_FEATURE_COUNT = 7;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment <em>Automatic Experiment</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Automatic Experiment</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment
+	 * @generated
+	 */
+	EClass getAutomaticExperiment();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getBaseScenario <em>Base Scenario</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Scenario</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getBaseScenario()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EReference getAutomaticExperiment_BaseScenario();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getParameters <em>Parameters</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Parameters</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getParameters()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EReference getAutomaticExperiment_Parameters();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorAnalysisAlgorithm <em>Error Analysis Algorithm</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Error Analysis Algorithm</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorAnalysisAlgorithm()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EAttribute getAutomaticExperiment_ErrorAnalysisAlgorithm();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunction <em>Error Function</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Error Function</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunction()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EAttribute getAutomaticExperiment_ErrorFunction();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getTolerance <em>Tolerance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Tolerance</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getTolerance()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EAttribute getAutomaticExperiment_Tolerance();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getReferanceDataDir <em>Referance Data Dir</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Referance Data Dir</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getReferanceDataDir()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EAttribute getAutomaticExperiment_ReferanceDataDir();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getMaximumNumberOfIterations <em>Maximum Number Of Iterations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Maximum Number Of Iterations</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getMaximumNumberOfIterations()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EAttribute getAutomaticExperiment_MaximumNumberOfIterations();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#isReInit <em>Re Init</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Re Init</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#isReInit()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EAttribute getAutomaticExperiment_ReInit();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunc <em>Error Func</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Error Func</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment#getErrorFunc()
+	 * @see #getAutomaticExperiment()
+	 * @generated
+	 */
+	EReference getAutomaticExperiment_ErrorFunc();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter <em>Modifiable Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Modifiable Parameter</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter
+	 * @generated
+	 */
+	EClass getModifiableParameter();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getInitialValue <em>Initial Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Initial Value</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getInitialValue()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EAttribute getModifiableParameter_InitialValue();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeature <em>Feature</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Feature</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeature()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EReference getModifiableParameter_Feature();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getStep <em>Step</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Step</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getStep()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EAttribute getModifiableParameter_Step();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeatureName <em>Feature Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Feature Name</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeatureName()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EAttribute getModifiableParameter_FeatureName();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getLowerBound <em>Lower Bound</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Lower Bound</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getLowerBound()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EAttribute getModifiableParameter_LowerBound();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getUpperBound <em>Upper Bound</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Upper Bound</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getUpperBound()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EAttribute getModifiableParameter_UpperBound();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getTargetURI <em>Target URI</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Target URI</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getTargetURI()
+	 * @see #getModifiableParameter()
+	 * @generated
+	 */
+	EAttribute getModifiableParameter_TargetURI();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm <em>Optimizer Algorithm</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Optimizer Algorithm</em>'.
+	 * @see org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm
+	 * @generated
+	 */
+	EClass getOptimizerAlgorithm();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	AutomaticexperimentFactory getAutomaticexperimentFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl <em>Automatic Experiment</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl
+		 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl#getAutomaticExperiment()
+		 * @generated
+		 */
+		EClass AUTOMATIC_EXPERIMENT = eINSTANCE.getAutomaticExperiment();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Scenario</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference AUTOMATIC_EXPERIMENT__BASE_SCENARIO = eINSTANCE.getAutomaticExperiment_BaseScenario();
+
+		/**
+		 * The meta object literal for the '<em><b>Parameters</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference AUTOMATIC_EXPERIMENT__PARAMETERS = eINSTANCE.getAutomaticExperiment_Parameters();
+
+		/**
+		 * The meta object literal for the '<em><b>Error Analysis Algorithm</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM = eINSTANCE.getAutomaticExperiment_ErrorAnalysisAlgorithm();
+
+		/**
+		 * The meta object literal for the '<em><b>Error Function</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute AUTOMATIC_EXPERIMENT__ERROR_FUNCTION = eINSTANCE.getAutomaticExperiment_ErrorFunction();
+
+		/**
+		 * The meta object literal for the '<em><b>Tolerance</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute AUTOMATIC_EXPERIMENT__TOLERANCE = eINSTANCE.getAutomaticExperiment_Tolerance();
+
+		/**
+		 * The meta object literal for the '<em><b>Referance Data Dir</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR = eINSTANCE.getAutomaticExperiment_ReferanceDataDir();
+
+		/**
+		 * The meta object literal for the '<em><b>Maximum Number Of Iterations</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS = eINSTANCE.getAutomaticExperiment_MaximumNumberOfIterations();
+
+		/**
+		 * The meta object literal for the '<em><b>Re Init</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute AUTOMATIC_EXPERIMENT__RE_INIT = eINSTANCE.getAutomaticExperiment_ReInit();
+
+		/**
+		 * The meta object literal for the '<em><b>Error Func</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference AUTOMATIC_EXPERIMENT__ERROR_FUNC = eINSTANCE.getAutomaticExperiment_ErrorFunc();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl <em>Modifiable Parameter</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl
+		 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl#getModifiableParameter()
+		 * @generated
+		 */
+		EClass MODIFIABLE_PARAMETER = eINSTANCE.getModifiableParameter();
+
+		/**
+		 * The meta object literal for the '<em><b>Initial Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIABLE_PARAMETER__INITIAL_VALUE = eINSTANCE.getModifiableParameter_InitialValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Feature</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODIFIABLE_PARAMETER__FEATURE = eINSTANCE.getModifiableParameter_Feature();
+
+		/**
+		 * The meta object literal for the '<em><b>Step</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIABLE_PARAMETER__STEP = eINSTANCE.getModifiableParameter_Step();
+
+		/**
+		 * The meta object literal for the '<em><b>Feature Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIABLE_PARAMETER__FEATURE_NAME = eINSTANCE.getModifiableParameter_FeatureName();
+
+		/**
+		 * The meta object literal for the '<em><b>Lower Bound</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIABLE_PARAMETER__LOWER_BOUND = eINSTANCE.getModifiableParameter_LowerBound();
+
+		/**
+		 * The meta object literal for the '<em><b>Upper Bound</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIABLE_PARAMETER__UPPER_BOUND = eINSTANCE.getModifiableParameter_UpperBound();
+
+		/**
+		 * The meta object literal for the '<em><b>Target URI</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIABLE_PARAMETER__TARGET_URI = eINSTANCE.getModifiableParameter_TargetURI();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.stem.analysis.automaticexperiment.impl.OptimizerAlgorithmImpl <em>Optimizer Algorithm</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.stem.analysis.automaticexperiment.impl.OptimizerAlgorithmImpl
+		 * @see org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticexperimentPackageImpl#getOptimizerAlgorithm()
+		 * @generated
+		 */
+		EClass OPTIMIZER_ALGORITHM = eINSTANCE.getOptimizerAlgorithm();
+
+	}
+
+} //AutomaticexperimentPackage
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/Constants.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/Constants.java
new file mode 100644
index 0000000..089bc79
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/Constants.java
@@ -0,0 +1,21 @@
+package org.eclipse.stem.analysis.automaticexperiment;
+
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+
+public class Constants {
+
+	
+	public final static String ID_ALGORITHM_EXTENSION_POINT = org.eclipse.stem.core.Constants.ID_ROOT
+	+ ".analysis.automaticexperiment.algorithm";
+	
+	public final static String ALGORITHM_ELEMENT = "classdef";
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/CustomSimulationManager.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/CustomSimulationManager.java
new file mode 100644
index 0000000..7fac068
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/CustomSimulationManager.java
@@ -0,0 +1,252 @@
+// SimulationManager.java
+package org.eclipse.stem.analysis.automaticexperiment;
+
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 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 java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.eclipse.stem.core.graph.Graph;
+import org.eclipse.stem.core.graph.GraphFactory;
+import org.eclipse.stem.core.model.Model;
+import org.eclipse.stem.core.scenario.Scenario;
+import org.eclipse.stem.core.scenario.ScenarioInitializationException;
+import org.eclipse.stem.core.scenario.ScenarioPackage;
+import org.eclipse.stem.core.sequencer.Sequencer;
+import org.eclipse.stem.jobs.execution.ExecutableManager;
+import org.eclipse.stem.jobs.simulation.ISimulation;
+import org.eclipse.stem.jobs.simulation.Messages;
+import org.eclipse.stem.jobs.simulation.Simulation;
+import org.eclipse.stem.jobs.simulation.SimulationCaching;
+import org.eclipse.stem.jobs.simulation.SimulationEvent;
+
+/**
+ * This class manages the life-cycle of active {@link Simulation}s. There is a
+ * singleton instance of the manager that is referenced by other parts of the
+ * system to manage {@link Simulation}. It creates {@link Simulation} instances
+ * from {@link Scenario} instances and can obtain {@link Scenario} instances
+ * from file URI's or from {@link IConfigurationElement}'s. It maintains a
+ * collection of all of the active {@link Simulation}s in the system and
+ * generates {@link SimulationEvent}'s whenever a {@link Simulation} is added to
+ * that collection or removed.
+ * <p>
+ * The {@link CustomSimulationManager} maintains a sequence number and assigns
+ * successive values of that number to the {@link Simulation} instances it
+ * creates.
+ */
+public class CustomSimulationManager extends ExecutableManager {
+
+	/**
+	 * Singleton instance of the manager
+	 */
+	private volatile static CustomSimulationManager INSTANCE = null;
+
+	/**
+	 * This is the sequence number assigned to each successive
+	 * {@link Simulation} instance the manager creates.
+	 */
+	private static int sequenceNumber = 0;
+
+	/**
+	 * Constant empty array.
+	 */
+	public static final ISimulation[] NONE = new Simulation[] {};
+
+	/**
+	 * This is the collection of active {@link Simulation} jobs
+	 */
+	private List<ISimulation> activeSimulations = null;
+
+	/**
+	 * Constructor
+	 */
+	private CustomSimulationManager() {
+		activeSimulations = new ArrayList<ISimulation>();
+
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
+				ScenarioPackage.eNAME, new XMIResourceFactoryImpl());
+	} // SimulationManager
+
+	/**
+	 * @return the singleton instance of the model
+	 */
+	public static final CustomSimulationManager getManager() {
+		if (INSTANCE == null) {
+			synchronized (CustomSimulationManager.class) {
+				if (INSTANCE == null) {
+					INSTANCE = new CustomSimulationManager();
+				}
+			}
+		}
+		return INSTANCE;
+	} // getModel
+
+	/**
+	 * Return the next simulation sequence number and increment the value.
+	 * 
+	 * @return the next simulation sequence number
+	 */
+	synchronized private static final int getAndIncrementSimulationSequenceNumber() {
+		return sequenceNumber++;
+	} // getAndIncrementSimulationSequenceNumber
+
+	/**
+	 * This is used for testing purposes to reset the state of the model.
+	 */
+	public static final void resetSimulationManager() {
+		INSTANCE = null;
+		sequenceNumber = 0;
+	} // resetSimulationManager
+
+	/**
+	 * @return the active {@link Simulation}s
+	 */
+	public final List<ISimulation> getActiveSimulations() {
+		return activeSimulations;
+	} // getActiveSimulations
+
+	/**
+	 * Add a {@link Simulation} to the collection of active {@link Simulation}s.
+	 * 
+	 * @param simulation
+	 *            the {@link ISimulation} to add
+	 */
+	private final void addActiveSimulation(final ISimulation simulation) {
+		activeSimulations.add(simulation);
+	} // addActiveSimulation
+
+	/**
+	 * Remove an {@link ISimulation} from the collection of active
+	 * {@link ISimulation}s.
+	 * 
+	 * @param simulation
+	 *            the {@link ISimulation} to remove
+	 */
+	public final void removeActiveSimulation(final ISimulation simulation) {
+		activeSimulations.remove(simulation);
+	} // removeActiveSimulation
+
+	/**
+	 * Create a {@link ISimulation} from a {@link Scenario} instance.
+	 * 
+	 * @param scenario
+	 *            the {@link Scenario} to simulate
+	 * @param monitor 
+	 * 			  Progress monitor
+	 * @return a {@link ISimulation} that's ready to run.
+	 */
+	public ISimulation createSimulation(final Scenario scenario, final IProgressMonitor monitor) {
+		ISimulation retValue = null;
+		try {
+			boolean useCache = false;
+
+			Scenario simulationScenario = null;
+			
+			if (useCache) {
+				if (SimulationCaching.INSTANCE.isScenarioInCache(scenario.getURI())) {
+					simulationScenario = SimulationCaching.INSTANCE.getCachedScenario(scenario.getURI());
+					boolean running = false;
+					for(ISimulation sim : getActiveSimulations()) {
+						if(sim.getScenario().equals(simulationScenario)) {
+							// The scenario is already running. Copy the whole scenario before resetting
+							Scenario newSimulation = null;
+							newSimulation = (Scenario)EcoreUtil.copy(simulationScenario);
+							if(simulationScenario.getModel() != null) newSimulation.setModel((Model)EcoreUtil.copy(simulationScenario.getModel()));
+							if(simulationScenario.getSequencer() != null) newSimulation.setSequencer((Sequencer)EcoreUtil.copy(simulationScenario.getSequencer()));
+							running = true;
+							break;
+						}
+					}
+					if(!running)simulationScenario.reset(); // safe since canonical graph is set 
+				}
+				else {
+					// Read scenario
+					// Add to cache
+					SimulationCaching.INSTANCE.addScenarioToCache(scenario);
+				}
+				
+			}
+			
+			if(scenario.getCanonicalGraph() == null) 
+				scenario.initialize(); // needed for preferences ...
+			else scenario.reset();
+			final Simulation simulation = new Simulation(scenario,
+					getAndIncrementSimulationSequenceNumber(), GraphFactory.eINSTANCE.createSimpleGraphPartitioner());
+			simulation.setPriority(Job.LONG);
+			retValue = simulation;
+
+			addActiveSimulation(retValue);
+		} catch (final ScenarioInitializationException se) {
+			// We could get an exception here if the Scenario doesn't have
+			// a Sequencer or Model which would cause problems when trying to
+			// initialize
+			Simulation.handleException(se, true);
+			retValue = null;
+		}
+		return retValue;
+	} // createSimulation
+
+	/**
+	 * Create a {@link ISimulation} from a {@link Scenario} instance and then
+	 * start it running.
+	 * 
+	 * @param scenario
+	 *            the {@link Scenario} to be simulated
+	 */
+	public void createAndRunSimulation(final Scenario scenario) {
+		new Job(Messages.getString("SimMgr.Start_Sim")) { //$NON-NLS-1$ 
+			@Override
+			protected IStatus run(final IProgressMonitor monitor) {
+				try {
+					final ISimulation simulation = createSimulation(scenario, monitor);
+					monitor.subTask(Messages.getString("SimMgr.Run")); //$NON-NLS-1$ 
+					simulation.run();
+				} catch (final Exception e) {
+					// The error was logged in createSimulation
+					monitor.done();
+				} // catch Exception
+				return Status.OK_STATUS;
+			} // run
+		}.schedule();
+	} // createAndRunSimulation
+	
+	/**
+	 * Given a {@link Graph} find the {@link ISimulation} that created it.
+	 * 
+	 * @param graph
+	 *            an instance of a {@link Graph}
+	 * @return the {@link ISimulation} instance that created the {@link Graph},
+	 *         <code>null</code>, if no match could be found.
+	 */
+	public ISimulation mapGraphToSimulation(final Graph graph) {
+		ISimulation retValue = null;
+		for (final ISimulation simulation : activeSimulations) {
+			final Graph simulationGraph = simulation.getScenario()
+					.getCanonicalGraph();
+			// Is this the one we're looking for?
+			if (graph == simulationGraph) {
+				// Yes
+				retValue = simulation;
+				break;
+			} // if
+		} // for each ISimulation
+		return retValue;
+	} // mapGraphToSimulation
+} // SimulationManager
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithm.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithm.java
new file mode 100644
index 0000000..b6b7fab
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithm.java
@@ -0,0 +1,36 @@
+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 java.util.List;

+

+import org.eclipse.stem.analysis.ErrorFunction;

+import org.eclipse.stem.core.scenario.Scenario;

+

+

+public interface ErrorAnalysisAlgorithm {

+	public void setErrorFunction(final ErrorFunction errorFunction);

+	public void setParameters(final List<ModifiableParameter> parameters);

+	public void setTolerance(final double tolerance);

+	public void setBaseScenario(final Scenario baseScenario);

+	public void setReferenceDataDirectory(final String referenceDataDir);

+	public void setMaximumNumberOfIterations(final long maxNumOfIterations);

+	public double[] getResultParameters();

+	public double getResultValue();

+	public void execute();

+	public void init(AutomaticExperiment automaticExperiment, ErrorAnalysisAlgorithm alg);

+	public void reinitStartParams(AutomaticExperiment exp, double [] vals);

+	public void addListener(ErrorAnalysisAlgorithmListener listener);

+	public void clearListeners();

+	

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmEvent.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmEvent.java
new file mode 100644
index 0000000..899ed36
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmEvent.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+package org.eclipse.stem.analysis.automaticexperiment;
+
+import org.eclipse.stem.analysis.ErrorResult;
+
+public class ErrorAnalysisAlgorithmEvent {
+	public ErrorResult result;
+	public ALGORITHM_STATUS status;
+	public String [] parameterNames;
+	public double [] parameterValues;
+	
+	public ErrorAnalysisAlgorithmEvent(ErrorResult res, ALGORITHM_STATUS status) {
+		this.result = res;
+		this.status = status;
+	}
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmFactory.java
new file mode 100644
index 0000000..acc39b3
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmFactory.java
@@ -0,0 +1,27 @@
+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

+ *******************************************************************************/

+

+public class ErrorAnalysisAlgorithmFactory {

+	public final static ErrorAnalysisAlgorithmFactory INSTANCE = new ErrorAnalysisAlgorithmFactory();

+	

+	public ErrorAnalysisAlgorithm createErrorAnalysisAlgorithm(final OptimizerAlgorithm alg)

+	{

+		ErrorAnalysisAlgorithm algorithm = null;

+		

+		if (alg instanceof AutomaticExperiment) { // Need to fix this

+			algorithm = new SimplexAlgorithmExecuter();

+		}

+		return algorithm;

+	}

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmListener.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmListener.java
new file mode 100644
index 0000000..a53d077
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ErrorAnalysisAlgorithmListener.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+package org.eclipse.stem.analysis.automaticexperiment;
+
+public interface ErrorAnalysisAlgorithmListener {
+
+	public void eventReceived(ErrorAnalysisAlgorithmEvent evt);
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/MANAGER_STATUS.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/MANAGER_STATUS.java
new file mode 100644
index 0000000..b579f2b
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/MANAGER_STATUS.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2009,2010 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
+ *******************************************************************************/
+package org.eclipse.stem.analysis.automaticexperiment;
+
+public enum MANAGER_STATUS {
+	SCHEDULED;
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ModifiableParameter.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ModifiableParameter.java
new file mode 100644
index 0000000..8ffcb41
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ModifiableParameter.java
@@ -0,0 +1,225 @@
+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.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EStructuralFeature;

+

+/**

+ * <!-- begin-user-doc -->

+ * A representation of the model object '<em><b>Modifiable Parameter</b></em>'.

+ * <!-- end-user-doc -->

+ *

+ * <p>

+ * The following features are supported:

+ * <ul>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getInitialValue <em>Initial Value</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeature <em>Feature</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getStep <em>Step</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeatureName <em>Feature Name</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getLowerBound <em>Lower Bound</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getUpperBound <em>Upper Bound</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getTargetURI <em>Target URI</em>}</li>

+ * </ul>

+ * </p>

+ *

+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter()

+ * @model

+ * @generated

+ */

+public interface ModifiableParameter extends EObject {

+	/**

+	 * Returns the value of the '<em><b>Initial Value</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Initial Value</em>' attribute isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Initial Value</em>' attribute.

+	 * @see #setInitialValue(double)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_InitialValue()

+	 * @model required="true"

+	 * @generated

+	 */

+	double getInitialValue();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getInitialValue <em>Initial Value</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Initial Value</em>' attribute.

+	 * @see #getInitialValue()

+	 * @generated

+	 */

+	void setInitialValue(double value);

+

+	/**

+	 * Returns the value of the '<em><b>Feature</b></em>' reference.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Feature</em>' reference isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Feature</em>' reference.

+	 * @see #setFeature(EStructuralFeature)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_Feature()

+	 * @model required="true"

+	 * @generated

+	 */

+	EStructuralFeature getFeature();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeature <em>Feature</em>}' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Feature</em>' reference.

+	 * @see #getFeature()

+	 * @generated

+	 */

+	void setFeature(EStructuralFeature value);

+

+	/**

+	 * Returns the value of the '<em><b>Step</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Step</em>' attribute isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Step</em>' attribute.

+	 * @see #setStep(double)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_Step()

+	 * @model required="true"

+	 * @generated

+	 */

+	double getStep();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getStep <em>Step</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Step</em>' attribute.

+	 * @see #getStep()

+	 * @generated

+	 */

+	void setStep(double value);

+

+	/**

+	 * Returns the value of the '<em><b>Feature Name</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Feature Name</em>' attribute isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Feature Name</em>' attribute.

+	 * @see #setFeatureName(String)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_FeatureName()

+	 * @model required="true"

+	 * @generated

+	 */

+	String getFeatureName();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getFeatureName <em>Feature Name</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Feature Name</em>' attribute.

+	 * @see #getFeatureName()

+	 * @generated

+	 */

+	void setFeatureName(String value);

+

+	/**

+	 * Returns the value of the '<em><b>Lower Bound</b></em>' attribute.

+	 * The default value is <code>"-1"</code>.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Lower Bound</em>' attribute isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Lower Bound</em>' attribute.

+	 * @see #setLowerBound(double)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_LowerBound()

+	 * @model default="-1"

+	 * @generated

+	 */

+	double getLowerBound();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getLowerBound <em>Lower Bound</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Lower Bound</em>' attribute.

+	 * @see #getLowerBound()

+	 * @generated

+	 */

+	void setLowerBound(double value);

+

+	/**

+	 * Returns the value of the '<em><b>Upper Bound</b></em>' attribute.

+	 * The default value is <code>"-1"</code>.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Upper Bound</em>' attribute isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Upper Bound</em>' attribute.

+	 * @see #setUpperBound(double)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_UpperBound()

+	 * @model default="-1"

+	 * @generated

+	 */

+	double getUpperBound();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getUpperBound <em>Upper Bound</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Upper Bound</em>' attribute.

+	 * @see #getUpperBound()

+	 * @generated

+	 */

+	void setUpperBound(double value);

+

+	/**

+	 * Returns the value of the '<em><b>Target URI</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <p>

+	 * If the meaning of the '<em>Target URI</em>' attribute isn't clear,

+	 * there really should be more of a description here...

+	 * </p>

+	 * <!-- end-user-doc -->

+	 * @return the value of the '<em>Target URI</em>' attribute.

+	 * @see #setTargetURI(URI)

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getModifiableParameter_TargetURI()

+	 * @model dataType="org.eclipse.stem.core.common.URI"

+	 * @generated

+	 */

+	URI getTargetURI();

+

+	/**

+	 * Sets the value of the '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter#getTargetURI <em>Target URI</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param value the new value of the '<em>Target URI</em>' attribute.

+	 * @see #getTargetURI()

+	 * @generated

+	 */

+	void setTargetURI(URI value);

+

+} // ModifiableParameter

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/NelderMeadAlgorithm.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/NelderMeadAlgorithm.java
new file mode 100644
index 0000000..38dd678
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/NelderMeadAlgorithm.java
@@ -0,0 +1,444 @@
+package org.eclipse.stem.analysis.automaticexperiment;

+

+import java.util.ArrayList;

+

+import org.eclipse.stem.analysis.ErrorResult;

+

+

+/*******************************************************************************

+ * 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

+ *******************************************************************************/

+

+/**

+ * Minimizes a function using the Nelder-Mead algorithm.

+ * 

+ * Simplex function minimisation procedure due to Nelder+Mead(1965), as

+ * implemented by O'Neill(1971, Appl.Statist. 20, 338-45), with subsequent

+ * comments by Chambers+Ertel(1974, 23, 250-1), Benyon(1976, 25, 97) and

+ * Hill(1978, 27, 380-2)

+ * 

+ * Authors:

+ * 

+ * Based on FORTRAN77 version by R ONeill 

+ * 

+ * Reference:

+ * 

+ * John Nelder, Roger Mead, A simplex method for function minimization, Computer

+ * Journal, Volume 7, 1965, pages 308-313.

+ * 

+ * This Java version by Yossi Mesika

+ * R ONeill, Algorithm AS 47: Function Minimization Using a Simplex Procedure,

+ * Applied Statistics, Volume 20, Number 3, 1971, pages 338-345.

+ */

+public class NelderMeadAlgorithm implements SimplexAlgorithm {

+

+	double ccoeff = 0.5;

+	double del;

+	double dn;

+	double dnn;

+	double ecoeff = 2.0;

+	double eps = 0.001;

+	int i;

+	int ihi;

+	int ilo;

+	int j;

+	int jcount;

+	int l;

+	int nn;

+	double[] p;

+	double[] p2star;

+	double[] pbar;

+	double[] pstar;

+	double rcoeff = 1.0;

+	double rq;

+	double x;

+	ErrorResult[] y;

+	ErrorResult y2star;

+	ErrorResult ylo;

+	ErrorResult ystar;

+	double z;

+

+	int ifault = -1;

+	int numres = -1;

+	int icount = -1;

+	ErrorResult ynewlo;

+	double[] xmin;

+	

+	ArrayList<Double> minParamValues = new ArrayList<Double>();

+	ArrayList<Double> maxParamValues = new ArrayList<Double>();

+	

+	public void execute(final SimplexFunction fn,  final double[] startPoint,

+			final double[] step, final double terminatingVariance, long maxIter) {

+		execute(fn, startPoint, terminatingVariance, step,

+				1, (int)maxIter);

+	}

+	

+	/**

+	 * @param fn the {@link SimplexFunction} to be minimized

+	 * @param start a starting point for the first iteration

+	 * @param reqmin the terminating limit for the variance of function values

+	 * @param step determines the size and shape of the initial simplex. The relative magnitudes of 

+	 * its elements should reflect the units of the variables.

+	 * @param konvge the convergence check is carried out every KONVGE iterations

+	 * @param kcoun the maximum number of function evaluations

+	 */

+	private void execute(SimplexFunction fn, double start[], double reqmin, double step[], int konvge, int kcount) {

+		int n = start.length;

+		//

+		// Check the input parameters.

+		//

+		if (reqmin <= 0.0) {

+			ifault = 1;

+			return;

+		}

+

+		if (n < 1) {

+			ifault = 1;

+			return;

+		}

+

+		if (konvge < 1) {

+			ifault = 1;

+			return;

+		}

+

+		p = new double[n * (n + 1)];

+		pstar = new double[n];

+		p2star = new double[n];

+		pbar = new double[n];

+		y = new ErrorResult[n + 1];

+		xmin = new double[n];

+

+		icount = 0;

+		numres = 0;

+

+		jcount = konvge;

+		dn = (n);

+		nn = n + 1;

+		dnn = (nn);

+		del = 1.0;

+		rq = reqmin * dn;

+		//

+		// Initial or restarted loop.

+		//

+		for (;;) {

+			if(AutomaticExperimentManager.QUIT_NOW) break;

+			for (i = 0; i < n; i++) {

+				p[i + n * n] = start[i];

+			}

+			limit(start);

+			y[n] = fn.getValue(start).copy();

+			icount = icount + 1;

+

+			for (j = 0; j < n; j++) {

+				x = start[j];

+				start[j] = start[j] + step[j] * del;

+				for (i = 0; i < n; i++) {

+					p[i + j * n] = start[i];

+				}

+				limit(start);

+				y[j] = fn.getValue(start).copy();

+				icount = icount + 1;

+				start[j] = x;

+				if(AutomaticExperimentManager.QUIT_NOW) break;

+			}

+			if(AutomaticExperimentManager.QUIT_NOW) break;

+

+			//	                    

+			// The simplex construction is complete.

+			//	                    

+			// Find highest and lowest Y values. YNEWLO = Y(IHI) indicates

+			// the vertex of the simplex to be replaced.

+			//	                

+			ylo = y[0].copy();

+			ilo = 0;

+

+			for (i = 1; i < nn; i++) {

+				if (y[i].getError() < ylo.getError()) {

+					ylo = y[i].copy();

+					ilo = i;

+				}

+			}

+			//

+			// Inner loop.

+			//

+			for (;;) {

+				if(AutomaticExperimentManager.QUIT_NOW) break;

+				if (kcount != -1 && kcount <= icount) {

+					break;

+				}

+				ynewlo = y[0].copy();

+				ihi = 0;

+

+				for (i = 1; i < nn; i++) {

+					if (ynewlo.getError() < y[i].getError()) {

+						ynewlo = y[i].copy();

+						ihi = i;

+					}

+				}

+				//

+				// Calculate PBAR, the centroid of the simplex vertices

+				// excepting the vertex with Y value YNEWLO.

+				//

+				for (i = 0; i < n; i++) {

+					z = 0.0;

+					for (j = 0; j < nn; j++) {

+						z = z + p[i + j * n];

+					}

+					z = z - p[i + ihi * n];

+					pbar[i] = z / dn;

+				}

+				//

+				// Reflection through the centroid.

+				//

+				for (i = 0; i < n; i++) {

+					pstar[i] = pbar[i] + rcoeff * (pbar[i] - p[i + ihi * n]);

+				}

+				limit(pstar);

+				ystar = fn.getValue(pstar).copy();

+				icount = icount + 1;

+				//

+				// Successful reflection, so extension.

+				//

+				if (ystar.getError() < ylo.getError()) {

+					for (i = 0; i < n; i++) {

+						p2star[i] = pbar[i] + ecoeff * (pstar[i] - pbar[i]);

+					}

+					limit(p2star);

+					y2star = fn.getValue(p2star).copy();

+					icount = icount + 1;

+					//

+					// Check extension.

+					//

+					if (ystar.getError() < y2star.getError()) {

+						for (i = 0; i < n; i++) {

+							p[i + ihi * n] = pstar[i];

+						}

+						y[ihi] = ystar.copy();

+					}

+					//

+					// Retain extension or contraction.

+					//

+					else {

+						for (i = 0; i < n; i++) {

+							p[i + ihi * n] = p2star[i];

+						}

+						y[ihi] = y2star.copy();

+					}

+				}

+				//

+				// No extension.

+				//

+				else {

+					l = 0;

+					for (i = 0; i < nn; i++) {

+						if (ystar.getError() < y[i].getError()) {

+							l = l + 1;

+						}

+					}

+

+					if (1 < l) {

+						for (i = 0; i < n; i++) {

+							p[i + ihi * n] = pstar[i];

+						}

+						y[ihi] = ystar.copy();

+					}

+					//

+					// Contraction on the Y(IHI) side of the centroid.

+					//

+					else if (l == 0) {

+						for (i = 0; i < n; i++) {

+							p2star[i] = pbar[i] + ccoeff

+									* (p[i + ihi * n] - pbar[i]);

+						}

+						limit(p2star);

+						y2star = fn.getValue(p2star).copy();

+						icount = icount + 1;

+						//

+						// Contract the whole simplex.

+						//

+						if (y[ihi].getError() < y2star.getError()) {

+							for (j = 0; j < nn; j++) {

+								for (i = 0; i < n; i++) {

+									p[i + j * n] = (p[i + j * n] + p[i + ilo

+											* n]) * 0.5;

+									xmin[i] = p[i + j * n];

+								}

+								limit(xmin);

+								y[j] = fn.getValue(xmin).copy();

+								icount = icount + 1;

+							}

+							ylo = y[0];

+							ilo = 0;

+

+							for (i = 1; i < nn; i++) {

+								if (y[i].getError() < ylo.getError()) {

+									ylo = y[i].copy();

+									ilo = i;

+								}

+							}

+							continue;

+						}

+						//

+						// Retain contraction.

+						//

+						else {

+							for (i = 0; i < n; i++) {

+								p[i + ihi * n] = p2star[i];

+							}

+							y[ihi] = y2star.copy();

+						}

+					}

+					//

+					// Contraction on the reflection side of the centroid.

+					//

+					else if (l == 1) {

+						for (i = 0; i < n; i++) {

+							p2star[i] = pbar[i] + ccoeff * (pstar[i] - pbar[i]);

+						}

+						limit(p2star);

+						y2star = fn.getValue(p2star).copy();

+						icount = icount + 1;

+						//

+						// Retain reflection?

+						//

+						if (y2star.getError() <= ystar.getError()) {

+							for (i = 0; i < n; i++) {

+								p[i + ihi * n] = p2star[i];

+							}

+							y[ihi] = y2star.copy();

+						} else {

+							for (i = 0; i < n; i++) {

+								p[i + ihi * n] = pstar[i];

+							}

+							y[ihi] = ystar.copy();

+						}

+					}

+				}

+				//

+				// Check if YLO improved.

+				//

+				if (y[ihi].getError() < ylo.getError()) {

+					ylo = y[ihi].copy();

+					ilo = ihi;

+				}

+				jcount = jcount - 1;

+

+				if (0 < jcount) {

+					continue;

+				}

+				//

+				// Check to see if minimum reached.

+				//

+				if (kcount == -1 || icount <= kcount) {

+					jcount = konvge;

+

+					z = 0.0;

+					for (i = 0; i < nn; i++) {

+						z = z + y[i].getError();

+					}

+					x = z / dnn;

+

+					z = 0.0;

+					for (i = 0; i < nn; i++) {

+						z = z + Math.pow(y[i].getError() - x, 2);

+					}

+

+					if (z <= rq) {

+						break;

+					}

+				}

+			}

+			//

+			// Factorial tests to check that YNEWLO is a local minimum.

+			//

+			for (i = 0; i < n; i++) {

+				xmin[i] = p[i + ilo * n];

+			}

+			ynewlo = y[ilo].copy();

+			break;

+			/* Commented out for 1.2.1 release. The automatic experiment

+			 * does not converge without taking out the local minimum check.

+			 *

+			if (kcount != -1 && kcount < icount) {

+				ifault = 2;

+				break;

+			}

+

+			ifault = 0;

+

+			for (i = 0; i < n; i++) {

+				del = step[i] * eps;

+				xmin[i] = xmin[i] + del;

+				limit(xmin);

+				z = fn.getValue(xmin).getError();

+				icount = icount + 1;

+				if (z < ynewlo.getError()) {

+					ifault = 2;

+					break;

+				}

+				xmin[i] = xmin[i] - del - del;

+				limit(xmin);

+				z = fn.getValue(xmin).getError();

+				icount = icount + 1;

+				if (z < ynewlo.getError()) {

+					ifault = 2;

+					break;

+				}

+				xmin[i] = xmin[i] + del;

+				if(AutomaticExperimentManager.QUIT_NOW) break;

+			}

+

+			if (ifault == 0 || AutomaticExperimentManager.QUIT_NOW) {

+				break;

+			}

+			//

+			// Restart the procedure.

+			//

+			for (i = 0; i < n; i++) {

+				start[i] = xmin[i];

+			}

+			del = eps;

+			numres = numres + 1;

+			if(AutomaticExperimentManager.QUIT_NOW) break;

+			*/

+		}

+	}

+

+	private void limit(double []vals) {

+		for(int i=0;i<vals.length;++i) {

+			if(vals[i]<minParamValues.get(i)) vals[i] = minParamValues.get(i); 

+			else if(vals[i]>maxParamValues.get(i)) vals[i] = maxParamValues.get(i); 

+		}

+	}

+	public double getMinimumFunctionValue() {

+		if(this.ynewlo != null)

+			return this.ynewlo.getError();

+		return -1; // the algorithm was probably interrupted.

+	}

+	public ErrorResult getMinimumErrorResult() {

+		return this.ynewlo;

+	}

+	public double[] getMinimumParametersValues() {

+		return this.xmin;

+	}

+

+	public void setParameterLimits(final int parameterIndex,

+			final double lowerBound, final double upperBound) {

+		for(int i=0;i<parameterIndex+1-minParamValues.size();++i) minParamValues.add(0.0);

+		for(int i=0;i<parameterIndex+1-maxParamValues.size();++i) maxParamValues.add(0.0);

+		minParamValues.ensureCapacity(parameterIndex+1);

+		maxParamValues.ensureCapacity(parameterIndex+1);

+		minParamValues.set(parameterIndex, lowerBound);

+		maxParamValues.set(parameterIndex,upperBound);

+		

+	}

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/OptimizerAlgorithm.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/OptimizerAlgorithm.java
new file mode 100644
index 0000000..aca357b
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/OptimizerAlgorithm.java
@@ -0,0 +1,27 @@
+package org.eclipse.stem.analysis.automaticexperiment;
+
+/******************************************************************************* 
+ * Copyright (c) 2011 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.stem.core.common.Identifiable;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Optimizer Algorithm</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#getOptimizerAlgorithm()
+ * @model
+ * @generated
+ */
+public interface OptimizerAlgorithm extends Identifiable {
+} // OptimizerAlgorithm
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexAlgorithm.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexAlgorithm.java
new file mode 100644
index 0000000..5f0a74b
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexAlgorithm.java
@@ -0,0 +1,24 @@
+package org.eclipse.stem.analysis.automaticexperiment;

+

+import org.eclipse.stem.analysis.ErrorResult;

+

+/*******************************************************************************

+ * 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

+ *******************************************************************************/

+

+public interface SimplexAlgorithm {

+	public final static double NO_LIMIT = -1;

+	

+	public void execute(final SimplexFunction fn,  final double[] startPoints, final double[] step, final double terminatingVariance, long maxIter);

+	public double getMinimumFunctionValue();

+	public ErrorResult getMinimumErrorResult();

+	public double[] getMinimumParametersValues();

+	public void setParameterLimits(final int parameterIndex, final double lowerBound, final double upperBound);

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexAlgorithmExecuter.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexAlgorithmExecuter.java
new file mode 100644
index 0000000..127d3e9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexAlgorithmExecuter.java
@@ -0,0 +1,339 @@
+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

+ *******************************************************************************/

+

+/**

+ * Implementation was taken from: http://www.ee.ucl.ac.uk/~mflanaga/java/Minimisation.html#simplex

+ */

+

+import java.io.File;

+import java.io.FileWriter;

+import java.io.IOException;

+import java.util.List;

+

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.emf.common.util.EList;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EAttribute;

+import org.eclipse.stem.analysis.ErrorFunction;

+import org.eclipse.stem.analysis.ErrorResult;

+import org.eclipse.stem.analysis.LogInitializationException;

+import org.eclipse.stem.analysis.automaticexperiment.views.AutoExpControl;

+import org.eclipse.stem.analysis.impl.ReferenceScenarioDataMapImpl;

+import org.eclipse.stem.analysis.util.CSVscenarioLoader;

+import org.eclipse.stem.core.Utility;

+import org.eclipse.stem.core.model.Decorator;

+import org.eclipse.stem.core.model.IntegrationDecorator;

+import org.eclipse.stem.core.scenario.Scenario;

+import org.eclipse.stem.core.scenario.ScenarioInitializationException;

+import org.eclipse.stem.diseasemodels.standard.DiseaseModel;

+import org.eclipse.stem.jobs.simulation.ISimulation;

+import org.eclipse.stem.jobs.simulation.Simulation;

+import org.eclipse.stem.util.loggers.views.CustomCSVLogger;

+

+

+public class SimplexAlgorithmExecuter 

+	extends AbstractErrorAnalysisAlgorithm {

+	

+	private ISimulation simulation = null;

+	private CustomCSVLogger csvLogger = null;

+	private final static String SIMULATION_OUTPUT_DIR = Platform.getLocation() + File.separator + "AutoExpTempDir";

+	private final static String LOG_FILE_NAME = SIMULATION_OUTPUT_DIR+File.separator+"resultLog.csv";

+	static String LS = System.getProperty("line.separator"); 

+	private final CustomSimulationManager simMgr = CustomSimulationManager.getManager();

+	private ReferenceScenarioDataMapImpl ref;

+	private static AutoExpControl aeControl = null;

+	

+	

+	/**

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AbstractErrorAnalysisAlgorithm#execute()

+	 */

+	@Override

+	public void execute() {

+		double prevmin = Double.MAX_VALUE;

+		double [] prevvals = new double[initialParamsValues.length];

+		double [] minvals;

+		String [] parameterNames=null;

+		if (parameters != null) {

+			parameterNames = new String[parameters.size()];

+			int i=0;

+			for (final ModifiableParameter param:parameters) {

+				parameterNames[i++] = param.getFeatureName();

+			}

+		}

+		

+		for(;;) {

+			for(int i=0;i<initialParamsValues.length;++i) prevvals[i] = initialParamsValues[i];

+			long before = System.currentTimeMillis();

+			simplexAlgorithm.execute(simplexFnToMinimize,  initialParamsValues, paramsInitialSteps, tolerance, this.maxNumOfIterations);

+			long after = System.currentTimeMillis();

+			if(!this.repeat || AutomaticExperimentManager.QUIT_NOW) {

+//				Activator.logInformation("splunge");

+//				Activator.logInformation("\n\nTime to execute the Nedler-Mead Algorithm: " + (after-before)/1000 + " seconds");

+//				Activator.logInformation("Minimum value: " + simplexAlgorithm.getMinimumFunctionValue());

+//				Activator.logInformation("Validation error: " + simplexAlgorithm.getMinimumErrorResult().getValidationError());

+//				Activator.logInformation("Parameters values: " + Arrays.toString(simplexAlgorithm.getMinimumParametersValues()));

+				minvals = simplexAlgorithm.getMinimumParametersValues();

+				break;

+			}

+			double newmin = simplexAlgorithm.getMinimumFunctionValue();

+			if(newmin >= prevmin) {

+//				Activator.logInformation("\n\nTime to execute the Nedler-Mead Algorithm: " + (after-before)/1000 + " seconds");

+//				Activator.logInformation("Minimum value: " + prevmin);

+//				Activator.logInformation("Validation error: " + simplexAlgorithm.getMinimumErrorResult().getValidationError());

+//				Activator.logInformation("Parameters values: " + Arrays.toString(prevvals));

+				minvals = prevvals;

+				break; // we couldn't improve

+			}

+			// Not same, reinit with new minimum

+			prevmin = simplexAlgorithm.getMinimumFunctionValue();

+			

+			for(int i=0;i<initialParamsValues.length;++i){

+				initialParamsValues[i] = simplexAlgorithm.getMinimumParametersValues()[i];

+				prevvals[i] =  simplexAlgorithm.getMinimumParametersValues()[i];

+			}

+			ErrorAnalysisAlgorithmEvent newEvent = new ErrorAnalysisAlgorithmEvent(simplexAlgorithm.getMinimumErrorResult(), ALGORITHM_STATUS.RESTARTED_ALGORITHM);

+			newEvent.parameterNames = parameterNames;

+			newEvent.parameterValues = simplexAlgorithm.getMinimumParametersValues();

+			this.fireEvent(newEvent);

+

+		}

+		ErrorAnalysisAlgorithmEvent newEvent = new ErrorAnalysisAlgorithmEvent(simplexAlgorithm.getMinimumErrorResult(), ALGORITHM_STATUS.FINISHED_ALGORITHM);

+		newEvent.parameterNames = parameterNames;

+		newEvent.parameterValues = minvals;

+		this.fireEvent(newEvent);

+	}

+	

+	public void init(AutomaticExperiment automaticExperiment, ErrorAnalysisAlgorithm alg) {

+		super.init(automaticExperiment);

+		simplexFnToMinimize = new NedlearMeadSimplexFunction(parameters, baseScenario, errorFunction, alg);

+		try {

+			CSVscenarioLoader loader1 = new CSVscenarioLoader(referenceDataDirectory);

+			int res = loader1.getMaxResolution(CSVscenarioLoader.UNKNOWN_POP_IDENTIFIER_KEY);

+			ref = loader1.parseAllFiles(CSVscenarioLoader.UNKNOWN_POP_IDENTIFIER_KEY, res);

+		} catch (LogInitializationException e) {

+			e.printStackTrace();

+		}

+	}

+	

+	@Override

+	public void setParameters(List<ModifiableParameter> parameters) {

+		super.setParameters(parameters);

+		

+		//Set lower and upper bounds constraints for the parameters

+		int paramIndex=0;

+		for (final ModifiableParameter param:parameters) {

+			simplexAlgorithm.setParameterLimits(paramIndex, param.getLowerBound(), param.getUpperBound());

+			paramIndex++;

+		}

+	}

+	

+	/**

+	 *

+	 */

+	public class NedlearMeadSimplexFunction

+		implements SimplexFunction 

+	{	

+	    private ErrorFunction errorFunction = null;

+	    private String[] parameterNames = null;

+	    private FileWriter resultWriter;

+	    private URI[] decoratorURIs = null;

+	    private ErrorAnalysisAlgorithm algorithm = null;

+	    

+		public NedlearMeadSimplexFunction(

+				final List<ModifiableParameter> parameters,

+				final Scenario pBaseScenario, 

+				final ErrorFunction errorFunction, 

+				final ErrorAnalysisAlgorithm algorithm) {

+			

+			try {

+				File d= new File(SIMULATION_OUTPUT_DIR);

+				if(!d.exists())d.mkdirs();

+				resultWriter = new FileWriter(LOG_FILE_NAME);

+				baseScenario = pBaseScenario;

+				this.errorFunction = errorFunction;

+				this.algorithm = algorithm;

+				

+				if (parameters != null) {

+					parameterNames = new String[parameters.size()];

+					decoratorURIs = new URI[parameters.size()];

+					int i=0;

+					for (final ModifiableParameter param:parameters) {

+						decoratorURIs[i]=param.getTargetURI();

+						parameterNames[i++] = param.getFeatureName();

+						resultWriter.write(parameterNames[i-1]);

+						resultWriter.write(",");

+					}

+					resultWriter.write("error");

+					resultWriter.write(LS);

+				}

+			} catch(IOException ioe) {

+				ioe.printStackTrace();

+			}

+		}

+		

+		public ErrorResult getValue(double[] parameters) {

+			

+			

+			simulation = createSimulation(baseScenario);

+			simulation.setSequenceNumber(simulation.getSequenceNumber()+1);

+			

+			// Descend into the Scenario looking for something with a double field

+			final EList<Decorator> decs = baseScenario.getCanonicalGraph().getDecorators();

+	

+			Decorator defaultDecorator = null;

+			for (Decorator decorator : decs) {

+				if (decorator instanceof DiseaseModel) {

+					defaultDecorator = decorator; 

+					break;

+				}

+			}

+			

+			for(int i=0;i<parameterNames.length;++i) {

+				Decorator decorator = defaultDecorator;

+				if(decoratorURIs[i] != null) 

+					for(Decorator scenarioDec:decs) 

+						if(decoratorURIs[i].toString().equals(scenarioDec.getURI().toString())) {

+							decorator = scenarioDec;

+							break;

+						}

+				for (EAttribute attribute : decorator.eClass().getEAllAttributes()) 

+					if(attribute.getName().equals(parameterNames[i])) 

+						decorator.eSet(attribute, new Double(parameters[i]));

+			}

+			

+			

+			String uniqueID = null;

+			

+			if (simulation != null) {

+				uniqueID = simulation.getUniqueIDString();

+			}

+			String directoryName = SIMULATION_OUTPUT_DIR + File.separator+uniqueID + File.separator;

+			

+			File dir = new File(directoryName);

+			if(!dir.exists())

+				dir.mkdirs();

+			

+			

+			csvLogger = new CustomCSVLogger(directoryName, simulation, (IntegrationDecorator) defaultDecorator);

+

+			// This will reinit the infectors/inoc etc to the new values 

+			try {

+				baseScenario.reset();

+			} catch(ScenarioInitializationException sie) {

+				Utility.handleException(sie.getErrorMessage(), true, sie);

+			}

+

+			//Run the simulation with the new parameters and return the error value

+//			Activator.logInformation("Running the simulation with the following parameters: ");

+//			Activator.logInformation("\tParameters Names: " + Arrays.toString(parameterNames));

+//			Activator.logInformation("\tParameters Values: " + Arrays.toString(parameters));

+			double error = 0.0;

+			ErrorResult result = null;

+			try {

+				for(double val:parameters) resultWriter.write(val+",");

+				ErrorAnalysisAlgorithmEvent newEvent = new ErrorAnalysisAlgorithmEvent(null, ALGORITHM_STATUS.STARTING_SIMULATION);

+				newEvent.parameterNames = parameterNames;

+				newEvent.parameterValues = parameters;

+				((AbstractErrorAnalysisAlgorithm)algorithm).fireEvent(

+						newEvent);

+				runSimulation(simulation);

+			

+				result =  getErrorValue(simulation.getUniqueIDString());

+			

+				newEvent = new ErrorAnalysisAlgorithmEvent(result, ALGORITHM_STATUS.FINISHED_SIMULATION);

+				newEvent.parameterNames = parameterNames;

+				newEvent.parameterValues = parameters;

+				

+				((AbstractErrorAnalysisAlgorithm)algorithm).fireEvent(

+						newEvent);

+				

+				error = result.getError();

+				

+//				Activator.logInformation(" Error is: " + error);

+//				Activator.logInformation(" Error in validation data set is: " + result.getValidationError());

+				resultWriter.write(error+"");

+				resultWriter.write(LS);

+				resultWriter.flush();

+				

+				// TODO: GUI output here

+				

+				

+		 		

+			} catch(IOException ioe) {

+				ioe.printStackTrace();

+			}

+			cleanup();

+			

+			return result;

+		}

+		

+		private ErrorResult getErrorValue(String simulationUniqueId) {

+			ErrorResult result = null;

+			try {

+				final EList<Decorator> decs = baseScenario.getCanonicalGraph().getDecorators();

+				

+				DiseaseModel defaultDecorator = null;

+				for (Decorator decorator : decs) {

+					if (decorator instanceof DiseaseModel) {

+						defaultDecorator = (DiseaseModel)decorator; 

+						break;

+					}

+				}

+				

+				if (defaultDecorator != null) {

+					CSVscenarioLoader loader2 = new CSVscenarioLoader(SIMULATION_OUTPUT_DIR + File.separator + simulationUniqueId +"/"+defaultDecorator.getDiseaseName()+"/"+defaultDecorator.getPopulationIdentifier());

+					int maxres = loader2.getMaxResolution(CSVscenarioLoader.UNKNOWN_POP_IDENTIFIER_KEY);

+					ReferenceScenarioDataMapImpl data = loader2.parseAllFiles(CSVscenarioLoader.UNKNOWN_POP_IDENTIFIER_KEY, maxres);

+		

+					result = errorFunction.calculateError(ref, data);

+				}

+			} catch (LogInitializationException e) {

+				e.printStackTrace();

+			}

+			return result;

+		}

+		

+		private void runSimulation(final ISimulation simulationToRun) {

+			long before = System.currentTimeMillis();

+			simulationToRun.run();

+			try {

+				simulationToRun.join();

+			} catch (InterruptedException e) {

+				e.printStackTrace();

+			}

+			simulationToRun.stop();			

+			

+			long after = System.currentTimeMillis();

+//			Activator.logInformation("It took " + (after-before)/1000 + " seconds to run the simulation");

+		}

+		

+		private void cleanup() {

+			if (csvLogger != null) {

+				csvLogger.close();

+				csvLogger = null;

+			}

+			simMgr.removeActiveSimulation(simulation);

+			((Simulation)simulation).destroy();

+			simulation = null;

+			CustomSimulationManager.resetSimulationManager();

+		}

+		

+		private ISimulation createSimulation(Scenario scenario) {

+			Simulation simulation = (Simulation)simMgr.createSimulation(scenario, null);

+			simulation.simulationSleep = false;

+			return simulation;

+		}

+	}

+}

+

+

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexFunction.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexFunction.java
new file mode 100644
index 0000000..a2646fb
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/SimplexFunction.java
@@ -0,0 +1,19 @@
+package org.eclipse.stem.analysis.automaticexperiment;

+

+import org.eclipse.stem.analysis.ErrorResult;

+;

+

+/*******************************************************************************

+ * 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

+ *******************************************************************************/

+

+public interface SimplexFunction {

+	public ErrorResult getValue(double[] parameters); 

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/executable/AutomaticExperimentExecutableAdapterFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/executable/AutomaticExperimentExecutableAdapterFactory.java
new file mode 100644
index 0000000..680736e
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/executable/AutomaticExperimentExecutableAdapterFactory.java
@@ -0,0 +1,76 @@
+package org.eclipse.stem.analysis.automaticexperiment.executable;
+
+/*******************************************************************************
+ * 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.emf.common.notify.Adapter;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperimentManager;
+import org.eclipse.stem.analysis.automaticexperiment.ErrorAnalysisAlgorithm;
+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;
+import org.eclipse.stem.analysis.automaticexperiment.util.AutomaticexperimentAdapterFactory;
+import org.eclipse.stem.jobs.adapters.executable.emf.ExecutableAdapter;
+import org.eclipse.stem.jobs.adapters.executable.emf.ExecutableAdapterFactory;
+import org.eclipse.stem.jobs.execution.IExecutable;
+
+
+/**
+ * This class is an {@link ExecutableAdapterFactory} that creates adapters that
+ * adapt {@link AutomaticExperiment}s to {@link IExecutable}s.
+ */
+public class AutomaticExperimentExecutableAdapterFactory 
+	extends	AutomaticexperimentAdapterFactory 
+	implements ExecutableAdapterFactory 
+{
+
+	/**
+	 * Default Constructor
+	 */
+	public AutomaticExperimentExecutableAdapterFactory() {
+		super();
+		ExecutableAdapterFactory.INSTANCE.addAdapterFactory(this);
+	}
+	
+	/**
+	 * @see org.eclipse.stem.analysis.automaticexperiment.util.AutomaticexperimentAdapterFactory#createAutomaticExperimentAdapter()
+	 */
+	@Override
+	public Adapter createAutomaticExperimentAdapter() {
+		return new AutomaticExperimentExecutableAdapter();
+	}
+
+	/**
+	 * @see org.eclipse.stem.analysis.automaticexperiment.util.AutomaticexperimentAdapterFactory#isFactoryForType(java.lang.Object)
+	 */
+	@Override
+	public boolean isFactoryForType(final Object type) {
+		return type == IExecutable.class || super.isFactoryForType(type);
+	}
+	
+	/**
+	 * This class adapts an {@link AutomaticExperiment} to an {@link IExecutable}.
+	 */
+	protected static class AutomaticExperimentExecutableAdapter extends
+			ExecutableAdapter implements Adapter {
+
+		/**
+		 * @see org.eclipse.stem.jobs.adapters.executable.emf.ExecutableAdapter#run()
+		 */
+		@Override
+		public void run() {
+			org.eclipse.stem.ui.Activator.switchToPerspective(org.eclipse.stem.analysis.automaticexperiment.perspectives.AutomaticExperiment.ID_STEM_AUTOMATIC_EXPERIMENT_PERSPECTIVE);
+			AutomaticExperimentManager manager = AutomaticExperimentManager.getInstance();
+			OptimizerAlgorithm alg = (OptimizerAlgorithm)getTarget();
+			ErrorAnalysisAlgorithm algorithm = manager.createAlgorithm(alg);
+			manager.executeAlgorithm(algorithm, (AutomaticExperiment)alg);
+		}
+	}
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticExperimentImpl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticExperimentImpl.java
new file mode 100644
index 0000000..28f132b
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticExperimentImpl.java
@@ -0,0 +1,625 @@
+package org.eclipse.stem.analysis.automaticexperiment.impl;

+

+/*******************************************************************************

+ * 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 java.util.Collection;

+

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.common.notify.NotificationChain;

+import org.eclipse.emf.common.util.EList;

+import org.eclipse.emf.ecore.EClass;

+import org.eclipse.emf.ecore.InternalEObject;

+import org.eclipse.emf.ecore.impl.ENotificationImpl;

+import org.eclipse.emf.ecore.util.EObjectContainmentEList;

+import org.eclipse.emf.ecore.util.InternalEList;

+import org.eclipse.stem.analysis.ErrorFunction;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+import org.eclipse.stem.core.scenario.Scenario;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * An implementation of the model object '<em><b>Automatic Experiment</b></em>'.

+ * <!-- end-user-doc -->

+ * <p>

+ * The following features are implemented:

+ * <ul>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getBaseScenario <em>Base Scenario</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getParameters <em>Parameters</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getErrorAnalysisAlgorithm <em>Error Analysis Algorithm</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getErrorFunction <em>Error Function</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getTolerance <em>Tolerance</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getReferanceDataDir <em>Referance Data Dir</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getMaximumNumberOfIterations <em>Maximum Number Of Iterations</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#isReInit <em>Re Init</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.AutomaticExperimentImpl#getErrorFunc <em>Error Func</em>}</li>

+ * </ul>

+ * </p>

+ *

+ * @generated

+ */

+public class AutomaticExperimentImpl extends OptimizerAlgorithmImpl implements AutomaticExperiment {

+	/**

+	 * The cached value of the '{@link #getBaseScenario() <em>Base Scenario</em>}' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getBaseScenario()

+	 * @generated

+	 * @ordered

+	 */

+	protected Scenario baseScenario;

+

+	/**

+	 * The cached value of the '{@link #getParameters() <em>Parameters</em>}' containment reference list.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getParameters()

+	 * @generated

+	 * @ordered

+	 */

+	protected EList<ModifiableParameter> parameters;

+

+	/**

+	 * The default value of the '{@link #getErrorAnalysisAlgorithm() <em>Error Analysis Algorithm</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getErrorAnalysisAlgorithm()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final String ERROR_ANALYSIS_ALGORITHM_EDEFAULT = null;

+

+	/**

+	 * The cached value of the '{@link #getErrorAnalysisAlgorithm() <em>Error Analysis Algorithm</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getErrorAnalysisAlgorithm()

+	 * @generated

+	 * @ordered

+	 */

+	protected String errorAnalysisAlgorithm = ERROR_ANALYSIS_ALGORITHM_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getErrorFunction() <em>Error Function</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getErrorFunction()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final String ERROR_FUNCTION_EDEFAULT = null;

+

+	/**

+	 * The cached value of the '{@link #getErrorFunction() <em>Error Function</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getErrorFunction()

+	 * @generated

+	 * @ordered

+	 */

+	protected String errorFunction = ERROR_FUNCTION_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getTolerance() <em>Tolerance</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getTolerance()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final double TOLERANCE_EDEFAULT = 0.0;

+

+	/**

+	 * The cached value of the '{@link #getTolerance() <em>Tolerance</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getTolerance()

+	 * @generated

+	 * @ordered

+	 */

+	protected double tolerance = TOLERANCE_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getReferanceDataDir() <em>Referance Data Dir</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getReferanceDataDir()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final String REFERANCE_DATA_DIR_EDEFAULT = null;

+

+	/**

+	 * The cached value of the '{@link #getReferanceDataDir() <em>Referance Data Dir</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getReferanceDataDir()

+	 * @generated

+	 * @ordered

+	 */

+	protected String referanceDataDir = REFERANCE_DATA_DIR_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getMaximumNumberOfIterations() <em>Maximum Number Of Iterations</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getMaximumNumberOfIterations()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final long MAXIMUM_NUMBER_OF_ITERATIONS_EDEFAULT = 0L;

+

+	/**

+	 * The cached value of the '{@link #getMaximumNumberOfIterations() <em>Maximum Number Of Iterations</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getMaximumNumberOfIterations()

+	 * @generated

+	 * @ordered

+	 */

+	protected long maximumNumberOfIterations = MAXIMUM_NUMBER_OF_ITERATIONS_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #isReInit() <em>Re Init</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #isReInit()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final boolean RE_INIT_EDEFAULT = false;

+

+	/**

+	 * The cached value of the '{@link #isReInit() <em>Re Init</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #isReInit()

+	 * @generated

+	 * @ordered

+	 */

+	protected boolean reInit = RE_INIT_EDEFAULT;

+

+	/**

+	 * The cached value of the '{@link #getErrorFunc() <em>Error Func</em>}' containment reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getErrorFunc()

+	 * @generated

+	 * @ordered

+	 */

+	protected ErrorFunction errorFunc;

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated NOT

+	 */

+	public AutomaticExperimentImpl() {

+		super();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected EClass eStaticClass() {

+		return AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public Scenario getBaseScenario() {

+		if (baseScenario != null && baseScenario.eIsProxy()) {

+			InternalEObject oldBaseScenario = (InternalEObject)baseScenario;

+			baseScenario = (Scenario)eResolveProxy(oldBaseScenario);

+			if (baseScenario != oldBaseScenario) {

+				if (eNotificationRequired())

+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__BASE_SCENARIO, oldBaseScenario, baseScenario));

+			}

+		}

+		return baseScenario;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public Scenario basicGetBaseScenario() {

+		return baseScenario;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setBaseScenario(Scenario newBaseScenario) {

+		Scenario oldBaseScenario = baseScenario;

+		baseScenario = newBaseScenario;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__BASE_SCENARIO, oldBaseScenario, baseScenario));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EList<ModifiableParameter> getParameters() {

+		if (parameters == null) {

+			parameters = new EObjectContainmentEList<ModifiableParameter>(ModifiableParameter.class, this, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__PARAMETERS);

+		}

+		return parameters;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public String getErrorAnalysisAlgorithm() {

+		return errorAnalysisAlgorithm;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setErrorAnalysisAlgorithm(String newErrorAnalysisAlgorithm) {

+		String oldErrorAnalysisAlgorithm = errorAnalysisAlgorithm;

+		errorAnalysisAlgorithm = newErrorAnalysisAlgorithm;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM, oldErrorAnalysisAlgorithm, errorAnalysisAlgorithm));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public String getErrorFunction() {

+		return errorFunction;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setErrorFunction(String newErrorFunction) {

+		String oldErrorFunction = errorFunction;

+		errorFunction = newErrorFunction;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION, oldErrorFunction, errorFunction));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public double getTolerance() {

+		return tolerance;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setTolerance(double newTolerance) {

+		double oldTolerance = tolerance;

+		tolerance = newTolerance;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__TOLERANCE, oldTolerance, tolerance));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public String getReferanceDataDir() {

+		return referanceDataDir;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setReferanceDataDir(String newReferanceDataDir) {

+		String oldReferanceDataDir = referanceDataDir;

+		referanceDataDir = newReferanceDataDir;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR, oldReferanceDataDir, referanceDataDir));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public long getMaximumNumberOfIterations() {

+		return maximumNumberOfIterations;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setMaximumNumberOfIterations(long newMaximumNumberOfIterations) {

+		long oldMaximumNumberOfIterations = maximumNumberOfIterations;

+		maximumNumberOfIterations = newMaximumNumberOfIterations;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS, oldMaximumNumberOfIterations, maximumNumberOfIterations));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public boolean isReInit() {

+		return reInit;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setReInit(boolean newReInit) {

+		boolean oldReInit = reInit;

+		reInit = newReInit;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__RE_INIT, oldReInit, reInit));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public ErrorFunction getErrorFunc() {

+		return errorFunc;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public NotificationChain basicSetErrorFunc(ErrorFunction newErrorFunc, NotificationChain msgs) {

+		ErrorFunction oldErrorFunc = errorFunc;

+		errorFunc = newErrorFunc;

+		if (eNotificationRequired()) {

+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC, oldErrorFunc, newErrorFunc);

+			if (msgs == null) msgs = notification; else msgs.add(notification);

+		}

+		return msgs;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setErrorFunc(ErrorFunction newErrorFunc) {

+		if (newErrorFunc != errorFunc) {

+			NotificationChain msgs = null;

+			if (errorFunc != null)

+				msgs = ((InternalEObject)errorFunc).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC, null, msgs);

+			if (newErrorFunc != null)

+				msgs = ((InternalEObject)newErrorFunc).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC, null, msgs);

+			msgs = basicSetErrorFunc(newErrorFunc, msgs);

+			if (msgs != null) msgs.dispatch();

+		}

+		else if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC, newErrorFunc, newErrorFunc));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__PARAMETERS:

+				return ((InternalEList<?>)getParameters()).basicRemove(otherEnd, msgs);

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC:

+				return basicSetErrorFunc(null, msgs);

+		}

+		return super.eInverseRemove(otherEnd, featureID, msgs);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Object eGet(int featureID, boolean resolve, boolean coreType) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__BASE_SCENARIO:

+				if (resolve) return getBaseScenario();

+				return basicGetBaseScenario();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__PARAMETERS:

+				return getParameters();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM:

+				return getErrorAnalysisAlgorithm();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION:

+				return getErrorFunction();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__TOLERANCE:

+				return getTolerance();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR:

+				return getReferanceDataDir();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS:

+				return getMaximumNumberOfIterations();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__RE_INIT:

+				return isReInit();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC:

+				return getErrorFunc();

+		}

+		return super.eGet(featureID, resolve, coreType);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@SuppressWarnings("unchecked")

+	@Override

+	public void eSet(int featureID, Object newValue) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__BASE_SCENARIO:

+				setBaseScenario((Scenario)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__PARAMETERS:

+				getParameters().clear();

+				getParameters().addAll((Collection<? extends ModifiableParameter>)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM:

+				setErrorAnalysisAlgorithm((String)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION:

+				setErrorFunction((String)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__TOLERANCE:

+				setTolerance((Double)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR:

+				setReferanceDataDir((String)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS:

+				setMaximumNumberOfIterations((Long)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__RE_INIT:

+				setReInit((Boolean)newValue);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC:

+				setErrorFunc((ErrorFunction)newValue);

+				return;

+		}

+		super.eSet(featureID, newValue);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void eUnset(int featureID) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__BASE_SCENARIO:

+				setBaseScenario((Scenario)null);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__PARAMETERS:

+				getParameters().clear();

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM:

+				setErrorAnalysisAlgorithm(ERROR_ANALYSIS_ALGORITHM_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION:

+				setErrorFunction(ERROR_FUNCTION_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__TOLERANCE:

+				setTolerance(TOLERANCE_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR:

+				setReferanceDataDir(REFERANCE_DATA_DIR_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS:

+				setMaximumNumberOfIterations(MAXIMUM_NUMBER_OF_ITERATIONS_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__RE_INIT:

+				setReInit(RE_INIT_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC:

+				setErrorFunc((ErrorFunction)null);

+				return;

+		}

+		super.eUnset(featureID);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public boolean eIsSet(int featureID) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__BASE_SCENARIO:

+				return baseScenario != null;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__PARAMETERS:

+				return parameters != null && !parameters.isEmpty();

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM:

+				return ERROR_ANALYSIS_ALGORITHM_EDEFAULT == null ? errorAnalysisAlgorithm != null : !ERROR_ANALYSIS_ALGORITHM_EDEFAULT.equals(errorAnalysisAlgorithm);

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION:

+				return ERROR_FUNCTION_EDEFAULT == null ? errorFunction != null : !ERROR_FUNCTION_EDEFAULT.equals(errorFunction);

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__TOLERANCE:

+				return tolerance != TOLERANCE_EDEFAULT;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR:

+				return REFERANCE_DATA_DIR_EDEFAULT == null ? referanceDataDir != null : !REFERANCE_DATA_DIR_EDEFAULT.equals(referanceDataDir);

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS:

+				return maximumNumberOfIterations != MAXIMUM_NUMBER_OF_ITERATIONS_EDEFAULT;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__RE_INIT:

+				return reInit != RE_INIT_EDEFAULT;

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC:

+				return errorFunc != null;

+		}

+		return super.eIsSet(featureID);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public String toString() {

+		if (eIsProxy()) return super.toString();

+

+		StringBuffer result = new StringBuffer(super.toString());

+		result.append(" (errorAnalysisAlgorithm: ");

+		result.append(errorAnalysisAlgorithm);

+		result.append(", errorFunction: ");

+		result.append(errorFunction);

+		result.append(", tolerance: ");

+		result.append(tolerance);

+		result.append(", referanceDataDir: ");

+		result.append(referanceDataDir);

+		result.append(", maximumNumberOfIterations: ");

+		result.append(maximumNumberOfIterations);

+		result.append(", reInit: ");

+		result.append(reInit);

+		result.append(')');

+		return result.toString();

+	}

+

+} //AutomaticExperimentImpl

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticexperimentFactoryImpl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticexperimentFactoryImpl.java
new file mode 100644
index 0000000..69ee2ca
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticexperimentFactoryImpl.java
@@ -0,0 +1,128 @@
+package org.eclipse.stem.analysis.automaticexperiment.impl;

+

+/*******************************************************************************

+ * 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.emf.ecore.EClass;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EPackage;

+import org.eclipse.emf.ecore.impl.EFactoryImpl;

+import org.eclipse.emf.ecore.plugin.EcorePlugin;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentFactory;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * An implementation of the model <b>Factory</b>.

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class AutomaticexperimentFactoryImpl extends EFactoryImpl implements AutomaticexperimentFactory {

+	/**

+	 * Creates the default factory implementation.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public static AutomaticexperimentFactory init() {

+		try {

+			AutomaticexperimentFactory theAutomaticexperimentFactory = (AutomaticexperimentFactory)EPackage.Registry.INSTANCE.getEFactory("http:///org/eclipse/stem/core/automaticexperiment.ecore"); 

+			if (theAutomaticexperimentFactory != null) {

+				return theAutomaticexperimentFactory;

+			}

+		}

+		catch (Exception exception) {

+			EcorePlugin.INSTANCE.log(exception);

+		}

+		return new AutomaticexperimentFactoryImpl();

+	}

+

+	/**

+	 * Creates an instance of the factory.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentFactoryImpl() {

+		super();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public EObject create(EClass eClass) {

+		switch (eClass.getClassifierID()) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT: return createAutomaticExperiment();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER: return createModifiableParameter();

+			case AutomaticexperimentPackage.OPTIMIZER_ALGORITHM: return createOptimizerAlgorithm();

+			default:

+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");

+		}

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticExperiment createAutomaticExperiment() {

+		AutomaticExperimentImpl automaticExperiment = new AutomaticExperimentImpl();

+		return automaticExperiment;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public ModifiableParameter createModifiableParameter() {

+		ModifiableParameterImpl modifiableParameter = new ModifiableParameterImpl();

+		return modifiableParameter;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public OptimizerAlgorithm createOptimizerAlgorithm() {

+		OptimizerAlgorithmImpl optimizerAlgorithm = new OptimizerAlgorithmImpl();

+		return optimizerAlgorithm;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentPackage getAutomaticexperimentPackage() {

+		return (AutomaticexperimentPackage)getEPackage();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @deprecated

+	 * @generated

+	 */

+	@Deprecated

+	public static AutomaticexperimentPackage getPackage() {

+		return AutomaticexperimentPackage.eINSTANCE;

+	}

+

+} //AutomaticexperimentFactoryImpl

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticexperimentPackageImpl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticexperimentPackageImpl.java
new file mode 100644
index 0000000..5e89085
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/AutomaticexperimentPackageImpl.java
@@ -0,0 +1,420 @@
+package org.eclipse.stem.analysis.automaticexperiment.impl;

+

+/*******************************************************************************

+ * 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.emf.ecore.EAttribute;

+import org.eclipse.emf.ecore.EClass;

+import org.eclipse.emf.ecore.EPackage;

+import org.eclipse.emf.ecore.EReference;

+import org.eclipse.emf.ecore.EcorePackage;

+import org.eclipse.emf.ecore.impl.EPackageImpl;

+import org.eclipse.stem.analysis.AnalysisPackage;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentFactory;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;

+import org.eclipse.stem.core.common.CommonPackage;

+import org.eclipse.stem.core.graph.GraphPackage;

+import org.eclipse.stem.core.model.ModelPackage;

+import org.eclipse.stem.core.modifier.ModifierPackage;

+import org.eclipse.stem.core.scenario.ScenarioPackage;

+import org.eclipse.stem.core.sequencer.SequencerPackage;

+import org.eclipse.stem.core.solver.SolverPackage;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * An implementation of the model <b>Package</b>.

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class AutomaticexperimentPackageImpl extends EPackageImpl implements AutomaticexperimentPackage {

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private EClass automaticExperimentEClass = null;

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private EClass modifiableParameterEClass = null;

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private EClass optimizerAlgorithmEClass = null;

+

+	/**

+	 * Creates an instance of the model <b>Package</b>, registered with

+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package

+	 * package URI value.

+	 * <p>Note: the correct way to create the package is via the static

+	 * factory method {@link #init init()}, which also performs

+	 * initialization of the package, or returns the registered package,

+	 * if one already exists.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see org.eclipse.emf.ecore.EPackage.Registry

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage#eNS_URI

+	 * @see #init()

+	 * @generated

+	 */

+	private AutomaticexperimentPackageImpl() {

+		super(eNS_URI, AutomaticexperimentFactory.eINSTANCE);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private static boolean isInited = false;

+

+	/**

+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.

+	 * 

+	 * <p>This method is used to initialize {@link AutomaticexperimentPackage#eINSTANCE} when that field is accessed.

+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #eNS_URI

+	 * @see #createPackageContents()

+	 * @see #initializePackageContents()

+	 * @generated

+	 */

+	public static AutomaticexperimentPackage init() {

+		if (isInited) return (AutomaticexperimentPackage)EPackage.Registry.INSTANCE.getEPackage(AutomaticexperimentPackage.eNS_URI);

+

+		// Obtain or create and register package

+		AutomaticexperimentPackageImpl theAutomaticexperimentPackage = (AutomaticexperimentPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof AutomaticexperimentPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new AutomaticexperimentPackageImpl());

+

+		isInited = true;

+

+		// Initialize simple dependencies

+		AnalysisPackage.eINSTANCE.eClass();

+		CommonPackage.eINSTANCE.eClass();

+		GraphPackage.eINSTANCE.eClass();

+		ModelPackage.eINSTANCE.eClass();

+		ModifierPackage.eINSTANCE.eClass();

+		ScenarioPackage.eINSTANCE.eClass();

+		SequencerPackage.eINSTANCE.eClass();

+		SolverPackage.eINSTANCE.eClass();

+

+		// Create package meta-data objects

+		theAutomaticexperimentPackage.createPackageContents();

+

+		// Initialize created meta-data

+		theAutomaticexperimentPackage.initializePackageContents();

+

+		// Mark meta-data to indicate it can't be changed

+		theAutomaticexperimentPackage.freeze();

+

+  

+		// Update the registry and return the package

+		EPackage.Registry.INSTANCE.put(AutomaticexperimentPackage.eNS_URI, theAutomaticexperimentPackage);

+		return theAutomaticexperimentPackage;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EClass getAutomaticExperiment() {

+		return automaticExperimentEClass;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EReference getAutomaticExperiment_BaseScenario() {

+		return (EReference)automaticExperimentEClass.getEStructuralFeatures().get(0);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EReference getAutomaticExperiment_Parameters() {

+		return (EReference)automaticExperimentEClass.getEStructuralFeatures().get(1);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getAutomaticExperiment_ErrorAnalysisAlgorithm() {

+		return (EAttribute)automaticExperimentEClass.getEStructuralFeatures().get(2);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getAutomaticExperiment_ErrorFunction() {

+		return (EAttribute)automaticExperimentEClass.getEStructuralFeatures().get(3);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getAutomaticExperiment_Tolerance() {

+		return (EAttribute)automaticExperimentEClass.getEStructuralFeatures().get(4);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getAutomaticExperiment_ReferanceDataDir() {

+		return (EAttribute)automaticExperimentEClass.getEStructuralFeatures().get(5);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getAutomaticExperiment_MaximumNumberOfIterations() {

+		return (EAttribute)automaticExperimentEClass.getEStructuralFeatures().get(6);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getAutomaticExperiment_ReInit() {

+		return (EAttribute)automaticExperimentEClass.getEStructuralFeatures().get(7);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EReference getAutomaticExperiment_ErrorFunc() {

+		return (EReference)automaticExperimentEClass.getEStructuralFeatures().get(8);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EClass getModifiableParameter() {

+		return modifiableParameterEClass;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getModifiableParameter_InitialValue() {

+		return (EAttribute)modifiableParameterEClass.getEStructuralFeatures().get(0);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EReference getModifiableParameter_Feature() {

+		return (EReference)modifiableParameterEClass.getEStructuralFeatures().get(1);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getModifiableParameter_Step() {

+		return (EAttribute)modifiableParameterEClass.getEStructuralFeatures().get(2);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getModifiableParameter_FeatureName() {

+		return (EAttribute)modifiableParameterEClass.getEStructuralFeatures().get(3);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getModifiableParameter_LowerBound() {

+		return (EAttribute)modifiableParameterEClass.getEStructuralFeatures().get(4);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getModifiableParameter_UpperBound() {

+		return (EAttribute)modifiableParameterEClass.getEStructuralFeatures().get(5);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EAttribute getModifiableParameter_TargetURI() {

+		return (EAttribute)modifiableParameterEClass.getEStructuralFeatures().get(6);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EClass getOptimizerAlgorithm() {

+		return optimizerAlgorithmEClass;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentFactory getAutomaticexperimentFactory() {

+		return (AutomaticexperimentFactory)getEFactoryInstance();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private boolean isCreated = false;

+

+	/**

+	 * Creates the meta-model objects for the package.  This method is

+	 * guarded to have no affect on any invocation but its first.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void createPackageContents() {

+		if (isCreated) return;

+		isCreated = true;

+

+		// Create classes and their features

+		automaticExperimentEClass = createEClass(AUTOMATIC_EXPERIMENT);

+		createEReference(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__BASE_SCENARIO);

+		createEReference(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__PARAMETERS);

+		createEAttribute(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM);

+		createEAttribute(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__ERROR_FUNCTION);

+		createEAttribute(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__TOLERANCE);

+		createEAttribute(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR);

+		createEAttribute(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS);

+		createEAttribute(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__RE_INIT);

+		createEReference(automaticExperimentEClass, AUTOMATIC_EXPERIMENT__ERROR_FUNC);

+

+		modifiableParameterEClass = createEClass(MODIFIABLE_PARAMETER);

+		createEAttribute(modifiableParameterEClass, MODIFIABLE_PARAMETER__INITIAL_VALUE);

+		createEReference(modifiableParameterEClass, MODIFIABLE_PARAMETER__FEATURE);

+		createEAttribute(modifiableParameterEClass, MODIFIABLE_PARAMETER__STEP);

+		createEAttribute(modifiableParameterEClass, MODIFIABLE_PARAMETER__FEATURE_NAME);

+		createEAttribute(modifiableParameterEClass, MODIFIABLE_PARAMETER__LOWER_BOUND);

+		createEAttribute(modifiableParameterEClass, MODIFIABLE_PARAMETER__UPPER_BOUND);

+		createEAttribute(modifiableParameterEClass, MODIFIABLE_PARAMETER__TARGET_URI);

+

+		optimizerAlgorithmEClass = createEClass(OPTIMIZER_ALGORITHM);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private boolean isInitialized = false;

+

+	/**

+	 * Complete the initialization of the package and its meta-model.  This

+	 * method is guarded to have no affect on any invocation but its first.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void initializePackageContents() {

+		if (isInitialized) return;

+		isInitialized = true;

+

+		// Initialize package

+		setName(eNAME);

+		setNsPrefix(eNS_PREFIX);

+		setNsURI(eNS_URI);

+

+		// Obtain other dependent packages

+		ScenarioPackage theScenarioPackage = (ScenarioPackage)EPackage.Registry.INSTANCE.getEPackage(ScenarioPackage.eNS_URI);

+		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);

+		AnalysisPackage theAnalysisPackage = (AnalysisPackage)EPackage.Registry.INSTANCE.getEPackage(AnalysisPackage.eNS_URI);

+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);

+

+		// Create type parameters

+

+		// Set bounds for type parameters

+

+		// Add supertypes to classes

+		automaticExperimentEClass.getESuperTypes().add(this.getOptimizerAlgorithm());

+		optimizerAlgorithmEClass.getESuperTypes().add(theCommonPackage.getIdentifiable());

+

+		// Initialize classes and features; add operations and parameters

+		initEClass(automaticExperimentEClass, AutomaticExperiment.class, "AutomaticExperiment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

+		initEReference(getAutomaticExperiment_BaseScenario(), theScenarioPackage.getScenario(), null, "baseScenario", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEReference(getAutomaticExperiment_Parameters(), this.getModifiableParameter(), null, "parameters", null, 1, -1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getAutomaticExperiment_ErrorAnalysisAlgorithm(), theEcorePackage.getEString(), "errorAnalysisAlgorithm", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getAutomaticExperiment_ErrorFunction(), theEcorePackage.getEString(), "errorFunction", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getAutomaticExperiment_Tolerance(), theEcorePackage.getEDouble(), "tolerance", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getAutomaticExperiment_ReferanceDataDir(), theEcorePackage.getEString(), "referanceDataDir", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getAutomaticExperiment_MaximumNumberOfIterations(), theEcorePackage.getELong(), "maximumNumberOfIterations", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getAutomaticExperiment_ReInit(), theEcorePackage.getEBoolean(), "reInit", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEReference(getAutomaticExperiment_ErrorFunc(), theAnalysisPackage.getErrorFunction(), null, "errorFunc", null, 1, 1, AutomaticExperiment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+

+		initEClass(modifiableParameterEClass, ModifiableParameter.class, "ModifiableParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

+		initEAttribute(getModifiableParameter_InitialValue(), theEcorePackage.getEDouble(), "initialValue", null, 1, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEReference(getModifiableParameter_Feature(), theEcorePackage.getEStructuralFeature(), null, "feature", null, 1, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getModifiableParameter_Step(), theEcorePackage.getEDouble(), "step", null, 1, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getModifiableParameter_FeatureName(), theEcorePackage.getEString(), "featureName", null, 1, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getModifiableParameter_LowerBound(), theEcorePackage.getEDouble(), "lowerBound", "-1", 0, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getModifiableParameter_UpperBound(), theEcorePackage.getEDouble(), "upperBound", "-1", 0, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getModifiableParameter_TargetURI(), theCommonPackage.getURI(), "targetURI", null, 0, 1, ModifiableParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+

+		initEClass(optimizerAlgorithmEClass, OptimizerAlgorithm.class, "OptimizerAlgorithm", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

+

+		// Create resource

+		createResource(eNS_URI);

+	}

+

+} //AutomaticexperimentPackageImpl

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/ModifiableParameterImpl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/ModifiableParameterImpl.java
new file mode 100644
index 0000000..4ecb840
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/ModifiableParameterImpl.java
@@ -0,0 +1,503 @@
+package org.eclipse.stem.analysis.automaticexperiment.impl;

+

+/*******************************************************************************

+ * 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.emf.common.notify.Notification;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EClass;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.emf.ecore.InternalEObject;

+import org.eclipse.emf.ecore.impl.ENotificationImpl;

+import org.eclipse.emf.ecore.impl.EObjectImpl;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * An implementation of the model object '<em><b>Modifiable Parameter</b></em>'.

+ * <!-- end-user-doc -->

+ * <p>

+ * The following features are implemented:

+ * <ul>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getInitialValue <em>Initial Value</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getFeature <em>Feature</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getStep <em>Step</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getFeatureName <em>Feature Name</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getLowerBound <em>Lower Bound</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getUpperBound <em>Upper Bound</em>}</li>

+ *   <li>{@link org.eclipse.stem.analysis.automaticexperiment.impl.ModifiableParameterImpl#getTargetURI <em>Target URI</em>}</li>

+ * </ul>

+ * </p>

+ *

+ * @generated

+ */

+public class ModifiableParameterImpl extends EObjectImpl implements ModifiableParameter {

+	/**

+	 * The default value of the '{@link #getInitialValue() <em>Initial Value</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getInitialValue()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final double INITIAL_VALUE_EDEFAULT = 0.0;

+

+	/**

+	 * The cached value of the '{@link #getInitialValue() <em>Initial Value</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getInitialValue()

+	 * @generated

+	 * @ordered

+	 */

+	protected double initialValue = INITIAL_VALUE_EDEFAULT;

+

+	/**

+	 * The cached value of the '{@link #getFeature() <em>Feature</em>}' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getFeature()

+	 * @generated

+	 * @ordered

+	 */

+	protected EStructuralFeature feature;

+

+	/**

+	 * The default value of the '{@link #getStep() <em>Step</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getStep()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final double STEP_EDEFAULT = 0.0;

+

+	/**

+	 * The cached value of the '{@link #getStep() <em>Step</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getStep()

+	 * @generated

+	 * @ordered

+	 */

+	protected double step = STEP_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getFeatureName() <em>Feature Name</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getFeatureName()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final String FEATURE_NAME_EDEFAULT = null;

+

+	/**

+	 * The cached value of the '{@link #getFeatureName() <em>Feature Name</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getFeatureName()

+	 * @generated

+	 * @ordered

+	 */

+	protected String featureName = FEATURE_NAME_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getLowerBound() <em>Lower Bound</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getLowerBound()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final double LOWER_BOUND_EDEFAULT = -1.0;

+

+	/**

+	 * The cached value of the '{@link #getLowerBound() <em>Lower Bound</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getLowerBound()

+	 * @generated

+	 * @ordered

+	 */

+	protected double lowerBound = LOWER_BOUND_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getUpperBound() <em>Upper Bound</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getUpperBound()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final double UPPER_BOUND_EDEFAULT = -1.0;

+

+	/**

+	 * The cached value of the '{@link #getUpperBound() <em>Upper Bound</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getUpperBound()

+	 * @generated

+	 * @ordered

+	 */

+	protected double upperBound = UPPER_BOUND_EDEFAULT;

+

+	/**

+	 * The default value of the '{@link #getTargetURI() <em>Target URI</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getTargetURI()

+	 * @generated

+	 * @ordered

+	 */

+	protected static final URI TARGET_URI_EDEFAULT = null;

+

+	/**

+	 * The cached value of the '{@link #getTargetURI() <em>Target URI</em>}' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see #getTargetURI()

+	 * @generated

+	 * @ordered

+	 */

+	protected URI targetURI = TARGET_URI_EDEFAULT;

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ModifiableParameterImpl() {

+		super();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected EClass eStaticClass() {

+		return AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public double getInitialValue() {

+		return initialValue;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setInitialValue(double newInitialValue) {

+		double oldInitialValue = initialValue;

+		initialValue = newInitialValue;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__INITIAL_VALUE, oldInitialValue, initialValue));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EStructuralFeature getFeature() {

+		if (feature != null && feature.eIsProxy()) {

+			InternalEObject oldFeature = (InternalEObject)feature;

+			feature = (EStructuralFeature)eResolveProxy(oldFeature);

+			if (feature != oldFeature) {

+				if (eNotificationRequired())

+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE, oldFeature, feature));

+			}

+		}

+		return feature;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EStructuralFeature basicGetFeature() {

+		return feature;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setFeature(EStructuralFeature newFeature) {

+		EStructuralFeature oldFeature = feature;

+		feature = newFeature;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE, oldFeature, feature));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public double getStep() {

+		return step;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setStep(double newStep) {

+		double oldStep = step;

+		step = newStep;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__STEP, oldStep, step));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public String getFeatureName() {

+		return featureName;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setFeatureName(String newFeatureName) {

+		String oldFeatureName = featureName;

+		featureName = newFeatureName;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE_NAME, oldFeatureName, featureName));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public double getLowerBound() {

+		return lowerBound;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setLowerBound(double newLowerBound) {

+		double oldLowerBound = lowerBound;

+		lowerBound = newLowerBound;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__LOWER_BOUND, oldLowerBound, lowerBound));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public double getUpperBound() {

+		return upperBound;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setUpperBound(double newUpperBound) {

+		double oldUpperBound = upperBound;

+		upperBound = newUpperBound;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__UPPER_BOUND, oldUpperBound, upperBound));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public URI getTargetURI() {

+		return targetURI;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setTargetURI(URI newTargetURI) {

+		URI oldTargetURI = targetURI;

+		targetURI = newTargetURI;

+		if (eNotificationRequired())

+			eNotify(new ENotificationImpl(this, Notification.SET, AutomaticexperimentPackage.MODIFIABLE_PARAMETER__TARGET_URI, oldTargetURI, targetURI));

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Object eGet(int featureID, boolean resolve, boolean coreType) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__INITIAL_VALUE:

+				return getInitialValue();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE:

+				if (resolve) return getFeature();

+				return basicGetFeature();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__STEP:

+				return getStep();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE_NAME:

+				return getFeatureName();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__LOWER_BOUND:

+				return getLowerBound();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__UPPER_BOUND:

+				return getUpperBound();

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__TARGET_URI:

+				return getTargetURI();

+		}

+		return super.eGet(featureID, resolve, coreType);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void eSet(int featureID, Object newValue) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__INITIAL_VALUE:

+				setInitialValue((Double)newValue);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE:

+				setFeature((EStructuralFeature)newValue);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__STEP:

+				setStep((Double)newValue);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE_NAME:

+				setFeatureName((String)newValue);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__LOWER_BOUND:

+				setLowerBound((Double)newValue);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__UPPER_BOUND:

+				setUpperBound((Double)newValue);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__TARGET_URI:

+				setTargetURI((URI)newValue);

+				return;

+		}

+		super.eSet(featureID, newValue);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void eUnset(int featureID) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__INITIAL_VALUE:

+				setInitialValue(INITIAL_VALUE_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE:

+				setFeature((EStructuralFeature)null);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__STEP:

+				setStep(STEP_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE_NAME:

+				setFeatureName(FEATURE_NAME_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__LOWER_BOUND:

+				setLowerBound(LOWER_BOUND_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__UPPER_BOUND:

+				setUpperBound(UPPER_BOUND_EDEFAULT);

+				return;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__TARGET_URI:

+				setTargetURI(TARGET_URI_EDEFAULT);

+				return;

+		}

+		super.eUnset(featureID);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public boolean eIsSet(int featureID) {

+		switch (featureID) {

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__INITIAL_VALUE:

+				return initialValue != INITIAL_VALUE_EDEFAULT;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE:

+				return feature != null;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__STEP:

+				return step != STEP_EDEFAULT;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE_NAME:

+				return FEATURE_NAME_EDEFAULT == null ? featureName != null : !FEATURE_NAME_EDEFAULT.equals(featureName);

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__LOWER_BOUND:

+				return lowerBound != LOWER_BOUND_EDEFAULT;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__UPPER_BOUND:

+				return upperBound != UPPER_BOUND_EDEFAULT;

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__TARGET_URI:

+				return TARGET_URI_EDEFAULT == null ? targetURI != null : !TARGET_URI_EDEFAULT.equals(targetURI);

+		}

+		return super.eIsSet(featureID);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public String toString() {

+		if (eIsProxy()) return super.toString();

+

+		StringBuffer result = new StringBuffer(super.toString());

+		result.append(" (initialValue: ");

+		result.append(initialValue);

+		result.append(", step: ");

+		result.append(step);

+		result.append(", featureName: ");

+		result.append(featureName);

+		result.append(", lowerBound: ");

+		result.append(lowerBound);

+		result.append(", upperBound: ");

+		result.append(upperBound);

+		result.append(", targetURI: ");

+		result.append(targetURI);

+		result.append(')');

+		return result.toString();

+	}

+

+} //ModifiableParameterImpl

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/OptimizerAlgorithmImpl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/OptimizerAlgorithmImpl.java
new file mode 100644
index 0000000..7633da7
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/impl/OptimizerAlgorithmImpl.java
@@ -0,0 +1,47 @@
+package org.eclipse.stem.analysis.automaticexperiment.impl;
+
+/******************************************************************************* 
+ * Copyright (c) 2011 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.emf.ecore.EClass;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;
+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;
+import org.eclipse.stem.core.common.impl.IdentifiableImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Optimizer Algorithm</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class OptimizerAlgorithmImpl extends IdentifiableImpl implements OptimizerAlgorithm {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected OptimizerAlgorithmImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return AutomaticexperimentPackage.Literals.OPTIMIZER_ALGORITHM;
+	}
+
+} //OptimizerAlgorithmImpl
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/perspectives/AutomaticExperiment.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/perspectives/AutomaticExperiment.java
new file mode 100644
index 0000000..d704e12
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/perspectives/AutomaticExperiment.java
@@ -0,0 +1,70 @@
+// Analysis.java
+package org.eclipse.stem.analysis.automaticexperiment.perspectives;
+
+/*******************************************************************************
+ * Copyright (c) 2008 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.stem.analysis.automaticexperiment.views.AutoExpView;
+import org.eclipse.stem.core.Constants;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.navigator.resources.ProjectExplorer;
+
+
+/**
+ * This class implements the "Analysis" perspective of STEM. This perspective is
+ * used to review and compare the results of different runs.
+ */
+public class AutomaticExperiment implements IPerspectiveFactory {
+
+	/**
+	 * The identifier of the Designer Perspective
+	 */
+	public static final String ID_STEM_AUTOMATIC_EXPERIMENT_PERSPECTIVE = Constants.ID_ROOT
+			+ ".analysis.automaticexperiment.perspective"; //$NON-NLS-1$
+
+	/**
+	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui
+	 *      .IPageLayout)
+	 */
+	public void createInitialLayout(final IPageLayout layout) {
+		final String editorArea = layout.getEditorArea();
+
+		// We don't want to see the editor
+		layout.setEditorAreaVisible(false);
+		// Put the STEM Analysis View by itself on the top
+		layout.addStandaloneView(AutoExpView.ID_AutoExp_VIEW, true, IPageLayout.RIGHT,
+				0.0f, editorArea);
+		
+		// Put the ProjectExplorer view on the left
+		final IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, 0.20f, AutoExpView.ID_AutoExp_VIEW);
+		left.addView(ProjectExplorer.VIEW_ID);
+		
+		// Put the Error Log
+		final IFolderLayout bottom = layout.createFolder("right", IPageLayout.BOTTOM, //$NON-NLS-1$
+				0.60f, AutoExpView.ID_AutoExp_VIEW);
+		// add Error Log view
+		bottom.addView("org.eclipse.pde.runtime.LogView"); //$NON-NLS-1$
+		
+		// add the view to the "Show Views" menu
+		layout.addShowViewShortcut(AutoExpView.ID_AutoExp_VIEW);
+		
+		// We don't want to see the editor
+		layout.setEditorAreaVisible(false);
+
+		// Add the Analysis perspective to the "Open Perspective" menu
+		layout.addPerspectiveShortcut(ID_STEM_AUTOMATIC_EXPERIMENT_PERSPECTIVE);
+
+		
+	} // createInitialLayout
+
+} // Analysis
\ No newline at end of file
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentActionBarContributor.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentActionBarContributor.java
new file mode 100644
index 0000000..72ad3d3
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentActionBarContributor.java
@@ -0,0 +1,429 @@
+package org.eclipse.stem.analysis.automaticexperiment.presentation;

+

+/*******************************************************************************

+ * 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 java.util.ArrayList;

+import java.util.Collection;

+

+import org.eclipse.emf.common.ui.viewer.IViewerProvider;

+import org.eclipse.emf.edit.domain.EditingDomain;

+import org.eclipse.emf.edit.domain.IEditingDomainProvider;

+import org.eclipse.emf.edit.ui.action.ControlAction;

+import org.eclipse.emf.edit.ui.action.CreateChildAction;

+import org.eclipse.emf.edit.ui.action.CreateSiblingAction;

+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;

+import org.eclipse.emf.edit.ui.action.LoadResourceAction;

+import org.eclipse.emf.edit.ui.action.ValidateAction;

+import org.eclipse.jface.action.Action;

+import org.eclipse.jface.action.ActionContributionItem;

+import org.eclipse.jface.action.IAction;

+import org.eclipse.jface.action.IContributionItem;

+import org.eclipse.jface.action.IContributionManager;

+import org.eclipse.jface.action.IMenuListener;

+import org.eclipse.jface.action.IMenuManager;

+import org.eclipse.jface.action.IToolBarManager;

+import org.eclipse.jface.action.MenuManager;

+import org.eclipse.jface.action.Separator;

+import org.eclipse.jface.action.SubContributionItem;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.ISelectionChangedListener;

+import org.eclipse.jface.viewers.ISelectionProvider;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.viewers.SelectionChangedEvent;

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.stem.analysis.automaticexperiment.provider.AutomaticexperienceEditPlugin;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.PartInitException;

+

+

+/**

+ * This is the action bar contributor for the Automaticexperiment model editor.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class AutomaticexperimentActionBarContributor

+	extends EditingDomainActionBarContributor

+	implements ISelectionChangedListener {

+	/**

+	 * This keeps track of the active editor.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IEditorPart activeEditorPart;

+

+	/**

+	 * This keeps track of the current selection provider.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ISelectionProvider selectionProvider;

+

+	/**

+	 * This action opens the Properties view.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IAction showPropertiesViewAction =

+		new Action(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item")) {

+			@Override

+			public void run() {

+				try {

+					getPage().showView("org.eclipse.ui.views.PropertySheet");

+				}

+				catch (PartInitException exception) {

+					AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+				}

+			}

+		};

+

+	/**

+	 * This action refreshes the viewer of the current editor if the editor

+	 * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IAction refreshViewerAction =

+		new Action(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item")) {

+			@Override

+			public boolean isEnabled() {

+				return activeEditorPart instanceof IViewerProvider;

+			}

+

+			@Override

+			public void run() {

+				if (activeEditorPart instanceof IViewerProvider) {

+					Viewer viewer = ((IViewerProvider)activeEditorPart).getViewer();

+					if (viewer != null) {

+						viewer.refresh();

+					}

+				}

+			}

+		};

+

+	/**

+	 * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor

+	 * generated for the current selection by the item provider.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<IAction> createChildActions;

+

+	/**

+	 * This is the menu manager into which menu contribution items should be added for CreateChild actions.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IMenuManager createChildMenuManager;

+

+	/**

+	 * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor

+	 * generated for the current selection by the item provider.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<IAction> createSiblingActions;

+

+	/**

+	 * This is the menu manager into which menu contribution items should be added for CreateSibling actions.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IMenuManager createSiblingMenuManager;

+

+	/**

+	 * This creates an instance of the contributor.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentActionBarContributor() {

+		super(ADDITIONS_LAST_STYLE);

+		loadResourceAction = new LoadResourceAction();

+		validateAction = new ValidateAction();

+		controlAction = new ControlAction();

+	}

+

+	/**

+	 * This adds Separators for editor additions to the tool bar.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void contributeToToolBar(IToolBarManager toolBarManager) {

+		toolBarManager.add(new Separator("automaticexperiment-settings"));

+		toolBarManager.add(new Separator("automaticexperiment-additions"));

+	}

+

+	/**

+	 * This adds to the menu bar a menu and some separators for editor additions,

+	 * as well as the sub-menus for object creation items.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void contributeToMenu(IMenuManager menuManager) {

+		super.contributeToMenu(menuManager);

+

+		IMenuManager submenuManager = new MenuManager(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentEditor_menu"), "org.eclipse.stem.analysis.automaticexperimentMenuID");

+		menuManager.insertAfter("additions", submenuManager);

+		submenuManager.add(new Separator("settings"));

+		submenuManager.add(new Separator("actions"));

+		submenuManager.add(new Separator("additions"));

+		submenuManager.add(new Separator("additions-end"));

+

+		// Prepare for CreateChild item addition or removal.

+		//

+		createChildMenuManager = new MenuManager(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));

+		submenuManager.insertBefore("additions", createChildMenuManager);

+

+		// Prepare for CreateSibling item addition or removal.

+		//

+		createSiblingMenuManager = new MenuManager(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));

+		submenuManager.insertBefore("additions", createSiblingMenuManager);

+

+		// Force an update because Eclipse hides empty menus now.

+		//

+		submenuManager.addMenuListener

+			(new IMenuListener() {

+				 public void menuAboutToShow(IMenuManager menuManager) {

+					 menuManager.updateAll(true);

+				 }

+			 });

+

+		addGlobalActions(submenuManager);

+	}

+

+	/**

+	 * When the active editor changes, this remembers the change and registers with it as a selection provider.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void setActiveEditor(IEditorPart part) {

+		super.setActiveEditor(part);

+		activeEditorPart = part;

+

+		// Switch to the new selection provider.

+		//

+		if (selectionProvider != null) {

+			selectionProvider.removeSelectionChangedListener(this);

+		}

+		if (part == null) {

+			selectionProvider = null;

+		}

+		else {

+			selectionProvider = part.getSite().getSelectionProvider();

+			selectionProvider.addSelectionChangedListener(this);

+

+			// Fake a selection changed event to update the menus.

+			//

+			if (selectionProvider.getSelection() != null) {

+				selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection()));

+			}

+		}

+	}

+

+	/**

+	 * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},

+	 * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings

+	 * that can be added to the selected object and updating the menus accordingly.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void selectionChanged(SelectionChangedEvent event) {

+		// Remove any menu items for old selection.

+		//

+		if (createChildMenuManager != null) {

+			depopulateManager(createChildMenuManager, createChildActions);

+		}

+		if (createSiblingMenuManager != null) {

+			depopulateManager(createSiblingMenuManager, createSiblingActions);

+		}

+

+		// Query the new selection for appropriate new child/sibling descriptors

+		//

+		Collection<?> newChildDescriptors = null;

+		Collection<?> newSiblingDescriptors = null;

+

+		ISelection selection = event.getSelection();

+		if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1) {

+			Object object = ((IStructuredSelection)selection).getFirstElement();

+

+			EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();

+

+			newChildDescriptors = domain.getNewChildDescriptors(object, null);

+			newSiblingDescriptors = domain.getNewChildDescriptors(null, object);

+		}

+

+		// Generate actions for selection; populate and redraw the menus.

+		//

+		createChildActions = generateCreateChildActions(newChildDescriptors, selection);

+		createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);

+

+		if (createChildMenuManager != null) {

+			populateManager(createChildMenuManager, createChildActions, null);

+			createChildMenuManager.update(true);

+		}

+		if (createSiblingMenuManager != null) {

+			populateManager(createSiblingMenuManager, createSiblingActions, null);

+			createSiblingMenuManager.update(true);

+		}

+	}

+

+	/**

+	 * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>,

+	 * and returns the collection of these actions.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection) {

+		Collection<IAction> actions = new ArrayList<IAction>();

+		if (descriptors != null) {

+			for (Object descriptor : descriptors) {

+				actions.add(new CreateChildAction(activeEditorPart, selection, descriptor));

+			}

+		}

+		return actions;

+	}

+

+	/**

+	 * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>,

+	 * and returns the collection of these actions.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) {

+		Collection<IAction> actions = new ArrayList<IAction>();

+		if (descriptors != null) {

+			for (Object descriptor : descriptors) {

+				actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor));

+			}

+		}

+		return actions;

+	}

+

+	/**

+	 * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s

+	 * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,

+	 * by inserting them before the specified contribution item <code>contributionID</code>.

+	 * If <code>contributionID</code> is <code>null</code>, they are simply added.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID) {

+		if (actions != null) {

+			for (IAction action : actions) {

+				if (contributionID != null) {

+					manager.insertBefore(contributionID, action);

+				}

+				else {

+					manager.add(action);

+				}

+			}

+		}

+	}

+		

+	/**

+	 * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s

+	 * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions) {

+		if (actions != null) {

+			IContributionItem[] items = manager.getItems();

+			for (int i = 0; i < items.length; i++) {

+				// Look into SubContributionItems

+				//

+				IContributionItem contributionItem = items[i];

+				while (contributionItem instanceof SubContributionItem) {

+					contributionItem = ((SubContributionItem)contributionItem).getInnerItem();

+				}

+

+				// Delete the ActionContributionItems with matching action.

+				//

+				if (contributionItem instanceof ActionContributionItem) {

+					IAction action = ((ActionContributionItem)contributionItem).getAction();

+					if (actions.contains(action)) {

+						manager.remove(contributionItem);

+					}

+				}

+			}

+		}

+	}

+

+	/**

+	 * This populates the pop-up menu before it appears.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void menuAboutToShow(IMenuManager menuManager) {

+		super.menuAboutToShow(menuManager);

+		MenuManager submenuManager = null;

+

+		submenuManager = new MenuManager(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));

+		populateManager(submenuManager, createChildActions, null);

+		menuManager.insertBefore("edit", submenuManager);

+

+		submenuManager = new MenuManager(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));

+		populateManager(submenuManager, createSiblingActions, null);

+		menuManager.insertBefore("edit", submenuManager);

+	}

+

+	/**

+	 * This inserts global actions before the "additions-end" separator.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected void addGlobalActions(IMenuManager menuManager) {

+		menuManager.insertAfter("additions-end", new Separator("ui-actions"));

+		menuManager.insertAfter("ui-actions", showPropertiesViewAction);

+

+		refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());		

+		menuManager.insertAfter("ui-actions", refreshViewerAction);

+

+		super.addGlobalActions(menuManager);

+	}

+

+	/**

+	 * This ensures that a delete action will clean up all references to deleted objects.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected boolean removeAllReferencesOnDelete() {

+		return true;

+	}

+

+}
\ No newline at end of file
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentEditor.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentEditor.java
new file mode 100644
index 0000000..edc95a5
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentEditor.java
@@ -0,0 +1,1529 @@
+package org.eclipse.stem.analysis.automaticexperiment.presentation;

+

+/*******************************************************************************

+ * 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 java.io.IOException;

+import java.io.InputStream;

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Collections;

+import java.util.EventObject;

+import java.util.HashMap;

+import java.util.Iterator;

+import java.util.LinkedHashMap;

+import java.util.List;

+import java.util.Map;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.IResourceChangeEvent;

+import org.eclipse.core.resources.IResourceChangeListener;

+import org.eclipse.core.resources.IResourceDelta;

+import org.eclipse.core.resources.IResourceDeltaVisitor;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.NullProgressMonitor;

+import org.eclipse.emf.common.command.BasicCommandStack;

+import org.eclipse.emf.common.command.Command;

+import org.eclipse.emf.common.command.CommandStack;

+import org.eclipse.emf.common.command.CommandStackListener;

+import org.eclipse.emf.common.notify.AdapterFactory;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.common.ui.MarkerHelper;

+import org.eclipse.emf.common.ui.editor.ProblemEditorPart;

+import org.eclipse.emf.common.ui.viewer.IViewerProvider;

+import org.eclipse.emf.common.util.BasicDiagnostic;

+import org.eclipse.emf.common.util.Diagnostic;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EValidator;

+import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.ecore.util.EContentAdapter;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;

+import org.eclipse.emf.edit.domain.EditingDomain;

+import org.eclipse.emf.edit.domain.IEditingDomainProvider;

+import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;

+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;

+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;

+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;

+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;

+import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;

+import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;

+import org.eclipse.emf.edit.ui.dnd.LocalTransfer;

+import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;

+import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;

+import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;

+import org.eclipse.emf.edit.ui.util.EditUIUtil;

+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;

+import org.eclipse.jface.action.IMenuListener;

+import org.eclipse.jface.action.IMenuManager;

+import org.eclipse.jface.action.IStatusLineManager;

+import org.eclipse.jface.action.IToolBarManager;

+import org.eclipse.jface.action.MenuManager;

+import org.eclipse.jface.action.Separator;

+import org.eclipse.jface.dialogs.MessageDialog;

+import org.eclipse.jface.dialogs.ProgressMonitorDialog;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.ISelectionChangedListener;

+import org.eclipse.jface.viewers.ISelectionProvider;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.viewers.SelectionChangedEvent;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.viewers.StructuredViewer;

+import org.eclipse.jface.viewers.TreeViewer;

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.stem.analysis.automaticexperiment.provider.AutomaticexperienceEditPlugin;

+import org.eclipse.stem.analysis.automaticexperiment.provider.AutomaticexperimentItemProviderAdapterFactory;

+import org.eclipse.stem.analysis.provider.AnalysisItemProviderAdapterFactory;

+import org.eclipse.stem.core.common.provider.CommonItemProviderAdapterFactory;

+import org.eclipse.stem.core.graph.provider.GraphItemProviderAdapterFactory;

+import org.eclipse.stem.core.model.provider.ModelItemProviderAdapterFactory;

+import org.eclipse.stem.core.modifier.provider.ModifierItemProviderAdapterFactory;

+import org.eclipse.stem.core.scenario.provider.ScenarioItemProviderAdapterFactory;

+import org.eclipse.stem.core.sequencer.provider.SequencerItemProviderAdapterFactory;

+import org.eclipse.stem.core.solver.provider.SolverItemProviderAdapterFactory;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.custom.CTabFolder;

+import org.eclipse.swt.dnd.DND;

+import org.eclipse.swt.dnd.Transfer;

+import org.eclipse.swt.events.ControlAdapter;

+import org.eclipse.swt.events.ControlEvent;

+import org.eclipse.swt.graphics.Point;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Menu;

+import org.eclipse.swt.widgets.Tree;

+import org.eclipse.ui.IActionBars;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.IEditorSite;

+import org.eclipse.ui.IPartListener;

+import org.eclipse.ui.IWorkbenchPart;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.actions.WorkspaceModifyOperation;

+import org.eclipse.ui.dialogs.SaveAsDialog;

+import org.eclipse.ui.ide.IGotoMarker;

+import org.eclipse.ui.part.FileEditorInput;

+import org.eclipse.ui.part.MultiPageEditorPart;

+import org.eclipse.ui.views.contentoutline.ContentOutline;

+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

+import org.eclipse.ui.views.properties.IPropertySheetPage;

+import org.eclipse.ui.views.properties.PropertySheet;

+import org.eclipse.ui.views.properties.PropertySheetPage;

+

+

+

+/**

+ * This is an example of a Automaticexperiment model editor.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class AutomaticexperimentEditor

+	extends MultiPageEditorPart

+	implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker {

+	/**

+	 * This keeps track of the editing domain that is used to track all changes to the model.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AdapterFactoryEditingDomain editingDomain;

+

+	/**

+	 * This is the one adapter factory used for providing views of the model.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ComposedAdapterFactory adapterFactory;

+

+	/**

+	 * This is the content outline page.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IContentOutlinePage contentOutlinePage;

+

+	/**

+	 * This is a kludge...

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IStatusLineManager contentOutlineStatusLineManager;

+

+	/**

+	 * This is the content outline page's viewer.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected TreeViewer contentOutlineViewer;

+

+	/**

+	 * This is the property sheet page.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected PropertySheetPage propertySheetPage;

+

+	/**

+	 * This is the viewer that shadows the selection in the content outline.

+	 * The parent relation must be correctly defined for this to work.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected TreeViewer selectionViewer;

+

+	/**

+	 * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content outline viewer.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Viewer currentViewer;

+

+	/**

+	 * This listens to which ever viewer is active.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ISelectionChangedListener selectionChangedListener;

+

+	/**

+	 * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to this editor.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();

+

+	/**

+	 * This keeps track of the selection of the editor as a whole.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ISelection editorSelection = StructuredSelection.EMPTY;

+

+	/**

+	 * The MarkerHelper is responsible for creating workspace resource markers presented

+	 * in Eclipse's Problems View.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected MarkerHelper markerHelper = new EditUIMarkerHelper();

+

+	/**

+	 * This listens for when the outline becomes active

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IPartListener partListener =

+		new IPartListener() {

+			public void partActivated(IWorkbenchPart p) {

+				if (p instanceof ContentOutline) {

+					if (((ContentOutline)p).getCurrentPage() == contentOutlinePage) {

+						getActionBarContributor().setActiveEditor(AutomaticexperimentEditor.this);

+

+						setCurrentViewer(contentOutlineViewer);

+					}

+				}

+				else if (p instanceof PropertySheet) {

+					if (((PropertySheet)p).getCurrentPage() == propertySheetPage) {

+						getActionBarContributor().setActiveEditor(AutomaticexperimentEditor.this);

+						handleActivate();

+					}

+				}

+				else if (p == AutomaticexperimentEditor.this) {

+					handleActivate();

+				}

+			}

+			public void partBroughtToTop(IWorkbenchPart p) {

+				// Ignore.

+			}

+			public void partClosed(IWorkbenchPart p) {

+				// Ignore.

+			}

+			public void partDeactivated(IWorkbenchPart p) {

+				// Ignore.

+			}

+			public void partOpened(IWorkbenchPart p) {

+				// Ignore.

+			}

+		};

+

+	/**

+	 * Resources that have been removed since last activation.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<Resource> removedResources = new ArrayList<Resource>();

+

+	/**

+	 * Resources that have been changed since last activation.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<Resource> changedResources = new ArrayList<Resource>();

+

+	/**

+	 * Resources that have been saved.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<Resource> savedResources = new ArrayList<Resource>();

+

+	/**

+	 * Map to store the diagnostic associated with a resource.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>();

+

+	/**

+	 * Controls whether the problem indication should be updated.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected boolean updateProblemIndication = true;

+

+	/**

+	 * Adapter used to update the problem indication when resources are demanded loaded.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected EContentAdapter problemIndicationAdapter = 

+		new EContentAdapter() {

+			@Override

+			public void notifyChanged(Notification notification) {

+				if (notification.getNotifier() instanceof Resource) {

+					switch (notification.getFeatureID(Resource.class)) {

+						case Resource.RESOURCE__IS_LOADED:

+						case Resource.RESOURCE__ERRORS:

+						case Resource.RESOURCE__WARNINGS: {

+							Resource resource = (Resource)notification.getNotifier();

+							Diagnostic diagnostic = analyzeResourceProblems(resource, null);

+							if (diagnostic.getSeverity() != Diagnostic.OK) {

+								resourceToDiagnosticMap.put(resource, diagnostic);

+							}

+							else {

+								resourceToDiagnosticMap.remove(resource);

+							}

+

+							if (updateProblemIndication) {

+								getSite().getShell().getDisplay().asyncExec

+									(new Runnable() {

+										 public void run() {

+											 updateProblemIndication();

+										 }

+									 });

+							}

+							break;

+						}

+					}

+				}

+				else {

+					super.notifyChanged(notification);

+				}

+			}

+

+			@Override

+			protected void setTarget(Resource target) {

+				basicSetTarget(target);

+			}

+

+			@Override

+			protected void unsetTarget(Resource target) {

+				basicUnsetTarget(target);

+			}

+		};

+

+	/**

+	 * This listens for workspace changes.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IResourceChangeListener resourceChangeListener =

+		new IResourceChangeListener() {

+			public void resourceChanged(IResourceChangeEvent event) {

+				IResourceDelta delta = event.getDelta();

+				try {

+					class ResourceDeltaVisitor implements IResourceDeltaVisitor {

+						protected ResourceSet resourceSet = editingDomain.getResourceSet();

+						protected Collection<Resource> changedResources = new ArrayList<Resource>();

+						protected Collection<Resource> removedResources = new ArrayList<Resource>();

+

+						public boolean visit(IResourceDelta delta) {

+							if (delta.getResource().getType() == IResource.FILE) {

+								if (delta.getKind() == IResourceDelta.REMOVED ||

+								    delta.getKind() == IResourceDelta.CHANGED && delta.getFlags() != IResourceDelta.MARKERS) {

+									Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);

+									if (resource != null) {

+										if (delta.getKind() == IResourceDelta.REMOVED) {

+											removedResources.add(resource);

+										}

+										else if (!savedResources.remove(resource)) {

+											changedResources.add(resource);

+										}

+									}

+								}

+							}

+

+							return true;

+						}

+

+						public Collection<Resource> getChangedResources() {

+							return changedResources;

+						}

+

+						public Collection<Resource> getRemovedResources() {

+							return removedResources;

+						}

+					}

+

+					final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();

+					delta.accept(visitor);

+

+					if (!visitor.getRemovedResources().isEmpty()) {

+						getSite().getShell().getDisplay().asyncExec

+							(new Runnable() {

+								 public void run() {

+									 removedResources.addAll(visitor.getRemovedResources());

+									 if (!isDirty()) {

+										 getSite().getPage().closeEditor(AutomaticexperimentEditor.this, false);

+									 }

+								 }

+							 });

+					}

+

+					if (!visitor.getChangedResources().isEmpty()) {

+						getSite().getShell().getDisplay().asyncExec

+							(new Runnable() {

+								 public void run() {

+									 changedResources.addAll(visitor.getChangedResources());

+									 if (getSite().getPage().getActiveEditor() == AutomaticexperimentEditor.this) {

+										 handleActivate();

+									 }

+								 }

+							 });

+					}

+				}

+				catch (CoreException exception) {

+					AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+				}

+			}

+		};

+

+	/**

+	 * Handles activation of the editor or it's associated views.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void handleActivate() {

+		// Recompute the read only state.

+		//

+		if (editingDomain.getResourceToReadOnlyMap() != null) {

+		  editingDomain.getResourceToReadOnlyMap().clear();

+

+		  // Refresh any actions that may become enabled or disabled.

+		  //

+		  setSelection(getSelection());

+		}

+

+		if (!removedResources.isEmpty()) {

+			if (handleDirtyConflict()) {

+				getSite().getPage().closeEditor(AutomaticexperimentEditor.this, false);

+			}

+			else {

+				removedResources.clear();

+				changedResources.clear();

+				savedResources.clear();

+			}

+		}

+		else if (!changedResources.isEmpty()) {

+			changedResources.removeAll(savedResources);

+			handleChangedResources();

+			changedResources.clear();

+			savedResources.clear();

+		}

+	}

+

+	/**

+	 * Handles what to do with changed resources on activation.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void handleChangedResources() {

+		if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict())) {

+			if (isDirty()) {

+				changedResources.addAll(editingDomain.getResourceSet().getResources());

+			}

+			editingDomain.getCommandStack().flush();

+

+			updateProblemIndication = false;

+			for (Resource resource : changedResources) {

+				if (resource.isLoaded()) {

+					resource.unload();

+					try {

+						resource.load(Collections.EMPTY_MAP);

+					}

+					catch (IOException exception) {

+						if (!resourceToDiagnosticMap.containsKey(resource)) {

+							resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));

+						}

+					}

+				}

+			}

+

+			if (AdapterFactoryEditingDomain.isStale(editorSelection)) {

+				setSelection(StructuredSelection.EMPTY);

+			}

+

+			updateProblemIndication = true;

+			updateProblemIndication();

+		}

+	}

+  

+	/**

+	 * Updates the problems indication with the information described in the specified diagnostic.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void updateProblemIndication() {

+		if (updateProblemIndication) {

+			BasicDiagnostic diagnostic =

+				new BasicDiagnostic

+					(Diagnostic.OK,

+					 "org.eclipse.stem.analysis.automaticexperiment",

+					 0,

+					 null,

+					 new Object [] { editingDomain.getResourceSet() });

+			for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values()) {

+				if (childDiagnostic.getSeverity() != Diagnostic.OK) {

+					diagnostic.add(childDiagnostic);

+				}

+			}

+

+			int lastEditorPage = getPageCount() - 1;

+			if (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart) {

+				((ProblemEditorPart)getEditor(lastEditorPage)).setDiagnostic(diagnostic);

+				if (diagnostic.getSeverity() != Diagnostic.OK) {

+					setActivePage(lastEditorPage);

+				}

+			}

+			else if (diagnostic.getSeverity() != Diagnostic.OK) {

+				ProblemEditorPart problemEditorPart = new ProblemEditorPart();

+				problemEditorPart.setDiagnostic(diagnostic);

+				problemEditorPart.setMarkerHelper(markerHelper);

+				try {

+					addPage(++lastEditorPage, problemEditorPart, getEditorInput());

+					setPageText(lastEditorPage, problemEditorPart.getPartName());

+					setActivePage(lastEditorPage);

+					showTabs();

+				}

+				catch (PartInitException exception) {

+					AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+				}

+			}

+

+			if (markerHelper.hasMarkers(editingDomain.getResourceSet())) {

+				markerHelper.deleteMarkers(editingDomain.getResourceSet());

+				if (diagnostic.getSeverity() != Diagnostic.OK) {

+					try {

+						markerHelper.createMarkers(diagnostic);

+					}

+					catch (CoreException exception) {

+						AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+					}

+				}

+			}

+		}

+	}

+

+	/**

+	 * Shows a dialog that asks if conflicting changes should be discarded.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected boolean handleDirtyConflict() {

+		return

+			MessageDialog.openQuestion

+				(getSite().getShell(),

+				 getString("_UI_FileConflict_label"),

+				 getString("_WARN_FileConflict"));

+	}

+

+	/**

+	 * This creates a model editor.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentEditor() {

+		super();

+		initializeEditingDomain();

+	}

+

+	/**

+	 * This sets up the editing domain for the model editor.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void initializeEditingDomain() {

+		// Create an adapter factory that yields item providers.

+		//

+		adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);

+

+		adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new AutomaticexperimentItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new AnalysisItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new CommonItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new GraphItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new ModelItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new ModifierItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new ScenarioItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new SequencerItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new SolverItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new EcoreItemProviderAdapterFactory());

+		adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());

+

+		// Create the command stack that will notify this editor as commands are executed.

+		//

+		BasicCommandStack commandStack = new BasicCommandStack();

+

+		// Add a listener to set the most recent command's affected objects to be the selection of the viewer with focus.

+		//

+		commandStack.addCommandStackListener

+			(new CommandStackListener() {

+				 public void commandStackChanged(final EventObject event) {

+					 getContainer().getDisplay().asyncExec

+						 (new Runnable() {

+							  public void run() {

+								  firePropertyChange(IEditorPart.PROP_DIRTY);

+

+								  // Try to select the affected objects.

+								  //

+								  Command mostRecentCommand = ((CommandStack)event.getSource()).getMostRecentCommand();

+								  if (mostRecentCommand != null) {

+									  setSelectionToViewer(mostRecentCommand.getAffectedObjects());

+								  }

+								  if (propertySheetPage != null && !propertySheetPage.getControl().isDisposed()) {

+									  propertySheetPage.refresh();

+								  }

+							  }

+						  });

+				 }

+			 });

+

+		// Create the editing domain with a special command stack.

+		//

+		editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>());

+	}

+

+	/**

+	 * This is here for the listener to be able to call it.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+			@Override

+	protected void firePropertyChange(int action) {

+		super.firePropertyChange(action);

+	}

+

+	/**

+	 * This sets the selection into whichever viewer is active.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setSelectionToViewer(Collection<?> collection) {

+		final Collection<?> theSelection = collection;

+		// Make sure it's okay.

+		//

+		if (theSelection != null && !theSelection.isEmpty()) {

+			Runnable runnable =

+				new Runnable() {

+					public void run() {

+						// Try to select the items in the current content viewer of the editor.

+						//

+						if (currentViewer != null) {

+							currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true);

+						}

+					}

+				};

+			getSite().getShell().getDisplay().asyncExec(runnable);

+		}

+	}

+

+	/**

+	 * This returns the editing domain as required by the {@link IEditingDomainProvider} interface.

+	 * This is important for implementing the static methods of {@link AdapterFactoryEditingDomain}

+	 * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EditingDomain getEditingDomain() {

+		return editingDomain;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider {

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory) {

+			super(adapterFactory);

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		@Override

+		public Object [] getElements(Object object) {

+			Object parent = super.getParent(object);

+			return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		@Override

+		public Object [] getChildren(Object object) {

+			Object parent = super.getParent(object);

+			return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		@Override

+		public boolean hasChildren(Object object) {

+			Object parent = super.getParent(object);

+			return parent != null;

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		@Override

+		public Object getParent(Object object) {

+			return null;

+		}

+	}

+

+	/**

+	 * This makes sure that one content viewer, either for the current page or the outline view, if it has focus,

+	 * is the current one.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setCurrentViewer(Viewer viewer) {

+		// If it is changing...

+		//

+		if (currentViewer != viewer) {

+			if (selectionChangedListener == null) {

+				// Create the listener on demand.

+				//

+				selectionChangedListener =

+					new ISelectionChangedListener() {

+						// This just notifies those things that are affected by the section.

+						//

+						public void selectionChanged(SelectionChangedEvent selectionChangedEvent) {

+							setSelection(selectionChangedEvent.getSelection());

+						}

+					};

+			}

+

+			// Stop listening to the old one.

+			//

+			if (currentViewer != null) {

+				currentViewer.removeSelectionChangedListener(selectionChangedListener);

+			}

+

+			// Start listening to the new one.

+			//

+			if (viewer != null) {

+				viewer.addSelectionChangedListener(selectionChangedListener);

+			}

+

+			// Remember it.

+			//

+			currentViewer = viewer;

+

+			// Set the editors selection based on the current viewer's selection.

+			//

+			setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection());

+		}

+	}

+

+	/**

+	 * This returns the viewer as required by the {@link IViewerProvider} interface.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public Viewer getViewer() {

+		return currentViewer;

+	}

+

+	/**

+	 * This creates a context menu for the viewer and adds a listener as well registering the menu for extension.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void createContextMenuFor(StructuredViewer viewer) {

+		MenuManager contextMenu = new MenuManager("#PopUp");

+		contextMenu.add(new Separator("additions"));

+		contextMenu.setRemoveAllWhenShown(true);

+		contextMenu.addMenuListener(this);

+		Menu menu= contextMenu.createContextMenu(viewer.getControl());

+		viewer.getControl().setMenu(menu);

+		getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));

+

+		int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;

+		Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };

+		viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));

+		viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer));

+	}

+

+	/**

+	 * This is the method called to load a resource into the editing domain's resource set based on the editor's input.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void createModel() {

+		URI resourceURI = EditUIUtil.getURI(getEditorInput());

+		Exception exception = null;

+		Resource resource = null;

+		try {

+			// Load the resource through the editing domain.

+			//

+			resource = editingDomain.getResourceSet().getResource(resourceURI, true);

+		}

+		catch (Exception e) {

+			exception = e;

+			resource = editingDomain.getResourceSet().getResource(resourceURI, false);

+		}

+

+		Diagnostic diagnostic = analyzeResourceProblems(resource, exception);

+		if (diagnostic.getSeverity() != Diagnostic.OK) {

+			resourceToDiagnosticMap.put(resource,  analyzeResourceProblems(resource, exception));

+		}

+		editingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter);

+	}

+

+	/**

+	 * Returns a diagnostic describing the errors and warnings listed in the resource

+	 * and the specified exception (if any).

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public Diagnostic analyzeResourceProblems(Resource resource, Exception exception) {

+		if (!resource.getErrors().isEmpty() || !resource.getWarnings().isEmpty()) {

+			BasicDiagnostic basicDiagnostic =

+				new BasicDiagnostic

+					(Diagnostic.ERROR,

+					 "org.eclipse.stem.analysis.automaticexperiment",

+					 0,

+					 getString("_UI_CreateModelError_message", resource.getURI()),

+					 new Object [] { exception == null ? (Object)resource : exception });

+			basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));

+			return basicDiagnostic;

+		}

+		else if (exception != null) {

+			return

+				new BasicDiagnostic

+					(Diagnostic.ERROR,

+					 "org.eclipse.stem.analysis.automaticexperiment",

+					 0,

+					 getString("_UI_CreateModelError_message", resource.getURI()),

+					 new Object[] { exception });

+		}

+		else {

+			return Diagnostic.OK_INSTANCE;

+		}

+	}

+

+	/**

+	 * This is the method used by the framework to install your own controls.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated NOT

+	 */

+	@Override

+	public void createPages() {

+		// Creates the model from the editor input

+		//

+		createModel();

+

+		// Only creates the other pages if there is something that can be edited

+		//

+		if (!getEditingDomain().getResourceSet().getResources().isEmpty()) {

+			// Create a page for the selection tree view.

+			//

+			Tree tree = new Tree(getContainer(), SWT.MULTI);

+			selectionViewer = new TreeViewer(tree);

+			setCurrentViewer(selectionViewer);

+

+			selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));

+			selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));

+//			selectionViewer.setInput(editingDomain.getResourceSet());

+			selectionViewer.setInput(editingDomain.getResourceSet().getResources().get(0));

+			selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);

+

+			new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);

+

+			createContextMenuFor(selectionViewer);

+			int pageIndex = addPage(tree);

+			setPageText(pageIndex, getString("_UI_SelectionPage_label"));

+

+			getSite().getShell().getDisplay().asyncExec

+				(new Runnable() {

+					 public void run() {

+						 setActivePage(0);

+					 }

+				 });

+		}

+

+		// Ensures that this editor will only display the page's tab

+		// area if there are more than one page

+		//

+		getContainer().addControlListener

+			(new ControlAdapter() {

+				boolean guard = false;

+				@Override

+				public void controlResized(ControlEvent event) {

+					if (!guard) {

+						guard = true;

+						hideTabs();

+						guard = false;

+					}

+				}

+			 });

+

+		getSite().getShell().getDisplay().asyncExec

+			(new Runnable() {

+				 public void run() {

+					 updateProblemIndication();

+				 }

+			 });

+	}

+

+	/**

+	 * If there is just one page in the multi-page editor part,

+	 * this hides the single tab at the bottom.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void hideTabs() {

+		if (getPageCount() <= 1) {

+			setPageText(0, "");

+			if (getContainer() instanceof CTabFolder) {

+				((CTabFolder)getContainer()).setTabHeight(1);

+				Point point = getContainer().getSize();

+				getContainer().setSize(point.x, point.y + 6);

+			}

+		}

+	}

+

+	/**

+	 * If there is more than one page in the multi-page editor part,

+	 * this shows the tabs at the bottom.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void showTabs() {

+		if (getPageCount() > 1) {

+			setPageText(0, getString("_UI_SelectionPage_label"));

+			if (getContainer() instanceof CTabFolder) {

+				((CTabFolder)getContainer()).setTabHeight(SWT.DEFAULT);

+				Point point = getContainer().getSize();

+				getContainer().setSize(point.x, point.y - 6);

+			}

+		}

+	}

+

+	/**

+	 * This is used to track the active viewer.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected void pageChange(int pageIndex) {

+		super.pageChange(pageIndex);

+

+		if (contentOutlinePage != null) {

+			handleContentOutlineSelection(contentOutlinePage.getSelection());

+		}

+	}

+

+	/**

+	 * This is how the framework determines which interfaces we implement.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@SuppressWarnings("unchecked")

+	@Override

+	public Object getAdapter(Class key) {

+		if (key.equals(IContentOutlinePage.class)) {

+			return showOutlineView() ? getContentOutlinePage() : null;

+		}

+		else if (key.equals(IPropertySheetPage.class)) {

+			return getPropertySheetPage();

+		}

+		else if (key.equals(IGotoMarker.class)) {

+			return this;

+		}

+		else {

+			return super.getAdapter(key);

+		}

+	}

+

+	/**

+	 * This accesses a cached version of the content outliner.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public IContentOutlinePage getContentOutlinePage() {

+		if (contentOutlinePage == null) {

+			// The content outline is just a tree.

+			//

+			class MyContentOutlinePage extends ContentOutlinePage {

+				@Override

+				public void createControl(Composite parent) {

+					super.createControl(parent);

+					contentOutlineViewer = getTreeViewer();

+					contentOutlineViewer.addSelectionChangedListener(this);

+

+					// Set up the tree viewer.

+					//

+					contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));

+					contentOutlineViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));

+					contentOutlineViewer.setInput(editingDomain.getResourceSet());

+

+					// Make sure our popups work.

+					//

+					createContextMenuFor(contentOutlineViewer);

+

+					if (!editingDomain.getResourceSet().getResources().isEmpty()) {

+					  // Select the root object in the view.

+					  //

+					  contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);

+					}

+				}

+

+				@Override

+				public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {

+					super.makeContributions(menuManager, toolBarManager, statusLineManager);

+					contentOutlineStatusLineManager = statusLineManager;

+				}

+

+				@Override

+				public void setActionBars(IActionBars actionBars) {

+					super.setActionBars(actionBars);

+					getActionBarContributor().shareGlobalActions(this, actionBars);

+				}

+			}

+

+			contentOutlinePage = new MyContentOutlinePage();

+

+			// Listen to selection so that we can handle it is a special way.

+			//

+			contentOutlinePage.addSelectionChangedListener

+				(new ISelectionChangedListener() {

+					 // This ensures that we handle selections correctly.

+					 //

+					 public void selectionChanged(SelectionChangedEvent event) {

+						 handleContentOutlineSelection(event.getSelection());

+					 }

+				 });

+		}

+

+		return contentOutlinePage;

+	}

+

+	/**

+	 * This accesses a cached version of the property sheet.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public IPropertySheetPage getPropertySheetPage() {

+		if (propertySheetPage == null) {

+			propertySheetPage =

+				new ExtendedPropertySheetPage(editingDomain) {

+					@Override

+					public void setSelectionToViewer(List<?> selection) {

+						AutomaticexperimentEditor.this.setSelectionToViewer(selection);

+						AutomaticexperimentEditor.this.setFocus();

+					}

+

+					@Override

+					public void setActionBars(IActionBars actionBars) {

+						super.setActionBars(actionBars);

+						getActionBarContributor().shareGlobalActions(this, actionBars);

+					}

+				};

+			propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));

+		}

+

+		return propertySheetPage;

+	}

+

+	/**

+	 * This deals with how we want selection in the outliner to affect the other views.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void handleContentOutlineSelection(ISelection selection) {

+		if (selectionViewer != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {

+			Iterator<?> selectedElements = ((IStructuredSelection)selection).iterator();

+			if (selectedElements.hasNext()) {

+				// Get the first selected element.

+				//

+				Object selectedElement = selectedElements.next();

+

+				ArrayList<Object> selectionList = new ArrayList<Object>();

+				selectionList.add(selectedElement);

+				while (selectedElements.hasNext()) {

+					selectionList.add(selectedElements.next());

+				}

+

+				// Set the selection to the widget.

+				//

+				selectionViewer.setSelection(new StructuredSelection(selectionList));

+			}

+		}

+	}

+

+	/**

+	 * This is for implementing {@link IEditorPart} and simply tests the command stack.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public boolean isDirty() {

+		return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();

+	}

+

+	/**

+	 * This is for implementing {@link IEditorPart} and simply saves the model file.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void doSave(IProgressMonitor progressMonitor) {

+		// Save only resources that have actually changed.

+		//

+		final Map<Object, Object> saveOptions = new HashMap<Object, Object>();

+		saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);

+

+		// Do the work within an operation because this is a long running activity that modifies the workbench.

+		//

+		WorkspaceModifyOperation operation =

+			new WorkspaceModifyOperation() {

+				// This is the method that gets invoked when the operation runs.

+				//

+				@Override

+				public void execute(IProgressMonitor monitor) {

+					// Save the resources to the file system.

+					//

+					boolean first = true;

+					for (Resource resource : editingDomain.getResourceSet().getResources()) {

+						if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource)) {

+							try {

+								long timeStamp = resource.getTimeStamp();

+								resource.save(saveOptions);

+								if (resource.getTimeStamp() != timeStamp) {

+									savedResources.add(resource);

+								}

+							}

+							catch (Exception exception) {

+								resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));

+							}

+							first = false;

+						}

+					}

+				}

+			};

+

+		updateProblemIndication = false;

+		try {

+			// This runs the options, and shows progress.

+			//

+			new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation);

+

+			// Refresh the necessary state.

+			//

+			((BasicCommandStack)editingDomain.getCommandStack()).saveIsDone();

+			firePropertyChange(IEditorPart.PROP_DIRTY);

+		}

+		catch (Exception exception) {

+			// Something went wrong that shouldn't.

+			//

+			AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+		}

+		updateProblemIndication = true;

+		updateProblemIndication();

+	}

+

+	/**

+	 * This returns whether something has been persisted to the URI of the specified resource.

+	 * The implementation uses the URI converter from the editor's resource set to try to open an input stream. 

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected boolean isPersisted(Resource resource) {

+		boolean result = false;

+		try {

+			InputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI());

+			if (stream != null) {

+				result = true;

+				stream.close();

+			}

+		}

+		catch (IOException e) {

+			// Ignore

+		}

+		return result;

+	}

+

+	/**

+	 * This always returns true because it is not currently supported.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public boolean isSaveAsAllowed() {

+		return true;

+	}

+

+	/**

+	 * This also changes the editor's input.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void doSaveAs() {

+		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());

+		saveAsDialog.open();

+		IPath path = saveAsDialog.getResult();

+		if (path != null) {

+			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);

+			if (file != null) {

+				doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file));

+			}

+		}

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void doSaveAs(URI uri, IEditorInput editorInput) {

+		(editingDomain.getResourceSet().getResources().get(0)).setURI(uri);

+		setInputWithNotify(editorInput);

+		setPartName(editorInput.getName());

+		IProgressMonitor progressMonitor =

+			getActionBars().getStatusLineManager() != null ?

+				getActionBars().getStatusLineManager().getProgressMonitor() :

+				new NullProgressMonitor();

+		doSave(progressMonitor);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void gotoMarker(IMarker marker) {

+		try {

+			if (marker.getType().equals(EValidator.MARKER)) {

+				String uriAttribute = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);

+				if (uriAttribute != null) {

+					URI uri = URI.createURI(uriAttribute);

+					EObject eObject = editingDomain.getResourceSet().getEObject(uri, true);

+					if (eObject != null) {

+					  setSelectionToViewer(Collections.singleton(editingDomain.getWrapper(eObject)));

+					}

+				}

+			}

+		}

+		catch (CoreException exception) {

+			AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+		}

+	}

+

+	/**

+	 * This is called during startup.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void init(IEditorSite site, IEditorInput editorInput) {

+		setSite(site);

+		setInputWithNotify(editorInput);

+		setPartName(editorInput.getName());

+		site.setSelectionProvider(this);

+		site.getPage().addPartListener(partListener);

+		ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void setFocus() {

+		getControl(getActivePage()).setFocus();

+	}

+

+	/**

+	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void addSelectionChangedListener(ISelectionChangedListener listener) {

+		selectionChangedListeners.add(listener);

+	}

+

+	/**

+	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void removeSelectionChangedListener(ISelectionChangedListener listener) {

+		selectionChangedListeners.remove(listener);

+	}

+

+	/**

+	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to return this editor's overall selection.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public ISelection getSelection() {

+		return editorSelection;

+	}

+

+	/**

+	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to set this editor's overall selection.

+	 * Calling this result will notify the listeners.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setSelection(ISelection selection) {

+		editorSelection = selection;

+

+		for (ISelectionChangedListener listener : selectionChangedListeners) {

+			listener.selectionChanged(new SelectionChangedEvent(this, selection));

+		}

+		setStatusLineManager(selection);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setStatusLineManager(ISelection selection) {

+		IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ?

+			contentOutlineStatusLineManager : getActionBars().getStatusLineManager();

+

+		if (statusLineManager != null) {

+			if (selection instanceof IStructuredSelection) {

+				Collection<?> collection = ((IStructuredSelection)selection).toList();

+				switch (collection.size()) {

+					case 0: {

+						statusLineManager.setMessage(getString("_UI_NoObjectSelected"));

+						break;

+					}

+					case 1: {

+						String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());

+						statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text));

+						break;

+					}

+					default: {

+						statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size())));

+						break;

+					}

+				}

+			}

+			else {

+				statusLineManager.setMessage("");

+			}

+		}

+	}

+

+	/**

+	 * This looks up a string in the plugin's plugin.properties file.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private static String getString(String key) {

+		return AutomaticexperienceEditPlugin.INSTANCE.getString(key);

+	}

+

+	/**

+	 * This looks up a string in plugin.properties, making a substitution.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private static String getString(String key, Object s1) {

+		return AutomaticexperienceEditPlugin.INSTANCE.getString(key, new Object [] { s1 });

+	}

+

+	/**

+	 * This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions from the Edit menu.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void menuAboutToShow(IMenuManager menuManager) {

+		((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public EditingDomainActionBarContributor getActionBarContributor() {

+		return (EditingDomainActionBarContributor)getEditorSite().getActionBarContributor();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public IActionBars getActionBars() {

+		return getActionBarContributor().getActionBars();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AdapterFactory getAdapterFactory() {

+		return adapterFactory;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void dispose() {

+		updateProblemIndication = false;

+

+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);

+

+		getSite().getPage().removePartListener(partListener);

+

+		adapterFactory.dispose();

+

+		if (getActionBarContributor().getActiveEditor() == this) {

+			getActionBarContributor().setActiveEditor(null);

+		}

+

+		if (propertySheetPage != null) {

+			propertySheetPage.dispose();

+		}

+

+		if (contentOutlinePage != null) {

+			contentOutlinePage.dispose();

+		}

+

+		super.dispose();

+	}

+

+	/**

+	 * Returns whether the outline view should be presented to the user.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected boolean showOutlineView() {

+		return false;

+	}

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentModelWizard.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentModelWizard.java
new file mode 100644
index 0000000..e581619
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/presentation/AutomaticexperimentModelWizard.java
@@ -0,0 +1,612 @@
+package org.eclipse.stem.analysis.automaticexperiment.presentation;

+

+/*******************************************************************************

+ * 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 java.util.ArrayList;

+import java.util.Arrays;

+import java.util.Collection;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

+import java.util.MissingResourceException;

+import java.util.StringTokenizer;

+

+import org.eclipse.core.resources.IContainer;

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IFolder;

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.emf.common.CommonPlugin;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EClass;

+import org.eclipse.emf.ecore.EClassifier;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

+import org.eclipse.emf.ecore.xmi.XMLResource;

+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;

+import org.eclipse.jface.dialogs.MessageDialog;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.wizard.Wizard;

+import org.eclipse.jface.wizard.WizardPage;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentFactory;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.provider.AutomaticexperienceEditPlugin;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.events.ModifyEvent;

+import org.eclipse.swt.events.ModifyListener;

+import org.eclipse.swt.layout.GridData;

+import org.eclipse.swt.layout.GridLayout;

+import org.eclipse.swt.widgets.Combo;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Label;

+import org.eclipse.ui.INewWizard;

+import org.eclipse.ui.IWorkbench;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.IWorkbenchPart;

+import org.eclipse.ui.IWorkbenchWindow;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.actions.WorkspaceModifyOperation;

+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;

+import org.eclipse.ui.part.FileEditorInput;

+import org.eclipse.ui.part.ISetSelectionTarget;

+

+

+

+/**

+ * This is a simple wizard for creating a new model file.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class AutomaticexperimentModelWizard extends Wizard implements INewWizard {

+	/**

+	 * The supported extensions for created files.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public static final List<String> FILE_EXTENSIONS =

+		Collections.unmodifiableList(Arrays.asList(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentEditorFilenameExtensions").split("\\s*,\\s*")));

+

+	/**

+	 * A formatted list of supported file extensions, suitable for display.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public static final String FORMATTED_FILE_EXTENSIONS =

+		AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentEditorFilenameExtensions").replaceAll("\\s*,\\s*", ", ");

+

+	/**

+	 * This caches an instance of the model package.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AutomaticexperimentPackage automaticexperimentPackage = AutomaticexperimentPackage.eINSTANCE;

+

+	/**

+	 * This caches an instance of the model factory.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AutomaticexperimentFactory automaticexperimentFactory = automaticexperimentPackage.getAutomaticexperimentFactory();

+

+	/**

+	 * This is the file creation page.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AutomaticexperimentModelWizardNewFileCreationPage newFileCreationPage;

+

+	/**

+	 * This is the initial object creation page.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AutomaticexperimentModelWizardInitialObjectCreationPage initialObjectCreationPage;

+

+	/**

+	 * Remember the selection during initialization for populating the default container.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IStructuredSelection selection;

+

+	/**

+	 * Remember the workbench during initialization.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IWorkbench workbench;

+

+	/**

+	 * Caches the names of the types that can be created as the root object.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected List<String> initialObjectNames;

+

+	/**

+	 * This just records the information.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void init(IWorkbench workbench, IStructuredSelection selection) {

+		this.workbench = workbench;

+		this.selection = selection;

+		setWindowTitle(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_Wizard_label"));

+		setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(AutomaticexperienceEditPlugin.INSTANCE.getImage("full/wizban/NewAutomaticexperiment")));

+	}

+

+	/**

+	 * Returns the names of the types that can be created as the root object.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<String> getInitialObjectNames() {

+		if (initialObjectNames == null) {

+			initialObjectNames = new ArrayList<String>();

+			for (EClassifier eClassifier : automaticexperimentPackage.getEClassifiers()) {

+				if (eClassifier instanceof EClass) {

+					EClass eClass = (EClass)eClassifier;

+					if (!eClass.isAbstract()) {

+						initialObjectNames.add(eClass.getName());

+					}

+				}

+			}

+			Collections.sort(initialObjectNames, CommonPlugin.INSTANCE.getComparator());

+		}

+		return initialObjectNames;

+	}

+

+	/**

+	 * Create a new model.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected EObject createInitialModel() {

+		EClass eClass = (EClass)automaticexperimentPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName());

+		EObject rootObject = automaticexperimentFactory.create(eClass);

+		return rootObject;

+	}

+

+	/**

+	 * Do the work after everything is specified.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public boolean performFinish() {

+		try {

+			// Remember the file.

+			//

+			final IFile modelFile = getModelFile();

+

+			// Do the work within an operation.

+			//

+			WorkspaceModifyOperation operation =

+				new WorkspaceModifyOperation() {

+					@Override

+					protected void execute(IProgressMonitor progressMonitor) {

+						try {

+							// Create a resource set

+							//

+							ResourceSet resourceSet = new ResourceSetImpl();

+

+							// Get the URI of the model file.

+							//

+							URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);

+

+							// Create a resource for this file.

+							//

+							Resource resource = resourceSet.createResource(fileURI);

+

+							// Add the initial model object to the contents.

+							//

+							EObject rootObject = createInitialModel();

+							if (rootObject != null) {

+								resource.getContents().add(rootObject);

+							}

+

+							// Save the contents of the resource to the file system.

+							//

+							Map<Object, Object> options = new HashMap<Object, Object>();

+							options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());

+							resource.save(options);

+						}

+						catch (Exception exception) {

+							AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+						}

+						finally {

+							progressMonitor.done();

+						}

+					}

+				};

+

+			getContainer().run(false, false, operation);

+

+			// Select the new file resource in the current view.

+			//

+			IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();

+			IWorkbenchPage page = workbenchWindow.getActivePage();

+			final IWorkbenchPart activePart = page.getActivePart();

+			if (activePart instanceof ISetSelectionTarget) {

+				final ISelection targetSelection = new StructuredSelection(modelFile);

+				getShell().getDisplay().asyncExec

+					(new Runnable() {

+						 public void run() {

+							 ((ISetSelectionTarget)activePart).selectReveal(targetSelection);

+						 }

+					 });

+			}

+

+			// Open an editor on the new file.

+			//

+			try {

+				page.openEditor

+					(new FileEditorInput(modelFile),

+					 workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString()).getId());

+			}

+			catch (PartInitException exception) {

+				MessageDialog.openError(workbenchWindow.getShell(), AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage());

+				return false;

+			}

+

+			return true;

+		}

+		catch (Exception exception) {

+			AutomaticexperienceEditPlugin.INSTANCE.log(exception);

+			return false;

+		}

+	}

+

+	/**

+	 * This is the one page of the wizard.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public class AutomaticexperimentModelWizardNewFileCreationPage extends WizardNewFileCreationPage {

+		/**

+		 * Pass in the selection.

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public AutomaticexperimentModelWizardNewFileCreationPage(String pageId, IStructuredSelection selection) {

+			super(pageId, selection);

+		}

+

+		/**

+		 * The framework calls this to see if the file is correct.

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		@Override

+		protected boolean validatePage() {

+			if (super.validatePage()) {

+				String extension = new Path(getFileName()).getFileExtension();

+				if (extension == null || !FILE_EXTENSIONS.contains(extension)) {

+					String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";

+					setErrorMessage(AutomaticexperienceEditPlugin.INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));

+					return false;

+				}

+				return true;

+			}

+			return false;

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public IFile getModelFile() {

+			return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));

+		}

+	}

+

+	/**

+	 * This is the page where the type of object to create is selected.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public class AutomaticexperimentModelWizardInitialObjectCreationPage extends WizardPage {

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		protected Combo initialObjectField;

+

+		/**

+		 * @generated

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 */

+		protected List<String> encodings;

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		protected Combo encodingField;

+

+		/**

+		 * Pass in the selection.

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public AutomaticexperimentModelWizardInitialObjectCreationPage(String pageId) {

+			super(pageId);

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public void createControl(Composite parent) {

+			Composite composite = new Composite(parent, SWT.NONE); {

+				GridLayout layout = new GridLayout();

+				layout.numColumns = 1;

+				layout.verticalSpacing = 12;

+				composite.setLayout(layout);

+

+				GridData data = new GridData();

+				data.verticalAlignment = GridData.FILL;

+				data.grabExcessVerticalSpace = true;

+				data.horizontalAlignment = GridData.FILL;

+				composite.setLayoutData(data);

+			}

+

+			Label containerLabel = new Label(composite, SWT.LEFT);

+			{

+				containerLabel.setText(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_ModelObject"));

+

+				GridData data = new GridData();

+				data.horizontalAlignment = GridData.FILL;

+				containerLabel.setLayoutData(data);

+			}

+

+			initialObjectField = new Combo(composite, SWT.BORDER);

+			{

+				GridData data = new GridData();

+				data.horizontalAlignment = GridData.FILL;

+				data.grabExcessHorizontalSpace = true;

+				initialObjectField.setLayoutData(data);

+			}

+

+			for (String objectName : getInitialObjectNames()) {

+				initialObjectField.add(getLabel(objectName));

+			}

+

+			if (initialObjectField.getItemCount() == 1) {

+				initialObjectField.select(0);

+			}

+			initialObjectField.addModifyListener(validator);

+

+			Label encodingLabel = new Label(composite, SWT.LEFT);

+			{

+				encodingLabel.setText(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_XMLEncoding"));

+

+				GridData data = new GridData();

+				data.horizontalAlignment = GridData.FILL;

+				encodingLabel.setLayoutData(data);

+			}

+			encodingField = new Combo(composite, SWT.BORDER);

+			{

+				GridData data = new GridData();

+				data.horizontalAlignment = GridData.FILL;

+				data.grabExcessHorizontalSpace = true;

+				encodingField.setLayoutData(data);

+			}

+

+			for (String encoding : getEncodings()) {

+				encodingField.add(encoding);

+			}

+

+			encodingField.select(0);

+			encodingField.addModifyListener(validator);

+

+			setPageComplete(validatePage());

+			setControl(composite);

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		protected ModifyListener validator =

+			new ModifyListener() {

+				public void modifyText(ModifyEvent e) {

+					setPageComplete(validatePage());

+				}

+			};

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		protected boolean validatePage() {

+			return getInitialObjectName() != null && getEncodings().contains(encodingField.getText());

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		@Override

+		public void setVisible(boolean visible) {

+			super.setVisible(visible);

+			if (visible) {

+				if (initialObjectField.getItemCount() == 1) {

+					initialObjectField.clearSelection();

+					encodingField.setFocus();

+				}

+				else {

+					encodingField.clearSelection();

+					initialObjectField.setFocus();

+				}

+			}

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public String getInitialObjectName() {

+			String label = initialObjectField.getText();

+

+			for (String name : getInitialObjectNames()) {

+				if (getLabel(name).equals(label)) {

+					return name;

+				}

+			}

+			return null;

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public String getEncoding() {

+			return encodingField.getText();

+		}

+

+		/**

+		 * Returns the label for the specified type name.

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		protected String getLabel(String typeName) {

+			try {

+				return AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_" + typeName + "_type");

+			}

+			catch(MissingResourceException mre) {

+				AutomaticexperienceEditPlugin.INSTANCE.log(mre);

+			}

+			return typeName;

+		}

+

+		/**

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		protected Collection<String> getEncodings() {

+			if (encodings == null) {

+				encodings = new ArrayList<String>();

+				for (StringTokenizer stringTokenizer = new StringTokenizer(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens(); ) {

+					encodings.add(stringTokenizer.nextToken());

+				}

+			}

+			return encodings;

+		}

+	}

+

+	/**

+	 * The framework calls this to create the contents of the wizard.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+		@Override

+	public void addPages() {

+		// Create a page, set the title, and the initial model file name.

+		//

+		newFileCreationPage = new AutomaticexperimentModelWizardNewFileCreationPage("Whatever", selection);

+		newFileCreationPage.setTitle(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentModelWizard_label"));

+		newFileCreationPage.setDescription(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentModelWizard_description"));

+		newFileCreationPage.setFileName(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentEditorFilenameDefaultBase") + "." + FILE_EXTENSIONS.get(0));

+		addPage(newFileCreationPage);

+

+		// Try and get the resource selection to determine a current directory for the file dialog.

+		//

+		if (selection != null && !selection.isEmpty()) {

+			// Get the resource...

+			//

+			Object selectedElement = selection.iterator().next();

+			if (selectedElement instanceof IResource) {

+				// Get the resource parent, if its a file.

+				//

+				IResource selectedResource = (IResource)selectedElement;

+				if (selectedResource.getType() == IResource.FILE) {

+					selectedResource = selectedResource.getParent();

+				}

+

+				// This gives us a directory...

+				//

+				if (selectedResource instanceof IFolder || selectedResource instanceof IProject) {

+					// Set this for the container.

+					//

+					newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());

+

+					// Make up a unique new name here.

+					//

+					String defaultModelBaseFilename = AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentEditorFilenameDefaultBase");

+					String defaultModelFilenameExtension = FILE_EXTENSIONS.get(0);

+					String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;

+					for (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i) {

+						modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension;

+					}

+					newFileCreationPage.setFileName(modelFilename);

+				}

+			}

+		}

+		initialObjectCreationPage = new AutomaticexperimentModelWizardInitialObjectCreationPage("Whatever2");

+		initialObjectCreationPage.setTitle(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_AutomaticexperimentModelWizard_label"));

+		initialObjectCreationPage.setDescription(AutomaticexperienceEditPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description"));

+		addPage(initialObjectCreationPage);

+	}

+

+	/**

+	 * Get the file from the page.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public IFile getModelFile() {

+		return newFileCreationPage.getModelFile();

+	}

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticExperimentItemProvider.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticExperimentItemProvider.java
new file mode 100644
index 0000000..1f996f0
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticExperimentItemProvider.java
@@ -0,0 +1,385 @@
+package org.eclipse.stem.analysis.automaticexperiment.provider;
+
+/*******************************************************************************
+ * Copyright (c) 2010 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 java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.stem.analysis.AnalysisFactory;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AutomaticExperimentItemProvider
+	extends OptimizerAlgorithmItemProvider
+	implements
+		IEditingDomainItemProvider,
+		IStructuredItemContentProvider,
+		ITreeItemContentProvider,
+		IItemLabelProvider,
+		IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AutomaticExperimentItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addBaseScenarioPropertyDescriptor(object);
+			addParametersPropertyDescriptor(object);
+			addErrorAnalysisAlgorithmPropertyDescriptor(object);
+			addErrorFunctionPropertyDescriptor(object);
+			addTolerancePropertyDescriptor(object);
+			addReferanceDataDirPropertyDescriptor(object);
+			addMaximumNumberOfIterationsPropertyDescriptor(object);
+			addReInitPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Base Scenario feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBaseScenarioPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_baseScenario_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_baseScenario_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__BASE_SCENARIO,
+				 true,
+				 false,
+				 true,
+				 null,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Parameters feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addParametersPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_parameters_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_parameters_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__PARAMETERS,
+				 true,
+				 false,
+				 true,
+				 null,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Error Analysis Algorithm feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addErrorAnalysisAlgorithmPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_errorAnalysisAlgorithm_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_errorAnalysisAlgorithm_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Error Function feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addErrorFunctionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_errorFunction_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_errorFunction_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Tolerance feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addTolerancePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_tolerance_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_tolerance_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__TOLERANCE,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Referance Data Dir feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addReferanceDataDirPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_referanceDataDir_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_referanceDataDir_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Maximum Number Of Iterations feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addMaximumNumberOfIterationsPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_maximumNumberOfIterations_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_maximumNumberOfIterations_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Re Init feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addReInitPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_AutomaticExperiment_reInit_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_AutomaticExperiment_reInit_feature", "_UI_AutomaticExperiment_type"),
+				 AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__RE_INIT,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+		if (childrenFeatures == null) {
+			super.getChildrenFeatures(object);
+			childrenFeatures.add(AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__BASE_SCENARIO);
+			childrenFeatures.add(AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__PARAMETERS);
+			childrenFeatures.add(AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__ERROR_FUNC);
+		}
+		return childrenFeatures;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EStructuralFeature getChildFeature(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildFeature(object, child);
+	}
+
+	/**
+	 * This returns AutomaticExperiment.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/customobj16/AutomaticExperiment"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((AutomaticExperiment)object).getURI().lastSegment();
+		return label == null || label.length() == 0 ?
+			getString("_UI_AutomaticExperiment_type") :
+			 label;
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getTextGen(Object object) {
+		URI labelValue = ((AutomaticExperiment)object).getURI();
+		String label = labelValue == null ? null : labelValue.toString();
+		return label == null || label.length() == 0 ?
+			getString("_UI_AutomaticExperiment_type") :
+			getString("_UI_AutomaticExperiment_type") + " " + label;
+	}
+	
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(AutomaticExperiment.class)) {
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_ANALYSIS_ALGORITHM:
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNCTION:
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__TOLERANCE:
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__REFERANCE_DATA_DIR:
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__MAXIMUM_NUMBER_OF_ITERATIONS:
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__RE_INIT:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT__ERROR_FUNC:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add
+			(createChildParameter
+				(AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__ERROR_FUNC,
+				 AnalysisFactory.eINSTANCE.createErrorFunction()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__ERROR_FUNC,
+				 AnalysisFactory.eINSTANCE.createThresholdErrorFunction()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(AutomaticexperimentPackage.Literals.AUTOMATIC_EXPERIMENT__ERROR_FUNC,
+				 AnalysisFactory.eINSTANCE.createSimpleErrorFunction()));
+	}
+
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticexperienceEditPlugin.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticexperienceEditPlugin.java
new file mode 100644
index 0000000..01a44ef
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticexperienceEditPlugin.java
@@ -0,0 +1,104 @@
+package org.eclipse.stem.analysis.automaticexperiment.provider;

+

+/*******************************************************************************

+ * 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.emf.common.EMFPlugin;

+import org.eclipse.emf.common.ui.EclipseUIPlugin;

+import org.eclipse.emf.common.util.ResourceLocator;

+import org.eclipse.emf.ecore.provider.EcoreEditPlugin;

+import org.eclipse.stem.analysis.provider.AnalysisEditPlugin;

+import org.eclipse.stem.core.common.provider.CoreEditPlugin;

+

+/**

+ * This is the central singleton for the Automaticexperience editor plugin.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public final class AutomaticexperienceEditPlugin extends EMFPlugin {

+	/**

+	 * Keep track of the singleton.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public static final AutomaticexperienceEditPlugin INSTANCE = new AutomaticexperienceEditPlugin();

+

+	/**

+	 * Keep track of the singleton.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private static Implementation plugin;

+

+	/**

+	 * Create the instance.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperienceEditPlugin() {

+		super

+			(new ResourceLocator [] {

+				AnalysisEditPlugin.INSTANCE,

+				CoreEditPlugin.INSTANCE,

+				EcoreEditPlugin.INSTANCE,

+			});

+	}

+

+	/**

+	 * Returns the singleton instance of the Eclipse plugin.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return the singleton instance.

+	 * @generated

+	 */

+	@Override

+	public ResourceLocator getPluginResourceLocator() {

+		return plugin;

+	}

+

+	/**

+	 * Returns the singleton instance of the Eclipse plugin.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return the singleton instance.

+	 * @generated

+	 */

+	public static Implementation getPlugin() {

+		return plugin;

+	}

+

+	/**

+	 * The actual implementation of the Eclipse <b>Plugin</b>.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public static class Implementation extends EclipseUIPlugin {

+		/**

+		 * Creates an instance.

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @generated

+		 */

+		public Implementation() {

+			super();

+	

+			// Remember the static instance.

+			//

+			plugin = this;

+		}

+	}

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticexperimentItemProviderAdapterFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticexperimentItemProviderAdapterFactory.java
new file mode 100644
index 0000000..56f0df4
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/AutomaticexperimentItemProviderAdapterFactory.java
@@ -0,0 +1,255 @@
+package org.eclipse.stem.analysis.automaticexperiment.provider;

+

+/*******************************************************************************

+ * 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 java.util.ArrayList;

+import java.util.Collection;

+

+import org.eclipse.emf.common.notify.Adapter;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.common.notify.Notifier;

+import org.eclipse.emf.edit.provider.ChangeNotifier;

+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;

+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;

+import org.eclipse.emf.edit.provider.IChangeNotifier;

+import org.eclipse.emf.edit.provider.IDisposable;

+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;

+import org.eclipse.emf.edit.provider.IItemLabelProvider;

+import org.eclipse.emf.edit.provider.IItemPropertySource;

+import org.eclipse.emf.edit.provider.INotifyChangedListener;

+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;

+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

+import org.eclipse.stem.analysis.automaticexperiment.util.AutomaticexperimentAdapterFactory;

+

+

+/**

+ * This is the factory that is used to provide the interfaces needed to support Viewers.

+ * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.

+ * The adapters also support Eclipse property sheets.

+ * Note that most of the adapters are shared among multiple instances.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class AutomaticexperimentItemProviderAdapterFactory extends AutomaticexperimentAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {

+	/**

+	 * This keeps track of the root adapter factory that delegates to this adapter factory.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ComposedAdapterFactory parentAdapterFactory;

+

+	/**

+	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected IChangeNotifier changeNotifier = new ChangeNotifier();

+

+	/**

+	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected Collection<Object> supportedTypes = new ArrayList<Object>();

+

+	/**

+	 * This constructs an instance.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentItemProviderAdapterFactory() {

+		supportedTypes.add(IEditingDomainItemProvider.class);

+		supportedTypes.add(IStructuredItemContentProvider.class);

+		supportedTypes.add(ITreeItemContentProvider.class);

+		supportedTypes.add(IItemLabelProvider.class);

+		supportedTypes.add(IItemPropertySource.class);

+	}

+

+	/**

+	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment} instances.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AutomaticExperimentItemProvider automaticExperimentItemProvider;

+

+	/**

+	 * This creates an adapter for a {@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Adapter createAutomaticExperimentAdapter() {

+		if (automaticExperimentItemProvider == null) {

+			automaticExperimentItemProvider = new AutomaticExperimentItemProvider(this);

+		}

+

+		return automaticExperimentItemProvider;

+	}

+

+	/**

+	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter} instances.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected ModifiableParameterItemProvider modifiableParameterItemProvider;

+

+	/**

+	 * This creates an adapter for a {@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Adapter createModifiableParameterAdapter() {

+		if (modifiableParameterItemProvider == null) {

+			modifiableParameterItemProvider = new ModifiableParameterItemProvider(this);

+		}

+

+		return modifiableParameterItemProvider;

+	}

+

+	/**

+	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm} instances.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected OptimizerAlgorithmItemProvider optimizerAlgorithmItemProvider;

+

+	/**

+	 * This creates an adapter for a {@link org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Adapter createOptimizerAlgorithmAdapter() {

+		if (optimizerAlgorithmItemProvider == null) {

+			optimizerAlgorithmItemProvider = new OptimizerAlgorithmItemProvider(this);

+		}

+

+		return optimizerAlgorithmItemProvider;

+	}

+

+	/**

+	 * This returns the root adapter factory that contains this factory.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public ComposeableAdapterFactory getRootAdapterFactory() {

+		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();

+	}

+

+	/**

+	 * This sets the composed adapter factory that contains this factory.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {

+		this.parentAdapterFactory = parentAdapterFactory;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public boolean isFactoryForType(Object type) {

+		return supportedTypes.contains(type) || super.isFactoryForType(type);

+	}

+

+	/**

+	 * This implementation substitutes the factory itself as the key for the adapter.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Adapter adapt(Notifier notifier, Object type) {

+		return super.adapt(notifier, this);

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Object adapt(Object object, Object type) {

+		if (isFactoryForType(type)) {

+			Object adapter = super.adapt(object, type);

+			if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter))) {

+				return adapter;

+			}

+		}

+

+		return null;

+	}

+

+	/**

+	 * This adds a listener.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void addListener(INotifyChangedListener notifyChangedListener) {

+		changeNotifier.addListener(notifyChangedListener);

+	}

+

+	/**

+	 * This removes a listener.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void removeListener(INotifyChangedListener notifyChangedListener) {

+		changeNotifier.removeListener(notifyChangedListener);

+	}

+

+	/**

+	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void fireNotifyChanged(Notification notification) {

+		changeNotifier.fireNotifyChanged(notification);

+

+		if (parentAdapterFactory != null) {

+			parentAdapterFactory.fireNotifyChanged(notification);

+		}

+	}

+

+	/**

+	 * This disposes all of the item providers created by this factory. 

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public void dispose() {

+		if (automaticExperimentItemProvider != null) automaticExperimentItemProvider.dispose();

+		if (modifiableParameterItemProvider != null) modifiableParameterItemProvider.dispose();

+		if (optimizerAlgorithmItemProvider != null) optimizerAlgorithmItemProvider.dispose();

+	}

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/ModifiableParameterItemProvider.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/ModifiableParameterItemProvider.java
new file mode 100644
index 0000000..4744aa0
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/ModifiableParameterItemProvider.java
@@ -0,0 +1,307 @@
+package org.eclipse.stem.analysis.automaticexperiment.provider;

+

+/*******************************************************************************

+ * 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 java.util.Collection;

+import java.util.List;

+

+import org.eclipse.emf.common.notify.AdapterFactory;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.common.util.ResourceLocator;

+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;

+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;

+import org.eclipse.emf.edit.provider.IItemLabelProvider;

+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

+import org.eclipse.emf.edit.provider.IItemPropertySource;

+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;

+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;

+import org.eclipse.emf.edit.provider.ItemProviderAdapter;

+import org.eclipse.emf.edit.provider.ViewerNotification;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+

+

+/**

+ * This is the item provider adapter for a {@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter} object.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class ModifiableParameterItemProvider

+	extends ItemProviderAdapter

+	implements

+		IEditingDomainItemProvider,

+		IStructuredItemContentProvider,

+		ITreeItemContentProvider,

+		IItemLabelProvider,

+		IItemPropertySource {

+	/**

+	 * This constructs an instance from a factory and a notifier.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public ModifiableParameterItemProvider(AdapterFactory adapterFactory) {

+		super(adapterFactory);

+	}

+

+	/**

+	 * This returns the property descriptors for the adapted class.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {

+		if (itemPropertyDescriptors == null) {

+			super.getPropertyDescriptors(object);

+

+			addInitialValuePropertyDescriptor(object);

+			addFeaturePropertyDescriptor(object);

+			addStepPropertyDescriptor(object);

+			addFeatureNamePropertyDescriptor(object);

+			addLowerBoundPropertyDescriptor(object);

+			addUpperBoundPropertyDescriptor(object);

+			addTargetURIPropertyDescriptor(object);

+		}

+		return itemPropertyDescriptors;

+	}

+

+	/**

+	 * This adds a property descriptor for the Initial Value feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addInitialValuePropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_initialValue_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_initialValue_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__INITIAL_VALUE,

+				 true,

+				 false,

+				 false,

+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This adds a property descriptor for the Feature feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addFeaturePropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_feature_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_feature_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__FEATURE,

+				 true,

+				 false,

+				 true,

+				 null,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This adds a property descriptor for the Step feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addStepPropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_step_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_step_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__STEP,

+				 true,

+				 false,

+				 false,

+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This adds a property descriptor for the Feature Name feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addFeatureNamePropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_featureName_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_featureName_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__FEATURE_NAME,

+				 true,

+				 false,

+				 false,

+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This adds a property descriptor for the Lower Bound feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addLowerBoundPropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_lowerBound_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_lowerBound_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__LOWER_BOUND,

+				 true,

+				 false,

+				 false,

+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This adds a property descriptor for the Upper Bound feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addUpperBoundPropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_upperBound_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_upperBound_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__UPPER_BOUND,

+				 true,

+				 false,

+				 false,

+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This adds a property descriptor for the Target URI feature.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected void addTargetURIPropertyDescriptor(Object object) {

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_ModifiableParameter_targetURI_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_ModifiableParameter_targetURI_feature", "_UI_ModifiableParameter_type"),

+				 AutomaticexperimentPackage.Literals.MODIFIABLE_PARAMETER__TARGET_URI,

+				 true,

+				 false,

+				 false,

+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,

+				 null,

+				 null));

+	}

+

+	/**

+	 * This returns ModifiableParameter.gif.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated NOT

+	 */

+	@Override

+	public Object getImage(Object object) {

+		return overlayImage(object, getResourceLocator().getImage("full/customobj16/ModifiableParameter"));

+	}

+

+	/**

+	 * This returns the label text for the adapted class.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public String getText(Object object) {

+		String label = ((ModifiableParameter)object).getFeatureName();

+		return label == null || label.length() == 0 ?

+			getString("_UI_ModifiableParameter_type") :

+			getString("_UI_ModifiableParameter_type") + " " + label;

+	}

+

+	/**

+	 * This handles model notifications by calling {@link #updateChildren} to update any cached

+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public void notifyChanged(Notification notification) {

+		updateChildren(notification);

+

+		switch (notification.getFeatureID(ModifiableParameter.class)) {

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__INITIAL_VALUE:

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__STEP:

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__FEATURE_NAME:

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__LOWER_BOUND:

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__UPPER_BOUND:

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER__TARGET_URI:

+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));

+				return;

+		}

+		super.notifyChanged(notification);

+	}

+

+	/**

+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children

+	 * that can be created under this object.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {

+		super.collectNewChildDescriptors(newChildDescriptors, object);

+	}

+

+	/**

+	 * Return the resource locator for this item provider's resources.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public ResourceLocator getResourceLocator() {

+		return AutomaticexperienceEditPlugin.INSTANCE;

+	}

+

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/OptimizerAlgorithmItemProvider.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/OptimizerAlgorithmItemProvider.java
new file mode 100644
index 0000000..651bfc4
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/provider/OptimizerAlgorithmItemProvider.java
@@ -0,0 +1,130 @@
+package org.eclipse.stem.analysis.automaticexperiment.provider;
+/******************************************************************************* 
+ * Copyright (c) 2011 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 java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;
+import org.eclipse.stem.core.common.provider.IdentifiableItemProvider;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class OptimizerAlgorithmItemProvider
+	extends IdentifiableItemProvider
+	implements
+		IEditingDomainItemProvider,
+		IStructuredItemContentProvider,
+		ITreeItemContentProvider,
+		IItemLabelProvider,
+		IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public OptimizerAlgorithmItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This returns OptimizerAlgorithm.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/OptimizerAlgorithm"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		URI labelValue = ((OptimizerAlgorithm)object).getURI();
+		String label = labelValue == null ? null : labelValue.toString();
+		return label == null || label.length() == 0 ?
+			getString("_UI_OptimizerAlgorithm_type") :
+			getString("_UI_OptimizerAlgorithm_type") + " " + label;
+	}
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return AutomaticexperienceEditPlugin.INSTANCE;
+	}
+
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditor.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditor.java
new file mode 100644
index 0000000..5da9a8a
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditor.java
@@ -0,0 +1,17 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class AlgorithmCompositeEditor extends Composite {
+
+	AlgorithmCompositeEditor(final Composite parent, final int style) {
+		super(parent, style);
+	}
+
+	public abstract boolean validate();
+	
+	public abstract String getErrorMessage();
+	
+	public abstract OptimizerAlgorithm createAlgorithm();
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditorAdapter.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditorAdapter.java
new file mode 100644
index 0000000..577e877
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditorAdapter.java
@@ -0,0 +1,14 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.swt.events.ModifyListener;
+
+public abstract class AlgorithmCompositeEditorAdapter extends AdapterImpl implements
+		Adapter {
+
+	abstract public AlgorithmCompositeEditor createCompositeEditor(
+			AlgorithmControl algControl,
+			int style, ModifyListener projectValidator, IProject project);
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditorAdapterFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditorAdapterFactory.java
new file mode 100644
index 0000000..7413594
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmCompositeEditorAdapterFactory.java
@@ -0,0 +1,22 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+
+/**
+ * This class represents
+ */
+public interface AlgorithmCompositeEditorAdapterFactory {
+
+	AlgorithmCompositeEditorAdapterFactoryImpl INSTANCE = new AlgorithmCompositeEditorAdapterFactoryImpl();
+
+	public class AlgorithmCompositeEditorAdapterFactoryImpl extends
+			ComposedAdapterFactory implements
+			AlgorithmCompositeEditorAdapterFactory {
+
+		@Override
+		public boolean isFactoryForType(Object type) {
+			return type == AlgorithmCompositeEditorAdapter.class;
+		}
+
+	} 
+} 
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmControl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmControl.java
new file mode 100644
index 0000000..12a316d
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AlgorithmControl.java
@@ -0,0 +1,125 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+/*******************************************************************************
+ * Copyright (c) 2007 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 java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;
+import org.eclipse.stem.analysis.automaticexperiment.views.Messages;
+import org.eclipse.stem.ui.Activator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class represents the SWT control for defining a disease.
+ */
+public class AlgorithmControl extends Composite {
+
+	private static OptimizerAlgorithm[] algorithms = null;
+
+	StackLayout stackLayout;
+	
+
+	private Map<OptimizerAlgorithm, AlgorithmCompositeEditor>compositeMap = new HashMap<OptimizerAlgorithm, AlgorithmCompositeEditor>();
+	
+	/**
+	 * Create the composite
+	 * 
+	 * @param parent
+	 * @param style
+	 * @param projectValidator
+	 */
+	public AlgorithmControl(final Composite parent, final int style,
+			ModifyListener projectValidator, IProject project, OptimizerAlgorithm[]algorithms) {
+		super(parent, style);
+		stackLayout = new StackLayout();
+		setLayout(stackLayout);
+
+		AlgorithmCompositeEditor firstOne = null;
+		if (algorithms != null) {
+			// Yes
+			for (int i = 0; i < algorithms.length; i++) {
+
+				AlgorithmCompositeEditorAdapter acea = (AlgorithmCompositeEditorAdapter) AlgorithmCompositeEditorAdapterFactory.INSTANCE
+						.adapt(algorithms[i],
+								AlgorithmCompositeEditorAdapter.class);
+
+				final AlgorithmCompositeEditor ace = acea
+						.createCompositeEditor(this, SWT.NONE,projectValidator, project);
+
+				compositeMap.put(algorithms[i], ace);
+				if (firstOne == null) {
+					// Yes
+					firstOne = ace;
+				} // if
+			} // for i
+		} // if any disease models?
+
+		stackLayout.topControl = firstOne;
+		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.stem.doc.newautoexp_contextid");
+	}// 
+
+	
+
+	void displayAlgorithm(final OptimizerAlgorithm algorithm) {
+		final AlgorithmCompositeEditor ace = compositeMap.get(algorithm);
+		// Did we find it?
+		if (ace != null) {
+			// Yes
+			stackLayout.topControl = ace;
+			layout();
+		} // if
+		else {
+			Activator.logError(Messages.getString("DMPC2") //$NON-NLS-1$
+					+ algorithm.getClass().getName() + "\"", null); //$NON-NLS-1$
+		}
+	} // 
+	
+	
+	
+	@Override
+	public void dispose() {
+		super.dispose();
+	}
+
+	@Override
+	protected void checkSubclass() {
+		// Disable the check that prevents sub-classing of SWT components
+	}
+
+	/**
+	 * @return <code>true</code> if the contents of the control are valid,
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean validate() {
+		return ((AlgorithmCompositeEditor) (stackLayout.topControl))
+		.validate();
+	} // validate
+
+	/**
+	 * @return the error message set by {@link #validate()}
+	 */
+	public String getErrorMessage() {
+		return ((AlgorithmCompositeEditor) (stackLayout.topControl))
+		.getErrorMessage();
+	}
+
+	public OptimizerAlgorithm createAutomaticExperiment() {
+		return( ((AlgorithmCompositeEditor)(stackLayout.topControl)).createAlgorithm());
+	}
+} // 
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditor.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditor.java
new file mode 100644
index 0000000..645cad9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditor.java
@@ -0,0 +1,665 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.stem.analysis.ErrorFunction;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentFactory;
+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;
+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;
+import org.eclipse.stem.analysis.automaticexperiment.views.Messages;
+import org.eclipse.stem.core.common.Identifiable;
+import org.eclipse.stem.core.common.impl.IdentifiableImpl;
+import org.eclipse.stem.core.scenario.Scenario;
+import org.eclipse.stem.core.scenario.impl.ScenarioImpl;
+import org.eclipse.stem.ui.Activator;
+import org.eclipse.stem.ui.widgets.IdentifiablePickerDialog;
+import org.eclipse.stem.ui.widgets.ParameterPickerDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+public class AutomaticExperimentCompositeEditor extends AlgorithmCompositeEditor {
+
+	Text maxItersText;
+	Text referenceDataText;
+	Text baseScenarioText;
+	Combo errorFunctionCombo;
+	Text startValText;
+	Text stepValText;
+	Text minValText;
+	Text maxValText;
+	Text toleranceText;
+	Table table;
+	
+	boolean reInit = true;
+	ArrayList<Identifiable> identifiableList = new ArrayList<Identifiable>();
+	ArrayList<EAttribute> attributeList = new ArrayList<EAttribute>();
+	ArrayList<Double>minList = new ArrayList<Double>();
+	ArrayList<Double>maxList = new ArrayList<Double>();
+	ArrayList<Double>startList = new ArrayList<Double>();
+	ArrayList<Double>stepList = new ArrayList<Double>();
+	int currentTableIndex;
+	Scenario baseScenario;
+	
+	String errorMessage;
+	
+	
+	public AutomaticExperimentCompositeEditor(Composite parent, int style, final ModifyListener projectValidator, final IProject project) {
+		super(parent, style);
+		// Fill in the rest here
+		
+		final GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 3;
+		setLayout(gridLayout);
+		
+		Label maxItersLabel = new Label(this, SWT.NONE);
+		maxItersLabel.setText(Messages.getString("NM.MAXITERS"));
+		GridData gridData = new GridData();
+		gridData.horizontalSpan = 1;
+		maxItersLabel.setLayoutData(gridData);
+		
+		maxItersText = new Text(this, SWT.NONE);
+		maxItersText.setText("-1");
+		GridData gridData2 = new GridData();
+		gridData2.horizontalSpan = 2;
+		gridData2.grabExcessHorizontalSpace = true;
+		gridData2.horizontalAlignment = SWT.FILL;
+		maxItersText.setLayoutData(gridData2);
+		maxItersText.addModifyListener(projectValidator);
+		
+		Label refDataLabel = new Label(this, SWT.NONE);
+		refDataLabel.setText(Messages.getString("NM.REFERENCE"));
+		GridData gridData3 = new GridData();
+		gridData3.horizontalSpan = 1;
+		refDataLabel.setLayoutData(gridData3);
+		
+		referenceDataText = new Text(this, SWT.NONE);
+		referenceDataText.setText("");
+		GridData gridData4 = new GridData();
+		gridData4.horizontalSpan = 1;
+		gridData4.grabExcessHorizontalSpace = true;
+		gridData4.horizontalAlignment = SWT.FILL;
+		referenceDataText.setLayoutData(gridData4);
+		referenceDataText.addModifyListener(projectValidator);
+		
+		Button pickRefereceButton = new Button(this, SWT.NONE);
+		pickRefereceButton.setText(Messages.getString("NM.REFPICKFOLDER"));
+		GridData gridData5 = new GridData();
+		gridData5.horizontalSpan = 1;
+		pickRefereceButton.setLayoutData(gridData5);
+		final Shell shell = this.getShell();
+		pickRefereceButton.addSelectionListener(new SelectionListener() {
+
+			public void widgetSelected(SelectionEvent e) {
+				final DirectoryDialog dd = new DirectoryDialog(shell,
+						SWT.OPEN | SWT.SINGLE);
+				dd.setText(Messages.getString("NM.REFFOLDERTITLE")); //$NON-NLS-1$
+				
+				String selected = dd.open();
+				if(selected != null) referenceDataText.setText(selected);
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		
+		Label baseScenarioLabel = new Label(this, SWT.NONE);
+		baseScenarioLabel.setText(Messages.getString("NM.BASESCENARIO"));
+		GridData gridData6 = new GridData();
+		gridData6.horizontalSpan = 1;
+		baseScenarioLabel.setLayoutData(gridData6);
+		
+		baseScenarioText = new Text(this, SWT.NONE);
+		baseScenarioText.setText("");
+		GridData gridData7 = new GridData();
+		gridData7.horizontalSpan = 1;
+		gridData7.grabExcessHorizontalSpace = true;
+		gridData7.horizontalAlignment = SWT.FILL;
+		baseScenarioText.setLayoutData(gridData7);
+		baseScenarioText.setEditable(false);
+		baseScenarioText.addModifyListener(projectValidator);
+		
+		Button pickScenarioButton = new Button(this, SWT.NONE);
+		pickScenarioButton.setText(Messages.getString("NM.SELECTSCENARIO"));
+		GridData gridData8 = new GridData();
+		gridData8.horizontalSpan = 1;
+		pickScenarioButton.setLayoutData(gridData8);
+		pickScenarioButton.addSelectionListener(new SelectionListener() {
+			
+			public void widgetSelected(SelectionEvent e) {
+				
+				IdentifiablePickerDialog ppDialog = new IdentifiablePickerDialog(AutomaticExperimentCompositeEditor.this.getShell(), SWT.NONE, Messages.getString("NM.PICKSCENARIO"), project, ScenarioImpl.class);
+				Object  ret = ppDialog.open();
+				if(ret != null) {
+					baseScenario = (Scenario)ret;
+					baseScenarioText.setText(baseScenario.getURI().toString());
+				}
+			}
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// TODO Auto-generated method stub
+				
+			}
+		});
+		
+		
+		Label errorFunctionLabel = new Label(this, SWT.NONE);
+		errorFunctionLabel.setText(Messages.getString("NM.ERRORFUNCTION"));
+		GridData gridData9 = new GridData();
+		gridData9.horizontalSpan = 1;
+		baseScenarioLabel.setLayoutData(gridData9);
+	
+		errorFunctionCombo = new Combo(this, SWT.NONE);
+		initializeErrorFunctionCombo();
+		GridData gridData10 = new GridData();
+		gridData10.horizontalSpan = 2;
+		gridData10.grabExcessHorizontalSpace = true;
+		gridData10.horizontalAlignment = SWT.FILL;
+		errorFunctionCombo.setLayoutData(gridData10);
+		
+		Label reInitLabel = new Label(this, SWT.NONE);
+		reInitLabel.setText(Messages.getString("NM.REINITLABEL"));
+		GridData gridDataRI = new GridData();
+		gridDataRI.horizontalSpan = 1;
+		reInitLabel.setLayoutData(gridDataRI);
+		
+		Composite radioComposite = new Composite(this, SWT.BORDER);
+	    FillLayout fillLayout = new FillLayout();
+	    fillLayout.type = SWT.HORIZONTAL;
+	    radioComposite.setLayout(fillLayout);
+	    
+	    final Button falseButton = new Button(radioComposite, SWT.RADIO);
+	    falseButton.setText(Messages.getString("NM.NO"));//$NON-NLS-1$
+	    
+	    Button trueButton = new Button(radioComposite, SWT.RADIO);
+	    trueButton.setText(Messages.getString("NM.YES"));//$NON-NLS-1$
+	    	    
+	   	trueButton.setSelection(true);
+	    falseButton.setSelection(false);
+	    
+	    Listener listener = new Listener() {
+	        public void handleEvent(Event event) {
+	          if (event.widget == falseButton) {
+	        	reInit = !falseButton.getSelection();
+	          }
+	        }
+	      };
+	    // these are radio buttons so we only need to add the listener to one of them.
+	    falseButton.addListener(SWT.Selection, listener);
+	    final GridData cGD = new GridData();
+	    cGD.grabExcessHorizontalSpace = true;
+		cGD.horizontalAlignment = SWT.FILL;
+		cGD.horizontalSpan = 2;
+		radioComposite.setLayoutData(cGD);
+		
+		Label toleranceTabel = new Label(this, SWT.NONE);
+		toleranceTabel.setText(Messages.getString("NM.TOLERANCE"));
+		GridData tolGD = new GridData();
+		tolGD.horizontalSpan = 1;
+		toleranceTabel.setLayoutData(tolGD);
+		
+		toleranceText = new Text(this, SWT.NONE);
+		toleranceText.setText("1E-9");
+		GridData tol2GD = new GridData();
+		tol2GD.horizontalSpan = 2;
+		tol2GD.grabExcessHorizontalSpace = true;
+		tol2GD.horizontalAlignment = SWT.FILL;
+		toleranceText.setLayoutData(tol2GD);
+		
+		table = new Table(this, SWT.BORDER | SWT.SINGLE);
+		GridData gridData11 = new GridData();
+		gridData11.horizontalSpan = 1;
+		gridData11.grabExcessHorizontalSpace = true;
+		gridData11.horizontalAlignment = SWT.FILL;
+		gridData11.grabExcessVerticalSpace = false;
+		table.setLayoutData(gridData11);	
+		
+		Composite startStepComp = new Composite(this, SWT.NONE);
+		GridLayout startLayout = new GridLayout();
+		startLayout.numColumns = 2;
+		startStepComp.setLayout(startLayout);
+		
+		Label startLabel = new Label(startStepComp, SWT.NONE);
+		startLabel.setText(Messages.getString("NM.INITIAL"));
+		GridData gridData12 = new GridData();
+		gridData12.horizontalSpan=1;
+		startLabel.setLayoutData(gridData12);
+		Label stepLabel = new Label(startStepComp, SWT.NONE);
+		stepLabel.setText(Messages.getString("NM.STEP"));
+		GridData gridData13 = new GridData();
+		gridData13.horizontalSpan=1;
+		stepLabel.setLayoutData(gridData13);
+		startValText = new Text(startStepComp, SWT.NONE);
+		GridData gridData14 = new GridData();
+		gridData13.horizontalSpan = 1;
+		startValText.setLayoutData(gridData14);
+		startValText.addModifyListener(projectValidator);
+		startValText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				if(currentTableIndex == -1) return;
+				String txt = startValText.getText();
+				double d = 0.0;
+				try { 
+					d = Double.parseDouble(txt);
+				} catch(NumberFormatException nfe) {
+					// Ignore, the validator will report the error
+				}
+				startList.set(currentTableIndex, d);
+			}
+		});
+		stepValText = new Text(startStepComp, SWT.NONE);
+		GridData gridData15 = new GridData();
+		gridData15.horizontalSpan = 1;
+		stepValText.setLayoutData(gridData15);
+		stepValText.addModifyListener(projectValidator);
+		stepValText.addModifyListener(new ModifyListener() {
+
+			public void modifyText(ModifyEvent e) {
+				if(currentTableIndex == -1) return;
+				String txt = stepValText.getText();
+				double d = 0.0;
+				try { 
+					d = Double.parseDouble(txt);
+				} catch(NumberFormatException nfe) {
+					// Ignore, the validator will report the error
+				}
+				stepList.set(currentTableIndex, d);
+			}
+		});
+		
+		Composite minMaxComp = new Composite(this, SWT.NONE);
+		GridLayout minMaxLayout = new GridLayout();
+		minMaxLayout.numColumns = 2;
+		minMaxComp.setLayout(startLayout);
+
+		Label minLabel = new Label(minMaxComp, SWT.NONE);
+		minLabel.setText(Messages.getString("NM.MIN"));
+		GridData gridData16 = new GridData();
+		gridData16.horizontalSpan=1;
+		minLabel.setLayoutData(gridData12);
+		Label maxLabel = new Label(minMaxComp, SWT.NONE);
+		maxLabel.setText(Messages.getString("NM.MAX"));
+		GridData gridData17 = new GridData();
+		gridData17.horizontalSpan=1;
+		maxLabel.setLayoutData(gridData17);
+		minValText = new Text(minMaxComp, SWT.NONE);
+		GridData gridData18 = new GridData();
+		gridData18.horizontalSpan = 1;
+		minValText.setLayoutData(gridData18);
+		minValText.addModifyListener(projectValidator);
+		minValText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				if(currentTableIndex == -1) return;
+				String txt = minValText.getText();
+				double d = 0.0;
+				try { 
+					d = Double.parseDouble(txt);
+				} catch(NumberFormatException nfe) {
+					// Ignore, the validator will report the error
+				}
+				minList.set(currentTableIndex, d);
+			}
+		});
+		maxValText = new Text(minMaxComp, SWT.NONE);
+		GridData gridData19 = new GridData();
+		gridData19.horizontalSpan = 1;
+		maxValText.setLayoutData(gridData19);
+		maxValText.addModifyListener(projectValidator);
+		maxValText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				if(currentTableIndex == -1) return;
+				String txt = maxValText.getText();
+				double d = 0.0;
+				try { 
+					d = Double.parseDouble(txt);
+				} catch(NumberFormatException nfe) {
+					// Ignore, the validator will report the error
+				}
+				maxList.set(currentTableIndex, d);
+			}
+		});
+		minValText.setEnabled(false);
+		maxValText.setEnabled(false);
+		startValText.setEnabled(false);
+		stepValText.setEnabled(false);
+		
+		
+
+		Composite plusminusbuttons = new Composite(this, SWT.NONE);
+		GridLayout gridLayout2 = new GridLayout();
+		gridLayout2.numColumns = 2;
+		plusminusbuttons.setLayout(gridLayout2);
+		
+		GridData gridData20 = new GridData();
+		gridData20.horizontalSpan = 1;
+		gridData20.grabExcessHorizontalSpace = true;
+		gridData20.horizontalAlignment = SWT.FILL;
+		plusminusbuttons.setLayoutData(gridData20);
+		
+	    Button plusButton = new Button(plusminusbuttons, SWT.NONE);
+	    plusButton.setText(Messages.getString("NM.PLUS"));
+	    GridData gridData21 = new GridData();
+		gridData21.horizontalSpan = 1;
+		plusButton.setLayoutData(gridData21);
+		
+		final Button minusButton = new Button(plusminusbuttons, SWT.NONE);
+		minusButton.setText(Messages.getString("NM.MINUS"));
+		GridData gridData22 = new GridData();
+		gridData21.horizontalSpan = 1;
+		minusButton.setLayoutData(gridData22);
+		minusButton.setEnabled(false);
+			
+		table.addSelectionListener(new SelectionListener() {
+			
+			public void widgetSelected(SelectionEvent e) {
+				currentTableIndex = table.getSelectionIndex();
+				if(currentTableIndex > -1) {
+					minValText.setText(minList.get(currentTableIndex)+"");
+					maxValText.setText(maxList.get(currentTableIndex)+"");
+					startValText.setText(startList.get(currentTableIndex)+"");
+					stepValText.setText(stepList.get(currentTableIndex)+"");
+					minValText.setEnabled(true);
+					maxValText.setEnabled(true);
+					startValText.setEnabled(true);
+					stepValText.setEnabled(true);
+					minusButton.setEnabled(true);
+				} else {
+					minValText.setText("");
+					maxValText.setText("");
+					startValText.setText("");
+					stepValText.setText("");
+					
+					minValText.setEnabled(false);
+					maxValText.setEnabled(false);
+					startValText.setEnabled(false);
+					stepValText.setEnabled(false);
+				}
+			}
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// TODO Auto-generated method stub
+				
+			}
+		});
+		
+
+		plusButton.addSelectionListener(new SelectionListener() {
+			
+			public void widgetSelected(SelectionEvent e) {
+				
+				ParameterPickerDialog ppDialog = new ParameterPickerDialog(AutomaticExperimentCompositeEditor.this.getShell(), SWT.NONE, Messages.getString("NM.PICKPARAM"), project, IdentifiableImpl.class);
+				Object [] ret = ppDialog.open();
+				if(ret != null) {
+					Identifiable id = (Identifiable)ret[0];
+					EAttribute attr = (EAttribute)ret[1];
+					identifiableList.add(id);
+					attributeList.add(attr);
+					TableItem newRow= new TableItem(table, SWT.NONE);
+					newRow.setText(attr.getName()+" ("+id.getURI().lastSegment()+")");
+					minList.add(0.0);
+					maxList.add(1.0);
+					startList.add(0.5);
+					stepList.add(0.1);
+					projectValidator.modifyText(null);// 
+
+				}
+			
+				
+				
+			}
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// TODO Auto-generated method stub
+				
+			}
+		});
+		
+		minusButton.addSelectionListener(new SelectionListener() {
+			
+			public void widgetSelected(SelectionEvent e) {
+				
+				if(currentTableIndex > -1) {
+					table.remove(currentTableIndex);
+					minList.remove(currentTableIndex);
+					maxList.remove(currentTableIndex);
+					startList.remove(currentTableIndex);
+					stepList.remove(currentTableIndex);
+
+					currentTableIndex = table.getSelectionIndex();
+
+					minValText.setText("");
+					maxValText.setText("");
+					startValText.setText("");
+					stepValText.setText("");
+					if(minList.size() == 0) {
+						minusButton.setEnabled(false);
+						minValText.setEnabled(false);
+						maxValText.setEnabled(false);
+						startValText.setEnabled(false);
+						stepValText.setEnabled(false);
+					}
+				}
+			}
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// TODO Auto-generated method stub
+				
+			}
+		});
+		
+	}
+
+	private ErrorFunction[] errorFunctions;
+	
+	private void initializeErrorFunctionCombo() {
+		
+		final IExtensionRegistry registry = Platform.getExtensionRegistry();
+		final IConfigurationElement[] errorFunctionsConfigElements = registry
+				.getConfigurationElementsFor(org.eclipse.stem.analysis.Constants.ID_ERRORFUNCTION_EXTENSION_POINT);
+
+			final java.util.List<ErrorFunction> temp = new ArrayList<ErrorFunction>();
+
+			errorFunctions = new ErrorFunction[errorFunctionsConfigElements.length];
+
+			for (int i = 0; i < errorFunctionsConfigElements.length; i++) {
+				final IConfigurationElement element = errorFunctionsConfigElements[i];
+			
+				if (element.getName().equals(org.eclipse.stem.analysis.Constants.ERRORFUNCTION_ELEMENT)) {
+					// Yes
+					try {
+						temp.add((ErrorFunction) element
+								.createExecutableExtension("class")); //$NON-NLS-1$
+					} catch (final CoreException e) {
+						Activator.logError(
+								Messages.getString("Unable to instantiate extension point "+element), e); //$NON-NLS-1$
+					}
+				} // if
+			} // for each configuration element
+
+			errorFunctions = temp.toArray(new ErrorFunction[] {});
+	
+		for(int i=0;i<errorFunctions.length;++i)
+			errorFunctionCombo.add(errorFunctions[i].eClass().getName());
+		errorFunctionCombo.select(0);
+	}
+	
+	@Override
+	public boolean validate() {
+		boolean retValue = true;
+		double minVal=0, maxVal=1, startVal=0.5, stepVal=0.1; // valid set of values, just in case the text boxes aren't enabled yet.
+		errorMessage = "";
+		if(retValue) {
+			if(startValText.isEnabled()) {
+				String val = startValText.getText();
+				retValue = checkDouble(val);
+				if(!retValue) errorMessage = Messages.getString("NM.BADSTART");
+				else startVal = Double.parseDouble(val);
+			}
+		}
+
+		if(retValue) {
+			if(stepValText.isEnabled()) {
+				String val = stepValText.getText();
+				retValue = checkDoubleNonZero(val);
+				if(!retValue) errorMessage = Messages.getString("NM.BADSTEP");
+				else stepVal = Double.parseDouble(val);
+			}
+		}
+
+		if(retValue) {
+			if(minValText.isEnabled()) {
+				String val = minValText.getText();
+				retValue = checkDouble(val);
+				if(!retValue) errorMessage = Messages.getString("NM.BADMIN");
+				else minVal = Double.parseDouble(val);
+			}
+		}
+
+		if(retValue) {
+			if(maxValText.isEnabled()) {
+				String val = maxValText.getText();
+				retValue = checkDouble(val);
+				if(!retValue) errorMessage = Messages.getString("NM.BADMAX");
+				else maxVal = Double.parseDouble(val);
+			}
+		}
+
+		if(retValue)
+			if(minVal >maxVal) {
+				 errorMessage = Messages.getString("NM.BADMINMAX");
+				 retValue = false;
+			}
+		
+		if(retValue)
+			if(maxItersText.isEnabled()) {
+				String val = maxItersText.getText();
+				retValue = checkIntegerMinValue(val, -1);
+				if(!retValue) errorMessage = Messages.getString("NM.BADMAXITERS");
+			}
+		if(retValue)
+			if(referenceDataText.getText() == null || referenceDataText.getText().trim().equals("")) {
+				 errorMessage = Messages.getString("NM.BADREFERENCE");
+				 retValue = false;
+			}
+
+		if(retValue)
+			if(baseScenario == null) {
+				 errorMessage = Messages.getString("NM.BADBASESCENARIO");
+				 retValue = false;
+			}
+
+		if(retValue)
+			if(table.getItemCount() == 0) {
+				 errorMessage = Messages.getString("NM.ATLEASTONEPARAM");
+				 retValue = false;
+			}
+		
+		if(retValue)
+			if(toleranceText.isEnabled()) {
+				 retValue = checkDoublePositiveNonZero(toleranceText.getText());
+			}
+		return retValue;
+	}
+
+	@Override
+	public String getErrorMessage() {
+		return errorMessage;
+	}
+
+	private boolean checkDouble(String d) {
+		boolean retValue = true;
+		try {
+			Double.parseDouble(d);
+		} catch(Exception e) {
+			retValue = false;
+		}
+		return retValue;
+	}
+	
+	@SuppressWarnings("unused")
+	private boolean checkDoubleNonZero(String d) {
+		boolean retValue = true;
+		try {
+			double _d = Double.parseDouble(d);
+			if(_d == 0.0) retValue = false;
+		} catch(Exception e) {
+			retValue = false;
+		}
+		return retValue;
+	}
+	
+	private boolean checkIntegerMinValue(String i, int min) {
+		boolean retValue = true;
+		try {
+			int _i = Integer.parseInt(i);
+			if(_i < min) retValue = false;
+		} catch(Exception e) {
+			retValue = false;
+		}
+		return retValue;
+	}
+
+
+	private boolean checkDoublePositiveNonZero(String d) {
+		boolean retValue = true;
+		try {
+			double _d = Double.parseDouble(d);
+			if(_d < 0.0) retValue = false;
+		} catch(Exception e) {
+			retValue = false;
+		}
+		return retValue;
+	}
+	
+	@Override
+	public OptimizerAlgorithm createAlgorithm() {
+		AutomaticExperiment autoExperiment = AutomaticexperimentFactory.eINSTANCE.createAutomaticExperiment();
+
+		autoExperiment.setBaseScenario(baseScenario);
+		int ind = errorFunctionCombo.getSelectionIndex();
+		if(ind == -1) ind = 0; // grab first one
+		autoExperiment.setErrorFunc(errorFunctions[ind]); 
+		autoExperiment.setMaximumNumberOfIterations(Integer.parseInt(maxItersText.getText()));
+		autoExperiment.setReferanceDataDir(referenceDataText.getText()); // ToDO: Use platform independent method
+		autoExperiment.setReInit(reInit);
+		autoExperiment.setTolerance(Double.parseDouble(toleranceText.getText()));
+		
+		int n=0;
+		for(Identifiable ident :identifiableList) {
+			ModifiableParameter param = AutomaticexperimentFactory.eINSTANCE.createModifiableParameter();
+			param.setTargetURI(ident.getURI());
+			param.setFeatureName(attributeList.get(n).getName());
+			param.setInitialValue(startList.get(n));
+			param.setStep(stepList.get(n));
+			param.setLowerBound(minList.get(n));
+			param.setUpperBound(maxList.get(n));
+			
+			autoExperiment.getParameters().add(param);
+			++n;
+		}
+		return autoExperiment;
+	}
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditorAdapter.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditorAdapter.java
new file mode 100644
index 0000000..4de0fdd
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditorAdapter.java
@@ -0,0 +1,17 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.swt.events.ModifyListener;
+
+public class AutomaticExperimentCompositeEditorAdapter extends
+		AlgorithmCompositeEditorAdapter {
+
+	@Override
+	public AlgorithmCompositeEditor createCompositeEditor(
+			AlgorithmControl algControl, int style,
+			ModifyListener projectValidator, IProject project) {
+		// TODO Auto-generated method stub
+		return new AutomaticExperimentCompositeEditor(algControl, style, projectValidator, project);
+	}
+
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditorAdapterFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditorAdapterFactory.java
new file mode 100644
index 0000000..956109b
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/AutomaticExperimentCompositeEditorAdapterFactory.java
@@ -0,0 +1,34 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.stem.analysis.automaticexperiment.util.AutomaticexperimentAdapterFactory;
+
+public class AutomaticExperimentCompositeEditorAdapterFactory extends
+		AutomaticexperimentAdapterFactory implements
+		AlgorithmCompositeEditorAdapterFactory {
+
+	/**
+	 * 
+	 */
+	public AutomaticExperimentCompositeEditorAdapterFactory() {
+		super();
+		AlgorithmCompositeEditorAdapterFactoryImpl.INSTANCE
+				.addAdapterFactory(this);
+	}
+
+	/**
+	 * 
+	 */
+	@Override
+	public Adapter createAutomaticExperimentAdapter() {
+		return new AutomaticExperimentCompositeEditorAdapter();
+	}
+
+	/**
+	 * 
+	 */
+	public boolean isFactoryForType(Object type) {
+		return type == AlgorithmCompositeEditorAdapter.class
+				|| super.isFactoryForType(type);
+	}
+}
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/NewAutomaticExperimentWizard.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/NewAutomaticExperimentWizard.java
new file mode 100644
index 0000000..174ef3e
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/ui/NewAutomaticExperimentWizard.java
@@ -0,0 +1,307 @@
+package org.eclipse.stem.analysis.automaticexperiment.ui;

+

+/*******************************************************************************

+ * Copyright (c) 2008 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 java.util.ArrayList;

+

+import org.eclipse.core.commands.AbstractHandler;

+import org.eclipse.core.commands.ExecutionEvent;

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.commands.IHandler;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IConfigurationElement;

+import org.eclipse.core.runtime.IExtensionRegistry;

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.wizard.IWizardPage;

+import org.eclipse.jface.wizard.WizardDialog;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;

+import org.eclipse.stem.analysis.automaticexperiment.views.Messages;

+import org.eclipse.stem.core.STEMURI;

+import org.eclipse.stem.core.common.Identifiable;

+import org.eclipse.stem.core.experiment.ExperimentPackage;

+import org.eclipse.stem.ui.Activator;

+import org.eclipse.stem.ui.wizards.DublinCorePage;

+import org.eclipse.stem.ui.wizards.NewIdentifiablePage;

+import org.eclipse.stem.ui.wizards.NewIdentifiableWizard;

+import org.eclipse.stem.ui.wizards.NewSTEMProjectWizard;

+import org.eclipse.stem.ui.wizards.STEMWizardDialog;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.events.ModifyEvent;

+import org.eclipse.swt.events.ModifyListener;

+import org.eclipse.swt.layout.GridData;

+import org.eclipse.swt.layout.GridLayout;

+import org.eclipse.swt.widgets.Combo;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Label;

+import org.eclipse.swt.widgets.List;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.swt.widgets.Spinner;

+import org.eclipse.swt.widgets.Text;

+import org.eclipse.ui.IWorkbenchWindow;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.handlers.HandlerUtil;

+

+

+public class NewAutomaticExperimentWizard 

+	extends NewIdentifiableWizard {

+	

+	

+	public NewAutomaticExperimentWizard() {

+		// TODO Auto-generated constructor stub

+	}

+

+	/**

+	 * @see org.eclipse.stem.ui.wizards.NewIdentifiableWizard#addPages()

+	 */

+	@Override

+	public void addPages() {

+		setForcePreviousAndNextButtons(false);

+		newIdentifiablePage = createNewIdentifiablePage();

+		// Were we successful in creating the page?

+		if (newIdentifiablePage == null) {

+			// No

+			return;

+		}

+		newDublinCorePage = createDublinCorePage();

+		// Were we successful in creating the page?

+		if (newDublinCorePage == null) {

+			// No

+			return;

+		}

+		addPage(newIdentifiablePage);

+		addPage(newDublinCorePage);

+	}

+

+	/**

+	 * @see org.eclipse.stem.ui.wizards.NewIdentifiableWizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)

+	 */

+	@Override

+	public IWizardPage getNextPage(IWizardPage page) {

+		final IWizardPage nextPage = super.getNextPage(page);

+		return nextPage;

+	}

+

+	@Override

+	protected DublinCorePage createDublinCorePage() {

+		return new DublinCorePage() {

+			/**

+			 * @see org.eclipse.stem.ui.wizards.NewIdentifiableWizard.DublinCorePage#initializeDCFields()

+			 */

+			@SuppressWarnings("nls")

+			@Override

+			protected void initializeDCAttributes() {

+				super.initializeDCAttributes();

+				format.setText(ExperimentPackage.eNS_URI);

+				format.setEnabled(false);

+				type.setText(STEMURI.EXPERIMENT_TYPE_URI.toString());

+				type.setEnabled(false);

+				

+

+				titleTextField.setText(Messages.getString("dc_title_a_exp"));

+				source.setText(Messages.getString("dc_source_a_exp"));

+				descriptionTextField.setText(Messages.getString("dc_desc_a_exp"));

+						

+			}

+		};

+	}

+

+	@Override

+	protected Identifiable createIdentifiable() {

+		return createAutomaticExperiment();

+	}

+	NewAutomaticExperimentPage page;

+	

+	@Override

+	protected NewIdentifiablePage createNewIdentifiablePage() {

+		this.setHelpContextId("org.eclipse.stem.doc.newautomaticexp_contextid");

+		page = new NewAutomaticExperimentPage(getShell(), "New Automatic Experiment Wizard"); //$NON-NLS-1$

+		page.setTitle(""); //$NON-NLS-1$

+		return page;

+	}

+	

+

+	@Override

+	protected String getSerializationFileNameExtension() {

+		return AutomaticexperimentPackage.eNAME;

+	}

+

+	@Override

+	protected String getSerializationFolderName() {

+		return NewSTEMProjectWizard.EXPERIMENTS_FOLDER_NAME;

+	}

+

+	@Override

+	protected String getWizardTitle() {

+		// TODO Externalise this string

+		return "Automatic Experiment Wizard";

+	}

+	

+	protected OptimizerAlgorithm createAutomaticExperiment() {

+		OptimizerAlgorithm ret = page.algControl.createAutomaticExperiment();

+		ret.setDublinCore(newDublinCorePage.createDublinCore());

+		return ret;

+	}

+	

+	

+	

+	protected static class NewAutomaticExperimentPage extends NewIdentifiablePage {

+		

+		public List parametersList = null;

+		public Combo algorithmCombo = null;		

+		public Combo errorFunctionCombo = null;

+		public Spinner numOfIterationsSpinner = null;

+		public Text refDirText = null;

+		public Text scenarioText = null;

+		protected Shell shell = null;

+//		public NewAutomaticExperimentPage2 page2 = null;

+		

+		AlgorithmControl algControl;

+		

+		/**

+		 * @param pageName

+		 *            the name of the page

+		 */

+		protected NewAutomaticExperimentPage(final Shell shell, final String pageName) {

+			super(pageName);

+			this.shell = shell;

+//			page2 = new NewAutomaticExperimentPage2("Page 2");

+//			page2.setPreviousPage(this);

+		}

+

+		protected ModifyListener projectValidator = new ModifyListener() {

+			public void modifyText(@SuppressWarnings("unused") final ModifyEvent e) {

+				setPageComplete(validatePage());

+			}

+		};

+		/**

+		 * @see org.eclipse.stem.ui.wizards.NewIdentifiablePage#createSpecificComposite(org.eclipse.swt.widgets.Composite)

+		 */

+		@Override

+		protected Composite createSpecificComposite(Composite parent) {

+			

+			PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.stem.doc.newautomaticexp_contextid");

+			

+			final Composite composite = new Composite(parent, SWT.NONE);

+			final GridLayout gridLayout = new GridLayout();

+			gridLayout.numColumns = 2;

+			composite.setLayout(gridLayout);

+			

+			final Label label21 = new Label(composite, SWT.NONE);

+			label21.setText((Messages.getString("WIZ.ALGORITHM")));					

+			algorithmCombo = new Combo(composite, SWT.READ_ONLY);

+			initializeAlgorithmsCombo();

+			GridData gridData21 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);

+			gridData21.horizontalSpan = 1;

+			algorithmCombo.setLayoutData(gridData21);

+

+			GridData gridDataCombo = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);

+			gridDataCombo.horizontalSpan = 1;

+			algorithmCombo.setLayoutData(gridDataCombo);

+

+			Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);

+			GridData sepData = new GridData(SWT.FILL, SWT.TOP, true, false);

+			sepData.horizontalSpan = 2;

+			separator.setLayoutData(sepData);

+

+			algControl = new AlgorithmControl(composite, SWT.NONE, projectValidator, this.getSelectedProject(), algorithms);

+			

+			GridData gridDataAControl = new GridData(SWT.FILL,SWT.CENTER, true, false, 2, 1);

+//			gridDataAControl.horizontalAlignment = 2;

+			algControl.setLayoutData(gridDataAControl);

+							

+			return composite;

+		}

+		

+		private OptimizerAlgorithm[] algorithms;

+		

+		private void initializeAlgorithmsCombo() {

+			

+			final IExtensionRegistry registry = Platform.getExtensionRegistry();

+			final IConfigurationElement[] algorithmsConfigElements = registry

+					.getConfigurationElementsFor(org.eclipse.stem.analysis.automaticexperiment.Constants.ID_ALGORITHM_EXTENSION_POINT);

+

+				final java.util.List<Identifiable> temp = new ArrayList<Identifiable>();

+

+				algorithms = new OptimizerAlgorithm[algorithmsConfigElements.length];

+

+				for (int i = 0; i < algorithmsConfigElements.length; i++) {

+					final IConfigurationElement element = algorithmsConfigElements[i];

+					// Does the element specify the class of the disease model?

+					if (element.getName().equals(org.eclipse.stem.analysis.automaticexperiment.Constants.ALGORITHM_ELEMENT)) {

+						// Yes

+						try {

+							temp.add((OptimizerAlgorithm) element

+									.createExecutableExtension(Messages.getString("ALG.1"))); //$NON-NLS-1$

+						} catch (final CoreException e) {

+							Activator.logError(

+									Messages.getString("ALG.3"), e); //$NON-NLS-1$

+						}

+					} // if

+				} // for each configuration element

+

+				algorithms = temp.toArray(new OptimizerAlgorithm[] {});

+		

+

+			for(int i=0;i<algorithms.length;++i)

+				algorithmCombo.add(algorithms[i].eClass().getName());

+			algorithmCombo.select(0);

+		}

+

+

+

+		/**

+		 * @see org.eclipse.stem.ui.wizards.NewIdentifiablePage#validatePage()

+		 */

+		@Override

+		protected boolean validatePage() {

+			boolean retValue = super.validatePage();

+			if(retValue) {

+				setErrorMessage(null);

+				retValue = algControl.validate();

+				// Error?

+				if (!retValue) {

+					// Yes

+					setErrorMessage(algControl.getErrorMessage());

+				} // if

+				

+			}

+			return retValue;

+		}

+		

+	}

+	

+	

+	/**

+	 * This class is a {@link IHandler} for the command that creates a

+	 * {@link NewAutomaticExperimentWizard}

+	 */

+	public static class NewAutomaticExperimentWizardCommandHandler extends AbstractHandler

+			implements IHandler {

+

+		/**

+		 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)

+		 */

+		public Object execute(final ExecutionEvent executionEvent)

+				throws ExecutionException {

+			final IWorkbenchWindow window = HandlerUtil

+					.getActiveWorkbenchWindowChecked(executionEvent);

+			final NewAutomaticExperimentWizard wizard = new NewAutomaticExperimentWizard();

+			wizard.init(window.getWorkbench(), StructuredSelection.EMPTY);

+			final WizardDialog wizardDialog = new STEMWizardDialog(window

+					.getShell(), wizard);

+			wizardDialog.open();

+			return null;

+		} // execute

+	}

+}

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/util/AutomaticexperimentAdapterFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/util/AutomaticexperimentAdapterFactory.java
new file mode 100644
index 0000000..3166978
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/util/AutomaticexperimentAdapterFactory.java
@@ -0,0 +1,203 @@
+package org.eclipse.stem.analysis.automaticexperiment.util;

+

+/*******************************************************************************

+ * 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.emf.common.notify.Adapter;

+import org.eclipse.emf.common.notify.Notifier;

+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;

+import org.eclipse.stem.core.common.Identifiable;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * The <b>Adapter Factory</b> for the model.

+ * It provides an adapter <code>createXXX</code> method for each class of the model.

+ * <!-- end-user-doc -->

+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage

+ * @generated

+ */

+public class AutomaticexperimentAdapterFactory extends AdapterFactoryImpl {

+	/**

+	 * The cached model package.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected static AutomaticexperimentPackage modelPackage;

+

+	/**

+	 * Creates an instance of the adapter factory.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentAdapterFactory() {

+		if (modelPackage == null) {

+			modelPackage = AutomaticexperimentPackage.eINSTANCE;

+		}

+	}

+

+	/**

+	 * Returns whether this factory is applicable for the type of the object.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.

+	 * <!-- end-user-doc -->

+	 * @return whether this factory is applicable for the type of the object.

+	 * @generated

+	 */

+	@Override

+	public boolean isFactoryForType(Object object) {

+		if (object == modelPackage) {

+			return true;

+		}

+		if (object instanceof EObject) {

+			return ((EObject)object).eClass().getEPackage() == modelPackage;

+		}

+		return false;

+	}

+

+	/**

+	 * The switch that delegates to the <code>createXXX</code> methods.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected AutomaticexperimentSwitch<Adapter> modelSwitch =

+		new AutomaticexperimentSwitch<Adapter>() {

+			@Override

+			public Adapter caseAutomaticExperiment(AutomaticExperiment object) {

+				return createAutomaticExperimentAdapter();

+			}

+			@Override

+			public Adapter caseModifiableParameter(ModifiableParameter object) {

+				return createModifiableParameterAdapter();

+			}

+			@Override

+			public Adapter caseOptimizerAlgorithm(OptimizerAlgorithm object) {

+				return createOptimizerAlgorithmAdapter();

+			}

+			@Override

+			public <T> Adapter caseComparable(Comparable<T> object) {

+				return createComparableAdapter();

+			}

+			@Override

+			public Adapter caseIdentifiable(Identifiable object) {

+				return createIdentifiableAdapter();

+			}

+			@Override

+			public Adapter defaultCase(EObject object) {

+				return createEObjectAdapter();

+			}

+		};

+

+	/**

+	 * Creates an adapter for the <code>target</code>.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @param target the object to adapt.

+	 * @return the adapter for the <code>target</code>.

+	 * @generated

+	 */

+	@Override

+	public Adapter createAdapter(Notifier target) {

+		return modelSwitch.doSwitch((EObject)target);

+	}

+

+

+	/**

+	 * Creates a new adapter for an object of class '{@link org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment <em>Automatic Experiment</em>}'.

+	 * <!-- begin-user-doc -->

+	 * This default implementation returns null so that we can easily ignore cases;

+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.

+	 * <!-- end-user-doc -->

+	 * @return the new adapter.

+	 * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment

+	 * @generated

+	 */

+	public Adapter createAutomaticExperimentAdapter() {

+		return null;

+	}

+

+	/**

+	 * Creates a new adapter for an object of class '{@link org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter <em>Modifiable Parameter</em>}'.

+	 * <!-- begin-user-doc -->

+	 * This default implementation returns null so that we can easily ignore cases;

+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.

+	 * <!-- end-user-doc -->

+	 * @return the new adapter.

+	 * @see org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter

+	 * @generated

+	 */

+	public Adapter createModifiableParameterAdapter() {

+		return null;

+	}

+

+	/**

+	 * Creates a new adapter for an object of class '{@link org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm <em>Optimizer Algorithm</em>}'.

+	 * <!-- begin-user-doc -->

+	 * This default implementation returns null so that we can easily ignore cases;

+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.

+	 * <!-- end-user-doc -->

+	 * @return the new adapter.

+	 * @see org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm

+	 * @generated

+	 */

+	public Adapter createOptimizerAlgorithmAdapter() {

+		return null;

+	}

+

+	/**

+	 * Creates a new adapter for an object of class '{@link java.lang.Comparable <em>Comparable</em>}'.

+	 * <!-- begin-user-doc -->

+	 * This default implementation returns null so that we can easily ignore cases;

+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.

+	 * <!-- end-user-doc -->

+	 * @return the new adapter.

+	 * @see java.lang.Comparable

+	 * @generated

+	 */

+	public Adapter createComparableAdapter() {

+		return null;

+	}

+

+	/**

+	 * Creates a new adapter for an object of class '{@link org.eclipse.stem.core.common.Identifiable <em>Identifiable</em>}'.

+	 * <!-- begin-user-doc -->

+	 * This default implementation returns null so that we can easily ignore cases;

+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.

+	 * <!-- end-user-doc -->

+	 * @return the new adapter.

+	 * @see org.eclipse.stem.core.common.Identifiable

+	 * @generated

+	 */

+	public Adapter createIdentifiableAdapter() {

+		return null;

+	}

+

+	/**

+	 * Creates a new adapter for the default case.

+	 * <!-- begin-user-doc -->

+	 * This default implementation returns null.

+	 * <!-- end-user-doc -->

+	 * @return the new adapter.

+	 * @generated

+	 */

+	public Adapter createEObjectAdapter() {

+		return null;

+	}

+

+} //AutomaticexperimentAdapterFactory

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/util/AutomaticexperimentSwitch.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/util/AutomaticexperimentSwitch.java
new file mode 100644
index 0000000..c3c2e47
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/util/AutomaticexperimentSwitch.java
@@ -0,0 +1,216 @@
+package org.eclipse.stem.analysis.automaticexperiment.util;

+

+/*******************************************************************************

+ * 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 java.util.List;

+

+import org.eclipse.emf.ecore.EClass;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperiment;

+import org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage;

+import org.eclipse.stem.analysis.automaticexperiment.ModifiableParameter;

+import org.eclipse.stem.analysis.automaticexperiment.OptimizerAlgorithm;

+import org.eclipse.stem.core.common.Identifiable;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * The <b>Switch</b> for the model's inheritance hierarchy.

+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}

+ * to invoke the <code>caseXXX</code> method for each class of the model,

+ * starting with the actual class of the object

+ * and proceeding up the inheritance hierarchy

+ * until a non-null result is returned,

+ * which is the result of the switch.

+ * <!-- end-user-doc -->

+ * @see org.eclipse.stem.analysis.automaticexperiment.AutomaticexperimentPackage

+ * @generated

+ */

+public class AutomaticexperimentSwitch<T1> {

+	/**

+	 * The cached model package

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected static AutomaticexperimentPackage modelPackage;

+

+	/**

+	 * Creates an instance of the switch.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public AutomaticexperimentSwitch() {

+		if (modelPackage == null) {

+			modelPackage = AutomaticexperimentPackage.eINSTANCE;

+		}

+	}

+

+	/**

+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return the first non-null result returned by a <code>caseXXX</code> call.

+	 * @generated

+	 */

+	public T1 doSwitch(EObject theEObject) {

+		return doSwitch(theEObject.eClass(), theEObject);

+	}

+

+	/**

+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return the first non-null result returned by a <code>caseXXX</code> call.

+	 * @generated

+	 */

+	protected T1 doSwitch(EClass theEClass, EObject theEObject) {

+		if (theEClass.eContainer() == modelPackage) {

+			return doSwitch(theEClass.getClassifierID(), theEObject);

+		}

+		else {

+			List<EClass> eSuperTypes = theEClass.getESuperTypes();

+			return

+				eSuperTypes.isEmpty() ?

+					defaultCase(theEObject) :

+					doSwitch(eSuperTypes.get(0), theEObject);

+		}

+	}

+

+	/**

+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return the first non-null result returned by a <code>caseXXX</code> call.

+	 * @generated

+	 */

+	protected T1 doSwitch(int classifierID, EObject theEObject) {

+		switch (classifierID) {

+			case AutomaticexperimentPackage.AUTOMATIC_EXPERIMENT: {

+				AutomaticExperiment automaticExperiment = (AutomaticExperiment)theEObject;

+				T1 result = caseAutomaticExperiment(automaticExperiment);

+				if (result == null) result = caseOptimizerAlgorithm(automaticExperiment);

+				if (result == null) result = caseIdentifiable(automaticExperiment);

+				if (result == null) result = caseComparable(automaticExperiment);

+				if (result == null) result = defaultCase(theEObject);

+				return result;

+			}

+			case AutomaticexperimentPackage.MODIFIABLE_PARAMETER: {

+				ModifiableParameter modifiableParameter = (ModifiableParameter)theEObject;

+				T1 result = caseModifiableParameter(modifiableParameter);

+				if (result == null) result = defaultCase(theEObject);

+				return result;

+			}

+			case AutomaticexperimentPackage.OPTIMIZER_ALGORITHM: {

+				OptimizerAlgorithm optimizerAlgorithm = (OptimizerAlgorithm)theEObject;

+				T1 result = caseOptimizerAlgorithm(optimizerAlgorithm);

+				if (result == null) result = caseIdentifiable(optimizerAlgorithm);

+				if (result == null) result = caseComparable(optimizerAlgorithm);

+				if (result == null) result = defaultCase(theEObject);

+				return result;

+			}

+			default: return defaultCase(theEObject);

+		}

+	}

+

+	/**

+	 * Returns the result of interpreting the object as an instance of '<em>Automatic Experiment</em>'.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns null;

+	 * returning a non-null result will terminate the switch.

+	 * <!-- end-user-doc -->

+	 * @param object the target of the switch.

+	 * @return the result of interpreting the object as an instance of '<em>Automatic Experiment</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)

+	 * @generated

+	 */

+	public T1 caseAutomaticExperiment(AutomaticExperiment object) {

+		return null;

+	}

+

+	/**

+	 * Returns the result of interpreting the object as an instance of '<em>Modifiable Parameter</em>'.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns null;

+	 * returning a non-null result will terminate the switch.

+	 * <!-- end-user-doc -->

+	 * @param object the target of the switch.

+	 * @return the result of interpreting the object as an instance of '<em>Modifiable Parameter</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)

+	 * @generated

+	 */

+	public T1 caseModifiableParameter(ModifiableParameter object) {

+		return null;

+	}

+

+	/**

+	 * Returns the result of interpreting the object as an instance of '<em>Optimizer Algorithm</em>'.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns null;

+	 * returning a non-null result will terminate the switch.

+	 * <!-- end-user-doc -->

+	 * @param object the target of the switch.

+	 * @return the result of interpreting the object as an instance of '<em>Optimizer Algorithm</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)

+	 * @generated

+	 */

+	public T1 caseOptimizerAlgorithm(OptimizerAlgorithm object) {

+		return null;

+	}

+

+	/**

+	 * Returns the result of interpreting the object as an instance of '<em>Comparable</em>'.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns null;

+	 * returning a non-null result will terminate the switch.

+	 * <!-- end-user-doc -->

+	 * @param object the target of the switch.

+	 * @return the result of interpreting the object as an instance of '<em>Comparable</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)

+	 * @generated

+	 */

+	public <T> T1 caseComparable(Comparable<T> object) {

+		return null;

+	}

+

+	/**

+	 * Returns the result of interpreting the object as an instance of '<em>Identifiable</em>'.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns null;

+	 * returning a non-null result will terminate the switch.

+	 * <!-- end-user-doc -->

+	 * @param object the target of the switch.

+	 * @return the result of interpreting the object as an instance of '<em>Identifiable</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)

+	 * @generated

+	 */

+	public T1 caseIdentifiable(Identifiable object) {

+		return null;

+	}

+

+	/**

+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.

+	 * <!-- begin-user-doc -->

+	 * This implementation returns null;

+	 * returning a non-null result will terminate the switch, but this is the last case anyway.

+	 * <!-- end-user-doc -->

+	 * @param object the target of the switch.

+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)

+	 * @generated

+	 */

+	public T1 defaultCase(EObject object) {

+		return null;

+	}

+

+} //AutomaticexperimentSwitch

diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AggregateTimeSeriesCanvas.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AggregateTimeSeriesCanvas.java
new file mode 100644
index 0000000..c0968ed
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AggregateTimeSeriesCanvas.java
@@ -0,0 +1,1277 @@
+package org.eclipse.stem.analysis.automaticexperiment.views;
+
+/*******************************************************************************
+ * Copyright (c) 2007 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.birt.chart.device.IDeviceRenderer;
+import org.eclipse.birt.chart.exception.ChartException;
+import org.eclipse.birt.chart.factory.Generator;
+import org.eclipse.birt.chart.model.Chart;
+import org.eclipse.birt.chart.model.ChartWithAxes;
+import org.eclipse.birt.chart.model.attribute.Anchor;
+import org.eclipse.birt.chart.model.attribute.AxisType;
+import org.eclipse.birt.chart.model.attribute.Bounds;
+import org.eclipse.birt.chart.model.attribute.ColorDefinition;
+import org.eclipse.birt.chart.model.attribute.IntersectionType;
+import org.eclipse.birt.chart.model.attribute.LineAttributes;
+import org.eclipse.birt.chart.model.attribute.LineStyle;
+import org.eclipse.birt.chart.model.attribute.Position;
+import org.eclipse.birt.chart.model.attribute.TickStyle;
+import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl;
+import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl;
+import org.eclipse.birt.chart.model.component.Axis;
+import org.eclipse.birt.chart.model.component.Series;
+import org.eclipse.birt.chart.model.component.impl.SeriesImpl;
+import org.eclipse.birt.chart.model.data.NumberDataSet;
+import org.eclipse.birt.chart.model.data.SeriesDefinition;
+import org.eclipse.birt.chart.model.data.impl.NumberDataElementImpl;
+import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl;
+import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;
+import org.eclipse.birt.chart.model.impl.ChartWithAxesImpl;
+import org.eclipse.birt.chart.model.layout.Legend;
+import org.eclipse.birt.chart.model.layout.Plot;
+import org.eclipse.birt.chart.model.type.LineSeries;
+import org.eclipse.birt.chart.model.type.ScatterSeries;
+import org.eclipse.birt.chart.model.type.impl.ScatterSeriesImpl;
+import org.eclipse.birt.chart.util.PluginSettings;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.stem.analysis.automaticexperiment.Activator;
+import org.eclipse.stem.ui.adapters.color.STEMColor;
+import org.eclipse.stem.ui.preferences.VisualizationPreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWorkbenchActionConstants;
+
+/**
+ * AggregateTimeSeriesCanvas is a subclass of {@link Canvas} suitable for chart drawings.
+ */
+public class AggregateTimeSeriesCanvas extends Canvas {
+
+	protected IDeviceRenderer idr = null;
+
+	/**
+	 * This is the {@link Chart} that plots the relative values.
+	 */
+	protected Chart cm = null;
+
+	/**
+	 * The provider of relative values.
+	 */
+	//private RelativeValueHistoryProvider rvhp;
+
+	private AnalysisControl control = null;
+	
+	/**
+	 * the index of this Chart
+	 */
+	private int chartIndex = 0;
+	
+
+	/**
+	 * some extra colors
+	 */
+	protected static final ColorDefinition[] colorDefault = {
+															ColorDefinitionImpl.RED(), 
+															ColorDefinitionImpl.GREEN(), 
+															ColorDefinitionImpl.BLUE(), 
+															ColorDefinitionImpl.BLACK(), 
+															ColorDefinitionImpl.GREY(),
+															ColorDefinitionImpl.CYAN(),
+															ColorDefinitionImpl.ORANGE() 
+															};
+	/**
+	 * used if we need to overlay traces in different colors
+	 */
+	private boolean overlayMode = false;
+	
+	
+
+	/**
+	 * A context menu for this view
+	 */
+	Menu popUpMenu = null;
+	
+	/**
+	 * set y axis to a linear scale
+	 */
+	private LinearScaleAction linearTimeAction;
+	/**
+	 * set y axis to a log scale
+	 */
+	private LogScaleAction logTimeAction;
+	protected boolean useLinearTimeScale = true;
+	
+
+	/**
+	 * show the legend (true by default)
+	 */
+	private LegendViewAction viewLegend;
+
+	/**
+	 * hide the legend 
+	 */
+	private LegendHideAction hideLegend;
+	protected boolean showLegend = true;
+
+	protected Legend legend = null;
+	
+
+	/**
+	 * this is a map of the DataSeries object (keyed by property name)
+	 */
+	protected final Map<String,DataSeries> dataSeriesMap = new HashMap<String,DataSeries>();
+	
+	/**
+	 * Keep track of which timeseries are visible
+	 */
+	
+	protected Map<String, Boolean>visibleMap =  new HashMap<String,Boolean>();
+
+
+	/**
+	 * These are the cycle numbers that match the relative values that will be
+	 * plotted
+	 * 
+	 * @see #relativeValues
+	 */
+	private final List<Double> cycleNumbers = new ArrayList<Double>();
+
+	/**
+	 * Chart generator instance (reference to a singleton)
+	 */
+	Generator gr;
+
+	Axis yAxisPrimary;
+	Axis xAxisPrimary;
+	/**
+	 * the maxY value for scaling
+	 */
+	double maxY = -1.0;
+
+	/**
+	 * Log of zero is negative infinity so for each location we will cut off the minimum 
+	 * at the min NONZERO Y value
+	 */
+	private double minYscale = 1.0;
+	
+	
+	/**
+	 * Label for line series LEGEND
+	 */
+	public String Ordinate_LEGEND = "Y";
+	
+	/**
+	 * Label for line series Y axis label
+	 **/
+	public String Ordinate_AXIS = "Y";
+	
+
+	/**
+	 * Label for line series X axis label
+	 **/
+	public String X_AXIS = "X";
+	
+	/** 
+	 * customizable color definitions
+	 */
+	private ColorDefinition foreGround = ColorDefinitionImpl.WHITE();
+	private ColorDefinition backgroundGround = ColorDefinitionImpl.BLACK();
+	private ColorDefinition frameColor = ColorDefinitionImpl.create(180, 180, 200);
+
+	Image imgChart = null;
+	
+	/**
+	 * This Constructor is used when we want to place the time series in a container
+	 * which is a sub component of the actual AnalysisControl
+	 * @param analysisControl 
+	 * 
+	 * @param parent  the SWT parent of the {@link Widget}
+	 * @param ordinateString 
+	 * @param yAxisLabel 
+	 * @param xAxisLabel
+	 * @param foreground 
+	 * @param background 
+	 * @param framecolor 
+	 * @param chartIndex the index of this chart (0 if only one)
+	 * @param overlayMode used if we need to overlay traces in different colors
+	 */
+	public AggregateTimeSeriesCanvas(final AnalysisControl analysisControl, final Composite parent, 
+			final String ordinateString, 
+			final String yAxisLabel, 
+			final String xAxisLabel,
+			final String firstProperty,
+			ColorDefinition foreground,
+			ColorDefinition background,
+			ColorDefinition framecolor,
+			int chartIndex,
+			boolean overlayMode	) {
+		super(parent, SWT.DOUBLE_BUFFERED | SWT.BORDER);
+		Ordinate_LEGEND = ordinateString;
+		Ordinate_AXIS = yAxisLabel;
+		X_AXIS = xAxisLabel;
+		foreGround 			= foreground;
+		backgroundGround 	= background;
+		frameColor 			= framecolor;
+		this.chartIndex = chartIndex;
+		this.overlayMode = overlayMode;
+		
+		gr = Generator.instance();
+
+		try {
+			idr = PluginSettings.instance().getDevice("dv.SWT"); //$NON-NLS-1$			
+		} catch (final ChartException pex) {
+			Activator.logError("Problem initializing chart", pex); //$NON-NLS-1$
+			return;
+		}
+
+		control = analysisControl;
+
+		
+		cm = createSimpleLineChart(firstProperty, dataSeriesMap, cycleNumbers, Messages
+				.getString("CC.title")); //$NON-NLS-1$
+		
+		resetData();
+		addPaintListener(new PaintListener() {
+			public void paintControl(final PaintEvent pe) {
+
+				final Composite source = (Composite) pe.getSource();
+				final org.eclipse.swt.graphics.Rectangle d = source
+						.getClientArea();
+
+				if(imgChart != null) imgChart.dispose();
+				imgChart = new Image(source.getDisplay(), d);
+				
+				idr.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, new GC(
+						imgChart));
+				final Bounds bounds = BoundsImpl.create(d.x, d.y, d.width,
+						d.height);
+				bounds.scale(72d / idr.getDisplayServer().getDpiResolution());
+				// BOUNDS MUST BE SPECIFIED IN POINTS
+
+				try {
+					gr.render(idr, gr.build(idr.getDisplayServer(), cm, bounds,
+							null, null, null));
+					pe.gc.drawImage(imgChart, d.x, d.y);
+				} catch (final ChartException ce) {
+					Activator.logError("Problem rendering chart", ce); //$NON-NLS-1$
+				}
+			} // paintControl
+		} // PaintListener
+		);
+		
+		//Create a context menu for the canvas
+		createContextMenu(this);
+		
+
+	} // AggregateTimeSeriesCanvas
+	/**
+	 * Constructor.
+	 * 
+	 * @param parent  the SWT parent of the {@link Widget}
+	 * @param ordinateString 
+	 * @param yAxisLabel 
+	 * @param xAxisLabel
+	 * @param foreground 
+	 * @param background 
+	 * @param framecolor 
+	 * @param chartIndex the index of this chart (0 if only one)
+	 *  
+	 */
+	public AggregateTimeSeriesCanvas(final Composite parent, 
+			final String ordinateString, 
+			final String yAxisLabel, 
+			final String xAxisLabel,
+			final String firstProperty,
+			ColorDefinition foreground,
+			ColorDefinition background,
+			ColorDefinition framecolor,
+			int chartIndex) {
+		super(parent, SWT.DOUBLE_BUFFERED | SWT.BORDER);
+		Ordinate_LEGEND = ordinateString;
+		Ordinate_AXIS = yAxisLabel;
+		X_AXIS = xAxisLabel;
+		foreGround 			= foreground;
+		backgroundGround 	= background;
+		frameColor 			= framecolor;
+		this.chartIndex = chartIndex;
+		
+		gr = Generator.instance();
+
+		try {
+			idr = PluginSettings.instance().getDevice("dv.SWT"); //$NON-NLS-1$			
+		} catch (final ChartException pex) {
+			Activator.logError("Problem initializing chart", pex); //$NON-NLS-1$
+			return;
+		}
+
+		control = (AnalysisControl) parent;
+
+		
+		cm = createSimpleLineChart(firstProperty, dataSeriesMap, cycleNumbers, Messages
+				.getString("CC.title")); //$NON-NLS-1$
+		
+		resetData();
+		
+		addPaintListener(new PaintListener() {
+			public void paintControl(final PaintEvent pe) {
+				
+				final Composite source = (Composite) pe.getSource();
+				final org.eclipse.swt.graphics.Rectangle d = source
+						.getClientArea();
+
+				if(imgChart != null) imgChart.dispose();
+				imgChart = new Image(source.getDisplay(), d);
+				idr.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, new GC(
+						imgChart));
+				final Bounds bounds = BoundsImpl.create(d.x, d.y, d.width,
+						d.height);
+				bounds.scale(72d / idr.getDisplayServer().getDpiResolution());
+				// BOUNDS MUST BE SPECIFIED IN POINTS
+
+				try {
+					gr.render(idr, gr.build(idr.getDisplayServer(), cm, bounds,
+							null, null, null));
+					pe.gc.drawImage(imgChart, d.x, d.y);
+				} catch (final ChartException ce) {
+					Activator.logError("Problem rendering chart", ce); //$NON-NLS-1$
+				}
+			} // paintControl
+		} // PaintListener
+		);
+		
+		//Create a context menu for the canvas
+		createContextMenu(this);
+		
+
+	} // AggregateTimeSeriesCanvas
+
+	
+	
+	/**
+	 * The method which gets the {@link AggregateTimeSeriesCanvas}' reports list, and
+	 * draws it on the {@link AggregateTimeSeriesCanvas}.
+	 * @return integratedDifference for each line series
+	 * 
+	 */
+	public void draw() {
+		
+		//clearData();
+		resetData();
+		yAxisPrimary.getSeriesDefinitions().clear();
+		
+		// get the number of lines to plot for this type of chart
+		int maxLines = control.getNumProperties(chartIndex);
+	
+		// add all the rest of the line series now
+		for (int i = 0; i < maxLines; i ++) {
+			String property = control.getProperty(chartIndex,i);
+			
+			if(!dataSeriesMap.containsKey(property)) {
+				// new property
+				DataSeries series = new DataSeries(property, i, overlayMode);
+				if(visibleMap.containsKey(property))
+						series.setVisible(visibleMap.get(property));
+				else {
+					series.setVisible(true);
+					visibleMap.put(property, true);
+				}
+				
+				dataSeriesMap.put(property, series);
+			}
+			DataSeries series = dataSeriesMap.get(property);
+			series.show();
+			
+		}
+		
+		// update the context menu with the new properties to plot
+		//updateContextMenu(this);
+		
+		maxY = -1.0;
+		
+			boolean setCycles = false;
+			// Get the values for the property to be plotted
+			int maxPoints = 0;
+			
+			for (int i = 0; i < maxLines; i++) {
+				String property = control.getProperty(chartIndex,i);
+				double[] doubleValues = control.getValues(chartIndex,i);
+				if(doubleValues==null) {
+					doubleValues = new double[0];
+					//doubleValues[0] = 0;
+				}
+				DataSeries series = dataSeriesMap.get(property);
+				
+				if(dataSeriesMap.get(property).isVisible() == true) { 
+					for (int j = 0; j < doubleValues.length; j++) {
+						
+						
+						if(doubleValues[j] <= minYscale) {
+							if(doubleValues[j] > 0.0) minYscale = doubleValues[j];
+						}
+						
+						if(doubleValues[j] >= maxY) {
+							maxY = doubleValues[j];
+							double log = Math.floor(Math.log10(maxY));
+							double adjustedMax = (Math.ceil(maxY/Math.pow(10, log)))*Math.pow(10, log);
+						    if(adjustedMax <= 1.0) adjustedMax = 1.0;
+						    //adjustedMax = maxY*100.0;
+						    //adjustedMax += 1.0;
+						    //int mx = (int)adjustedMax;
+						    //adjustedMax = ((double)mx)/100.0;
+							if (useLinearTimeScale) {
+								yAxisPrimary.getScale().setMax(NumberDataElementImpl.create(adjustedMax));
+								double step = adjustedMax / 10.0;
+								yAxisPrimary.getScale().setStep(step);
+							} else {
+								// keep 2 significant figures on scale axis
+								double ymax = Math.log(adjustedMax);
+								if(adjustedMax > 1.0) {
+									ymax += 0.499;
+									long imax = Math.round(ymax);
+									ymax = imax;
+								}
+								yAxisPrimary.getScale().setMax(NumberDataElementImpl.create(ymax));
+								double step = ymax/10.0;
+								yAxisPrimary.getScale().setStep(step);
+							}
+							
+							
+						}
+					}
+				} // is visible
+				
+					// Any values?
+					if (doubleValues.length > 0) {
+						if (maxPoints < doubleValues.length) {
+							maxPoints = doubleValues.length;
+						}
+						
+						for (int cycleNumber = 0; cycleNumber < doubleValues.length; cycleNumber++) {
+							
+							Double value;
+							double displayValue = doubleValues[cycleNumber];
+							if (displayValue <= minYscale) {
+								// Log(0.0) is negative infinity so for display purposes only
+								// we set the minimum axis value at 0.1/POPULATION
+								displayValue = minYscale;
+							}
+							if (useLinearTimeScale) {
+								value = new Double(displayValue);
+							} else {
+								value = new Double(Math.log(displayValue));
+							}
+							
+
+							series.addValue(value);
+							
+							// only do once for first line series
+							if (!setCycles) {
+								cycleNumbers.add((double)cycleNumber);	
+								}
+						} // for cycleNumber
+						
+						if(xAxisPrimary.getSeriesDefinitions().get(0).getSeries().size() != cycleNumbers.size()) {
+							// The number of data points have changed, create a new series for the x axis
+							xAxisPrimary.getSeriesDefinitions().clear();
+							final Series xAxisSeries = SeriesImpl.create();
+
+							final NumberDataSet xValues = NumberDataSetImpl.create(cycleNumbers);
+							xAxisSeries.setDataSet(xValues);
+							final SeriesDefinition sdX = SeriesDefinitionImpl.create();
+
+							xAxisPrimary.getSeriesDefinitions().add(sdX);
+							sdX.getSeries().add(xAxisSeries);
+						}
+							
+						
+						setCycles = true; // we set them only once
+						
+					} else {
+						//resetData();
+					}
+			} // for i properties
+
+
+		if (!this.isDisposed()) {
+			redraw();
+		}
+		
+		
+		//	control.updateMessage(ScenarioAnalysisSuite.WORKING_MSG);
+		
+	} // paintControl
+
+	/**
+	 * @param dataSeriesMap
+	 *            the {@link List} that will contain the relative values
+	 *            (0.0-1.0) to plot
+	 * @param cycleNumbers
+	 *            the {@link List} of simulation cycle numbers that match the
+	 *            relative values
+	 * @param seriesIdentifier
+	 *            the title of the chart
+	 * @return a <code>Chart</code>
+	 */
+	public final Chart createSimpleLineChart(
+			final String firstProperty,
+			final Map<String, DataSeries> dataSeriesMap,
+			final List<Double> cycleNumbers, final String seriesIdentifier) {
+		
+		final ChartWithAxes retValue = ChartWithAxesImpl.create();
+
+		
+		// Plot
+		retValue.getBlock().setBackground(frameColor);
+		final Plot p = retValue.getPlot();
+		p.getClientArea().setBackground(backgroundGround);
+
+		// Title
+		// cwaLine.getTitle( ).getLabel( ).getCaption( ).setValue( "Line Chart"
+		// );//$NON-NLS-1$
+		retValue.getTitle().setVisible(false);
+
+		// Legend
+		legend = retValue.getLegend();
+		final LineAttributes lia = legend.getOutline();
+		legend.getText().getFont().setSize(8);
+		lia.setStyle(LineStyle.SOLID_LITERAL);
+		legend.getInsets().set(10, 5, 0, 0);
+		legend.getOutline().setVisible(false);
+		legend.setAnchor(Anchor.NORTH_LITERAL);
+		legend.setPosition(Position.BELOW_LITERAL);
+		legend.getText().setColor(foreGround);
+		legend.getOutline().setColor(foreGround);
+		
+		// cwaLine.getLegend( ).getText().getFont().setSize(16);;
+		// cwaLine.getLegend( ).setVisible( true );
+
+		// /////////
+		// X-Axis
+		xAxisPrimary = retValue.getPrimaryBaseAxes()[0];
+		xAxisPrimary.setType(AxisType.TEXT_LITERAL);
+		xAxisPrimary.getMajorGrid().setTickStyle(TickStyle.BELOW_LITERAL);
+		xAxisPrimary.getOrigin().setType(IntersectionType.VALUE_LITERAL);
+		xAxisPrimary.getTitle().setVisible(false);
+		xAxisPrimary.getTitle().getCaption().getFont().setSize(9);
+		xAxisPrimary.getTitle().getCaption().setColor(foreGround);
+		xAxisPrimary.getLabel().getCaption().setColor(foreGround);
+
+		final Series xAxisSeries = SeriesImpl.create();
+
+		// new colors
+		xAxisSeries.getLabel().getCaption().setColor(foreGround);
+		xAxisSeries.getLabel().getOutline().setColor(foreGround);
+		//	
+
+		final NumberDataSet xValues = NumberDataSetImpl.create(cycleNumbers);
+		xAxisSeries.setDataSet(xValues);
+		final SeriesDefinition sdX = SeriesDefinitionImpl.create();
+
+		xAxisPrimary.getSeriesDefinitions().add(sdX);
+		sdX.getSeries().add(xAxisSeries);
+
+		// ////////
+		// Y-Axis
+		yAxisPrimary = retValue.getPrimaryOrthogonalAxis(xAxisPrimary);
+		yAxisPrimary.getMajorGrid().setTickStyle(TickStyle.LEFT_LITERAL);
+
+		// NumberDataSet[] orthoValues = new NumberDataSet[MAX_LINES];
+		// SeriesDefinition[] sdY = new SeriesDefinition[MAX_LINES];
+
+		// end Y-Series
+
+		xAxisPrimary.getScale().setMin(NumberDataElementImpl.create(0.0));
+		// xAxisPrimary.getScale( ).setMax( NumberDataElementImpl.create( 10.0 )
+		// );
+		// xAxisPrimary.getScale( ).setStep( 1 );
+		xAxisPrimary.getLabel().getCaption().getFont().setSize(9);
+		xAxisPrimary.getLabel().getCaption().setColor(foreGround);
+		xAxisPrimary.getTitle().setVisible(true);
+		xAxisPrimary.getTitle().getCaption().setValue(X_AXIS);
+
+		yAxisPrimary.getScale().setMin(NumberDataElementImpl.create(0.0));
+		yAxisPrimary.getScale().setMax(NumberDataElementImpl.create(1.0));
+		yAxisPrimary.getScale().setStep(0.25);
+		yAxisPrimary.getLabel().getCaption().getFont().setSize(9);
+		yAxisPrimary.getLabel().getCaption().setColor(foreGround);
+		yAxisPrimary.getTitle( ).getCaption( ).setValue( Ordinate_AXIS );
+		yAxisPrimary.getTitle( ).setVisible(true);
+		// yAxisPrimary.getMajorGrid().getLineAttributes().setColor(foreGround);
+		
+		// for now get ready to create only one line - we have no data yet.
+		// we will add more lines as we need them
+		// handle null
+		if(!dataSeriesMap.containsKey(firstProperty)) {
+			DataSeries series = new DataSeries(Messages.getString("AUTO.TITLE4"), 0, overlayMode);
+			dataSeriesMap.put(firstProperty, series);
+		}
+
+		return retValue;
+	} // createSimpleLineChart
+
+	
+	/**
+	 * Create the view's context menu and add the action handlers to it.
+	 */
+	protected void createContextMenu(final Composite parent) {
+
+		// Init a Context Menu Manager
+		final MenuManager contextMenuManager = new MenuManager();
+
+		// ---------------------------------------------------------------------
+
+		linearTimeAction = new LinearScaleAction();
+		logTimeAction = new LogScaleAction();
+		contextMenuManager.add(linearTimeAction);
+		contextMenuManager.add(logTimeAction);
+
+
+		
+		// Place Holder for Menu Additions
+		contextMenuManager.add(new Separator(
+				IWorkbenchActionConstants.MB_ADDITIONS));
+
+		// ---------------------------------------------------------------------
+		
+		viewLegend = new LegendViewAction();
+		hideLegend = new LegendHideAction();
+		contextMenuManager.add(viewLegend);
+		contextMenuManager.add(hideLegend);
+		
+		// ---------------------------------------------------------------------
+		
+		
+		// Place Holder for Menu Additions
+		contextMenuManager.add(new Separator(
+				IWorkbenchActionConstants.MB_ADDITIONS));
+
+		popUpMenu = contextMenuManager.createContextMenu(parent);
+
+		// Set the context menu for the viewer
+		parent.setMenu(popUpMenu);
+
+	} // createContextMenu
+	
+	/**
+	 * Update the view's context menu and add the action handlers to it.
+	 */
+	private void updateContextMenu(final Composite parent) {
+
+		popUpMenu.dispose();
+
+		// Init a Context Menu Manager
+		final MenuManager contextMenuManager = new MenuManager();
+
+		// ---------------------------------------------------------------------
+
+		linearTimeAction = new LinearScaleAction();
+		logTimeAction = new LogScaleAction();
+		contextMenuManager.add(linearTimeAction);
+		contextMenuManager.add(logTimeAction);
+		
+		// ---------------------------------------------------------------------
+
+
+		// Place Holder for Menu Additions
+		contextMenuManager.add(new Separator(
+				IWorkbenchActionConstants.MB_ADDITIONS));
+
+		// ---------------------------------------------------------------------
+		
+		viewLegend = new LegendViewAction();
+		hideLegend = new LegendHideAction();
+		contextMenuManager.add(viewLegend);
+		contextMenuManager.add(hideLegend);
+		
+		// ---------------------------------------------------------------------
+		
+		
+		// Place Holder for Menu Additions
+		contextMenuManager.add(new Separator(
+				IWorkbenchActionConstants.MB_ADDITIONS));
+
+		
+		// ---------------------------------------------------------------------
+		// add the displayable properties
+		for (int i = 0; i < control.getNumProperties(chartIndex); i ++) {
+			
+			String nextProp = control.getProperty(chartIndex,i);
+			DataSeries series = dataSeriesMap.get(nextProp);
+			DisplayableProperty property = new DisplayableProperty(nextProp, series.isVisible());
+			contextMenuManager.add(property);
+		}
+
+		// ---------------------------------------------------------------------
+
+		// Place Holder for Menu Additions
+		contextMenuManager.add(new Separator(
+				IWorkbenchActionConstants.MB_ADDITIONS));
+
+		// ---------------------------------------------------------------------
+
+		final Menu popUpMenu = contextMenuManager.createContextMenu(parent);
+
+		// Set the context menu for the viewer
+		parent.setMenu(popUpMenu);
+
+
+	} // updateContextMenu
+
+
+	
+	/**
+	 * Sets the colors for a n array of LineSeries given the property to Plot
+	 * for each. Try to set color from the preferences (if specified for that
+	 * property) otherwise sets line color to blue.
+	 * 
+	 * @param propertiesToPlot
+	 * @param lsList
+	 */
+	public static void setColorDefs(
+			final List<String> propertiesToPlot,
+			final List<LineSeries> lsList) {
+		// the default line color
+
+		// if possible get color from preferences
+		final Map<String, STEMColor> colorMap = VisualizationPreferencePage
+				.getColorMapping();
+		for (int i = 0; i < lsList.size(); i++) {
+			ColorDefinition color = ColorDefinitionImpl.BLUE();
+
+			if ((propertiesToPlot != null) && (propertiesToPlot.size() > i)) {
+				final String key = propertiesToPlot.get(i);
+				// look or the preference color by name
+				if (colorMap.containsKey(key)) {
+					final STEMColor c = colorMap.get(key);
+					color = ColorDefinitionImpl.create((int)(c.getRed() * 255.0), (int)(c.getGreen() * 255.0), (int)(c.getBlue()  * 255.0));
+				}
+				lsList.get(i).setSeriesIdentifier(key);
+				lsList.get(i).getLineAttributes().setColor(color);
+			} else {
+
+				if (lsList.get(i) != null) {
+					lsList.get(i).setSeriesIdentifier(" ");
+					lsList.get(i).getLineAttributes().setColor(color);
+				}
+			}
+		}
+		return;
+	}// getColorDef
+
+
+	
+
+	/**
+	 * Disposes the Color objects
+	 */
+	@Override
+	public void dispose() {
+		super.dispose();
+	}
+
+	/**
+	 * reset
+	 */
+	public void reset() {
+		resetData();
+		redraw();
+	}
+
+	protected void resetData() {
+		clearData();
+	
+		cycleNumbers.add(0.0);
+	}
+
+	protected void clearData() {
+		
+		dataSeriesMap.clear();
+		cycleNumbers.clear();
+	}
+
+	
+	/**
+	 * toggle the scale from logarithmic to linear
+	 */
+	void toggleAxisScale() {
+		if (useLinearTimeScale) { //Switch to logarithmic scale
+			logTimeAction.setChecked(true);
+			linearTimeAction.setChecked(false);
+			//Just using the following axis type, to move to log scale, didn't work
+			//yAxisPrimary.setType(AxisType.LOGARITHMIC_LITERAL);
+			yAxisPrimary.getScale().setMin(null);
+			yAxisPrimary.getScale().setMax(null);
+			yAxisPrimary.getScale().unsetStep();
+			yAxisPrimary.getScale().unsetStepNumber();
+		}
+		else { //Switch to linear scale
+			logTimeAction.setChecked(false);
+			linearTimeAction.setChecked(true);
+			//yAxisPrimary.setType(AxisType.LINEAR_LITERAL);
+			yAxisPrimary.getScale().setMin(NumberDataElementImpl.create(0.0));
+			yAxisPrimary.getScale().setMax(NumberDataElementImpl.create(1.0));
+			yAxisPrimary.getScale().setStep(0.25);
+		}
+		useLinearTimeScale = !useLinearTimeScale;
+		draw();
+	}
+	
+
+	/**
+	 * toggle the scale from logarithmic to linear
+	 */
+	void toggleLegend() {
+		if (showLegend) { //Switch to hide
+			viewLegend.setChecked(false);
+			hideLegend.setChecked(true);
+			legend.setVisible(false);
+		}
+		else { //Switch to view
+			viewLegend.setChecked(true);
+			hideLegend.setChecked(false);
+			legend.setVisible(true);
+		}
+		showLegend = !showLegend;
+		draw();
+	}
+
+
+	/**
+	 * Action to show the legend
+	 */
+	protected class LegendViewAction extends Action {
+		public LegendViewAction()
+		{
+			super(Messages.getString("ContextMenu.ShowLegend"), IAction.AS_CHECK_BOX);
+			setChecked(showLegend);
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#getText()
+		 */
+		@Override
+		public String getText() {
+			return Messages.getString("ContextMenu.ShowLegend");
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#run()
+		 */
+		@Override
+		public void run() {
+			if (showLegend) {
+				setChecked(true);
+				//Nothing to do. It's already linear-time.
+			}
+			else {
+				toggleLegend();
+			}
+			draw();
+		}
+	} //LegendViewAction
+	
+	/**
+	 * Action to hide the legend
+	 */
+	class LegendHideAction extends Action 	{
+		public LegendHideAction()
+		{
+			super(Messages.getString("ContextMenu.HideLegend"), IAction.AS_CHECK_BOX);
+			setChecked(!showLegend);
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#getText()
+		 */
+		@Override
+		public String getText() {
+			return Messages.getString("ContextMenu.HideLegend");
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#run()
+		 */
+		@Override
+		public void run() {
+			if (!showLegend) {
+				setChecked(true);
+				//Nothing to do. It's already log-time.
+			}
+			else {
+				toggleLegend();
+			}
+			draw();
+		}
+	}//LegendHideAction
+
+	
+	/**
+	 * switch to linear plot 
+	 * 
+	 */
+	protected class LinearScaleAction extends Action {
+		public LinearScaleAction()
+		{
+			super(Messages.getString("ContextMenu.LinearTimeScale"), IAction.AS_CHECK_BOX);
+			setChecked(useLinearTimeScale);
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#getText()
+		 */
+		@Override
+		public String getText() {
+			return Messages.getString("ContextMenu.LinearTimeScale");
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#run()
+		 */
+		@Override
+		public void run() {
+			if (useLinearTimeScale) {
+				setChecked(true);
+				//Nothing to do. It's already linear-time.
+			}
+			else {
+				toggleAxisScale();
+			}
+			draw();
+		}
+	} //LinearScaleAction
+
+	/**
+	 * switch to semi-log plot (log scale on y axis)
+	 * 
+	 */
+	class LogScaleAction extends Action 	{
+		public LogScaleAction()
+		{
+			super(Messages.getString("ContextMenu.LogTimeScale"), IAction.AS_CHECK_BOX);
+			setChecked(!useLinearTimeScale);
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#getText()
+		 */
+		@Override
+		public String getText() {
+			return Messages.getString("ContextMenu.LogTimeScale");
+		}
+
+		/**
+		 * @see org.eclipse.jface.action.Action#run()
+		 */
+		@Override
+		public void run() {
+			if (!useLinearTimeScale) {
+				setChecked(true);
+				//Nothing to do. It's already log-time.
+			}
+			else {
+				toggleAxisScale();
+			}
+			draw();
+		}
+	}//LogScaleAction
+	
+	/**
+	 * DisplayableProperty
+	 *
+	 */
+	protected class DisplayableProperty extends Action
+	{
+		String property = null;
+		public DisplayableProperty(String property, boolean visibility)
+		{
+					super(property, IAction.AS_CHECK_BOX);
+					this.property = property;
+					setChecked(visibility);
+		}
+		
+	
+
+		/**
+		 * @see org.eclipse.jface.action.Action#getText()
+		 */
+		@Override
+		public String getText() {
+			return property;
+		}
+
+		/**
+		 * Toggle the state
+		 * @see org.eclipse.jface.action.Action#run()
+		 */
+		@Override
+		public void run() {
+				DataSeries series = dataSeriesMap.get(property);
+				series.toggleVisible();
+				dataSeriesMap.put(property,series);
+				setChecked(series.isVisible());
+				visibleMap.put(property, series.isVisible());
+				draw();
+		}
+	}// DisplayableProperty
+	
+	
+	/**
+	 * Inner class DataSeries
+	 * all the data objects for a plot
+	 *
+	 */
+	protected class DataSeries 
+	{
+		public String propertyName = "";
+		
+		public List<Double> relativeValues = new ArrayList<Double>();
+		public LineSeries lineSeries = null;
+		private boolean visible = true;
+		private SeriesDefinition sdY = null;
+		private int seriesIndex = 0;
+		private boolean overlayMode = false;
+		
+		
+		public boolean isVisible() {
+			return visible;
+		}
+		public void setVisible(boolean state) {
+			visible = state;
+		}
+		
+		public void toggleVisible() {
+			visible = !visible;
+		}
+
+		/**
+		 * 
+		 * @param propertyName
+		 * @param index
+		 * @param overlay 
+		 */
+		public DataSeries(String propertyName, int index, boolean overlay) {
+			this.propertyName = propertyName;
+			this.seriesIndex = index;
+			this.overlayMode = overlay;
+			relativeValues = new ArrayList<Double>();
+			relativeValues.add(new Double(0.0));
+			addLineSeries(propertyName);
+		}
+		
+		public void addValue(Double val) {
+			if(relativeValues==null) relativeValues = new ArrayList<Double>();
+			relativeValues.add(val);
+		}
+		
+		/**
+		 * @param propertyName
+		 * 
+		 */
+		@SuppressWarnings("deprecation")
+		public void addLineSeries(final String propertyName) {
+			
+			final NumberDataSet orthoValues = NumberDataSetImpl
+					.create(relativeValues);
+			if(lineSeries == null) {
+				lineSeries = (ScatterSeries) ScatterSeriesImpl.create();
+				/*
+				 * 
+				 * Bar chart style is too slow for generation of a fill
+				 * if we want a fill we can try using the difference plot
+				 * to a straight line at y=0
+				 * 
+				
+				if(propertyName.indexOf("*")>=1) {
+					// barseries methods
+					lineSeries = (BarSeries) BarSeriesImpl.create();
+				} else {
+					lineSeries = (ScatterSeries) ScatterSeriesImpl.create();
+				}
+				
+				*
+				*/
+			} // if lineSeries==null
+			lineSeries.setDataSet(orthoValues);
+			((LineSeries) lineSeries).getLineAttributes().setVisible(true);
+			((LineSeries) lineSeries).getLineAttributes().setThickness(3);
+			((LineSeries) lineSeries).getMarkers().clear();
+			
+			// Assign the line color
+			// based on selected property. Default is Blue
+			setColorDefs(seriesIndex);
+			// If this is the "selected" region of a graph set the marker type
+		
+			// the series def
+			sdY = SeriesDefinitionImpl.create();
+			sdY.getSeriesPalette().update(-2);
+			sdY.getSeries().add(lineSeries);
+			yAxisPrimary.getSeriesDefinitions().add(sdY);
+			
+			return;
+		}// addLineSeries
+		
+		/** 
+		 * in response to user action temporarily remove the line series from the graph
+		 */
+		public void hide() {
+			lineSeries.setVisible(false);
+			visible = false;
+		}// hide
+		
+		/** 
+		 * in response to user action add back the line series to the graph
+		 */
+		public void show() {
+			lineSeries.setVisible(true);
+			visible = true;
+		}// show
+		
+
+		/**
+		 * Overloaded and simple method to set the colors
+		 * does not use the preferences
+		 * 
+		 * Sets the colors for a n array of LineSeries given the property to Plot
+		 * for each. Try to set color from the preferences (if specified for that
+		 * property) otherwise sets line color to blue.
+		 * @param propertyName 
+		 *
+		 */
+		public void setColorDefs(int index) {
+			// fix to bug 375126
+			// The latest version of birt uses Palette colors by default. In order to set the color the way we want
+			// we must first issue:
+			this.lineSeries.setPaletteLineColor(false);
+						
+			// the default line color
+			if(index >= colorDefault.length) index = 0; // should never happen
+			ColorDefinition color = colorDefault[index];
+
+			this.lineSeries.setSeriesIdentifier(propertyName);
+			if (overlayMode) {
+					((LineSeries)this.lineSeries).getLineAttributes().setColor(color);
+					((LineSeries)this.lineSeries).getLineAttributes().setStyle(LineStyle.DOTTED_LITERAL);
+			} else {
+				((LineSeries)this.lineSeries).getLineAttributes().setColor(color);
+			}
+			
+			
+		}// getColorDefs
+		
+		/**
+		 * Sets the colors for a n array of LineSeries given the property to Plot
+		 * for each. Try to set color from the preferences (if specified for that
+		 * property) otherwise sets line color to blue.
+		 * @param propertyName 
+		 *
+		 */
+		public void setColorDefs(String propertyName) {
+			// fix to bug 375126
+			// The latest version of birt uses Palette colors by default. In order to set the color the way we want
+			// we must first issue:
+			this.lineSeries.setPaletteLineColor(false);
+			
+			// default color
+			int colorIndex = seriesIndex % colorDefault.length;
+			ColorDefinition defaultColor = colorDefault[colorIndex];
+
+			// if possible get color from preferences
+			final Map<String, STEMColor> colorMap = VisualizationPreferencePage.getColorMapping();				
+			boolean colorSet = false;
+			// 1. If we have a valid set of preferences and a valid property
+			if((colorMap!=null)&&(colorMap.size()>=1)&&(propertyName!=null)&&(propertyName.length()>=1)) {
+				//2. is there a perfect match?
+				if (colorMap.containsKey(propertyName)) {
+					final STEMColor c = colorMap.get(propertyName);
+					ColorDefinition color = ColorDefinitionImpl.create((int)(c.getRed() * 255.0), (int)(c.getGreen() * 255.0), (int)(c.getBlue()  * 255.0));
+					this.lineSeries.getLineAttributes().setColor(color);
+					colorSet = true;
+				} else {
+					//3. Try for a first letter match
+					for (String key : colorMap.keySet()) {
+						if(key.length() >= 1) {
+							if(propertyName.substring(0, 1).equalsIgnoreCase(key.substring(0,1))) {
+								// might be right
+								final STEMColor c = colorMap.get(key);
+								ColorDefinition color = ColorDefinitionImpl.create((int)(c.getRed() * 255.0), (int)(c.getGreen() * 255.0), (int)(c.getBlue()  * 255.0));
+								this.lineSeries.getLineAttributes().setColor(color);
+								colorSet = true;
+								break;
+							}
+						}
+					}
+				}
+			}
+			
+			// default
+			if(!colorSet) {
+				// pick a default color
+				((LineSeries)this.lineSeries).getLineAttributes().setColor(defaultColor);
+			} 
+			
+			
+			this.lineSeries.setSeriesIdentifier(propertyName);
+			if (overlayMode) {
+					((LineSeries)this.lineSeries).getLineAttributes().setColor(ColorDefinitionImpl.GREY());
+					((LineSeries)this.lineSeries).getLineAttributes().setStyle(LineStyle.DOTTED_LITERAL);
+			} 
+			
+			
+		}// getColorDefs
+
+		/**
+		 * length of the series
+		 * @return number of data points
+		 */
+		public int getDataSize() {
+			return relativeValues.size();
+		}
+		// Accessors
+		public String getPropertyName() {
+			return propertyName;
+		}
+
+		public void setPropertyName(String propertyName) {
+			this.propertyName = propertyName;
+		}
+
+		public List<Double> getRelativeValues() {
+			return relativeValues;
+		}
+
+		public void setRelativeValues(List<Double> relativeValues) {
+			this.relativeValues = relativeValues;
+		}
+
+		
+
+		public void setLineSeries(LineSeries lineSeries) {
+			this.lineSeries = lineSeries;
+		}
+	}// DataSeries
+	////////////////////////////////////////////////////////
+	
+} // AggregateTimeSeriesCanvas
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisControl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisControl.java
new file mode 100644
index 0000000..3289b0c
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisControl.java
@@ -0,0 +1,183 @@
+// AnalysisControl
+package org.eclipse.stem.analysis.automaticexperiment.views;
+
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 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 java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * AnalysisControl is a subclass of Canvas suitable for chart drawings.
+ */
+abstract public class AnalysisControl extends Composite  {
+
+
+	protected static final String CLEAR_TEXT = "clear monitors";
+
+	protected Label simulationNameLabel;
+	
+	/**
+	 * Status text
+	 */
+	public static final String STATUS_TEXT = "status";
+	
+	protected static Map<String,Object> controlParametersMap = new HashMap<String,Object>();
+	
+	/** 
+	 * a string for setting user feedback messages
+	 */
+	protected String userMessage = "";
+	
+	/**
+	 * a label to display messages
+	 */
+	protected Label userMessageLabel = null;
+	
+
+	
+	/**
+	 * The collection of ISelectionChangedListener waiting to be told about
+	 * selections.
+	 */
+	protected final List<ISelectionChangedListener> listeners = new CopyOnWriteArrayList<ISelectionChangedListener>();
+
+	protected Label identifiableTitle;
+
+	/**
+	 * The width of the layout margin.
+	 */
+	protected static final int MARGIN_WIDTH = 5;
+
+	/**
+	 * The height of the layout margin.
+	 */
+	protected static final int MARGIN_HEIGHT = 5;
+
+	/**
+	 * @param parent
+	 * @param style
+	 */
+	public AnalysisControl(final Composite parent, final int style) {
+		super(parent, style);
+
+		this.addDisposeListener(new DisposeListener() {
+			/**
+			 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+			 */
+			public void widgetDisposed(@SuppressWarnings("unused")
+			final DisposeEvent e) {
+				dispose();
+			}
+		});
+
+		final FormLayout layout = new FormLayout();
+		layout.marginHeight = MARGIN_HEIGHT;
+		layout.marginWidth = MARGIN_WIDTH;
+		setLayout(layout);
+
+	} // AnalysisControl
+
+	/**
+	 * @param parent
+	 *            the parent SWT control that this composite will be a child of
+	 * @return the SWT Composite to be displayed above the MapCanvas in the
+	 *         control
+	 */
+	protected Composite createTopComposite(final Composite parent) {
+		final Composite topComposite = new Composite(parent, SWT.NONE);
+
+		final FillLayout topCompositeLayout = new FillLayout(SWT.VERTICAL);
+		topComposite.setLayout(topCompositeLayout);
+
+		simulationNameLabel = new Label(topComposite, SWT.CENTER);
+		simulationNameLabel.setText("");
+
+		return topComposite;
+	} // createTopComposite
+	
+	
+
+
+	/**
+	 * 
+	 * @param folderName
+	 */
+	protected abstract void initializeHeader(String folderName);
+
+	
+	/**
+	 * All controllers must implement this 
+	 * to remove the control e.g. by a remove button event
+	 */
+	public abstract void remove() ;
+	
+	
+	
+	
+	
+	
+	/**
+	 * get values for graphs as double array
+	 * @param chartIndex allows multiple charts in a view. Default is index=0 (one chart)
+	 * @param state
+	 * @return value array
+	 */
+	public abstract double[] getValues(int chartIndex, int state);
+	
+	/**
+	 * update the message text
+	 */
+	public void updateMessage() {
+		if(userMessageLabel!=null)	userMessageLabel.setText(userMessage);
+	}
+	
+	/**
+	 * update the message text
+	 * @param message 
+	 */
+	public void updateMessage(String message) {
+		userMessage = message;
+		if(userMessageLabel!=null)	userMessageLabel.setText(userMessage);
+	}
+	
+	/**
+	 * get the name of the time series for a given state
+	 * @param chartIndex  allows multiple charts in a view. Default is index=0 (one chart)
+	 * @param state
+	 * @return property name
+	 */
+    public abstract String getProperty(int chartIndex, int state);
+    
+
+    /**
+     * 
+     * @param chartIndex  allows multiple charts in a view. Default is index=0 (one chart)
+     * @return number of properties to plot
+     */
+    public abstract int getNumProperties(int chartIndex);
+    
+    
+	
+
+
+} // AnalysisControl
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisControlFactory.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisControlFactory.java
new file mode 100644
index 0000000..92987c9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisControlFactory.java
@@ -0,0 +1,35 @@
+// AnalysisControlFactory.java
+package org.eclipse.stem.analysis.automaticexperiment.views;
+
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 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.swt.widgets.Composite;
+
+/**
+ * This interface is implemented by factories that create instances of
+ * {@link AnalysisControl}.
+ */
+public interface AnalysisControlFactory {
+
+	/**
+	 * 
+	 * @param parent 
+	 * @return the AnalysisControl
+	 */
+	AnalysisControl create(final Composite parent);
+
+	/**
+	 * @return TODO JFK
+	 */
+	public String getControlType();
+
+} // AnalysisControlFactory
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisViewer.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisViewer.java
new file mode 100644
index 0000000..a85dc1e
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AnalysisViewer.java
@@ -0,0 +1,219 @@
+// AnalysisViewer.java
+package org.eclipse.stem.analysis.automaticexperiment.views;
+
+/*******************************************************************************
+ * Copyright (c) 2007,2008 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.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.stem.ui.views.geographic.map.MapControl;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * This class presents "views" of the running simulations.
+ */
+public class AnalysisViewer extends Viewer  {
+
+	
+	
+	private static final String URI_PREFIX = "/resources/data/scenario/disease/";
+	
+	
+
+	/**
+	 * This is the top-level control of the viewer. It contains the
+	 * {@link MapControl}s that display the current state of the
+	 * {@link org.eclipse.stem.jobs.simulation.Simulation}s.
+	 */
+	final Composite composite;
+
+	
+
+
+	
+
+	
+
+	// get the path
+	//private static final IPath PATH = Activator.getDefault().getStateLocation();
+
+	//private static final String sep = File.separator;
+	
+	//private static final String pathSuffix = "analysis"+sep;
+	
+	
+
+	/**
+	 * This factory is used to create instances of {@link AnalysisControl} in the
+	 * method {@link #populateView()}
+	 */
+	private final AnalysisControlFactory acf;
+
+	/**
+	 * @param parent
+	 *            the SWT parent of the control that makes up the viewer
+	 * @param acf
+	 *            the factory that creates instance of {@link AnalysisControl}
+	 */
+	public AnalysisViewer(final Composite parent, final AnalysisControlFactory acf) {
+
+		composite = new Composite(parent, SWT.NONE);
+		final FillLayout compositeLayout = new FillLayout(SWT.HORIZONTAL);
+		composite.setLayout(compositeLayout);
+
+		// Remember the factory that we'll use to create instances of
+		// AnalysisControl
+		this.acf = acf;
+		refresh();
+		composite.pack();
+		
+	} // AnalysisViewer
+
+	/**
+	 * @see org.eclipse.jface.viewers.Viewer#getControl()
+	 */
+	@Override
+	public Control getControl() {
+		return composite;
+	} // getControl
+
+
+
+	/**
+	 * @see org.eclipse.jface.viewers.Viewer#refresh()
+	 */
+	@Override
+	public void refresh() {
+		populateView();
+	} // refresh
+
+	
+	
+	
+	/**
+	 * Create and dispose of MapControls as necessary to display the selected
+	 * Simulations.
+	 */
+	private void populateView() {
+		
+		
+		// problem here when we start up
+		// Are we done?
+		if (composite.isDisposed()) {
+			// Yes
+			return;
+		} // if
+
+	   
+		final AnalysisControl analysisControl = acf.create(composite);
+	
+		analysisControl.addDisposeListener(new DisposeListener() {
+			/**
+			 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+			 */
+			public void widgetDisposed(@SuppressWarnings("unused")
+			final DisposeEvent e) {
+				composite.layout(true, true);
+				composite.redraw();
+			}
+		});
+
+		composite.layout(true, true);
+		composite.redraw();
+	} // populateView
+	
+	
+	
+
+	
+
+	
+
+	
+	/**
+	 * Removes whitespace, ',', '.', etc.
+	 * @param s
+	 * @return a filtered string
+	 */
+	public static String nameFilter (String s) {
+		String s1 = s.trim();
+		s1 = s1.replace('"',' ');
+		s1 = s1.replaceAll(" ","");
+		s1 = s1.replace(',','_');
+		s1 = s1.replace('.','_');
+		s1 = s1.replaceAll("_","");
+		s = s1;
+		
+		return s;
+	}
+
+	
+	
+	
+
+	/**
+	 * filters the location id prefix from the beginning of
+	 *  a nodes ID for generation of a file name
+	 * @param unfiltered
+	 * @return the filtered file name using location id.
+	 */
+	public static String filterFilename(String unfiltered) {
+		int last = unfiltered.indexOf(URI_PREFIX);
+		if (last >=0) {
+			last += URI_PREFIX.length();
+			return unfiltered.substring(last, unfiltered.length());
+		} 
+		return unfiltered;
+
+	
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.Viewer#getInput()
+	 */
+	@Override
+	public Object getInput() {
+		// not used
+		return null;
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.Viewer#setInput(java.lang.Object)
+	 */
+	@Override
+	public void setInput(@SuppressWarnings("unused") Object input) {
+		// not used
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
+	 */
+	@Override
+	public void setSelection(@SuppressWarnings("unused") ISelection selection, @SuppressWarnings("unused") boolean reveal) {
+		// not used
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.Viewer#getSelection()
+	 */
+	@Override
+	public ISelection getSelection() {
+		// not used
+		return null;
+	}
+
+	
+} // AnalysisViewer
diff --git a/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AutoExpControl.java b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AutoExpControl.java
new file mode 100644
index 0000000..f805cc9
--- /dev/null
+++ b/analysis/org.eclipse.stem.analysis.automaticexperiment/src/org/eclipse/stem/analysis/automaticexperiment/views/AutoExpControl.java
@@ -0,0 +1,1191 @@
+// AutoExpControl.java
+package org.eclipse.stem.analysis.automaticexperiment.views;
+
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 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 java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.birt.chart.model.attribute.ColorDefinition;
+import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.stem.analysis.ErrorResult;
+import org.eclipse.stem.analysis.automaticexperiment.ALGORITHM_STATUS;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperimentManager;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperimentManagerEvent;
+import org.eclipse.stem.analysis.automaticexperiment.AutomaticExperimentManagerListener;
+import org.eclipse.stem.analysis.automaticexperiment.ErrorAnalysisAlgorithm;
+import org.eclipse.stem.analysis.automaticexperiment.ErrorAnalysisAlgorithmEvent;
+import org.eclipse.stem.analysis.automaticexperiment.ErrorAnalysisAlgorithmListener;
+import org.eclipse.stem.analysis.automaticexperiment.MANAGER_STATUS;
+import org.eclipse.stem.core.common.Identifiable;
+import org.eclipse.stem.ui.ISharedImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * This class is a SWT GUI component that uses BIRT to plot
+ */
+public class AutoExpControl extends AnalysisControl {
+	
+	
+	private static Display display = null;
+	
+	private ImageRegistry imageRegistry = null;
+	
+	private static AutomaticExperimentManager manager = null;
+	
+	/**
+	 * Folder to contain the data
+	 * 
+	 */
+	static CTabFolder tabFolder;
+	
+	static boolean pauseTrigger = false;
+	
+	static double[] referenceIncidence;
+	static double[] modelIncidence;
+	
+	
+	/**
+	 * A label to report status (not yet used)
+	 */
+	//static Label statusLabel;
+	
+	/**
+	 * stop button
+	 */
+	 Button stopButton = null;
+	
+	 /**
+	  * restart button
+	  */
+	 Button restartButton = null; 
+	/**
+	 * Colors for the time series chart
+	 */
+	static final ColorDefinition foreGround = ColorDefinitionImpl.create(180, 0, 0);
+	static final ColorDefinition backgroundGround = ColorDefinitionImpl.create(255, 255, 225);
+	static final ColorDefinition frameColor = ColorDefinitionImpl.WHITE();
+	
+	// some colors
+	private static Color cyan;
+	private static Color cyanDark;
+	private static Color darkRed;
+	private static Color white;
+	private static Color lightGreen;
+	private static Color lightBlue;
+	
+	
+	
+	protected static RunHistoryCanvas errorConvergenceByRun = null;
+	static final int ERROR_CONVERGENCE_BY_RUN_ID = 0;
+	
+	protected static ErrorTimeSeriesCanvas currentErrorByTime = null;
+	static final int CURRENT_ERROR_BY_TIME_ID = 1;
+	
+	protected static AggregateTimeSeriesCanvas aggregateErrorByTime = null;
+	static final int AGGREGATE_BY_TIME_ID = 2;
+
+
+	private static final int NUMROWS = 10;
+	
+	//protected static Composite chartComposite;
+	protected static Composite errorTimeSeriesComposite;
+	protected static Composite aggregateTimeSeriesComposite;
+	protected static Composite runHistoryComposite;
+	protected static Composite valuesComposite;
+	protected static Composite controlsComposite;
+	protected static Composite controlsActionComposite;
+	protected static Composite controlsValuesComposite;
+	protected static Composite settingsComposite;
+	
+	private static List<Double> errorHistoryList = new ArrayList<Double>();
+	private static double[] errorHistory;
+	private static double[] bestSeries;
+	private static double bestError = Double.MAX_VALUE;
+	private static double bestVError = Double.MAX_VALUE;
+	private static double[] newErrorTimeSeries;
+	
+	protected static String[] runParamNames;
+	protected static double[] bestParamValues;
+	
+	protected static double[][] recentParamValues;
+	protected static double[] restartParamValues;
+	protected static double[] recentErrors;
+	protected static double[] recentVErrors;
+	
+	protected static CLabel[] attributeLabels;
+	protected static CLabel[] controlLabels;
+	protected static Text[] bestValueLabels;
+	
+	protected static Text[][] recentValueLabels;
+	protected static Text[]   restartValues;
+	
+	protected static short row = 0; // which row are we updating
+	
+	protected static short numColumns = 0;
+	
+	/**
+	 * restart sim uses latest vals or best
+	 */
+	protected static boolean restartWithLatest= true;
+	
+	/**
+	 * The dialog for the wizard
+	 */
+	//static WizardDialog wizardDialog;	
+	
+	//PropertySelector propertySelector;
+	//List<ItemPropertyDescriptor> selectedProperties;
+
+	/**
+	 * 
+	 * @param parent
+	 */
+	public AutoExpControl(final Composite parent) {
+		super(parent, SWT.None);
+		createContents();
+	} // AutoExpControl
+	
+	
+
+	/**
+	 * Create the contents of the plotter
+	 */
+	void createContents() {
+				
+		// Set the image registry
+		if (imageRegistry == null) {
+			org.eclipse.stem.ui.Activator activator = org.eclipse.stem.ui.Activator.getDefault();
+			imageRegistry = activator.getImageRegistry();
+		}
+		// Use form layout
+		setLayout(new FormLayout());
+		if(display==null) display = this.getDisplay();
+		cyan = display.getSystemColor(SWT.COLOR_CYAN);
+		cyanDark = new Color(display, 60, 220, 220);
+		darkRed = display.getSystemColor(SWT.COLOR_DARK_RED);
+		white = display.getSystemColor(SWT.COLOR_WHITE);
+		lightGreen = new Color(display, 128, 255, 128);
+		lightBlue = new Color(display, 128, 128, 255);
+		
+		
+		identifiableTitle = new Label(this, SWT.NONE);
+		identifiableTitle.setText(Messages.getString("AUTO.TITLELABEL"));
+		
+		
+		int bottom = 5;
+		final FormData titleFormData = new FormData();
+		identifiableTitle.setLayoutData(titleFormData);
+		titleFormData.top = new FormAttachment(0, 0);
+		titleFormData.bottom = new FormAttachment(bottom, 0);
+		titleFormData.left = new FormAttachment(0, 0);
+		titleFormData.right = new FormAttachment(100, 0);
+		
+		bottom += 1;
+		
+		tabFolder = new CTabFolder(this, SWT.BORDER);
+		// set up the values composite
+		valuesComposite = new Composite(tabFolder, SWT.BORDER);
+		
+		final FormData tabFormData = new FormData();
+		tabFormData.top = new FormAttachment(bottom, 0);
+		tabFormData.bottom = new FormAttachment(100, 0);
+		tabFormData.left = new FormAttachment(0, 0);
+		tabFormData.right = new FormAttachment(100, 0);
+		tabFolder.setLayoutData(tabFormData);
+		tabFolder.setSimple(false);
+		
+		
+		tabFolder.setSelectionBackground(new Color[]{
+				cyan,
+				white,
+				lightBlue,
+				lightBlue},
+				new int[] {25, 50, 100}); 
+		
+
+		tabFolder.setSelectionForeground(display.getSystemColor(SWT.COLOR_BLACK)); 
+		
+		tabFolder.setBackground(cyanDark);
+		tabFolder.setForeground(darkRed);
+		tabFolder.setBorderVisible(true);
+		
+        /////////////
+		// RUN HISTORY
+		CTabItem item0 = new CTabItem(tabFolder, SWT.BORDER);
+		item0.setText ("  "+Messages.getString("AUTO.HISTORY")+" ");
+		runHistoryComposite = new Composite(tabFolder, SWT.BORDER);
+		runHistoryComposite.setLayout(new FormLayout());
+ 		item0.setControl(runHistoryComposite);
+ 		// set up the four data time series inside the chartComposite
+ 		getRunHistoryChart(runHistoryComposite); 
+ 		
+ 		/////////////
+		// AGGREGATE TIME SERIES
+ 		CTabItem item1 = new CTabItem(tabFolder, SWT.BORDER);
+		item1.setText ("  "+Messages.getString("AUTO.AGGREGATESERIES")+" ");
+		aggregateTimeSeriesComposite = new Composite(tabFolder, SWT.BORDER);
+		aggregateTimeSeriesComposite.setLayout(new FormLayout());
+ 		item1.setControl(aggregateTimeSeriesComposite);
+ 		// set up the four data time series inside the chartComposite
+ 		getAggregateTimeSeriesChart(aggregateTimeSeriesComposite); 
+ 		
+ 		/////////////
+		// ERROR TIME SERIES
+ 		CTabItem item2 = new CTabItem(tabFolder, SWT.BORDER);
+		item2.setText ("  "+Messages.getString("AUTO.ERRORSERIES")+" ");
+		errorTimeSeriesComposite = new Composite(tabFolder, SWT.BORDER);
+		errorTimeSeriesComposite.setLayout(new FormLayout());
+ 		item2.setControl(errorTimeSeriesComposite);
+ 		// set up the four data time series inside the chartComposite
+ 		getErrorTimeSeriesChart(errorTimeSeriesComposite); 
+ 		
+ 		//////////////
+ 		// VALUES
+		CTabItem item3 = new CTabItem(tabFolder, SWT.BORDER);
+		item3.setText(Messages.getString("AUTO.VALUES"));
+		item3.setControl(valuesComposite);
+		
+		//////////////
+ 		// Controls
+		controlsComposite = new Composite(tabFolder, SWT.BORDER);
+		getControls();
+		CTabItem item4 = new CTabItem(tabFolder, SWT.BORDER);
+		item4.setText(Messages.getString("AUTO.CONTROLS"));
+		item4.setControl(controlsComposite);
+		
+		//////////////
+ 		// Settings
+//		settingsComposite = new Composite(tabFolder, SWT.BORDER);
+//		getSettings();
+//		CTabItem item4 = new CTabItem(tabFolder, SWT.BORDER);
+//		item4.setText(Messages.getString("AUTO.SETTINGS"));
+//		item4.setControl(settingsComposite);
+		
+		
+		
+		tabFolder.setSelection(item0);
+		if(manager==null) {
+			manager = AutomaticExperimentManager.getInstance();
+			manager.addListener(new AutomaticExperimentManagerListener() {
+				
+				public void eventReceived(AutomaticExperimentManagerEvent evt) {
+					if(evt.status == MANAGER_STATUS.SCHEDULED) {
+						ErrorAnalysisAlgorithm alg = evt.algorithm;
+						display.syncExec(new Runnable() {
+							public void run() {
+								AutoExpControl.this.reset();
+								AutoExpControl.this.stopButton.setEnabled(true);
+								restartButton.setEnabled(false);
+							}
+						});
+						alg.addListener(new ErrorAnalysisAlgorithmListener() {
+							public void eventReceived(ErrorAnalysisAlgorithmEvent evt) {
+																
+								if(evt.status == ALGORITHM_STATUS.STARTING_SIMULATION) {
+									// set the label info
+									runParamNames = evt.parameterNames;
+									if(recentParamValues == null) {
+										numColumns = (short)runParamNames.length;
+										recentParamValues = new double[NUMROWS][runParamNames.length+1];
+										restartParamValues = new double[runParamNames.length];
+										
+										recentErrors = new double[NUMROWS];
+										recentVErrors = new double[NUMROWS];
+									} 
+									
+									if(row < NUMROWS) {
+										recentParamValues[row] = copyDoubleArray(evt.parameterValues);
+										recentErrors[row] = -1; // not known yet
+										recentVErrors[row++] = -1; // not known yet
+									} else {
+										// We need to shift up
+										for(int i=0;i<NUMROWS-1;++i) {
+											for(int j=0;j<runParamNames.length;++j) recentParamValues[i][j] = recentParamValues[i+1][j];
+											recentErrors[i]=recentErrors[i+1];
+											recentVErrors[i]=recentVErrors[i+1];
+											
+										}
+										recentParamValues[row-1] = copyDoubleArray(evt.parameterValues);
+										recentErrors[row-1] = -1; // not known yet
+										recentVErrors[row-1] = -1; // not known yet
+									}
+									
+									// copy all but the error - it is not a parameter
+									for(int i = 0; i < (restartParamValues.length); i ++) {
+										if(restartWithLatest) {
+											if(recentParamValues!=null) restartParamValues[i] = recentParamValues[row-1][i];
+										} else {
+											if(bestParamValues!=null) restartParamValues[i] = bestParamValues[i];
+										}
+										
+									}
+									
+									// Add a Runnable to the UI thread's execution queue 
+									final Display display = Display.getDefault();
+									if (!display.isDisposed()) {
+										// Yes
+										try {
+											display.asyncExec(new Runnable() {
+												public void run() {
+													if(!valuesInitialized) {
+														initializeValueLabels(runParamNames);
+														initializeControlLabels(runParamNames);
+													}
+													updateValueLabels();
+												} // run
+											}); // display.asyncExec
+										} // try
+										catch (final Exception e) {
+											// Ignore there could be a race condition with the display being disposed
+										} // catch Exception
+									} // if (!display.isDisposed()) 
+								//////////////////////////////////////
+								} else if(evt.status == ALGORITHM_STATUS.FINISHED_ALGORITHM) {
+									// The algorithm has finished. Smallest value in 
+									//evt.result
+									/////////////////
+									display.asyncExec(new Runnable() {
+										public void run() {
+											restartButton.setEnabled(true);
+											stopButton.setEnabled(false);
+										}
+									});
+								} else if(evt.status == ALGORITHM_STATUS.FINISHED_SIMULATION) {
+									// One simulation is done. The result is READY and stored in evt.result
+									ErrorResult result = evt.result;
+									final double plottableError = plottableError(result.getError());
+									recentErrors[row-1] = evt.result.getError();
+									recentVErrors[row-1] = evt.result.getValidationError();
+									
+									if(result != null) {
+										// Plot 1 from result.getError() (keep appending)
+										appendLatestErrorData(plottableError);
+										// Plot 2 from result.getErrorByTimestep() (same as we show in scenario comparison view)
+										setRecentTimeSeries(result.getError(), result.getValidationError(), result.getErrorByTimeStep(), result.getReferenceByTime(), result.getModelByTime() );
+										
+										if(bestParamValues == null) {
+											bestParamValues = copyDoubleArray(recentParamValues[row-1]);
+											bestError = result.getError();
+											bestVError = result.getValidationError();
+										}
+										
+										////////////////////////////////////////////////////////////////////////
+										// Add a Runnable to the UI thread's execution queue 
+										final Display display = Display.getDefault();
+										if (!display.isDisposed()) {
+											// Yes
+											try {
+												display.asyncExec(new Runnable() {
+													public void run() {
+														updateCharts();
+														updateValueLabels();
+													} // run
+												}); // display.asyncExec
+											} // try
+											catch (final Exception e) {
+												// Ignore there could be a race condition with the display being disposed
+											} // catch Exception
+										} // if (!display.isDisposed()) 
+									}// if(result != null)
+								} else if(evt.status == ALGORITHM_STATUS.RESTARTED_ALGORITHM) {
+									// The algorithm has restarted. Smallest value in 
+									// evt.result
+								}
+							}
+						});
+					}
+				}
+			});
+			
+		}// if(manager null)
+		
+		
+		updateCharts();
+		
+	} // createContents
+	
+	/**
+	 * filter +ve, -ve infinity, etc
+	 * @param error
+	 * @return
+	 */
+	static double plottableError(double error) {
+		if((error==Double.POSITIVE_INFINITY)
+											||(error==Double.NEGATIVE_INFINITY)
+											||Double.isNaN(error)
+											||(error==Double.MAX_VALUE)) {
+			return 100.0;
+		} else {
+			return error;
+		}
+				
+				
+	}
+	
+	private void reset() {
+		// Reset everything at the beginning of an automated experiment
+		errorHistory = new double[1];
+		errorHistory[0] = 0;
+		
+		newErrorTimeSeries = new double[1];
+		newErrorTimeSeries[0] = 0;
+		
+		referenceIncidence = new double[1];
+		referenceIncidence[0] = 0;
+		
+		modelIncidence = new double[1];
+		modelIncidence[0] = 0;
+		
+		errorConvergenceByRun.resetData();
+		currentErrorByTime.resetData();
+		aggregateErrorByTime.resetData();
+		//errorConvergenceByRun.clearData();
+		//currentErrorByTime.clearData();
+		errorHistoryList = new ArrayList<Double>();
+		
+		bestSeries = null;
+		bestError = Double.MAX_VALUE;
+		bestVError = Double.MAX_VALUE;
+		
+		runParamNames = null;
+		bestParamValues = null;
+		restartParamValues = null;
+		recentParamValues = null;
+		recentErrors = null;
+		recentVErrors = null;
+		
+		if(attributeLabels != null)
+			for(int i=0;i<attributeLabels.length;++i) {
+			attributeLabels[i].dispose();
+			attributeLabels[i] = null;
+		}
+		attributeLabels = null;
+		if(bestValueLabels != null) 
+			for(int i=0;i<bestValueLabels.length;++i) {
+				bestValueLabels[i].dispose();
+				bestValueLabels[i] = null;
+			}
+		bestValueLabels = null;
+		
+		if(recentValueLabels != null)
+			for(int i=0;i<recentValueLabels.length;++i)
+				for(int j=0;j<recentValueLabels[i].length;++j) {
+					recentValueLabels[i][j].dispose();
+					recentValueLabels[i][j] = null;
+				}
+		recentValueLabels = null;
+		
+		if(controlLabels != null)
+			for(CLabel lab:controlLabels) lab.dispose(); 
+		
+		controlLabels = null;
+		
+		
+		if(restartValues!=null)
+			for(Text t:restartValues) t.dispose();
+		
+		row = 0; 
+		numColumns = 0;
+		valuesInitialized = false;
+	}
+	
+	/**
+	 * update the graphs
+	 */
+	public static void updateCharts() {
+		errorConvergenceByRun.draw();
+		currentErrorByTime.draw();
+		aggregateErrorByTime.draw();
+	}
+	
+	/**
+	 * redraw the graphs
+	 */
+	public static void redrawCharts() {
+		errorConvergenceByRun.redraw();
+		currentErrorByTime.redraw();
+		aggregateErrorByTime.redraw();
+	}
+	
+	
+	
+	/**
+	 * set up the time series chart
+	 * @param dataComposite
+	 */
+	private void getErrorTimeSeriesChart(Composite dataComposite) {
+				
+		// currentErrorByTime
+		currentErrorByTime = new ErrorTimeSeriesCanvas(this,dataComposite,
+				Messages.getString("AUTO.TITLE2"),
+				Messages.getString("AUTO.ERROR"),// y axis
+				Messages.getString("AUTO.TIME"),// x axis
+				Messages.getString("AUTO.TITLE2"), //first property (line series name)
+				foreGround,
+				backgroundGround,
+				frameColor, CURRENT_ERROR_BY_TIME_ID, true);
+		final FormData timeSeriesFormData = new FormData();
+		currentErrorByTime.setLayoutData(timeSeriesFormData);
+		timeSeriesFormData.top = new FormAttachment(dataComposite, 0);
+		timeSeriesFormData.bottom = new FormAttachment(100, 0);
+		timeSeriesFormData.left = new FormAttachment(0, 0);
+		timeSeriesFormData.right = new FormAttachment(100, 0);
+		
+		currentErrorByTime.redraw();
+		
+	}// getErrorTimeSeries
+	
+	/**
+	 * set up the time series chart
+	 * @param dataComposite
+	 */
+	private void getAggregateTimeSeriesChart(Composite dataComposite) {
+				
+		// currentErrorByTime
+		aggregateErrorByTime = new AggregateTimeSeriesCanvas(this,dataComposite,
+				Messages.getString("AUTO.TITLE4"),
+				Messages.getString("AUTO.INCIDENCE"),// y axis
+				Messages.getString("AUTO.TIME"),// x axis
+				Messages.getString("AUTO.TITLE4"), //first property (line series name)
+				foreGround,
+				backgroundGround,
+				frameColor, AGGREGATE_BY_TIME_ID, true);
+		final FormData timeSeriesFormData = new FormData();
+		aggregateErrorByTime.setLayoutData(timeSeriesFormData);
+		timeSeriesFormData.top = new FormAttachment(dataComposite, 0);
+		timeSeriesFormData.bottom = new FormAttachment(100, 0);
+		timeSeriesFormData.left = new FormAttachment(0, 0);
+		timeSeriesFormData.right = new FormAttachment(100, 0);
+		
+		aggregateErrorByTime.redraw();
+		
+	}// getAggregateTimeSeries
+	
+	
+	/**
+	 * set up the run history charts
+	 * @param dataComposite
+	 */
+	private void getRunHistoryChart(Composite dataComposite) {
+		// errorConvergenceByRun
+		errorConvergenceByRun = new RunHistoryCanvas(this,dataComposite,
+				Messages.getString("AUTO.TITLE1"),
+				Messages.getString("AUTO.ERROR"), // yaxis
+				Messages.getString("AUTO.RUN"),// x axis
+				Messages.getString("AUTO.TITLE1"), // first propery (line series name)
+				foreGround,
+				backgroundGround,
+				frameColor, ERROR_CONVERGENCE_BY_RUN_ID, true);
+		final FormData TimeSeries1FormData = new FormData();
+		errorConvergenceByRun.setLayoutData(TimeSeries1FormData);
+		TimeSeries1FormData.top = new FormAttachment(dataComposite, 0);
+		TimeSeries1FormData.bottom = new FormAttachment(100, 0);
+		TimeSeries1FormData.left = new FormAttachment(0, 0);
+		TimeSeries1FormData.right = new FormAttachment(100, 0);
+		
+		errorConvergenceByRun.redraw();
+	
+	}// getEquationSeries
+	
+	
+	/**
+	 * set up the controls
+	 * @param dataComposite
+	 */
+	private void getControls() {
+		
+		controlsComposite.setLayout(new FormLayout());
+		
+		final FormData controlTopFormData = new FormData();
+		controlsActionComposite = new Composite(controlsComposite,SWT.BORDER);
+		controlsActionComposite.setLayoutData(controlTopFormData);
+		controlTopFormData.top = new FormAttachment(0, 0);
+		controlTopFormData.bottom = new FormAttachment(20, 0);
+		controlTopFormData.left = new FormAttachment(0, 0);
+		controlTopFormData.right = new FormAttachment(100, 0);
+		
+		
+		final FormData controlBottomFormData = new FormData();
+		controlsValuesComposite = new Composite(controlsComposite,SWT.BORDER);
+		controlsValuesComposite.setLayoutData(controlBottomFormData);
+		controlBottomFormData.top = new FormAttachment(controlsActionComposite, 0);
+		controlBottomFormData.bottom = new FormAttachment(100, 0);
+		controlBottomFormData.left = new FormAttachment(0, 0);
+		controlBottomFormData.right = new FormAttachment(100, 0);
+		
+		
+		// Use form layout
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 5;
+		gridLayout.makeColumnsEqualWidth = true;
+		controlsActionComposite.setLayout(gridLayout);
+		
+//		// row 0 PAUSE
+//		// c1
+//		CLabel pauseLabel = new CLabel(controlsActionComposite, SWT.NONE);
+//		pauseLabel.setText(Messages.getString("AUTO.PAUSE"));
+//		// c2
+//		Button pauseButton = new Button(controlsActionComposite, SWT.TOGGLE);
+//		pauseButton.setImage(imageRegistry.get(ISharedImages.PAUSE_ICON));
+//		// c3
+//		CLabel noLabela = new CLabel(controlsActionComposite, SWT.NONE);
+//		noLabela.setText("");
+//		///////////////////////
+//		// c4
+//		CLabel noLabelb = new CLabel(controlsActionComposite, SWT.NONE);
+//		noLabelb.setText("");
+//		// c5
+//		CLabel noLabelc = new CLabel(controlsActionComposite, SWT.NONE);
+//		noLabelc.setText("");
+		
+		// row 1
+		// c1.
+		CLabel stopLabel = new CLabel(controlsActionComposite, SWT.NONE);
+		stopLabel.setText(Messages.getString("AUTO.STOP"));
+		// c2
+		stopButton = new Button(controlsActionComposite, SWT.PUSH);
+		stopButton.setImage(imageRegistry.get(ISharedImages.STOP_ICON));
+		stopButton.setEnabled(false); // we'll enable when an experiment is started
+		// c3
+		CLabel noLabel1 = new CLabel(controlsActionComposite, SWT.NONE);
+		noLabel1.setText("");
+		
+		Button[] radios = new Button[2];
+
+		radios[0] = new Button(controlsActionComposite, SWT.RADIO);
+	    radios[0].setSelection(true);
+	    radios[0].setText(Messages.getString("AUTO.LATEST"));
+	    radios[0].setBounds(10, 5, 75, 30);
+
+	    radios[1] = new Button(controlsActionComposite, SWT.RADIO);
+	    radios[1].setText(Messages.getString("AUTO.BEST"));
+	    radios[1].setBounds(10, 30, 75, 30);
+	    radios[0].setSelection(true);
+		
+		
+		
+		// row 2
+		// c1
+		CLabel restartLabel = new CLabel(controlsActionComposite, SWT.NONE);
+		restartLabel.setText(Messages.getString("AUTO.RESTART"));
+		// c2
+		restartButton = new Button(controlsActionComposite, SWT.PUSH);
+		restartButton.setImage(imageRegistry.get(ISharedImages.RESTART_ICON));
+		restartButton.setEnabled(false);
+		// c3
+		CLabel paramsLabel = new CLabel(controlsActionComposite, SWT.NONE);
+		paramsLabel.setText(Messages.getString("AUTO.RESTART_HEADER"));
+		///////////////////////
+		// c4
+		CLabel noLabel2 = new CLabel(controlsActionComposite, SWT.NONE);
+		noLabel2.setText("");
+		// c5
+		CLabel noLabel3 = new CLabel(controlsActionComposite, SWT.NONE);
+		noLabel3.setText("");
+		
+		
+		
+		
+		// ACTIONS
+//		pauseButton.addListener(SWT.Selection, new Listener() {
+//			public void handleEvent(Event e) {
+//				switch (e.type) {
+//				case SWT.Selection:
+//					// toggle
+//					pauseTrigger = !pauseTrigger;
+//					if(pauseTrigger) {
+//						AutomaticExperimentManager.pause();
+//					} else {
+//						AutomaticExperimentManager.continueRun();
+//					}
+//					
+//					break;
+//				}
+//			}
+//		});
+		
+		stopButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event e) {
+				switch (e.type) {
+				case SWT.Selection:
+					stopButton.setEnabled(false);
+					AutomaticExperimentManager.getInstance().quitNow();
+					restartButton.setEnabled(true);
+					break;
+				}
+			}
+		});
+		
+		restartButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event e) {
+				switch (e.type) {
+				case SWT.Selection:
+					AutomaticExperimentManager.getInstance().restartNow(restartParamValues);
+					break;
+				}
+			}
+		});
+		
+		radios[0].addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event e) {
+				switch (e.type) {
+				case SWT.Selection:
+					selectLatestAction();
+					break;
+				}
+			}
+		});
+		radios[1].addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event e) {
+				switch (e.type) {
+				case SWT.Selection:
+					selectBestAction();
+					break;
+				}
+			}
+		});
+
+		controlsComposite.pack();
+		controlsComposite.layout();
+		controlsComposite.setVisible(true);
+		
+	}// getControls
+	
+	
+	/**
+	 * set up the controls
+	 * @param dataComposite
+	 */
+	private void getSettings() {
+		
+		settingsComposite.setLayout(new FormLayout());
+		
+		
+		settingsComposite.pack();
+		settingsComposite.layout();
+		settingsComposite.setVisible(true);
+		
+	}// getSETTINGS
+	
+	
+	
+	
+	
+	
+	/**
+	 * 
+	 */
+	private static void selectLatestAction() {
+		restartWithLatest = true;
+		if(bestParamValues!=null) {
+			for(int i = 0; i < (bestParamValues.length) -1; i ++) {
+				if(recentParamValues!=null) restartParamValues[i] = recentParamValues[row-1][i];
+			}
+		}
+		updateRestartLabels(white);
+	} // select latest
+	
+	
+	/**
+	 * 
+	 */
+	private static void selectBestAction() {
+		restartWithLatest = false;
+		if(bestParamValues != null) {
+			for(int i = 0; i < (bestParamValues.length) -1; i ++) {
+				restartParamValues[i] = bestParamValues[i];
+			}
+		}
+		updateRestartLabels(lightGreen);
+	}// select best
+	
+	
+	/**
+	 * set up the four data time series charts
+	 * @param dataComposite
+	 */
+	protected static void updateValueLabels() {
+		if(bestParamValues != null) {
+			for(int i=0;i<numColumns;++i)
+				bestValueLabels[i].setText(bestParamValues[i]+"");
+			
+			bestValueLabels[numColumns].setText(bestError+"");
+			bestValueLabels[numColumns+1].setText(bestVError+"");
+		}
+		for(int i = 0; i < NUMROWS; ++i) 
+			for(int j=0;j<numColumns+1;++j) {
+				if(j< numColumns)
+					recentValueLabels[i][j].setText(recentParamValues[i][j]+"");
+				else if(recentErrors[i]!=-1) { 
+					recentValueLabels[i][j].setText(recentErrors[i]+"");
+					recentValueLabels[i][j+1].setText(recentVErrors[i]+"");
+				}
+				else {
+					recentValueLabels[i][j].setText("...");
+					recentValueLabels[i][j+1].setText("...");
+				}
+		}
+		
+		valuesComposite.redraw();
+		valuesComposite.update();
+		
+		if(restartParamValues!=null) {
+			for(int j=0;j<numColumns;++j) {
+				restartValues[j].setText(restartParamValues[j]+"");
+				}
+			controlsValuesComposite.redraw();
+			controlsValuesComposite.update();
+		}
+	
+	}// updateValueLabels
+	
+	/**
+	 * called by radio button action
+	 */
+	protected static void updateRestartLabels(final Color bg) {
+		try {
+			display.asyncExec(new Runnable() {
+				public void run() {
+					if(restartParamValues!=null) {
+						for(int j=0;j<numColumns;++j) {
+							restartValues[j].setText(restartParamValues[j]+"");
+							restartValues[j].setBackground(bg);
+							}
+						controlsValuesComposite.redraw();
+						controlsValuesComposite.update();
+					}
+				} // run
+			}); // display.asyncExec
+		} // try
+		catch (final Exception e) {
+			// Ignore there could be a race condition with the display being disposed
+		} // catch Exception
+	}
+	
+	static boolean valuesInitialized = false;
+	/**
+	 * 
+	 * @param attributes
+	 * @param initialValues
+	 */
+	protected static void initializeValueLabels(String[] attributes) {
+		
+		int numAttrEntries = attributes.length;
+		int numColumns = numAttrEntries;
+
+		// Use form layout
+		GridLayout gl = new GridLayout();
+		gl.numColumns = numColumns+2; // error and validation error
+		valuesComposite.setLayout(gl);
+		controlsValuesComposite.setLayout(gl);
+		int width = 800/numColumns;
+		
+		attributeLabels = new CLabel[numColumns+2];
+		bestValueLabels = new Text[numColumns+2];
+		recentValueLabels = new Text[NUMROWS][numColumns+2];
+		
+			for(int i = 0; i < numColumns; i ++) {
+				attributeLabels[i] = new CLabel(valuesComposite, SWT.BORDER);
+				attributeLabels[i].setText(attributes[i]);
+				attributeLabels[i].setBackground(cyan);
+				final GridData titleGridData = new GridData();
+				attributeLabels[i].setLayoutData(titleGridData);
+			    titleGridData.grabExcessHorizontalSpace=true;
+			    titleGridData.minimumWidth=width;
+			    titleGridData.horizontalAlignment = GridData.FILL;
+			}
+			attributeLabels[numColumns] = new CLabel(valuesComposite, SWT.BORDER);
+			attributeLabels[numColumns].setText("Error");
+			attributeLabels[numColumns].setBackground(cyan);
+			attributeLabels[numColumns+1] = new CLabel(valuesComposite, SWT.BORDER);
+			attributeLabels[numColumns+1].setText("VError");
+			attributeLabels[numColumns+1].setBackground(cyan);
+			
+			final GridData titleGridData = new GridData();
+			attributeLabels[numColumns].setLayoutData(titleGridData);
+		    titleGridData.grabExcessHorizontalSpace=true;
+		    titleGridData.minimumWidth=width;
+		    titleGridData.horizontalAlignment = GridData.FILL;
+			
+		    final GridData titleGridData2 = new GridData();
+			attributeLabels[numColumns+1].setLayoutData(titleGridData2);
+		    titleGridData2.grabExcessHorizontalSpace=true;
+		    titleGridData2.minimumWidth=width;
+		    titleGridData2.horizontalAlignment = GridData.FILL;
+		    
+			for(int i = 0; i < numColumns+2; i ++) {
+				bestValueLabels[i] = new Text(valuesComposite, SWT.BORDER);
+				bestValueLabels[i].setText(""); // nothing yet
+				bestValueLabels[i].setBackground(lightGreen); 
+				final GridData textGridData = new GridData();
+				bestValueLabels[i].setLayoutData(textGridData);
+			    textGridData.grabExcessHorizontalSpace=true;
+			    textGridData.minimumWidth=width;
+			    textGridData.horizontalAlignment = GridData.FILL;
+			}
+			
+			for(int i=0;i<NUMROWS;++i)
+				for(int j=0;j<numColumns+2;++j) {
+					recentValueLabels[i][j] = new Text(valuesComposite, SWT.BORDER);
+					recentValueLabels[i][j].setText(""); // nothing yet
+					recentValueLabels[i][j].setBackground(white);
+					final GridData textGridData = new GridData();
+					recentValueLabels[i][j].setLayoutData(textGridData);
+				    textGridData.grabExcessHorizontalSpace=true;
+				    textGridData.minimumWidth=width;
+				    textGridData.horizontalAlignment = GridData.FILL;
+				}	
+		 
+		valuesComposite.layout();
+		//valuesComposite.pack();
+		//valuesComposite.setVisible(true);
+		valuesComposite.redraw();
+		valuesInitialized = true;
+	
+	}// initializeValueLabels
+	
+	
+
+	/**
+	 * 
+	 * @param attributes
+	 * @param initialValues
+	 */
+	protected static void initializeControlLabels(String[] attributes) {
+		
+		int numAttrEntries = attributes.length;
+		int numColumns = numAttrEntries;
+
+		// Use form layout
+		GridLayout gl = new GridLayout();
+		gl.numColumns = numColumns;
+		
+		controlsValuesComposite.setLayout(gl);
+		int width = 800/numColumns;
+		
+		controlLabels = new CLabel[numColumns];
+		restartValues = new Text[numColumns];
+		
+			for(int i = 0; i < numColumns; i ++) {
+				controlLabels[i] = new CLabel(controlsValuesComposite, SWT.BORDER);
+				controlLabels[i].setText(attributes[i]);
+				controlLabels[i].setBackground(cyan);
+				final GridData titleGridData = new GridData();
+				controlLabels[i].setLayoutData(titleGridData);
+			    titleGridData.grabExcessHorizontalSpace=true;
+			    titleGridData.minimumWidth=width;
+			    titleGridData.horizontalAlignment = GridData.FILL;
+			}
+		
+			final GridData titleGridData = new GridData();
+			
+		    titleGridData.grabExcessHorizontalSpace=true;
+		    titleGridData.minimumWidth=width;
+		    titleGridData.horizontalAlignment = GridData.FILL;
+			
+			for(int j=0;j<numColumns;++j) {
+				restartValues[j] = new Text(controlsValuesComposite, SWT.BORDER);
+				restartValues[j].setText(""); // nothing yet
+				restartValues[j].setBackground(white);
+				final GridData textGridData = new GridData();
+				restartValues[j].setLayoutData(textGridData);
+			    textGridData.grabExcessHorizontalSpace=true;
+			    textGridData.minimumWidth=width;
+			    textGridData.horizontalAlignment = GridData.FILL;
+			    
+			    final int ind = j;
+			    restartValues[j].addModifyListener(new ModifyListener() {
+					
+					public void modifyText(ModifyEvent e) {
+						try {
+							String text = ((Text)e.getSource()).getText();
+							restartParamValues[ind] = Double.parseDouble(text);
+						} catch(Exception ex) {
+							// The user entered an invalid double value. Ignore
+						}
+					}
+				});
+			}	
+		 
+		controlsValuesComposite.layout();
+		controlsValuesComposite.redraw();
+		valuesInitialized = true;
+	
+	}// initializeControlLabels
+	
+	
+	
+	
+	
+
+	/**
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	@Override
+	public void dispose() {
+						
+		super.dispose();
+		
+	} // dispose
+
+	
+	/**
+	 * not used
+	 * @return null
+	 */
+	public Identifiable getIdentifiable() {
+		return null;
+	}
+
+	
+
+	/**
+	 * get the value for plotting
+	 * @see org.eclipse.stem.util.analysis.views.AnalysisControl#getValues(int, int)
+	 */
+	public double[] getValues(int chartIndex, int state) {
+		
+		if(chartIndex == 0) return errorHistory;
+		if(chartIndex == 1) {
+			if(state==0) return newErrorTimeSeries;
+			if(state==1) return bestSeries;
+		}
+		if(chartIndex == 2) {
+			if(state==0) return referenceIncidence;
+			if(state==1) return modelIncidence;
+		}
+		// should never happen
+		return null;
+	}
+	
+	/**
+	 * Not used
+	 * @param chartIndex not used (only one chart)
+	 * @param state
+	 * @return property name
+	 */
+	public String getProperty(int chartIndex, int state) {
+		if(chartIndex==0) return Messages.getString("AUTO.TITLE1");
+		if(chartIndex==1) {
+			if(state==0) return Messages.getString("AUTO.TITLE2");
+			if(state==1) return Messages.getString("AUTO.TITLE3");
+		}
+		if(chartIndex==2) {
+			if(state==0) return Messages.getString("AUTO.TITLE4");
+			if(state==1) return Messages.getString("AUTO.TITLE5");
+		}
+		return  Messages.getString("AUTO.NOTFOUNDERROR");
+	}
+	
+	
+	
+	
+	
+	/**
+	 * Not used
+	 * @param chartIndex not used (only one chart)
+	 * @return the number of properties, only one
+	 * @see org.eclipse.stem.util.analysis.views.AnalysisControl#getNumProperties(int chartIndex)
+	 */
+	public int getNumProperties(int chartIndex) {
+		if(chartIndex==ERROR_CONVERGENCE_BY_RUN_ID) return 1; // one thing to chart
+		if(chartIndex==CURRENT_ERROR_BY_TIME_ID) return 2; // two things to chart
+		if(chartIndex==AGGREGATE_BY_TIME_ID) return 2; // two things to chart
+		return 0; // should never happen
+	}
+
+	/**
+	 * 
+	 * @param error
+	 */
+	public static void appendLatestErrorData(double error) {
+		errorHistoryList.add(new Double(error));
+		errorHistory = new double[errorHistoryList.size()];
+		for(int i = 0; i < errorHistoryList.size(); i ++) {
+			errorHistory[i] = errorHistoryList.get(i).doubleValue();
+		}
+	}
+
+	/**
+	 * 
+	 * @param error
+	 * @param verror Validation error
+	 * @param errorByTimeStep
+	 * @param refIncidence
+	 * @param bestIncidence
+	 */
+	public static void setRecentTimeSeries(double error, double verror, EList<Double> errorByTimeStep, EList<Double> refIncidence, EList<Double> incidence) {
+		newErrorTimeSeries = new double[errorByTimeStep.size()];
+		referenceIncidence = new double[refIncidence.size()];
+		modelIncidence = new double[incidence.size()];
+		for(int i = 0; i < errorByTimeStep.size(); i ++) { 
+			newErrorTimeSeries[i] = errorByTimeStep.get(i).doubleValue();
+			referenceIncidence[i] = refIncidence.get(i).doubleValue();
+			modelIncidence[i] = incidence.get(i).doubleValue();
+		}
+		if(bestSeries==null) bestSeries = newErrorTimeSeries;
+		if(error <= bestError) {
+			bestError = error;
+			bestVError = verror;
+			bestSeries = newErrorTimeSeries;
+			bestParamValues = copyDoubleArray(recentParamValues[row-1]);
+		}
+		
+		
+	}
+
+
+
+	@Override
+	protected void initializeHeader(String folderName) {
+		// TOD