<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://bisb.gla.org/dataset"
            xmlns="http://bisb.gla.org/dataset" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="qualified" 
            attributeFormDefault="unqualified" 
            version="0.1">
    <xsd:annotation>
        <xsd:documentation>
         *   Dataset description schema.
         *   Author: Vladislav Vyshemirsky
        </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleType name="SId">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="(_|[a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="Element">
           <xsd:attribute name="index" type="xsd:int" use="required"/>
           <xsd:attribute name="value" type="xsd:double" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="Row">
           <xsd:sequence>
                <xsd:element name="element" type="Element" maxOccurs="unbounded"/>
           </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="Data">
           <xsd:sequence>
                <xsd:element name="row" type="Row" maxOccurs="unbounded"/>
           </xsd:sequence>
		   <xsd:attribute name="cols" type="xsd:int" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="Initial">
           <xsd:attribute name="species" type="SId" use="required"/>
           <xsd:attribute name="value" type="xsd:double" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="Change">
           <xsd:attribute name="species" type="SId" use="required"/>
           <xsd:attribute name="value" type="xsd:double" use="required"/>
           <xsd:attribute name="time" type="xsd:double" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="Condition">
           <xsd:sequence>
                <xsd:element name="initial" type="Initial" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="change" type="Change" minOccurs="0" maxOccurs="unbounded"/>
           </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="IInitial">
           <xsd:attribute name="species" type="SId" use="required"/>
           <xsd:attribute name="col" type="xsd:int" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="IChange">
           <xsd:attribute name="species" type="SId" use="required"/>
           <xsd:attribute name="col" type="xsd:int" use="required"/>
           <xsd:attribute name="time" type="xsd:double" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="ITime">
           <xsd:attribute name="col" type="xsd:int" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="IReadout">
           <xsd:attribute name="expression" type="xsd:string" use="required"/>
           <xsd:attribute name="col" type="xsd:int" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="Interpretation">
           <xsd:sequence>
                <xsd:element name="initial" type="IInitial" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="change" type="IChange" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="time" type="ITime" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="readout" type="IReadout" minOccurs="0" maxOccurs="unbounded"/>
           </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="NoiseType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="normal"/>
            <xsd:enumeration value="lognormal"/>
            <xsd:enumeration value="sepnormal"/>
            <xsd:enumeration value="seplognormal"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="Dataset">
             <xsd:sequence>
               <xsd:element name="data" type="Data" minOccurs="0" maxOccurs="1"/>
               <xsd:element name="condition" type="Condition" minOccurs="0" maxOccurs="1"/>
               <xsd:element name="interpretation" type="Interpretation" minOccurs="0" maxOccurs="1"/>
             </xsd:sequence>
             <xsd:attribute name="noise" type="NoiseType" use="required" />
             <xsd:attribute name="name" type="xsd:string" use="optional"/>
    </xsd:complexType>
    <xsd:element name="dataset" type="Dataset"/>
</xsd:schema>
