<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.1">

   <xsd:element name="task" type="taskSpec" />

   <xsd:complexType name="taskSpec">
      <xsd:sequence>
         <xsd:element name="library" type="xsd:string"/>
         <xsd:choice>
            <xsd:element name="model" type="xsd:string"/>
            <xsd:element name="incomplete" type="xsd:string"/>
         </xsd:choice>
         <xsd:element name="data">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="d" type="datasetSpec" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         
         <xsd:element name="output" type="outputSpec"/>
         
         
         <xsd:element name="mappings" type="mappings"/>

         
         <xsd:element name="writeDir" type="xsd:string"/>
         <xsd:element name="command" type="command"/>
         <xsd:element name="settings" type="settings"/>
         
      </xsd:sequence>
   </xsd:complexType>

   <xsd:complexType name="datasetSpec">
      <xsd:simpleContent>
         <xsd:extension base="xsd:string">
            <xsd:attribute name="header" type="xsd:boolean" use="required"/>
            <xsd:attribute name="separator" type="xsd:string"/>
            <xsd:attribute name="id" type="xsd:string"/>
         </xsd:extension>
      </xsd:simpleContent>
   </xsd:complexType>
   
   <xsd:complexType name="outputSpec">
      <xsd:sequence>
         <xsd:element name="constants" minOccurs="0">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="cons" type="parameter" minOccurs="0" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="variables" minOccurs="0">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="var" type="modelVar" minOccurs="0" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   
   <xsd:complexType name="parameter">
      <xsd:sequence/>
      <xsd:attribute name="name" type="xsd:string"/>
      <xsd:attribute name="fit" type="xsd:boolean" use="required"/>
      <xsd:attribute name="value" type="xsd:double"/>
      <xsd:attribute name="lower" type="xsd:double"/>
      <xsd:attribute name="upper" type="xsd:double"/>
      <xsd:attribute name="initial" type="xsd:double"/>
   </xsd:complexType>
   
   <xsd:complexType name="modelVar">
      <xsd:simpleContent>
         <xsd:extension base="xsd:string">
            <xsd:attribute name="name" type="xsd:string"/>
         </xsd:extension>
      </xsd:simpleContent>
   </xsd:complexType>

   <xsd:complexType name="mappings">
      <xsd:sequence>
         <xsd:element name="dimensions">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="dim" type="mapping" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="endogenous" minOccurs="0">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="endo" type="mapping" minOccurs="0" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="exogenous" minOccurs="0">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="exo" type="mapping" minOccurs="0" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="outputs" minOccurs="0">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="out" type="mapping" minOccurs="0" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>

   <xsd:complexType name="mapping">
      <xsd:attribute name="name" type="xsd:string"/>
      <xsd:attribute name="col" type="xsd:string"/>
   </xsd:complexType>

   <xsd:simpleType name="command">
      <xsd:restriction base="xsd:string">
         <xsd:enumeration value="count"/>
         <xsd:enumeration value="enumerate"/>
         <xsd:enumeration value="exhaustive_search"/>
         <xsd:enumeration value="simulate_model"/>
      </xsd:restriction>
   </xsd:simpleType>

   <xsd:complexType name="settings">
      <xsd:sequence>
         <xsd:element name="initialvalues" type="initialValuesSpec" minOccurs="0"/>
         <xsd:element name="simulator" type="simulatorSpec" />
         <xsd:element name="fitter" type="fitterSpec" />
         <xsd:element name="evaluation" type="evalSpec" minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>

   <xsd:complexType name="initialValuesSpec">
      <xsd:sequence>
         <xsd:element name="sameforalldatasets" type="xsd:boolean" default="true"/>
         <xsd:element name="usedatasetvalues" type="xsd:boolean" default="false"/>
      </xsd:sequence>
   </xsd:complexType>

   <xsd:complexType name="simulatorSpec" abstract="true">
      <xsd:sequence>
         <xsd:element name="abstol" type="xsd:double"/>
         <xsd:element name="reltol" type="xsd:double"/>
         <xsd:element name="steps" type="xsd:int"/>         
      </xsd:sequence>
      <xsd:attribute name="method" type="xsd:string"/>
   </xsd:complexType>

   <xsd:complexType name="fitterSpec">
      <xsd:sequence>
         <xsd:element name="objectives" minOccurs="0">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="obj" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="evaluations" type="xsd:int"/>
         <xsd:element name="population" type="xsd:int"/>
         <xsd:element name="strategy" type="DEStrategy"/>         
         <xsd:element name="Cr" type="xsd:double"/>
         <xsd:element name="F" type="xsd:double"/>
      </xsd:sequence>
        <xsd:attribute name="method" type="xsd:string"/>
   </xsd:complexType>
      
   <xsd:simpleType name="DEStrategy">
      <xsd:restriction base="xsd:string">
         <xsd:enumeration value="rand/1/bin"/>
         <xsd:enumeration value="best/1/bin"/>
         <xsd:enumeration value="rand/1/exp"/>
         <xsd:enumeration value="best/1/exp"/>
         <xsd:enumeration value="current-to-rand/1/bin"/>
         <xsd:enumeration value="current-to-best/1/bin"/>
         <xsd:enumeration value="current-to-rand/1/exp"/>
         <xsd:enumeration value="current-to-best/1/exp"/>
      </xsd:restriction>
   </xsd:simpleType>

   <xsd:complexType name="evalSpec" abstract="true">
      <xsd:sequence>
         <xsd:element name="train" type="xsd:string" minOccurs="0"/>
         <xsd:element name="validation" type="xsd:string" minOccurs="0"/>
         <xsd:element name="test" type="xsd:string" minOccurs="0"/>
      </xsd:sequence>
      <xsd:attribute name="method" type="xsd:string"/>
   </xsd:complexType>

</xsd:schema>
