From 2bb0740b68fdb62d45adc00204b3990ca42ade77 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Mon, 22 Aug 2016 10:11:14 -0400 Subject: started repo again without all the data files gunking the works --- src/break_edge.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/break_edge.c (limited to 'src/break_edge.c') diff --git a/src/break_edge.c b/src/break_edge.c new file mode 100644 index 0000000..0bd0277 --- /dev/null +++ b/src/break_edge.c @@ -0,0 +1,89 @@ + +#include "fracture.h" + +bool break_edge(finst *instance, unsigned int edge, cholmod_common *c) { + instance->fuses[edge] = true; + instance->num_remaining_edges--; + + unsigned int v1 = instance->network->edges_to_verts_break[2 * edge]; + unsigned int v2 = instance->network->edges_to_verts_break[2 * edge + 1]; + + update_factor(instance->factor, v1, v2, c); + + + unsigned int w1 = instance->network->edges_to_verts[2 * edge]; + unsigned int w2 = instance->network->edges_to_verts[2 * edge + 1]; + unsigned int dw1 = instance->network->dual_edges_to_verts[2 * edge]; + unsigned int dw2 = instance->network->dual_edges_to_verts[2 * edge + 1]; + + if (instance->network->boundary != TORUS_BOUND) { + + unsigned int tw1 = w1 > w2 ? w1 : w2; + unsigned int tw2 = w1 > w2 ? w2 : w1; + + CHOL_INT *lap_p = (CHOL_INT *)instance->adjacency->p; + CHOL_INT *lap_i = (CHOL_INT *)instance->adjacency->i; + double *lap_x = (double *)instance->adjacency->x; + + for (int i = 0; i < lap_p[tw1 + 1] - lap_p[tw1]; i++) { + if (lap_i[lap_p[tw1] + i] == tw2) + lap_x[lap_p[tw1] + i] = 0; + } + for (int i = 0; i < lap_p[tw2 + 1] - lap_p[tw2]; i++) { + if (lap_i[lap_p[tw2] + i] == tw1) + lap_x[lap_p[tw2] + i] = 0; + } + + int old_num_components = instance->num_components; + + instance->num_components = update_components( + instance->adjacency, instance->marks, old_num_components, (int)tw1, + (int)tw2, 0); + } + + if (instance->network->boundary == TORUS_BOUND) { + if (instance->dual_marks[dw1] == instance->dual_marks[dw2]) { + int **cycles = (int **)malloc(2*instance->network->num_edges * sizeof(int *)); + unsigned int num_cycles = find_cycles(instance->network->num_edges, instance->fuses, instance->network->dual_edges_to_verts, instance->network->dual_verts_to_edges_ind, instance->network->dual_verts_to_edges, cycles); + + for (unsigned int i = 0; i < num_cycles; i++) { + int x_num_crossings = 0; + int y_num_crossings = 0; + int ee; unsigned int j = 0; + while ((ee = cycles[2*i][j]) >= 0) { + int side = cycles[2*i+1][j]; + j++; + unsigned int v1, v2; + double v1x, v1y, v2x, v2y; + v1 = instance->network->dual_edges_to_verts[2 * ee + !side]; + v2 = instance->network->dual_edges_to_verts[2 * ee + side]; + v1x = instance->network->dual_vert_coords[2 * v1]; + v1y = instance->network->dual_vert_coords[2 * v1 + 1]; + v2x = instance->network->dual_vert_coords[2 * v2]; + v2y = instance->network->dual_vert_coords[2 * v2 + 1]; + double dx = v1x - v2x; + double dy = v1y - v2y; + if (((v1x > 0.5 && v2x < 0.5) || (v1x < 0.5 && v2x > 0.5)) && fabs(dx) < 0.5) { + x_num_crossings += dx > 0 ? 1 : -1; + } + if (((v1y > 0.5 && v2y < 0.5) || (v1y < 0.5 && v2y > 0.5)) && fabs(dy) < 0.5) { + y_num_crossings += dy > 0 ? 1 : -1; + } + } + if ((abs(y_num_crossings) == 0 && abs(x_num_crossings) > 0) || (abs(y_num_crossings) > 0 && abs(x_num_crossings) > 0 && num_cycles > 1)) { + instance->num_components = 2; + } + free(cycles[2*i]); + free(cycles[2*i+1]); + } + free(cycles); + } + + unsigned int *tmp_marks = get_clusters(instance, c); + free(instance->dual_marks); + instance->dual_marks = tmp_marks; + } + + + return true; +} -- cgit v1.2.3-70-g09d2