Skip to content
Snippets Groups Projects
Select Git revision
  • dcf20cef87faf9e15a3bb148f75a072317efd5c4
  • main default protected
2 results

.gitkeep

Blame
  • 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))
      );
    }