<?xml version="1.0" encoding="utf-8"?>
<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"
xmlns:xml="http://www.w3.org/XML/1998/namespace" 
xml:lang="en">

<!--  <xs:include schemaLocation="http://www.matsim.org/files/dtd/matsimCommon.xsd"/>
--><xs:include schemaLocation="http://www.matsim.org/files/dtd/populationEnumTypes.xsd"/>
<xs:include schemaLocation="http://www.matsim.org/files/dtd/households_v1.0.xsd" />

<xs:annotation>
  <xs:documentation>
    This xml schema contains xml definitions for population information within the MATSim framework.
    This population schema is considered as stable file-format. Changes in this schema
    imply major changes in the code. All enumeration types needed by the data format are
    declared in a separate file as extensions in the enumerations are normally
    reflected by minor changes only.
  </xs:documentation>
  <xs:appinfo xmlns:dc="http://purl.org/dc/elements/1.1/">
    <dc:creator>
      Dominik Grether, VSP, Berlin Institute of Technology
    </dc:creator>
    <dc:title>
      Population Schema for MATSim
    </dc:title>  
    <dc:date>
      2008-06-05
    </dc:date>
    <dc:subject>
      matsim, synthetic population, transportation, multiagent simulation 
    </dc:subject>
    <dc:description>
      This xml schema contains xml definitions for population information within the MATSim framework
    </dc:description>
  </xs:appinfo>   
</xs:annotation>

<xs:element name="population">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="person" type="personType" minOccurs="1" maxOccurs="unbounded" />
      <xs:element ref="household" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="optional" />
  </xs:complexType>
</xs:element>

<xs:complexType name="personType">
  <xs:complexContent>
    <xs:extension base="matsimObjectType">
     <xs:sequence>
       <xs:element name="travelcard" type="travelcardType" minOccurs="0" maxOccurs="unbounded" />
       <xs:element name="knowledge" type="knowledgeType" minOccurs="0" maxOccurs="1" />
       <xs:element name="plan" type="planType" minOccurs="0" maxOccurs="unbounded"/>
       <xs:element name="fiscalHouseholdId" type="householdIdType" minOccurs="0" maxOccurs="1" />
     </xs:sequence>
     <xs:attribute name="sex" type="sexType" use="optional" />
     <xs:attribute name="age" type="xs:nonNegativeInteger" use="optional" />
     <xs:attribute name="license" type="xs:boolean" use="optional" />
     <xs:attribute name="carAvailable" type="carAvailType" use="optional"/>
     <xs:attribute name="isEmployed" type="xs:boolean" use="optional"/>
   </xs:extension>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="travelcardType">
  <xs:sequence>
    <xs:element name="swissTravelCard" type="swissTravelCardType"></xs:element>
  </xs:sequence>
</xs:complexType>


<xs:complexType name="knowledgeType">
  <xs:sequence>
    <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1" />
    <xs:element name="activity" type="activityType" minOccurs="1" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="planType" >
  <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="act" type="actType" minOccurs="0" maxOccurs="1" />
      <xs:element name="leg" type="legType" minOccurs="0" maxOccurs="1"/>      
  </xs:sequence>
  <xs:attribute name="score" type="xs:decimal" use="optional" />
  <xs:attribute name="selected" type="xs:boolean" default="false" />
</xs:complexType>

<xs:simpleType name="sexType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="f" />
    <xs:enumeration value="m" />
  </xs:restriction>
</xs:simpleType>



<xs:complexType name="activityType">
  <xs:sequence>
    <xs:element ref="location" minOccurs="0" maxOccurs="1" />
    <xs:element name="capacity" minOccurs="0" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="persons" type="xs:nonNegativeInteger" />
      </xs:complexType>
    </xs:element>
    <xs:element name="openingTime" minOccurs="0" maxOccurs="unbounded" >
      <xs:complexType>
        <xs:attribute name="day" type="dayType" default="wk" />
        <xs:attribute name="startTime" type="xs:time" use="required" />
        <xs:attribute name="endTime" type="xs:time" use="required" />
      </xs:complexType>
    </xs:element>
  </xs:sequence>
  <xs:attribute name="type" type="xs:string" use="required"></xs:attribute>
  <xs:attribute name="frequency" type="xs:nonNegativeInteger" use="optional">
    <xs:annotation>
      <xs:documentation>defines how often the person was at that place (in one year)</xs:documentation>
    </xs:annotation>
  </xs:attribute>
</xs:complexType>

<xs:complexType name="actType">
	<xs:sequence>
    <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
	</xs:sequence>
  <xs:attribute name="type" type="xs:string" use="required" />
  <xs:attribute name="startTime" type="xs:time" use="optional" />
  <xs:attribute name="endTime" type="xs:time" use="optional" />
  <!-- this could be coded with the xs:duration type would however be a change in the schema -->
  <xs:attribute name="duration" type="xs:time" use="optional">
    <xs:annotation>
    <xs:documentation>Deprecated attribute! Don't use this attribute anymore. It is only in the dataformat
    due to backwards compatibility reasons and will be removed in future versions.</xs:documentation>
    </xs:annotation>
  </xs:attribute>
</xs:complexType>

<xs:complexType name="legType">
  <xs:sequence>
    <xs:element name="route" type="routeType" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:attribute name="mode" type="legModeType" use="required" />
  <xs:attribute name="departureTime" type="xs:time" use="optional" /> 
  <xs:attribute name="travelTime" type="xs:time" use="optional" />
  <xs:attribute name="arrivalTime" type="xs:time" use="optional" />
</xs:complexType>


<xs:complexType name="activityLocationInformationType">
</xs:complexType>

<xs:complexType name="routeType">
  <xs:sequence>
    <xs:element name="startLink" type="idRefType" minOccurs="1" maxOccurs="1" />
    <xs:element name="link" type="idRefType" minOccurs="0" maxOccurs="unbounded" />
    <xs:element name="endLink" type="idRefType" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
  <xs:attribute name="distance" type="xs:decimal" use="optional" />
  <xs:attribute name="travelTime" type="xs:time" use="optional" />
</xs:complexType>

</xs:schema>