public override int GetHashCode()
        {
            int prime  = 31;
            int result = 1;

            result = (prime * result) + SegmentId.GetHashCode();
            result = (prime * result) + StartNode.GetHashCode();
            return(result);
        }
Exemple #2
0
 public void CreateFeedbackEntry(SegmentId segmentId, string originalTarget, string targetOrigin,
                                 string source)
 {
     if (targetOrigin != PluginResources.SDLMTCloudName)
     {
         return;
     }
     ActiveDocumentImprovements[segmentId] = new Feedback(originalTarget, source);
 }
Exemple #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SegmentContext"/> class.
        /// </summary>
        /// <param name="ediSegment">The segment line.</param>
        /// <param name="separators">The separators.</param>
        public SegmentContext(string ediSegment, Separators separators)
        {
            if (string.IsNullOrEmpty(ediSegment))
            {
                throw new ArgumentNullException("ediSegment");
            }
            if (separators == null)
            {
                throw new ArgumentNullException("separators");
            }

            var dataElements = ediSegment.Split(new [] { separators.DataElement }, StringSplitOptions.None);

            // Support for blank/situational segments
            if (dataElements[0] == ediSegment)
            {
                dataElements[0] = dataElements[0].TrimEnd(separators.Segment);
            }

            Name  = string.Concat(dataElements[0].Take(3));
            Value = ediSegment;

            // UNA segments don't have values
            if (ediSegment.StartsWith(SegmentId.UNA.ToString(), StringComparison.Ordinal))
            {
                Name = SegmentId.UNA.ToString();
            }

            if (dataElements.Length > 1)
            {
                // Handle blank segments, e.g. BHT+'
                var firstComponentDataElements = dataElements[1].Split(new[] { separators.ComponentDataElement },
                                                                       StringSplitOptions.None);
                FirstValue = firstComponentDataElements[0];
                if (dataElements.Length > 2)
                {
                    var secondComponentDataElements =
                        dataElements[2].Split(new[] { separators.ComponentDataElement },
                                              StringSplitOptions.None);
                    SecondValue = secondComponentDataElements[0];
                }
                if (Name == Hl && !string.IsNullOrEmpty(dataElements[2]))
                {
                    ParentId = dataElements[2];
                }
            }

            IsJump    = Jump();
            Tag       = ediSegment.ToSegmentTag(separators);
            IsControl = Control();
            LogName   = ToLogName();
        }
Exemple #4
0
        public void AddImprovement(SegmentId segmentId, string improvement)
        {
            if (!ActiveDocumentImprovements.ContainsKey(segmentId))
            {
                return;
            }

            var item = ActiveDocumentImprovements[segmentId];

            if (item.Suggestion != improvement)
            {
                item.Suggestion = improvement;
            }
        }
        /// <summary>
        /// Calculates for each segment the number of cars going to this segment.
        /// We use integer arithmetic for better performance.
        /// </summary>
        public IDictionary <ushort, uint>[] MeasureOutgoingVehicles(
            bool includeStopped = true,
            bool logDebug       = false)
        {
            // VehicleManager vehicleManager = Singleton<VehicleManager>.instance;
            // NetManager netManager = Singleton<NetManager>.instance;
            ExtVehicleManager     vehStateManager = ExtVehicleManager.Instance;
            IExtSegmentEndManager segEndMan       = Constants.ManagerFactory.ExtSegmentEndManager;

            // TODO pre-calculate this
            uint avgSegLen = (uint)SegmentId.ToSegment().m_averageLength;

            Dictionary <ushort, uint>[] ret =
                includeStopped ? numVehiclesGoingToSegmentId : numVehiclesMovingToSegmentId;

            // reset
            for (byte laneIndex = 0; laneIndex < ret.Length; ++laneIndex)
            {
                IDictionary <ushort, uint> laneMetrics = ret[laneIndex];
                foreach (ushort key in laneMetrics.Keys.ToList())
                {
                    laneMetrics[key] = 0;
                }
            }

            Log._DebugIf(
                logDebug,
                () => $"GetVehicleMetricGoingToSegment: Segment {SegmentId}, Node {NodeId}, " +
                $"includeStopped={includeStopped}.");

            int    endIndex        = segEndMan.GetIndex(SegmentId, StartNode);
            ushort vehicleId       = segEndMan.ExtSegmentEnds[endIndex].firstVehicleId;
            int    numProcessed    = 0;
            int    numIter         = 0;
            var    maxVehicleCount = VehicleManager.instance.m_vehicles.m_buffer.Length;

            while (vehicleId != 0)
            {
                ref Vehicle vehicle = ref vehicleId.ToVehicle();

                MeasureOutgoingVehicle(
                    logDebug,
                    ret,
                    includeStopped,
                    avgSegLen,
                    vehicleId,
                    ref vehicle,
                    ref vehStateManager.ExtVehicles[vehicleId],
                    ref numProcessed);

                if ((Options.simulationAccuracy <= SimulationAccuracy.Low && numProcessed >= 3) ||
                    (Options.simulationAccuracy == SimulationAccuracy.Medium && numProcessed >= 5) ||
                    (Options.simulationAccuracy == SimulationAccuracy.High && numProcessed >= 10))
                {
                    break;
                }

                vehicleId = vehStateManager.ExtVehicles[vehicleId].nextVehicleIdOnSegment;

                if (++numIter > maxVehicleCount)
                {
                    CODebugBase <LogChannel> .Error(
                        LogChannel.Core,
                        $"Invalid list detected!\n{Environment.StackTrace}");

                    break;
                }
            }
Exemple #6
0
        /// <summary>
        /// Calculates for each segment the number of cars going to this segment.
        /// We use integer arithmetic for better performance.
        /// </summary>
        public IDictionary <ushort, uint>[] MeasureOutgoingVehicles(
            bool includeStopped = true,
            bool logDebug       = false)
        {
            // VehicleManager vehicleManager = Singleton<VehicleManager>.instance;
            // NetManager netManager = Singleton<NetManager>.instance;
            ExtVehicleManager     vehStateManager = ExtVehicleManager.Instance;
            IExtSegmentEndManager segEndMan       = Constants.ManagerFactory.ExtSegmentEndManager;

            // TODO pre-calculate this
            uint avgSegLen = (uint)SegmentId.ToSegment().m_averageLength;

            IDictionary <ushort, uint>[] ret =
                includeStopped ? numVehiclesGoingToSegmentId : numVehiclesMovingToSegmentId;

            // reset
            for (byte laneIndex = 0; laneIndex < ret.Length; ++laneIndex)
            {
                IDictionary <ushort, uint> laneMetrics = ret[laneIndex];
                foreach (KeyValuePair <ushort, uint> e in laneMetrics)
                {
                    laneMetrics[e.Key] = 0;
                }
            }

            Log._DebugIf(
                logDebug,
                () => $"GetVehicleMetricGoingToSegment: Segment {SegmentId}, Node {NodeId}, " +
                $"includeStopped={includeStopped}.");

            int    endIndex     = segEndMan.GetIndex(SegmentId, StartNode);
            ushort vehicleId    = segEndMan.ExtSegmentEnds[endIndex].firstVehicleId;
            int    numProcessed = 0;
            int    numIter      = 0;

            while (vehicleId != 0)
            {
                Constants.ServiceFactory.VehicleService.ProcessVehicle(
                    vehicleId,
                    (ushort vId, ref Vehicle veh) => {
                    MeasureOutgoingVehicle(
                        logDebug,
                        ret,
                        includeStopped,
                        avgSegLen,
                        vehicleId,
                        ref veh,
                        ref vehStateManager.ExtVehicles[vehicleId],
                        ref numProcessed);
                    return(true);
                });

                if ((Options.simulationAccuracy <= SimulationAccuracy.Low && numProcessed >= 3) ||
                    (Options.simulationAccuracy == SimulationAccuracy.Medium && numProcessed >= 5) ||
                    (Options.simulationAccuracy == SimulationAccuracy.High && numProcessed >= 10))
                {
                    break;
                }

                vehicleId = vehStateManager.ExtVehicles[vehicleId].nextVehicleIdOnSegment;

                if (++numIter > Constants.ServiceFactory.VehicleService.MaxVehicleCount)
                {
                    CODebugBase <LogChannel> .Error(
                        LogChannel.Core,
                        $"Invalid list detected!\n{Environment.StackTrace}");

                    break;
                }
            }

            if (logDebug)
            {
                string SelectFun(IDictionary <ushort, uint> e) =>
                "[" + string.Join(
                    ", ",
                    e.Select(x => x.Key.ToString() + "=" + x.Value.ToString()).ToArray())
                + "]";

                string result = string.Join(", ", ret.Select(SelectFun).ToArray());
                Log._Debug("GetVehicleMetricGoingToSegment: Calculation completed. " + result);
            }

            return(ret);
        }
Exemple #7
0
 public int CompareTo(Segment other)
 {
     return(SegmentId.CompareTo(other.SegmentId));
 }
Exemple #8
0
 private bool IsImprovementToTpTranslation(ITranslationOrigin translationOrigin, SegmentId segmentId, ISegment segment)
 {
     return(translationOrigin?.OriginBeforeAdaptation?.OriginSystem == PluginResources.SDLMTCloudName &&
            ActiveDocumentImprovements.ContainsKey(segmentId) &&
            ActiveDocumentImprovements[segmentId].OriginalMtCloudTranslation != segment.ToString() &&
            segment.Properties?.ConfirmationLevel == ConfirmationLevel.Translated);
 }