Functional Weave
Code in Python

inventory.safety-stock@1.0.0

vectors.json

6,454 bytes · view raw

[
  {"name": "95%, daily sd 20 over a 9-day lead time: 1.6449 x 20 x 3 = 98.69, so 99", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expect": 99},
  {"name": "99%, same demand: 2.3263 x 20 x 3 = 139.58, so 140", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9900, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expect": 140},
  {"name": "97.5% is z = 1.96: 1.96 x 10 x 1 = 19.6, so 20", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9750, "demandStdDev": 10, "leadTime": 1, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expect": 20},
  {"name": "50% needs no buffer", "args": [{"method": "service-level", "serviceLevelBasisPoints": 5000, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expect": 0},
  {"name": "steady demand needs no buffer", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 0, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expect": 0},
  {"name": "fractional inputs: 1.6449 x sqrt(2.5 x 12.5^2) = 32.51, so 33", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 12.5, "leadTime": 2.5, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expect": 33},
  {"name": "a varying lead time: 1.6449 x sqrt(4 x 10^2 + 50^2 x 1^2) = 88.58, so 89", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 10, "leadTime": 4, "averageDemand": 50, "leadTimeStdDev": 1, "maxDemand": null, "maxLeadTime": null}], "expect": 89},
  {"name": "90% with a varying lead time: 1.2816 x sqrt(16 x 25^2 + 40^2 x 2^2) = 164.12, so 165", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9000, "demandStdDev": 25, "leadTime": 16, "averageDemand": 40, "leadTimeStdDev": 2, "maxDemand": null, "maxLeadTime": null}], "expect": 165},
  {"name": "a lead-time sd of 0 is a fixed lead time and needs no average demand", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": 0, "maxDemand": null, "maxLeadTime": null}], "expect": 99},
  {"name": "max-minus-average: 120 x 10 - 80 x 7 = 640", "args": [{"method": "max-minus-average", "serviceLevelBasisPoints": null, "demandStdDev": null, "leadTime": 7, "averageDemand": 80, "leadTimeStdDev": null, "maxDemand": 120, "maxLeadTime": 10}], "expect": 640},
  {"name": "max-minus-average, fractional: 2.2 x 25 - 1 x 5 is 50 exactly, though the float is 50.00000000000001", "args": [{"method": "max-minus-average", "serviceLevelBasisPoints": null, "demandStdDev": null, "leadTime": 5, "averageDemand": 1, "leadTimeStdDev": null, "maxDemand": 2.2, "maxLeadTime": 25}], "expect": 50},
  {"name": "max-minus-average rounds up a real fraction: 10.5 x 3 - 10 x 3 = 1.5, so 2", "args": [{"method": "max-minus-average", "serviceLevelBasisPoints": null, "demandStdDev": null, "leadTime": 3, "averageDemand": 10, "leadTimeStdDev": null, "maxDemand": 10.5, "maxLeadTime": 3}], "expect": 2},
  {"name": "max equal to average needs no buffer", "args": [{"method": "max-minus-average", "serviceLevelBasisPoints": null, "demandStdDev": null, "leadTime": 7, "averageDemand": 80, "leadTimeStdDev": null, "maxDemand": 80, "maxLeadTime": 7}], "expect": 0},
  {"name": "a service level not in the table is an error", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9650, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expectError": "no z-score for a service level of 9650 basis points"},
  {"name": "service-level without a service level is an error", "args": [{"method": "service-level", "serviceLevelBasisPoints": null, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expectError": "service-level needs serviceLevelBasisPoints"},
  {"name": "service-level without a demand deviation is an error", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": null, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expectError": "service-level needs demandStdDev"},
  {"name": "a varying lead time without average demand is an error", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": 1, "maxDemand": null, "maxLeadTime": null}], "expectError": "needs averageDemand"},
  {"name": "a negative standard deviation is an error", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": -1, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expectError": "demandStdDev must be a finite number, not negative"},
  {"name": "a negative lead time is an error", "args": [{"method": "service-level", "serviceLevelBasisPoints": 9500, "demandStdDev": 20, "leadTime": -9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expectError": "leadTime must be a finite number, not negative"},
  {"name": "max-minus-average without a maximum is an error", "args": [{"method": "max-minus-average", "serviceLevelBasisPoints": null, "demandStdDev": null, "leadTime": 7, "averageDemand": 80, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": 10}], "expectError": "max-minus-average needs maxDemand"},
  {"name": "a worst case below the average case is an error", "args": [{"method": "max-minus-average", "serviceLevelBasisPoints": null, "demandStdDev": null, "leadTime": 7, "averageDemand": 80, "leadTimeStdDev": null, "maxDemand": 70, "maxLeadTime": 7}], "expectError": "must not be less than averageDemand x leadTime"},
  {"name": "an unknown method is an error", "args": [{"method": "guess", "serviceLevelBasisPoints": 9500, "demandStdDev": 20, "leadTime": 9, "averageDemand": null, "leadTimeStdDev": null, "maxDemand": null, "maxLeadTime": null}], "expectError": "unknown safety stock method"}
]