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 &lt; (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.

Page tags: doe template
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License