| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.autoPtgSizes = autoPtgSizes;
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- function autoPtgSizes(ptgSizes, minPtgSizes, maxPtgSizes) {
- // Static current data
- let currentTotalPtg = 0;
- const undefinedIndexes = [];
- ptgSizes.forEach((size, index) => {
- if (size === undefined) {
- undefinedIndexes.push(index);
- } else {
- currentTotalPtg += size;
- }
- });
- const restPtg = 1 - currentTotalPtg;
- const undefinedCount = undefinedIndexes.length;
- // Fill if exceed
- if (restPtg < 0) {
- const scale = 1 / currentTotalPtg;
- return ptgSizes.map(size => size === undefined ? 0 : size * scale);
- }
- // Check if limit exists
- let sumMin = 0;
- let sumMax = 0;
- let limitMin = 0;
- let limitMax = 1;
- for (const index of undefinedIndexes) {
- const min = minPtgSizes[index] || 0;
- const max = maxPtgSizes[index] || 1;
- sumMin += min;
- sumMax += max;
- limitMin = Math.max(limitMin, min);
- limitMax = Math.min(limitMax, max);
- }
- // Impossible case, just average fill
- if (sumMin > 1 && sumMax < 1) {
- const avg = 1 / undefinedCount;
- return ptgSizes.map(size => size === undefined ? avg : size);
- }
- // Quickly fill if can
- const restAvg = restPtg / undefinedCount;
- if (limitMin <= restAvg && restAvg <= limitMax) {
- return ptgSizes.map(size => size === undefined ? restAvg : size);
- }
- // Greedy algorithm
- const result = (0, _toConsumableArray2.default)(ptgSizes);
- let remain = restPtg - sumMin;
- for (let i = 0; i < undefinedCount; i += 1) {
- const index = undefinedIndexes[i];
- const min = minPtgSizes[index] || 0;
- const max = maxPtgSizes[index] || 1;
- result[index] = min;
- const canAdd = max - min;
- const add = Math.min(canAdd, remain);
- result[index] += add;
- remain -= add;
- }
- return result;
- }
|