<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.dmg.org/PMML-3_0"
    xmlns="http://www.dmg.org/PMML-3_0"
    elementFormDefault="unqualified">

  <xs:include schemaLocation="pmml-3-0.xsd"/>

  <!-- ================================================================== -->
  <!-- NOTE: this is just to facilitate testing use-case fragments -->

  <xs:element name="BaselineModels">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="BaselineModel" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="TestDistributions" minOccurs="0" maxOccurs="unbounded"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- ================================================================== -->

  <xs:element name="BaselineModel">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="MiningSchema"/>
        <xs:element ref="Output" minOccurs="0" />
        <xs:element ref="ModelStats" minOccurs="0"/>
        <xs:element ref="Targets" minOccurs="0" />
        <xs:element ref="LocalTransformations" minOccurs="0" />
        <xs:element ref="TestDistributions"/>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="modelName" type="xs:string" use="optional" />
      <xs:attribute name="functionName" type="MINING-FUNCTION" use="required" />
      <xs:attribute name="algorithmName" type="xs:string" use="optional" />
    </xs:complexType>
  </xs:element>

  <!-- ================================================================== -->

  <xs:element name="TestDistributions">
    <xs:complexType>
      <xs:sequence>
        <xs:group ref="BASELINE-AND-ALTERNATE" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="field" type="FIELD-NAME" use="optional" />
      <xs:attribute name="testStatistic" type="BASELINE-TEST-STATISTIC" use="optional" />
      <xs:attribute name="testType" type="BASELINE-TEST-TYPE" use="required" />
      <xs:attribute name="threshold" type="REAL-NUMBER" use="required" />
      <xs:attribute name="resetValue" type="REAL-NUMBER" default="0.0" use="optional" />
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="BASELINE-TEST-STATISTIC">
    <xs:restriction base="xs:string">
      <xs:enumeration value="count" />
      <xs:enumeration value="zValue" />
      <xs:enumeration value="chiSquared" />
      <xs:enumeration value="fisher" />
      <xs:enumeration value="fisherExact" />
      <xs:enumeration value="yatesContinuityCorrection" />
      <xs:enumeration value="CUSUM" />
      <xs:enumeration value="GLR" />
      <xs:enumeration value="logOddsRatio" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="BASELINE-TEST-TYPE">
    <xs:restriction base="xs:string">
      <xs:enumeration value="threshold" />
      <xs:enumeration value="singleSidedPValue" />
      <xs:enumeration value="twoSidedPValue" />
    </xs:restriction>
  </xs:simpleType>

  <!-- ================================================================== -->

  <!-- standard, least-restricted contents of TestDistributions -->
  <xs:group name="BASELINE-AND-ALTERNATE">
    <xs:sequence>
      <xs:group ref="BASELINE-DISTRIBUTION" minOccurs="1" maxOccurs="1"/>
      <xs:group ref="ALTERNATE-DISTRIBUTIONS" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:group>

  <!-- the choice to use Baseline and Alternate container elements
       (rather than an equivalent role attribute on the Distribution
       elements) makes this quite complex.

       TODO:? disallow mixing of Continuous and Discrete Distribution
       Elements.  This will require some "Derivation by Restriction"
       trickery, otherwise "nondeterministic content" errors result.
   -->

  <xs:group name="ANY-DISTRIBUTION">
    <xs:choice>
      <xs:group ref="CONTINUOUS-DISTRIBUTION"/>
      <xs:group ref="DISCRETE-DISTRIBUTION"/>
    </xs:choice>
  </xs:group>

  <xs:element name="Baseline">
    <xs:complexType>
      <xs:sequence>
        <xs:group ref="ANY-DISTRIBUTION" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="Alternate">
    <xs:complexType>
      <xs:sequence>
        <xs:group ref="ANY-DISTRIBUTION" minOccurs="1" maxOccurs="unbounded"/>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- default to Baseline if Distribution not wrapped
       in Baseline or Alternate elements -->
  <xs:group name="BASELINE-DISTRIBUTION">
    <xs:choice>
      <xs:element ref="Baseline"/>
      <xs:group ref="ANY-DISTRIBUTION"/>
    </xs:choice>
  </xs:group>

  <xs:group name="ALTERNATE-DISTRIBUTIONS">
    <xs:choice>
      <xs:element ref="Alternate"/>
    </xs:choice>
  </xs:group>


  <!-- ================================================================== -->

  <xs:group name="CONTINUOUS-DISTRIBUTION">
    <xs:choice>
      <xs:element ref="AnyDistribution"/>
      <xs:element ref="GaussianDistribution"/>
      <xs:element ref="PoissonDistribution"/>
      <xs:element ref="UniformDistribution"/>
    </xs:choice>
  </xs:group>

  <xs:element name="AnyDistribution">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="mean" type="REAL-NUMBER" use="required" />
      <xs:attribute name="variance" type="REAL-NUMBER" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="GaussianDistribution">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="mean" type="REAL-NUMBER" use="required" />
      <xs:attribute name="variance" type="REAL-NUMBER" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="PoissonDistribution">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="mean" type="REAL-NUMBER" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="UniformDistribution">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="lower" type="REAL-NUMBER" use="required" />
      <xs:attribute name="upper" type="REAL-NUMBER" use="required" />
    </xs:complexType>
  </xs:element>


  <!-- ================================================================== -->

  <xs:group name="DISCRETE-DISTRIBUTION">
    <xs:choice>
      <xs:element ref="CountTable"/>
      <xs:element ref="NormalizedCountTable"/>
      <xs:element ref="HistogramTable"/>
    </xs:choice>
  </xs:group>

  <xs:element name="CountTable" type="COUNT-TABLE-TYPE" />

  <xs:element name="NormalizedCountTable" type="COUNT-TABLE-TYPE" />

  <xs:element name="HistogramTable" type="COUNT-TABLE-TYPE" />

  <xs:complexType name="COUNT-TABLE-TYPE">
    <xs:sequence>
      <xs:element ref="FieldValueCounts" minOccurs="1" maxOccurs="unbounded"/>
      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="FieldValueCounts">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="FieldValueCount" minOccurs="1" maxOccurs="unbounded"/>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="field" type="FIELD-NAME" use="required" />
      <xs:attribute name="value" use="optional" />
    </xs:complexType>
  </xs:element>

  <xs:element name="FieldValueCount">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="field" type="FIELD-NAME" use="required" />
      <xs:attribute name="value" use="optional" />
      <xs:attribute name="count" type="NUMBER" use="required" />
    </xs:complexType>
  </xs:element>




  <!-- ================================================================== -->

</xs:schema>