public async Task TestFindShortestRouteBetweenAsyncProgress() { var cities = new Cities(); cities.ReadCities(CitiesTestFile); var routes = new Routes(cities); routes.ReadRoutes(LinksTestFile); // do synchronous execution var linksExpected = routes.FindShortestRouteBetween("Basel", "Zürich", TransportMode.Rail); // do asynchronous execution var messages = new List<string>(); var progress = new Progress<string>(msg => messages.Add(msg)); var linksActual = await routes.FindShortestRouteBetweenAsync("Basel", "Zürich", TransportMode.Rail, progress); // let pending tasks execute await Task.Yield(); // ensure that at least 5 progress calls are made Assert.IsTrue(messages.Distinct().Count()>=5, "Less than 5 distinct progress messages"); // ensure that all progress messages end with " done" Assert.IsTrue(messages.All(m => m.EndsWith(" done")), string.Format("Progress message \"{0}\" does not end with \" done\"", messages.FirstOrDefault(m => !m.EndsWith(" done")))); }
public void TestFindCitiesByTransportMode() { Cities cities = new Cities(); cities.ReadCities(@"citiesTestDataLab3.txt"); var routes = new Routes(cities); routes.ReadRoutes(@"linksTestDataLab3.txt"); City[] citiesByMode = routes.FindCities(TransportMode.Rail); Assert.AreEqual(11, citiesByMode.Length); City[] emptyCitiesByMode = routes.FindCities(TransportMode.Bus); Assert.AreEqual(0, emptyCitiesByMode.Length); }
public void TestRouteParallelSpeed() { var cities = new Cities(); cities.ReadCities("citiesTestDataLab12.txt"); var routes = new Routes(cities); routes.ReadRoutes("linksTestDataLab12.txt"); //warmup routes.FindAllShortestRoutesParallel(); //execute and measure time var timeA = DateTime.Now; List<List<Link>> allRoutesSerial = routes.FindAllShortestRoutes(); var timeB = DateTime.Now; List<List<Link>> allRoutesParallel = routes.FindAllShortestRoutesParallel(); var timeC = DateTime.Now; var oldAffinity = Process.GetCurrentProcess().ProcessorAffinity; Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1; routes.FindAllShortestRoutesParallel(); Process.GetCurrentProcess().ProcessorAffinity = oldAffinity; var timeD = DateTime.Now; var factor = (timeC - timeB).TotalSeconds / (timeB - timeA).TotalSeconds; var slowdown = (timeD - timeC).TotalSeconds / (timeB - timeA).TotalSeconds; Trace.WriteLine($"Factor: {factor:F2}, Slowdown: {slowdown:F2}"); //parallel execution on a single core shouldn't be much slower Assert.IsTrue(slowdown < 1.1); switch (Environment.ProcessorCount) { case 1: break; case 2: //expect at least 25% reduction with 2 cores Assert.IsTrue(factor < 0.75); break; case 3: //expect at least 35% reduction with 3 cores Assert.IsTrue(factor < 0.65); break; default: //expect at least 45% reduction with 4+ cores Assert.IsTrue(factor < 0.55); break; } }
static void Main(string[] args) { //Lab1 Aufgabe 1 Console.WriteLine("Welcome to RoutePlanner (Version " + Assembly.GetExecutingAssembly().GetName().Version + ")"); //Lab1 Aufgabe 2d var wayPoint = new WayPoint("Windisch", 47.479319847061966, 8.212966918945312); Console.WriteLine("{0}: {1}/{2}", wayPoint.Name, wayPoint.Latitude, wayPoint.Longitude); Console.WriteLine(wayPoint); //Lab2 Aufgabe 1a Console.WriteLine(wayPoint); var wayPoint1 = new WayPoint("", 47.479319847061966, 8.212966918945312); var wayPoint2 = new WayPoint(null, 47.479319847061966, 8.212966918945312); Console.WriteLine(wayPoint1); Console.WriteLine(wayPoint2); //Lab2 Aufgabe 1b var bern = new WayPoint("Bern", 46.948342, 7.442935); var tripolis = new WayPoint("Tripolis", 32.808858, 13.098922); Console.WriteLine(bern.Distance(tripolis)); Console.WriteLine(tripolis.Distance(bern)); //Lab2 Aufgabe 2b - FunktionsTest - Funktioniert Cities c = new Cities(); c.ReadCities("citiesTestDataLab2.txt"); Console.WriteLine("Test: {0}", c[5].Location.Latitude); var target = new WayPoint("Windisch", 0.564, 0.646); Console.WriteLine(target.ToString() + " vs. " + "WayPoint: Windisch 0.56/0.65"); //Lab3 Aufgabe 2 var reqWatch = new RouteRequestWatcher(); var routeCities = new Cities(); routeCities.ReadCities("citiesTestDataLab2.txt"); var routes = new Routes(routeCities); routes.RouteRequested += reqWatch.LogRouteRequests; routes.FindShortestRouteBetween("mumbai", "buenos aires", TransportMode.Rail); routes.FindShortestRouteBetween("dilli", "mumbai", TransportMode.Rail); routes.FindShortestRouteBetween("mumbai", "buenos aires", TransportMode.Rail); Console.ReadLine(); }
static void Main(string[] args) { var c = new City("Aarau", "Switzerland", 10, 1.1, 2.2); //Console.WriteLine(c.Location.GetType()); var stream = new StringWriter(); SimpleObjectWriter w = new SimpleObjectWriter(stream); w.Next(c); var objstr = stream.ToString(); Console.Write(objstr + "\r\n"); var stream2 = new StringReader(objstr); SimpleObjectReader r = new SimpleObjectReader(stream2); var city = r.Next() as City; Console.WriteLine(city.Name); Console.WriteLine(city.Country); Console.WriteLine(city.Population); Console.WriteLine(city.Location); Console.WriteLine(city.Location.Name); Console.WriteLine(city.Location.Latitude); Console.WriteLine(city.Location.Longitude); Console.Write("Welcome to RoutePlanner {0}\n", Assembly.GetExecutingAssembly().GetName().Version); var wayPoint = new WayPoint("Windisch", 47.479319847061966, 8.212966918945312); //Console.WriteLine("{0}: {1}/{2}", wayPoint.Name, wayPoint.Latitude, wayPoint.Longitude); Console.WriteLine(wayPoint); wayPoint.Name = ""; Console.WriteLine(wayPoint); wayPoint.Name = null; Console.WriteLine(wayPoint); var cities = new Cities(); Console.WriteLine(cities.ReadCities(@"data\citiesTestDataLab3.txt")); var routes = new Routes(cities); var count = routes.ReadRoutes(@"data\linksTestDataLab3.txt"); var citiesError = new Cities(); Console.WriteLine(cities.ReadCities(@"data\citiesTestDataLab253.txt")); Console.ReadKey(); }
public void TestRequestWatcher() { var reqWatch = new RouteRequestWatcher(); var cities = new Cities(); cities.ReadCities(CitiesTestFile); var routes = new Routes(cities); routes.RouteRequested += reqWatch.LogRouteRequests; routes.FindShortestRouteBetween("Bern", "Zürich", TransportMode.Rail); routes.FindShortestRouteBetween("Bern", "Zürich", TransportMode.Rail); routes.FindShortestRouteBetween("Basel", "Bern", TransportMode.Rail); Assert.AreEqual(reqWatch.GetCityRequests(cities["Zürich"]), 2); Assert.AreEqual(reqWatch.GetCityRequests(cities["Bern"]), 1); Assert.AreEqual(reqWatch.GetCityRequests(cities["Basel"]), 0); Assert.AreEqual(reqWatch.GetCityRequests(cities["Lausanne"]), 0); }
public async Task TestFindShortestRouteBetweenAsync() { var cities = new Cities(); cities.ReadCities(CitiesTestFile); var routes = new Routes(cities); routes.ReadRoutes(LinksTestFile); // do synchronous execution var linksExpected = routes.FindShortestRouteBetween("Basel", "Zürich", TransportMode.Rail); // do asynchronous execution var linksActual = await routes.FindShortestRouteBetweenAsync("Basel", "Zürich", TransportMode.Rail); // now test the results Assert.IsNotNull(linksActual); Assert.AreEqual(linksExpected.Count, linksActual.Count); for (int i = 0; i < linksActual.Count; i++) { Assert.AreEqual(linksExpected[i].FromCity, linksActual[i].FromCity); Assert.AreEqual(linksExpected[i].ToCity, linksActual[i].ToCity); } }
private long FindRoutes(Routes routes) { int count = routes.ReadRoutes(@"linksTestDataLab11.txt"); // test available cities Stopwatch timer = new Stopwatch(); timer.Start(); List<Link> links = routes.FindShortestRouteBetween("Lyon", "Berlin", TransportModes.Rail); return timer.ElapsedTicks; }
public void TestTask2FiredEvents() { var cities = new Cities(); cities.ReadCities(CitiesTestFile); var routes = new Routes(cities); // test available cities routes.RouteRequested += (sender, e) => { Assert.AreEqual("Bern", e.FromCity.Name); Assert.AreEqual("Zürich", e.ToCity.Name); }; routes.FindShortestRouteBetween("Bern", "Zürich", TransportMode.Rail); // test case insensitivity routes.FindShortestRouteBetween("BeRN", "ZüRiCh", TransportMode.Rail); // test not existing cities routes = new Routes(cities); routes.RouteRequested += (sender, e) => { Assert.Fail("Listeners should only be informed about valid requests."); }; try { routes.FindShortestRouteBetween("doesNotExist", "either", TransportMode.Rail); Assert.Fail("Should throw KeyNotFoundException when called with invalid city names."); } catch(KeyNotFoundException) { } }
public void TestTask2EventWithNoObserver() { var cities = new Cities(); cities.ReadCities(CitiesTestFile); var routes = new Routes(cities); // should run without exception routes.FindShortestRouteBetween("Bern", "Zürich", TransportMode.Rail); }
private void TestRouteParallelCorrectness(string _suffix,int _cities,int _routes,int _resultsA,int _resultsB,int _resultsC) { var cities = new Cities(); cities.ReadCities("citiesTestDataLab"+_suffix+".txt"); Assert.AreEqual(_cities, cities.Count); var routes = new Routes(cities); int count = routes.ReadRoutes("linksTestDataLab"+_suffix+".txt"); Assert.AreEqual(_routes, count); List<List<Link>> allRoutesSerial = routes.FindAllShortestRoutes(); List<List<Link>> allRoutesParallel = routes.FindAllShortestRoutesParallel(); //should return all combinations of routes (cities * routes * TransportModes) Assert.AreEqual(_resultsA, allRoutesSerial.Count()); Assert.AreEqual(_resultsA, allRoutesParallel.Count()); //filter out non-existing routes allRoutesSerial = allRoutesSerial.Where(r => r != null).ToList(); allRoutesParallel = allRoutesParallel.Where(r => r != null).ToList(); //should've found a subset of valid routes Assert.AreEqual(_resultsB, allRoutesSerial.Count()); Assert.AreEqual(_resultsB, allRoutesParallel.Count()); //filter out zero-length routes allRoutesSerial = allRoutesSerial.Where(r => r.Count()>0).ToList(); allRoutesParallel = allRoutesParallel.Where(r => r.Count()>0).ToList(); //should've found a subset of non-zero-length routes Assert.AreEqual(_resultsC, allRoutesSerial.Count()); Assert.AreEqual(_resultsC, allRoutesParallel.Count()); //sort both lists in a deterministic fashion foreach (var list in new[] { allRoutesSerial, allRoutesParallel }) list.Sort((a, b) => string.Join(":", a.Select(l => l.FromCity.Name + " " + l.ToCity.Name + " " + l.TransportMode)) .CompareTo(string.Join(":", b.Select(l => l.FromCity.Name + " " + l.ToCity.Name + " " + l.TransportMode)))); //serialize lists to a string var txtSerial = string.Join("/", allRoutesSerial.Select(i => string.Join(":", i.Select(l => l.FromCity.Name + " " + l.ToCity.Name + " " + l.TransportMode)))); var txtParallel = string.Join("/", allRoutesParallel.Select(i => string.Join(":", i.Select(l => l.FromCity.Name + " " + l.ToCity.Name + " " + l.TransportMode)))); //both algorithms should deliver the same result Assert.AreEqual(txtSerial, txtParallel); }
public void TestFindCitiesByTransportModeIsASingleLINQStatement() { Func<TransportMode,City[]> method = new Routes(null).FindCities; Assert.AreEqual(2, method.Method.GetMethodBody().LocalVariables.Count, "Implement the method FindCities as a single-line LINQ statement in the form \"return [LINQ];\"."); }