zoukankan      html  css  js  c++  java
  • graph-tool文档(一)- 快速开始使用Graph-tool

    目录:

    图的过滤

    • 图视图
      -- 组合图视图

    名词解释:
    filter:过滤
    mask:屏蔽
    inverted parameter:倒参数
    overhead:开销
    minimum spanning tree:最小生成树
    betweenness centrality:
    GraphView:一个类
    regular graphs:正则图

    图的过滤

    graph-tool的一个很好的特性就是“动态”地过滤边或顶点。
    过滤是指暂时地屏蔽顶点/边,实际上并不是真正地删除,可以很容易地恢复。
    需要被过滤的顶点或边应该被标记一个bool值类型的属性映射,然后设置set_vertex_filter()set_edge_filter()方法。
    默认情况下,值为“1”的顶点或边被保存在图中,那些值为“0”的将被过滤掉。
    这种行为可以被修改,通过使用相应函数的倒参数。
    所有操作功能和算法将表现为边或顶点已经从图中删除了,以最小的开销。

    注意:

    重要的是要强调,过滤图时,过滤功能并不会增加任何的额外开销。
    在这种情况下,算法的运行速度与不存在过滤功能时一样。

    这是一个例子,通过使用函数min_spanning_tree()和边的过滤得到图的最小生成树。

    g, pos = triangulation(random((500, 2)) * 4, type="delaunay")
    tree = min_spanning_tree(g)
    graph_draw(g, pos=pos, edge_color=tree, output="min_tree.pdf")
    

    树的属性映射有一个bool类型,如果边属于树则值为“1”,否则为“0”。
    下面是一个被标记了边的原始图的图片。

    现在我们可以过滤掉的不属于最小生成树的边。

    g.set_edge_filter(tree)
    graph_draw(g, pos=pos, output="min_tree_filtered.pdf")
    

    过滤后,图就会如下:

    过滤图中的一切都应该透明地工作,只是简单的屏蔽的边被移除。
    例如,下面的代码将计算边和顶点的betweenness中心,并在图中画出它们的颜色和线的厚度。

    bv, be = betweenness(g)
    be.a /= be.a.max() / 5
    graph_draw(g, pos=pos, vertex_fill_color=bv, edge_pen_width=be,
               output="filtered-bt.pdf")
    


    可以恢复原始图,通过将边的过滤器设置为None。

    g.set_edge_filter(None)
    bv, be = betweenness(g)
    be.a /= be.a.max() / 5
    graph_draw(g, pos=pos, vertex_fill_color=bv, edge_pen_width=be,
               output="nonfiltered-bt.pdf")
    


    顶点过滤也以类似的方式工作。
    此外,图也可以使用set_reversed()方法将边反转。
    这也是一个算法复杂度为O(1)的操作,因为这并不真正地修改图。
    如前所述,图的directedness也可以被“动态”地改变通过set_directed()方法。

    图视图

    通常需要同时使用过滤和未过滤的图,或者临时创建一个过滤版本的图来处理一些特定的任务。
    为这些目的,graph-tool提供了GraphView类,代表了一个图的过滤“视图”(filtered “view”),表现为一个独立的图对象,与原始图共享底层数据。
    Graph Views的构造是通过实例化一个GraphView类,并传递一个支持过滤的图对象,连同所需的过滤参数。
    例如,要创建一个图g的有向视图,我们应该:

    >>> ug = GraphView(g, directed=True)
    >>> ug.is_directed()
    True
    

    Graph views还提供更加直接和方便的方法来进行顶点/边缘的过滤:
    构建一个过滤的最小生成树就像在上面的例子中,可以通过传递过滤器属性作为“efilter”的参数:

    >>> tv = GraphView(g, efilt=tree)
    

    请注意,这是一个O(1)的操作,因为它与直接设置图g的过滤器是等价的(在速度上),但在这种情况下,对象g仍保持未修改状态。
    如上图,结果应该是孤立的最小生成树:

    >>> bv, be = betweenness(tv)
    >>> be.a /= be.a.max() / 5
    >>> graph_draw(tv, pos=pos, vertex_fill_color=bv,
    ...            edge_pen_width=be, output="mst-view.pdf")
    <...>
    


    图:Delaunay图的一个视图,孤立的最小生成树。
    注意

    GraphView对象表现得和正常的图形对象完全一样。
    事实上,GraphView是Graph的一个子类。
    唯一的区别在于,一个GraphView对象内部数据与父 Graph类共享内在的数据。
    因此,如果原始图对象被修改,这种修改会立即反映在GraphView对象上,反之亦然。

    更方便地,我们提供一个函数作为过滤器的参数,以顶点或边为单一参数,如果顶点/边应该保持则返回True,否则,返回False。
    例如,如果我们只想保留最“中央”的边,我们可以:

    >>> bv, be = betweenness(g)
    >>> u = GraphView(g, efilt=lambda e: be[e] > be.a.max() / 2)
    

    这创建了一个图视图u,其只包含g的边,which have a normalized betweenness centrality larger than half of the maximum value。
    注意,不同于上面的例子,这是一个(O(E))的操作,(E)是边的数量,因为提供的函数必须被调用(E)次来构造一个过滤器的属性映射。
    因此,提供一个构造过滤器图总是更快,但是提供一个函数可以更方便。
    上面构造的图视图可以被可视化

    >>> be.a /= be.a.max() / 5
    >>> graph_draw(u, pos=pos, vertex_fill_color=bv, output="central-edges-view.pdf")
    <...>
    


    图:Delaunay图的一个视图,孤立规范化的中间性中心大于0.01的边。

    组合图视图

    因为图视图是正则图,可以很轻松地创建图视图的图视图。
    这提供了一个组合过滤器的方便的方式。
    例如,为了隔离上面的例子中最小生成树的所有度大于四的顶点我们可以:

    >>> u = GraphView(g, vfilt=lambda v: v.out_degree() > 4)
    >>> tree = min_spanning_tree(u)
    >>> u = GraphView(u, efilt=tree)
    

    由此产生的图视图可以被可视化为

    >>> graph_draw(u, pos=pos, output="composed-filter.pdf")
    <...>
    


    图:组合视图,获取图中最小生成树中度大于4的所有顶点。

    原文链接:Quick start using graph-tool

  • 相关阅读:
    无符号数和有符号数字操作的一些注意事项
    C/C++的基本数据类型
    GoLang字符串比较(二)
    Sphinx使用指南
    GoLang字符串比较(一)
    并发与调度亲和性
    golang scheduler工作窃取
    g0
    如何将markdown转换成微信公众号中支持的html
    goroutine是如何被回收的
  • 原文地址:https://www.cnblogs.com/leezx/p/5568445.html
Copyright © 2011-2022 走看看