Series Expansion Template
You can describe a setup for a experiment description like:
<?xml version="1.0" encoding="UTF-8"?> <setup> <param name="gmaxvr"> <val>7 </val> <val>8 <dep name="rgkmax" val="10"/></val> <val>9 <dep name="rgkmax" val="11"/></val> </param> <param name="foo"> <series start="1" stop="10" increment="1"/> </param> <param name="bar"> <geomseries start="1" stop="10" factor="2"/> </param> </setup>
the <series> element describes a arithmetic series and the <geomseries> element describes a geometric series. They will be expanded by he following template
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common"> <!-- documentation : http://exciting-code.org/series-expansion-template --> <xsl:output method="xml" encoding="UTF-8" indent="yes" /> <xsl:template match="/"> <xsl:element name="setup"> <xsl:for-each select="/setup/param"> <xsl:choose> <xsl:when test="val"> <xsl:copy-of select="." /> </xsl:when> <xsl:when test="series"> <xsl:element name="param"> <xsl:attribute name="name"> <xsl:value-of select="@name" /> </xsl:attribute> <xsl:call-template name="expandseries"> <xsl:with-param name="stop"> <xsl:value-of select="series/@stop" /> </xsl:with-param> <xsl:with-param name="increment"> <xsl:value-of select="series/@increment" /> </xsl:with-param> <xsl:with-param name="value"> <xsl:value-of select="series/@start" /> </xsl:with-param> </xsl:call-template> </xsl:element> </xsl:when> <xsl:when test="geomseries"> <xsl:element name="param"> <xsl:attribute name="name"> <xsl:value-of select="@name" /> </xsl:attribute> <xsl:call-template name="expandgeometricseries"> <xsl:with-param name="stop"> <xsl:value-of select="geomseries/@stop" /> </xsl:with-param> <xsl:with-param name="factor"> <xsl:value-of select="geomseries/@factor" /> </xsl:with-param> <xsl:with-param name="value"> <xsl:value-of select="geomseries/@start" /> </xsl:with-param> </xsl:call-template> </xsl:element> </xsl:when> </xsl:choose> </xsl:for-each> </xsl:element> </xsl:template> <xsl:template name="expandseries"> <xsl:param name="stop" /> <xsl:param name="increment" /> <xsl:param name="value" /> <xsl:element name="val"> <xsl:value-of select="$value" /> </xsl:element> <xsl:if test="($increment > 0 and $value < $stop) or ($increment < 0 and $value > $stop) "> <xsl:call-template name="expandseries"> <xsl:with-param name="stop"> <xsl:value-of select="$stop" /> </xsl:with-param> <xsl:with-param name="increment"> <xsl:value-of select="$increment" /> </xsl:with-param> <xsl:with-param name="value"> <xsl:value-of select="$value + $increment" /> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="expandgeometricseries"> <xsl:param name="stop" /> <xsl:param name="factor" /> <xsl:param name="value" /> <xsl:element name="val"> <xsl:value-of select="$value" /> </xsl:element> <xsl:if test="($factor > 1 and $value < $stop) or ($factor < 1 and $value > $stop) "> <xsl:call-template name="expandgeometricseries"> <xsl:with-param name="stop"> <xsl:value-of select="$stop" /> </xsl:with-param> <xsl:with-param name="factor"> <xsl:value-of select="$factor" /> </xsl:with-param> <xsl:with-param name="value"> <xsl:value-of select="$value * $factor" /> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
the result is:
<?xml version="1.0" encoding="UTF-8"?> <setup> <param name="gmaxvr"> <val>7 </val> <val>8 <dep name="rgkmax" val="10"/></val> <val>9 <dep name="rgkmax" val="11"/></val> </param> <param name="foo"> <val>1</val> <val>2</val> <val>3</val> <val>4</val> <val>5</val> <val>6</val> <val>7</val> <val>8</val> <val>9</val> <val>10</val> </param> <param name="bar"> <val>1</val> <val>2</val> <val>4</val> <val>8</val> <val>16</val> </param> </setup>
which then can be used by the expand all-parameter-permutations template.