You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.3 KiB
Python
112 lines
3.3 KiB
Python
import json
|
|
|
|
def series_availability(avails):
|
|
result = 1.0
|
|
for a in avails:
|
|
result *= a
|
|
return result
|
|
|
|
def parallel_availability(avails):
|
|
result = 1.0
|
|
for a in avails:
|
|
result *= (1 - a)
|
|
return 1 - result
|
|
|
|
def kofn_availability(avails, k):
|
|
if k <= 1:
|
|
return parallel_availability(avails)
|
|
return sum(avails) / len(avails) # simple approx
|
|
|
|
def compute_node_availability(node_id, schematic, schematics, overrides, visited):
|
|
if node_id in visited:
|
|
return 1.0
|
|
visited.add(node_id)
|
|
|
|
node = schematic["nodes"].get(node_id)
|
|
if not node:
|
|
return 1.0
|
|
|
|
node_name = node.get("name", "").strip().lower()
|
|
if node_name in overrides:
|
|
return overrides[node_name]
|
|
|
|
ntype = node["type"].lower()
|
|
|
|
if ntype == "regularnode":
|
|
return node.get("availability", 1.0)
|
|
|
|
elif ntype == "series":
|
|
return series_availability([
|
|
compute_node_availability(child, schematic, schematics, overrides, visited.copy())
|
|
for child in node.get("children", [])
|
|
])
|
|
|
|
elif ntype == "parallel":
|
|
return parallel_availability([
|
|
compute_node_availability(child, schematic, schematics, overrides, visited.copy())
|
|
for child in node.get("children", [])
|
|
])
|
|
|
|
elif ntype == "kofn":
|
|
k = node.get("min_required", 1)
|
|
return kofn_availability([
|
|
compute_node_availability(child, schematic, schematics, overrides, visited.copy())
|
|
for child in node.get("children", [])
|
|
], k)
|
|
|
|
elif ntype == "subschematic":
|
|
tschematic_id = node.get("tschematic_id")
|
|
if tschematic_id and str(tschematic_id) in schematics:
|
|
sub_schematic = schematics[str(tschematic_id)]
|
|
root = sub_schematic.get("root")
|
|
if root:
|
|
return compute_node_availability(root, sub_schematic, schematics, overrides, set())
|
|
return node.get("availability", 1.0)
|
|
|
|
return node.get("availability", 1.0)
|
|
|
|
|
|
def compute_schematic_availability(schematic, schematics, overrides):
|
|
root = schematic.get("root")
|
|
if not root:
|
|
return 1.0
|
|
return compute_node_availability(root, schematic, schematics, overrides, set())
|
|
|
|
|
|
def evaluate_project(json_file, overrides=None):
|
|
with open(json_file, "r") as f:
|
|
data = json.load(f)
|
|
|
|
schematics = data["schematics"]
|
|
overrides = overrides or {}
|
|
|
|
results = {}
|
|
top_availability = None
|
|
|
|
for sid, schematic in schematics.items():
|
|
name = schematic["schematic_name"].strip()
|
|
avail = compute_schematic_availability(schematic, schematics, overrides)
|
|
results[name] = avail
|
|
if name == "- TJB - Unit 3 -":
|
|
top_availability = avail
|
|
|
|
return results, top_availability
|
|
|
|
|
|
if __name__ == "__main__":
|
|
overrides = {
|
|
"WTP": 0.0, # Example override
|
|
}
|
|
|
|
results, top_avail = evaluate_project("project_70_rbd.json", overrides=overrides)
|
|
|
|
print("\n--- Schematic Availabilities ---")
|
|
for sch_name, avail in results.items():
|
|
print(f"{sch_name:25s}: {avail:.6f}")
|
|
|
|
print("\n=== TOTAL SYSTEM AVAILABILITY ===")
|
|
if top_avail is not None:
|
|
print(f"Top schematic (- TJB - Unit 3 -): {top_avail:.6f}")
|
|
else:
|
|
print("Top schematic not found in JSON!")
|