fe944750 | import { |
b681b265 | map, reduce, sort, range, omit, times |
fe944750 | } from 'rambda'; import type { JobId } from '../../types'; import { updateCTime } from '../johnson'; |
b681b265 | import { fillCorrupted } from '../campbel'; |
fe944750 | type JobOperations = { jobId: JobId, |
8c7841d1 | operations: Array<{ t: number, name: string }> |
fe944750 | }; type JobOperationsWithC = { jobId: JobId, |
8c7841d1 | operations: Array<{ t: number, c: number, name: string }> |
fe944750 | }; export const createSchedule = (jobsOperations: JobOperations[], processorsCount: number): JobOperationsWithC[] => { |
8c7841d1 | jobsOperations = fillCorrupted(jobsOperations, processorsCount); |
b681b265 | |
fe944750 | const jobsOperationsWithKoefs = map(jobsOperation => { const koef = reduce( (acc, i) => acc + Math.abs(processorsCount - 2 * i + 1) * jobsOperation.operations[i-1].t, 0, range(1, processorsCount + 1) ); return { ...jobsOperation, koef }; }, jobsOperations); let sortedJobsOperations = sort( (a: JobOperations, b: JobOperations) => { return b.koef - a.koef; }, jobsOperationsWithKoefs ); sortedJobsOperations = map(omit('koef'), sortedJobsOperations); return updateCTime(sortedJobsOperations, processorsCount); }; 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, |
8c7841d1 | name: jobTime.operations[i].name |
fe944750 | }), schedule) , processorsCount); }; |