Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
estimator.ts 1.75 KiB
import { sumIgnoreNonNumbers } from "./utils";
export interface WorkPackage {
/** Lower bound of effort needed to complete workPackage */
a: number;
/** Upper bound of effort needed to complete workPackage */
b: number;
/** Average expected effort needed to complete workPackage */
c?: number;
}
/**
* Calculate the expected effort for a given workpackage
*/
export function calculateE(workPackage: WorkPackage): number {
const { a, b, c } = workPackage;
if (
typeof a !== "number" ||
a === null ||
typeof b !== "number" ||
b === null
) {
throw new TypeError("@calculateE(): At least a and b must be numbers");
}
return typeof c !== "number" || c === null
? (a + b) / 2
: (a + 4 * c + b) / 6;
}
export function calculateV(workPackage: WorkPackage): number {
const { a, b } = workPackage;
if (typeof a !== "number" || typeof b !== "number") {
throw new TypeError("@calculateV(): a and b must be numbers");
}
return ((b - a) * (b - a)) / 36;
}
export function calculateS(workPackage: WorkPackage): number {
const { a, b } = workPackage;
if (typeof a !== "number" || typeof b !== "number") {
throw new TypeError("@calculateS(): a and b must be numbers");
}
return (b - a) / 6;
}
export function calculateSSum(workPackages: WorkPackage[]): number {
return Math.sqrt(
sumIgnoreNonNumbers(
workPackages
.filter(({ a, b }) => typeof a === "number" && typeof b === "number")
.map((workPackage) => calculateS(workPackage) ** 2)
)
);
}
export function calculateESum(workPackages: WorkPackage[]): number {
return sumIgnoreNonNumbers(
workPackages
.filter(({ a, b }) => typeof a === "number" && typeof b === "number")
.map((workPackage) => calculateE(workPackage))
);
}