2015-03-18 11:31:47 -04:00
|
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
<package xmlns="http://www.lovullo.com/rater"
|
2013-02-13 09:27:33 -05:00
|
|
|
xmlns:c="http://www.lovullo.com/calc"
|
|
|
|
core="true"
|
|
|
|
desc="Vector operations on classification matches">
|
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<import package="../base" />
|
|
|
|
<import package="arithmetic" export="true" />
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
|
|
|
<!--
|
|
|
|
This wonderful little gem takes a classification match and stores it in a
|
|
|
|
vector, allowing for hassle-free use in calculations without awkward
|
|
|
|
hasany() calls on classification matrices (where a classification yields a
|
|
|
|
matrix, that is). This is useless for classifications that yield vectors,
|
|
|
|
since the result will be the same.
|
|
|
|
|
|
|
|
This template is also useful for combining various classification vectors
|
|
|
|
and matrices, whoose reduction would otherwise be a bit complicated. Of
|
|
|
|
course, the alternative there is also to create a classification that
|
|
|
|
relies on other classifications; use your best judgement.
|
|
|
|
|
|
|
|
This exploits the fact that _CMATCH_'s are always vectors, even if we are
|
|
|
|
matching on a matrix. As such, the system has already gone through the
|
|
|
|
trouble of reducing the matrix into a vector for us, so all we need to do
|
|
|
|
is store each value into a vector, which can be easily accomplished using a
|
|
|
|
generator.
|
|
|
|
|
|
|
|
This is an excellent example of building a feature atop of the DSL without
|
|
|
|
having to add a new language feature.
|
|
|
|
-->
|
2015-03-18 11:31:47 -04:00
|
|
|
<template name="_cmatch-to-vector_" desc="Vectorizes a classification match">
|
|
|
|
<param name="@class@" desc="Classification match string" />
|
|
|
|
<param name="@generates@" desc="Variable to yield generates (will yield a vector)" />
|
|
|
|
<param name="@keep@" desc="Rate block @keep">
|
|
|
|
<text></text>
|
|
|
|
</param>
|
|
|
|
|
|
|
|
<param name="@yields@" desc="Dummy variable to yield generates (useless, but required)">
|
|
|
|
<text>__</text>
|
|
|
|
<param-value name="@generates@" />
|
|
|
|
</param>
|
|
|
|
|
|
|
|
<param name="@gendesc@" desc="Generator description">
|
|
|
|
<text>Vector containing boolean </text>
|
|
|
|
<param-value name="@class@" />
|
|
|
|
<text> classification matches</text>
|
|
|
|
</param>
|
|
|
|
|
|
|
|
<param name="@sym@" desc="Generator symbol (corresponds to @generates@)">
|
2013-02-13 09:27:33 -05:00
|
|
|
<!-- defaults to nothing -->
|
2015-03-18 11:31:47 -04:00
|
|
|
<text></text>
|
|
|
|
</param>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
<!-- this conversion is as simple as using a generator to yield the value
|
|
|
|
of _CMATCH_ for each index -->
|
2015-03-18 11:31:47 -04:00
|
|
|
<rate class="@class@" accumulate="none" yields="@yields@" always="true" keep="@keep@">
|
2013-02-13 09:27:33 -05:00
|
|
|
<c:sum of="_CMATCH_" index="k" generates="@generates@" desc="@gendesc@" sym="@sym@">
|
|
|
|
<c:value-of name="_CMATCH_" index="k" />
|
|
|
|
</c:sum>
|
2015-03-18 11:31:47 -04:00
|
|
|
</rate>
|
|
|
|
</template>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<template name="_cmatch-to-scalar_" desc="Reduces a classification match into a scalar">
|
|
|
|
<param name="@class@" desc="Classification match string" />
|
|
|
|
<param name="@yields@" desc="Variable to yield into" />
|
|
|
|
<param name="@sym@" desc="Yield symbol (defaults to nothing)">
|
2013-02-13 09:27:33 -05:00
|
|
|
<!-- defaults to nothing -->
|
2015-03-18 11:31:47 -04:00
|
|
|
<text></text>
|
|
|
|
</param>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<param name="@keep@" desc="Rate block @keep">
|
|
|
|
<text></text>
|
|
|
|
</param>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<rate class="@class@" accumulate="none" yields="@yields@" sym="@sym@" keep="@keep@">
|
2013-02-13 09:27:33 -05:00
|
|
|
<!-- if any single one matches, then we want to yield a 1 -->
|
|
|
|
<c:apply name="maxreduce" maxreduce_set="_CMATCH_" />
|
2015-03-18 11:31:47 -04:00
|
|
|
</rate>
|
|
|
|
</template>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!--
|
|
|
|
Counts one for each classification vector match
|
|
|
|
-->
|
2015-03-18 11:31:47 -04:00
|
|
|
<template name="_cmatch-count_" desc="Counts the number of classification matches of a vector">
|
|
|
|
<param name="@class@" desc="Classification match" />
|
|
|
|
<param name="@yields@" desc="Value to yield" />
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
<!-- nothing by default -->
|
2015-03-18 11:31:47 -04:00
|
|
|
<param name="@no@" desc="Non-match">
|
|
|
|
<text></text>
|
|
|
|
</param>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<rate class="@class@" no="@no@" yields="@yields@">
|
2013-02-13 09:27:33 -05:00
|
|
|
<c:sum of="_CMATCH_" />
|
2015-03-18 11:31:47 -04:00
|
|
|
</rate>
|
|
|
|
</template>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
|
|
|
<!-- because verbose repition is an evil -->
|
2015-03-18 11:31:47 -04:00
|
|
|
<inline-template>
|
|
|
|
<for-each>
|
|
|
|
<set cmp="eq" />
|
|
|
|
<set cmp="ne" />
|
|
|
|
<set cmp="gt" />
|
|
|
|
<set cmp="gte" />
|
|
|
|
<set cmp="lt" />
|
|
|
|
<set cmp="lte" />
|
|
|
|
</for-each>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<template name="_match-{@cmp@}_" desc="Match value {@cmp@}">
|
|
|
|
<param name="@on@" desc="Value to assert" />
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
<!-- pick one -->
|
2015-03-18 11:31:47 -04:00
|
|
|
<param name="@const@" desc="Match against constant value" />
|
|
|
|
<param name="@value@" desc="Match against variable" />
|
2013-02-13 09:27:33 -05:00
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<match on="@on@">
|
|
|
|
<dyn-node name="c:{@cmp@}">
|
|
|
|
<if name="@const@">
|
2013-02-13 09:27:33 -05:00
|
|
|
<c:const value="@const@" type="float" desc="Comparison" />
|
2015-03-18 11:31:47 -04:00
|
|
|
</if>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<unless name="@const@">
|
2013-02-13 09:27:33 -05:00
|
|
|
<c:value-of name="@value@" />
|
2015-03-18 11:31:47 -04:00
|
|
|
</unless>
|
|
|
|
</dyn-node>
|
|
|
|
</match>
|
|
|
|
</template>
|
|
|
|
</inline-template>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<template name="_match-class_"
|
2013-02-13 09:27:33 -05:00
|
|
|
desc="Match on a class name (rather than @yields)">
|
2015-03-18 11:31:47 -04:00
|
|
|
<param name="@name@" desc="Classification name" />
|
|
|
|
|
|
|
|
<param name="@__yields@" desc="Classification yield to match on">
|
|
|
|
<param-class-to-yields name="@name@" />
|
|
|
|
</param>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<param name="@value@" desc="Value to match on">
|
|
|
|
<text></text>
|
|
|
|
</param>
|
2013-02-13 09:27:33 -05:00
|
|
|
|
2015-03-18 11:31:47 -04:00
|
|
|
<match on="@__yields@" value="@value@" />
|
|
|
|
</template>
|
|
|
|
</package>
|
2013-02-13 09:27:33 -05:00
|
|
|
|