summaryrefslogtreecommitdiff
path: root/src/break_edge.c
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jkentdobias@g.hmc.edu>2016-08-22 10:11:14 -0400
committerJaron Kent-Dobias <jkentdobias@g.hmc.edu>2016-08-22 10:11:14 -0400
commit2bb0740b68fdb62d45adc00204b3990ca42ade77 (patch)
treea52975e3460da781467ddb70aaa8d76840d01bb4 /src/break_edge.c
downloadfuse_networks-2bb0740b68fdb62d45adc00204b3990ca42ade77.tar.gz
fuse_networks-2bb0740b68fdb62d45adc00204b3990ca42ade77.tar.bz2
fuse_networks-2bb0740b68fdb62d45adc00204b3990ca42ade77.zip
started repo again without all the data files gunking the works
Diffstat (limited to 'src/break_edge.c')
-rw-r--r--src/break_edge.c89
1 files changed, 89 insertions, 0 deletions
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;
+}