public List <FQueueingScope> GetQueueAbleTime(FRequestProposalForCapability jobProposal , long currentTime, CapabilityProviderManager cpm , long resourceBlockedUntil, int resourceId) { //TODO Right now only take the first var resourceCapabilityProvider = cpm.GetCapabilityProviderByCapability(jobProposal.CapabilityId); var setup = resourceCapabilityProvider.ResourceSetups.Single(x => resourceId.Equals(x.Resource.Id)); var requiredDuration = 0L; if (setup.UsedInProcess) { requiredDuration += ((FBucket)jobProposal.Job).MaxBucketSize; } if (setup.UsedInSetup) { requiredDuration += resourceCapabilityProvider.ResourceSetups.Sum(x => x.SetupTime); } var usedForSetupAndProcess = setup.UsedInProcess && setup.UsedInSetup; var queuingScopes = GetScopesFor(requiredTimeForJob: requiredDuration, jobProposal.Job, //jobProposal.CapabilityId, resourceCapabilityProvider.ResourceCapabilityId, usedForSetupAndProcess, currentTime, resourceBlockedUntil, cpm); return(queuingScopes); }
public Default(int timeConstraintQueueLength, int resourceId, WorkTimeGenerator workTimeGenerator, List <M_ResourceCapabilityProvider> capabilityProvider, SimulationType simulationType = SimulationType.None) : base(simulationType: simulationType) { _resourceId = resourceId; _workTimeGenerator = workTimeGenerator; _capabilityProviderManager = new CapabilityProviderManager(capabilityProvider); _agentDictionary = new AgentDictionary(); // SCOPELIMIT something like 480 _scopeQueue = new TimeConstraintQueue(limit: timeConstraintQueueLength); }
private List <FQueueingScope> GetScopesFor(long requiredTimeForJob , IJob job //, int capabilityId , int resourceCapabilityId , bool usedForSetupAndProcess , long currentTime , long resourceBlockedUntil , CapabilityProviderManager capabilityProviderManager) { var positions = new List <FQueueingScope>(); var jobPriority = job.Priority(currentTime); var allWithHigherPriority = this.Where(x => x.Value.Job.Priority(currentTime) <= jobPriority); var enumerator = allWithHigherPriority.GetEnumerator(); var isQueueAble = false; var isRequiringSetup = true; var earliestStart = resourceBlockedUntil < currentTime ? currentTime : resourceBlockedUntil; var requiredTime = requiredTimeForJob; if (!enumerator.MoveNext()) { isQueueAble = true; isRequiringSetup = (!capabilityProviderManager.AlreadyEquipped(resourceCapabilityId)); // ignore first round // totalwork = max } else { var current = enumerator.Current; var preScopeEnd = current.Value.ScopeConfirmation.GetScopeEnd(); var preIsReady = ((FBucket)current.Value.Job).HasSatisfiedJob; var jobToPutIsReady = ((FBucket)job).HasSatisfiedJob; var currentJobPriority = current.Value.Job.Priority(currentTime); earliestStart = !preIsReady && jobToPutIsReady && (currentJobPriority >= jobPriority) ? earliestStart : preScopeEnd; if (usedForSetupAndProcess) { if (preScopeEnd == earliestStart) { isRequiringSetup = current.Value.CapabilityProvider.ResourceCapabilityId != resourceCapabilityId; } else { isRequiringSetup = (!capabilityProviderManager.AlreadyEquipped(resourceCapabilityId)); } if (!isRequiringSetup) { requiredTime = requiredTimeForJob - capabilityProviderManager.GetSetupDurationBy(resourceCapabilityId); } } isQueueAble = currentTime + Limit > earliestStart + requiredTime || !preIsReady && jobToPutIsReady; //earliestStart = preScopeEnd; while (enumerator.MoveNext()) { // Limit? Job satisfied? if (!isQueueAble) { break; } requiredTime = requiredTimeForJob; var post = enumerator.Current; var postScopeStart = post.Value.ScopeConfirmation.GetScopeStart(); if (usedForSetupAndProcess) { isRequiringSetup = current.Value.CapabilityProvider.ResourceCapabilityId != resourceCapabilityId; if (!isRequiringSetup) { requiredTime = requiredTimeForJob - capabilityProviderManager.GetSetupDurationBy(resourceCapabilityId); } } if (requiredTime <= postScopeStart - earliestStart && requiredTime > 0) { positions.Add(new FQueueingScope(isQueueAble: true, isRequieringSetup: isRequiringSetup, // setup is Required scope: new FScope(start: earliestStart, end: postScopeStart) )); } current = post; if (usedForSetupAndProcess) { isRequiringSetup = current.Value.CapabilityProvider.ResourceCapabilityId != resourceCapabilityId; if (!isRequiringSetup) { requiredTime = requiredTimeForJob - capabilityProviderManager.GetSetupDurationBy(resourceCapabilityId); } } currentJobPriority = current.Value.Job.Priority(currentTime); preIsReady = ((FBucket)current.Value.Job).HasSatisfiedJob; //earliestStart = current.Value.ScopeConfirmation.GetScopeEnd(); earliestStart = !preIsReady && jobToPutIsReady && (currentJobPriority >= jobPriority) ? earliestStart : current.Value.ScopeConfirmation.GetScopeEnd(); isQueueAble = (currentTime + Limit) > (earliestStart + requiredTime) || ((FBucket)job).HasSatisfiedJob; } } enumerator.Dispose(); // Queue contains no job --> Add queable item // TODO only is queable if any position exits positions.Add(new FQueueingScope(isQueueAble: isQueueAble, isRequieringSetup: isRequiringSetup, scope: new FScope(start: earliestStart, end: long.MaxValue))); return(positions); }