src/algorithms/moore/index.js
b681b265
 import { findIndex, find, map, propEq, reduce, sort, concat } from 'rambda';
fe944750
 import type { JobId } from '../../types';
b681b265
 import { max, remove, slice } from 'ramda';
fe944750
 
 type JobTime = {
   jobId: JobId,
   t: number,
   d: number,
 };
 
 const findLateJob = (jobTimes: JobTime[]) =>
   find(({ c, d }: JobTime) => c > d, jobTimes);
 
 const findMaxTJob = (jobTimes: JobTime[]) =>
   reduce(
     (maxTJob: JobTime, jobTime: JobTime) => maxTJob.t > jobTime.t ? maxTJob : jobTime,
     { t: -Infinity },
     jobTimes
   );
 
 const updateCTime = (jobTimes: JobTime[]) => {
   let prev = 0;
 
   const cj = map((jobTime: JobTime) => {
     prev += jobTime.t;
 
     return { ...jobTime, c: prev };
   }, jobTimes);
 
   return cj;
 };
 
b681b265
 export const fillCorrupted = (jobs: JobTime[]) => map(
   ({ d, ...rest }) => ({ ...rest, d: d || 1000 }),
   jobs);
 
fe944750
 export const createSchedule = (jobs: JobTime[]) => {
b681b265
   jobs = fillCorrupted(jobs);
 
fe944750
   const F = sort((a: JobTime, b: JobTime) => a.d - b.d, jobs);
   const L = [];
 
   let cj = updateCTime(F);
   let lateJob;
 
   while (lateJob = findLateJob(cj)) {
     const lateJobIndex = findIndex(propEq('jobId', lateJob.jobId), cj);
     const jobsBeforeLateJob = slice(0, lateJobIndex + 1, cj);
 
     const maxTJob = findMaxTJob(jobsBeforeLateJob);
     const maxTJobIndex = findIndex(propEq('jobId', maxTJob.jobId), cj);
 
     cj = remove(maxTJobIndex, 1, cj);
     cj = updateCTime(cj);
 
     L.push(maxTJob);
   }
 
   const schedule = concat(cj, L);
 
   return updateCTime(schedule);
 };
 
 export default (jobs: JobTime[]) => {
   const schedule = createSchedule(jobs);
 
   const normalizedSchedule = map((jobTime: JobTime) => ({
     processor: 1,
     startTime: jobTime.c - jobTime.t,
     endTime: jobTime.c,
b681b265
     delayed: max(0, jobTime.c - jobTime.d)
fe944750
   }), schedule);
 
   return [normalizedSchedule];
 };