| 74 | } |
| 75 | |
| 76 | GrB_Info RG_Matrix_removeEntry_UINT64 |
| 77 | ( |
| 78 | RG_Matrix C, // matrix to remove entry from |
| 79 | GrB_Index i, // row index |
| 80 | GrB_Index j, // column index |
| 81 | uint64_t v, // value to remove |
| 82 | bool *entry_deleted // is entry deleted |
| 83 | ) { |
| 84 | ASSERT(C); |
| 85 | ASSERT(entry_deleted != NULL); |
| 86 | RG_Matrix_checkBounds(C, i, j); |
| 87 | |
| 88 | uint64_t m_x; |
| 89 | uint64_t dp_x; |
| 90 | GrB_Info info; |
| 91 | GrB_Type type; |
| 92 | bool in_m = false; |
| 93 | GrB_Matrix m = RG_MATRIX_M(C); |
| 94 | GrB_Matrix dp = RG_MATRIX_DELTA_PLUS(C); |
| 95 | GrB_Matrix dm = RG_MATRIX_DELTA_MINUS(C); |
| 96 | |
| 97 | *entry_deleted = false; |
| 98 | |
| 99 | |
| 100 | #ifdef RG_DEBUG |
| 101 | info = GxB_Matrix_type(&type, m); |
| 102 | ASSERT(info == GrB_SUCCESS); |
| 103 | ASSERT(type == GrB_UINT64); |
| 104 | |
| 105 | bool dm_x; |
| 106 | info = GrB_Matrix_extractElement(&dm_x, dm, i, j); |
| 107 | ASSERT(info == GrB_NO_VALUE); |
| 108 | #endif |
| 109 | |
| 110 | // entry should exists in either delta-plus or main |
| 111 | // locate entry |
| 112 | info = GrB_Matrix_extractElement(&m_x, m, i, j); |
| 113 | in_m = (info == GrB_SUCCESS); |
| 114 | |
| 115 | //-------------------------------------------------------------------------- |
| 116 | // entry exists in 'M' |
| 117 | //-------------------------------------------------------------------------- |
| 118 | |
| 119 | if(in_m) { |
| 120 | if(SINGLE_EDGE(m_x)) { |
| 121 | *entry_deleted = true; |
| 122 | // mark deletion in delta minus |
| 123 | info = GrB_Matrix_setElement(dm, true, i, j); |
| 124 | ASSERT(info == GrB_SUCCESS); |
| 125 | info = RG_Matrix_removeElement_BOOL(C->transposed, j, i); |
| 126 | ASSERT(info == GrB_SUCCESS) |
| 127 | RG_Matrix_setDirty(C); |
| 128 | } else { |
| 129 | info = _removeElementMultiVal(m, i, j, v); |
| 130 | ASSERT(info == GrB_SUCCESS); |
| 131 | } |
| 132 | return info; |
| 133 | } |