// import { // addIndex, // findIndex, // find, // map, // propEq, // reduce, // sort, // range, // concat, // filter, // reverse, // prop, // flatten, // uniq, // reject, // contains, // omit, // equals, // update, // times, // add, // pluck, // last, forEach // } from 'rambda'; // import type { JobId } from '../../types'; // import { max, min, remove, slice } from 'ramda'; // import { createSchedule as johnson, updateCTime } from '../johnson'; // // type JobTime = { // jobId: JobId, // t: number, // succ: JobId[], // processor: number // }; // // type JobTimeWithZK = JobTime | { // z: number, // k: number // }; // // const noAncJobs = (jobTimes: JobTime[]) => { // const allSuccesors = flatten(map(prop('succ'), jobTimes)); // return reject((jobTime: JobTime) => contains(jobTime.jobId, allSuccesors), jobTimes); // }; // // const ancestors = (id: JobId, jobTimes: JobTime[]) => // filter(({ succ }) => contains(id, succ), jobTimes); // // const updateZK = (jobTimes: JobTimeWithZK[], allJobTimes: JobTimeWithZK) => // map((jobTime: JobTimeWithZK) => { // // const allSuccesors = map(prop('succ'), jobTimes); // const ancestors = filter(aJob => contains(jobTime.jobId, aJob.succ), allJobTimes); // // let z = reduce((acc, job) => max(acc, job.k), -Infinity, ancestors); // z = max(z, jobTime.t); // // return { // ...jobTime, // z, // k: z + jobTime.t // }; // }, jobTimes); // // export const createSchedule = (jobTimes: JobTime[], processorsCount: number) => { // let k = 0; // let Pk = []; // // let jobTimesWithZK: JobTimeWithZK[] = map((jobTime: JobTime) => ({ // ...jobTime, // z: 0, // k: 0 + jobTime.t // }), jobTimes); // // let Sk = noAncJobs(jobTimesWithZK); // let mStar; // // const processorC = [0, 0, 0, 0]; // // // while (Sk.length) { // while (k < 4) { // // if (k === 2) { // // console.log(processorC); // // } // // console.log(processorC); // let kStar = reduce((acc: JobTimeWithZK, jobTime: JobTimeWithZK) => { // // console.log(jobTime.jobId, jobTime.t + processorC[jobTime.processor]); // // const anc = ancestors(jobTime.jobId, jobTimes)[0]; // // let z = processorC[jobTime.processor]; // // // console.log(jobTime, anc); // // if (anc) { // jobTime.k = jobTime.t + anc.k; // } else { // jobTime.k = jobTime.t; // } // // jobTimes.forEach(j => { // if (j.jobId === jobTime.jobId) { // j.k = jobTime.k // } // }); // // // if (k === 2) { // // console.log(jobTime, anc); // // } // // return jobTime.k < acc.k ? jobTime : acc; // } // // jobTime.t < acc.t ? jobTime : acc // // jobTime.k < acc.k ? jobTime : acc // , { k: Infinity }, Sk).k; // // if (k === 3) // console.log(kStar); // // let oStar = find((jobTime: JobTimeWithZK) => jobTime.k === kStar, Sk); // // console.log(oStar); // mStar = oStar.processor; // // // processorC[oStar.processor] += oStar.t; // // const p = pluck('processor', map(succ => find(propEq('jobId', succ), jobTimes), oStar.succ)); // // forEach(processor => { // // if (processor !== oStar.processor) { // // return processorC[processor] += oStar.t; // // } // // }, p); // // let morePk = filter((jobTime: JobTimeWithZK) => // jobTime.processor === oStar.processor && (jobTime.k - jobTime.t) < kStar // , Sk); // morePk = updateZK(morePk, jobTimesWithZK); // // Pk = concat(Pk, morePk); // let PkIds = pluck('jobId', Pk); // let rejectedFromSk = filter((jobTime: JobTimeWithZK) => contains(jobTime.jobId, PkIds), Sk); // let rejectedSuccessors = flatten( // map(jobTime => map(jobId => find(propEq('jobId', jobId), jobTimesWithZK), jobTime.succ), rejectedFromSk) // ); // // rejectedSuccessors = updateZK(rejectedSuccessors, jobTimesWithZK); // // // Sk = reject(jobTime => jobTime.jobId === oStar.jobId, Sk); // Sk = reject((jobTime: JobTimeWithZK) => contains(jobTime.jobId, PkIds), Sk); // Sk = concat(Sk, rejectedSuccessors); // // Sk = sort((a, b) => a.jobId > b.jobId, Sk); // // // if (k === 1) { // // console.log(Sk); // // } // // k++; // } // // // const jobTimesExtended = map((jobTime: JobTime) => { // // return ({ // // ...jobTime, // // // // }) // // }, jobTimes); // }; // // export default (jobsOperations: JobOperations[], processorsCount: number) => { // const schedule = createSchedule(jobsOperations, processorsCount); // // return times(i => // map((jobTime: JobOperationsWithC) => ({ // processor: i + 1, // startTime: jobTime.operations[i].c - jobTime.operations[i].t, // endTime: jobTime.operations[i].c, // }), schedule) // , processorsCount); // };