public override int GetHashCode() { int prime = 31; int result = 1; result = (prime * result) + SegmentId.GetHashCode(); result = (prime * result) + StartNode.GetHashCode(); return(result); }
public void CreateFeedbackEntry(SegmentId segmentId, string originalTarget, string targetOrigin, string source) { if (targetOrigin != PluginResources.SDLMTCloudName) { return; } ActiveDocumentImprovements[segmentId] = new Feedback(originalTarget, source); }
/// <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(); }
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; } }
/// <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); }
public int CompareTo(Segment other) { return(SegmentId.CompareTo(other.SegmentId)); }
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); }