Functional Weave
Code in Python

manufacturing.bom-explode@1.0.0

vectors.json

12,729 bytes · view raw

[
  {"name": "10 bikes: 1.5 m of tube at 10% scrap is 33/2 m, spokes at 5% scrap are 672, bolts used at two levels add up to 80", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "BIKE", 10], "expect": [{"item": "FRAME", "level": 1, "quantity": {"numerator": 10, "denominator": 1}, "wholeUnits": 10, "leaf": false}, {"item": "WHEEL", "level": 1, "quantity": {"numerator": 20, "denominator": 1}, "wholeUnits": 20, "leaf": false}, {"item": "TUBE", "level": 2, "quantity": {"numerator": 33, "denominator": 2}, "wholeUnits": 17, "leaf": true}, {"item": "SPOKE", "level": 2, "quantity": {"numerator": 672, "denominator": 1}, "wholeUnits": 672, "leaf": true}, {"item": "RIM", "level": 2, "quantity": {"numerator": 20, "denominator": 1}, "wholeUnits": 20, "leaf": true}, {"item": "BOLT", "level": 2, "quantity": {"numerator": 80, "denominator": 1}, "wholeUnits": 80, "leaf": true}]},
  {"name": "scrap on a sub-assembly line compounds: 22 wheels need 739.2 spokes, so 740 whole", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 1000}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "BIKE", 10], "expect": [{"item": "FRAME", "level": 1, "quantity": {"numerator": 10, "denominator": 1}, "wholeUnits": 10, "leaf": false}, {"item": "WHEEL", "level": 1, "quantity": {"numerator": 22, "denominator": 1}, "wholeUnits": 22, "leaf": false}, {"item": "TUBE", "level": 2, "quantity": {"numerator": 33, "denominator": 2}, "wholeUnits": 17, "leaf": true}, {"item": "SPOKE", "level": 2, "quantity": {"numerator": 3696, "denominator": 5}, "wholeUnits": 740, "leaf": true}, {"item": "RIM", "level": 2, "quantity": {"numerator": 22, "denominator": 1}, "wholeUnits": 22, "leaf": true}, {"item": "BOLT", "level": 2, "quantity": {"numerator": 84, "denominator": 1}, "wholeUnits": 84, "leaf": true}]},
  {"name": "exploding one sub-assembly on its own", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "WHEEL", 1], "expect": [{"item": "SPOKE", "level": 1, "quantity": {"numerator": 168, "denominator": 5}, "wholeUnits": 34, "leaf": true}, {"item": "RIM", "level": 1, "quantity": {"numerator": 1, "denominator": 1}, "wholeUnits": 1, "leaf": true}, {"item": "BOLT", "level": 1, "quantity": {"numerator": 2, "denominator": 1}, "wholeUnits": 2, "leaf": true}]},
  {"name": "a build quantity of zero needs nothing, but still lists every item", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "FRAME", 0], "expect": [{"item": "TUBE", "level": 1, "quantity": {"numerator": 0, "denominator": 1}, "wholeUnits": 0, "leaf": true}]},
  {"name": "a tenth of a sheet per case, ten coatings per sheet: 3 cases need exactly 3 coatings (floating point gives 3.0000000000000004, so 4)", "args": [[{"parent": "CASE", "component": "SHEET", "quantity": {"numerator": 1, "denominator": 10}, "scrapBasisPoints": 0}, {"parent": "SHEET", "component": "COATING", "quantity": {"numerator": 10, "denominator": 1}, "scrapBasisPoints": 0}], "CASE", 3], "expect": [{"item": "SHEET", "level": 1, "quantity": {"numerator": 3, "denominator": 10}, "wholeUnits": 1, "leaf": false}, {"item": "COATING", "level": 2, "quantity": {"numerator": 3, "denominator": 1}, "wholeUnits": 3, "leaf": true}]},
  {"name": "a part used directly and three levels down takes the deeper low-level code and is listed last", "args": [[{"parent": "TOP", "component": "SCREW", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "TOP", "component": "ARM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "ARM", "component": "JOINT", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "JOINT", "component": "SCREW", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}], "TOP", 5], "expect": [{"item": "ARM", "level": 1, "quantity": {"numerator": 5, "denominator": 1}, "wholeUnits": 5, "leaf": false}, {"item": "JOINT", "level": 2, "quantity": {"numerator": 5, "denominator": 1}, "wholeUnits": 5, "leaf": false}, {"item": "SCREW", "level": 3, "quantity": {"numerator": 15, "denominator": 1}, "wholeUnits": 15, "leaf": true}]},
  {"name": "two lines for the same component are added together", "args": [[{"parent": "TOP", "component": "X", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "TOP", "component": "X", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}], "TOP", 1], "expect": [{"item": "X", "level": 1, "quantity": {"numerator": 3, "denominator": 1}, "wholeUnits": 3, "leaf": true}]},
  {"name": "a loop elsewhere in the lines is not walked", "args": [[{"parent": "TOP", "component": "X", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "P", "component": "Q", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "Q", "component": "P", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}], "TOP", 1], "expect": [{"item": "X", "level": 1, "quantity": {"numerator": 2, "denominator": 1}, "wholeUnits": 2, "leaf": true}]},
  {"name": "a loop through three items is an error naming the loop", "args": [[{"parent": "A", "component": "B", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "B", "component": "C", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "C", "component": "A", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}], "A", 1], "expectError": "bill of materials has a cycle: A -> B -> C -> A"},
  {"name": "an item that contains itself is an error", "args": [[{"parent": "A", "component": "A", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}], "A", 1], "expectError": "bill of materials has a cycle: A -> A"},
  {"name": "a loop below the product is an error", "args": [[{"parent": "TOP", "component": "A", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "A", "component": "B", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "B", "component": "A", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}], "TOP", 1], "expectError": "bill of materials has a cycle: TOP -> A -> B -> A"},
  {"name": "a product with no lines is an error", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "PUMP", 1], "expectError": "\"PUMP\" has no bill of materials"},
  {"name": "a zero quantity is an error", "args": [[{"parent": "TOP", "component": "X", "quantity": {"numerator": 0, "denominator": 1}, "scrapBasisPoints": 0}], "TOP", 1], "expectError": "quantity of \"X\" in \"TOP\" must be greater than zero"},
  {"name": "a negative quantity is an error", "args": [[{"parent": "TOP", "component": "X", "quantity": {"numerator": -1, "denominator": 2}, "scrapBasisPoints": 0}], "TOP", 1], "expectError": "quantity of \"X\" in \"TOP\" must be greater than zero"},
  {"name": "negative scrap is an error", "args": [[{"parent": "TOP", "component": "X", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": -100}], "TOP", 1], "expectError": "scrapBasisPoints of \"X\" in \"TOP\" must be a whole number, not negative"},
  {"name": "a negative build quantity is an error", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "BIKE", -1], "expectError": "buildQuantity must be a whole number, not negative"},
  {"name": "a fractional build quantity is an error", "args": [[{"parent": "BIKE", "component": "FRAME", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "WHEEL", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "BIKE", "component": "BOLT", "quantity": {"numerator": 4, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "SPOKE", "quantity": {"numerator": 32, "denominator": 1}, "scrapBasisPoints": 500}, {"parent": "WHEEL", "component": "RIM", "quantity": {"numerator": 1, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "WHEEL", "component": "BOLT", "quantity": {"numerator": 2, "denominator": 1}, "scrapBasisPoints": 0}, {"parent": "FRAME", "component": "TUBE", "quantity": {"numerator": 3, "denominator": 2}, "scrapBasisPoints": 1000}], "BIKE", 1.5], "expectError": "buildQuantity must be a whole number, not negative"}
]