< Summary

Class:Itinero.MapMatching.Solver.ModelSolver
Assembly:Itinero.MapMatching
File(s):/home/runner/work/routing2/routing2/src/Itinero.MapMatching/Solver/ModelSolver.cs
Covered lines:46
Uncovered lines:0
Coverable lines:46
Total lines:66
Line coverage:100% (46 of 46)
Covered branches:16
Total branches:20
Branch coverage:80% (16 of 20)
Tag:251_23667616543

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
Solve(...)80%20100%

File(s)

/home/runner/work/routing2/routing2/src/Itinero.MapMatching/Solver/ModelSolver.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using Itinero.MapMatching.Model;
 4
 5namespace Itinero.MapMatching.Solver;
 6
 7public class ModelSolver
 8{
 9    public IEnumerable<int> Solve(GraphModel model)
 2910    {
 2911        var binaryHeap = new BinaryHeap<uint>();
 2912        if (model.FirstNode == null) throw new Exception("Model is empty");
 2913        if (model.LastNode == null) throw new Exception("Model is not empty, should have a last node");
 14
 2915        var path = new List<int>();
 2916        var pathTree = new PathTree();
 2917        var pointer = pathTree.Add((uint)model.FirstNode.Value, uint.MaxValue);
 2918        binaryHeap.Push(pointer, 0);
 19
 2920        var settled = new HashSet<int>();
 1016921        while (true)
 1016922        {
 1016923            pointer = binaryHeap.Pop(out var priority);
 1016924            pathTree.Get(pointer, out var node, out var previous);
 1016925            var popSuccess = !settled.Contains((int)node);
 9550826            while (binaryHeap.Count > 0 &&
 9550827                   !popSuccess)
 8533928            {
 8533929                pointer = binaryHeap.Pop(out priority);
 8533930                pathTree.Get(pointer, out node, out previous);
 8533931                popSuccess = !settled.Contains((int)node);
 8533932            }
 1016933            if (popSuccess == false) break;
 1016934            settled.Add((int)node);
 35
 1016936            if (node == model.LastNode)
 2937            {
 38                // TODO: compose final path.
 212039                while (true)
 212040                {
 212041                    path.Add((int)node);
 212042                    if (node == model.FirstNode)
 2943                    {
 2944                        path.Reverse();
 2945                        break;
 46                    }
 47
 209148                    pointer = previous;
 209149                    pathTree.Get(pointer, out node, out previous);
 209150                }
 2951                break;
 52            }
 53
 54            // add neighbours.
 1014055            var graphNode = model.GetNode((int)node);
 1014056            var neighbours = model.GetNeighbours((int)node);
 25934457            foreach (var neighbour in neighbours)
 11446258            {
 11446259                var neighbourPointer = pathTree.Add((uint)neighbour.Node2, pointer);
 11446260                binaryHeap.Push(neighbourPointer, priority + graphNode.Cost + neighbour.Cost);
 11446261            }
 1014062        }
 63
 2964        return path;
 2965    }
 66}

Methods/Properties

Solve(...)