Skip to content

Instantly share code, notes, and snippets.

@alexnask
Last active February 20, 2020 14:44
Show Gist options
  • Select an option

  • Save alexnask/b5fb6ee95bd44e4831addaf826ad7250 to your computer and use it in GitHub Desktop.

Select an option

Save alexnask/b5fb6ee95bd44e4831addaf826ad7250 to your computer and use it in GitHub Desktop.
import csv
import pydot
def predecessors(pred, targets):
d = {}
graph = pydot.Dot(graph_type='digraph', graph_name='Predecessors')
for target_activity in targets:
target_list = []
d[target_activity] = target_list
predecessors_impl(graph, pred, None, target_activity, target_list)
return d, graph
def predecessors_impl(graph, pred, parent_activity, activity, lst):
# If we have already gotten all predecessors of this activity, we are done.
if activity in lst:
return
# Append the activity to the target list
lst.append(activity)
if parent_activity is not None:
graph.add_edge(pydot.Edge(parent_activity, activity))
# If the activity has predecessors, visit them recursively
if activity in pred:
for p in pred[activity]:
predecessors_impl(graph, pred, activity, p, lst)
def main():
with open('Predecessors.csv', newline='') as pred_csv:
pred = {}
pred_reader = csv.reader(pred_csv)
# Skip header row
next(pred_reader)
for row in pred_reader:
assert len(row) == 2
# New activities are introduced with a dash predecessor, just skip
# it.
if row[0] in pred and row[1] != '-':
pred[row[0]].append(row[1])
elif row[1] != '-':
pred[row[0]] = [row[1]]
with open('Target activites.csv', newline='') as target_csv:
targets = []
target_reader = csv.reader(target_csv)
# Skip header row
next(target_reader)
for row in target_reader:
assert len(row) == 2
if row[0] not in targets:
targets.append(row[0])
# targets = ['CHSC660PAVA010', 'ISA14.1-FORECAST20']
result_dict, graph = predecessors(pred, targets)
print("Got result:")
print(result_dict)
print("Writing to output.csv and output.dot")
with open('output.csv', 'w', newline='') as output_csv:
writer = csv.writer(output_csv)
for target, target_preds in result_dict.items():
writer.writerow([target] + target_preds)
graph.write_raw('output.dot')
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment