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()); }
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]); }
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 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++; } }); }