Removing edge weights from a Graph
This has to be a bug. I think Graph
never really associates EdgeWeight
with corresponding edges.
Here is a simplified example.
g = Graph[{1, 2, 3}, {
Property[1 <-> 2, EdgeWeight -> x],
1 <-> 3,
Property[2 <-> 3, EdgeWeight -> y]
}];
gNew = RemoveProperty[{g, 1 <-> 2}, EdgeWeight];
gNew2 = SetProperty[{g, 1 <-> 2}, EdgeWeight -> Missing["Nonexistent"]];
Outer[
PropertyValue[{#1, #2}, EdgeWeight] &,
{g, gNew, gNew2},
{1 <-> 2, 1 <-> 3, 2 <-> 3}
] // TableForm[#,
TableHeadings -> {{"g", "gNew", "gNew2"},
{1 <-> 2, 1 <-> 3, 2 <-> 3}}] & // Quiet
Notice the gNew
row, how EdgeWeight
s are mis-aligned when the preceding one (i.e. x
) deleted. And the 3rd column gives us a clue how PropertyValue
extracts EdgeWeight
-- that is, by Part
.
I would definitely call this a bug.
The workaround I can come up with are two ways. The easy way is as I did for gNew2
-- instead of removing it, replacing it with a placeholder. While the hard way is to permute the to-be-delete edge to the end of edge-list before performing the delete:
myRemoveEdgeWeight[g_, e_] :=
Module[{vl = VertexList[g], el = EdgeList[g], pos, ewl, ew},
pos = Position[el, e];
el = Insert[Delete[el, pos], e, -1];
ewl = PropertyValue[g, EdgeWeight];
ew = Extract[ewl, pos][[1]];
ewl = Insert[Delete[ewl, pos], ew, -1];
Graph[vl, el, EdgeWeight -> ewl] //
RemoveProperty[{#, e}, EdgeWeight] &
]
PropertyValue[{myRemoveEdgeWeight[g, 1 <-> 2], #}, EdgeWeight] & /@
{1 <-> 2, 1 <-> 3, 2 <-> 3}
{{1, y}[[3]], 1, y}
I should post this as a comment, but it is too long. Perhaps I'll delete it later.
There is also some nuisance with RandomGraph[]. Compare the following equivalent graphs:
n = 6;
g = CompleteGraph[n, EdgeWeight -> Range[n (n - 1)/2]]
WeightedAdjacencyMatrix[g] // MatrixForm
g1 = RandomGraph[{n, n (n - 1) /2}, EdgeWeight -> Range[n (n - 1)/2]]
WeightedAdjacencyMatrix[g1] // MatrixForm
Edit
Answering Szabolcs's comment:
n = 6;
g = CompleteGraph[n, EdgeWeight -> Range[n (n - 1)/2]];
w = WeightedAdjacencyMatrix[g] // MatrixForm;
g1 = RandomGraph[{n, n (n - 1) /2}, EdgeWeight -> Range[n (n - 1)/2]];
w1 = WeightedAdjacencyMatrix[g1] // MatrixForm;
Row[{w, w1}]