<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	Uncertainty Quantification Data Model for the Probabilistic Design of the Thermal Protection System of a Reusable Launch Vehicle Stage
	CEAS Space Journal
	Aaron D. Koch*, Jascha Wilken, Marko Alder
	*German Aerospace Center, Institute of Space Systems, Robert-Hooke-Str. 7, 28359 Bremen, Germany, aaron.koch@dlr.de
	UQ data model, version 0.23
	
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="uq" type="uqType"/>
	
	<xs:complexType name="uqType">
		<xs:sequence>
			<xs:element name="header" type="HeaderType"/>
			<xs:element name="studies" type="StudiesType" minOccurs="0"/>
			<xs:element name="variables" type="VariablesType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="HeaderType">
		<xs:complexContent>
			<xs:extension base="BaseNameDescriptionType">
				<xs:sequence>
					<xs:element name="version" type="xs:string"/>
					<xs:element name="domainFile" type="xs:anyURI" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>			
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="StudiesType">
		<xs:sequence>
			<xs:element name="study" type="StudyType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="StudyType">
		<xs:complexContent>
			<xs:extension base="BaseNameDescriptionType">
				<xs:sequence>
					<xs:element name="sampling" type="SamplingType"/>
					<xs:element name="data" type="StudyDataType"/>
					<xs:element name="analyses" type="AnalysesType" minOccurs="0"/>
				</xs:sequence>
				<xs:attribute name="id" type="StudyIdType" use="required"/>
			</xs:extension>			
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="SamplingType">
		<xs:complexContent>
			<xs:extension base="BaseDescriptionType">	
				<xs:sequence>
					<xs:element name="samplesPerDimension" type="xs:nonNegativeInteger"/>
					<xs:element name="method" type="SamplingMethodType" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>			
		</xs:complexContent>
	</xs:complexType>

	<xs:simpleType name="SamplingMethodType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="FAST"/>
			<xs:enumeration value="LatinHypercube"/>			
			<xs:enumeration value="Morris"/>
			<xs:enumeration value="Saltelli"/>
			<xs:enumeration value="SimpleRandom"/>
			<xs:enumeration value="Sobol"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="StudyDataType">
		<xs:sequence>
			<xs:element name="inputs" type="StudyInputsType" minOccurs="0"/>
			<xs:element name="outputs" type="StudyOutputsType" minOccurs="0"/>
		</xs:sequence>	
	</xs:complexType>

	<xs:complexType name="StudyInputsType">
		<xs:sequence>
			<xs:element name="input" type="StudyInputType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="StudyInputType">
		<xs:simpleContent>
			<xs:extension base="DoubleListType">
				<xs:attribute name="idref" type="InputIdrefType"/>
			</xs:extension>			
		</xs:simpleContent>				
	</xs:complexType>

	<xs:complexType name="StudyOutputsType">
		<xs:sequence>
			<xs:element name="output" type="StudyOutputType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="StudyOutputType">
		<xs:simpleContent>
			<xs:extension base="DoubleListType">
				<xs:attribute name="idref" type="OutputIdrefType"/>
			</xs:extension>			
		</xs:simpleContent>				
	</xs:complexType>

	<xs:complexType name="AnalysesType">
		<xs:sequence>
			<xs:element name="statisticalMoments" type="StatisticalMomentsType" minOccurs="0"/>
			<xs:element name="correlations" type="CorrelationsType" minOccurs="0"/>
			<xs:element name="globalSensitivities" type="GlobalSensitivitiesType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="VariablesType">
		<xs:sequence>
			<xs:element name="inputs" type="InputsType" minOccurs="0"/>
			<xs:element name="outputs" type="OutputsType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="InputsType">
		<xs:sequence>
			<xs:element name="input" type="InputType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="InputType">
		<xs:complexContent>
			<xs:extension base="BaseQuantityType">
				<xs:choice>
					<xs:element name="betaDistribution" type="BetaDistributionType"/>
					<xs:element name="normalDistribution" type="NormalDistributionType"/>
					<xs:element name="triangularDistribution" type="TriangularDistributionType"/>		
					<xs:element name="uniformDistribution" type="UniformDistributionType"/>					
				</xs:choice>
				<xs:attribute name="id" type="InputIdType" use="required"/>
			</xs:extension>			
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="OutputsType">
		<xs:sequence>
			<xs:element name="output" type="OutputType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="OutputType">
		<xs:complexContent>
			<xs:extension base="BaseQuantityType">
				<xs:attribute name="id" type="OutputIdType" use="required"/>
			</xs:extension>			
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="BaseQuantityType" abstract="true">
		<xs:complexContent>
			<xs:extension base="BaseNameDescriptionType">
				<xs:sequence>
					<xs:element name="xPath" type="xs:string" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="BetaDistributionType">
		<xs:complexContent>
			<xs:extension base="BaseDistributionType">
				<xs:sequence>
					<xs:element name="alpha" type="xs:double"/>
					<xs:element name="beta" type="xs:double"/>		
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="UniformDistributionType">
		<xs:complexContent>
			<xs:extension base="BaseDistributionType">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="NormalDistributionType">
		<xs:sequence>
			<xs:element name="mean" type="xs:double"/>
			<xs:element name="stdDev" type="xs:double"/>
			<xs:element name="lowerBound" type="xs:double" minOccurs="0"/>
			<xs:element name="upperBound" type="xs:double" minOccurs="0"/>					
		</xs:sequence>
	</xs:complexType>	

	<xs:complexType name="TriangularDistributionType">
		<xs:complexContent>
			<xs:extension base="BaseDistributionType">
				<xs:sequence>
					<xs:element name="mode" type="xs:double"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="BaseDistributionType" abstract="true">
		<xs:sequence>
			<xs:element name="lowerBound" type="xs:double"/>
			<xs:element name="upperBound" type="xs:double"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="StatisticalMomentsType">
		<xs:sequence>
			<xs:element name="input" type="StatisticalMomentsVariableType" minOccurs="0"/>
			<xs:element name="output" type="StatisticalMomentsVariableType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>	
	
	<xs:complexType name="CorrelationsType">
		<xs:sequence>
			<xs:element name="Pearson" type="CorrelationType" minOccurs="0"/>
			<xs:element name="Spearman" type="CorrelationType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>	

	<xs:complexType name="CorrelationType">
		<xs:sequence>
			<xs:element name="inIn" type="DoubleListType" minOccurs="0"/>
			<xs:element name="inOut" type="DoubleListType" minOccurs="0"/>
			<xs:element name="outOut" type="DoubleListType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>	
			
	<xs:complexType name="StatisticalMomentsVariableType">
		<xs:sequence>
			<xs:element name="mean" type="DoubleListType"/>
			<xs:element name="variance" type="DoubleListType" minOccurs="0"/>
			<xs:element name="skewness" type="DoubleListType" minOccurs="0"/>
			<xs:element name="kurtosis" type="DoubleListType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>	

	<xs:complexType name="GlobalSensitivitiesType">
		<xs:sequence>
			<xs:element name="FAST" type="FastAnalysisType" minOccurs="0"/>
			<xs:element name="Morris" type="MorrisAnalysisType" minOccurs="0"/>
			<xs:element name="Sobol" type="SobolAnalysisType" minOccurs="0"/>								
		</xs:sequence>
	</xs:complexType>	

	<xs:complexType name="BaseSensitivityAnalysisType" abstract="true">
		<xs:sequence>
			<xs:element name="confidenceLevel" type="DoubleBetweenZeroAndOne" minOccurs="0"/>		
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="BaseSensitivityType" abstract="true">
			<xs:attribute name="idref" type="OutputIdrefType" use="required"/>
	</xs:complexType>

	<xs:complexType name="FastAnalysisType">
		<xs:complexContent>
			<xs:extension base="BaseSensitivityAnalysisType">
				<xs:sequence>
					<xs:element name="sensitivity" type="FastSensitivityType" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="FastSensitivityType">
		<xs:complexContent>
			<xs:extension base="BaseSensitivityType">	
				<xs:sequence>
					<xs:element name="S1" type="DoubleListType"/>
					<xs:element name="S1Conf" type="DoubleListType" minOccurs="0"/>
					<xs:element name="ST" type="DoubleListType" minOccurs="0"/>
					<xs:element name="STConf" type="DoubleListType" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="MorrisAnalysisType">
		<xs:complexContent>
			<xs:extension base="BaseSensitivityAnalysisType">
				<xs:sequence>
					<xs:element name="sensitivity" type="MorrisSensitivityType" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="MorrisSensitivityType">
		<xs:complexContent>
			<xs:extension base="BaseSensitivityType">
				<xs:sequence>
					<xs:element name="mu" type="DoubleListType"/>
					<xs:element name="muStar" type="DoubleListType"/>
					<xs:element name="muStarConf" type="DoubleListType" minOccurs="0"/>
					<xs:element name="sigma" type="DoubleListType"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>		
	</xs:complexType>	

	<xs:complexType name="SobolAnalysisType">
		<xs:complexContent>
			<xs:extension base="BaseSensitivityAnalysisType">
				<xs:sequence>
					<xs:element name="sensitivity" type="SobolSensitivityType" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="SobolSensitivityType">
		<xs:complexContent>
			<xs:extension base="BaseSensitivityType">
				<xs:sequence>
					<xs:element name="S1" type="DoubleListType"/>
					<xs:element name="S1Conf" type="DoubleListType" minOccurs="0"/>
					<xs:element name="ST" type="DoubleListType" minOccurs="0"/>
					<xs:element name="STConf" type="DoubleListType" minOccurs="0"/>
					<xs:element name="S2" type="DoubleListType" minOccurs="0"/>
					<xs:element name="S2Conf" type="DoubleListType" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>	

	<xs:complexType name="BaseDescriptionType" abstract="true">
		<xs:sequence>
			<xs:element name="description" type="xs:string" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="BaseNameDescriptionType" abstract="true">
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="description" type="xs:string" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>

	<xs:simpleType name="DoubleBetweenZeroAndOne">
		<xs:restriction base="xs:double">
			<xs:minExclusive value="0"/>
			<xs:maxExclusive value="1"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="DoubleListType">
		<xs:list itemType="xs:double"/>
	</xs:simpleType>

	<xs:simpleType name="StudyIdType">
		 <xs:restriction base="xs:ID">
			<xs:pattern value="study.+"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="InputIdType">
		 <xs:restriction base="xs:ID">
			<xs:pattern value="in.+"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="InputIdrefType">
		 <xs:restriction base="xs:IDREF">
			<xs:pattern value="in.+"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="OutputIdType">
		 <xs:restriction base="xs:ID">
			<xs:pattern value="out.+"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="OutputIdrefType">
		 <xs:restriction base="xs:IDREF">
			<xs:pattern value="out.+"/>
		</xs:restriction>
	</xs:simpleType>

</xs:schema>
