let draw_edge_neighborhood ed1 ed2 fa1 fa2 col1 col2 st1 st2 ~turn =
let size1 = List.length ed1 and size2 = List.length ed2 in
set_window (-2.,-2.,2.,2.);
set_unit_factor 1.5;
initialize_pspicture ();
let c1 = (List.nth col2 0) in
if (c1<>0) then
ext (Printf.sprintf " \\pscircle*[linecolor=vertexcolor%i](0,-0.5){3pt}\n" c1);
ext " \\cnode[linewidth=0.4pt](0,-0.5){3pt}{A}\n\n";
let c2 = (List.nth col1 0) in
if (c2<>0) then
ext (Printf.sprintf " \\pscircle*[linecolor=vertexcolor%i](0,0.5){3pt}\n" c2);
ext " \\cnode[linewidth=0.4pt](0,0.5){3pt}{B}\n";
if ((List.nth ed1 0)<>(List.nth ed2 0)) then failwith "Edge neighborhood problem";
ext (Printf.sprintf " \\ncline[linecolor=edgecolor%i,linewidth=3pt]{A}{B}\n"
(List.nth ed1 0));
ext (Printf.sprintf " \\pscustom[fillstyle=solid,fillcolor=facecolorlight%i,%%\n linecolor=facecolor%i,linearc=0.1]{%%\n \\pspolygon(0.15,-0.4)(0.55,-0.4)(0.55,0.4)(0.35,0.4)(0.15,0.2)}\n"
(List.nth fa2 0) (List.nth fa2 0));
ext (Printf.sprintf " \\rput(0.35,0){\\psscaleboxto(0,0.22){%%\n \\textcolor{facecolor%i}{$\\strut %s$}}}\n"
(List.nth fa2 0) (greek_of_int (List.nth fa2 0)));
ext (Printf.sprintf " \\pscustom[fillstyle=solid,fillcolor=facecolorlight%i,%%\n linecolor=facecolor%i,linearc=0.1]{%%\n \\pspolygon(-0.15,-0.2)(-0.35,-0.4)(-0.55,-0.4)(-0.55,0.4)(-0.15,0.4)}\n"
(List.nth fa1 0) (List.nth fa1 0));
ext (Printf.sprintf " \\rput(-0.35,0){\\psscaleboxto(0,0.22){%%\n \\textcolor{facecolor%i}{$\\strut %s$}}}\n"
(List.nth fa1 0) (greek_of_int (List.nth fa1 0)));
for i = 1 to (size1-1) do
let ang = 3.14159+.(float (i-1))*.3.14159/.(float (size1-2)) in
let col = (List.nth col1 i) in
if (col<>0) then ext (Printf.sprintf
" \\pscircle*[linecolor=vertexcolor%i](%f,%f){2pt}\n"
col (0.+.0.5*.cos(ang)) (-0.5+.0.5*.sin(ang)));
ext (Printf.sprintf " \\cnode[linewidth=0.1pt](%f,%f){2pt}{A%i}\n"
(0.+.0.5*.cos(ang)) (-0.5+.0.5*.sin(ang)) i);
ext (Printf.sprintf " \\ncline[linecolor=edgecolor%i]{A}{A%i}\n"
(List.nth ed1 i) i);
ext (Printf.sprintf " \\rput(%f,%f){\\psscaleboxto(0,0.12){$%i$}}\n"
(0.+.0.65*.cos(ang)) (-0.5+.0.65*.sin(ang))
(if ((st1+i)>size1) then (st1+i-size1) else (st1+i)));
done;
ext " \\psarc[arrowsize=1.5pt,linewidth=0.5pt]{->}(0,-0.5){0.12}{90}{0}\n";
for i = 1 to (size2-1) do
let ang = (float (i-1))*.3.14159/.(float (size2-2)) in
let col = (List.nth col2 i) in
if (col<>0) then ext (Printf.sprintf
" \\pscircle*[linecolor=vertexcolor%i](%f,%f){2pt}\n"
col (0.+.0.5*.cos(ang)) (0.5+.0.5*.sin(ang)));
ext (Printf.sprintf " \\cnode[linewidth=0.1pt](%f,%f){2pt}{B%i}\n"
(0.+.0.5*.cos(ang)) (0.5+.0.5*.sin(ang)) i);
ext (Printf.sprintf " \\ncline[linecolor=edgecolor%i]{B}{B%i}\n"
(List.nth ed2 i) i);
ext (Printf.sprintf " \\rput(%f,%f){\\psscaleboxto(0,0.12){$%i$}}\n"
(0.+.0.65*.cos(ang)) (0.5+.0.65*.sin(ang))
(if (turn) then (if ((st2+i)>size2) then (st2+i-size2) else (st2+i))
else (if ((st2-i)<1) then (st2-i+size2) else (st2-i))));
done;
ext " \\psarc[arrowsize=1.5pt,linewidth=0.5pt]{->}(0,0.5){0.12}{270}{180}\n";
finalize_pspicture ()