You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 12 Next »

FunctionFilters are used in the functions library to specify which data you want to set or get. For example you can use filters to get a subset of a function. FunctionFilters can be quite complex and usually there is an alternative syntax to get the same result easier.

VariableValueFilter

For example if we have a grid f with 2 int arguments and one string component like this:

x\y

0

1

2

0

a

b

c

1

d

e

f

2

g

h

i

We can define a filtered function of this like this

f2 = f.Filter(new VariableValueFilter<int>(x,new[]{1,2}),new VariableValueFilter<int>(y,new[]{1,2}))

f2 look like this

x2\y2

1

2

1

e

f

2

h

i

VariableValueFilters can also be used to set values of arguments when setting values for components.

            var x = new Variable<int>("x");
            var y = new Variable<int>("y");
            var f = new Function{Components = {y},Arguments = {x}};

            y.SetValues(new[] { 1 }, new VariableValueFilter<int>(x, 0));

            //this is equivalent of the previous call
            f[0] = 1;

VariableIndexRangeFilters

VariableIndexRangeFilters work similar to VariableValueFilters but they used the indices in the argument variable values to make a selection.

For example the following grid

x\y

10

20

30

0

-

-

-

1

-

-

-

2

-

-

-

Can be generated like this

            var flow = new Variable<int>();
            var x = new Variable<int>();
            var y = new Variable<int>();
            flow.Arguments.Add(x);
            flow.Arguments.Add(y);

            x.AddValues(new[] {1, 2, 3});
            y.AddValues(new[] {10, 20, 30});

Now we can set the bottom row like this

            //we now have 3x3 array for flow..write the last 'slice'
            var xIndex = new VariableIndexRangeFilter(x, 2);
            var yIndex = new VariableIndexRangeFilter(y, 0, 2);
            flow.SetValues(new[] {1, 2, 3}, new[] {xIndex, yIndex});

And we get the following grid

x\y

10

20

30

0

-

-

-

1

-

-

-

2

1

2

3

VariableIndexRangesFilters
They are the same as VariableIndexRangeFilters except that now multiple ranges can be defined in one filter.

VariableReduceFilter

Can be used to reduce function in dimensionality. For example a two dimension (two-argument) function can be reduced to a one dimensional (one-argument) function. This is only possible if the dimension that is being reduced has a single value.

[Test]
    IVariable<int> x = new Variable<int>("x");
    IVariable<int> y = new Variable<int>("y");
    IVariable<int> fx = new Variable<int>("fx");
    fx.Arguments.Add(x);
    fx.Arguments.Add(y);
            
    x.SetValues(new[] {1, 2, 3});
    y.SetValues(new[] {1,2});
    fx[3, 1] = 20;
            
    var reducedFunction = fx.Filter(new VariableValueFilter<int>(y, 1), new VariableReduceFilter(y));
    //the function 'lost' an argument
    Assert.AreEqual(1, reducedFunction.Arguments.Count);
    Assert.AreEqual(3, reducedFunction.Values.Count);
    Assert.AreEqual(20, reducedFunction.Values[2]);

This filter is used for example to get a timeseries for a timedependent coverage (reducing location) or to get a timeIndependent coverage out of a timedependent (reducing time)

  • No labels