src/algorithms/giffler/index.js
fe944750
 // 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);
 // };