<?xml version="1.0" encoding="UTF-8"?>
<!--
Version : 3.0.8
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Roster">
    <xs:complexType>
      <xs:sequence> 
        <xs:element name="SchedulingPeriodFile" type="xs:string" minOccurs="0"/> <!-- Can be relative to the solution or an absolute file path  -->
        <xs:element name="Penalty"    type="nonNegativeDouble" minOccurs="0"/> <!-- i.e. Objective function value -->
        <xs:element name="TimeStamp"  type="xs:dateTime" minOccurs="0"/>
        <xs:element name="DateFound"  type="xs:string"   minOccurs="0"/>
        <xs:element name="FoundBy"    type="xs:string"   minOccurs="0"/>
        <xs:element name="System"     type="xs:string"   minOccurs="0"/>
        <xs:element name="CPU"        type="xs:string"   minOccurs="0"/>
        <xs:element name="Algorithm"  type="xs:string"   minOccurs="0"/>
        <xs:element name="CpuTime"    type="xs:string"   minOccurs="0"/>
        <xs:element name="Employee" minOccurs="0" maxOccurs="unbounded" type="Employee"/>
        <xs:element name="Violations" minOccurs="0" maxOccurs="1" type="Violations"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>    
    
    <xs:complexType name="Employee">
      <xs:sequence>
        <xs:element name="Assign" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:choice>
                <xs:element name="Day"  type="xs:nonNegativeInteger"/>
                <xs:element name="Cell" type="xs:nonNegativeInteger"/>
              </xs:choice>
              <xs:element name="Shift">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute name="type" type="xs:string" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>              
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="ID" type="xs:string" use="required"/>
    </xs:complexType>
    
    <xs:complexType name="Violations">
      <xs:sequence>
        <xs:element name="EmployeeViolations" minOccurs="0" maxOccurs="1" type="EmployeeViolations"/>
        <xs:element name="RuleViolations"     minOccurs="0" maxOccurs="1" type="RuleViolations"/>
        <xs:element name="EmployeePairingsViolations" minOccurs="0" maxOccurs="1" type="EmployeePairingsViolations"/>
        <xs:element name="CoverViolations"    minOccurs="0" maxOccurs="1" type="CoverViolations"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="EmployeeViolations">
      <xs:sequence>
        <xs:element name="Employee" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:all> <!-- NB any order -->
              <xs:element name="Patterns" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="PatternViolation"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Workload" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="WorkloadViolation"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Requests" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="RequestViolation"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Conditionals" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="ConditionalViolation"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Other" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="OtherViolation"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:all>
            <xs:attribute name="ID" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="RuleViolations">
      <xs:sequence>
        <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="RuleViolation"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="EmployeePairingsViolations">
      <xs:sequence>
        <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="EmployeePairingViolation"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="CoverViolations">
      <xs:sequence>
        <xs:element name="Violation" minOccurs="0" maxOccurs="unbounded" type="CoverViolation"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="Cells">
      <xs:sequence>
        <xs:element name="Cell" minOccurs="0" maxOccurs="unbounded" type="xs:nonNegativeInteger"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="PatternViolation">
      <xs:sequence>
        <xs:element name="Label" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Count" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:nonNegativeInteger">
                <xs:attribute name="minmax" type="MinMax" use="optional"/>
                <xs:attribute name="tgt"    type="xs:nonNegativeInteger" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="WeightFunction" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="weight" type="nonNegativeDouble" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="Penalty" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Matches" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Cells" minOccurs="0" maxOccurs="unbounded" type="Cells"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="WorkloadViolation">
      <xs:sequence>
        <xs:element name="Label" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Count" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="WeightFunction" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Penalty" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Cells" minOccurs="1" maxOccurs="1" type="Cells" />
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="OtherViolation">
      <xs:sequence>
        <xs:element name="Constraint" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Label" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Count" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="WeightFunction" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Penalty" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Cells" minOccurs="1" maxOccurs="1" type="Cells" />
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="RequestViolation">
      <xs:sequence>
        <xs:element name="ID" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Label" minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Penalty" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Cell" minOccurs="1" maxOccurs="1" type="xs:nonNegativeInteger"/>
      </xs:sequence>
    </xs:complexType>
        
    <xs:complexType name="ConditionalViolation">
      <xs:sequence>
        <xs:element name="Label"   minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Penalty" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="RuleViolation">
      <xs:sequence>
        <xs:element name="Label"    minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Penalty"  minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Cells"    minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Cell" minOccurs="0" maxOccurs="unbounded" type="xs:nonNegativeInteger"/>
            </xs:sequence>
            <xs:attribute name="Employee" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="EmployeePairingViolation">
      <xs:sequence>
        <xs:element name="Employee" minOccurs="1" maxOccurs="unbounded" type="xs:string"/>
        <xs:element name="Label"    minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Count"    minOccurs="1" maxOccurs="1" type="xs:nonNegativeInteger"/>
        <xs:element name="Penalty"  minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Cells"    minOccurs="1" maxOccurs="1" type="Cells"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="CoverViolation">
      <xs:sequence>
        <xs:choice>
        <xs:element name="Skill"      type="xs:string" minOccurs="0"/>
        <xs:element name="SkillGroup" type="xs:string" minOccurs="0"/>
      </xs:choice>
      <xs:choice>
        <xs:element name="TimePeriod" type="TimePeriod"/>
        <xs:element name="Shift"      type="xs:string"/>
        <xs:element name="ShiftGroup" type="xs:string"/>
        <xs:element name="ShiftBlock" type="xs:string"/>
      </xs:choice>
        <xs:element name="Label"   minOccurs="1" maxOccurs="1" type="xs:string"/>
        <xs:element name="Count"   minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Penalty" minOccurs="1" maxOccurs="1" type="nonNegativeDouble"/>
        <xs:element name="Cell"    minOccurs="1" maxOccurs="1" type="xs:nonNegativeInteger"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="TimePeriod">
      <xs:all>
        <xs:element name="Start" type="xs:time" minOccurs="1"/>
        <xs:element name="End"   type="xs:time" minOccurs="1"/>
      </xs:all>
    </xs:complexType>
    
    <xs:simpleType name="nonNegativeDouble">
      <xs:restriction base="xs:double">
        <xs:minInclusive value="0"/>
      </xs:restriction>
    </xs:simpleType>
   
    <xs:simpleType name="MinMax">
      <xs:restriction base="xs:string">
        <xs:pattern value="([Mm][Ii][Nn])|([Mm][Aa][Xx])"/>
      </xs:restriction>
    </xs:simpleType>
    
</xs:schema>