From 738166b798620e8e2ffb0ad323a7ebed77fe51c6 Mon Sep 17 00:00:00 2001 From: Lionel GUEZ <guez@lmd.ens.fr> Date: Wed, 20 Apr 2022 13:25:34 +0200 Subject: [PATCH] Polish --- cost_function.py | 103 +++++++++++++++++++++-------------------------- segments.py | 4 +- 2 files changed, 47 insertions(+), 60 deletions(-) diff --git a/cost_function.py b/cost_function.py index 8c27ce7e..d92408f5 100755 --- a/cost_function.py +++ b/cost_function.py @@ -1,8 +1,7 @@ #!/usr/bin/env python3 -"""A script that takes a segmented graph in the gt format and performs -the non-local cost function calculation where each edge will have a -cost function assigned to it. +"""A script that takes the graph of segments without cost functions +and computes the non-local cost functions attributed to edges. Input: @@ -33,21 +32,21 @@ import bisect def calculate_radii_and_rossby(start, end, inc, segment, e_overestim, handlers, array_d_init): - + radii = 0 #[m] rossby = 0 #[1/s] - + days_modifier = 0 - + for i in range(start, end, inc): current_eddy = report_graph.node_to_date_eddy(segment[i], e_overestim) i_SHPC = get_SHPC(array_d_init, current_eddy['date_index']) - + # calculate the location in the shapefile location = util_eddies.comp_ishape(handlers[i_SHPC], current_eddy['date_index'], current_eddy['eddy_index']) - + # now that we have the location in the shapefiles, we need to # get the radius and the rossby number shapeRec = handlers[i_SHPC]["readers"]["extremum"].shapeRecord(location) @@ -55,23 +54,23 @@ def calculate_radii_and_rossby(start, end, inc, segment, e_overestim, handlers, lat_in_deg = shapeRec.shape.points[0][1] #[deg] f = 2*2*math.pi/(24*3600)*math.sin(math.radians(lat_in_deg)) # [1/s] - + V_max = shapeRec.record[4] #[m/s] R_Vmax = handlers[i_SHPC]["readers"]["max_speed_contour"]\ .record(location)['r_eq_area'] * 1000 #[m] - + if (V_max < 100): # calculate Ro and Delta_Ro Ro = V_max / (f * R_Vmax) #[] else: Ro = 0 days_modifier += 1 - + ####### RADII ####### radii += R_Vmax # [m] ####### ROSSBY ###### rossby += Ro # [] - + return {"radii": radii, "rossby": rossby, "days_modifier": days_modifier} def get_SHPC(array_d_ini, date_index): @@ -97,13 +96,13 @@ delta_cent_std = 8.0388 delta_ro_mean = -0.0025965 # [] delta_ro_std = 5.2168 -delta_r_mean = -0.0094709 * 1000 #[m] +delta_r_mean = -0.0094709 * 1000 #[m] delta_r_std = 8.6953 * 1000 # Load the graph_tool file: t0 = time.perf_counter() timings = open("timings.txt", "w") -print('Loading gt file...') +print('Loading graph...') g = graph_tool.Graph() try: @@ -112,12 +111,12 @@ except FileNotFoundError: g.load('segments.graphml') t1 = time.perf_counter() +print('Loading done...') print("Input graph:") print("Number of vertices:", g.num_vertices()) print("Number of edges:", g.num_edges()) print("Internal properties:") g.list_properties() -print('Loading done...') timings.write(f"loading: {t1 - t0} s\n") timings.close() @@ -140,19 +139,17 @@ array_d_init = [handler["d_init"] for handler in handlers] # change if there is a change over the number of days to average num_of_days_to_avg = 7 -# iterate on the vertices +print("Iterating on vertices...") + for n in g.vertices(): - # Get the segment and the number of days segment = g.vp.segment[n] + num_of_days = len(segment) + + # Calculate the indexes and dates: - # calculate the indexes and dates first = report_graph.node_to_date_eddy(segment[0], e_overestim) first_SHPC = get_SHPC(array_d_init, first['date_index']) - num_of_days = len(segment) - - # start processing - last = report_graph.node_to_date_eddy(segment[-1], e_overestim) last_SHPC = get_SHPC(array_d_init, last['date_index']) @@ -164,20 +161,19 @@ for n in g.vertices(): last['date_index'], last['eddy_index']) - # grab the centers - + # grab the centers: first_pos = handlers[first_SHPC]["readers"]["extremum"]\ .shape(first_loc).points[0] last_pos = handlers[last_SHPC]["readers"]["extremum"]\ .shape(last_loc).points[0] - ##### STORE POSITIONS IN THE VPS ###### + # Store positions in the vertex properties: g.vp.pos_first[n] = first_pos # [deg, deg] g.vp.pos_last[n] = last_pos # [deg, deg] - # if the segments are longer than the # of days over which to avg - if (num_of_days > num_of_days_to_avg): + # The segment is longer than the number of days over which to average + first_radii = 0 # [m] last_radii = 0 # [m] @@ -200,22 +196,17 @@ for n in g.vertices(): # Average and assign the rossbies: first_rossby = first_res['rossby'] / (num_of_days_to_avg - modifier) g.vp.first_av_ros[n] = first_rossby - else: - # there is division by zero, average rossby is undefinied - pass # Last 7 days calculation - last_res = calculate_radii_and_rossby(len(segment) - 1, - len(segment) - (num_of_days_to_avg + 1), - -1, - segment, e_overestim, - handlers, array_d_init) + last_res = calculate_radii_and_rossby(len(segment) - 1, len(segment) - + (num_of_days_to_avg + 1), -1, + segment, e_overestim, handlers, + array_d_init) # Average and assign the last radii last_radii = last_res['radii'] / num_of_days_to_avg g.vp.last_av_rad[n] = last_radii - # grab the days modifier modifier = last_res['days_modifier'] @@ -223,13 +214,10 @@ for n in g.vertices(): # Average and assign the rossbies: last_rossby = last_res['rossby'] / (num_of_days_to_avg - modifier) g.vp.last_av_ros[n] = last_rossby - else: - # there is division by zero, average rossby is undefinied - pass - # else, the number of eddies in a segment is lower than the # of - # days over which to average, the values will be the same except - # for the positions else: + # The number of eddies in a segment is lower than the number + # of days over which to average. The values will be the same + # except for the positions. res = calculate_radii_and_rossby(0, num_of_days, 1, segment, e_overestim, handlers, array_d_init) @@ -241,19 +229,13 @@ for n in g.vertices(): rossby = res['rossby'] / (num_of_days - modifier) g.vp.first_av_ros[n] = rossby g.vp.last_av_ros[n] = rossby - else: - # there is division by zero, average rossby is undefinied - pass # Average and assign the radii - radii = res['radii'] / num_of_days g.vp.first_av_rad[n] = radii g.vp.last_av_rad[n] = radii -############################### -# Calculate the cost function # -############################### +print("Iterating on edges...") for edge in g.edges(): source_node = edge.source() @@ -262,25 +244,28 @@ for edge in g.edges(): cf = -10000 lat_for_conv = (g.vp.pos_last[source_node][1] + - g.vp.pos_first[target_node][1]) / 2 # latitude needed for conversion of degrees to kilometers + g.vp.pos_first[target_node][1]) / 2 + # (latitude needed for conversion of degrees to kilometers) lat_for_conv = math.radians(lat_for_conv) # need to convert to radians - # because of the wrapping issue (360° wrapping incorrectly to 0°), we check for that here - lon_diff = abs(g.vp.pos_last[source_node][0] - g.vp.pos_first[target_node][0]) + # because of the wrapping issue (360° wrapping incorrectly to 0°), + # we check for that here + lon_diff = abs(g.vp.pos_last[source_node][0] \ + - g.vp.pos_first[target_node][0]) if (lon_diff > 300): lon_diff = 360 - lon_diff - # calculate Delta_cent: numbers used for conversion obtained from: - # https://stackoverflow.com/questions/1253499/simple-calculations-for-working-with-lat-lon-and-km-distance - Delta_Cent = math.sqrt(( lon_diff * 111.32 * math.cos(lat_for_conv) )**2 + - ( (g.vp.pos_last[source_node][1] - g.vp.pos_first[target_node][1]) * 110.574 )**2) + Delta_Cent = math.sqrt((lon_diff * 111.32 * math.cos(lat_for_conv))**2 + + ((g.vp.pos_last[source_node][1] + - g.vp.pos_first[target_node][1]) * 110.574)**2) # calculate the first term first_term = ((Delta_Cent - delta_cent_mean)/delta_cent_std) ** 2 # Rossbies: if (g.vp.first_av_ros[target_node] and g.vp.last_av_ros[source_node]): - Delta_Ro = g.vp.last_av_ros[source_node] - g.vp.first_av_ros[target_node] + Delta_Ro = g.vp.last_av_ros[source_node] \ + - g.vp.first_av_ros[target_node] else: print("At least one of the rossbies is invalid.") #Delta_Ro = delta_ro_mean @@ -291,7 +276,8 @@ for edge in g.edges(): # R_Vmax 1 and 2 already exist, just get the delta - Delta_R_Vmax = g.vp.last_av_rad[source_node] - g.vp.first_av_rad[target_node] + Delta_R_Vmax = g.vp.last_av_rad[source_node] \ + - g.vp.first_av_rad[target_node] # Calculate the third term third_term = ((Delta_R_Vmax - delta_r_mean)/delta_r_std) ** 2 @@ -306,5 +292,6 @@ for edge in g.edges(): g.ep.nl_cost_function[edge] = cf +print("Saving...") g.save('segments_cost_functions.gt') print('All done') diff --git a/segments.py b/segments.py index 89a696d6..67c6ed1e 100755 --- a/segments.py +++ b/segments.py @@ -72,8 +72,8 @@ for v in g.vertices(): t1 = time.perf_counter() print(f'Done collapsing in {t1 - t0:.0f} s') t0 = t1 -print('Empty nodes:', len(verts_to_del)) -print('Deleting empty nodes...') +print('Number of circumvented nodes:', len(verts_to_del)) +print('Deleting circumvented nodes...') g.remove_vertex(verts_to_del, fast=True) t1 = time.perf_counter() print(f"Done deleting in {t1 - t0:.0f} s") -- GitLab