diff --git a/gt_matlab_trajs.py b/gt_matlab_trajs.py index 5d165c50c40c4fda12f8d4f405ad4134f16a36f8..fc747c6054ae6a27d4d0f678fd5fb697b378774a 100644 --- a/gt_matlab_trajs.py +++ b/gt_matlab_trajs.py @@ -1,212 +1,212 @@ -#!/usr/bin/env python3 - -# A script that loads a segmented cf graph in the gt format, iterates on all -# of the edges and cost functions and generates the trajectories as done in -# MATLAB. Segments (nodes) have a new vertex property called "traj" that holds -# the trajectory ID that that segment belongs to. The output is either an -# expanded JSON file and/or an edgelist file with all of the trajectories. -# Inputs: - # orientation - # name and the location of the gt segmented cf graph -# Output: - # trajectories.json that contains all of the trajectories - -import graph_tool as gt -from os import path -import json -import csv -import graph_tool.util as ut - -orientation = 'anti' - -g = gt.Graph() -g.load('segmented_anti_cf.gt') - -#g = gt.Graph(directed = True) -# vlist = g.add_vertex(25) - -# e1 = g.add_edge(g.vertex(0), g.vertex(1)) -# e2 = g.add_edge(g.vertex(1), g.vertex(2)) -# e3 = g.add_edge(g.vertex(1), g.vertex(3)) -# e4 = g.add_edge(g.vertex(2), g.vertex(4)) -# e5 = g.add_edge(g.vertex(3), g.vertex(5)) -# e6 = g.add_edge(g.vertex(4), g.vertex(5)) -# e7 = g.add_edge(g.vertex(5), g.vertex(6)) -# e8 = g.add_edge(g.vertex(6), g.vertex(7)) -# e9 = g.add_edge(g.vertex(6), g.vertex(8)) -# e10 = g.add_edge(g.vertex(1), g.vertex(10)) -# e11 = g.add_edge(g.vertex(10), g.vertex(11)) -# e12 = g.add_edge(g.vertex(9), g.vertex(11)) -# e13 = g.add_edge(g.vertex(11), g.vertex(12)) -# e14 = g.add_edge(g.vertex(12), g.vertex(13)) -# e15 = g.add_edge(g.vertex(12), g.vertex(14)) -# e16 = g.add_edge(g.vertex(13), g.vertex(15)) -# e17 = g.add_edge(g.vertex(14), g.vertex(15)) -# e18 = g.add_edge(g.vertex(15), g.vertex(16)) -# e19 = g.add_edge(g.vertex(2), g.vertex(17)) -# e20 = g.add_edge(g.vertex(17), g.vertex(20)) -# e21 = g.add_edge(g.vertex(18), g.vertex(20)) -# e22 = g.add_edge(g.vertex(19), g.vertex(20)) -# e23 = g.add_edge(g.vertex(20), g.vertex(21)) -# e24 = g.add_edge(g.vertex(21), g.vertex(22)) -# e25 = g.add_edge(g.vertex(21), g.vertex(23)) -# e26 = g.add_edge(g.vertex(23), g.vertex(24)) - - -# nl_cf = g.new_ep('float') -# g.ep['nl_cost_function'] = nl_cf - -traj_mark = g.new_vp('int') -g.vp['traj'] = traj_mark - -# g.ep.nl_cost_function[e1] = 6 -# g.ep.nl_cost_function[e2] = 2 -# g.ep.nl_cost_function[e3] = 7 -# g.ep.nl_cost_function[e4] = 8 -# g.ep.nl_cost_function[e5] = 4 -# g.ep.nl_cost_function[e6] = 2 -# g.ep.nl_cost_function[e7] = 10 -# g.ep.nl_cost_function[e8] = 11 -# g.ep.nl_cost_function[e9] = 2 -# g.ep.nl_cost_function[e10] = 3 -# g.ep.nl_cost_function[e11] = 2 -# g.ep.nl_cost_function[e12] = 6 -# g.ep.nl_cost_function[e13] = 4 -# g.ep.nl_cost_function[e14] = 10 -# g.ep.nl_cost_function[e15] = 6 -# g.ep.nl_cost_function[e16] = 2 -# g.ep.nl_cost_function[e17] = 4 -# g.ep.nl_cost_function[e18] = 5 -# g.ep.nl_cost_function[e19] = 6 -# g.ep.nl_cost_function[e20] = 3 -# g.ep.nl_cost_function[e21] = 2 -# g.ep.nl_cost_function[e22] = 1 -# g.ep.nl_cost_function[e23] = 7 -# g.ep.nl_cost_function[e24] = 6 -# g.ep.nl_cost_function[e25] = 8 -# g.ep.nl_cost_function[e26] = 7 - -# name = g.new_vp('string') -# g.vp['name'] = name - -# for i in range(0, 25): -# g.vp.name[g.vertex(i)] = i - -# assign the new vertex property -for node in g.vertices(): - g.vp.traj[node] = g.vp.name[node] - - -################## -# MAIN ALGORITHM # -################## - -# iterating on edges: - -print('Algorithm starting...') - -for edge in g.edges(): - current_cf = g.ep.nl_cost_function[edge] - src = edge.source() - trg = edge.target() - - # source is a split - if src.out_degree() > 1: - if current_cf <= min({g.ep.nl_cost_function[e] for e in src.out_edges()}): - # elif target is a merge - if trg.in_degree() > 1: - if current_cf <= min({g.ep.nl_cost_function[e] for e in trg.out_edges()}): - # add trg to src trajectory - g.vp.traj[trg] = g.vp.traj[src] - # else, target is a split or end or continuation - else: - g.vp.traj[trg] = g.vp.traj[src] - # source is a continuation or root with one out - elif (src.in_degree() == 1 and src.out_degree() == 1) or (src.in_degree() == 0 and src.out_degree() == 1) or (src.in_degree() > 1): - if trg.in_degree() > 1: - # if the current cf is the smallest - if current_cf <= min({g.ep.nl_cost_function[e] for e in trg.in_edges()}): - g.vp.traj[trg] = g.vp.traj[src] - else: - g.vp.traj[trg] = g.vp.traj[src] - -print('Algorithm done, saving...') - -# make a dictionary of trajectories: - -trajectories = {} - -for node in g.vertices(): - if g.vp.traj[node] not in trajectories: - trajectories[g.vp.traj[node]] = [] - trajectories[g.vp.traj[node]].append(g.vp.name[node]) - else: - trajectories[g.vp.traj[node]].append(g.vp.name[node]) - -# setup a new trajectory that holds the expanded segments -expanded_trajectories = {} - -for trajectory in trajectories.values(): - # exp traj of current traj key = [] - key = trajectory[0] - for val in trajectory: - node = ut.find_vertex(g, g.vp.name, val) - if len(node) != 1: - print('Something is wrong.') - node = node[0] - seg = g.vp.segment[node] - for s in seg: - if key not in expanded_trajectories: - expanded_trajectories[key] = [] - expanded_trajectories[key].append(s) - else: - expanded_trajectories[key].append(s) - -# write out the json file -with open("trajectories.json", "w") as outfile: - json.dump(expanded_trajectories, outfile, indent = 4) - -print(f'Done saving json: {len(trajectories)} trajectories.') - - -# Write to an edgelist file if need be to plot the trajectories - -# with open('edgelist_60k_trajectories.csv', 'w', newline='') as csvfile: - -# spamwriter = csv.writer(csvfile, delimiter=' ', escapechar=' ', quoting=csv.QUOTE_NONE) - -# for trajectory in trajectories.values(): -# for val in trajectory: -# node = ut.find_vertex(g, g.vp.name, val) -# if len(node) != 1: -# print('Something is wrong...') - -# node = node[0] - -# seg = g.vp.segment[node] -# for i in range(0, len(seg) - 1): -# spamwriter.writerow([seg[i], seg[i+1]]) - -# # we wrote the nodes from the segments, now we need to connect the segments -# # they are sequential - -# for i in range(0, len(trajectory) - 1): -# src_val = trajectory[i] -# trg_val = trajectory[i+1] - -# src = ut.find_vertex(g, g.vp.name, src_val) -# trg = ut.find_vertex(g, g.vp.name, trg_val) - -# if len(src) != 1 or len(trg) != 1: -# print('Something is wrong in second loop...') - -# src = src[0] -# trg = trg[0] - -# seg_1 = g.vp.segment[src] -# seg_2 = g.vp.segment[trg] - -# first = seg_1[-1] -# second = seg_2[0] - -# spamwriter.writerow([first, second]) \ No newline at end of file +#!/usr/bin/env python3 + +# A script that loads a segmented cf graph in the gt format, iterates on all +# of the edges and cost functions and generates the trajectories as done in +# MATLAB. Segments (nodes) have a new vertex property called "traj" that holds +# the trajectory ID that that segment belongs to. The output is either an +# expanded JSON file and/or an edgelist file with all of the trajectories. +# Inputs: + # orientation + # name and the location of the gt segmented cf graph +# Output: + # trajectories.json that contains all of the trajectories + +import graph_tool as gt +from os import path +import json +import csv +import graph_tool.util as ut + +orientation = 'anti' + +g = gt.Graph() +g.load('segmented_anti_cf.gt') + +#g = gt.Graph(directed = True) +# vlist = g.add_vertex(25) + +# e1 = g.add_edge(g.vertex(0), g.vertex(1)) +# e2 = g.add_edge(g.vertex(1), g.vertex(2)) +# e3 = g.add_edge(g.vertex(1), g.vertex(3)) +# e4 = g.add_edge(g.vertex(2), g.vertex(4)) +# e5 = g.add_edge(g.vertex(3), g.vertex(5)) +# e6 = g.add_edge(g.vertex(4), g.vertex(5)) +# e7 = g.add_edge(g.vertex(5), g.vertex(6)) +# e8 = g.add_edge(g.vertex(6), g.vertex(7)) +# e9 = g.add_edge(g.vertex(6), g.vertex(8)) +# e10 = g.add_edge(g.vertex(1), g.vertex(10)) +# e11 = g.add_edge(g.vertex(10), g.vertex(11)) +# e12 = g.add_edge(g.vertex(9), g.vertex(11)) +# e13 = g.add_edge(g.vertex(11), g.vertex(12)) +# e14 = g.add_edge(g.vertex(12), g.vertex(13)) +# e15 = g.add_edge(g.vertex(12), g.vertex(14)) +# e16 = g.add_edge(g.vertex(13), g.vertex(15)) +# e17 = g.add_edge(g.vertex(14), g.vertex(15)) +# e18 = g.add_edge(g.vertex(15), g.vertex(16)) +# e19 = g.add_edge(g.vertex(2), g.vertex(17)) +# e20 = g.add_edge(g.vertex(17), g.vertex(20)) +# e21 = g.add_edge(g.vertex(18), g.vertex(20)) +# e22 = g.add_edge(g.vertex(19), g.vertex(20)) +# e23 = g.add_edge(g.vertex(20), g.vertex(21)) +# e24 = g.add_edge(g.vertex(21), g.vertex(22)) +# e25 = g.add_edge(g.vertex(21), g.vertex(23)) +# e26 = g.add_edge(g.vertex(23), g.vertex(24)) + + +# nl_cf = g.new_ep('float') +# g.ep['nl_cost_function'] = nl_cf + +traj_mark = g.new_vp('int') +g.vp['traj'] = traj_mark + +# g.ep.nl_cost_function[e1] = 6 +# g.ep.nl_cost_function[e2] = 2 +# g.ep.nl_cost_function[e3] = 7 +# g.ep.nl_cost_function[e4] = 8 +# g.ep.nl_cost_function[e5] = 4 +# g.ep.nl_cost_function[e6] = 2 +# g.ep.nl_cost_function[e7] = 10 +# g.ep.nl_cost_function[e8] = 11 +# g.ep.nl_cost_function[e9] = 2 +# g.ep.nl_cost_function[e10] = 3 +# g.ep.nl_cost_function[e11] = 2 +# g.ep.nl_cost_function[e12] = 6 +# g.ep.nl_cost_function[e13] = 4 +# g.ep.nl_cost_function[e14] = 10 +# g.ep.nl_cost_function[e15] = 6 +# g.ep.nl_cost_function[e16] = 2 +# g.ep.nl_cost_function[e17] = 4 +# g.ep.nl_cost_function[e18] = 5 +# g.ep.nl_cost_function[e19] = 6 +# g.ep.nl_cost_function[e20] = 3 +# g.ep.nl_cost_function[e21] = 2 +# g.ep.nl_cost_function[e22] = 1 +# g.ep.nl_cost_function[e23] = 7 +# g.ep.nl_cost_function[e24] = 6 +# g.ep.nl_cost_function[e25] = 8 +# g.ep.nl_cost_function[e26] = 7 + +# name = g.new_vp('string') +# g.vp['name'] = name + +# for i in range(0, 25): +# g.vp.name[g.vertex(i)] = i + +# assign the new vertex property +for node in g.vertices(): + g.vp.traj[node] = g.vp.name[node] + + +################## +# MAIN ALGORITHM # +################## + +# iterating on edges: + +print('Algorithm starting...') + +for edge in g.edges(): + current_cf = g.ep.nl_cost_function[edge] + src = edge.source() + trg = edge.target() + + # source is a split + if src.out_degree() > 1: + if current_cf <= min({g.ep.nl_cost_function[e] for e in src.out_edges()}): + # elif target is a merge + if trg.in_degree() > 1: + if current_cf <= min({g.ep.nl_cost_function[e] for e in trg.out_edges()}): + # add trg to src trajectory + g.vp.traj[trg] = g.vp.traj[src] + # else, target is a split or end or continuation + else: + g.vp.traj[trg] = g.vp.traj[src] + # source is a continuation or root with one out + elif (src.in_degree() == 1 and src.out_degree() == 1) or (src.in_degree() == 0 and src.out_degree() == 1) or (src.in_degree() > 1): + if trg.in_degree() > 1: + # if the current cf is the smallest + if current_cf <= min({g.ep.nl_cost_function[e] for e in trg.in_edges()}): + g.vp.traj[trg] = g.vp.traj[src] + else: + g.vp.traj[trg] = g.vp.traj[src] + +print('Algorithm done, saving...') + +# make a dictionary of trajectories: + +trajectories = {} + +for node in g.vertices(): + if g.vp.traj[node] not in trajectories: + trajectories[g.vp.traj[node]] = [] + trajectories[g.vp.traj[node]].append(g.vp.name[node]) + else: + trajectories[g.vp.traj[node]].append(g.vp.name[node]) + +# setup a new trajectory that holds the expanded segments +expanded_trajectories = {} + +for trajectory in trajectories.values(): + # exp traj of current traj key = [] + key = trajectory[0] + for val in trajectory: + node = ut.find_vertex(g, g.vp.name, val) + if len(node) != 1: + print('Something is wrong.') + node = node[0] + seg = g.vp.segment[node] + for s in seg: + if key not in expanded_trajectories: + expanded_trajectories[key] = [] + expanded_trajectories[key].append(s) + else: + expanded_trajectories[key].append(s) + +# write out the json file +with open("trajectories.json", "w") as outfile: + json.dump(expanded_trajectories, outfile, indent = 4) + +print(f'Done saving json: {len(trajectories)} trajectories.') + + +# Write to an edgelist file if need be to plot the trajectories + +# with open('edgelist_60k_trajectories.csv', 'w', newline='') as csvfile: + +# spamwriter = csv.writer(csvfile, delimiter=' ', escapechar=' ', quoting=csv.QUOTE_NONE) + +# for trajectory in trajectories.values(): +# for val in trajectory: +# node = ut.find_vertex(g, g.vp.name, val) +# if len(node) != 1: +# print('Something is wrong...') + +# node = node[0] + +# seg = g.vp.segment[node] +# for i in range(0, len(seg) - 1): +# spamwriter.writerow([seg[i], seg[i+1]]) + +# # we wrote the nodes from the segments, now we need to connect the segments +# # they are sequential + +# for i in range(0, len(trajectory) - 1): +# src_val = trajectory[i] +# trg_val = trajectory[i+1] + +# src = ut.find_vertex(g, g.vp.name, src_val) +# trg = ut.find_vertex(g, g.vp.name, trg_val) + +# if len(src) != 1 or len(trg) != 1: +# print('Something is wrong in second loop...') + +# src = src[0] +# trg = trg[0] + +# seg_1 = g.vp.segment[src] +# seg_2 = g.vp.segment[trg] + +# first = seg_1[-1] +# second = seg_2[0] + +# spamwriter.writerow([first, second])