Expand All Parameter Permutations
Sometimes one may want the result as a function of one or more values. In order to get a grid of all permutations you my use this expandset.xsl template.
This template takes a source file of the form:
<?xml version="1.0" encoding="UTF-8"?> <setup> <param name="gmaxvr"> <val>7</val> <val>8</val> <val>9</val> </param> <param name="rgkmax"> <val>11</val> <val>12</val> </param> <param name="swidth"> <val>0.001</val> <val>0.002</val> </param> <param name="spinpol"> <val>true</val> <val>false</val> </param> <param name="lmaxvr"> <val>14</val> </param> </setup>
and expands all permutations into parametersets for further use in input templates
<?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" xmlns:str="http://exslt.org/strings"> <!-- documentation : http://exciting-code.org/expand-all-parameter-permutations --> <xsl:output method="xml" encoding="UTF-8" indent="yes" /> <xsl:template name="expand"> <xsl:param name="depth" select="1" /> <xsl:param name="values" select="''" /> <xsl:param name="path" select="''" /> <xsl:for-each select="/setup/param[$depth]/val"> <xsl:variable name="newvalue"> <xsl:element name="x"> <xsl:element name="param"> <xsl:element name="name"> <xsl:value-of select="normalize-space(/setup/param[$depth]/@name)" /> </xsl:element> <xsl:element name="val"> <xsl:value-of select="normalize-space(.)" /> </xsl:element> </xsl:element> <xsl:for-each select="dep"> <xsl:element name="param"> <xsl:element name="name"> <xsl:value-of select="normalize-space(@name)" /> </xsl:element> <xsl:element name="val"> <xsl:value-of select="normalize-space(@val)" /> </xsl:element> </xsl:element> </xsl:for-each> </xsl:element> </xsl:variable> <xsl:variable name="newpath"> <xsl:value-of select="normalize-space(/setup/param[$depth]/@name)" /> <xsl:text>_</xsl:text> <xsl:value-of select="normalize-space(.)" /> <xsl:text>/</xsl:text> </xsl:variable> <xsl:choose> <xsl:when test="$depth < (count(/setup/param))"> <xsl:call-template name="expand"> <xsl:with-param name="values"> <xsl:copy-of select="$values" /> <xsl:copy-of select="$newvalue" /> </xsl:with-param> <xsl:with-param name="depth" select="$depth+1" /> <xsl:with-param name="path"> <xsl:value-of select="$path" /> <xsl:value-of select="$newpath" /> </xsl:with-param> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:element name="set"> <xsl:for-each select="exsl:node-set($values)/*/param"> <xsl:attribute name="{name}"> <xsl:value-of select="val" /> </xsl:attribute> </xsl:for-each> <xsl:for-each select="exsl:node-set($newvalue)/*/param"> <xsl:attribute name="{name}"> <xsl:value-of select="val" /> </xsl:attribute> </xsl:for-each> <xsl:attribute name="path"> <xsl:value-of select="$path" /> <xsl:value-of select="$newpath" /> </xsl:attribute> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> <xsl:template match="/"> <xsl:element name="experiment"> <xsl:call-template name="expand" /> </xsl:element> </xsl:template> </xsl:stylesheet>
in that case this looks like
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8"?> <experiment> <set gmaxvr="7" rgkmax="11" swidth="0.001" spinpol="true" lmaxvr="14" path="gmaxvr_7/rgkmax_11/swidth_0.001/spinpol_true/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="11" swidth="0.001" spinpol="false" lmaxvr="14" path="gmaxvr_7/rgkmax_11/swidth_0.001/spinpol_false/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="11" swidth="0.002" spinpol="true" lmaxvr="14" path="gmaxvr_7/rgkmax_11/swidth_0.002/spinpol_true/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="11" swidth="0.002" spinpol="false" lmaxvr="14" path="gmaxvr_7/rgkmax_11/swidth_0.002/spinpol_false/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="12" swidth="0.001" spinpol="true" lmaxvr="14" path="gmaxvr_7/rgkmax_12/swidth_0.001/spinpol_true/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="12" swidth="0.001" spinpol="false" lmaxvr="14" path="gmaxvr_7/rgkmax_12/swidth_0.001/spinpol_false/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="12" swidth="0.002" spinpol="true" lmaxvr="14" path="gmaxvr_7/rgkmax_12/swidth_0.002/spinpol_true/lmaxvr_14/"/> <set gmaxvr="7" rgkmax="12" swidth="0.002" spinpol="false" lmaxvr="14" path="gmaxvr_7/rgkmax_12/swidth_0.002/spinpol_false/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="11" swidth="0.001" spinpol="true" lmaxvr="14" path="gmaxvr_8/rgkmax_11/swidth_0.001/spinpol_true/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="11" swidth="0.001" spinpol="false" lmaxvr="14" path="gmaxvr_8/rgkmax_11/swidth_0.001/spinpol_false/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="11" swidth="0.002" spinpol="true" lmaxvr="14" path="gmaxvr_8/rgkmax_11/swidth_0.002/spinpol_true/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="11" swidth="0.002" spinpol="false" lmaxvr="14" path="gmaxvr_8/rgkmax_11/swidth_0.002/spinpol_false/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="12" swidth="0.001" spinpol="true" lmaxvr="14" path="gmaxvr_8/rgkmax_12/swidth_0.001/spinpol_true/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="12" swidth="0.001" spinpol="false" lmaxvr="14" path="gmaxvr_8/rgkmax_12/swidth_0.001/spinpol_false/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="12" swidth="0.002" spinpol="true" lmaxvr="14" path="gmaxvr_8/rgkmax_12/swidth_0.002/spinpol_true/lmaxvr_14/"/> <set gmaxvr="8" rgkmax="12" swidth="0.002" spinpol="false" lmaxvr="14" path="gmaxvr_8/rgkmax_12/swidth_0.002/spinpol_false/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="11" swidth="0.001" spinpol="true" lmaxvr="14" path="gmaxvr_9/rgkmax_11/swidth_0.001/spinpol_true/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="11" swidth="0.001" spinpol="false" lmaxvr="14" path="gmaxvr_9/rgkmax_11/swidth_0.001/spinpol_false/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="11" swidth="0.002" spinpol="true" lmaxvr="14" path="gmaxvr_9/rgkmax_11/swidth_0.002/spinpol_true/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="11" swidth="0.002" spinpol="false" lmaxvr="14" path="gmaxvr_9/rgkmax_11/swidth_0.002/spinpol_false/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="12" swidth="0.001" spinpol="true" lmaxvr="14" path="gmaxvr_9/rgkmax_12/swidth_0.001/spinpol_true/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="12" swidth="0.001" spinpol="false" lmaxvr="14" path="gmaxvr_9/rgkmax_12/swidth_0.001/spinpol_false/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="12" swidth="0.002" spinpol="true" lmaxvr="14" path="gmaxvr_9/rgkmax_12/swidth_0.002/spinpol_true/lmaxvr_14/"/> <set gmaxvr="9" rgkmax="12" swidth="0.002" spinpol="false" lmaxvr="14" path="gmaxvr_9/rgkmax_12/swidth_0.002/spinpol_false/lmaxvr_14/"/> </experiment>
Dependent Parameters
If You have dependent parameters, meaning parameters that should change together with another this template supports following syntax:
<?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="swidth"> <val>0.001</val> <val>0.002</val> </param> <param name="spinpol"> <val>true</val> <val>false</val> </param> <param name="lmaxvr"> <val>14</val> </param> </setup>
You can add any number of <dep> values inside the val element. This values are simply written into the <set> element together with the attribute for the <val> element.
For large series of values one can use something like the series expansion template.