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);
        }
Beispiel #2
0
 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);
        }