diff options
Diffstat (limited to 'src/break_edge.c')
-rw-r--r-- | src/break_edge.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/break_edge.c b/src/break_edge.c index 01570d8..538b88d 100644 --- a/src/break_edge.c +++ b/src/break_edge.c @@ -1,13 +1,21 @@ #include "fracture.h" -bool break_edge(net_t *instance, uint_t edge, cholmod_common *c) { +bool break_edge(net_t *instance, uint_t edge, cholmod_common *c, bool refactor) { instance->fuses[edge] = true; if (instance->factor != NULL) { - uint_t w1 = instance->graph->ev_break[2 * edge]; - uint_t w2 = instance->graph->ev_break[2 * edge + 1]; - factor_update(instance->factor, w1, w2, c); + if (refactor) { + cholmod_sparse *laplacian = gen_laplacian(instance, c, true); + CHOL_F(free_factor)(&instance->factor, c); + instance->factor = CHOL_F(analyze)(laplacian, c); + CHOL_F(factorize)(laplacian, instance->factor, c); + CHOL_F(free_sparse)(&laplacian, c); + } else { + uint_t w1 = instance->graph->ev_break[2 * edge]; + uint_t w2 = instance->graph->ev_break[2 * edge + 1]; + factor_update(instance->factor, w1, w2, c); + } } uint_t v1, v2, s1, s2, dv1, dv2, ds1, ds2; |