igraph 参考手册

用于使用 igraph C 库

搜索手册

第 12 章。图、顶点和边的属性

属性是与图的顶点或边,或者图本身相关联的数字、布尔值或字符串。例如,您可以为顶点标记符号名称,或为图的边附加数字权重。除了这三种基本类型之外,还支持自定义对象类型。

igraph 属性被设计为灵活和可扩展的。在 igraph 中,属性通过接口抽象来实现:任何实现接口中功能的类型都可以用于存储顶点、边和图属性。这意味着不同的属性实现可以与 igraph 一起使用。这是合理的:如果 igraph 从 Python 使用,则属性可以是任何 Python 类型;从 R 使用,则允许所有 R 类型。还有一个实验性的属性实现可以在 C 中编程时使用,但默认情况下当前已关闭。

首先,我们简要回顾一下如何实现属性处理程序。这不是用户每天都会做的事情。它通常是高级接口编写者的工作。(但是可以编写一个没有实现属性的接口。)然后,我们将展示实验性的 C 属性处理程序。

1. 属性处理接口

可以将属性处理接口附加到 igraph。这只是一个函数表,类型为 igraph_attribute_table_t。调用这些函数是为了通知属性处理代码图中发生的结构性更改。有关详细信息,请参阅此类型的文档。

默认情况下,没有属性接口附加到 igraph。要附加一个,请使用新的表调用 igraph_set_attribute_table。这通常在程序启动时完成,并且在程序的整个生命周期中保持不变。必须在创建任何图对象之前完成此操作,因为使用给定属性处理程序创建的图在不同的属性处理程序处于活动状态时无法操作。

1.1. igraph_attribute_table_t — 用于执行属性操作的函数表。

typedef struct igraph_attribute_table_t {
    igraph_error_t (*init)(igraph_t *graph, igraph_vector_ptr_t *attr);
    void           (*destroy)(igraph_t *graph);
    igraph_error_t (*copy)(igraph_t *to, const igraph_t *from, igraph_bool_t ga,
                           igraph_bool_t va, igraph_bool_t ea);
    igraph_error_t (*add_vertices)(igraph_t *graph, igraph_integer_t nv, igraph_vector_ptr_t *attr);
    igraph_error_t (*permute_vertices)(const igraph_t *graph,
                                       igraph_t *newgraph,
                                       const igraph_vector_int_t *idx);
    igraph_error_t (*combine_vertices)(const igraph_t *graph,
                                       igraph_t *newgraph,
                                       const igraph_vector_int_list_t *merges,
                                       const igraph_attribute_combination_t *comb);
    igraph_error_t (*add_edges)(igraph_t *graph, const igraph_vector_int_t *edges,
                                igraph_vector_ptr_t *attr);
    igraph_error_t (*permute_edges)(const igraph_t *graph,
                                    igraph_t *newgraph, const igraph_vector_int_t *idx);
    igraph_error_t (*combine_edges)(const igraph_t *graph,
                                    igraph_t *newgraph,
                                    const igraph_vector_int_list_t *merges,
                                    const igraph_attribute_combination_t *comb);
    igraph_error_t (*get_info)(const igraph_t *graph,
                               igraph_strvector_t *gnames, igraph_vector_int_t *gtypes,
                               igraph_strvector_t *vnames, igraph_vector_int_t *vtypes,
                               igraph_strvector_t *enames, igraph_vector_int_t *etypes);
    igraph_bool_t (*has_attr)(const igraph_t *graph, igraph_attribute_elemtype_t type,
                              const char *name);
    igraph_error_t (*gettype)(const igraph_t *graph, igraph_attribute_type_t *type,
                              igraph_attribute_elemtype_t elemtype, const char *name);
    igraph_error_t (*get_numeric_graph_attr)(const igraph_t *graph, const char *name,
                                             igraph_vector_t *value);
    igraph_error_t (*get_string_graph_attr)(const igraph_t *graph, const char *name,
                                            igraph_strvector_t *value);
    igraph_error_t (*get_bool_graph_attr)(const igraph_t *igraph, const char *name,
                                          igraph_vector_bool_t *value);
    igraph_error_t (*get_numeric_vertex_attr)(const igraph_t *graph, const char *name,
                                              igraph_vs_t vs,
                                              igraph_vector_t *value);
    igraph_error_t (*get_string_vertex_attr)(const igraph_t *graph, const char *name,
                                             igraph_vs_t vs,
                                             igraph_strvector_t *value);
    igraph_error_t (*get_bool_vertex_attr)(const igraph_t *graph, const char *name,
                                           igraph_vs_t vs,
                                           igraph_vector_bool_t *value);
    igraph_error_t (*get_numeric_edge_attr)(const igraph_t *graph, const char *name,
                                            igraph_es_t es,
                                            igraph_vector_t *value);
    igraph_error_t (*get_string_edge_attr)(const igraph_t *graph, const char *name,
                                           igraph_es_t es,
                                           igraph_strvector_t *value);
    igraph_error_t (*get_bool_edge_attr)(const igraph_t *graph, const char *name,
                                         igraph_es_t es,
                                         igraph_vector_bool_t *value);
} igraph_attribute_table_t;

此类型收集定义属性处理程序的函数。它具有以下成员

值: 

init:

每当创建新的图对象时,都会在创建后但在添加任何顶点或边之前调用此函数。它应该设置 igraph_t 对象的 attr 成员,该成员保证在此函数被调用之前设置为 null 指针。预计会返回一个错误代码。

destroy:

每当销毁图对象时,都会在释放分配的内存之前调用此函数。它应该执行任何需要清理的操作,以正确处理 igraph_t 对象的 attr 成员。调用者将在此函数返回后将 attr 成员设置为 null 指针。

copy:

在使用 igraph_copy 复制图时,在图的结构已被复制之后调用此函数。它应该填充目标 igraph_t 对象的 attr 成员。目标的 attr 成员保证在此函数被调用之前设置为 null 指针。预计会返回一个错误代码。

add_vertices:

在将顶点添加到图之前调用,用于添加顶点本身。要添加的顶点数量作为参数提供。预计会返回一个错误代码。

permute_vertices:

当基于现有图创建新图时调用,以便从新图的顶点到旧图的顶点存在映射(例如,如果从图中删除顶点)。提供的索引向量定义了新顶点对应于哪个旧顶点。它的长度必须与新图中的顶点数相同。请注意,旧图和新图可以是相同的。如果两个图实例 不是 相同的,则实现者可以安全地假设新图还没有顶点属性(但在调用此函数时,它可能已经具有图或边属性)。

combine_vertices:

当创建新图涉及从另一个图中合并(收缩等)顶点时调用此函数。该函数在创建新图之后调用。一个参数指定旧图中的多个顶点如何映射到新图中的单个顶点。保证在调用此回调时,旧图和新图实例是不同的。实现者可以安全地假设新图还没有顶点属性(但在调用此函数时,它可能已经具有图或边属性)。

add_edges:

在添加新边时调用。还提供了新边的数量。预计会返回一个错误代码。

permute_edges:

当创建新图时调用,并且一些新边应携带一些旧边的属性。idx 向量显示了旧边和新边之间的映射。它的长度与新图中的边数相同,并且对于每条边,它都给出了旧边的 ID(旧图中的边)。请注意,旧图和新图实例 可能 是相同的。如果两个图实例 不是 相同的,则实现者可以安全地假设新图还没有边属性(但在调用此函数时,它可能已经具有图或顶点属性)。

combine_edges:

当创建新图涉及从另一个图中合并(收缩等)边时调用此函数。该函数在创建新图之后调用。一个参数指定旧图中的多个边如何映射到新图中的单个边。保证在调用此回调时,旧图和新图实例是不同的。实现者可以安全地假设新图还没有边属性(但在调用此函数时,它可能已经具有图或顶点属性)。

get_info:

查询图的属性,应返回名称和类型。

has_attr:

检查图是否具有命名的图/顶点/边属性。

gettype:

查询图/顶点/边属性的类型。

get_numeric_graph_attr:

查询数字图属性。该值应放置在 value 向量的第一个元素中。

get_string_graph_attr:

查询字符串图属性。该值应放置在 value 字符串向量的第一个元素中。

get_bool_graph_attr:

查询布尔图属性。该值应放置在 value 布尔向量的第一个元素中。

get_numeric_vertex_attr:

查询数字顶点属性,适用于 vs 中包含的顶点。

get_string_vertex_attr:

查询字符串顶点属性,适用于 vs 中包含的顶点。

get_bool_vertex_attr:

查询布尔顶点属性,适用于 vs 中包含的顶点。

get_numeric_edge_attr:

查询数字边属性,适用于 es 中包含的边。

get_string_edge_attr:

查询字符串边属性,适用于 es 中包含的边。

get_bool_edge_attr:

查询布尔边属性,适用于 es 中包含的边。

请注意,get_*_*_attr 允许将属性转换为数字或字符串。例如,如果顶点属性是 GNU R 复数数据类型,则 get_string_vertex_attribute 可能会将其序列化为字符串,但只有当 add_vertices 能够对其进行反序列化时,这才有意义。

1.2. igraph_set_attribute_table — 附加属性表。

igraph_attribute_table_t *
igraph_set_attribute_table(const igraph_attribute_table_t * table);

此函数将属性处理代码附加到 igraph 库。请注意,即使 igraph 在线程局部模式下编译,属性处理程序表也 不是 线程局部的。在绝大多数情况下,这不是一个重要的限制。

属性处理程序通常在程序启动时附加,并在程序的整个生命周期中保持活动状态。这是因为使用给定属性处理程序创建的图对象在不同的属性处理程序处于活动状态时不得进行操作。

参数: 

table:

指向 igraph_attribute_table_t 对象的指针,该对象包含用于属性操作的函数。如果您不想要属性,请在此处提供 NULL

返回值: 

指向旧属性处理表的指针。

时间复杂度:O(1)。

1.3. igraph_attribute_type_t — 属性的可能类型。

typedef enum { IGRAPH_ATTRIBUTE_UNSPECIFIED = 0,
               IGRAPH_ATTRIBUTE_DEFAULT IGRAPH_DEPRECATED_ENUMVAL = IGRAPH_ATTRIBUTE_UNSPECIFIED,
               IGRAPH_ATTRIBUTE_NUMERIC = 1,
               IGRAPH_ATTRIBUTE_BOOLEAN = 2,
               IGRAPH_ATTRIBUTE_STRING = 3,
               IGRAPH_ATTRIBUTE_OBJECT = 127
             } igraph_attribute_type_t;

请注意,这只是属性接口向 igraph 函数传递的类型。例如,在 R 属性处理程序中,可以安全地说所有复杂的 R 对象属性都是字符串,只要此接口能够将它们序列化为字符串。另请参阅 igraph_attribute_table_t

值: 

IGRAPH_ATTRIBUTE_UNSPECIFIED:

目前在内部用作某些算法中的“空值”或“占位符值”。具有此类型的属性记录不得传递给 igraph 函数。

IGRAPH_ATTRIBUTE_NUMERIC:

数字属性。

IGRAPH_ATTRIBUTE_BOOLEAN:

逻辑值,true 或 false。

IGRAPH_ATTRIBUTE_STRING:

可以转换为字符串的属性。

IGRAPH_ATTRIBUTE_OBJECT:

自定义属性类型,供客户端应用程序用于特殊数据类型。R 和 Python 接口将其用于保存 R 或 Python 对象的属性。通常被 igraph 函数忽略。

2. 处理属性组合列表

多个图操作可能会将多个顶点或边折叠为一个。属性组合列表用于向属性处理程序指示如何组合原始顶点或边的属性,以及如何导出要分配给折叠顶点或边的最终属性值。例如,igraph_simplify() 删除循环并将多重边组合为一个;对于具有名为 weight 的边属性的图,属性组合列表可以告诉属性处理程序,折叠边的权重应是权重之和、平均值还是折叠为一个的原始边的某些其他函数。

一个属性组合列表可能包含多个属性组合记录,每个属性组合记录对应于要在操作期间处理的每个顶点或边属性。

2.1. igraph_attribute_combination_init — 初始化属性组合列表。

igraph_error_t igraph_attribute_combination_init(igraph_attribute_combination_t *comb);

参数: 

comb:

未初始化的属性组合列表。

返回值: 

错误代码。

时间复杂度:O(1)

2.2. igraph_attribute_combination_add — 将组合记录添加到属性组合列表。

igraph_error_t igraph_attribute_combination_add(igraph_attribute_combination_t *comb,
                                     const char *name,
                                     igraph_attribute_combination_type_t type,
                                     igraph_function_pointer_t func);

参数: 

comb:

属性组合列表。

name:

属性的名称。如果名称已存在,则属性组合记录将被替换。使用 NULL 为列表中不存在的所有属性添加默认组合记录。

type:

属性组合的类型。有关选项,请参见 igraph_attribute_combination_type_t

func:

如果 typeIGRAPH_ATTRIBUTE_COMBINE_FUNCTION,则要使用的函数。此函数由附加到 igraph 的具体属性处理程序调用,其调用签名完全取决于属性处理程序。例如,如果您从 C 使用属性并且您已附加 C 属性处理程序,则需要遵循 C 属性处理程序的文档以获取更多详细信息。

返回值: 

错误代码。

时间复杂度:O(n),其中 n 是当前属性组合的数量。

2.3. igraph_attribute_combination_remove — 从属性组合列表中删除记录。

igraph_error_t igraph_attribute_combination_remove(igraph_attribute_combination_t *comb,
                                        const char *name);

参数: 

comb:

属性组合列表。

name:

要删除的属性组合记录的属性名称。如果命名的属性不存在,它将被忽略。它可以为 NULL 以删除默认组合记录。

返回值: 

错误代码。当前始终返回 IGRAPH_SUCCESS。

时间复杂度:O(n),其中 n 是属性组合列表中记录的数量。

2.4. igraph_attribute_combination_destroy — 销毁属性组合列表。

void igraph_attribute_combination_destroy(igraph_attribute_combination_t *comb);

参数: 

comb:

属性组合列表。

时间复杂度:O(n),其中 n 是属性组合列表中记录的数量。

2.5. igraph_attribute_combination_type_t — 属性组合的可能类型。

typedef enum {
    IGRAPH_ATTRIBUTE_COMBINE_IGNORE = 0,
    IGRAPH_ATTRIBUTE_COMBINE_DEFAULT = 1,
    IGRAPH_ATTRIBUTE_COMBINE_FUNCTION = 2,
    IGRAPH_ATTRIBUTE_COMBINE_SUM = 3,
    IGRAPH_ATTRIBUTE_COMBINE_PROD = 4,
    IGRAPH_ATTRIBUTE_COMBINE_MIN = 5,
    IGRAPH_ATTRIBUTE_COMBINE_MAX = 6,
    IGRAPH_ATTRIBUTE_COMBINE_RANDOM = 7,
    IGRAPH_ATTRIBUTE_COMBINE_FIRST = 8,
    IGRAPH_ATTRIBUTE_COMBINE_LAST = 9,
    IGRAPH_ATTRIBUTE_COMBINE_MEAN = 10,
    IGRAPH_ATTRIBUTE_COMBINE_MEDIAN = 11,
    IGRAPH_ATTRIBUTE_COMBINE_CONCAT = 12
} igraph_attribute_combination_type_t;

值: 

IGRAPH_ATTRIBUTE_COMBINE_IGNORE:

忽略旧属性,使用空值。

IGRAPH_ATTRIBUTE_COMBINE_DEFAULT:

使用默认方式组合属性(由属性处理程序实现决定)。

IGRAPH_ATTRIBUTE_COMBINE_FUNCTION:

提供您自己的函数来组合属性。

IGRAPH_ATTRIBUTE_COMBINE_SUM:

取属性的总和。

IGRAPH_ATTRIBUTE_COMBINE_PROD:

取属性的乘积。

IGRAPH_ATTRIBUTE_COMBINE_MIN:

取最小属性。

IGRAPH_ATTRIBUTE_COMBINE_MAX:

取最大属性。

IGRAPH_ATTRIBUTE_COMBINE_RANDOM:

取随机属性。

IGRAPH_ATTRIBUTE_COMBINE_FIRST:

取第一个属性。

IGRAPH_ATTRIBUTE_COMBINE_LAST:

取最后一个属性。

IGRAPH_ATTRIBUTE_COMBINE_MEAN:

取属性的平均值。

IGRAPH_ATTRIBUTE_COMBINE_MEDIAN:

取属性的中位数。

IGRAPH_ATTRIBUTE_COMBINE_CONCAT:

连接属性。

2.6. igraph_attribute_combination — 初始化属性组合列表并添加记录。

igraph_error_t igraph_attribute_combination(
        igraph_attribute_combination_t *comb, ...);

参数: 

comb:

未初始化的属性组合列表。

...:

“name, type[, func]”列表,其中

name:

属性的名称。如果名称已存在,则属性组合记录将被替换。使用 NULL 为列表中不存在的所有属性添加默认组合记录。

type:

属性组合的类型。有关选项,请参见 igraph_attribute_combination_type_t

func:

如果 typeIGRAPH_ATTRIBUTE_COMBINE_FUNCTION,则要使用的函数。通过将名称设置为 IGRAPH_NO_MORE_ATTRIBUTES 来关闭列表。

返回值: 

错误代码。

时间复杂度:O(n^2),其中 n 是要添加的属性组合记录的数量。

示例 12.1.  文件 examples/simple/igraph_attribute_combination.c

#include <igraph.h>

int main(void) {
    igraph_t graph;

    igraph_attribute_combination_t comb;

    igraph_set_attribute_table(&igraph_cattribute_table);

    igraph_small(&graph, 2, IGRAPH_DIRECTED,
                 0,1, 0,1,
                 -1);

    SETEAB(&graph, "type", 0, true);
    SETEAB(&graph, "type", 1, false);

    igraph_attribute_combination(&comb,
                                 "weight", IGRAPH_ATTRIBUTE_COMBINE_SUM,
                                 "type",   IGRAPH_ATTRIBUTE_COMBINE_FIRST,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_IGNORE,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    igraph_simplify(&graph, /*remove_multiple=*/ true, /*remove_loops=*/ true, &comb);
    igraph_write_graph_graphml(&graph, stdout, /*prefixattr=*/ true);

    igraph_destroy(&graph);
    igraph_attribute_combination_destroy(&comb);

    return 0;
}


3. 从 C 访问属性

有一个实验性的属性处理程序可以从 C 代码中使用。在本节中,我们将展示它是如何工作的。此属性处理程序默认情况下未附加(默认值为无属性处理程序),因此我们首先需要附加它

igraph_set_attribute_table(&igraph_cattribute_table);

现在属性函数可用了。请注意,必须在调用任何其他 igraph 函数之前附加属性处理程序,否则您可能会得到没有属性的图和一个活动的属性处理程序,这可能会导致意外的程序行为。规则是您在 main() 的开头附加属性处理程序,并且永远不要再次触及它。分离属性处理程序可能会导致内存泄漏。

目前无法按图拥有属性处理程序。应用程序中的所有图都必须使用相同的属性处理程序进行管理。这也适用于根本没有属性处理程序的情况。

C 属性处理程序支持将实数、布尔值和字符串作为属性附加。不允许向量值。例如,顶点具有一个 name 属性,该属性为每个顶点保存一个字符串值,但不可能具有 coords 属性,该属性是每个顶点的数字向量。

本节中记录的函数是 C 属性处理程序特有的。使用这些函数的代码在附加不同的属性处理程序时将无法正常工作。

示例 12.2.  文件 examples/simple/cattributes.c

#include <igraph.h>
#include <string.h>
#include <stdlib.h>

/* Prints graph, vertex and edge attributes stored in a graph. */
void print_attributes(const igraph_t *g) {
    igraph_vector_int_t gtypes, vtypes, etypes;
    igraph_strvector_t gnames, vnames, enames;
    igraph_integer_t i, j;

    igraph_vector_int_init(&gtypes, 0);
    igraph_vector_int_init(&vtypes, 0);
    igraph_vector_int_init(&etypes, 0);
    igraph_strvector_init(&gnames, 0);
    igraph_strvector_init(&vnames, 0);
    igraph_strvector_init(&enames, 0);

    igraph_cattribute_list(g,
                           &gnames, &gtypes,
                           &vnames, &vtypes,
                           &enames, &etypes);

    /* graph attributes */
    for (i = 0; i < igraph_strvector_size(&gnames); i++) {
        printf("%s=", igraph_strvector_get(&gnames, i));
        if (VECTOR(gtypes)[i] == IGRAPH_ATTRIBUTE_NUMERIC) {
            igraph_real_printf(GAN(g, igraph_strvector_get(&gnames, i)));
            putchar(' ');
        } else {
            printf("\"%s\" ", GAS(g, igraph_strvector_get(&gnames, i)));
        }
    }
    printf("\n");

    /* vertex attributes */
    for (i = 0; i < igraph_vcount(g); i++) {
        printf("Vertex %" IGRAPH_PRId ": ", i);
        for (j = 0; j < igraph_strvector_size(&vnames); j++) {
            printf("%s=", igraph_strvector_get(&vnames, j));
            if (VECTOR(vtypes)[j] == IGRAPH_ATTRIBUTE_NUMERIC) {
                igraph_real_printf(VAN(g, igraph_strvector_get(&vnames, j), i));
                putchar(' ');
            } else {
                printf("\"%s\" ", VAS(g, igraph_strvector_get(&vnames, j), i));
            }
        }
        printf("\n");
    }

    /* edge attributes */
    for (i = 0; i < igraph_ecount(g); i++) {
        printf("Edge %" IGRAPH_PRId " (%" IGRAPH_PRId "-%" IGRAPH_PRId "): ", i, IGRAPH_FROM(g, i), IGRAPH_TO(g, i));
        for (j = 0; j < igraph_strvector_size(&enames); j++) {
            printf("%s=", igraph_strvector_get(&enames, j));
            if (VECTOR(etypes)[j] == IGRAPH_ATTRIBUTE_NUMERIC) {
                igraph_real_printf(EAN(g, igraph_strvector_get(&enames, j), i));
                putchar(' ');
            } else {
                printf("\"%s\" ", EAS(g, igraph_strvector_get(&enames, j), i));
            }
        }
        printf("\n");
    }

    igraph_strvector_destroy(&enames);
    igraph_strvector_destroy(&vnames);
    igraph_strvector_destroy(&gnames);
    igraph_vector_int_destroy(&etypes);
    igraph_vector_int_destroy(&vtypes);
    igraph_vector_int_destroy(&gtypes);
}

int main(void) {
    igraph_t graph;
    igraph_vector_t y;

    /* Turn on attribute handling. */
    igraph_set_attribute_table(&igraph_cattribute_table);

    igraph_small(&graph, 3, IGRAPH_DIRECTED, 0,1, 1,2, -1);

    /* Set graph attributes. */
    /* numeric */
    SETGAN(&graph, "id", 10);
    /* string */
    SETGAS(&graph, "name", "toy");
    /* boolean */
    SETGAB(&graph, "is_regular", false);

    /* Set edge string attribute. */
    SETEAS(&graph, "color", 1, "RED");

    /* Set vertex attributes as vector. */
    igraph_vector_init(&y, igraph_vcount(&graph));
    igraph_vector_fill(&y, 1.23);
    SETVANV(&graph, "y", &y);
    igraph_vector_destroy(&y);

    /* Set single vertex numeric attribute. */
    SETVAN(&graph, "y", 0, -1);

    /* Delete graph attribute. */
    DELGA(&graph, "is_regular");

    /* Print the final result. */
    print_attributes(&graph);

    /* Delete all remaining attributes. */
    DELALL(&graph);

    /* Destroy the graph. */
    igraph_destroy(&graph);

    return 0;
}


示例 12.3.  文件 examples/simple/cattributes2.c

#include <igraph.h>

int main(void) {

    igraph_t g;
    igraph_vector_t y;
    igraph_warning_handler_t* oldwarnhandler;

    /* Turn on attribute handling. */
    igraph_set_attribute_table(&igraph_cattribute_table);

    /* Create a graph, add some attributes and save it as a GraphML file. */
    igraph_famous(&g, "Petersen");
    SETGAS(&g, "name", "Petersen's graph");
    SETGAN(&g, "vertices", igraph_vcount(&g));
    SETGAN(&g, "edges", igraph_ecount(&g));
    SETGAB(&g, "famous", true);

    igraph_vector_init_range(&y, 1, igraph_vcount(&g) + 1);
    SETVANV(&g, "id", &y);
    igraph_vector_destroy(&y);

    SETVAS(&g, "name", 0, "foo");
    SETVAS(&g, "name", 1, "foobar");

    SETVAB(&g, "is_first", 0, true);

    igraph_vector_init_range(&y, 1, igraph_ecount(&g) + 1);
    SETEANV(&g, "id", &y);
    igraph_vector_destroy(&y);

    SETEAS(&g, "name", 0, "FOO");
    SETEAS(&g, "name", 1, "FOOBAR");

    SETEAB(&g, "is_first", 0, true);

    /* Turn off the warning handler temporarily because the GML writer will
     * print warnings about boolean attributes being converted to numbers, and
     * we don't care about these. */
    oldwarnhandler = igraph_set_warning_handler(igraph_warning_handler_ignore);
    igraph_write_graph_gml(&g, stdout, IGRAPH_WRITE_GML_DEFAULT_SW, 0, "");
    igraph_set_warning_handler(oldwarnhandler);

    /* Back to business. */
    igraph_write_graph_graphml(&g, stdout, /*prefixattr=*/ true);

    igraph_destroy(&g);

    return 0;
}


示例 12.4.  文件 examples/simple/cattributes3.c

#include <igraph.h>

igraph_error_t mf(const igraph_vector_t *input, igraph_real_t *output) {
    *output = 0.0;
    return IGRAPH_SUCCESS;
}

static void simplify_write_destroy(igraph_t *g, igraph_attribute_combination_t *comb) {
    igraph_simplify(g, /*remove_multiple=*/ true, /*remove_loops=*/ true, comb);
    igraph_write_graph_graphml(g, stdout, /*prefixattr=*/ true);
    igraph_attribute_combination_destroy(comb);
    igraph_destroy(g);
}

static void weight_test(igraph_t *g, igraph_attribute_combination_type_t weight_attr) {
    igraph_t g2;
    igraph_attribute_combination_t comb;

    igraph_copy(&g2, g);
    igraph_attribute_combination(&comb,
                                 "weight", weight_attr,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_IGNORE,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    simplify_write_destroy(&g2, &comb);
}

int main(void) {

    igraph_t g, g2;
    igraph_vector_t weight;
    igraph_attribute_combination_t comb;

    igraph_set_attribute_table(&igraph_cattribute_table);

    igraph_small(&g, 4, IGRAPH_DIRECTED,
                 0, 1, 0, 1, 0, 1,
                 1, 2, 2, 3,
                 -1);

    igraph_vector_init_range(&weight, 1, igraph_ecount(&g) + 1);
    SETEANV(&g, "weight", &weight);
    igraph_vector_destroy(&weight);

    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_SUM);
    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_PROD);
    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_MIN);
    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_MAX);
    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_FIRST);
    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_LAST);
    weight_test(&g, IGRAPH_ATTRIBUTE_COMBINE_MEAN);

    /* ****************************************************** */

    igraph_copy(&g2, &g);
    igraph_attribute_combination(&comb,
                                 "weight", IGRAPH_ATTRIBUTE_COMBINE_FUNCTION, mf,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_IGNORE,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    simplify_write_destroy(&g2, &comb);

    /* ****************************************************** */

    igraph_copy(&g2, &g);
    igraph_attribute_combination(&comb,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_MEAN,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    simplify_write_destroy(&g2, &comb);

    /* ****************************************************** */

    igraph_destroy(&g);

    return 0;
}


示例 12.5.  文件 examples/simple/cattributes4.c

#include <igraph.h>

static void simplify_write_destroy(igraph_t *g, igraph_attribute_combination_t *comb) {
    igraph_simplify(g, /*remove_multiple=*/ true, /*remove_loops=*/ true, comb);
    igraph_write_graph_graphml(g, stdout, /*prefixattr=*/ true);
    igraph_attribute_combination_destroy(comb);
    igraph_destroy(g);
}

int main(void) {

    igraph_t g, g2;
    igraph_attribute_combination_t comb;

    igraph_set_attribute_table(&igraph_cattribute_table);

    igraph_small(&g, 4, IGRAPH_DIRECTED,
                 0, 1, 0, 1, 0, 1,
                 1, 2, 2, 3,
                 -1);

    SETEAS(&g, "color", 0, "green");
    SETEAS(&g, "color", 1, "red");
    SETEAS(&g, "color", 2, "blue");
    SETEAS(&g, "color", 3, "white");
    SETEAS(&g, "color", 4, "black");

    /* ****************************************************** */

    igraph_copy(&g2, &g);
    igraph_attribute_combination(&comb,
                                 "weight", IGRAPH_ATTRIBUTE_COMBINE_SUM,
                                 "color",  IGRAPH_ATTRIBUTE_COMBINE_FIRST,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_IGNORE,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    simplify_write_destroy(&g2, &comb);

    /* ****************************************************** */

    igraph_copy(&g2, &g);
    igraph_attribute_combination(&comb,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_LAST,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    simplify_write_destroy(&g2, &comb);

    /* ****************************************************** */

    igraph_copy(&g2, &g);
    igraph_attribute_combination(&comb,
                                 "",       IGRAPH_ATTRIBUTE_COMBINE_IGNORE,
                                 "color",  IGRAPH_ATTRIBUTE_COMBINE_CONCAT,
                                 IGRAPH_NO_MORE_ATTRIBUTES);
    simplify_write_destroy(&g2, &comb);

    /* ****************************************************** */

    igraph_destroy(&g);

    return 0;
}


3.1. 查询属性

3.1.1. igraph_cattribute_list — 列出所有属性。
3.1.2. igraph_cattribute_has_attr — 检查是否存在(图、顶点或边)属性。
3.1.3. igraph_cattribute_GAN — 查询数字图属性。
3.1.4. GAN — 查询数字图属性。
3.1.5. igraph_cattribute_GAB — 查询布尔图属性。
3.1.6. GAB — 查询布尔图属性。
3.1.7. igraph_cattribute_GAS — 查询字符串图属性。
3.1.8. GAS — 查询字符串图属性。
3.1.9. igraph_cattribute_VAN — 查询数字顶点属性。
3.1.10. VAN — 查询数字顶点属性。
3.1.11. igraph_cattribute_VANV — 查询多个顶点的数字顶点属性。
3.1.12. VANV — 查询所有顶点的数字顶点属性。
3.1.13. igraph_cattribute_VAB — 查询布尔顶点属性。
3.1.14. VAB — 查询布尔顶点属性。
3.1.15. igraph_cattribute_VABV — 查询多个顶点的布尔顶点属性。
3.1.16. VABV — 查询所有顶点的布尔顶点属性。
3.1.17. igraph_cattribute_VAS — 查询字符串顶点属性。
3.1.18. VAS — 查询字符串顶点属性。
3.1.19. igraph_cattribute_VASV — 查询多个顶点的字符串顶点属性。
3.1.20. VASV — 查询所有顶点的字符串顶点属性。
3.1.21. igraph_cattribute_EAN — 查询数字边属性。
3.1.22. EAN — 查询数字边属性。
3.1.23. igraph_cattribute_EANV — 查询多个边的数字边属性。
3.1.24. EANV — 查询所有边的数字边属性。
3.1.25. igraph_cattribute_EAB — 查询布尔边属性。
3.1.26. EAB — 查询布尔边属性。
3.1.27. igraph_cattribute_EABV — 查询多个边的布尔边属性。
3.1.28. EABV — 查询所有边的布尔边属性。
3.1.29. igraph_cattribute_EAS — 查询字符串边属性。
3.1.30. EAS — 查询字符串边属性。
3.1.31. igraph_cattribute_EASV — 查询多个边的字符串边属性。
3.1.32. EASV — 查询所有边的字符串边属性。

3.1.1. igraph_cattribute_list — 列出所有属性。

igraph_error_t igraph_cattribute_list(const igraph_t *graph,
                           igraph_strvector_t *gnames, igraph_vector_int_t *gtypes,
                           igraph_strvector_t *vnames, igraph_vector_int_t *vtypes,
                           igraph_strvector_t *enames, igraph_vector_int_t *etypes);

有关各种属性类型,请参见 igraph_attribute_type_t

参数: 

:

输入图。

gnames:

字符串向量,图属性的名称。

gtypes:

数字向量,图属性的类型。

vnames:

字符串向量,顶点属性的名称。

vtypes:

数字向量,顶点属性的类型。

enames:

字符串向量,边属性的名称。

etypes:

数字向量,边属性的类型。

返回值: 

错误代码。

自然地,具有属性名称的字符串向量和具有属性类型的数字向量的顺序正确,即第一个名称对应于第一个类型,依此类推。时间复杂度:O(Ag+Av+Ae),所有属性的数量。

3.1.2. igraph_cattribute_has_attr — 检查是否存在(图、顶点或边)属性。

igraph_bool_t igraph_cattribute_has_attr(const igraph_t *graph,
        igraph_attribute_elemtype_t type,
        const char *name);

参数: 

:

图。

type:

属性的类型,IGRAPH_ATTRIBUTE_GRAPHIGRAPH_ATTRIBUTE_VERTEXIGRAPH_ATTRIBUTE_EDGE

name:

字符常量,属性的名称。

返回值: 

布尔值,如果属性存在,则为 true;否则为 false

时间复杂度:O(A),(图、顶点或边)属性的数量,假设属性名称不太长。

3.1.3. igraph_cattribute_GAN — 查询数字图属性。

igraph_real_t igraph_cattribute_GAN(const igraph_t *graph, const char *name);

返回给定数字图属性的值。如果属性不存在,则会发出警告并返回 NaN。

参数: 

:

输入图。

name:

要查询的属性的名称。

返回值: 

属性的值。

另请参阅: 

有关更简单的界面,请参见 GAN

时间复杂度:O(Ag),图属性的数量。

3.1.4. GAN — 查询数字图属性。

#define GAN(graph,n)

这是 igraph_cattribute_GAN() 的简写形式。

参数: 

:

图。

n:

属性的名称。

返回值: 

属性的值。

3.1.5. igraph_cattribute_GAB — 查询布尔图属性。

igraph_bool_t igraph_cattribute_GAB(const igraph_t *graph, const char *name);

返回给定布尔图属性的值。如果属性不存在,则会发出警告并返回 false。

参数: 

:

输入图。

name:

要查询的属性的名称。

返回值: 

属性的值。

另请参阅: 

有关更简单的界面,请参见 GAB

时间复杂度:O(Ag),图属性的数量。

3.1.6. GAB — 查询布尔图属性。

#define GAB(graph,n)

这是 igraph_cattribute_GAB() 的简写形式。

参数: 

:

图。

n:

属性的名称。

返回值: 

属性的值。

3.1.7. igraph_cattribute_GAS — 查询字符串图属性。

const char *igraph_cattribute_GAS(const igraph_t *graph, const char *name);

返回指向 name 中指定的字符串图属性的 const 指针。不得修改该值。如果属性不存在,则会发出警告并返回空字符串。

参数: 

:

输入图。

name:

要查询的属性的名称。

返回值: 

属性的值。

另请参阅: 

有关更简单的界面,请参见 GAS

时间复杂度:O(Ag),图属性的数量。

3.1.8. GAS — 查询字符串图属性。

#define GAS(graph,n)

这是 igraph_cattribute_GAS() 的简写形式。

参数: 

:

图。

n:

属性的名称。

返回值: 

属性的值。

3.1.9. igraph_cattribute_VAN — 查询数字顶点属性。

igraph_real_t igraph_cattribute_VAN(const igraph_t *graph, const char *name,
                                    igraph_integer_t vid);

如果属性不存在,则会发出警告并返回 NaN。有关经过错误检查的版本,请参见 igraph_cattribute_VANV()

参数: 

:

输入图。

name:

属性的名称。

vid:

查询顶点的 ID。

返回值: 

属性的值。

另请参阅: 

有关更简单的界面,请参见 VAN 宏。

时间复杂度:O(Av),顶点属性的数量。

3.1.10. VAN — 查询数字顶点属性。

#define VAN(graph,n,v)

这是 igraph_cattribute_VAN() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

顶点的 ID。

返回值: 

属性的值。

3.1.11. igraph_cattribute_VANV — 查询多个顶点的数字顶点属性。

igraph_error_t igraph_cattribute_VANV(const igraph_t *graph, const char *name,
                           igraph_vs_t vids, igraph_vector_t *result);

参数: 

:

输入图。

name:

属性的名称。

vids:

要查询的顶点。

result:

指向已初始化向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

时间复杂度:O(v),其中 v 是“vids”中顶点的数量。

3.1.12. VANV — 查询所有顶点的数字顶点属性。

#define VANV(graph,n,vec)

这是 igraph_cattribute_VANV() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vec:

指向已初始化向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

3.1.13. igraph_cattribute_VAB — 查询布尔顶点属性。

igraph_bool_t igraph_cattribute_VAB(const igraph_t *graph, const char *name,
                                    igraph_integer_t vid);

如果顶点属性不存在,则会发出警告并返回 false。有关经过错误检查的版本,请参见 igraph_cattribute_VABV()

参数: 

:

输入图。

name:

属性的名称。

vid:

查询顶点的 ID。

返回值: 

属性的值。

另请参阅: 

有关更简单的界面,请参见 VAB 宏。

时间复杂度:O(Av),顶点属性的数量。

3.1.14. VAB — 查询布尔顶点属性。

#define VAB(graph,n,v)

这是 igraph_cattribute_VAB() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

顶点的 ID。

返回值: 

属性的值。

3.1.15. igraph_cattribute_VABV — 查询多个顶点的布尔顶点属性。

igraph_error_t igraph_cattribute_VABV(const igraph_t *graph, const char *name,
                           igraph_vs_t vids, igraph_vector_bool_t *result);

参数: 

:

输入图。

name:

属性的名称。

vids:

要查询的顶点。

result:

指向已初始化布尔向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

时间复杂度:O(v),其中 v 是“vids”中顶点的数量。

3.1.16. VABV — 查询所有顶点的布尔顶点属性。

#define VABV(graph,n,vec)

这是 igraph_cattribute_VABV() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vec:

指向已初始化布尔向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

3.1.17. igraph_cattribute_VAS — 查询字符串顶点属性。

const char *igraph_cattribute_VAS(const igraph_t *graph, const char *name,
                                  igraph_integer_t vid);

返回指向 name 中指定的字符串顶点属性的 const 指针。不得修改该值。如果顶点属性不存在,则会发出警告并返回空字符串。有关经过错误检查的版本,请参见 igraph_cattribute_VASV()

参数: 

:

输入图。

name:

属性的名称。

vid:

查询顶点的 ID。

返回值: 

属性的值。

另请参阅: 

有关更简单的界面,请参见宏 VAS

时间复杂度:O(Av),顶点属性的数量。

3.1.18. VAS — 查询字符串顶点属性。

#define VAS(graph,n,v)

这是 igraph_cattribute_VAS() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

顶点的 ID。

返回值: 

属性的值。

3.1.19. igraph_cattribute_VASV — 查询多个顶点的字符串顶点属性。

igraph_error_t igraph_cattribute_VASV(const igraph_t *graph, const char *name,
                           igraph_vs_t vids, igraph_strvector_t *result);

参数: 

:

输入图。

name:

属性的名称。

vids:

要查询的顶点。

result:

指向已初始化的字符串向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

时间复杂度:O(v),其中 v 是 'vids' 中顶点的数量。(我们假设字符串属性具有有限的长度。)

3.1.20. VASV — 查询所有顶点的字符串顶点属性。

#define VASV(graph,n,vec)

这是 igraph_cattribute_VASV() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vec:

指向已初始化的字符串向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

3.1.21. igraph_cattribute_EAN — 查询数值型边属性。

igraph_real_t igraph_cattribute_EAN(const igraph_t *graph, const char *name,
                                    igraph_integer_t eid);

如果属性不存在,则会发出警告并返回 NaN。有关经过错误检查的版本,请参阅 igraph_cattribute_EANV()

参数: 

:

输入图。

name:

属性的名称。

eid:

查询的边的 ID。

返回值: 

属性的值。

另请参阅: 

EAN 提供了一个更简单的接口。

时间复杂度:O(Ae),边属性的数量。

3.1.22. EAN — 查询数值型边属性。

#define EAN(graph,n,e)

这是 igraph_cattribute_EAN() 的简写形式。

参数: 

:

图。

n:

属性的名称。

e:

边的 ID。

返回值: 

属性的值。

3.1.23. igraph_cattribute_EANV — 查询多个边的数值型边属性。

igraph_error_t igraph_cattribute_EANV(const igraph_t *graph, const char *name,
                           igraph_es_t eids, igraph_vector_t *result);

参数: 

:

输入图。

name:

属性的名称。

eids:

要查询的边。

result:

指向已初始化向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

时间复杂度:O(e),其中 e 是 'eids' 中边的数量。

3.1.24. EANV — 查询所有边的数值型边属性。

#define EANV(graph,n,vec)

这是 igraph_cattribute_EANV() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vec:

指向已初始化向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

3.1.25. igraph_cattribute_EAB — 查询布尔型边属性。

igraph_bool_t igraph_cattribute_EAB(const igraph_t *graph, const char *name,
                                    igraph_integer_t eid);

如果边属性不存在,则会发出警告并返回 false。有关经过错误检查的版本,请参阅 igraph_cattribute_EABV()

参数: 

:

输入图。

name:

属性的名称。

eid:

查询的边的 ID。

返回值: 

属性的值。

另请参阅: 

EAB 提供了一个更简单的接口。

时间复杂度:O(Ae),边属性的数量。

3.1.26. EAB — 查询布尔型边属性。

#define EAB(graph,n,e)

这是 igraph_cattribute_EAB() 的简写形式。

参数: 

:

图。

n:

属性的名称。

e:

边的 ID。

返回值: 

属性的值。

3.1.27. igraph_cattribute_EABV — 查询多个边的布尔型边属性。

igraph_error_t igraph_cattribute_EABV(const igraph_t *graph, const char *name,
                           igraph_es_t eids, igraph_vector_bool_t *result);

参数: 

:

输入图。

name:

属性的名称。

eids:

要查询的边。

result:

指向已初始化布尔向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

时间复杂度:O(e),其中 e 是 'eids' 中边的数量。

3.1.28. EABV — 查询所有边的布尔型边属性。

#define EABV(graph,n,vec)

这是 igraph_cattribute_EABV() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vec:

指向已初始化向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

3.1.29. igraph_cattribute_EAS — 查询字符串边属性。

const char *igraph_cattribute_EAS(const igraph_t *graph, const char *name,
                                  igraph_integer_t eid);

返回一个指向 name 中指定的字符串边属性的 const 指针。该值不得修改。如果边属性不存在,则会发出警告并返回一个空字符串。有关经过错误检查的版本,请参阅 igraph_cattribute_EASV()

参数: 

:

输入图。

name:

属性的名称。

eid:

查询的边的 ID。

返回值: 

属性的值。

\se 如果您想减少输入,请参阅 EAS。时间复杂度:O(Ae),边属性的数量。

3.1.30. EAS — 查询字符串边属性。

#define EAS(graph,n,e)

这是 igraph_cattribute_EAS() 的简写形式。

参数: 

:

图。

n:

属性的名称。

e:

边的 ID。

返回值: 

属性的值。

3.1.31. igraph_cattribute_EASV — 查询多个边的字符串边属性。

igraph_error_t igraph_cattribute_EASV(const igraph_t *graph, const char *name,
                           igraph_es_t eids, igraph_strvector_t *result);

参数: 

:

输入图。

name:

属性的名称。

vids:

要查询的边。

result:

指向已初始化的字符串向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

时间复杂度:O(e),其中 e 是 'eids' 中边的数量。(我们假设字符串属性具有有限的长度。)

3.1.32. EASV — 查询所有边的字符串边属性。

#define EASV(graph,n,vec)

这是 igraph_cattribute_EASV() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vec:

指向已初始化的字符串向量的指针,结果存储在此处。如果需要,它将被调整大小。

返回值: 

错误代码。

3.2. 设置属性

3.2.1. igraph_cattribute_GAN_set — 设置数值型图属性。
3.2.2. SETGAN — 设置数值型图属性
3.2.3. igraph_cattribute_GAB_set — 设置布尔型图属性。
3.2.4. SETGAB — 设置布尔型图属性
3.2.5. igraph_cattribute_GAS_set — 设置字符串图属性。
3.2.6. SETGAS — 设置字符串图属性
3.2.7. igraph_cattribute_VAN_set — 设置数值型顶点属性。
3.2.8. SETVAN — 设置数值型顶点属性
3.2.9. igraph_cattribute_VAB_set — 设置布尔型顶点属性。
3.2.10. SETVAB — 设置布尔型顶点属性
3.2.11. igraph_cattribute_VAS_set — 设置字符串顶点属性。
3.2.12. SETVAS — 设置字符串顶点属性
3.2.13. igraph_cattribute_EAN_set — 设置数值型边属性。
3.2.14. SETEAN — 设置数值型边属性
3.2.15. igraph_cattribute_EAB_set — 设置布尔型边属性。
3.2.16. SETEAB — 设置布尔型边属性
3.2.17. igraph_cattribute_EAS_set — 设置字符串边属性。
3.2.18. SETEAS — 设置字符串边属性
3.2.19. igraph_cattribute_VAN_setv — 为所有顶点设置数值型顶点属性。
3.2.20. SETVANV — 为所有顶点设置数值型顶点属性
3.2.21. igraph_cattribute_VAB_setv — 为所有顶点设置布尔型顶点属性。
3.2.22. SETVABV — 为所有顶点设置布尔型顶点属性
3.2.23. igraph_cattribute_VAS_setv — 为所有顶点设置字符串顶点属性。
3.2.24. SETVASV — 为所有顶点设置字符串顶点属性
3.2.25. igraph_cattribute_EAN_setv — 为所有边设置数值型边属性。
3.2.26. SETEANV — 为所有边设置数值型边属性
3.2.27. igraph_cattribute_EAB_setv — 为所有边设置布尔型边属性。
3.2.28. SETEABV — 为所有边设置布尔型边属性
3.2.29. igraph_cattribute_EAS_setv — 为所有边设置字符串边属性。
3.2.30. SETEASV — 为所有边设置字符串边属性

3.2.1. igraph_cattribute_GAN_set — 设置数值型图属性。

igraph_error_t igraph_cattribute_GAN_set(igraph_t *graph, const char *name,
                              igraph_real_t value);

参数: 

:

图。

name:

图属性的名称。如果尚不存在此类属性,则将添加它。

value:

图属性的(新)值。

返回值: 

错误代码。

\se 如果您想减少输入,请参阅 SETGAN。时间复杂度:O(1)。

3.2.2. SETGAN — 设置数值型图属性

#define SETGAN(graph,n,value)

这是 igraph_cattribute_GAN_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

value:

属性的新值。

返回值: 

错误代码。

3.2.3. igraph_cattribute_GAB_set — 设置布尔型图属性。

igraph_error_t igraph_cattribute_GAB_set(igraph_t *graph, const char *name,
                              igraph_bool_t value);

参数: 

:

图。

name:

图属性的名称。如果尚不存在此类属性,则将添加它。

value:

图属性的(新)值。

返回值: 

错误代码。

\se 如果您想减少输入,请参阅 SETGAN。时间复杂度:O(1)。

3.2.4. SETGAB — 设置布尔型图属性

#define SETGAB(graph,n,value)

这是 igraph_cattribute_GAB_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

value:

属性的新值。

返回值: 

错误代码。

3.2.5. igraph_cattribute_GAS_set — 设置字符串图属性。

igraph_error_t igraph_cattribute_GAS_set(igraph_t *graph, const char *name,
                              const char *value);

参数: 

:

图。

name:

图属性的名称。如果尚不存在此类属性,则将添加它。

value:

图属性的(新)值。它将被复制。

返回值: 

错误代码。

\se 如果您想减少输入,请参阅 SETGAS。时间复杂度:O(1)。

3.2.6. SETGAS — 设置字符串图属性

#define SETGAS(graph,n,value)

这是 igraph_cattribute_GAS_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

value:

属性的新值。

返回值: 

错误代码。

3.2.7. igraph_cattribute_VAN_set — 设置数值型顶点属性。

igraph_error_t igraph_cattribute_VAN_set(igraph_t *graph, const char *name,
                              igraph_integer_t vid, igraph_real_t value);

如果属性尚不存在,则将添加该属性。如果存在,它将被覆盖。对于 vid 中包含的所有顶点,将设置相同的 value

参数: 

:

图。

name:

属性的名称。

vid:

要设置属性的顶点。

value:

属性的(新)值。

返回值: 

错误代码。

另请参阅: 

SETVAN 提供了一种更简单的方法。

时间复杂度:O(n),如果属性是新的,则为顶点的数量,否则为 O(|vid|)。

3.2.8. SETVAN — 设置数值型顶点属性

#define SETVAN(graph,n,vid,value)

这是 igraph_cattribute_VAN_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vid:

要设置的顶点的 ID。

value:

属性的新值。

返回值: 

错误代码。

3.2.9. igraph_cattribute_VAB_set — 设置布尔型顶点属性。

igraph_error_t igraph_cattribute_VAB_set(igraph_t *graph, const char *name,
                              igraph_integer_t vid, igraph_bool_t value);

如果属性尚不存在,则将添加该属性。如果存在,它将被覆盖。对于 vid 中包含的所有顶点,将设置相同的 value

参数: 

:

图。

name:

属性的名称。

vid:

要设置属性的顶点。

value:

属性的(新)值。

返回值: 

错误代码。

另请参阅: 

SETVAB 提供了一种更简单的方法。

时间复杂度:O(n),如果属性是新的,则为顶点的数量,否则为 O(|vid|)。

3.2.10. SETVAB — 设置布尔型顶点属性

#define SETVAB(graph,n,vid,value)

这是 igraph_cattribute_VAB_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vid:

要设置的顶点的 ID。

value:

属性的新值。

返回值: 

错误代码。

3.2.11. igraph_cattribute_VAS_set — 设置字符串顶点属性。

igraph_error_t igraph_cattribute_VAS_set(igraph_t *graph, const char *name,
                              igraph_integer_t vid, const char *value);

如果属性尚不存在,则将添加该属性。如果存在,它将被覆盖。对于 vid 中包含的所有顶点,将设置相同的 value

参数: 

:

图。

name:

属性的名称。

vid:

要设置属性的顶点。

value:

属性的(新)值。

返回值: 

错误代码。

另请参阅: 

SETVAS 提供了一种更简单的方法。

时间复杂度:O(n*l),n 是顶点的数量,l 是要设置的字符串的长度。如果属性不是新的,则仅为 O(|vid|*l)。

3.2.12. SETVAS — 设置字符串顶点属性

#define SETVAS(graph,n,vid,value)

这是 igraph_cattribute_VAS_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

vid:

要设置的顶点的 ID。

value:

属性的新值。

返回值: 

错误代码。

3.2.13. igraph_cattribute_EAN_set — 设置数值型边属性。

igraph_error_t igraph_cattribute_EAN_set(igraph_t *graph, const char *name,
                              igraph_integer_t eid, igraph_real_t value);

如果属性尚不存在,则将添加该属性。如果存在,它将被覆盖。对于 vid 中包含的所有边,将设置相同的 value

参数: 

:

图。

name:

属性的名称。

eid:

要设置属性的边。

value:

属性的(新)值。

返回值: 

错误代码。

另请参阅: 

SETEAN 提供了一种更简单的方法。

时间复杂度:O(e),如果属性是新的,则为边的数量,否则为 O(|eid|)。

3.2.14. SETEAN — 设置数值型边属性

#define SETEAN(graph,n,eid,value)

这是 igraph_cattribute_EAN_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

eid:

要设置的边的 ID。

value:

属性的新值。

返回值: 

错误代码。

3.2.15. igraph_cattribute_EAB_set — 设置布尔型边属性。

igraph_error_t igraph_cattribute_EAB_set(igraph_t *graph, const char *name,
                              igraph_integer_t eid, igraph_bool_t value);

如果属性尚不存在,则将添加该属性。如果存在,它将被覆盖。对于 vid 中包含的所有边,将设置相同的 value

参数: 

:

图。

name:

属性的名称。

eid:

要设置属性的边。

value:

属性的(新)值。

返回值: 

错误代码。

另请参阅: 

SETEAB 提供了一种更简单的方法。

时间复杂度:O(e),如果属性是新的,则为边的数量,否则为 O(|eid|)。

3.2.16. SETEAB — 设置布尔型边属性

#define SETEAB(graph,n,eid,value)

这是 igraph_cattribute_EAB_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

eid:

要设置的边的 ID。

value:

属性的新值。

返回值: 

错误代码。

3.2.17. igraph_cattribute_EAS_set — 设置字符串边属性。

igraph_error_t igraph_cattribute_EAS_set(igraph_t *graph, const char *name,
                              igraph_integer_t eid, const char *value);

如果属性尚不存在,则将添加该属性。如果存在,它将被覆盖。对于 vid 中包含的所有边,将设置相同的 value

参数: 

:

图。

name:

属性的名称。

eid:

要设置属性的边。

value:

属性的(新)值。

返回值: 

错误代码。

另请参阅: 

SETEAS 提供了一种更简单的方法。

时间复杂度:O(e*l),n 是边的数量,l 是要设置的字符串的长度。如果属性不是新的,则仅为 O(|eid|*l)。

3.2.18. SETEAS — 设置字符串边属性

#define SETEAS(graph,n,eid,value)

这是 igraph_cattribute_EAS_set() 的简写形式。

参数: 

:

图。

n:

属性的名称。

eid:

要设置的边的 ID。

value:

属性的新值。

返回值: 

错误代码。

3.2.19. igraph_cattribute_VAN_setv — 为所有顶点设置数值型顶点属性。

igraph_error_t igraph_cattribute_VAN_setv(igraph_t *graph, const char *name,
                               const igraph_vector_t *v);

如果属性尚不存在,则将添加该属性。

参数: 

:

图。

name:

属性的名称。

v:

新的属性值。此向量的长度必须与顶点的数量匹配。

返回值: 

错误代码。

另请参阅: 

SETVANV 提供了一种更简单的方法。

时间复杂度:O(n),顶点的数量。

3.2.20. SETVANV — 为所有顶点设置数值型顶点属性

#define SETVANV(graph,n,v)

这是 igraph_cattribute_VAN_setv() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

包含属性新值的向量。

返回值: 

错误代码。

3.2.21. igraph_cattribute_VAB_setv — 为所有顶点设置布尔型顶点属性。

igraph_error_t igraph_cattribute_VAB_setv(igraph_t *graph, const char *name,
                               const igraph_vector_bool_t *v);

如果属性尚不存在,则将添加该属性。

参数: 

:

图。

name:

属性的名称。

v:

新的属性值。此布尔向量的长度必须与顶点的数量匹配。

返回值: 

错误代码。

另请参阅: 

SETVANV 提供了一种更简单的方法。

时间复杂度:O(n),顶点的数量。

3.2.22. SETVABV — 为所有顶点设置布尔型顶点属性

#define SETVABV(graph,n,v)

这是 igraph_cattribute_VAB_setv() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

包含属性新值的向量。

返回值: 

错误代码。

3.2.23. igraph_cattribute_VAS_setv — 为所有顶点设置字符串顶点属性。

igraph_error_t igraph_cattribute_VAS_setv(igraph_t *graph, const char *name,
                               const igraph_strvector_t *sv);

如果属性尚不存在,则将添加该属性。

参数: 

:

图。

name:

属性的名称。

sv:

字符串向量,新的属性值。此向量的长度必须与顶点的数量匹配。

返回值: 

错误代码。

另请参阅: 

SETVASV 提供了一种更简单的方法。

时间复杂度:O(n+l),n 是顶点的数量,l 是字符串的总长度。

3.2.24. SETVASV — 为所有顶点设置字符串顶点属性

#define SETVASV(graph,n,v)

这是 igraph_cattribute_VAS_setv() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

包含属性新值的向量。

返回值: 

错误代码。

3.2.25. igraph_cattribute_EAN_setv — 为所有边设置数值型边属性。

igraph_error_t igraph_cattribute_EAN_setv(igraph_t *graph, const char *name,
                               const igraph_vector_t *v);

如果属性尚不存在,则将添加该属性。

参数: 

:

图。

name:

属性的名称。

v:

新的属性值。此向量的长度必须与边的数量匹配。

返回值: 

错误代码。

另请参阅: 

SETEANV 提供了一种更简单的方法。

时间复杂度:O(e),边的数量。

3.2.26. SETEANV — 为所有边设置数值型边属性

#define SETEANV(graph,n,v)

这是 igraph_cattribute_EAN_setv() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

包含属性新值的向量。

3.2.27. igraph_cattribute_EAB_setv — 为所有边设置布尔型边属性。

igraph_error_t igraph_cattribute_EAB_setv(igraph_t *graph, const char *name,
                               const igraph_vector_bool_t *v);

如果属性尚不存在,则将添加该属性。

参数: 

:

图。

name:

属性的名称。

v:

新的属性值。此向量的长度必须与边的数量匹配。

返回值: 

错误代码。

另请参阅: 

SETEABV 提供了一种更简单的方法。

时间复杂度:O(e),边的数量。

3.2.28. SETEABV — 为所有边设置布尔型边属性

#define SETEABV(graph,n,v)

这是 igraph_cattribute_EAB_setv() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

包含属性新值的向量。

3.2.29. igraph_cattribute_EAS_setv — 为所有边设置字符串边属性。

igraph_error_t igraph_cattribute_EAS_setv(igraph_t *graph, const char *name,
                               const igraph_strvector_t *sv);

如果属性尚不存在,则将添加该属性。

参数: 

:

图。

name:

属性的名称。

sv:

字符串向量,新的属性值。此向量的长度必须与边的数量匹配。

返回值: 

错误代码。

另请参阅: 

SETEASV 提供了一种更简单的方法。

时间复杂度:O(e+l),e 是边的数量,l 是字符串的总长度。

3.2.30. SETEASV — 为所有边设置字符串边属性

#define SETEASV(graph,n,v)

这是 igraph_cattribute_EAS_setv() 的简写形式。

参数: 

:

图。

n:

属性的名称。

v:

包含属性新值的向量。

3.3. 移除属性

3.3.1. igraph_cattribute_remove_g — 移除图属性。

void igraph_cattribute_remove_g(igraph_t *graph, const char *name);

参数: 

:

图对象。

name:

要移除的图属性的名称。

另请参阅: 

DELGA 提供了一种更简单的方法。

3.3.2. DELGA — 移除图属性。

#define DELGA(graph,n)

igraph_cattribute_remove_g() 的简写形式。

参数: 

:

图。

n:

要移除的属性的名称。

3.3.3. igraph_cattribute_remove_v — 移除顶点属性。

void igraph_cattribute_remove_v(igraph_t *graph, const char *name);

参数: 

:

图对象。

name:

要移除的顶点属性的名称。

另请参阅: 

DELVA 提供了一种更简单的方法。

3.3.4. DELVA — 移除顶点属性。

#define DELVA(graph,n)

igraph_cattribute_remove_v() 的简写形式。

参数: 

:

图。

n:

要移除的属性的名称。

3.3.5. igraph_cattribute_remove_e — 移除边属性。

void igraph_cattribute_remove_e(igraph_t *graph, const char *name);

参数: 

:

图对象。

name:

要移除的边属性的名称。

另请参阅: 

DELEA 提供了一种更简单的方法。

3.3.6. DELEA — 移除边属性。

#define DELEA(graph,n)

igraph_cattribute_remove_e() 的简写形式。

参数: 

:

图。

n:

要移除的属性的名称。

3.3.7. igraph_cattribute_remove_all — 移除所有图/顶点/边属性。

void igraph_cattribute_remove_all(igraph_t *graph, igraph_bool_t g,
                                  igraph_bool_t v, igraph_bool_t e);

参数: 

:

图对象。

g:

布尔值,是否移除图属性。

v:

布尔值,是否移除顶点属性。

e:

布尔值,是否移除边属性。

另请参阅: 

DELGAS, DELVAS, DELEAS, DELALL 提供了更简单的方法。

3.3.8. DELGAS — 移除所有图属性。

#define DELGAS(graph)

调用 igraph_cattribute_remove_all()

参数: 

:

图。

3.3.9. DELVAS — 移除所有顶点属性。

#define DELVAS(graph)

调用 igraph_cattribute_remove_all()

参数: 

:

图。

3.3.10. DELEAS — 移除所有边属性。

#define DELEAS(graph)

调用 igraph_cattribute_remove_all()

参数: 

:

图。

3.3.11. DELALL — 移除所有属性。

#define DELALL(graph)

将移除所有图、顶点和边属性。调用 igraph_cattribute_remove_all()

参数: 

:

图。

3.4. 自定义属性组合函数

C 属性处理程序支持通过用户定义的函数将多个顶点或边的属性组合成单个属性,以进行顶点或边收缩操作。这是通过将属性组合的类型设置为 IGRAPH_ATTRIBUTE_COMBINE_FUNCTION 并在 igraph_attribute_combination()igraph_attribute_combination_add() 中指定属性组合时传入指向自定义组合函数的指针来实现的。对于 C 属性处理程序,函数的签名取决于底层属性的类型。对于数值型属性,使用

 igraph_error_t function(const igraph_vector_t *input, igraph_real_t *output); 

其中 input 将接收一个向量,其中包含要组合的所有顶点或边的属性值,并且 output 必须由该函数填充为组合值。类似地,对于布尔型属性,该函数在 input 中获取一个布尔向量,并且必须在 output 中返回组合的布尔值

 igraph_error_t function(const igraph_vector_bool_t *input, igraph_bool_t *output); 

对于字符串属性,签名略有不同

 igraph_error_t function(const igraph_strvector_t *input, char **output); 

对于字符串,输入向量中的所有字符串都由 igraph 拥有,并且不得在组合处理程序中修改或释放。在 output 中返回给调用者的字符串仍然由调用者拥有;igraph 将复制它并将该副本存储在保存顶点或边属性的数据结构的相应部分中。