Как я могу программно получить доступ к информации об объекте «График» в Mathematica 8?

Я пытаюсь получить доступ к информации внутри объекта Graph в Mathematica 8. По какой-то причине команда Part не работает.

myGraph — это объект, к которому я хочу получить доступ.

В первой строке ниже отображается myGraph. Остальные служат для его осмотра.

myGraph

myGraph // FullForm  
myGraph // InputForm  
myGraph // OutputForm    
myGraph[[1]]
myGraph[[2]]  

myGraph

Почему myGraph[[1]] не возвращает List[1,3,4,2,5]? [Я проверил уровень 2 на случай, если Graph были обернуты какой-то невидимой оболочкой. Level[myGraph,1] просто возвращает {}. А FullForm[myGraph][[1]] возвращает картинку самого графика.

Должно быть, я упускаю из виду что-то очевидное.


Изменить

Вот код, который я использовал для создания графика. Большая часть из них не имеет отношения к рассматриваемой проблеме. Но, по крайней мере, вы будете работать с тем же кодом, что и я.

ClearAll[edges, compatibleQ, adjacentCourses, g];
edges[w_, b_] := 
 Most /@ Accumulate /@ 
   Flatten[Permutations[#] & /@ IntegerPartitions[w, All, b], 1]

compatibleQ[j_, k_, edg_] := 
 If[Intersection[edg[[j]], edg[[k]]] == {}, {j, k}, False]

adjacentCourses[edg_] := 
 Module[{len = Length[edg]},
  Cases[Flatten[Table[compatibleQ[j, k, edg], {j, len}, {k, j, len}], 
    1], {v_, w_} :>  v \[UndirectedEdge] w]]

myGraph =  Graph[adjacentCourses[edges[9, {2, 3}]], VertexLabels -> "Name", 
ImagePadding -> 10]

person DavidC    schedule 11.06.2011    source источник
comment
Дэвид, я думаю, уместно опубликовать свой Эпилог в качестве ответа, а не в теле вашего вопроса (особенно если он находится вверху).   -  person Mr.Wizard    schedule 12.06.2011


Ответы (3)


Несмотря на внешний вид, графические объекты, введенные в Mathematica 8, не являются «обычными» символьными выражениями. В следующем вопросе SO подробно обсуждаются эта и другие подобные проблемы, включая способы извлечения частей определения графа:

новый график в Mathematica 8.0

person WReach    schedule 11.06.2011
comment
Спасибо. Мне стыдно признаться, что я читал о готовых функциях раньше, но совершенно забыл о них и о новом способе работы Graph. Ваш ответ в опубликованной вами ссылке SO поднял некоторые дополнительные вопросы, о которых стоит знать. - person DavidC; 11.06.2011
comment
+1. Решение сделать графы атомарными, а их структуру непрозрачной и трудной для символического манипулирования, кажется мне очень сомнительным. Кажется, это подрывает языковые (неформальные) принципы. Что мне больше всего нравится в ММА, так это то, что ее можно взломать, она стабильна, а многие ее внутренности выставлены напоказ. И я не считаю это графическое решение хорошим способом повышения эффективности (если оно было мотивировано повышением эффективности). Я бы предпочел увидеть расширения для компилятора Mathematica для компиляции большего подмножества символьного кода, а также графики, реализованные с его использованием. Мои два цента. - person Leonid Shifrin; 11.06.2011
comment
@Леонид, согласен. Как вы думаете, может ли WR открыть его, когда они еще немного продвинут его и постепенно заменят Combinatorica? - person DavidC; 11.06.2011
comment
@David Я не думаю, что общая идеология графиков изменится в ближайшее время (они останутся атомарными и т. д.). Может быть, они еще станут более открытыми, я не знаю. Кроме того, я на самом деле не пользовался новым графическим функционалом настолько, чтобы иметь вполне определенное мнение по этому поводу. То, что я выразил в предыдущих комментариях, было основано на первых впечатлениях, а не на обширном опыте. - person Leonid Shifrin; 11.06.2011

Это может быть полезно для вас, чтобы ответить на вопрос
"Как я могу программно получить доступ к информации об объекте "График" в Mathematica 8?"
Кажется, есть ряд новых функции для получения фрагментов информации о графиках, перечисленных здесь http://reference.wolfram.com/mathematica/guide/GraphRepresentation.html.
В вашем примере вам, кажется, нужен список вершин графа в правильном порядке. Похоже, это делает функция VertixList.
Вот скриншот из Раздел «Свойства и отношения» в документе:

введите здесь описание изображения

person dbjohn    schedule 11.06.2011
comment
Спасибо. Я полностью упустил из виду VertexList. - person DavidC; 11.06.2011

Оказывается, на мой вопрос было несколько простых ответов.

Документация для Graph содержит несколько способов получения информации из объекта Graph. (Позор мне, что я не проверил.) Самые полезные команды, на мой взгляд, это:

VertexList[]
VertexCount[]
EdgeList[]
EdgeCount[]
EdgeRules[] 
VertexIndex[]
EdgeIndex[]
PropertyValue[]

Нам нужно получить информацию ВНЕ объекта графа, как правило, после того, как мы манипулировали им. Я могу легко найти, какая информация вошла в построенный мной график, но если выводится производный график, например. из NeighborhoodGraph, я не узнаю его свойства без проверки.

Спасибо @dbJohn за ссылку на документацию Wolfram.

Особая благодарность @WReach за ссылку на его комментарии в предыдущем обсуждении SO об объекте Graph.

person DavidC    schedule 12.06.2011