Example #1
0
 public TraversalState(
     TraversalState parent,
     PipelineContextData data)
 {
     Parent = parent;
     m_data = data;
 }
        public void Collect_OneModuleToCollectAndOnePath_Collected()
        {
            const string moduleNameToCollect  = "moduleName";
            var          moduleNamesToCollect = new List <string> {
                moduleNameToCollect
            };
            var traversalState = new TraversalState {
                CurrentInstance = new Instance("netlist", "host", moduleNameToCollect, "instName")
            };
            var instancesPathTracker = new InstancesPathTracker().UpdateIn(traversalState.CurrentInstance);

            traversalState.InstancesPathTracker = instancesPathTracker;

            _target = new PhysicalPathAggregator(moduleNamesToCollect);
            _target.Collect(traversalState);

            var result = _target.Result();

            Assert.That(result, Has.Count.EqualTo(1));
            Assert.That(result, Has.Exactly(1).Matches <ModulePhysiclaPaths>(mpp =>
                                                                             mpp.ModuleName == moduleNameToCollect &&
                                                                             mpp.Paths.Count == 1 &&
                                                                             mpp.Paths[0] == instancesPathTracker.ToString()
                                                                             ));
        }
Example #3
0
        /// <summary>
        /// Returns all context data objects (depth first)
        /// </summary>
        internal static IEnumerable <PipelineContextData> Traverse(
            this PipelineContextData value,
            Boolean omitKeys)
        {
            yield return(value);

            if (value is ArrayContextData || value is DictionaryContextData)
            {
                var state = new TraversalState(null, value);
                while (state != null)
                {
                    if (state.MoveNext(omitKeys))
                    {
                        value = state.Current;
                        yield return(value);

                        if (value is ArrayContextData || value is DictionaryContextData)
                        {
                            state = new TraversalState(state, value);
                        }
                    }
                    else
                    {
                        state = state.Parent;
                    }
                }
            }
        }
Example #4
0
 public void Collect(TraversalState traversalState)
 {
     if (IsModuleToTrack(traversalState.CurrentInstance))
     {
         AddPath(traversalState);
     }
 }
        private static void EnsureHasNoCycles(IReadOnlyDictionary <string, string[]> adjacencyMap)
        {
            var state = new TraversalState(adjacencyMap);
            var roots = adjacencyMap
                        .Where(kvp => kvp.Value.Length == 0)
                        .Select(kvp => kvp.Key)
                        .ToArray();

            if (roots.Length == 0)
            {
                var startingNode = adjacencyMap.OrderBy(kvp => kvp.Value.Length).Select(kvp => kvp.Key).FirstOrDefault();
                // no nodes = no cycles
                if (startingNode == null)
                {
                    return;
                }

                EnsureHasNoCycles(startingNode, state);
            }
            else
            {
                foreach (var node in roots)
                {
                    EnsureHasNoCycles(node, state);
                }
            }
        }
Example #6
0
        /// <summary>
        /// Returns all tokens (depth first)
        /// </summary>
        public static IEnumerable <TemplateToken> Traverse(
            this TemplateToken token,
            bool omitKeys)
        {
            if (token != null)
            {
                yield return(token);

                if (token is SequenceToken || token is MappingToken)
                {
                    var state = new TraversalState(null, token);
                    while (state != null)
                    {
                        if (state.MoveNext(omitKeys))
                        {
                            token = state.Current;
                            yield return(token);

                            if (token is SequenceToken || token is MappingToken)
                            {
                                state = new TraversalState(state, token);
                            }
                        }
                        else
                        {
                            state = state.Parent;
                        }
                    }
                }
            }
        }
Example #7
0
 public TraversalState(
     TraversalState parent,
     TemplateToken token)
 {
     Parent  = parent;
     m_token = token;
 }
Example #8
0
        public void RoadNetworkTraversal_LaneSectionTraversalSmokeTest()
        {
            var roadNetwork     = LoadTestFile("CircleCourse");
            var firstRoad       = roadNetwork.AllRoads.First();
            var firstRoadId     = new NativeString64(firstRoad.roadId);
            var numLaneSections = 3;
            var numLoops        = 10;
            var traversalState  = new TraversalState(roadNetwork, firstRoad.roadId, 0, -1, TraversalDirection.Forward);

            for (var step = 0; step < numLaneSections - 1; ++step)
            {
                Assert.IsTrue(RoadNetworkTraversal.TryAdvanceOneLaneSection(roadNetwork, ref traversalState, false),
                              $"Failed to advance to step #{step} - {numLaneSections} total");
                Assert.AreEqual(-1, traversalState.LaneId);
            }
            // Without allowing looping, we shouldn't be allowed to go to the next lane section
            Assert.IsFalse(RoadNetworkTraversal.TryAdvanceOneLaneSection(roadNetwork, ref traversalState, false));
            Assert.IsTrue(RoadNetworkTraversal.TryAdvanceOneLaneSection(roadNetwork, ref traversalState, true));
            Assert.AreEqual(firstRoadId, traversalState.RoadId);
            for (var step = 0; step < numLaneSections * numLoops; ++step)
            {
                Assert.IsTrue(RoadNetworkTraversal.TryAdvanceOneLaneSection(roadNetwork, ref traversalState, true),
                              $"Failed to advance to step #{step} - {numLaneSections} total");
                Assert.AreEqual(-1, traversalState.LaneId);
            }
            Assert.AreEqual(firstRoadId, traversalState.RoadId);
        }
 void fall()
 {
     Vector3 loc = this.transform.position;
     platState = TraversalState.down;
     desiredPosition = loc.y - (traversalDistance + 1140);
     movementSpeed = 30;
     Destroy(this.gameObject,2f);
 }
Example #10
0
 internal static void AdvanceOneRoad(TraversalParameters traversalParam, TraversalState traversalState)
 {
     if (!TryAdvanceOneRoad(traversalParam, traversalState))
     {
         throw new InvalidOperationException(
                   "Failed to advance along road network - you may want TryAdvanceOneRoad instead.");
     }
 }
Example #11
0
        public void Collect(TraversalState traversalState)
        {
            if (traversalState.CurrentInstance.IsModule())
            {
                return;
            }

            _result.UpdateValue(traversalState.CurrentInstance.ModuleName, count => ++ count, 0);
        }
Example #12
0
 public static void DisposeAll(TraversalState state)
 {
     foreach (var tileKvp in s_tileUsage)
     {
         var tile = tileKvp.Key;
         s_tileUsage.Remove(tile);
         tile.DisposeAndRemove(state);
     }
 }
Example #13
0
        //public static void Register(ISg sg, TraversalState state)
        //{
        //    var replace = s_tileUsage.ContainsKey(sg) ? s_tileUsage[sg] : DateTime.MinValue;
        //    s_tileUsage[sg] = replace;
        //}

        // private static bool m_forceFreeMemory = false;
        public static void Use(ISg sg, TraversalState state)
        {
            //if (s_tileUsage.ContainsKey(sg))
            //    s_tileUsage.Remove(sg);

            s_tileUsage[sg] = (long)(DateTime.Now - s_startTime).TotalSeconds;

            //if (GC.GetTotalMemory(false) > 600000000)
            //    m_forceFreeMemory = true;
        }
Example #14
0
        static bool TryAdvanceThroughJunction(Junction junction, RoadNetworkDescription network,
                                              ref TraversalState state, bool allowLooping = false)
        {
            var roadId = state.RoadId.ToString();

            // TODO: This search currently terminates on the first found linked road/lane, but we may want to find
            //       all of them first and then select one based on some criteria
            foreach (var connection in junction.connections)
            {
                if (roadId == connection.incomingRoadId)
                {
                    if (!allowLooping && state.AllRoadIds.HasBeenTraversed(new NativeString64(connection.incomingRoadId)))
                    {
                        return(false);
                    }

                    foreach (var link in connection.laneLinks)
                    {
                        if (link.laneIdFrom != state.LaneId)
                        {
                            continue;
                        }
                        var direction = DetermineNewDirection(connection.contactPoint);
                        var idx       = direction == TraversalDirection.Forward
                            ? 0
                            : network.GetRoadById(connection.connectingRoadId).laneSections.Count - 1;
                        state.SetNewLocation(new NativeString64(connection.connectingRoadId), idx, link.laneIdTo, direction);
                        return(true);
                    }
                }
                else if (roadId == connection.connectingRoadId)
                {
                    if (!allowLooping && state.AllRoadIds.HasBeenTraversed(new NativeString64(connection.connectingRoadId)))
                    {
                        return(false);
                    }

                    foreach (var link in connection.laneLinks)
                    {
                        if (link.laneIdTo != state.LaneId)
                        {
                            continue;
                        }
                        var nextRoad   = network.GetRoadById(connection.incomingRoadId);
                        var sectionIdx = nextRoad.laneSections.Count - 1;
                        state.SetNewLocation(new NativeString64(connection.incomingRoadId), sectionIdx, link.laneIdFrom, TraversalDirection.Backward);
                        return(true);
                    }
                }
            }

            return(false);
        }
    void OnTriggerEnter(Collider col)
    {
        if(col.gameObject.tag == "Player"){
            if(isDestructible){
                platState = TraversalState.right;
                getDesiredPosition();
                Invoke("fall",1f);
            }

            else if(this.gameObject.name == "Moving_Platform_Sides" ||
                     this.gameObject.name == "Moving_Platform_Upward"){
                theHero = col.transform.parent.gameObject.GetComponent<CharacterMovement>();
            }
        }
    }
Example #16
0
        // NOTE: Because this method advances by ROAD, any LANE information will be lost on traversal (reset to 0)
        //       Use TryAdvanceOneLaneSection to move along a selected lane
        internal static bool TryAdvanceOneRoad(TraversalParameters traversalParam, TraversalState traversalState)
        {
            var roadCurrent = traversalParam.roadNetwork.GetRoadById(traversalState.RoadId);
            var link        = GetLinkToNextRoad(roadCurrent, traversalState.Direction);


            if (link.linkType == RoadLinkType.None || traversalParam.shouldStopAtJunctions &&
                !IsLinkOnGraphEdge(traversalParam.roadNetwork, link))
            {
                return(false);
            }

            var directionNext = DetermineNewDirection(link.contactPoint);

            traversalState.SetNewLocation(new NativeString64(link.nodeId), 0, 0, directionNext);
            return(true);
        }
Example #17
0
        public void RoadNetworkTraversal_RoadGroupingSmokeTest()
        {
            var roadNetwork    = LoadTestFile("Crossing8Course");
            var traversalState = new TraversalState(roadNetwork);
            var numGroups      = 0;

            while (traversalState.AllRoadIds.AnyNotTraversed())
            {
                var roadId = traversalState.AllRoadIds.GetNotTraversed();
                if (roadNetwork.GetRoadById(roadId).junction != "-1")
                {
                    traversalState.AllRoadIds.Traverse(roadId);
                    continue;
                }

                var roadGroup = RoadNetworkTraversal.IdentifyGraphEdgeGroup(roadNetwork,
                                                                            traversalState, roadId);
                numGroups++;
                Assert.AreEqual(3, roadGroup.numRoads);
                Assert.AreEqual(TraversalDirection.Forward, roadGroup.startingDirection);
            }
            Assert.AreEqual(2, numGroups);
        }
Example #18
0
        public static void FreeMemory(TraversalState state)
        {
            Report.Line(1, "Free");
            var x = (long)((DateTime.Now - s_startTime).TotalSeconds);

            var tilesDescriptionsWhichCouldBeRemoved =
                from tileKvp in s_tileUsage
                where x - tileKvp.Value > MaximumLifeTime
                select tileKvp;

            var tdcbrArray = tilesDescriptionsWhichCouldBeRemoved.ToArray();

            Report.Line(1, "USED TILES BEF: " + s_tileUsage.Count);
            Report.Line(1, "REMOVING " + tdcbrArray.Length + "TILES");
            foreach (var tileKvp in tdcbrArray)
            {
                // Report.Line(0, "Tile disposed " + (currentCycle - tileKvp.Value));
                var tile = tileKvp.Key;
                s_tileUsage.Remove(tile);
                tile.DisposeAndRemove(state);
            }
            Report.Line(1, "USED TILES AFT: " + s_tileUsage.Count);
        }
        private static void EnsureHasNoCycles(string node, TraversalState state)
        {
            state.Visit(node);
            var nextNodes = state.GetNext(node);

            if (!nextNodes.Any())
            {
                state.Yield(node);
                return;
            }

            foreach (var adjacentNode in nextNodes)
            {
                if (state.IsVisited(adjacentNode) && !state.IsYielded(adjacentNode))
                {
                    var msg = $"Cyclic config dependency detected, visited undeleted node twice: '{adjacentNode}'";
                    throw new BadYamlException("configurations", msg);
                }

                EnsureHasNoCycles(adjacentNode, state);
            }

            state.Yield(node);
        }
Example #20
0
        // Each non-junction road is effectively a segment of a graph edge - this function identifies which roads
        // belong on the same edge as the input graph edge and return the information necessary to query this edge
        internal static RoadGroup IdentifyGraphEdgeGroup(RoadNetworkDescription roadNetwork,
                                                         TraversalState state, NativeString64 roadId)
        {
            if (roadNetwork.GetRoadById(roadId).junction != "-1")
            {
                throw new ArgumentException(
                          "Cannot collect graph edge group for a road inside a junction - roads inside junctions" +
                          "are part of a graph node.");
            }

            // Because we want to limit traversal to this graph edge, we will always stop at junctions (nodes)
            const bool stopAtJunctions = true;
            var        param           = new TraversalParameters(roadNetwork, stopAtJunctions);
            // Count how many Road elements are in this group, including the starting road
            var numRoads = 1;

            state.SetNewLocation(roadId, 0, 0, TraversalDirection.Backward);
            while (TryAdvanceOneRoad(param, state))
            {
                numRoads++;
            }
            // We've moved all the way to the "front" of this collection of roads - store it as the starting location
            var startingRoadId = state.RoadId;
            // To get from the first Road to the second, we need to travel in the opposite direction we traversed to
            // reach the first Road
            var startDirection = (TraversalDirection)(-(int)state.Direction);

            // Traverse forward to ensure we mark all the roads in this group as traversed
            state.SetNewLocation(roadId, 0, 0, TraversalDirection.Forward);
            while (TryAdvanceOneRoad(param, state))
            {
                numRoads++;
            }

            return(new RoadGroup(startDirection, startingRoadId, numRoads));
        }
    public void continueMoving()
    {
        Vector3 loc = this.transform.position;

        if(pastState == TraversalState.up){
            platState = TraversalState.down;
            desiredPosition = loc.y - traversalDistance;
        }

        else if(pastState == TraversalState.right){
            platState = TraversalState.left;
            desiredPosition = loc.x - traversalDistance;
        }

        else if(pastState == TraversalState.left){
            platState = TraversalState.right;
            desiredPosition = loc.x + traversalDistance;
        }

        else if(pastState == TraversalState.down){
            platState = TraversalState.up;
            desiredPosition = loc.y + traversalDistance;
        }
    }
Example #22
0
        // TODO: This should be modified to take a TraversalParams struct instead of taking the network directly
        internal static bool TryAdvanceOneLaneSection(RoadNetworkDescription network, ref TraversalState state,
                                                      bool allowLooping = false)
        {
            var roadCurrent = network.GetRoadById(state.RoadId);
            var laneCurrent = roadCurrent.laneSections[state.LaneSectionIdx].GetLane(state.LaneId);
            var laneIdNext  = GetNextLaneId(laneCurrent, state.Direction);

            // If there are more lane sections, we haven't reached the end of the road
            if (HasMoreLaneSectionsInDirection(roadCurrent, state))
            {
                // Check that the current lane exists in this next road section
                if (laneIdNext == 0)
                {
                    Debug.Log($"Lane {state.LaneId} on Road {state.RoadId} ends after section {state.LaneSectionIdx}");
                    return(false);
                }

                var sectionIdxNext = state.LaneSectionIdx + (int)state.Direction;
//                Debug.Log($"Moving to section {sectionIdxNext} lane {laneIdNext} in road {state.RoadId}");
                // Since we're staying in the same road, we preserve the traverse travelDirection
                state = new TraversalState(network, state.RoadId, sectionIdxNext, laneIdNext, state.Direction);
                if (!roadCurrent.laneSections[state.LaneSectionIdx].HasLane(state.LaneId))
                {
                    throw new Exception($"Expected road {state.RoadId} to have lane {state.LaneId}.");
                }
                return(true);
            }

            var roadLink = GetLinkToNextRoad(roadCurrent, state.Direction);

            // Check to see if road terminates
            if (roadLink.linkType == RoadLinkType.None)
            {
                Debug.Log($"Road {state.RoadId} ends in travelDirection {state.Direction}");
                return(false);
            }

            if (roadLink.linkType == RoadLinkType.Road)
            {
                // If the road has a link, it should be guaranteed to have a valid LinkContactPoint as well
                Debug.Assert(roadLink.contactPoint == LinkContactPoint.Start ||
                             roadLink.contactPoint == LinkContactPoint.End,
                             $"Road {state.RoadId} road link contact point was not set correctly.'");
                if (laneIdNext == 0)
                {
                    Debug.Log($"Lane {state.LaneId} on Road {state.RoadId} ends in travelDirection {state.Direction}");
                    return(false);
                }

                var roadIdNext     = roadLink.nodeId;
                var roadNext       = network.GetRoadById(roadIdNext);
                var directionNext  = roadLink.contactPoint == LinkContactPoint.Start ? TraversalDirection.Forward : TraversalDirection.Backward;
                var sectionIdxNext = directionNext == TraversalDirection.Forward ? 0 : roadNext.laneSections.Count - 1;

                var laneSectionNext = roadNext.laneSections[sectionIdxNext];
                if (!laneSectionNext.HasLane(laneIdNext))
                {
                    throw new Exception($"Expected {roadNext.roadId} to have lane {laneIdNext}.");
                }

                if (state.AllRoadIds.HasBeenTraversed(new NativeString64(roadIdNext)) && !allowLooping)
                {
                    return(false);
                }

//                Debug.Log($"Moving to road {roadIdNext} section {sectionIdxNext} lane {laneIdNext}");
                state.SetNewLocation(new NativeString64(roadIdNext), sectionIdxNext, laneIdNext, directionNext);
            }
            else if (roadLink.linkType == RoadLinkType.Junction)
            {
                var junction = network.GetJunctionById(roadLink.nodeId);
                if (!TryAdvanceThroughJunction(junction, network, ref state, allowLooping))
                {
                    Debug.Log($"Found no connected lanes for lane {state.LaneId} on road {state.RoadId} in junction {junction.junctionId}");
                    return(false);
                }
            }

            return(true);
        }
Example #23
0
 private void AddPath(TraversalState traversalState)
 {
     _result[traversalState.CurrentInstance.ModuleName].Add(traversalState.InstancesPathTracker.ToString());
 }
    // Update is called once per frame
    void Update()
    {
        Vector3 loc = this.transform.position;

        if(platState == TraversalState.up){
            if(loc.y < desiredPosition)
                transform.Translate(Vector3.up * Time.deltaTime * movementSpeed);
            else{
                platState = TraversalState.stop;
                pastState = TraversalState.up;
                Invoke("continueMoving", stopTime);
            }
        }

        if(platState == TraversalState.down){
            if(loc.y > desiredPosition)
                transform.Translate(Vector3.down * Time.deltaTime * movementSpeed);
            else{
                platState = TraversalState.stop;
                pastState = TraversalState.down;
                Invoke("continueMoving", stopTime);;
            }
        }

        if(platState == TraversalState.right){
            if(loc.x < desiredPosition)
                transform.Translate(Vector3.right * Time.deltaTime * movementSpeed);
            else{
                platState = TraversalState.stop;
                pastState = TraversalState.right;
                Invoke("continueMoving", stopTime);
            }
        }

        if(platState == TraversalState.left){
            if(loc.x > desiredPosition)
                transform.Translate(Vector3.left * Time.deltaTime * movementSpeed);
            else{
                platState = TraversalState.stop;
                pastState = TraversalState.left;
                Invoke("continueMoving", stopTime);
            }
        }

        if(theHero != null){
            if(platState == TraversalState.right)
                theHero.NewPlatformSpeedX(movementSpeed, true);

            else if(platState == TraversalState.up)
                theHero.NewPlatformSpeedY(movementSpeed, true);

            else if(platState == TraversalState.left)
                theHero.NewPlatformSpeedX(movementSpeed, false);

            else if(platState == TraversalState.down){
                theHero.NewPlatformSpeedY(movementSpeed, false);
            }

            else if(platState == TraversalState.stop){
                theHero.NewPlatformSpeedX(0f, false);
                theHero.NewPlatformSpeedY(0f, false);
            }
        }
    }
Example #25
0
        private static bool HasMoreLaneSectionsInDirection(Road road, TraversalState state)
        {
            var nextIndex = state.LaneSectionIdx + (int)state.Direction;

            return(0 <= nextIndex && nextIndex < road.laneSections.Count);
        }