# Drawing a graph with specified edge lengths

I was wondering if it was possible to ask Mathematica to draw a graph provided some set of vertices: $(v_1, ..., v_N) \in V$ connected by $M$ edges $(e_1, ..., e_M) \in E$, where the length of each edge, $(l_1, ..., l_M) \in L$, is explicitly specified? Obviously I don't expect Mathematica to have a built-in semidefinite convex optimization package to find approximate solutions to the graph realization problem. Rather, I'm wondering if its possible to utilize the "ball and spring" approach Mathematica already uses for displaying arbitrary fixed edge length graphs?

Update (in response to comments) - There's a lot of theory in the literature on solving this "Graph Realization Problem" for graphs with various topologies, some of the most recent focusing on semidefinite convex optimization methods. However, I'm trying to focus my question on specifically getting Mathematica to try a ball and spring minimization process to "realize" a graph provided a specified topology and set of edge lengths. Certainly if anyone knows of an SDP solver for graph realization implemented in Mathematica, I'd love to hear about it. However, I somehow doubt such an implementation exists.

• This problem is closely related to a statistical technique called multidimensional scaling. – Szabolcs Jan 22 '13 at 1:45
• There's a pointer to a reference on the topic here: erikdemaine.org/papers/PlanarEmbedding_JGAA/paper.pdf – Szabolcs Jan 22 '13 at 2:02
• For a basic approach, is it out of the question to do a sum-of-squares minimization? I guess what I am asking is really about the anticipated sizes of the inputs. – Daniel Lichtblau Jan 22 '13 at 3:13
• @DanielLichtblau Let's say tens of vertices, maybe 10x the number of edges as vertices. My guess is that sum-of-squares would choke? – Roger Harris Jan 22 '13 at 4:54
• The special property of the graphs I'm considering is that they are mostly complete, i.e. every pair of distinct vertices share an edge. However, the edge lengths themselves are only known within something like a 10% to 20% error. This makes me pessimistic about a sum-of-squares minimization approach... – Roger Harris Jan 22 '13 at 5:00

In the recent version of Mathematica (version 9), an "approximate" solution to the graph realization problem can be obtained by tuning the repulsive/attractive force in the SpringElectricalEmbedding via EdgeWeight:

elength = {2, 4, 2, 4, 3, 4};
g = CompleteGraph[4, EdgeWeight -> elength,
EdgeLabels -> "EdgeWeight",
GraphLayout -> {"VertexLayout" -> {"SpringElectricalEmbedding",
"EdgeWeighted" -> True}}]


Compare the resulting edge lengths with the given distances:

coords = GraphEmbedding[g];
edges = Table[coords[[List @@ e]], {e, EdgeList[IndexGraph[g]]}];

dist = EuclideanDistance @@@ edges
(* {0.574522, 1.3316, 0.576753, 1.14065, 0.980596, 1.14082} *)

dist/elength
(* {0.287261, 0.3329, 0.288377, 0.285163, 0.326865, 0.285204} *)

MeanDeviation[%]
(* 0.0192805 *)