<?xml version="1.0" encoding="UTF-8"?>

<!--
  ========== begin copyright notice ==============
  This file is part of
  ***********
  xaif
  ***********
  
  DISCLAIMER
  
  THIS INFORMATION IS PROVIDED WITHOUT ANY EXPRESS OR
  IMPLIED WARRANTY. IN PARTICULAR, THERE IS NO WARRANTY
  OF ANY KIND CONCERNING THE FITNESS OF THIS INFORMATION
  FOR ANY PARTICULAR PURPOSE.
  
  General Information:
  The xaif schema is intended for an xml base 
  intermediate representation of numerical programs. 
  Its scope is reduced to represent the numerical 
  kernel of the programs as relevant to a semantic 
  transformation of the numerical computations. 
  It is part of the OpenAD framework.
  The main application is automatic
  differentiation, i.e. the generation of code for
  the computation of derivatives.
  The following people are the principal authors of the
  current version:
    Uwe Naumann
    Boyana Norris
    Jean Utke
  
  For more details about xaif and its use in OpenAD please visit:
    http://www.mcs.anl.gov/openad
  
  This work is partially supported by:
    NSF-ITR grant OCE-0205590
  ========== end copyright notice ==============
-->

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	    xmlns:xaifii="http://www.mcs.anl.gov/XAIFInlinableIntrinsics"
	    xmlns:xaif="http://www.mcs.anl.gov/XAIF"
	    targetNamespace="http://www.mcs.anl.gov/XAIFInlinableIntrinsics"
	    version="xaif version 1.0 (inlinable intrinsics)"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified">

<xsd:import namespace="http://www.mcs.anl.gov/XAIF" schemaLocation="xaif.xsd"/>

<!-- *********************************************************** -->
<!-- Inlinable Intrinsics Definition -->
<!-- *********************************************************** -->

<xsd:simpleType name="InlinableIntrinsicType">
 
  <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Types of intrinsic functions known in XAIF.
    </xsd:documentation>
  </xsd:annotation>
 
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="builtin"/>
    <xsd:enumeration value="user_defined"/>
  </xsd:restriction>
 
</xsd:simpleType>        

<!-- *********************************************************** -->
<!-- Function evaluation routine -->
<!-- *********************************************************** -->

<xsd:complexType name="FunctionType">
 <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Specification of function evaluation routine (must be inlinable, that
      is only calls to inlinable functions can be used).
    </xsd:documentation>
  </xsd:annotation>     

  <xsd:complexContent>
    <xsd:extension base="xaif:ExpressionType">
      <xsd:attribute name="type" type="xaifii:InlinableIntrinsicType" use="optional" default="user_defined"/>
      <xsd:attribute name="builtin_name" type="xsd:string" use="optional"/>
    </xsd:extension>
  </xsd:complexContent>  

</xsd:complexType>

<xsd:element name="Function" type="xaifii:FunctionType"/>

<!-- *********************************************************** -->
<!-- Argument References -->
<!-- *********************************************************** -->

<xsd:complexType name="ArgumentReferenceType">
 <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Reference to one of the arguments of an intrinsic function.
      Arguments are counted starting with '1'. A value of '0' refers 
      to the intrinsic result which is useful for some partial expressions.
    </xsd:documentation>
  </xsd:annotation>     

 <xsd:complexContent>
    <xsd:extension base="xaif:VertexType">
      <xsd:attribute name="argument" type="xsd:nonNegativeInteger" use="required"/>
    </xsd:extension>
  </xsd:complexContent>   

</xsd:complexType>

<xsd:element name="ArgumentReference" type="xaifii:ArgumentReferenceType" 
  substitutionGroup="xaif:ExpressionVertex"/>

<!-- *********************************************************** -->
<!-- Partial Derivative  Routines -->
<!-- *********************************************************** -->

<xsd:simpleType name="PartialTypeType">
 
  <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Types of local partial derivatives
    </xsd:documentation>
  </xsd:annotation>
 
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="passive"/>
    <xsd:enumeration value="linear_one"/>
    <xsd:enumeration value="linear_minus_one"/>
    <xsd:enumeration value="linear"/>
    <xsd:enumeration value="nonlinear"/>
  </xsd:restriction>
 
</xsd:simpleType>           

<xsd:complexType name="PartialType">
 <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Specification of partial evaluation routine.
    </xsd:documentation>
  </xsd:annotation>     

  <xsd:complexContent>
    <xsd:extension base="xaif:ExpressionType">
      <xsd:attribute name="partial_id" type="xsd:positiveInteger" use="required"/>
      <xsd:attribute name="partial_type" type="xaifii:PartialTypeType" use="optional" default="nonlinear"/>
    </xsd:extension>
  </xsd:complexContent>  

</xsd:complexType>

<xsd:element name="Partial" type="xaifii:PartialType"/>

<!-- *********************************************************** -->
<!-- Definition of an intrinsic function -->
<!-- *********************************************************** -->

<xsd:complexType name="InlinableIntrinsicDefinitionType">
   <xsd:sequence>
     <xsd:element ref="xaifii:Function" minOccurs="1" maxOccurs="1"/>
     <xsd:element ref="xaifii:Partial" minOccurs="1" maxOccurs="unbounded"/>
   </xsd:sequence>
   <xsd:attribute name="name"         type="xsd:string"          use="required"/>
   <xsd:attribute name="nr_arguments" type="xsd:positiveInteger" use="required"/>
   <xsd:attribute name="return_type"  type="xaif:SymbolTypeType" use="optional" default="real"/>
   <xsd:attribute name="nonSmooth"    type="xsd:boolean"         use="optional" default="false">
    <xsd:annotation>
      <xsd:documentation xml:lang="en">
        is it non smooth?
      </xsd:documentation>
    </xsd:annotation>
  </xsd:attribute>
</xsd:complexType>

<xsd:simpleType name="LanguageType">
 
  <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Programming languages known in XAIF
    </xsd:documentation>
  </xsd:annotation>
 
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="C"/>
    <xsd:enumeration value="CPP"/>
    <xsd:enumeration value="F77"/>
    <xsd:enumeration value="F90"/>
    <xsd:enumeration value="F95"/>
  </xsd:restriction>
 
</xsd:simpleType>           

<xsd:element name="InlinableIntrinsic" type="xaifii:InlinableIntrinsicDefinitionType"/>

<xsd:complexType name="InlinableIntrinsicDefinitionsType">
   <xsd:sequence>
     <xsd:element ref="xaifii:InlinableIntrinsic" minOccurs="1" maxOccurs="unbounded"/>
   </xsd:sequence>
   <xsd:attribute name="language"   type="xaifii:LanguageType" use="required"/>
</xsd:complexType>

<!-- *********************************************************** -->
<!-- Top level element -->
<!-- *********************************************************** -->

<xsd:element name="InlinableIntrinsicDefinitions" type="xaifii:InlinableIntrinsicDefinitionsType">
  <xsd:unique name="ii_unique">
    <xsd:selector xpath="xaifii:InlinableIntrinsic"/>
    <xsd:field xpath="@name"/>
  </xsd:unique>
</xsd:element>

</xsd:schema>
