private static int[] GetVariableIndexRangesFilterIndexes(VariableIndexRangeFilter filter)
        {
            IList <int> indexesList = new List <int>();

            for (int i = filter.MinIndex; i <= filter.MaxIndex; i++)
            {
                indexesList.Add(i);
            }
            return(indexesList.ToArray());
        }
示例#2
0
        public void WriteSlicesUsingTimeFilterShouldBeTheSameAsUsingIndexFilter()
        {
            var network = CreateNetwork();


            var networkCoverage = new NetworkCoverage("test", true)
            {
                Network = network
            };
            var locations = new[] { new NetworkLocation(network.Branches[0], 0.0),
                                    new NetworkLocation(network.Branches[0], 100.0),
                                    new NetworkLocation(network.Branches[1], 100.0) };

            networkCoverage.SetLocations(locations);
            networkCoverage.Locations.FixedSize = locations.Length;

            var networkCoverage2 = new NetworkCoverage("test", true)
            {
                Network = network
            };

            networkCoverage2.SetLocations(locations);
            networkCoverage2.Locations.FixedSize = locations.Length;


            // set 1000 values using time filters in coverage 1 and 2
            var startTime = new DateTime(2000, 1, 1);

            for (int i = 0; i < 1000; i++)
            {
                IEnumerable <double> values = new[] { 1.0, 2.0, 3.0 }.Select(d => d * i);
                DateTime             currentTime = startTime.AddMinutes(i);
                //set values for coverage 1 using value filter
                networkCoverage.Time.AddValues(new[] { currentTime });
                var timeValueFilter = new VariableValueFilter <DateTime>(networkCoverage.Time, currentTime);
                networkCoverage.SetValues(values, timeValueFilter);

                //set values for coverage 2 using index filter
                networkCoverage2.Time.AddValues(new[] { currentTime });
                var timeIndexFilter = new VariableIndexRangeFilter(networkCoverage2.Time, i);
                networkCoverage2.SetValues(values, timeIndexFilter);
            }

            Assert.AreEqual(networkCoverage.Components[0].Values, networkCoverage2.Components[0].Values);
        }
        public void WriteTwoDimensionalFunctionUsingIndexFilters()
        {
            //writing index based now only works for adding slices..
            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});

            //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});

            Assert.AreEqual(9, flow.Values.Count);
            Assert.AreEqual(3, flow.Values[8]);
        }
        public override object Evaluate(Coordinate coordinate, DateTime?time)
        {
            if (!Geometry.EnvelopeInternal.Contains(coordinate))
            {
                return(Components[0].NoDataValue);
            }

            if (IsTimeDependent)
            {
                if (Time.InterpolationType != InterpolationType.Constant)
                {
                    throw new NotSupportedException("Only piecewise constant interpolation type is supported for time argument, actual: " + Time.InterpolationType + ", coverage: " + Name);
                }

                // find corresponding time slice (piecewise constant interpolation
                var times = Time.Values;

                var i = 0;
                while (i < times.Count - 1)
                {
                    i++;

                    if (time < times[i])
                    {
                        i--;
                        break;
                    }
                }

                var timeFilter = new VariableIndexRangeFilter(Time, i);

                // find X and Y
                var xIndex = (int)((coordinate.X - Origin.X) / DeltaX);
                var yIndex = (int)((coordinate.Y - Origin.Y) / DeltaY);

                return(GetValues(new IVariableFilter[] { timeFilter, new VariableIndexRangeFilter(X, xIndex), new VariableIndexRangeFilter(Y, yIndex) }).Cast <object>().FirstOrDefault());
            }

            return(Evaluate(coordinate));
        }
        public void WriteTwoDimensionalFunctionUsingIndexFilters()
        {
            //writing index based now only works for adding slices..
            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 });

            //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 });

            Assert.AreEqual(9, flow.Values.Count);
            Assert.AreEqual(3, flow.Values[8]);
        }
示例#6
0
        public void WriteSlicesUsingTimeFilterShouldBeTheSameAsUsingIndexFilter()
        {
            var network = CreateNetwork();

            
            var networkCoverage = new NetworkCoverage("test", true) { Network = network };
            var locations = new[] { new NetworkLocation(network.Branches[0], 0.0),
                                    new NetworkLocation(network.Branches[0], 100.0), 
                                    new NetworkLocation(network.Branches[1], 100.0) };
            networkCoverage.SetLocations(locations);
            networkCoverage.Locations.FixedSize = locations.Length;

            var networkCoverage2 = new NetworkCoverage("test", true) { Network = network };
            networkCoverage2.SetLocations(locations);
            networkCoverage2.Locations.FixedSize = locations.Length;
            

            // set 1000 values using time filters in coverage 1 and 2
            var startTime = new DateTime(2000, 1, 1);
            for (int i = 0; i < 1000;i++ )
            {
                IEnumerable<double> values = new[] { 1.0, 2.0, 3.0 }.Select(d => d * i);
                DateTime currentTime = startTime.AddMinutes(i);
                //set values for coverage 1 using value filter
                networkCoverage.Time.AddValues(new[] { currentTime });
                var timeValueFilter = new VariableValueFilter<DateTime>(networkCoverage.Time, currentTime);
                networkCoverage.SetValues(values,timeValueFilter);

                //set values for coverage 2 using index filter
                networkCoverage2.Time.AddValues(new[] { currentTime });
                var timeIndexFilter = new VariableIndexRangeFilter(networkCoverage2.Time, i);
                networkCoverage2.SetValues(values, timeIndexFilter);

            }
            
            Assert.AreEqual(networkCoverage.Components[0].Values,networkCoverage2.Components[0].Values);
        }
示例#7
0
        public void AddingTimeSlicesShouldBeFastUsingMemoryStore()
        {
            var random = new Random();
            //50 branches 
            var network = RouteHelperTest.GetSnakeNetwork(false, 50);
            //10 offsets
            var offsets = new[] { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };

            //500 locations
            var locations = offsets.SelectMany(o => network.Branches, (o, b) => new NetworkLocation(b, o)).ToList();

            var values = (from o in locations
                          select (double)random.Next(100) / 10).ToList();

            //setup the coverage with fixed size locations
            var networkCoverage = new NetworkCoverage() { IsTimeDependent = true, Network = network };
            networkCoverage.Locations.FixedSize = 500;
            networkCoverage.Locations.SetValues(locations.OrderBy(l => l));

            var startTime = new DateTime(2000, 1, 1);
            // add 10000 slices in time..
            var times = from i in Enumerable.Range(1, 1000)
                        select startTime.AddDays(i);

            int outputTimeStepIndex = 0;
            //write like a flowmodel ..
            TestHelper.AssertIsFasterThan(2000, () =>
                                                    {
                                                        foreach (var t in times)
                                                        {
                                                            //high performance writing. Using indexes instead of values.
                                                            var locationsIndexFilter =
                                                                new VariableIndexRangeFilter(networkCoverage.Locations,
                                                                                             0,
                                                                                             networkCoverage.Locations.
                                                                                                 FixedSize - 1);
                                                            //current timestep starts at 1 and is increased before outputvalues are set now..hence -2 to get a 0 for the 1st
                                                            //int timeIndex = currentTimeStep - 1;

                                                            var timeIndexFilter =
                                                                new VariableIndexRangeFilter(networkCoverage.Time,
                                                                                             outputTimeStepIndex);

                                                            networkCoverage.Time.AddValues(new[] { t });
                                                            networkCoverage.SetValues(values,
                                                                                      new[]
                                                                                          {
                                                                                              locationsIndexFilter,
                                                                                              timeIndexFilter
                                                                                          });
                                                            outputTimeStepIndex++;
                                                        }
                                                    });
        }