<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.matsim.org/files/dtd"
xmlns="http://www.matsim.org/files/dtd" elementFormDefault="qualified"
xml:lang="en">
<!-- Editor: Dominik Grether, VSP, Berlin Institute of Technology -->
<!-- This xml schema contains xml definitions used to configure the MATSim  -->

<xs:include schemaLocation="http://www.matsim.org/files/dtd/matsimCommon.xsd" />

<xs:element name="config" type="configType"/>

<xs:complexType name="configType">
  <xs:annotation>
    <xs:documentation>By a file conform to this xml schema all modules of the matsim framework can
    be configured.</xs:documentation>
  </xs:annotation>
  <xs:sequence>
    <xs:element name="scenario" type="scenarioType" minOccurs="1" maxOccurs="1"/>
    <xs:element name="simulation" type="simulationType" minOccurs="0" maxOccurs="1"></xs:element>
    <xs:element name="genericModule" type="genericModuleType" minOccurs="0" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="scenarioType">
  <xs:sequence>
    <xs:element name="coordinateSystem" type="xs:string" minOccurs="1" maxOccurs="1"/>
    <xs:element name="scenarioScaleFactor" type="xs:decimal" default="1" />
    <xs:element name="network" type="inputFileType" minOccurs="1" maxOccurs="1" />
    <xs:element name="population" type="inputFileType" minOccurs="1" maxOccurs="1" />
    <xs:element name="counts" type="countsType" minOccurs="0" maxOccurs="1" />
    <xs:element name="world" type="inputFileType" minOccurs="0" maxOccurs="1" />
    <xs:element name="facilities" type="inputFileType" minOccurs="0" maxOccurs="1" />  
    <xs:element name="scoring" type="scoringType" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="inputFileType">
  <xs:choice>
    <xs:element name="absolutPath" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="relativePath" type="xs:string" minOccurs="1" maxOccurs="1" />
  </xs:choice>
</xs:complexType>

<xs:complexType name="countsType">
  <xs:complexContent>
    <xs:extension base="inputFileType">
      <xs:sequence>
        <xs:element name="outputFormat" type="countsOutputFormatEnumType" default="all" minOccurs="0" maxOccurs="1" ></xs:element>
        <xs:element name="countsScaleFactor" type="xs:decimal" default="1" minOccurs="0" maxOccurs="1" ></xs:element>
        <xs:element name="distanceFilter" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <xs:element name="centerNode" type="idRefType" minOccurs="1" maxOccurs="1"></xs:element>
              <xs:element name="radius" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="meter" type="xs:decimal" use="required"></xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

<xs:simpleType name="countsOutputFormatEnumType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="all" />
    <xs:enumeration value="html" />
    <xs:enumeration value="kml" />
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="scoringType">
  <xs:sequence>
    <xs:element name="learningRate" type="xs:decimal" default="1.0" minOccurs="0" maxOccurs="1"></xs:element>
    <xs:element name="brainExpBeta" type="xs:decimal" minOccurs="1" maxOccurs="1"></xs:element>    
    <xs:element name="performing" type="xs:decimal" minOccurs="1" maxOccurs="1"></xs:element>    
    <xs:element name="traveling" type="xs:decimal" minOccurs="1" maxOccurs="1"></xs:element>    
    <xs:element name="lateArrival" type="xs:decimal" default="0.0" minOccurs="0" maxOccurs="1"></xs:element>    
    <xs:element name="earlyDeparture" type="xs:decimal" default="0.0" minOccurs="0" maxOccurs="1"></xs:element>    
    <xs:element name="waiting" type="xs:decimal" default="0.0" minOccurs="0" maxOccurs="1"></xs:element>    
    <xs:element name="activities">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="activity" type="activityType" minOccurs="1" maxOccurs="unbounded"></xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>    
  </xs:sequence>
</xs:complexType>

<xs:complexType name="activityType">
  <xs:sequence>
    <xs:element name="id" type="xs:positiveInteger" minOccurs="1" maxOccurs="1"></xs:element>
    <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="typicalDuration" type="xs:time" minOccurs="1" maxOccurs="1" />
    <xs:element name="priority" type="xs:positiveInteger" default="1" minOccurs="0" maxOccurs="1" ></xs:element>
    <xs:element name="openingTime" type="xs:time" minOccurs="0" maxOccurs="1" ></xs:element>
    <xs:element name="latestStartTime" type="xs:time" minOccurs="0" maxOccurs="1" ></xs:element>
    <xs:element name="closingTime" type="xs:time" minOccurs="0" maxOccurs="1" ></xs:element>
  </xs:sequence>
</xs:complexType>



<!-- types for simulation configuration -->
<xs:complexType name="simulationType">
  <xs:sequence>
    <xs:element name="runIdentifier" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="runOwner" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="runDate" type="xs:date" minOccurs="1" maxOccurs="1" />
    <xs:element name="firstIteration" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1" />
    <xs:element name="lastIteration" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1" />
    <xs:element name="outputDirectory" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="randomSeed" type="xs:long" minOccurs="1" maxOccurs="1" />
    <xs:element name="outputTimeFormat" type="matsimTimeFormatEnumType" default="HH:mm:ss" minOccurs="0" maxOccurs="1" />
    <xs:element name="localDtdBase" type="xs:string" default="dtd/" minOccurs="0" maxOccurs="1" />
    <xs:element name="mobilitySimulation" type="mobilitySimulationType" minOccurs="1" maxOccurs="1" />
    <xs:element name="replanning" type="replanningType" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:complexType>

<xs:simpleType name="matsimTimeFormatEnumType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="HH:mm" />
    <xs:enumeration value="HH:mm:ss" />
    <xs:enumeration value="ssss" />
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="mobilitySimulationType">
  <xs:sequence>
    <xs:element name="startTime" type="xs:time" default="00:00:00" minOccurs="0" maxOccurs="1" ></xs:element>  
    <xs:element name="endTime" type="xs:time" default="00:00:00" minOccurs="0" maxOccurs="1" ></xs:element>  
    <xs:element name="snapshotFormat" type="snapshotFormatEnumType" minOccurs="1" maxOccurs="1" ></xs:element>
    <xs:element name="snapshotperiod" type="xs:time" minOccurs="1" maxOccurs="1" ></xs:element>  
    <xs:element name="snapshotStyle" type="snapshotStyleEnumType" default="equiDist" minOccurs="0" maxOccurs="1"/>  
    <xs:element name="flowCapacitiyFactor" type="xs:decimal" default="1.0" minOccurs="0" maxOccurs="1"></xs:element>  
    <xs:element name="storageCapacityFactor" type="xs:decimal" default="1.0" minOccurs="0" maxOccurs="1"></xs:element>  
    <xs:element name="stuckTime" type="xs:decimal" default="10" minOccurs="0" maxOccurs="1"></xs:element>  
    <xs:element name="removeStuckVehicles" type="xs:boolean" default="false" minOccurs="0" maxOccurs="1"></xs:element>  
  </xs:sequence>
</xs:complexType>

<xs:simpleType name="snapshotFormatEnumType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="transims" />
    <xs:enumeration value="googleearth" />
    <xs:enumeration value="netvis" />
    <xs:enumeration value="otfvis" />
    <xs:enumeration value="plansfile" />
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="snapshotStyleEnumType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="equiDist" />
    <xs:enumeration value="queue" />
  </xs:restriction>
</xs:simpleType>

<!-- the replanning element is replacing the strategy module -->
<xs:complexType name="replanningType">
  <xs:sequence>
    <xs:element name="agentsMaxPlanMemorySize" type="xs:positiveInteger" default="4" minOccurs="0" maxOccurs="1"></xs:element>
    <xs:element name="strategy" type="strategyType" minOccurs="1" maxOccurs="unbounded"></xs:element>
  </xs:sequence>
</xs:complexType>


<xs:complexType name="strategyType">
  <xs:annotation>
    <xs:documentation>The strategy type defines the structure of one replanning module</xs:documentation>
  </xs:annotation>
  <xs:sequence>
    <xs:element name="id" type="xs:positiveInteger" minOccurs="1" maxOccurs="1"></xs:element>
    <xs:element name="planSelector" type="planSelectorType" minOccurs="1" maxOccurs="1"></xs:element>
    <xs:element name="weight" type="probabilityType" minOccurs="1" maxOccurs="1"/>
    <xs:element name="disableAfter" minOccurs="0" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="iterationNumber" type="xs:positiveInteger" use="required"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="modules" minOccurs="0" maxOccurs="1">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="module" type="moduleType" minOccurs="1" maxOccurs="unbounded"></xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

<xs:simpleType name="planSelectorType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="RandomPlanSelector" />
    <xs:enumeration value="SelectExpBeta" />
    <xs:enumeration value="ChangeExpBeta" />
    <xs:enumeration value="BestPlanSelector" />
    <xs:enumeration value="KeepSelected" />
    <xs:enumeration value="PathSizeLogitSelector" />
  </xs:restriction>
</xs:simpleType>


<xs:complexType name="moduleType">
  <xs:sequence>
    <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
  </xs:sequence>
</xs:complexType>

<!-- generic module type -->
<xs:complexType name="genericModuleType">
  <xs:sequence>
    <xs:element name="param" type="matsimParameterType" minOccurs="0" maxOccurs="unbounded"> </xs:element>
  </xs:sequence>
  <xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>

</xs:schema>
