<!-- 
    Dynetml 2.0 Relax-NG Specification
    CASOS, CMU
    
    This is the input data specification for *ORA (see www.casos.cs.cmu.edu)
    
    The DynamicMetaNetwork is used to represent a meta-network and its continuous
    changes over time.
    
    modified August 30, 2009
-->

<grammar xmlns="http://relaxng.org/ns/structure/1.0">
  <start>
    <ref name="DynamicMetaNetwork" />
  </start>

  <!-- =========== DynamicNetwork ============== -->
  <define name="DynamicMetaNetwork">
    <element name="DynamicMetaNetwork">
      <optional>
        <attribute name="id"/>
      </optional>
      <interleave>
        <zeroOrMore>
          <ref name="keyframe"/>
        </zeroOrMore>
        <zeroOrMore>
          <ref name="delta" />
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <define name="keyframe">
    <element name="MetaNetwork">
      <optional>
        <attribute name="id"/>
      </optional>
      <optional>
        <attribute name="date"/>
      </optional>
      <interleave>
        <optional>
          <ref name="propertyIdentities" />
        </optional>
        <optional>
          <ref name="sourceIdentities"/>
        </optional>
        <optional>
          <ref name="measureContainer"/>
        </optional>
        <optional>
          <ref name="nodes" />
        </optional>
        <optional>
          <ref name="networks" />
        </optional>
      </interleave>
    </element>
  </define>

  <define name="propertyIdentity">
    <element name="propertyIdentity" >
      <attribute name="id"/>
      <attribute name="type">
        <choice>
          <value>text</value>
          <value>categoryText</value>
          <value>number</value>
          <value>categoryNumber</value>
          <value>date</value>
          <value>uri</value>
        </choice>
      </attribute>
      <optional>
        <attribute name="singleValued" >
          <choice>
            <value>true</value>
            <value>false</value>
          </choice>
        </attribute>
      </optional>
    </element>
  </define>

  <define name="propertyIdentities" >
    <element name="propertyIdentities">
      <zeroOrMore>
        <ref name="propertyIdentity"/>
      </zeroOrMore>
    </element>
  </define >

  <define name="property">
    <element name="property">
      <attribute name="id"/>
      <attribute name="value"/>
    </element>
  </define>

  <define name="sourceIdentity">
    <element name="source">
      <attribute name="id"/>
      <zeroOrMore>
        <ref name="property"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="sourceIdentities">
    <element name="sources">
      <zeroOrMore>
        <ref name="sourceIdentity"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="sourceContainer">
    <zeroOrMore>
      <interleave>
        <zeroOrMore>
          <ref name="property"/>
        </zeroOrMore>
        <zeroOrMore>
          <element name="source">
            <attribute name="id"/>
          </element>
        </zeroOrMore>
      </interleave>
    </zeroOrMore>
  </define>

  <define name="measures" >
    <element name="measures">
      <zeroOrMore>
        <element name="measure">
          <attribute name="id" />
          <attribute name="value" />
          <zeroOrMore>
            <element name="input">
              <attribute name="id" />
            </element>
          </zeroOrMore>
        </element>
      </zeroOrMore>
    </element>
  </define>

  <define name="measureContainer">
    <ref name="sourceContainer"/>
    <optional>
      <ref name="measures"/>
    </optional>
  </define>

  <!-- ============ Nodes/Nodeset/Node ========== -->

  <define name="nodes">
    <element name="nodes">
      <zeroOrMore>
        <ref name="nodeclass"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="nodeclass">
    <element name="nodeclass">
      <attribute name="type"/>
      <attribute name="id"/>
      <optional>
        <ref name="propertyIdentities" />
      </optional>
      <ref name="measureContainer"/>
      <zeroOrMore>
        <ref name="node"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="node">
    <element name="node">
      <attribute name="id"/>
      <optional>
        <attribute name="title" />
      </optional>
      <ref name="measureContainer"/>
    </element>
  </define>

  <!-- ================== Networks/Network/Link ============== -->

  <define name="networks">
    <element name="networks">
      <zeroOrMore>
        <ref name="network"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="network">
    <element name="network">
      <attribute name="source"/>
      <optional>
        <attribute name="sourceType"/>
      </optional>
      <attribute name="target"/>
      <optional>
        <attribute name="targetType"/>
      </optional>
      <attribute name="id" />
      <optional>
        <attribute name="isDirected" >
          <choice>
            <value>true</value>
            <value>false</value>
          </choice>
        </attribute>
      </optional>
      <ref name="measureContainer"/>
      <zeroOrMore>
        <ref name="link"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="link">
    <element name="link">
      <interleave>
        <attribute name="source" />
        <attribute name="target" />
        <optional>
          <attribute name="value" />
        </optional>
      </interleave >
      <ref name="sourceContainer"/>
    </element>
  </define>

  <!-- ==================== Delta =================== -->
  <define name="delta" >
    <element name="Delta" >
      <optional>
        <attribute name="id" />
      </optional>
      <attribute name="date" />
      <ref name="deltaProperty"/>
      <optional>
        <ref name="deltaNodes" />
      </optional>
      <optional>
        <ref name="deltaNetworks" />
      </optional>
    </element >
  </define >

  <define name="addProperty" >
    <zeroOrMore >
      <element name="addProperty" >
        <attribute name="id" />
        <attribute name="type" />
        <attribute name="value" />
      </element>
    </zeroOrMore >
  </define >

  <define name="modifyProperty" >
    <zeroOrMore >
      <element name="modifyProperty" >
        <attribute name="id" />
        <optional>
          <!-- TODO perhaps remove type; it is not used -->
          <attribute name="type"/>
        </optional>
        <attribute name="value" />
      </element>
    </zeroOrMore >
  </define >

  <define name="removeProperty" >
    <zeroOrMore >
      <element name="removeProperty" >
        <attribute name="id" />
        <optional>
          <attribute name="value"/>
        </optional>
      </element>
    </zeroOrMore >
  </define >

  <define name="deltaProperty" >
    <zeroOrMore>
      <interleave>
        <ref name="addProperty"/>
        <ref name="modifyProperty"/>
        <ref name="removeProperty"/>
      </interleave>
    </zeroOrMore>
  </define>

  <!-- ==================== Delta Nodeclass ============================== -->

  <define name="addNode">
    <zeroOrMore >
      <element name="addNode" >
        <attribute name="id" />
        <optional>
          <attribute name="title" />
        </optional>
        <ref name="addProperty" />
      </element >
    </zeroOrMore >
  </define>

  <define name="deltaNodes" >
    <element name="nodes">
      <zeroOrMore>
        <interleave>
          <zeroOrMore>
            <element name="addNodeclass">
              <attribute name="id" />
              <attribute name="type"/>
              <ref name="addProperty"/>
              <ref name="addNode"/>
            </element>
          </zeroOrMore>
          <zeroOrMore>
            <element name="modifyNodeclass" >
              <attribute name="id" />
              <optional>
                <attribute name="type"/>
              </optional>
              <ref name="deltaProperty"/>
              <interleave>
                <ref name="addNode"/>
                <zeroOrMore >
                  <element name="modifyNode" >
                    <attribute name="id" />
                    <optional>
                      <attribute name="title" />
                    </optional>
                    <ref name="deltaProperty"/>
                  </element >
                </zeroOrMore >
                <zeroOrMore >
                  <element name="removeNode" >
                    <attribute name="id" />
                  </element >
                </zeroOrMore >
              </interleave >
            </element >
          </zeroOrMore>
          <zeroOrMore>
            <element name="removeNodeclass">
              <attribute name="id"/>
            </element>
          </zeroOrMore>
        </interleave>
      </zeroOrMore >
    </element>
  </define >

  <!-- ==================== Delta Network ============================== -->

  <define name="addLink">
    <zeroOrMore>
      <element name="addLink" >
        <attribute name="source" />
        <attribute name="target" />
        <optional>
          <attribute name="value" />
        </optional >
        <ref name="addProperty" />
      </element >
    </zeroOrMore >
  </define>

  <define name="deltaNetworks" >
    <element name="networks">
      <zeroOrMore>
        <interleave>
          <zeroOrMore>
            <element name="addNetwork">
              <attribute name="source"/>
              <attribute name="sourceType"/>
              <attribute name="target"/>
              <attribute name="targetType"/>
              <attribute name="id"/>
              <ref name="addProperty"/>
              <ref name="addLink"/>
            </element>
          </zeroOrMore>
          <zeroOrMore>
            <element name="modifyNetwork" >
              <attribute name="id" />
              <optional>
                <attribute name="source"/>
                <attribute name="sourceType"/>
                <attribute name="target"/>
                <attribute name="targetType"/>
              </optional>
              <ref name="deltaProperty"/>
              <interleave>
                <ref name="addLink"/>
                <zeroOrMore >
                  <element name="modifyLink" >
                    <attribute name="source" />
                    <optional>
                      <attribute name="sourceType"/>
                    </optional>
                    <attribute name="target" />
                    <optional>
                      <attribute name="targetType"/>
                    </optional>
                    <optional>
                      <attribute name="value" />
                    </optional >
                    <ref name="deltaProperty"/>
                  </element >
                </zeroOrMore >
                <zeroOrMore >
                  <element name="removeLink" >
                    <attribute name="source" />
                    <attribute name="target" />
                    <optional>
                      <attribute name="value"/>
                    </optional>
                  </element >
                </zeroOrMore >
              </interleave >
            </element >
          </zeroOrMore>
          <zeroOrMore>
            <element name="removeNetwork">
              <attribute name="id"/>
              <optional>
                <attribute name="source"/>
                <attribute name="sourceType"/>
                <attribute name="target"/>
                <attribute name="targetType"/>
              </optional>
            </element>
          </zeroOrMore>
        </interleave>
      </zeroOrMore >
    </element>
  </define >
</grammar>

