# net::node

存储了网络中一个格点内的信息 More...

#include <node.hpp>

# Public Types

Name
using half_edge< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > EdgeType
using NodeKey NodeKeyType
using NodeVal NodeValType
using EdgeKey EdgeKeyType
using EdgeVal EdgeValType
using Trait TraitType

# Public Functions

Name
node() =default
node(const NodeKey & k)
node(const NodeKey & k, const NodeVal & s)
node(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & ) =default
node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & operator=(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & ) =default
node(node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > && ) =default
node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & operator=(node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > && ) =default
half_edge< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::EdgeItrType add_half_edge(const EdgeKey & ind1, const EdgeVal & edgev)
添加一条半边
void clean()
template <typename Condition >
void
delete_half_edge(Condition && cond)
根据条件cond(edge_itr)是否为真,决定是否删除一条半边
template <typename Condition >
void
break_edge(Condition && cond)
根据条件cond(edge_itr)是否为真,决定是否将一条边拆开,成为两条不相连的半边
template <typename Condition >
void
delete_edge(Condition && cond)
根据条件cond(edge_itr)是否为真,决定是否删除一条半边,同时删除与其相连的半边
void delete_nbedge()
根据条件cond(edge_itr)是否为真,决定是否删除半边所连接的另一条半边
void reset_nbkey_of_nb(const NodeKey & newkey)
对格点的每一条边,更新邻居对应的边的nbkey为newkey。用于格点的改名。
template <typename absorb_type ,typename contract_type >
void
absorb_nb(const NodeKey & nbkey, const NodeVal & nbval, const absorb_type & absorb_fun, const contract_type & contract_fun)
对格点的指定nbkey每一条边,记录这条边的(ind,nbind),吸收边的val到格点的val,然后删掉这条边。
template <typename absorb_type ,typename Condition >
void
harmless_absorb_nb(NodeVal & thisval, std::set< std::pair< EdgeKey, EdgeKey >, typename Trait::edge2key_less > & ind_pairs, const absorb_type & absorb_fun, Condition && cond) const
对格点的指定nbkey每一条边,如果符合条件,记录这条边的(ind,nbind),吸收边的val到给定的的val,将ind-pair填入ind_pairs
void transfer_edge(const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit)
对格点的每一条边,将它转移为格点newit的边
template <typename Condition >
void
transfer_edge(const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit, Condition && cond)
对格点的每一条边,如果条件成立,将它和邻居的这条边转移为格点newit和邻居的边
template <typename Condition >
void
transfer_edge(const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit, const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit2, Condition && cond)
对格点的每一条边,如果条件成立,将它和邻居的这条边转移为格点newit和邻居的边; 否则,将它和邻居的这条边转移为格点newit2和邻居的边
void relink(std::map< NodeKey, node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >, typename Trait::nodekey_less > & nodes)
更新所有半边的nbitr和nbegitr指针
bool consistency(const std::map< NodeKey, node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >, typename Trait::nodekey_less > & nodes, const NodeKey & t, std::ostream & diagnosis) const
检查格点的一致性
void fope(std::function< NodeVal(const NodeVal &)> f1, std::function< EdgeVal(const EdgeVal &)> f2)
利用函数更新格点和边上的信息
template <typename NodeType2 >
NodeType2
fmap(const NodeKey & this_key, std::function< typename NodeType2::NodeValType(const NodeVal &)> f1, std::function< typename NodeType2::EdgeValType(const EdgeVal &)> f2) const
从旧的格点得到新的格点,其格点和边上的信息由旧的格点通过映射得到
template <typename NodeType2 >
NodeType2
fmap(const NodeKey & new_key, std::function< typename NodeType2::NodeValType(const NodeVal &)> f1, std::function< typename NodeType2::EdgeValType(const EdgeVal &)> f2, std::function< typename NodeType2::NodeKeyType(const NodeKey &)> f3, std::function< typename NodeType2::EdgeKeyType(const EdgeKey &)> f4) const
从旧的格点得到新的格点,其格点和边的名字,以及格点和边上的信息,由旧的格点通过映射得到
template <typename NodeVal2 ,typename EdgeVal2 ,typename Trait2 >
node< NodeVal2, EdgeVal2, NodeKey, EdgeKey, Trait2 >
gfmap(const NodeKey & this_key, std::function< NodeVal2(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &)> f1, std::function< EdgeVal2(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &, const EdgeKey &)> f2) const
从旧的格点得到新的格点,其格点和边上的信息由旧的格点通过映射得到
void gfope(std::function< NodeVal(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &)> f1, std::function< EdgeVal(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &, const EdgeKey &)> f2)
利用函数更新格点和边上的信息

# Public Attributes

Name
NodeKey key
格点的名字
NodeVal val
格点上附着的信息
std::map< EdgeKey, half_edge< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >, typename Trait::edgekey_less > edges
格点所包含的半边, 存储了半边之间如何连接的信息

# Friends

Name
std::ostream & output_node_text(std::ostream & , const node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & )
格点的字符串输出
std::istream & input_node_text(std::istream & , node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & )
格点的字符串输入
std::ostream & output_node_bin(std::ostream & , const node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & )
格点的二进制输出
std::istream & input_node_bin(std::istream & , node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & )
格点的二进制输入

# Detailed Description

template <typename NodeVal ,
typename EdgeVal ,
typename NodeKey ,
typename EdgeKey ,
typename Trait >
class net::node;

存储了网络中一个格点内的信息

Template Parameters:

  • NodeVal 每个格点中附着的信息类型
  • EdgeVal 每个边上附着的信息类型
  • NodeKey 格点名字的类型
  • EdgeKey 边的名字的类型
  • Trait 以上类型的特征,包括输入输出和比较

See:

每个格点中有一个中心元素val, 和一些半边 每个边拥有一个名字和一个half edge对象

# Public Types Documentation

# using EdgeType

using net::node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::EdgeType =  half_edge<NodeVal, EdgeVal, NodeKey, EdgeKey, Trait>;

# using NodeKeyType

using net::node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::NodeKeyType =  NodeKey;

# using NodeValType

using net::node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::NodeValType =  NodeVal;

# using EdgeKeyType

using net::node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::EdgeKeyType =  EdgeKey;

# using EdgeValType

using net::node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::EdgeValType =  EdgeVal;

# using TraitType

using net::node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::TraitType =  Trait;

# Public Functions Documentation

# function node

node() =default

# function node

inline node(
    const NodeKey & k
)

# function node

inline node(
    const NodeKey & k,
    const NodeVal & s
)

# function node

node(
    const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & 
) =default

# function operator=

node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & operator=(
    const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & 
) =default

# function node

node(
    node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > && 
) =default

# function operator=

node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > & operator=(
    node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > && 
) =default

# function add_half_edge

half_edge< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::EdgeItrType add_half_edge(
    const EdgeKey & ind1,
    const EdgeVal & edgev
)

添加一条半边

# function clean

void clean()

# function delete_half_edge

template <typename Condition >
void delete_half_edge(
    Condition && cond
)

根据条件cond(edge_itr)是否为真,决定是否删除一条半边

如果要删除的半边连接着另一条半边,那么保留另一条半边,使之悬空

# function break_edge

template <typename Condition >
void break_edge(
    Condition && cond
)

根据条件cond(edge_itr)是否为真,决定是否将一条边拆开,成为两条不相连的半边

# function delete_edge

template <typename Condition >
void delete_edge(
    Condition && cond
)

根据条件cond(edge_itr)是否为真,决定是否删除一条半边,同时删除与其相连的半边

# function delete_nbedge

void delete_nbedge()

根据条件cond(edge_itr)是否为真,决定是否删除半边所连接的另一条半边

# function reset_nbkey_of_nb

void reset_nbkey_of_nb(
    const NodeKey & newkey
)

对格点的每一条边,更新邻居对应的边的nbkey为newkey。用于格点的改名。

# function absorb_nb

template <typename absorb_type ,
typename contract_type >
void absorb_nb(
    const NodeKey & nbkey,
    const NodeVal & nbval,
    const absorb_type & absorb_fun,
    const contract_type & contract_fun
)

对格点的指定nbkey每一条边,记录这条边的(ind,nbind),吸收边的val到格点的val,然后删掉这条边。

A(this) <-—> B(nb) <-—> C => A <-— B <-—> C

# function harmless_absorb_nb

template <typename absorb_type ,
typename Condition >
void harmless_absorb_nb(
    NodeVal & thisval,
    std::set< std::pair< EdgeKey, EdgeKey >, typename Trait::edge2key_less > & ind_pairs,
    const absorb_type & absorb_fun,
    Condition && cond
) const

对格点的指定nbkey每一条边,如果符合条件,记录这条边的(ind,nbind),吸收边的val到给定的的val,将ind-pair填入ind_pairs

# function transfer_edge

void transfer_edge(
    const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit
)

对格点的每一条边,将它转移为格点newit的边

# function transfer_edge

template <typename Condition >
void transfer_edge(
    const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit,
    Condition && cond
)

对格点的每一条边,如果条件成立,将它和邻居的这条边转移为格点newit和邻居的边

# function transfer_edge

template <typename Condition >
void transfer_edge(
    const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit,
    const typename network< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >::IterNode & newit2,
    Condition && cond
)

对格点的每一条边,如果条件成立,将它和邻居的这条边转移为格点newit和邻居的边; 否则,将它和邻居的这条边转移为格点newit2和邻居的边

void relink(
    std::map< NodeKey, node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >, typename Trait::nodekey_less > & nodes
)

更新所有半边的nbitr和nbegitr指针

# function consistency

bool consistency(
    const std::map< NodeKey, node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >, typename Trait::nodekey_less > & nodes,
    const NodeKey & t,
    std::ostream & diagnosis
) const

检查格点的一致性

# function fope

void fope(
    std::function< NodeVal(const NodeVal &)> f1,
    std::function< EdgeVal(const EdgeVal &)> f2
)

利用函数更新格点和边上的信息

# function fmap

template <typename NodeType2 >
NodeType2 fmap(
    const NodeKey & this_key,
    std::function< typename NodeType2::NodeValType(const NodeVal &)> f1,
    std::function< typename NodeType2::EdgeValType(const EdgeVal &)> f2
) const

从旧的格点得到新的格点,其格点和边上的信息由旧的格点通过映射得到

# function fmap

template <typename NodeType2 >
NodeType2 fmap(
    const NodeKey & new_key,
    std::function< typename NodeType2::NodeValType(const NodeVal &)> f1,
    std::function< typename NodeType2::EdgeValType(const EdgeVal &)> f2,
    std::function< typename NodeType2::NodeKeyType(const NodeKey &)> f3,
    std::function< typename NodeType2::EdgeKeyType(const EdgeKey &)> f4
) const

从旧的格点得到新的格点,其格点和边的名字,以及格点和边上的信息,由旧的格点通过映射得到

# function gfmap

template <typename NodeVal2 ,
typename EdgeVal2 ,
typename Trait2 >
node< NodeVal2, EdgeVal2, NodeKey, EdgeKey, Trait2 > gfmap(
    const NodeKey & this_key,
    std::function< NodeVal2(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &)> f1,
    std::function< EdgeVal2(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &, const EdgeKey &)> f2
) const

从旧的格点得到新的格点,其格点和边上的信息由旧的格点通过映射得到

# function gfope

void gfope(
    std::function< NodeVal(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &)> f1,
    std::function< EdgeVal(const node< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait > &, const EdgeKey &)> f2
)

利用函数更新格点和边上的信息

# Public Attributes Documentation

# variable key

NodeKey key;

格点的名字

# variable val

NodeVal val;

格点上附着的信息

# variable edges

std::map< EdgeKey, half_edge< NodeVal, EdgeVal, NodeKey, EdgeKey, Trait >, typename Trait::edgekey_less > edges;

格点所包含的半边, 存储了半边之间如何连接的信息

See: half_edge

# Friends

# friend output_node_text

friend std::ostream & output_node_text(
    std::ostream & ,
    const node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & 
);

格点的字符串输出

# friend input_node_text

friend std::istream & input_node_text(
    std::istream & ,
    node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & 
);

格点的字符串输入

# friend output_node_bin

friend std::ostream & output_node_bin(
    std::ostream & ,
    const node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & 
);

格点的二进制输出

# friend input_node_bin

friend std::istream & input_node_bin(
    std::istream & ,
    node< NodeVal1, EdgeVal1, NodeKey1, EdgeKey1, Trait1 > & 
);

格点的二进制输入


Updated on 15 June 2022 at 16:04:19 CST