diff options
author | Jeff Vander Stoep <jeffv@google.com> | 2015-12-11 14:55:57 -0800 |
---|---|---|
committer | Jeff Vander Stoep <jeffv@google.com> | 2015-12-11 14:55:57 -0800 |
commit | fb12873166154080b251943af9349c82d2cc59fd (patch) | |
tree | e8a32244d29a9850885d10d61a9668e13f11ef75 | |
parent | 8f104e0b76a7cdb1c31a52c03d3ce47a0eea156c (diff) | |
download | platform_prebuilts_python_linux-x86_2.7.5-fb12873166154080b251943af9349c82d2cc59fd.tar.gz platform_prebuilts_python_linux-x86_2.7.5-fb12873166154080b251943af9349c82d2cc59fd.tar.bz2 platform_prebuilts_python_linux-x86_2.7.5-fb12873166154080b251943af9349c82d2cc59fd.zip |
selinux: update prebuilt tools
Audit2allow, audit2why, and sesearch are all broken with the update to
upstream policy version 30. Updating prebuilts fixes these issues.
Change-Id: I305ffa5b153a21304dd6d8eece1577f9cbf5d142
397 files changed, 603 insertions, 91199 deletions
diff --git a/lib/python2.7/site-packages/selinux/__init__.py b/lib/python2.7/site-packages/selinux/__init__.py index b81b031..7a14d18 100644 --- a/lib/python2.7/site-packages/selinux/__init__.py +++ b/lib/python2.7/site-packages/selinux/__init__.py @@ -69,7 +69,7 @@ except AttributeError: _newclass = 0 -import shutil, os, stat +import shutil, os, errno, stat DISABLED = -1 PERMISSIVE = 0 @@ -87,7 +87,12 @@ def restorecon(path, recursive=False): status, context = matchpathcon(path, mode) if status == 0: - status, oldcontext = lgetfilecon(path) + try: + status, oldcontext = lgetfilecon(path) + except OSError as e: + if e.errno != errno.ENODATA: + raise + oldcontext = None if context != oldcontext: lsetfilecon(path, context) @@ -405,1031 +410,6 @@ selinux_status_policyload = _selinux.selinux_status_policyload def selinux_status_deny_unknown(): return _selinux.selinux_status_deny_unknown() selinux_status_deny_unknown = _selinux.selinux_status_deny_unknown -COMMON_FILE__IOCTL = _selinux.COMMON_FILE__IOCTL -COMMON_FILE__READ = _selinux.COMMON_FILE__READ -COMMON_FILE__WRITE = _selinux.COMMON_FILE__WRITE -COMMON_FILE__CREATE = _selinux.COMMON_FILE__CREATE -COMMON_FILE__GETATTR = _selinux.COMMON_FILE__GETATTR -COMMON_FILE__SETATTR = _selinux.COMMON_FILE__SETATTR -COMMON_FILE__LOCK = _selinux.COMMON_FILE__LOCK -COMMON_FILE__RELABELFROM = _selinux.COMMON_FILE__RELABELFROM -COMMON_FILE__RELABELTO = _selinux.COMMON_FILE__RELABELTO -COMMON_FILE__APPEND = _selinux.COMMON_FILE__APPEND -COMMON_FILE__UNLINK = _selinux.COMMON_FILE__UNLINK -COMMON_FILE__LINK = _selinux.COMMON_FILE__LINK -COMMON_FILE__RENAME = _selinux.COMMON_FILE__RENAME -COMMON_FILE__EXECUTE = _selinux.COMMON_FILE__EXECUTE -COMMON_FILE__SWAPON = _selinux.COMMON_FILE__SWAPON -COMMON_FILE__QUOTAON = _selinux.COMMON_FILE__QUOTAON -COMMON_FILE__MOUNTON = _selinux.COMMON_FILE__MOUNTON -COMMON_SOCKET__IOCTL = _selinux.COMMON_SOCKET__IOCTL -COMMON_SOCKET__READ = _selinux.COMMON_SOCKET__READ -COMMON_SOCKET__WRITE = _selinux.COMMON_SOCKET__WRITE -COMMON_SOCKET__CREATE = _selinux.COMMON_SOCKET__CREATE -COMMON_SOCKET__GETATTR = _selinux.COMMON_SOCKET__GETATTR -COMMON_SOCKET__SETATTR = _selinux.COMMON_SOCKET__SETATTR -COMMON_SOCKET__LOCK = _selinux.COMMON_SOCKET__LOCK -COMMON_SOCKET__RELABELFROM = _selinux.COMMON_SOCKET__RELABELFROM -COMMON_SOCKET__RELABELTO = _selinux.COMMON_SOCKET__RELABELTO -COMMON_SOCKET__APPEND = _selinux.COMMON_SOCKET__APPEND -COMMON_SOCKET__BIND = _selinux.COMMON_SOCKET__BIND -COMMON_SOCKET__CONNECT = _selinux.COMMON_SOCKET__CONNECT -COMMON_SOCKET__LISTEN = _selinux.COMMON_SOCKET__LISTEN -COMMON_SOCKET__ACCEPT = _selinux.COMMON_SOCKET__ACCEPT -COMMON_SOCKET__GETOPT = _selinux.COMMON_SOCKET__GETOPT -COMMON_SOCKET__SETOPT = _selinux.COMMON_SOCKET__SETOPT -COMMON_SOCKET__SHUTDOWN = _selinux.COMMON_SOCKET__SHUTDOWN -COMMON_SOCKET__RECVFROM = _selinux.COMMON_SOCKET__RECVFROM -COMMON_SOCKET__SENDTO = _selinux.COMMON_SOCKET__SENDTO -COMMON_SOCKET__RECV_MSG = _selinux.COMMON_SOCKET__RECV_MSG -COMMON_SOCKET__SEND_MSG = _selinux.COMMON_SOCKET__SEND_MSG -COMMON_SOCKET__NAME_BIND = _selinux.COMMON_SOCKET__NAME_BIND -COMMON_IPC__CREATE = _selinux.COMMON_IPC__CREATE -COMMON_IPC__DESTROY = _selinux.COMMON_IPC__DESTROY -COMMON_IPC__GETATTR = _selinux.COMMON_IPC__GETATTR -COMMON_IPC__SETATTR = _selinux.COMMON_IPC__SETATTR -COMMON_IPC__READ = _selinux.COMMON_IPC__READ -COMMON_IPC__WRITE = _selinux.COMMON_IPC__WRITE -COMMON_IPC__ASSOCIATE = _selinux.COMMON_IPC__ASSOCIATE -COMMON_IPC__UNIX_READ = _selinux.COMMON_IPC__UNIX_READ -COMMON_IPC__UNIX_WRITE = _selinux.COMMON_IPC__UNIX_WRITE -COMMON_DATABASE__CREATE = _selinux.COMMON_DATABASE__CREATE -COMMON_DATABASE__DROP = _selinux.COMMON_DATABASE__DROP -COMMON_DATABASE__GETATTR = _selinux.COMMON_DATABASE__GETATTR -COMMON_DATABASE__SETATTR = _selinux.COMMON_DATABASE__SETATTR -COMMON_DATABASE__RELABELFROM = _selinux.COMMON_DATABASE__RELABELFROM -COMMON_DATABASE__RELABELTO = _selinux.COMMON_DATABASE__RELABELTO -FILESYSTEM__MOUNT = _selinux.FILESYSTEM__MOUNT -FILESYSTEM__REMOUNT = _selinux.FILESYSTEM__REMOUNT -FILESYSTEM__UNMOUNT = _selinux.FILESYSTEM__UNMOUNT -FILESYSTEM__GETATTR = _selinux.FILESYSTEM__GETATTR -FILESYSTEM__RELABELFROM = _selinux.FILESYSTEM__RELABELFROM -FILESYSTEM__RELABELTO = _selinux.FILESYSTEM__RELABELTO -FILESYSTEM__TRANSITION = _selinux.FILESYSTEM__TRANSITION -FILESYSTEM__ASSOCIATE = _selinux.FILESYSTEM__ASSOCIATE -FILESYSTEM__QUOTAMOD = _selinux.FILESYSTEM__QUOTAMOD -FILESYSTEM__QUOTAGET = _selinux.FILESYSTEM__QUOTAGET -DIR__IOCTL = _selinux.DIR__IOCTL -DIR__READ = _selinux.DIR__READ -DIR__WRITE = _selinux.DIR__WRITE -DIR__CREATE = _selinux.DIR__CREATE -DIR__GETATTR = _selinux.DIR__GETATTR -DIR__SETATTR = _selinux.DIR__SETATTR -DIR__LOCK = _selinux.DIR__LOCK -DIR__RELABELFROM = _selinux.DIR__RELABELFROM -DIR__RELABELTO = _selinux.DIR__RELABELTO -DIR__APPEND = _selinux.DIR__APPEND -DIR__UNLINK = _selinux.DIR__UNLINK -DIR__LINK = _selinux.DIR__LINK -DIR__RENAME = _selinux.DIR__RENAME -DIR__EXECUTE = _selinux.DIR__EXECUTE -DIR__SWAPON = _selinux.DIR__SWAPON -DIR__QUOTAON = _selinux.DIR__QUOTAON -DIR__MOUNTON = _selinux.DIR__MOUNTON -DIR__ADD_NAME = _selinux.DIR__ADD_NAME -DIR__REMOVE_NAME = _selinux.DIR__REMOVE_NAME -DIR__REPARENT = _selinux.DIR__REPARENT -DIR__SEARCH = _selinux.DIR__SEARCH -DIR__RMDIR = _selinux.DIR__RMDIR -DIR__OPEN = _selinux.DIR__OPEN -FILE__IOCTL = _selinux.FILE__IOCTL -FILE__READ = _selinux.FILE__READ -FILE__WRITE = _selinux.FILE__WRITE -FILE__CREATE = _selinux.FILE__CREATE -FILE__GETATTR = _selinux.FILE__GETATTR -FILE__SETATTR = _selinux.FILE__SETATTR -FILE__LOCK = _selinux.FILE__LOCK -FILE__RELABELFROM = _selinux.FILE__RELABELFROM -FILE__RELABELTO = _selinux.FILE__RELABELTO -FILE__APPEND = _selinux.FILE__APPEND -FILE__UNLINK = _selinux.FILE__UNLINK -FILE__LINK = _selinux.FILE__LINK -FILE__RENAME = _selinux.FILE__RENAME -FILE__EXECUTE = _selinux.FILE__EXECUTE -FILE__SWAPON = _selinux.FILE__SWAPON -FILE__QUOTAON = _selinux.FILE__QUOTAON -FILE__MOUNTON = _selinux.FILE__MOUNTON -FILE__EXECUTE_NO_TRANS = _selinux.FILE__EXECUTE_NO_TRANS -FILE__ENTRYPOINT = _selinux.FILE__ENTRYPOINT -FILE__EXECMOD = _selinux.FILE__EXECMOD -FILE__OPEN = _selinux.FILE__OPEN -LNK_FILE__IOCTL = _selinux.LNK_FILE__IOCTL -LNK_FILE__READ = _selinux.LNK_FILE__READ -LNK_FILE__WRITE = _selinux.LNK_FILE__WRITE -LNK_FILE__CREATE = _selinux.LNK_FILE__CREATE -LNK_FILE__GETATTR = _selinux.LNK_FILE__GETATTR -LNK_FILE__SETATTR = _selinux.LNK_FILE__SETATTR -LNK_FILE__LOCK = _selinux.LNK_FILE__LOCK -LNK_FILE__RELABELFROM = _selinux.LNK_FILE__RELABELFROM -LNK_FILE__RELABELTO = _selinux.LNK_FILE__RELABELTO -LNK_FILE__APPEND = _selinux.LNK_FILE__APPEND -LNK_FILE__UNLINK = _selinux.LNK_FILE__UNLINK -LNK_FILE__LINK = _selinux.LNK_FILE__LINK -LNK_FILE__RENAME = _selinux.LNK_FILE__RENAME -LNK_FILE__EXECUTE = _selinux.LNK_FILE__EXECUTE -LNK_FILE__SWAPON = _selinux.LNK_FILE__SWAPON -LNK_FILE__QUOTAON = _selinux.LNK_FILE__QUOTAON -LNK_FILE__MOUNTON = _selinux.LNK_FILE__MOUNTON -CHR_FILE__IOCTL = _selinux.CHR_FILE__IOCTL -CHR_FILE__READ = _selinux.CHR_FILE__READ -CHR_FILE__WRITE = _selinux.CHR_FILE__WRITE -CHR_FILE__CREATE = _selinux.CHR_FILE__CREATE -CHR_FILE__GETATTR = _selinux.CHR_FILE__GETATTR -CHR_FILE__SETATTR = _selinux.CHR_FILE__SETATTR -CHR_FILE__LOCK = _selinux.CHR_FILE__LOCK -CHR_FILE__RELABELFROM = _selinux.CHR_FILE__RELABELFROM -CHR_FILE__RELABELTO = _selinux.CHR_FILE__RELABELTO -CHR_FILE__APPEND = _selinux.CHR_FILE__APPEND -CHR_FILE__UNLINK = _selinux.CHR_FILE__UNLINK -CHR_FILE__LINK = _selinux.CHR_FILE__LINK -CHR_FILE__RENAME = _selinux.CHR_FILE__RENAME -CHR_FILE__EXECUTE = _selinux.CHR_FILE__EXECUTE -CHR_FILE__SWAPON = _selinux.CHR_FILE__SWAPON -CHR_FILE__QUOTAON = _selinux.CHR_FILE__QUOTAON -CHR_FILE__MOUNTON = _selinux.CHR_FILE__MOUNTON -CHR_FILE__EXECUTE_NO_TRANS = _selinux.CHR_FILE__EXECUTE_NO_TRANS -CHR_FILE__ENTRYPOINT = _selinux.CHR_FILE__ENTRYPOINT -CHR_FILE__EXECMOD = _selinux.CHR_FILE__EXECMOD -CHR_FILE__OPEN = _selinux.CHR_FILE__OPEN -BLK_FILE__IOCTL = _selinux.BLK_FILE__IOCTL -BLK_FILE__READ = _selinux.BLK_FILE__READ -BLK_FILE__WRITE = _selinux.BLK_FILE__WRITE -BLK_FILE__CREATE = _selinux.BLK_FILE__CREATE -BLK_FILE__GETATTR = _selinux.BLK_FILE__GETATTR -BLK_FILE__SETATTR = _selinux.BLK_FILE__SETATTR -BLK_FILE__LOCK = _selinux.BLK_FILE__LOCK -BLK_FILE__RELABELFROM = _selinux.BLK_FILE__RELABELFROM -BLK_FILE__RELABELTO = _selinux.BLK_FILE__RELABELTO -BLK_FILE__APPEND = _selinux.BLK_FILE__APPEND -BLK_FILE__UNLINK = _selinux.BLK_FILE__UNLINK -BLK_FILE__LINK = _selinux.BLK_FILE__LINK -BLK_FILE__RENAME = _selinux.BLK_FILE__RENAME -BLK_FILE__EXECUTE = _selinux.BLK_FILE__EXECUTE -BLK_FILE__SWAPON = _selinux.BLK_FILE__SWAPON -BLK_FILE__QUOTAON = _selinux.BLK_FILE__QUOTAON -BLK_FILE__MOUNTON = _selinux.BLK_FILE__MOUNTON -BLK_FILE__OPEN = _selinux.BLK_FILE__OPEN -SOCK_FILE__IOCTL = _selinux.SOCK_FILE__IOCTL -SOCK_FILE__READ = _selinux.SOCK_FILE__READ -SOCK_FILE__WRITE = _selinux.SOCK_FILE__WRITE -SOCK_FILE__CREATE = _selinux.SOCK_FILE__CREATE -SOCK_FILE__GETATTR = _selinux.SOCK_FILE__GETATTR -SOCK_FILE__SETATTR = _selinux.SOCK_FILE__SETATTR -SOCK_FILE__LOCK = _selinux.SOCK_FILE__LOCK -SOCK_FILE__RELABELFROM = _selinux.SOCK_FILE__RELABELFROM -SOCK_FILE__RELABELTO = _selinux.SOCK_FILE__RELABELTO -SOCK_FILE__APPEND = _selinux.SOCK_FILE__APPEND -SOCK_FILE__UNLINK = _selinux.SOCK_FILE__UNLINK -SOCK_FILE__LINK = _selinux.SOCK_FILE__LINK -SOCK_FILE__RENAME = _selinux.SOCK_FILE__RENAME -SOCK_FILE__EXECUTE = _selinux.SOCK_FILE__EXECUTE -SOCK_FILE__SWAPON = _selinux.SOCK_FILE__SWAPON -SOCK_FILE__QUOTAON = _selinux.SOCK_FILE__QUOTAON -SOCK_FILE__MOUNTON = _selinux.SOCK_FILE__MOUNTON -FIFO_FILE__IOCTL = _selinux.FIFO_FILE__IOCTL -FIFO_FILE__READ = _selinux.FIFO_FILE__READ -FIFO_FILE__WRITE = _selinux.FIFO_FILE__WRITE -FIFO_FILE__CREATE = _selinux.FIFO_FILE__CREATE -FIFO_FILE__GETATTR = _selinux.FIFO_FILE__GETATTR -FIFO_FILE__SETATTR = _selinux.FIFO_FILE__SETATTR -FIFO_FILE__LOCK = _selinux.FIFO_FILE__LOCK -FIFO_FILE__RELABELFROM = _selinux.FIFO_FILE__RELABELFROM -FIFO_FILE__RELABELTO = _selinux.FIFO_FILE__RELABELTO -FIFO_FILE__APPEND = _selinux.FIFO_FILE__APPEND -FIFO_FILE__UNLINK = _selinux.FIFO_FILE__UNLINK -FIFO_FILE__LINK = _selinux.FIFO_FILE__LINK -FIFO_FILE__RENAME = _selinux.FIFO_FILE__RENAME -FIFO_FILE__EXECUTE = _selinux.FIFO_FILE__EXECUTE -FIFO_FILE__SWAPON = _selinux.FIFO_FILE__SWAPON -FIFO_FILE__QUOTAON = _selinux.FIFO_FILE__QUOTAON -FIFO_FILE__MOUNTON = _selinux.FIFO_FILE__MOUNTON -FIFO_FILE__OPEN = _selinux.FIFO_FILE__OPEN -FD__USE = _selinux.FD__USE -SOCKET__IOCTL = _selinux.SOCKET__IOCTL -SOCKET__READ = _selinux.SOCKET__READ -SOCKET__WRITE = _selinux.SOCKET__WRITE -SOCKET__CREATE = _selinux.SOCKET__CREATE -SOCKET__GETATTR = _selinux.SOCKET__GETATTR -SOCKET__SETATTR = _selinux.SOCKET__SETATTR -SOCKET__LOCK = _selinux.SOCKET__LOCK -SOCKET__RELABELFROM = _selinux.SOCKET__RELABELFROM -SOCKET__RELABELTO = _selinux.SOCKET__RELABELTO -SOCKET__APPEND = _selinux.SOCKET__APPEND -SOCKET__BIND = _selinux.SOCKET__BIND -SOCKET__CONNECT = _selinux.SOCKET__CONNECT -SOCKET__LISTEN = _selinux.SOCKET__LISTEN -SOCKET__ACCEPT = _selinux.SOCKET__ACCEPT -SOCKET__GETOPT = _selinux.SOCKET__GETOPT -SOCKET__SETOPT = _selinux.SOCKET__SETOPT -SOCKET__SHUTDOWN = _selinux.SOCKET__SHUTDOWN -SOCKET__RECVFROM = _selinux.SOCKET__RECVFROM -SOCKET__SENDTO = _selinux.SOCKET__SENDTO -SOCKET__RECV_MSG = _selinux.SOCKET__RECV_MSG -SOCKET__SEND_MSG = _selinux.SOCKET__SEND_MSG -SOCKET__NAME_BIND = _selinux.SOCKET__NAME_BIND -TCP_SOCKET__IOCTL = _selinux.TCP_SOCKET__IOCTL -TCP_SOCKET__READ = _selinux.TCP_SOCKET__READ -TCP_SOCKET__WRITE = _selinux.TCP_SOCKET__WRITE -TCP_SOCKET__CREATE = _selinux.TCP_SOCKET__CREATE -TCP_SOCKET__GETATTR = _selinux.TCP_SOCKET__GETATTR -TCP_SOCKET__SETATTR = _selinux.TCP_SOCKET__SETATTR -TCP_SOCKET__LOCK = _selinux.TCP_SOCKET__LOCK -TCP_SOCKET__RELABELFROM = _selinux.TCP_SOCKET__RELABELFROM -TCP_SOCKET__RELABELTO = _selinux.TCP_SOCKET__RELABELTO -TCP_SOCKET__APPEND = _selinux.TCP_SOCKET__APPEND -TCP_SOCKET__BIND = _selinux.TCP_SOCKET__BIND -TCP_SOCKET__CONNECT = _selinux.TCP_SOCKET__CONNECT -TCP_SOCKET__LISTEN = _selinux.TCP_SOCKET__LISTEN -TCP_SOCKET__ACCEPT = _selinux.TCP_SOCKET__ACCEPT -TCP_SOCKET__GETOPT = _selinux.TCP_SOCKET__GETOPT -TCP_SOCKET__SETOPT = _selinux.TCP_SOCKET__SETOPT -TCP_SOCKET__SHUTDOWN = _selinux.TCP_SOCKET__SHUTDOWN -TCP_SOCKET__RECVFROM = _selinux.TCP_SOCKET__RECVFROM -TCP_SOCKET__SENDTO = _selinux.TCP_SOCKET__SENDTO -TCP_SOCKET__RECV_MSG = _selinux.TCP_SOCKET__RECV_MSG -TCP_SOCKET__SEND_MSG = _selinux.TCP_SOCKET__SEND_MSG -TCP_SOCKET__NAME_BIND = _selinux.TCP_SOCKET__NAME_BIND -TCP_SOCKET__CONNECTTO = _selinux.TCP_SOCKET__CONNECTTO -TCP_SOCKET__NEWCONN = _selinux.TCP_SOCKET__NEWCONN -TCP_SOCKET__ACCEPTFROM = _selinux.TCP_SOCKET__ACCEPTFROM -TCP_SOCKET__NODE_BIND = _selinux.TCP_SOCKET__NODE_BIND -TCP_SOCKET__NAME_CONNECT = _selinux.TCP_SOCKET__NAME_CONNECT -UDP_SOCKET__IOCTL = _selinux.UDP_SOCKET__IOCTL -UDP_SOCKET__READ = _selinux.UDP_SOCKET__READ -UDP_SOCKET__WRITE = _selinux.UDP_SOCKET__WRITE -UDP_SOCKET__CREATE = _selinux.UDP_SOCKET__CREATE -UDP_SOCKET__GETATTR = _selinux.UDP_SOCKET__GETATTR -UDP_SOCKET__SETATTR = _selinux.UDP_SOCKET__SETATTR -UDP_SOCKET__LOCK = _selinux.UDP_SOCKET__LOCK -UDP_SOCKET__RELABELFROM = _selinux.UDP_SOCKET__RELABELFROM -UDP_SOCKET__RELABELTO = _selinux.UDP_SOCKET__RELABELTO -UDP_SOCKET__APPEND = _selinux.UDP_SOCKET__APPEND -UDP_SOCKET__BIND = _selinux.UDP_SOCKET__BIND -UDP_SOCKET__CONNECT = _selinux.UDP_SOCKET__CONNECT -UDP_SOCKET__LISTEN = _selinux.UDP_SOCKET__LISTEN -UDP_SOCKET__ACCEPT = _selinux.UDP_SOCKET__ACCEPT -UDP_SOCKET__GETOPT = _selinux.UDP_SOCKET__GETOPT -UDP_SOCKET__SETOPT = _selinux.UDP_SOCKET__SETOPT -UDP_SOCKET__SHUTDOWN = _selinux.UDP_SOCKET__SHUTDOWN -UDP_SOCKET__RECVFROM = _selinux.UDP_SOCKET__RECVFROM -UDP_SOCKET__SENDTO = _selinux.UDP_SOCKET__SENDTO -UDP_SOCKET__RECV_MSG = _selinux.UDP_SOCKET__RECV_MSG -UDP_SOCKET__SEND_MSG = _selinux.UDP_SOCKET__SEND_MSG -UDP_SOCKET__NAME_BIND = _selinux.UDP_SOCKET__NAME_BIND -UDP_SOCKET__NODE_BIND = _selinux.UDP_SOCKET__NODE_BIND -RAWIP_SOCKET__IOCTL = _selinux.RAWIP_SOCKET__IOCTL -RAWIP_SOCKET__READ = _selinux.RAWIP_SOCKET__READ -RAWIP_SOCKET__WRITE = _selinux.RAWIP_SOCKET__WRITE -RAWIP_SOCKET__CREATE = _selinux.RAWIP_SOCKET__CREATE -RAWIP_SOCKET__GETATTR = _selinux.RAWIP_SOCKET__GETATTR -RAWIP_SOCKET__SETATTR = _selinux.RAWIP_SOCKET__SETATTR -RAWIP_SOCKET__LOCK = _selinux.RAWIP_SOCKET__LOCK -RAWIP_SOCKET__RELABELFROM = _selinux.RAWIP_SOCKET__RELABELFROM -RAWIP_SOCKET__RELABELTO = _selinux.RAWIP_SOCKET__RELABELTO -RAWIP_SOCKET__APPEND = _selinux.RAWIP_SOCKET__APPEND -RAWIP_SOCKET__BIND = _selinux.RAWIP_SOCKET__BIND -RAWIP_SOCKET__CONNECT = _selinux.RAWIP_SOCKET__CONNECT -RAWIP_SOCKET__LISTEN = _selinux.RAWIP_SOCKET__LISTEN -RAWIP_SOCKET__ACCEPT = _selinux.RAWIP_SOCKET__ACCEPT -RAWIP_SOCKET__GETOPT = _selinux.RAWIP_SOCKET__GETOPT -RAWIP_SOCKET__SETOPT = _selinux.RAWIP_SOCKET__SETOPT -RAWIP_SOCKET__SHUTDOWN = _selinux.RAWIP_SOCKET__SHUTDOWN -RAWIP_SOCKET__RECVFROM = _selinux.RAWIP_SOCKET__RECVFROM -RAWIP_SOCKET__SENDTO = _selinux.RAWIP_SOCKET__SENDTO -RAWIP_SOCKET__RECV_MSG = _selinux.RAWIP_SOCKET__RECV_MSG -RAWIP_SOCKET__SEND_MSG = _selinux.RAWIP_SOCKET__SEND_MSG -RAWIP_SOCKET__NAME_BIND = _selinux.RAWIP_SOCKET__NAME_BIND -RAWIP_SOCKET__NODE_BIND = _selinux.RAWIP_SOCKET__NODE_BIND -NODE__TCP_RECV = _selinux.NODE__TCP_RECV -NODE__TCP_SEND = _selinux.NODE__TCP_SEND -NODE__UDP_RECV = _selinux.NODE__UDP_RECV -NODE__UDP_SEND = _selinux.NODE__UDP_SEND -NODE__RAWIP_RECV = _selinux.NODE__RAWIP_RECV -NODE__RAWIP_SEND = _selinux.NODE__RAWIP_SEND -NODE__ENFORCE_DEST = _selinux.NODE__ENFORCE_DEST -NODE__DCCP_RECV = _selinux.NODE__DCCP_RECV -NODE__DCCP_SEND = _selinux.NODE__DCCP_SEND -NODE__RECVFROM = _selinux.NODE__RECVFROM -NODE__SENDTO = _selinux.NODE__SENDTO -NETIF__TCP_RECV = _selinux.NETIF__TCP_RECV -NETIF__TCP_SEND = _selinux.NETIF__TCP_SEND -NETIF__UDP_RECV = _selinux.NETIF__UDP_RECV -NETIF__UDP_SEND = _selinux.NETIF__UDP_SEND -NETIF__RAWIP_RECV = _selinux.NETIF__RAWIP_RECV -NETIF__RAWIP_SEND = _selinux.NETIF__RAWIP_SEND -NETIF__DCCP_RECV = _selinux.NETIF__DCCP_RECV -NETIF__DCCP_SEND = _selinux.NETIF__DCCP_SEND -NETIF__INGRESS = _selinux.NETIF__INGRESS -NETIF__EGRESS = _selinux.NETIF__EGRESS -NETLINK_SOCKET__IOCTL = _selinux.NETLINK_SOCKET__IOCTL -NETLINK_SOCKET__READ = _selinux.NETLINK_SOCKET__READ -NETLINK_SOCKET__WRITE = _selinux.NETLINK_SOCKET__WRITE -NETLINK_SOCKET__CREATE = _selinux.NETLINK_SOCKET__CREATE -NETLINK_SOCKET__GETATTR = _selinux.NETLINK_SOCKET__GETATTR -NETLINK_SOCKET__SETATTR = _selinux.NETLINK_SOCKET__SETATTR -NETLINK_SOCKET__LOCK = _selinux.NETLINK_SOCKET__LOCK -NETLINK_SOCKET__RELABELFROM = _selinux.NETLINK_SOCKET__RELABELFROM -NETLINK_SOCKET__RELABELTO = _selinux.NETLINK_SOCKET__RELABELTO -NETLINK_SOCKET__APPEND = _selinux.NETLINK_SOCKET__APPEND -NETLINK_SOCKET__BIND = _selinux.NETLINK_SOCKET__BIND -NETLINK_SOCKET__CONNECT = _selinux.NETLINK_SOCKET__CONNECT -NETLINK_SOCKET__LISTEN = _selinux.NETLINK_SOCKET__LISTEN -NETLINK_SOCKET__ACCEPT = _selinux.NETLINK_SOCKET__ACCEPT -NETLINK_SOCKET__GETOPT = _selinux.NETLINK_SOCKET__GETOPT -NETLINK_SOCKET__SETOPT = _selinux.NETLINK_SOCKET__SETOPT -NETLINK_SOCKET__SHUTDOWN = _selinux.NETLINK_SOCKET__SHUTDOWN -NETLINK_SOCKET__RECVFROM = _selinux.NETLINK_SOCKET__RECVFROM -NETLINK_SOCKET__SENDTO = _selinux.NETLINK_SOCKET__SENDTO -NETLINK_SOCKET__RECV_MSG = _selinux.NETLINK_SOCKET__RECV_MSG -NETLINK_SOCKET__SEND_MSG = _selinux.NETLINK_SOCKET__SEND_MSG -NETLINK_SOCKET__NAME_BIND = _selinux.NETLINK_SOCKET__NAME_BIND -PACKET_SOCKET__IOCTL = _selinux.PACKET_SOCKET__IOCTL -PACKET_SOCKET__READ = _selinux.PACKET_SOCKET__READ -PACKET_SOCKET__WRITE = _selinux.PACKET_SOCKET__WRITE -PACKET_SOCKET__CREATE = _selinux.PACKET_SOCKET__CREATE -PACKET_SOCKET__GETATTR = _selinux.PACKET_SOCKET__GETATTR -PACKET_SOCKET__SETATTR = _selinux.PACKET_SOCKET__SETATTR -PACKET_SOCKET__LOCK = _selinux.PACKET_SOCKET__LOCK -PACKET_SOCKET__RELABELFROM = _selinux.PACKET_SOCKET__RELABELFROM -PACKET_SOCKET__RELABELTO = _selinux.PACKET_SOCKET__RELABELTO -PACKET_SOCKET__APPEND = _selinux.PACKET_SOCKET__APPEND -PACKET_SOCKET__BIND = _selinux.PACKET_SOCKET__BIND -PACKET_SOCKET__CONNECT = _selinux.PACKET_SOCKET__CONNECT -PACKET_SOCKET__LISTEN = _selinux.PACKET_SOCKET__LISTEN -PACKET_SOCKET__ACCEPT = _selinux.PACKET_SOCKET__ACCEPT -PACKET_SOCKET__GETOPT = _selinux.PACKET_SOCKET__GETOPT -PACKET_SOCKET__SETOPT = _selinux.PACKET_SOCKET__SETOPT -PACKET_SOCKET__SHUTDOWN = _selinux.PACKET_SOCKET__SHUTDOWN -PACKET_SOCKET__RECVFROM = _selinux.PACKET_SOCKET__RECVFROM -PACKET_SOCKET__SENDTO = _selinux.PACKET_SOCKET__SENDTO -PACKET_SOCKET__RECV_MSG = _selinux.PACKET_SOCKET__RECV_MSG -PACKET_SOCKET__SEND_MSG = _selinux.PACKET_SOCKET__SEND_MSG -PACKET_SOCKET__NAME_BIND = _selinux.PACKET_SOCKET__NAME_BIND -KEY_SOCKET__IOCTL = _selinux.KEY_SOCKET__IOCTL -KEY_SOCKET__READ = _selinux.KEY_SOCKET__READ -KEY_SOCKET__WRITE = _selinux.KEY_SOCKET__WRITE -KEY_SOCKET__CREATE = _selinux.KEY_SOCKET__CREATE -KEY_SOCKET__GETATTR = _selinux.KEY_SOCKET__GETATTR -KEY_SOCKET__SETATTR = _selinux.KEY_SOCKET__SETATTR -KEY_SOCKET__LOCK = _selinux.KEY_SOCKET__LOCK -KEY_SOCKET__RELABELFROM = _selinux.KEY_SOCKET__RELABELFROM -KEY_SOCKET__RELABELTO = _selinux.KEY_SOCKET__RELABELTO -KEY_SOCKET__APPEND = _selinux.KEY_SOCKET__APPEND -KEY_SOCKET__BIND = _selinux.KEY_SOCKET__BIND -KEY_SOCKET__CONNECT = _selinux.KEY_SOCKET__CONNECT -KEY_SOCKET__LISTEN = _selinux.KEY_SOCKET__LISTEN -KEY_SOCKET__ACCEPT = _selinux.KEY_SOCKET__ACCEPT -KEY_SOCKET__GETOPT = _selinux.KEY_SOCKET__GETOPT -KEY_SOCKET__SETOPT = _selinux.KEY_SOCKET__SETOPT -KEY_SOCKET__SHUTDOWN = _selinux.KEY_SOCKET__SHUTDOWN -KEY_SOCKET__RECVFROM = _selinux.KEY_SOCKET__RECVFROM -KEY_SOCKET__SENDTO = _selinux.KEY_SOCKET__SENDTO -KEY_SOCKET__RECV_MSG = _selinux.KEY_SOCKET__RECV_MSG -KEY_SOCKET__SEND_MSG = _selinux.KEY_SOCKET__SEND_MSG -KEY_SOCKET__NAME_BIND = _selinux.KEY_SOCKET__NAME_BIND -UNIX_STREAM_SOCKET__IOCTL = _selinux.UNIX_STREAM_SOCKET__IOCTL -UNIX_STREAM_SOCKET__READ = _selinux.UNIX_STREAM_SOCKET__READ -UNIX_STREAM_SOCKET__WRITE = _selinux.UNIX_STREAM_SOCKET__WRITE -UNIX_STREAM_SOCKET__CREATE = _selinux.UNIX_STREAM_SOCKET__CREATE -UNIX_STREAM_SOCKET__GETATTR = _selinux.UNIX_STREAM_SOCKET__GETATTR -UNIX_STREAM_SOCKET__SETATTR = _selinux.UNIX_STREAM_SOCKET__SETATTR -UNIX_STREAM_SOCKET__LOCK = _selinux.UNIX_STREAM_SOCKET__LOCK -UNIX_STREAM_SOCKET__RELABELFROM = _selinux.UNIX_STREAM_SOCKET__RELABELFROM -UNIX_STREAM_SOCKET__RELABELTO = _selinux.UNIX_STREAM_SOCKET__RELABELTO -UNIX_STREAM_SOCKET__APPEND = _selinux.UNIX_STREAM_SOCKET__APPEND -UNIX_STREAM_SOCKET__BIND = _selinux.UNIX_STREAM_SOCKET__BIND -UNIX_STREAM_SOCKET__CONNECT = _selinux.UNIX_STREAM_SOCKET__CONNECT -UNIX_STREAM_SOCKET__LISTEN = _selinux.UNIX_STREAM_SOCKET__LISTEN -UNIX_STREAM_SOCKET__ACCEPT = _selinux.UNIX_STREAM_SOCKET__ACCEPT -UNIX_STREAM_SOCKET__GETOPT = _selinux.UNIX_STREAM_SOCKET__GETOPT -UNIX_STREAM_SOCKET__SETOPT = _selinux.UNIX_STREAM_SOCKET__SETOPT -UNIX_STREAM_SOCKET__SHUTDOWN = _selinux.UNIX_STREAM_SOCKET__SHUTDOWN -UNIX_STREAM_SOCKET__RECVFROM = _selinux.UNIX_STREAM_SOCKET__RECVFROM -UNIX_STREAM_SOCKET__SENDTO = _selinux.UNIX_STREAM_SOCKET__SENDTO -UNIX_STREAM_SOCKET__RECV_MSG = _selinux.UNIX_STREAM_SOCKET__RECV_MSG -UNIX_STREAM_SOCKET__SEND_MSG = _selinux.UNIX_STREAM_SOCKET__SEND_MSG -UNIX_STREAM_SOCKET__NAME_BIND = _selinux.UNIX_STREAM_SOCKET__NAME_BIND -UNIX_STREAM_SOCKET__CONNECTTO = _selinux.UNIX_STREAM_SOCKET__CONNECTTO -UNIX_STREAM_SOCKET__NEWCONN = _selinux.UNIX_STREAM_SOCKET__NEWCONN -UNIX_STREAM_SOCKET__ACCEPTFROM = _selinux.UNIX_STREAM_SOCKET__ACCEPTFROM -UNIX_DGRAM_SOCKET__IOCTL = _selinux.UNIX_DGRAM_SOCKET__IOCTL -UNIX_DGRAM_SOCKET__READ = _selinux.UNIX_DGRAM_SOCKET__READ -UNIX_DGRAM_SOCKET__WRITE = _selinux.UNIX_DGRAM_SOCKET__WRITE -UNIX_DGRAM_SOCKET__CREATE = _selinux.UNIX_DGRAM_SOCKET__CREATE -UNIX_DGRAM_SOCKET__GETATTR = _selinux.UNIX_DGRAM_SOCKET__GETATTR -UNIX_DGRAM_SOCKET__SETATTR = _selinux.UNIX_DGRAM_SOCKET__SETATTR -UNIX_DGRAM_SOCKET__LOCK = _selinux.UNIX_DGRAM_SOCKET__LOCK -UNIX_DGRAM_SOCKET__RELABELFROM = _selinux.UNIX_DGRAM_SOCKET__RELABELFROM -UNIX_DGRAM_SOCKET__RELABELTO = _selinux.UNIX_DGRAM_SOCKET__RELABELTO -UNIX_DGRAM_SOCKET__APPEND = _selinux.UNIX_DGRAM_SOCKET__APPEND -UNIX_DGRAM_SOCKET__BIND = _selinux.UNIX_DGRAM_SOCKET__BIND -UNIX_DGRAM_SOCKET__CONNECT = _selinux.UNIX_DGRAM_SOCKET__CONNECT -UNIX_DGRAM_SOCKET__LISTEN = _selinux.UNIX_DGRAM_SOCKET__LISTEN -UNIX_DGRAM_SOCKET__ACCEPT = _selinux.UNIX_DGRAM_SOCKET__ACCEPT -UNIX_DGRAM_SOCKET__GETOPT = _selinux.UNIX_DGRAM_SOCKET__GETOPT -UNIX_DGRAM_SOCKET__SETOPT = _selinux.UNIX_DGRAM_SOCKET__SETOPT -UNIX_DGRAM_SOCKET__SHUTDOWN = _selinux.UNIX_DGRAM_SOCKET__SHUTDOWN -UNIX_DGRAM_SOCKET__RECVFROM = _selinux.UNIX_DGRAM_SOCKET__RECVFROM -UNIX_DGRAM_SOCKET__SENDTO = _selinux.UNIX_DGRAM_SOCKET__SENDTO -UNIX_DGRAM_SOCKET__RECV_MSG = _selinux.UNIX_DGRAM_SOCKET__RECV_MSG -UNIX_DGRAM_SOCKET__SEND_MSG = _selinux.UNIX_DGRAM_SOCKET__SEND_MSG -UNIX_DGRAM_SOCKET__NAME_BIND = _selinux.UNIX_DGRAM_SOCKET__NAME_BIND -PROCESS__FORK = _selinux.PROCESS__FORK -PROCESS__TRANSITION = _selinux.PROCESS__TRANSITION -PROCESS__SIGCHLD = _selinux.PROCESS__SIGCHLD -PROCESS__SIGKILL = _selinux.PROCESS__SIGKILL -PROCESS__SIGSTOP = _selinux.PROCESS__SIGSTOP -PROCESS__SIGNULL = _selinux.PROCESS__SIGNULL -PROCESS__SIGNAL = _selinux.PROCESS__SIGNAL -PROCESS__PTRACE = _selinux.PROCESS__PTRACE -PROCESS__GETSCHED = _selinux.PROCESS__GETSCHED -PROCESS__SETSCHED = _selinux.PROCESS__SETSCHED -PROCESS__GETSESSION = _selinux.PROCESS__GETSESSION -PROCESS__GETPGID = _selinux.PROCESS__GETPGID -PROCESS__SETPGID = _selinux.PROCESS__SETPGID -PROCESS__GETCAP = _selinux.PROCESS__GETCAP -PROCESS__SETCAP = _selinux.PROCESS__SETCAP -PROCESS__SHARE = _selinux.PROCESS__SHARE -PROCESS__GETATTR = _selinux.PROCESS__GETATTR -PROCESS__SETEXEC = _selinux.PROCESS__SETEXEC -PROCESS__SETFSCREATE = _selinux.PROCESS__SETFSCREATE -PROCESS__NOATSECURE = _selinux.PROCESS__NOATSECURE -PROCESS__SIGINH = _selinux.PROCESS__SIGINH -PROCESS__SETRLIMIT = _selinux.PROCESS__SETRLIMIT -PROCESS__RLIMITINH = _selinux.PROCESS__RLIMITINH -PROCESS__DYNTRANSITION = _selinux.PROCESS__DYNTRANSITION -PROCESS__SETCURRENT = _selinux.PROCESS__SETCURRENT -PROCESS__EXECMEM = _selinux.PROCESS__EXECMEM -PROCESS__EXECSTACK = _selinux.PROCESS__EXECSTACK -PROCESS__EXECHEAP = _selinux.PROCESS__EXECHEAP -PROCESS__SETKEYCREATE = _selinux.PROCESS__SETKEYCREATE -PROCESS__SETSOCKCREATE = _selinux.PROCESS__SETSOCKCREATE -IPC__CREATE = _selinux.IPC__CREATE -IPC__DESTROY = _selinux.IPC__DESTROY -IPC__GETATTR = _selinux.IPC__GETATTR -IPC__SETATTR = _selinux.IPC__SETATTR -IPC__READ = _selinux.IPC__READ -IPC__WRITE = _selinux.IPC__WRITE -IPC__ASSOCIATE = _selinux.IPC__ASSOCIATE -IPC__UNIX_READ = _selinux.IPC__UNIX_READ -IPC__UNIX_WRITE = _selinux.IPC__UNIX_WRITE -SEM__CREATE = _selinux.SEM__CREATE -SEM__DESTROY = _selinux.SEM__DESTROY -SEM__GETATTR = _selinux.SEM__GETATTR -SEM__SETATTR = _selinux.SEM__SETATTR -SEM__READ = _selinux.SEM__READ -SEM__WRITE = _selinux.SEM__WRITE -SEM__ASSOCIATE = _selinux.SEM__ASSOCIATE -SEM__UNIX_READ = _selinux.SEM__UNIX_READ -SEM__UNIX_WRITE = _selinux.SEM__UNIX_WRITE -MSGQ__CREATE = _selinux.MSGQ__CREATE -MSGQ__DESTROY = _selinux.MSGQ__DESTROY -MSGQ__GETATTR = _selinux.MSGQ__GETATTR -MSGQ__SETATTR = _selinux.MSGQ__SETATTR -MSGQ__READ = _selinux.MSGQ__READ -MSGQ__WRITE = _selinux.MSGQ__WRITE -MSGQ__ASSOCIATE = _selinux.MSGQ__ASSOCIATE -MSGQ__UNIX_READ = _selinux.MSGQ__UNIX_READ -MSGQ__UNIX_WRITE = _selinux.MSGQ__UNIX_WRITE -MSGQ__ENQUEUE = _selinux.MSGQ__ENQUEUE -MSG__SEND = _selinux.MSG__SEND -MSG__RECEIVE = _selinux.MSG__RECEIVE -SHM__CREATE = _selinux.SHM__CREATE -SHM__DESTROY = _selinux.SHM__DESTROY -SHM__GETATTR = _selinux.SHM__GETATTR -SHM__SETATTR = _selinux.SHM__SETATTR -SHM__READ = _selinux.SHM__READ -SHM__WRITE = _selinux.SHM__WRITE -SHM__ASSOCIATE = _selinux.SHM__ASSOCIATE -SHM__UNIX_READ = _selinux.SHM__UNIX_READ -SHM__UNIX_WRITE = _selinux.SHM__UNIX_WRITE -SHM__LOCK = _selinux.SHM__LOCK -SECURITY__COMPUTE_AV = _selinux.SECURITY__COMPUTE_AV -SECURITY__COMPUTE_CREATE = _selinux.SECURITY__COMPUTE_CREATE -SECURITY__COMPUTE_MEMBER = _selinux.SECURITY__COMPUTE_MEMBER -SECURITY__CHECK_CONTEXT = _selinux.SECURITY__CHECK_CONTEXT -SECURITY__LOAD_POLICY = _selinux.SECURITY__LOAD_POLICY -SECURITY__COMPUTE_RELABEL = _selinux.SECURITY__COMPUTE_RELABEL -SECURITY__COMPUTE_USER = _selinux.SECURITY__COMPUTE_USER -SECURITY__SETENFORCE = _selinux.SECURITY__SETENFORCE -SECURITY__SETBOOL = _selinux.SECURITY__SETBOOL -SECURITY__SETSECPARAM = _selinux.SECURITY__SETSECPARAM -SECURITY__SETCHECKREQPROT = _selinux.SECURITY__SETCHECKREQPROT -SYSTEM__IPC_INFO = _selinux.SYSTEM__IPC_INFO -SYSTEM__SYSLOG_READ = _selinux.SYSTEM__SYSLOG_READ -SYSTEM__SYSLOG_MOD = _selinux.SYSTEM__SYSLOG_MOD -SYSTEM__SYSLOG_CONSOLE = _selinux.SYSTEM__SYSLOG_CONSOLE -CAPABILITY__CHOWN = _selinux.CAPABILITY__CHOWN -CAPABILITY__DAC_OVERRIDE = _selinux.CAPABILITY__DAC_OVERRIDE -CAPABILITY__DAC_READ_SEARCH = _selinux.CAPABILITY__DAC_READ_SEARCH -CAPABILITY__FOWNER = _selinux.CAPABILITY__FOWNER -CAPABILITY__FSETID = _selinux.CAPABILITY__FSETID -CAPABILITY__KILL = _selinux.CAPABILITY__KILL -CAPABILITY__SETGID = _selinux.CAPABILITY__SETGID -CAPABILITY__SETUID = _selinux.CAPABILITY__SETUID -CAPABILITY__SETPCAP = _selinux.CAPABILITY__SETPCAP -CAPABILITY__LINUX_IMMUTABLE = _selinux.CAPABILITY__LINUX_IMMUTABLE -CAPABILITY__NET_BIND_SERVICE = _selinux.CAPABILITY__NET_BIND_SERVICE -CAPABILITY__NET_BROADCAST = _selinux.CAPABILITY__NET_BROADCAST -CAPABILITY__NET_ADMIN = _selinux.CAPABILITY__NET_ADMIN -CAPABILITY__NET_RAW = _selinux.CAPABILITY__NET_RAW -CAPABILITY__IPC_LOCK = _selinux.CAPABILITY__IPC_LOCK -CAPABILITY__IPC_OWNER = _selinux.CAPABILITY__IPC_OWNER -CAPABILITY__SYS_MODULE = _selinux.CAPABILITY__SYS_MODULE -CAPABILITY__SYS_RAWIO = _selinux.CAPABILITY__SYS_RAWIO -CAPABILITY__SYS_CHROOT = _selinux.CAPABILITY__SYS_CHROOT -CAPABILITY__SYS_PTRACE = _selinux.CAPABILITY__SYS_PTRACE -CAPABILITY__SYS_PACCT = _selinux.CAPABILITY__SYS_PACCT -CAPABILITY__SYS_ADMIN = _selinux.CAPABILITY__SYS_ADMIN -CAPABILITY__SYS_BOOT = _selinux.CAPABILITY__SYS_BOOT -CAPABILITY__SYS_NICE = _selinux.CAPABILITY__SYS_NICE -CAPABILITY__SYS_RESOURCE = _selinux.CAPABILITY__SYS_RESOURCE -CAPABILITY__SYS_TIME = _selinux.CAPABILITY__SYS_TIME -CAPABILITY__SYS_TTY_CONFIG = _selinux.CAPABILITY__SYS_TTY_CONFIG -CAPABILITY__MKNOD = _selinux.CAPABILITY__MKNOD -CAPABILITY__LEASE = _selinux.CAPABILITY__LEASE -CAPABILITY__AUDIT_WRITE = _selinux.CAPABILITY__AUDIT_WRITE -CAPABILITY__AUDIT_CONTROL = _selinux.CAPABILITY__AUDIT_CONTROL -CAPABILITY__SETFCAP = _selinux.CAPABILITY__SETFCAP -CAPABILITY2__MAC_OVERRIDE = _selinux.CAPABILITY2__MAC_OVERRIDE -CAPABILITY2__MAC_ADMIN = _selinux.CAPABILITY2__MAC_ADMIN -PASSWD__PASSWD = _selinux.PASSWD__PASSWD -PASSWD__CHFN = _selinux.PASSWD__CHFN -PASSWD__CHSH = _selinux.PASSWD__CHSH -PASSWD__ROOTOK = _selinux.PASSWD__ROOTOK -PASSWD__CRONTAB = _selinux.PASSWD__CRONTAB -X_DRAWABLE__CREATE = _selinux.X_DRAWABLE__CREATE -X_DRAWABLE__DESTROY = _selinux.X_DRAWABLE__DESTROY -X_DRAWABLE__READ = _selinux.X_DRAWABLE__READ -X_DRAWABLE__WRITE = _selinux.X_DRAWABLE__WRITE -X_DRAWABLE__BLEND = _selinux.X_DRAWABLE__BLEND -X_DRAWABLE__GETATTR = _selinux.X_DRAWABLE__GETATTR -X_DRAWABLE__SETATTR = _selinux.X_DRAWABLE__SETATTR -X_DRAWABLE__LIST_CHILD = _selinux.X_DRAWABLE__LIST_CHILD -X_DRAWABLE__ADD_CHILD = _selinux.X_DRAWABLE__ADD_CHILD -X_DRAWABLE__REMOVE_CHILD = _selinux.X_DRAWABLE__REMOVE_CHILD -X_DRAWABLE__LIST_PROPERTY = _selinux.X_DRAWABLE__LIST_PROPERTY -X_DRAWABLE__GET_PROPERTY = _selinux.X_DRAWABLE__GET_PROPERTY -X_DRAWABLE__SET_PROPERTY = _selinux.X_DRAWABLE__SET_PROPERTY -X_DRAWABLE__MANAGE = _selinux.X_DRAWABLE__MANAGE -X_DRAWABLE__OVERRIDE = _selinux.X_DRAWABLE__OVERRIDE -X_DRAWABLE__SHOW = _selinux.X_DRAWABLE__SHOW -X_DRAWABLE__HIDE = _selinux.X_DRAWABLE__HIDE -X_DRAWABLE__SEND = _selinux.X_DRAWABLE__SEND -X_DRAWABLE__RECEIVE = _selinux.X_DRAWABLE__RECEIVE -X_SCREEN__GETATTR = _selinux.X_SCREEN__GETATTR -X_SCREEN__SETATTR = _selinux.X_SCREEN__SETATTR -X_SCREEN__HIDE_CURSOR = _selinux.X_SCREEN__HIDE_CURSOR -X_SCREEN__SHOW_CURSOR = _selinux.X_SCREEN__SHOW_CURSOR -X_SCREEN__SAVER_GETATTR = _selinux.X_SCREEN__SAVER_GETATTR -X_SCREEN__SAVER_SETATTR = _selinux.X_SCREEN__SAVER_SETATTR -X_SCREEN__SAVER_HIDE = _selinux.X_SCREEN__SAVER_HIDE -X_SCREEN__SAVER_SHOW = _selinux.X_SCREEN__SAVER_SHOW -X_GC__CREATE = _selinux.X_GC__CREATE -X_GC__DESTROY = _selinux.X_GC__DESTROY -X_GC__GETATTR = _selinux.X_GC__GETATTR -X_GC__SETATTR = _selinux.X_GC__SETATTR -X_GC__USE = _selinux.X_GC__USE -X_FONT__CREATE = _selinux.X_FONT__CREATE -X_FONT__DESTROY = _selinux.X_FONT__DESTROY -X_FONT__GETATTR = _selinux.X_FONT__GETATTR -X_FONT__ADD_GLYPH = _selinux.X_FONT__ADD_GLYPH -X_FONT__REMOVE_GLYPH = _selinux.X_FONT__REMOVE_GLYPH -X_FONT__USE = _selinux.X_FONT__USE -X_COLORMAP__CREATE = _selinux.X_COLORMAP__CREATE -X_COLORMAP__DESTROY = _selinux.X_COLORMAP__DESTROY -X_COLORMAP__READ = _selinux.X_COLORMAP__READ -X_COLORMAP__WRITE = _selinux.X_COLORMAP__WRITE -X_COLORMAP__GETATTR = _selinux.X_COLORMAP__GETATTR -X_COLORMAP__ADD_COLOR = _selinux.X_COLORMAP__ADD_COLOR -X_COLORMAP__REMOVE_COLOR = _selinux.X_COLORMAP__REMOVE_COLOR -X_COLORMAP__INSTALL = _selinux.X_COLORMAP__INSTALL -X_COLORMAP__UNINSTALL = _selinux.X_COLORMAP__UNINSTALL -X_COLORMAP__USE = _selinux.X_COLORMAP__USE -X_PROPERTY__CREATE = _selinux.X_PROPERTY__CREATE -X_PROPERTY__DESTROY = _selinux.X_PROPERTY__DESTROY -X_PROPERTY__READ = _selinux.X_PROPERTY__READ -X_PROPERTY__WRITE = _selinux.X_PROPERTY__WRITE -X_PROPERTY__APPEND = _selinux.X_PROPERTY__APPEND -X_PROPERTY__GETATTR = _selinux.X_PROPERTY__GETATTR -X_PROPERTY__SETATTR = _selinux.X_PROPERTY__SETATTR -X_SELECTION__READ = _selinux.X_SELECTION__READ -X_SELECTION__WRITE = _selinux.X_SELECTION__WRITE -X_SELECTION__GETATTR = _selinux.X_SELECTION__GETATTR -X_SELECTION__SETATTR = _selinux.X_SELECTION__SETATTR -X_CURSOR__CREATE = _selinux.X_CURSOR__CREATE -X_CURSOR__DESTROY = _selinux.X_CURSOR__DESTROY -X_CURSOR__READ = _selinux.X_CURSOR__READ -X_CURSOR__WRITE = _selinux.X_CURSOR__WRITE -X_CURSOR__GETATTR = _selinux.X_CURSOR__GETATTR -X_CURSOR__SETATTR = _selinux.X_CURSOR__SETATTR -X_CURSOR__USE = _selinux.X_CURSOR__USE -X_CLIENT__DESTROY = _selinux.X_CLIENT__DESTROY -X_CLIENT__GETATTR = _selinux.X_CLIENT__GETATTR -X_CLIENT__SETATTR = _selinux.X_CLIENT__SETATTR -X_CLIENT__MANAGE = _selinux.X_CLIENT__MANAGE -X_DEVICE__GETATTR = _selinux.X_DEVICE__GETATTR -X_DEVICE__SETATTR = _selinux.X_DEVICE__SETATTR -X_DEVICE__USE = _selinux.X_DEVICE__USE -X_DEVICE__READ = _selinux.X_DEVICE__READ -X_DEVICE__WRITE = _selinux.X_DEVICE__WRITE -X_DEVICE__GETFOCUS = _selinux.X_DEVICE__GETFOCUS -X_DEVICE__SETFOCUS = _selinux.X_DEVICE__SETFOCUS -X_DEVICE__BELL = _selinux.X_DEVICE__BELL -X_DEVICE__FORCE_CURSOR = _selinux.X_DEVICE__FORCE_CURSOR -X_DEVICE__FREEZE = _selinux.X_DEVICE__FREEZE -X_DEVICE__GRAB = _selinux.X_DEVICE__GRAB -X_DEVICE__MANAGE = _selinux.X_DEVICE__MANAGE -X_SERVER__GETATTR = _selinux.X_SERVER__GETATTR -X_SERVER__SETATTR = _selinux.X_SERVER__SETATTR -X_SERVER__RECORD = _selinux.X_SERVER__RECORD -X_SERVER__DEBUG = _selinux.X_SERVER__DEBUG -X_SERVER__GRAB = _selinux.X_SERVER__GRAB -X_SERVER__MANAGE = _selinux.X_SERVER__MANAGE -X_EXTENSION__QUERY = _selinux.X_EXTENSION__QUERY -X_EXTENSION__USE = _selinux.X_EXTENSION__USE -X_RESOURCE__READ = _selinux.X_RESOURCE__READ -X_RESOURCE__WRITE = _selinux.X_RESOURCE__WRITE -X_EVENT__SEND = _selinux.X_EVENT__SEND -X_EVENT__RECEIVE = _selinux.X_EVENT__RECEIVE -X_SYNTHETIC_EVENT__SEND = _selinux.X_SYNTHETIC_EVENT__SEND -X_SYNTHETIC_EVENT__RECEIVE = _selinux.X_SYNTHETIC_EVENT__RECEIVE -NETLINK_ROUTE_SOCKET__IOCTL = _selinux.NETLINK_ROUTE_SOCKET__IOCTL -NETLINK_ROUTE_SOCKET__READ = _selinux.NETLINK_ROUTE_SOCKET__READ -NETLINK_ROUTE_SOCKET__WRITE = _selinux.NETLINK_ROUTE_SOCKET__WRITE -NETLINK_ROUTE_SOCKET__CREATE = _selinux.NETLINK_ROUTE_SOCKET__CREATE -NETLINK_ROUTE_SOCKET__GETATTR = _selinux.NETLINK_ROUTE_SOCKET__GETATTR -NETLINK_ROUTE_SOCKET__SETATTR = _selinux.NETLINK_ROUTE_SOCKET__SETATTR -NETLINK_ROUTE_SOCKET__LOCK = _selinux.NETLINK_ROUTE_SOCKET__LOCK -NETLINK_ROUTE_SOCKET__RELABELFROM = _selinux.NETLINK_ROUTE_SOCKET__RELABELFROM -NETLINK_ROUTE_SOCKET__RELABELTO = _selinux.NETLINK_ROUTE_SOCKET__RELABELTO -NETLINK_ROUTE_SOCKET__APPEND = _selinux.NETLINK_ROUTE_SOCKET__APPEND -NETLINK_ROUTE_SOCKET__BIND = _selinux.NETLINK_ROUTE_SOCKET__BIND -NETLINK_ROUTE_SOCKET__CONNECT = _selinux.NETLINK_ROUTE_SOCKET__CONNECT -NETLINK_ROUTE_SOCKET__LISTEN = _selinux.NETLINK_ROUTE_SOCKET__LISTEN -NETLINK_ROUTE_SOCKET__ACCEPT = _selinux.NETLINK_ROUTE_SOCKET__ACCEPT -NETLINK_ROUTE_SOCKET__GETOPT = _selinux.NETLINK_ROUTE_SOCKET__GETOPT -NETLINK_ROUTE_SOCKET__SETOPT = _selinux.NETLINK_ROUTE_SOCKET__SETOPT -NETLINK_ROUTE_SOCKET__SHUTDOWN = _selinux.NETLINK_ROUTE_SOCKET__SHUTDOWN -NETLINK_ROUTE_SOCKET__RECVFROM = _selinux.NETLINK_ROUTE_SOCKET__RECVFROM -NETLINK_ROUTE_SOCKET__SENDTO = _selinux.NETLINK_ROUTE_SOCKET__SENDTO -NETLINK_ROUTE_SOCKET__RECV_MSG = _selinux.NETLINK_ROUTE_SOCKET__RECV_MSG -NETLINK_ROUTE_SOCKET__SEND_MSG = _selinux.NETLINK_ROUTE_SOCKET__SEND_MSG -NETLINK_ROUTE_SOCKET__NAME_BIND = _selinux.NETLINK_ROUTE_SOCKET__NAME_BIND -NETLINK_ROUTE_SOCKET__NLMSG_READ = _selinux.NETLINK_ROUTE_SOCKET__NLMSG_READ -NETLINK_ROUTE_SOCKET__NLMSG_WRITE = _selinux.NETLINK_ROUTE_SOCKET__NLMSG_WRITE -NETLINK_FIREWALL_SOCKET__IOCTL = _selinux.NETLINK_FIREWALL_SOCKET__IOCTL -NETLINK_FIREWALL_SOCKET__READ = _selinux.NETLINK_FIREWALL_SOCKET__READ -NETLINK_FIREWALL_SOCKET__WRITE = _selinux.NETLINK_FIREWALL_SOCKET__WRITE -NETLINK_FIREWALL_SOCKET__CREATE = _selinux.NETLINK_FIREWALL_SOCKET__CREATE -NETLINK_FIREWALL_SOCKET__GETATTR = _selinux.NETLINK_FIREWALL_SOCKET__GETATTR -NETLINK_FIREWALL_SOCKET__SETATTR = _selinux.NETLINK_FIREWALL_SOCKET__SETATTR -NETLINK_FIREWALL_SOCKET__LOCK = _selinux.NETLINK_FIREWALL_SOCKET__LOCK -NETLINK_FIREWALL_SOCKET__RELABELFROM = _selinux.NETLINK_FIREWALL_SOCKET__RELABELFROM -NETLINK_FIREWALL_SOCKET__RELABELTO = _selinux.NETLINK_FIREWALL_SOCKET__RELABELTO -NETLINK_FIREWALL_SOCKET__APPEND = _selinux.NETLINK_FIREWALL_SOCKET__APPEND -NETLINK_FIREWALL_SOCKET__BIND = _selinux.NETLINK_FIREWALL_SOCKET__BIND -NETLINK_FIREWALL_SOCKET__CONNECT = _selinux.NETLINK_FIREWALL_SOCKET__CONNECT -NETLINK_FIREWALL_SOCKET__LISTEN = _selinux.NETLINK_FIREWALL_SOCKET__LISTEN -NETLINK_FIREWALL_SOCKET__ACCEPT = _selinux.NETLINK_FIREWALL_SOCKET__ACCEPT -NETLINK_FIREWALL_SOCKET__GETOPT = _selinux.NETLINK_FIREWALL_SOCKET__GETOPT -NETLINK_FIREWALL_SOCKET__SETOPT = _selinux.NETLINK_FIREWALL_SOCKET__SETOPT -NETLINK_FIREWALL_SOCKET__SHUTDOWN = _selinux.NETLINK_FIREWALL_SOCKET__SHUTDOWN -NETLINK_FIREWALL_SOCKET__RECVFROM = _selinux.NETLINK_FIREWALL_SOCKET__RECVFROM -NETLINK_FIREWALL_SOCKET__SENDTO = _selinux.NETLINK_FIREWALL_SOCKET__SENDTO -NETLINK_FIREWALL_SOCKET__RECV_MSG = _selinux.NETLINK_FIREWALL_SOCKET__RECV_MSG -NETLINK_FIREWALL_SOCKET__SEND_MSG = _selinux.NETLINK_FIREWALL_SOCKET__SEND_MSG -NETLINK_FIREWALL_SOCKET__NAME_BIND = _selinux.NETLINK_FIREWALL_SOCKET__NAME_BIND -NETLINK_FIREWALL_SOCKET__NLMSG_READ = _selinux.NETLINK_FIREWALL_SOCKET__NLMSG_READ -NETLINK_FIREWALL_SOCKET__NLMSG_WRITE = _selinux.NETLINK_FIREWALL_SOCKET__NLMSG_WRITE -NETLINK_TCPDIAG_SOCKET__IOCTL = _selinux.NETLINK_TCPDIAG_SOCKET__IOCTL -NETLINK_TCPDIAG_SOCKET__READ = _selinux.NETLINK_TCPDIAG_SOCKET__READ -NETLINK_TCPDIAG_SOCKET__WRITE = _selinux.NETLINK_TCPDIAG_SOCKET__WRITE -NETLINK_TCPDIAG_SOCKET__CREATE = _selinux.NETLINK_TCPDIAG_SOCKET__CREATE -NETLINK_TCPDIAG_SOCKET__GETATTR = _selinux.NETLINK_TCPDIAG_SOCKET__GETATTR -NETLINK_TCPDIAG_SOCKET__SETATTR = _selinux.NETLINK_TCPDIAG_SOCKET__SETATTR -NETLINK_TCPDIAG_SOCKET__LOCK = _selinux.NETLINK_TCPDIAG_SOCKET__LOCK -NETLINK_TCPDIAG_SOCKET__RELABELFROM = _selinux.NETLINK_TCPDIAG_SOCKET__RELABELFROM -NETLINK_TCPDIAG_SOCKET__RELABELTO = _selinux.NETLINK_TCPDIAG_SOCKET__RELABELTO -NETLINK_TCPDIAG_SOCKET__APPEND = _selinux.NETLINK_TCPDIAG_SOCKET__APPEND -NETLINK_TCPDIAG_SOCKET__BIND = _selinux.NETLINK_TCPDIAG_SOCKET__BIND -NETLINK_TCPDIAG_SOCKET__CONNECT = _selinux.NETLINK_TCPDIAG_SOCKET__CONNECT -NETLINK_TCPDIAG_SOCKET__LISTEN = _selinux.NETLINK_TCPDIAG_SOCKET__LISTEN -NETLINK_TCPDIAG_SOCKET__ACCEPT = _selinux.NETLINK_TCPDIAG_SOCKET__ACCEPT -NETLINK_TCPDIAG_SOCKET__GETOPT = _selinux.NETLINK_TCPDIAG_SOCKET__GETOPT -NETLINK_TCPDIAG_SOCKET__SETOPT = _selinux.NETLINK_TCPDIAG_SOCKET__SETOPT -NETLINK_TCPDIAG_SOCKET__SHUTDOWN = _selinux.NETLINK_TCPDIAG_SOCKET__SHUTDOWN -NETLINK_TCPDIAG_SOCKET__RECVFROM = _selinux.NETLINK_TCPDIAG_SOCKET__RECVFROM -NETLINK_TCPDIAG_SOCKET__SENDTO = _selinux.NETLINK_TCPDIAG_SOCKET__SENDTO -NETLINK_TCPDIAG_SOCKET__RECV_MSG = _selinux.NETLINK_TCPDIAG_SOCKET__RECV_MSG -NETLINK_TCPDIAG_SOCKET__SEND_MSG = _selinux.NETLINK_TCPDIAG_SOCKET__SEND_MSG -NETLINK_TCPDIAG_SOCKET__NAME_BIND = _selinux.NETLINK_TCPDIAG_SOCKET__NAME_BIND -NETLINK_TCPDIAG_SOCKET__NLMSG_READ = _selinux.NETLINK_TCPDIAG_SOCKET__NLMSG_READ -NETLINK_TCPDIAG_SOCKET__NLMSG_WRITE = _selinux.NETLINK_TCPDIAG_SOCKET__NLMSG_WRITE -NETLINK_NFLOG_SOCKET__IOCTL = _selinux.NETLINK_NFLOG_SOCKET__IOCTL -NETLINK_NFLOG_SOCKET__READ = _selinux.NETLINK_NFLOG_SOCKET__READ -NETLINK_NFLOG_SOCKET__WRITE = _selinux.NETLINK_NFLOG_SOCKET__WRITE -NETLINK_NFLOG_SOCKET__CREATE = _selinux.NETLINK_NFLOG_SOCKET__CREATE -NETLINK_NFLOG_SOCKET__GETATTR = _selinux.NETLINK_NFLOG_SOCKET__GETATTR -NETLINK_NFLOG_SOCKET__SETATTR = _selinux.NETLINK_NFLOG_SOCKET__SETATTR -NETLINK_NFLOG_SOCKET__LOCK = _selinux.NETLINK_NFLOG_SOCKET__LOCK -NETLINK_NFLOG_SOCKET__RELABELFROM = _selinux.NETLINK_NFLOG_SOCKET__RELABELFROM -NETLINK_NFLOG_SOCKET__RELABELTO = _selinux.NETLINK_NFLOG_SOCKET__RELABELTO -NETLINK_NFLOG_SOCKET__APPEND = _selinux.NETLINK_NFLOG_SOCKET__APPEND -NETLINK_NFLOG_SOCKET__BIND = _selinux.NETLINK_NFLOG_SOCKET__BIND -NETLINK_NFLOG_SOCKET__CONNECT = _selinux.NETLINK_NFLOG_SOCKET__CONNECT -NETLINK_NFLOG_SOCKET__LISTEN = _selinux.NETLINK_NFLOG_SOCKET__LISTEN -NETLINK_NFLOG_SOCKET__ACCEPT = _selinux.NETLINK_NFLOG_SOCKET__ACCEPT -NETLINK_NFLOG_SOCKET__GETOPT = _selinux.NETLINK_NFLOG_SOCKET__GETOPT -NETLINK_NFLOG_SOCKET__SETOPT = _selinux.NETLINK_NFLOG_SOCKET__SETOPT -NETLINK_NFLOG_SOCKET__SHUTDOWN = _selinux.NETLINK_NFLOG_SOCKET__SHUTDOWN -NETLINK_NFLOG_SOCKET__RECVFROM = _selinux.NETLINK_NFLOG_SOCKET__RECVFROM -NETLINK_NFLOG_SOCKET__SENDTO = _selinux.NETLINK_NFLOG_SOCKET__SENDTO -NETLINK_NFLOG_SOCKET__RECV_MSG = _selinux.NETLINK_NFLOG_SOCKET__RECV_MSG -NETLINK_NFLOG_SOCKET__SEND_MSG = _selinux.NETLINK_NFLOG_SOCKET__SEND_MSG -NETLINK_NFLOG_SOCKET__NAME_BIND = _selinux.NETLINK_NFLOG_SOCKET__NAME_BIND -NETLINK_XFRM_SOCKET__IOCTL = _selinux.NETLINK_XFRM_SOCKET__IOCTL -NETLINK_XFRM_SOCKET__READ = _selinux.NETLINK_XFRM_SOCKET__READ -NETLINK_XFRM_SOCKET__WRITE = _selinux.NETLINK_XFRM_SOCKET__WRITE -NETLINK_XFRM_SOCKET__CREATE = _selinux.NETLINK_XFRM_SOCKET__CREATE -NETLINK_XFRM_SOCKET__GETATTR = _selinux.NETLINK_XFRM_SOCKET__GETATTR -NETLINK_XFRM_SOCKET__SETATTR = _selinux.NETLINK_XFRM_SOCKET__SETATTR -NETLINK_XFRM_SOCKET__LOCK = _selinux.NETLINK_XFRM_SOCKET__LOCK -NETLINK_XFRM_SOCKET__RELABELFROM = _selinux.NETLINK_XFRM_SOCKET__RELABELFROM -NETLINK_XFRM_SOCKET__RELABELTO = _selinux.NETLINK_XFRM_SOCKET__RELABELTO -NETLINK_XFRM_SOCKET__APPEND = _selinux.NETLINK_XFRM_SOCKET__APPEND -NETLINK_XFRM_SOCKET__BIND = _selinux.NETLINK_XFRM_SOCKET__BIND -NETLINK_XFRM_SOCKET__CONNECT = _selinux.NETLINK_XFRM_SOCKET__CONNECT -NETLINK_XFRM_SOCKET__LISTEN = _selinux.NETLINK_XFRM_SOCKET__LISTEN -NETLINK_XFRM_SOCKET__ACCEPT = _selinux.NETLINK_XFRM_SOCKET__ACCEPT -NETLINK_XFRM_SOCKET__GETOPT = _selinux.NETLINK_XFRM_SOCKET__GETOPT -NETLINK_XFRM_SOCKET__SETOPT = _selinux.NETLINK_XFRM_SOCKET__SETOPT -NETLINK_XFRM_SOCKET__SHUTDOWN = _selinux.NETLINK_XFRM_SOCKET__SHUTDOWN -NETLINK_XFRM_SOCKET__RECVFROM = _selinux.NETLINK_XFRM_SOCKET__RECVFROM -NETLINK_XFRM_SOCKET__SENDTO = _selinux.NETLINK_XFRM_SOCKET__SENDTO -NETLINK_XFRM_SOCKET__RECV_MSG = _selinux.NETLINK_XFRM_SOCKET__RECV_MSG -NETLINK_XFRM_SOCKET__SEND_MSG = _selinux.NETLINK_XFRM_SOCKET__SEND_MSG -NETLINK_XFRM_SOCKET__NAME_BIND = _selinux.NETLINK_XFRM_SOCKET__NAME_BIND -NETLINK_XFRM_SOCKET__NLMSG_READ = _selinux.NETLINK_XFRM_SOCKET__NLMSG_READ -NETLINK_XFRM_SOCKET__NLMSG_WRITE = _selinux.NETLINK_XFRM_SOCKET__NLMSG_WRITE -NETLINK_SELINUX_SOCKET__IOCTL = _selinux.NETLINK_SELINUX_SOCKET__IOCTL -NETLINK_SELINUX_SOCKET__READ = _selinux.NETLINK_SELINUX_SOCKET__READ -NETLINK_SELINUX_SOCKET__WRITE = _selinux.NETLINK_SELINUX_SOCKET__WRITE -NETLINK_SELINUX_SOCKET__CREATE = _selinux.NETLINK_SELINUX_SOCKET__CREATE -NETLINK_SELINUX_SOCKET__GETATTR = _selinux.NETLINK_SELINUX_SOCKET__GETATTR -NETLINK_SELINUX_SOCKET__SETATTR = _selinux.NETLINK_SELINUX_SOCKET__SETATTR -NETLINK_SELINUX_SOCKET__LOCK = _selinux.NETLINK_SELINUX_SOCKET__LOCK -NETLINK_SELINUX_SOCKET__RELABELFROM = _selinux.NETLINK_SELINUX_SOCKET__RELABELFROM -NETLINK_SELINUX_SOCKET__RELABELTO = _selinux.NETLINK_SELINUX_SOCKET__RELABELTO -NETLINK_SELINUX_SOCKET__APPEND = _selinux.NETLINK_SELINUX_SOCKET__APPEND -NETLINK_SELINUX_SOCKET__BIND = _selinux.NETLINK_SELINUX_SOCKET__BIND -NETLINK_SELINUX_SOCKET__CONNECT = _selinux.NETLINK_SELINUX_SOCKET__CONNECT -NETLINK_SELINUX_SOCKET__LISTEN = _selinux.NETLINK_SELINUX_SOCKET__LISTEN -NETLINK_SELINUX_SOCKET__ACCEPT = _selinux.NETLINK_SELINUX_SOCKET__ACCEPT -NETLINK_SELINUX_SOCKET__GETOPT = _selinux.NETLINK_SELINUX_SOCKET__GETOPT -NETLINK_SELINUX_SOCKET__SETOPT = _selinux.NETLINK_SELINUX_SOCKET__SETOPT -NETLINK_SELINUX_SOCKET__SHUTDOWN = _selinux.NETLINK_SELINUX_SOCKET__SHUTDOWN -NETLINK_SELINUX_SOCKET__RECVFROM = _selinux.NETLINK_SELINUX_SOCKET__RECVFROM -NETLINK_SELINUX_SOCKET__SENDTO = _selinux.NETLINK_SELINUX_SOCKET__SENDTO -NETLINK_SELINUX_SOCKET__RECV_MSG = _selinux.NETLINK_SELINUX_SOCKET__RECV_MSG -NETLINK_SELINUX_SOCKET__SEND_MSG = _selinux.NETLINK_SELINUX_SOCKET__SEND_MSG -NETLINK_SELINUX_SOCKET__NAME_BIND = _selinux.NETLINK_SELINUX_SOCKET__NAME_BIND -NETLINK_AUDIT_SOCKET__IOCTL = _selinux.NETLINK_AUDIT_SOCKET__IOCTL -NETLINK_AUDIT_SOCKET__READ = _selinux.NETLINK_AUDIT_SOCKET__READ -NETLINK_AUDIT_SOCKET__WRITE = _selinux.NETLINK_AUDIT_SOCKET__WRITE -NETLINK_AUDIT_SOCKET__CREATE = _selinux.NETLINK_AUDIT_SOCKET__CREATE -NETLINK_AUDIT_SOCKET__GETATTR = _selinux.NETLINK_AUDIT_SOCKET__GETATTR -NETLINK_AUDIT_SOCKET__SETATTR = _selinux.NETLINK_AUDIT_SOCKET__SETATTR -NETLINK_AUDIT_SOCKET__LOCK = _selinux.NETLINK_AUDIT_SOCKET__LOCK -NETLINK_AUDIT_SOCKET__RELABELFROM = _selinux.NETLINK_AUDIT_SOCKET__RELABELFROM -NETLINK_AUDIT_SOCKET__RELABELTO = _selinux.NETLINK_AUDIT_SOCKET__RELABELTO -NETLINK_AUDIT_SOCKET__APPEND = _selinux.NETLINK_AUDIT_SOCKET__APPEND -NETLINK_AUDIT_SOCKET__BIND = _selinux.NETLINK_AUDIT_SOCKET__BIND -NETLINK_AUDIT_SOCKET__CONNECT = _selinux.NETLINK_AUDIT_SOCKET__CONNECT -NETLINK_AUDIT_SOCKET__LISTEN = _selinux.NETLINK_AUDIT_SOCKET__LISTEN -NETLINK_AUDIT_SOCKET__ACCEPT = _selinux.NETLINK_AUDIT_SOCKET__ACCEPT -NETLINK_AUDIT_SOCKET__GETOPT = _selinux.NETLINK_AUDIT_SOCKET__GETOPT -NETLINK_AUDIT_SOCKET__SETOPT = _selinux.NETLINK_AUDIT_SOCKET__SETOPT -NETLINK_AUDIT_SOCKET__SHUTDOWN = _selinux.NETLINK_AUDIT_SOCKET__SHUTDOWN -NETLINK_AUDIT_SOCKET__RECVFROM = _selinux.NETLINK_AUDIT_SOCKET__RECVFROM -NETLINK_AUDIT_SOCKET__SENDTO = _selinux.NETLINK_AUDIT_SOCKET__SENDTO -NETLINK_AUDIT_SOCKET__RECV_MSG = _selinux.NETLINK_AUDIT_SOCKET__RECV_MSG -NETLINK_AUDIT_SOCKET__SEND_MSG = _selinux.NETLINK_AUDIT_SOCKET__SEND_MSG -NETLINK_AUDIT_SOCKET__NAME_BIND = _selinux.NETLINK_AUDIT_SOCKET__NAME_BIND -NETLINK_AUDIT_SOCKET__NLMSG_READ = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_READ -NETLINK_AUDIT_SOCKET__NLMSG_WRITE = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_WRITE -NETLINK_AUDIT_SOCKET__NLMSG_RELAY = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_RELAY -NETLINK_AUDIT_SOCKET__NLMSG_READPRIV = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_READPRIV -NETLINK_AUDIT_SOCKET__NLMSG_TTY_AUDIT = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_TTY_AUDIT -NETLINK_IP6FW_SOCKET__IOCTL = _selinux.NETLINK_IP6FW_SOCKET__IOCTL -NETLINK_IP6FW_SOCKET__READ = _selinux.NETLINK_IP6FW_SOCKET__READ -NETLINK_IP6FW_SOCKET__WRITE = _selinux.NETLINK_IP6FW_SOCKET__WRITE -NETLINK_IP6FW_SOCKET__CREATE = _selinux.NETLINK_IP6FW_SOCKET__CREATE -NETLINK_IP6FW_SOCKET__GETATTR = _selinux.NETLINK_IP6FW_SOCKET__GETATTR -NETLINK_IP6FW_SOCKET__SETATTR = _selinux.NETLINK_IP6FW_SOCKET__SETATTR -NETLINK_IP6FW_SOCKET__LOCK = _selinux.NETLINK_IP6FW_SOCKET__LOCK -NETLINK_IP6FW_SOCKET__RELABELFROM = _selinux.NETLINK_IP6FW_SOCKET__RELABELFROM -NETLINK_IP6FW_SOCKET__RELABELTO = _selinux.NETLINK_IP6FW_SOCKET__RELABELTO -NETLINK_IP6FW_SOCKET__APPEND = _selinux.NETLINK_IP6FW_SOCKET__APPEND -NETLINK_IP6FW_SOCKET__BIND = _selinux.NETLINK_IP6FW_SOCKET__BIND -NETLINK_IP6FW_SOCKET__CONNECT = _selinux.NETLINK_IP6FW_SOCKET__CONNECT -NETLINK_IP6FW_SOCKET__LISTEN = _selinux.NETLINK_IP6FW_SOCKET__LISTEN -NETLINK_IP6FW_SOCKET__ACCEPT = _selinux.NETLINK_IP6FW_SOCKET__ACCEPT -NETLINK_IP6FW_SOCKET__GETOPT = _selinux.NETLINK_IP6FW_SOCKET__GETOPT -NETLINK_IP6FW_SOCKET__SETOPT = _selinux.NETLINK_IP6FW_SOCKET__SETOPT -NETLINK_IP6FW_SOCKET__SHUTDOWN = _selinux.NETLINK_IP6FW_SOCKET__SHUTDOWN -NETLINK_IP6FW_SOCKET__RECVFROM = _selinux.NETLINK_IP6FW_SOCKET__RECVFROM -NETLINK_IP6FW_SOCKET__SENDTO = _selinux.NETLINK_IP6FW_SOCKET__SENDTO -NETLINK_IP6FW_SOCKET__RECV_MSG = _selinux.NETLINK_IP6FW_SOCKET__RECV_MSG -NETLINK_IP6FW_SOCKET__SEND_MSG = _selinux.NETLINK_IP6FW_SOCKET__SEND_MSG -NETLINK_IP6FW_SOCKET__NAME_BIND = _selinux.NETLINK_IP6FW_SOCKET__NAME_BIND -NETLINK_IP6FW_SOCKET__NLMSG_READ = _selinux.NETLINK_IP6FW_SOCKET__NLMSG_READ -NETLINK_IP6FW_SOCKET__NLMSG_WRITE = _selinux.NETLINK_IP6FW_SOCKET__NLMSG_WRITE -NETLINK_DNRT_SOCKET__IOCTL = _selinux.NETLINK_DNRT_SOCKET__IOCTL -NETLINK_DNRT_SOCKET__READ = _selinux.NETLINK_DNRT_SOCKET__READ -NETLINK_DNRT_SOCKET__WRITE = _selinux.NETLINK_DNRT_SOCKET__WRITE -NETLINK_DNRT_SOCKET__CREATE = _selinux.NETLINK_DNRT_SOCKET__CREATE -NETLINK_DNRT_SOCKET__GETATTR = _selinux.NETLINK_DNRT_SOCKET__GETATTR -NETLINK_DNRT_SOCKET__SETATTR = _selinux.NETLINK_DNRT_SOCKET__SETATTR -NETLINK_DNRT_SOCKET__LOCK = _selinux.NETLINK_DNRT_SOCKET__LOCK -NETLINK_DNRT_SOCKET__RELABELFROM = _selinux.NETLINK_DNRT_SOCKET__RELABELFROM -NETLINK_DNRT_SOCKET__RELABELTO = _selinux.NETLINK_DNRT_SOCKET__RELABELTO -NETLINK_DNRT_SOCKET__APPEND = _selinux.NETLINK_DNRT_SOCKET__APPEND -NETLINK_DNRT_SOCKET__BIND = _selinux.NETLINK_DNRT_SOCKET__BIND -NETLINK_DNRT_SOCKET__CONNECT = _selinux.NETLINK_DNRT_SOCKET__CONNECT -NETLINK_DNRT_SOCKET__LISTEN = _selinux.NETLINK_DNRT_SOCKET__LISTEN -NETLINK_DNRT_SOCKET__ACCEPT = _selinux.NETLINK_DNRT_SOCKET__ACCEPT -NETLINK_DNRT_SOCKET__GETOPT = _selinux.NETLINK_DNRT_SOCKET__GETOPT -NETLINK_DNRT_SOCKET__SETOPT = _selinux.NETLINK_DNRT_SOCKET__SETOPT -NETLINK_DNRT_SOCKET__SHUTDOWN = _selinux.NETLINK_DNRT_SOCKET__SHUTDOWN -NETLINK_DNRT_SOCKET__RECVFROM = _selinux.NETLINK_DNRT_SOCKET__RECVFROM -NETLINK_DNRT_SOCKET__SENDTO = _selinux.NETLINK_DNRT_SOCKET__SENDTO -NETLINK_DNRT_SOCKET__RECV_MSG = _selinux.NETLINK_DNRT_SOCKET__RECV_MSG -NETLINK_DNRT_SOCKET__SEND_MSG = _selinux.NETLINK_DNRT_SOCKET__SEND_MSG -NETLINK_DNRT_SOCKET__NAME_BIND = _selinux.NETLINK_DNRT_SOCKET__NAME_BIND -DBUS__ACQUIRE_SVC = _selinux.DBUS__ACQUIRE_SVC -DBUS__SEND_MSG = _selinux.DBUS__SEND_MSG -NSCD__GETPWD = _selinux.NSCD__GETPWD -NSCD__GETGRP = _selinux.NSCD__GETGRP -NSCD__GETHOST = _selinux.NSCD__GETHOST -NSCD__GETSTAT = _selinux.NSCD__GETSTAT -NSCD__ADMIN = _selinux.NSCD__ADMIN -NSCD__SHMEMPWD = _selinux.NSCD__SHMEMPWD -NSCD__SHMEMGRP = _selinux.NSCD__SHMEMGRP -NSCD__SHMEMHOST = _selinux.NSCD__SHMEMHOST -NSCD__GETSERV = _selinux.NSCD__GETSERV -NSCD__SHMEMSERV = _selinux.NSCD__SHMEMSERV -ASSOCIATION__SENDTO = _selinux.ASSOCIATION__SENDTO -ASSOCIATION__RECVFROM = _selinux.ASSOCIATION__RECVFROM -ASSOCIATION__SETCONTEXT = _selinux.ASSOCIATION__SETCONTEXT -ASSOCIATION__POLMATCH = _selinux.ASSOCIATION__POLMATCH -NETLINK_KOBJECT_UEVENT_SOCKET__IOCTL = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__IOCTL -NETLINK_KOBJECT_UEVENT_SOCKET__READ = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__READ -NETLINK_KOBJECT_UEVENT_SOCKET__WRITE = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__WRITE -NETLINK_KOBJECT_UEVENT_SOCKET__CREATE = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__CREATE -NETLINK_KOBJECT_UEVENT_SOCKET__GETATTR = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__GETATTR -NETLINK_KOBJECT_UEVENT_SOCKET__SETATTR = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SETATTR -NETLINK_KOBJECT_UEVENT_SOCKET__LOCK = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__LOCK -NETLINK_KOBJECT_UEVENT_SOCKET__RELABELFROM = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RELABELFROM -NETLINK_KOBJECT_UEVENT_SOCKET__RELABELTO = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RELABELTO -NETLINK_KOBJECT_UEVENT_SOCKET__APPEND = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__APPEND -NETLINK_KOBJECT_UEVENT_SOCKET__BIND = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__BIND -NETLINK_KOBJECT_UEVENT_SOCKET__CONNECT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__CONNECT -NETLINK_KOBJECT_UEVENT_SOCKET__LISTEN = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__LISTEN -NETLINK_KOBJECT_UEVENT_SOCKET__ACCEPT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__ACCEPT -NETLINK_KOBJECT_UEVENT_SOCKET__GETOPT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__GETOPT -NETLINK_KOBJECT_UEVENT_SOCKET__SETOPT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SETOPT -NETLINK_KOBJECT_UEVENT_SOCKET__SHUTDOWN = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SHUTDOWN -NETLINK_KOBJECT_UEVENT_SOCKET__RECVFROM = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RECVFROM -NETLINK_KOBJECT_UEVENT_SOCKET__SENDTO = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SENDTO -NETLINK_KOBJECT_UEVENT_SOCKET__RECV_MSG = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RECV_MSG -NETLINK_KOBJECT_UEVENT_SOCKET__SEND_MSG = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SEND_MSG -NETLINK_KOBJECT_UEVENT_SOCKET__NAME_BIND = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__NAME_BIND -APPLETALK_SOCKET__IOCTL = _selinux.APPLETALK_SOCKET__IOCTL -APPLETALK_SOCKET__READ = _selinux.APPLETALK_SOCKET__READ -APPLETALK_SOCKET__WRITE = _selinux.APPLETALK_SOCKET__WRITE -APPLETALK_SOCKET__CREATE = _selinux.APPLETALK_SOCKET__CREATE -APPLETALK_SOCKET__GETATTR = _selinux.APPLETALK_SOCKET__GETATTR -APPLETALK_SOCKET__SETATTR = _selinux.APPLETALK_SOCKET__SETATTR -APPLETALK_SOCKET__LOCK = _selinux.APPLETALK_SOCKET__LOCK -APPLETALK_SOCKET__RELABELFROM = _selinux.APPLETALK_SOCKET__RELABELFROM -APPLETALK_SOCKET__RELABELTO = _selinux.APPLETALK_SOCKET__RELABELTO -APPLETALK_SOCKET__APPEND = _selinux.APPLETALK_SOCKET__APPEND -APPLETALK_SOCKET__BIND = _selinux.APPLETALK_SOCKET__BIND -APPLETALK_SOCKET__CONNECT = _selinux.APPLETALK_SOCKET__CONNECT -APPLETALK_SOCKET__LISTEN = _selinux.APPLETALK_SOCKET__LISTEN -APPLETALK_SOCKET__ACCEPT = _selinux.APPLETALK_SOCKET__ACCEPT -APPLETALK_SOCKET__GETOPT = _selinux.APPLETALK_SOCKET__GETOPT -APPLETALK_SOCKET__SETOPT = _selinux.APPLETALK_SOCKET__SETOPT -APPLETALK_SOCKET__SHUTDOWN = _selinux.APPLETALK_SOCKET__SHUTDOWN -APPLETALK_SOCKET__RECVFROM = _selinux.APPLETALK_SOCKET__RECVFROM -APPLETALK_SOCKET__SENDTO = _selinux.APPLETALK_SOCKET__SENDTO -APPLETALK_SOCKET__RECV_MSG = _selinux.APPLETALK_SOCKET__RECV_MSG -APPLETALK_SOCKET__SEND_MSG = _selinux.APPLETALK_SOCKET__SEND_MSG -APPLETALK_SOCKET__NAME_BIND = _selinux.APPLETALK_SOCKET__NAME_BIND -PACKET__SEND = _selinux.PACKET__SEND -PACKET__RECV = _selinux.PACKET__RECV -PACKET__RELABELTO = _selinux.PACKET__RELABELTO -PACKET__FLOW_IN = _selinux.PACKET__FLOW_IN -PACKET__FLOW_OUT = _selinux.PACKET__FLOW_OUT -PACKET__FORWARD_IN = _selinux.PACKET__FORWARD_IN -PACKET__FORWARD_OUT = _selinux.PACKET__FORWARD_OUT -KEY__VIEW = _selinux.KEY__VIEW -KEY__READ = _selinux.KEY__READ -KEY__WRITE = _selinux.KEY__WRITE -KEY__SEARCH = _selinux.KEY__SEARCH -KEY__LINK = _selinux.KEY__LINK -KEY__SETATTR = _selinux.KEY__SETATTR -KEY__CREATE = _selinux.KEY__CREATE -CONTEXT__TRANSLATE = _selinux.CONTEXT__TRANSLATE -CONTEXT__CONTAINS = _selinux.CONTEXT__CONTAINS -DCCP_SOCKET__IOCTL = _selinux.DCCP_SOCKET__IOCTL -DCCP_SOCKET__READ = _selinux.DCCP_SOCKET__READ -DCCP_SOCKET__WRITE = _selinux.DCCP_SOCKET__WRITE -DCCP_SOCKET__CREATE = _selinux.DCCP_SOCKET__CREATE -DCCP_SOCKET__GETATTR = _selinux.DCCP_SOCKET__GETATTR -DCCP_SOCKET__SETATTR = _selinux.DCCP_SOCKET__SETATTR -DCCP_SOCKET__LOCK = _selinux.DCCP_SOCKET__LOCK -DCCP_SOCKET__RELABELFROM = _selinux.DCCP_SOCKET__RELABELFROM -DCCP_SOCKET__RELABELTO = _selinux.DCCP_SOCKET__RELABELTO -DCCP_SOCKET__APPEND = _selinux.DCCP_SOCKET__APPEND -DCCP_SOCKET__BIND = _selinux.DCCP_SOCKET__BIND -DCCP_SOCKET__CONNECT = _selinux.DCCP_SOCKET__CONNECT -DCCP_SOCKET__LISTEN = _selinux.DCCP_SOCKET__LISTEN -DCCP_SOCKET__ACCEPT = _selinux.DCCP_SOCKET__ACCEPT -DCCP_SOCKET__GETOPT = _selinux.DCCP_SOCKET__GETOPT -DCCP_SOCKET__SETOPT = _selinux.DCCP_SOCKET__SETOPT -DCCP_SOCKET__SHUTDOWN = _selinux.DCCP_SOCKET__SHUTDOWN -DCCP_SOCKET__RECVFROM = _selinux.DCCP_SOCKET__RECVFROM -DCCP_SOCKET__SENDTO = _selinux.DCCP_SOCKET__SENDTO -DCCP_SOCKET__RECV_MSG = _selinux.DCCP_SOCKET__RECV_MSG -DCCP_SOCKET__SEND_MSG = _selinux.DCCP_SOCKET__SEND_MSG -DCCP_SOCKET__NAME_BIND = _selinux.DCCP_SOCKET__NAME_BIND -DCCP_SOCKET__NODE_BIND = _selinux.DCCP_SOCKET__NODE_BIND -DCCP_SOCKET__NAME_CONNECT = _selinux.DCCP_SOCKET__NAME_CONNECT -MEMPROTECT__MMAP_ZERO = _selinux.MEMPROTECT__MMAP_ZERO -DB_DATABASE__CREATE = _selinux.DB_DATABASE__CREATE -DB_DATABASE__DROP = _selinux.DB_DATABASE__DROP -DB_DATABASE__GETATTR = _selinux.DB_DATABASE__GETATTR -DB_DATABASE__SETATTR = _selinux.DB_DATABASE__SETATTR -DB_DATABASE__RELABELFROM = _selinux.DB_DATABASE__RELABELFROM -DB_DATABASE__RELABELTO = _selinux.DB_DATABASE__RELABELTO -DB_DATABASE__ACCESS = _selinux.DB_DATABASE__ACCESS -DB_DATABASE__INSTALL_MODULE = _selinux.DB_DATABASE__INSTALL_MODULE -DB_DATABASE__LOAD_MODULE = _selinux.DB_DATABASE__LOAD_MODULE -DB_DATABASE__GET_PARAM = _selinux.DB_DATABASE__GET_PARAM -DB_DATABASE__SET_PARAM = _selinux.DB_DATABASE__SET_PARAM -DB_TABLE__CREATE = _selinux.DB_TABLE__CREATE -DB_TABLE__DROP = _selinux.DB_TABLE__DROP -DB_TABLE__GETATTR = _selinux.DB_TABLE__GETATTR -DB_TABLE__SETATTR = _selinux.DB_TABLE__SETATTR -DB_TABLE__RELABELFROM = _selinux.DB_TABLE__RELABELFROM -DB_TABLE__RELABELTO = _selinux.DB_TABLE__RELABELTO -DB_TABLE__USE = _selinux.DB_TABLE__USE -DB_TABLE__SELECT = _selinux.DB_TABLE__SELECT -DB_TABLE__UPDATE = _selinux.DB_TABLE__UPDATE -DB_TABLE__INSERT = _selinux.DB_TABLE__INSERT -DB_TABLE__DELETE = _selinux.DB_TABLE__DELETE -DB_TABLE__LOCK = _selinux.DB_TABLE__LOCK -DB_PROCEDURE__CREATE = _selinux.DB_PROCEDURE__CREATE -DB_PROCEDURE__DROP = _selinux.DB_PROCEDURE__DROP -DB_PROCEDURE__GETATTR = _selinux.DB_PROCEDURE__GETATTR -DB_PROCEDURE__SETATTR = _selinux.DB_PROCEDURE__SETATTR -DB_PROCEDURE__RELABELFROM = _selinux.DB_PROCEDURE__RELABELFROM -DB_PROCEDURE__RELABELTO = _selinux.DB_PROCEDURE__RELABELTO -DB_PROCEDURE__EXECUTE = _selinux.DB_PROCEDURE__EXECUTE -DB_PROCEDURE__ENTRYPOINT = _selinux.DB_PROCEDURE__ENTRYPOINT -DB_COLUMN__CREATE = _selinux.DB_COLUMN__CREATE -DB_COLUMN__DROP = _selinux.DB_COLUMN__DROP -DB_COLUMN__GETATTR = _selinux.DB_COLUMN__GETATTR -DB_COLUMN__SETATTR = _selinux.DB_COLUMN__SETATTR -DB_COLUMN__RELABELFROM = _selinux.DB_COLUMN__RELABELFROM -DB_COLUMN__RELABELTO = _selinux.DB_COLUMN__RELABELTO -DB_COLUMN__USE = _selinux.DB_COLUMN__USE -DB_COLUMN__SELECT = _selinux.DB_COLUMN__SELECT -DB_COLUMN__UPDATE = _selinux.DB_COLUMN__UPDATE -DB_COLUMN__INSERT = _selinux.DB_COLUMN__INSERT -DB_TUPLE__RELABELFROM = _selinux.DB_TUPLE__RELABELFROM -DB_TUPLE__RELABELTO = _selinux.DB_TUPLE__RELABELTO -DB_TUPLE__USE = _selinux.DB_TUPLE__USE -DB_TUPLE__SELECT = _selinux.DB_TUPLE__SELECT -DB_TUPLE__UPDATE = _selinux.DB_TUPLE__UPDATE -DB_TUPLE__INSERT = _selinux.DB_TUPLE__INSERT -DB_TUPLE__DELETE = _selinux.DB_TUPLE__DELETE -DB_BLOB__CREATE = _selinux.DB_BLOB__CREATE -DB_BLOB__DROP = _selinux.DB_BLOB__DROP -DB_BLOB__GETATTR = _selinux.DB_BLOB__GETATTR -DB_BLOB__SETATTR = _selinux.DB_BLOB__SETATTR -DB_BLOB__RELABELFROM = _selinux.DB_BLOB__RELABELFROM -DB_BLOB__RELABELTO = _selinux.DB_BLOB__RELABELTO -DB_BLOB__READ = _selinux.DB_BLOB__READ -DB_BLOB__WRITE = _selinux.DB_BLOB__WRITE -DB_BLOB__IMPORT = _selinux.DB_BLOB__IMPORT -DB_BLOB__EXPORT = _selinux.DB_BLOB__EXPORT -PEER__RECV = _selinux.PEER__RECV -X_APPLICATION_DATA__PASTE = _selinux.X_APPLICATION_DATA__PASTE -X_APPLICATION_DATA__PASTE_AFTER_CONFIRM = _selinux.X_APPLICATION_DATA__PASTE_AFTER_CONFIRM -X_APPLICATION_DATA__COPY = _selinux.X_APPLICATION_DATA__COPY class context_s_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, context_s_t, name, value) @@ -1492,107 +472,6 @@ context_role_set = _selinux.context_role_set def context_user_set(*args): return _selinux.context_user_set(*args) context_user_set = _selinux.context_user_set -SECCLASS_SECURITY = _selinux.SECCLASS_SECURITY -SECCLASS_PROCESS = _selinux.SECCLASS_PROCESS -SECCLASS_SYSTEM = _selinux.SECCLASS_SYSTEM -SECCLASS_CAPABILITY = _selinux.SECCLASS_CAPABILITY -SECCLASS_FILESYSTEM = _selinux.SECCLASS_FILESYSTEM -SECCLASS_FILE = _selinux.SECCLASS_FILE -SECCLASS_DIR = _selinux.SECCLASS_DIR -SECCLASS_FD = _selinux.SECCLASS_FD -SECCLASS_LNK_FILE = _selinux.SECCLASS_LNK_FILE -SECCLASS_CHR_FILE = _selinux.SECCLASS_CHR_FILE -SECCLASS_BLK_FILE = _selinux.SECCLASS_BLK_FILE -SECCLASS_SOCK_FILE = _selinux.SECCLASS_SOCK_FILE -SECCLASS_FIFO_FILE = _selinux.SECCLASS_FIFO_FILE -SECCLASS_SOCKET = _selinux.SECCLASS_SOCKET -SECCLASS_TCP_SOCKET = _selinux.SECCLASS_TCP_SOCKET -SECCLASS_UDP_SOCKET = _selinux.SECCLASS_UDP_SOCKET -SECCLASS_RAWIP_SOCKET = _selinux.SECCLASS_RAWIP_SOCKET -SECCLASS_NODE = _selinux.SECCLASS_NODE -SECCLASS_NETIF = _selinux.SECCLASS_NETIF -SECCLASS_NETLINK_SOCKET = _selinux.SECCLASS_NETLINK_SOCKET -SECCLASS_PACKET_SOCKET = _selinux.SECCLASS_PACKET_SOCKET -SECCLASS_KEY_SOCKET = _selinux.SECCLASS_KEY_SOCKET -SECCLASS_UNIX_STREAM_SOCKET = _selinux.SECCLASS_UNIX_STREAM_SOCKET -SECCLASS_UNIX_DGRAM_SOCKET = _selinux.SECCLASS_UNIX_DGRAM_SOCKET -SECCLASS_SEM = _selinux.SECCLASS_SEM -SECCLASS_MSG = _selinux.SECCLASS_MSG -SECCLASS_MSGQ = _selinux.SECCLASS_MSGQ -SECCLASS_SHM = _selinux.SECCLASS_SHM -SECCLASS_IPC = _selinux.SECCLASS_IPC -SECCLASS_PASSWD = _selinux.SECCLASS_PASSWD -SECCLASS_X_DRAWABLE = _selinux.SECCLASS_X_DRAWABLE -SECCLASS_X_SCREEN = _selinux.SECCLASS_X_SCREEN -SECCLASS_X_GC = _selinux.SECCLASS_X_GC -SECCLASS_X_FONT = _selinux.SECCLASS_X_FONT -SECCLASS_X_COLORMAP = _selinux.SECCLASS_X_COLORMAP -SECCLASS_X_PROPERTY = _selinux.SECCLASS_X_PROPERTY -SECCLASS_X_SELECTION = _selinux.SECCLASS_X_SELECTION -SECCLASS_X_CURSOR = _selinux.SECCLASS_X_CURSOR -SECCLASS_X_CLIENT = _selinux.SECCLASS_X_CLIENT -SECCLASS_X_DEVICE = _selinux.SECCLASS_X_DEVICE -SECCLASS_X_SERVER = _selinux.SECCLASS_X_SERVER -SECCLASS_X_EXTENSION = _selinux.SECCLASS_X_EXTENSION -SECCLASS_NETLINK_ROUTE_SOCKET = _selinux.SECCLASS_NETLINK_ROUTE_SOCKET -SECCLASS_NETLINK_FIREWALL_SOCKET = _selinux.SECCLASS_NETLINK_FIREWALL_SOCKET -SECCLASS_NETLINK_TCPDIAG_SOCKET = _selinux.SECCLASS_NETLINK_TCPDIAG_SOCKET -SECCLASS_NETLINK_NFLOG_SOCKET = _selinux.SECCLASS_NETLINK_NFLOG_SOCKET -SECCLASS_NETLINK_XFRM_SOCKET = _selinux.SECCLASS_NETLINK_XFRM_SOCKET -SECCLASS_NETLINK_SELINUX_SOCKET = _selinux.SECCLASS_NETLINK_SELINUX_SOCKET -SECCLASS_NETLINK_AUDIT_SOCKET = _selinux.SECCLASS_NETLINK_AUDIT_SOCKET -SECCLASS_NETLINK_IP6FW_SOCKET = _selinux.SECCLASS_NETLINK_IP6FW_SOCKET -SECCLASS_NETLINK_DNRT_SOCKET = _selinux.SECCLASS_NETLINK_DNRT_SOCKET -SECCLASS_DBUS = _selinux.SECCLASS_DBUS -SECCLASS_NSCD = _selinux.SECCLASS_NSCD -SECCLASS_ASSOCIATION = _selinux.SECCLASS_ASSOCIATION -SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET = _selinux.SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET -SECCLASS_APPLETALK_SOCKET = _selinux.SECCLASS_APPLETALK_SOCKET -SECCLASS_PACKET = _selinux.SECCLASS_PACKET -SECCLASS_KEY = _selinux.SECCLASS_KEY -SECCLASS_CONTEXT = _selinux.SECCLASS_CONTEXT -SECCLASS_DCCP_SOCKET = _selinux.SECCLASS_DCCP_SOCKET -SECCLASS_MEMPROTECT = _selinux.SECCLASS_MEMPROTECT -SECCLASS_DB_DATABASE = _selinux.SECCLASS_DB_DATABASE -SECCLASS_DB_TABLE = _selinux.SECCLASS_DB_TABLE -SECCLASS_DB_PROCEDURE = _selinux.SECCLASS_DB_PROCEDURE -SECCLASS_DB_COLUMN = _selinux.SECCLASS_DB_COLUMN -SECCLASS_DB_TUPLE = _selinux.SECCLASS_DB_TUPLE -SECCLASS_DB_BLOB = _selinux.SECCLASS_DB_BLOB -SECCLASS_PEER = _selinux.SECCLASS_PEER -SECCLASS_CAPABILITY2 = _selinux.SECCLASS_CAPABILITY2 -SECCLASS_X_RESOURCE = _selinux.SECCLASS_X_RESOURCE -SECCLASS_X_EVENT = _selinux.SECCLASS_X_EVENT -SECCLASS_X_SYNTHETIC_EVENT = _selinux.SECCLASS_X_SYNTHETIC_EVENT -SECCLASS_X_APPLICATION_DATA = _selinux.SECCLASS_X_APPLICATION_DATA -SECINITSID_KERNEL = _selinux.SECINITSID_KERNEL -SECINITSID_SECURITY = _selinux.SECINITSID_SECURITY -SECINITSID_UNLABELED = _selinux.SECINITSID_UNLABELED -SECINITSID_FS = _selinux.SECINITSID_FS -SECINITSID_FILE = _selinux.SECINITSID_FILE -SECINITSID_FILE_LABELS = _selinux.SECINITSID_FILE_LABELS -SECINITSID_INIT = _selinux.SECINITSID_INIT -SECINITSID_ANY_SOCKET = _selinux.SECINITSID_ANY_SOCKET -SECINITSID_PORT = _selinux.SECINITSID_PORT -SECINITSID_NETIF = _selinux.SECINITSID_NETIF -SECINITSID_NETMSG = _selinux.SECINITSID_NETMSG -SECINITSID_NODE = _selinux.SECINITSID_NODE -SECINITSID_IGMP_PACKET = _selinux.SECINITSID_IGMP_PACKET -SECINITSID_ICMP_SOCKET = _selinux.SECINITSID_ICMP_SOCKET -SECINITSID_TCP_SOCKET = _selinux.SECINITSID_TCP_SOCKET -SECINITSID_SYSCTL_MODPROBE = _selinux.SECINITSID_SYSCTL_MODPROBE -SECINITSID_SYSCTL = _selinux.SECINITSID_SYSCTL -SECINITSID_SYSCTL_FS = _selinux.SECINITSID_SYSCTL_FS -SECINITSID_SYSCTL_KERNEL = _selinux.SECINITSID_SYSCTL_KERNEL -SECINITSID_SYSCTL_NET = _selinux.SECINITSID_SYSCTL_NET -SECINITSID_SYSCTL_NET_UNIX = _selinux.SECINITSID_SYSCTL_NET_UNIX -SECINITSID_SYSCTL_VM = _selinux.SECINITSID_SYSCTL_VM -SECINITSID_SYSCTL_DEV = _selinux.SECINITSID_SYSCTL_DEV -SECINITSID_KMOD = _selinux.SECINITSID_KMOD -SECINITSID_POLICY = _selinux.SECINITSID_POLICY -SECINITSID_SCMP_PACKET = _selinux.SECINITSID_SCMP_PACKET -SECINITSID_DEVNULL = _selinux.SECINITSID_DEVNULL -SECINITSID_NUM = _selinux.SECINITSID_NUM SELINUX_DEFAULTUSER = _selinux.SELINUX_DEFAULTUSER def get_ordered_context_list(*args): @@ -1644,6 +523,7 @@ SELABEL_OPT_VALIDATE = _selinux.SELABEL_OPT_VALIDATE SELABEL_OPT_BASEONLY = _selinux.SELABEL_OPT_BASEONLY SELABEL_OPT_PATH = _selinux.SELABEL_OPT_PATH SELABEL_OPT_SUBSET = _selinux.SELABEL_OPT_SUBSET +SELABEL_OPT_DIGEST = _selinux.SELABEL_OPT_DIGEST SELABEL_NOPT = _selinux.SELABEL_NOPT def selabel_open(*args): @@ -1674,6 +554,18 @@ def selabel_lookup_best_match_raw(*args): return _selinux.selabel_lookup_best_match_raw(*args) selabel_lookup_best_match_raw = _selinux.selabel_lookup_best_match_raw +def selabel_digest(*args): + return _selinux.selabel_digest(*args) +selabel_digest = _selinux.selabel_digest +SELABEL_SUBSET = _selinux.SELABEL_SUBSET +SELABEL_EQUAL = _selinux.SELABEL_EQUAL +SELABEL_SUPERSET = _selinux.SELABEL_SUPERSET +SELABEL_INCOMPARABLE = _selinux.SELABEL_INCOMPARABLE + +def selabel_cmp(*args): + return _selinux.selabel_cmp(*args) +selabel_cmp = _selinux.selabel_cmp + def selabel_stats(*args): return _selinux.selabel_stats(*args) selabel_stats = _selinux.selabel_stats @@ -2317,6 +1209,10 @@ def selinux_sepgsql_context_path(): return _selinux.selinux_sepgsql_context_path() selinux_sepgsql_context_path = _selinux.selinux_sepgsql_context_path +def selinux_openssh_contexts_path(): + return _selinux.selinux_openssh_contexts_path() +selinux_openssh_contexts_path = _selinux.selinux_openssh_contexts_path + def selinux_systemd_contexts_path(): return _selinux.selinux_systemd_contexts_path() selinux_systemd_contexts_path = _selinux.selinux_systemd_contexts_path diff --git a/lib/python2.7/site-packages/selinux/_selinux.so b/lib/python2.7/site-packages/selinux/_selinux.so Binary files differindex f4a045f..c313d2b 100755 --- a/lib/python2.7/site-packages/selinux/_selinux.so +++ b/lib/python2.7/site-packages/selinux/_selinux.so diff --git a/lib/python2.7/site-packages/selinux/audit2why.so b/lib/python2.7/site-packages/selinux/audit2why.so Binary files differindex e7daaab..2c91578 100755 --- a/lib/python2.7/site-packages/selinux/audit2why.so +++ b/lib/python2.7/site-packages/selinux/audit2why.so diff --git a/lib/python2.7/site-packages/setools/__init__.py b/lib/python2.7/site-packages/setools/__init__.py index 4d03553..1108706 100644 --- a/lib/python2.7/site-packages/setools/__init__.py +++ b/lib/python2.7/site-packages/setools/__init__.py @@ -17,13 +17,12 @@ # License along with SETools. If not, see # <http://www.gnu.org/licenses/>. # -#try: -# import pkg_resources -# # pylint: disable=no-member -# __version__ = pkg_resources.get_distribution("setools").version -#except ImportError: # pragma: no cover -# __version__ = "unknown" -__version__ = "3.3.8" +try: + import pkg_resources + # pylint: disable=no-member + __version__ = pkg_resources.get_distribution("setools").version +except ImportError: # pragma: no cover + __version__ = "unknown" # Python classes for policy representation from . import policyrep diff --git a/lib/python2.7/site-packages/setools/dta.py b/lib/python2.7/site-packages/setools/dta.py index 271efc4..53328f4 100644 --- a/lib/python2.7/site-packages/setools/dta.py +++ b/lib/python2.7/site-packages/setools/dta.py @@ -16,6 +16,8 @@ # License along with SETools. If not, see # <http://www.gnu.org/licenses/>. # +# pylint: disable=unsubscriptable-object + import itertools import logging from collections import defaultdict, namedtuple @@ -232,12 +234,12 @@ class DomainTransitionAnalysis(object): """ Get the domain transition graph statistics. - Return: tuple(nodes, edges) - - nodes The number of nodes (types) in the graph. - edges The number of edges (domain transitions) in the graph. + Return: str """ - return (self.G.number_of_nodes(), self.G.number_of_edges()) + if self.rebuildgraph: + self._build_graph() + + return nx.info(self.G) # # Internal functions follow @@ -357,6 +359,7 @@ class DomainTransitionAnalysis(object): # def _build_graph(self): self.G.clear() + self.G.name = "Domain transition graph for {0}.".format(self.policy) self.log.info("Building graph from {0}...".format(self.policy)) diff --git a/lib/python2.7/site-packages/setools/fsusequery.py b/lib/python2.7/site-packages/setools/fsusequery.py index 6825a45..f79f50e 100644 --- a/lib/python2.7/site-packages/setools/fsusequery.py +++ b/lib/python2.7/site-packages/setools/fsusequery.py @@ -20,7 +20,7 @@ import logging import re from . import contextquery -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor +from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor, RuletypeDescriptor class FSUseQuery(contextquery.ContextQuery): @@ -56,7 +56,7 @@ class FSUseQuery(contextquery.ContextQuery): No effect if not using set operations. """ - ruletype = None + ruletype = RuletypeDescriptor("validate_fs_use_ruletype") fs = CriteriaDescriptor("fs_regex") fs_regex = False diff --git a/lib/python2.7/site-packages/setools/infoflow.py b/lib/python2.7/site-packages/setools/infoflow.py index ea3ec32..5812828 100644 --- a/lib/python2.7/site-packages/setools/infoflow.py +++ b/lib/python2.7/site-packages/setools/infoflow.py @@ -18,7 +18,6 @@ # import itertools import logging -from collections import namedtuple import networkx as nx from networkx.exception import NetworkXError, NetworkXNoPath @@ -27,12 +26,6 @@ from .descriptors import EdgeAttrIntMax, EdgeAttrList __all__ = ['InfoFlowAnalysis'] -# Return values for the analysis -# are in the following tuple format: -step_output = namedtuple("step", ["source", - "target", - "rules"]) - class InfoFlowAnalysis(object): @@ -233,7 +226,7 @@ class InfoFlowAnalysis(object): if self.rebuildsubgraph: self._build_subgraph() - self.log.info("Generating all infoflows out of {0}...".format(s)) + self.log.info("Generating all infoflows {0} {1}".format("out of" if out else "into", s)) if out: flows = self.subG.out_edges_iter(s) @@ -242,8 +235,7 @@ class InfoFlowAnalysis(object): try: for source, target in flows: - edge = Edge(self.subG, source, target) - yield step_output(source, target, edge.rules) + yield Edge(self.subG, source, target) except NetworkXError: # NetworkXError: the type is valid but not in graph, e.g. # excluded or disconnected due to min weight @@ -253,13 +245,12 @@ class InfoFlowAnalysis(object): """ Get the information flow graph statistics. - Return: tuple(nodes, edges) - - nodes The number of nodes (types) in the graph. - edges The number of edges (information flows between types) - in the graph. + Return: str """ - return (self.G.number_of_nodes(), self.G.number_of_edges()) + if self.rebuildgraph: + self._build_graph() + + return nx.info(self.G) # # Internal functions follow @@ -280,8 +271,7 @@ class InfoFlowAnalysis(object): rules The list of rules creating this information flow step. """ for s in range(1, len(path)): - edge = Edge(self.subG, path[s - 1], path[s]) - yield step_output(edge.source, edge.target, edge.rules) + yield Edge(self.subG, path[s - 1], path[s]) # # @@ -300,6 +290,7 @@ class InfoFlowAnalysis(object): def _build_graph(self): self.G.clear() + self.G.name = "Information flow graph for {0}.".format(self.policy) self.perm_map.map_policy(self.policy) diff --git a/lib/python2.7/site-packages/setools/mixins.py b/lib/python2.7/site-packages/setools/mixins.py index a31d420..99dc9ff 100644 --- a/lib/python2.7/site-packages/setools/mixins.py +++ b/lib/python2.7/site-packages/setools/mixins.py @@ -75,6 +75,7 @@ class MatchPermission(object): perms = CriteriaSetDescriptor("perms_regex") perms_equal = False perms_regex = False + perms_subset = False def _match_perms(self, obj): """ @@ -88,4 +89,8 @@ class MatchPermission(object): # if there is no criteria, everything matches. return True - return self._match_regex_or_set(obj.perms, self.perms, self.perms_equal, self.perms_regex) + if self.perms_subset: + return obj.perms >= self.perms + else: + return self._match_regex_or_set(obj.perms, self.perms, self.perms_equal, + self.perms_regex) diff --git a/lib/python2.7/site-packages/setools/policyrep/__init__.py b/lib/python2.7/site-packages/setools/policyrep/__init__.py index b03e524..3a4b9a1 100644 --- a/lib/python2.7/site-packages/setools/policyrep/__init__.py +++ b/lib/python2.7/site-packages/setools/policyrep/__init__.py @@ -124,16 +124,15 @@ class SELinuxPolicy(object): @staticmethod def _potential_policies(): """Generate a list of potential policies to use.""" - # Start with binary policies in the standard location + # try libselinux for current policy + if selinux.selinuxfs_exists(): + yield selinux.selinux_current_policy_path() + + # otherwise look through the supported policy versions base_policy_path = selinux.selinux_binary_policy_path() for version in range(qpol.QPOL_POLICY_MAX_VERSION, qpol.QPOL_POLICY_MIN_VERSION-1, -1): yield "{0}.{1}".format(base_policy_path, version) - # Last chance, try selinuxfs. This is not first, to avoid - # holding kernel memory for a long time - if selinux.selinuxfs_exists(): - yield selinux.selinux_current_policy_path() - def _load_running_policy(self): """Try to load the current running policy.""" self.log.info("Attempting to locate current running policy.") @@ -509,6 +508,11 @@ class SELinuxPolicy(object): constraint.validate_ruletype(types) @staticmethod + def validate_fs_use_ruletype(types): + """Validate fs_use_* rule types.""" + fscontext.validate_ruletype(types) + + @staticmethod def validate_mls_ruletype(types): """Validate MLS rule types.""" mlsrule.validate_ruletype(types) diff --git a/lib/python2.7/site-packages/setools/policyrep/_qpol.so b/lib/python2.7/site-packages/setools/policyrep/_qpol.so Binary files differindex aaccf28..aad9de3 100755 --- a/lib/python2.7/site-packages/setools/policyrep/_qpol.so +++ b/lib/python2.7/site-packages/setools/policyrep/_qpol.so diff --git a/lib/python2.7/site-packages/setools/policyrep/exception.py b/lib/python2.7/site-packages/setools/policyrep/exception.py index ce367c0..6935873 100644 --- a/lib/python2.7/site-packages/setools/policyrep/exception.py +++ b/lib/python2.7/site-packages/setools/policyrep/exception.py @@ -157,6 +157,12 @@ class InvalidConstraintType(InvalidSymbol): pass +class InvalidFSUseType(InvalidSymbol): + + """Exception for invalid fs_use_* types.""" + pass + + class InvalidMLSRuleType(InvalidRuleType): """Exception for invalid MLS rule types.""" diff --git a/lib/python2.7/site-packages/setools/policyrep/fscontext.py b/lib/python2.7/site-packages/setools/policyrep/fscontext.py index a17b0bc..215dcd7 100644 --- a/lib/python2.7/site-packages/setools/policyrep/fscontext.py +++ b/lib/python2.7/site-packages/setools/policyrep/fscontext.py @@ -18,11 +18,19 @@ # import stat +from . import exception from . import qpol from . import symbol from . import context +def validate_ruletype(types): + """Validate fs_use_* rule types.""" + for t in types: + if t not in ["fs_use_xattr", "fs_use_trans", "fs_use_task"]: + raise exception.InvalidConstraintType("{0} is not a valid fs_use_* type.".format(t)) + + def fs_use_factory(policy, name): """Factory function for creating fs_use_* objects.""" diff --git a/lib/python2.7/site-packages/setools/policyrep/mls.py b/lib/python2.7/site-packages/setools/policyrep/mls.py index 2541704..cc24026 100644 --- a/lib/python2.7/site-packages/setools/policyrep/mls.py +++ b/lib/python2.7/site-packages/setools/policyrep/mls.py @@ -244,6 +244,10 @@ class Category(BaseMLSComponent): stmt += ";" return stmt + def __lt__(self, other): + """Comparison based on their index instead of their names.""" + return self._value < other._value + class Sensitivity(BaseMLSComponent): diff --git a/lib/python2.7/site-packages/setools/terulequery.py b/lib/python2.7/site-packages/setools/terulequery.py index 7f3eccf..3694160 100644 --- a/lib/python2.7/site-packages/setools/terulequery.py +++ b/lib/python2.7/site-packages/setools/terulequery.py @@ -62,6 +62,10 @@ class TERuleQuery(mixins.MatchObjClass, mixins.MatchPermission, query.PolicyQuer Default is false. perms_regex If true, regular expression matching will be used on the permission names instead of set logic. + Default is false. + perms_subset If true, the rule matches if the permissions criteria + is a subset of the rule's permission set. + Default is false. default The name of the default type to match. default_regex If true, regular expression matching will be used on the default type. diff --git a/lib/python2.7/site-packages/setoolsgui/apol/excludetypes.py b/lib/python2.7/site-packages/setoolsgui/apol/excludetypes.py new file mode 100644 index 0000000..c0b821c --- /dev/null +++ b/lib/python2.7/site-packages/setoolsgui/apol/excludetypes.py @@ -0,0 +1,76 @@ +# Copyright 2015, Tresys Technology, LLC +# +# This file is part of SETools. +# +# SETools is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 2.1 of +# the License, or (at your option) any later version. +# +# SETools is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SETools. If not, see +# <http://www.gnu.org/licenses/>. +# + +import logging + +from PyQt5.QtWidgets import QDialog + +from ..widget import SEToolsWidget + + +class ExcludeTypes(SEToolsWidget, QDialog): + + """Dialog for choosing excluded types.""" + + def __init__(self, parent, policy): + super(ExcludeTypes, self).__init__(parent) + self.log = logging.getLogger(self.__class__.__name__) + self.parent = parent + self.policy = policy + self.excluded_list = [str(e) for e in self.parent.query.exclude] + self.setupUi() + + def setupUi(self): + self.load_ui("exclude_types.ui") + self.exclude_a_type.clicked.connect(self.exclude_clicked) + self.include_a_type.clicked.connect(self.include_clicked) + self.buttonBox.accepted.connect(self.ok_clicked) + + # populate the lists: + self.included_types.clear() + for item in self.policy.types(): + if item not in self.excluded_list: + self.included_types.addItem(str(item)) + + self.excluded_types.clear() + for item in self.excluded_list: + self.excluded_types.addItem(item) + + def include_clicked(self): + for item in self.excluded_types.selectedItems(): + self.included_types.addItem(item.text()) + self.excluded_types.takeItem(self.excluded_types.row(item)) + + def exclude_clicked(self): + for item in self.included_types.selectedItems(): + self.excluded_types.addItem(item.text()) + self.included_types.takeItem(self.included_types.row(item)) + + def ok_clicked(self): + exclude = [] + + item = self.excluded_types.takeItem(0) + while item: + exclude.append(item.text()) + item = self.excluded_types.takeItem(0) + + self.log.debug("Chosen for exclusion: {0!r}".format(exclude)) + + self.parent.query.exclude = exclude + self.accept() diff --git a/lib/python2.7/site-packages/setoolsgui/apol/infoflow.py b/lib/python2.7/site-packages/setoolsgui/apol/infoflow.py new file mode 100644 index 0000000..6e3c547 --- /dev/null +++ b/lib/python2.7/site-packages/setoolsgui/apol/infoflow.py @@ -0,0 +1,265 @@ +# Copyright 2015, Tresys Technology, LLC +# +# This file is part of SETools. +# +# SETools is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 2.1 of +# the License, or (at your option) any later version. +# +# SETools is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SETools. If not, see +# <http://www.gnu.org/licenses/>. +# + +import logging + +from PyQt5.QtCore import pyqtSignal, Qt, QObject, QStringListModel, QThread +from PyQt5.QtGui import QPalette, QTextCursor +from PyQt5.QtWidgets import QCompleter, QHeaderView, QMessageBox, QProgressDialog, QScrollArea +from setools import InfoFlowAnalysis + +from .excludetypes import ExcludeTypes +from ..widget import SEToolsWidget + + +class InfoFlowAnalysisTab(SEToolsWidget, QScrollArea): + + """An information flow analysis tab.""" + + def __init__(self, parent, policy, perm_map): + super(InfoFlowAnalysisTab, self).__init__(parent) + self.log = logging.getLogger(self.__class__.__name__) + self.policy = policy + self.query = InfoFlowAnalysis(policy, perm_map) + self.setupUi() + + def __del__(self): + self.thread.quit() + self.thread.wait(5000) + + def setupUi(self): + self.log.debug("Initializing UI.") + self.load_ui("infoflow.ui") + + # set up source/target autocompletion + type_completion_list = [str(t) for t in self.policy.types()] + type_completer_model = QStringListModel(self) + type_completer_model.setStringList(sorted(type_completion_list)) + self.type_completion = QCompleter() + self.type_completion.setModel(type_completer_model) + self.source.setCompleter(self.type_completion) + self.target.setCompleter(self.type_completion) + + # setup indications of errors on source/target/default + self.orig_palette = self.source.palette() + self.error_palette = self.source.palette() + self.error_palette.setColor(QPalette.Base, Qt.red) + self.clear_source_error() + self.clear_target_error() + + # set up processing thread + self.thread = QThread() + self.worker = ResultsUpdater(self.query) + self.worker.moveToThread(self.thread) + self.worker.raw_line.connect(self.raw_results.appendPlainText) + self.worker.finished.connect(self.thread.quit) + self.thread.started.connect(self.worker.update) + self.thread.finished.connect(self.update_complete) + + # create a "busy, please wait" dialog + self.busy = QProgressDialog(self) + self.busy.setModal(True) + self.busy.setLabelText("Processing analysis...") + self.busy.setRange(0, 0) + self.busy.setMinimumDuration(0) + self.busy.canceled.connect(self.thread.requestInterruption) + + # Ensure settings are consistent with the initial .ui state + self.max_path_length.setEnabled(self.all_paths.isChecked()) + self.source.setEnabled(not self.flows_in.isChecked()) + self.target.setEnabled(not self.flows_out.isChecked()) + self.criteria_frame.setHidden(not self.criteria_expander.isChecked()) + self.results_frame.setHidden(not self.results_expander.isChecked()) + self.notes.setHidden(not self.notes_expander.isChecked()) + + # connect signals + self.buttonBox.clicked.connect(self.run) + self.source.textEdited.connect(self.clear_source_error) + self.source.editingFinished.connect(self.set_source) + self.target.textEdited.connect(self.clear_target_error) + self.target.editingFinished.connect(self.set_target) + self.all_paths.toggled.connect(self.all_paths_toggled) + self.flows_in.toggled.connect(self.flows_in_toggled) + self.flows_out.toggled.connect(self.flows_out_toggled) + self.min_perm_weight.valueChanged.connect(self.set_min_weight) + self.exclude_types.clicked.connect(self.choose_excluded_types) + + # + # Analysis mode + # + def all_paths_toggled(self, value): + self.max_path_length.setEnabled(value) + + def flows_in_toggled(self, value): + self.source.setEnabled(not value) + + def flows_out_toggled(self, value): + self.target.setEnabled(not value) + + # + # Source criteria + # + + def clear_source_error(self): + self.source.setToolTip("The target type of the analysis.") + self.source.setPalette(self.orig_palette) + + def set_source(self): + try: + # look up the type here, so invalid types can be caught immediately + text = self.source.text() + if text: + self.query.source = self.policy.lookup_type(text) + else: + self.query.source = None + except Exception as ex: + self.source.setToolTip("Error: " + str(ex)) + self.source.setPalette(self.error_palette) + + # + # Target criteria + # + + def clear_target_error(self): + self.target.setToolTip("The source type of the analysis.") + self.target.setPalette(self.orig_palette) + + def set_target(self): + try: + # look up the type here, so invalid types can be caught immediately + text = self.target.text() + if text: + self.query.target = self.policy.lookup_type(text) + else: + self.query.target = None + except Exception as ex: + self.target.setToolTip("Error: " + str(ex)) + self.target.setPalette(self.error_palette) + + # + # Options + # + def set_min_weight(self, value): + self.query.min_weight = value + + def choose_excluded_types(self): + chooser = ExcludeTypes(self, self.policy) + chooser.show() + + # + # Results runner + # + + def run(self, button): + # right now there is only one button. + for mode in [self.all_paths, self.all_shortest_paths, self.flows_in, self.flows_out]: + if mode.isChecked(): + break + + self.query.mode = mode.objectName() + self.query.max_path_len = self.max_path_length.value() + self.query.limit = self.limit_paths.value() + + # start processing + self.busy.show() + self.raw_results.clear() + self.thread.start() + + def update_complete(self): + # update location of result display + self.raw_results.moveCursor(QTextCursor.Start) + + self.busy.reset() + + +class ResultsUpdater(QObject): + + """ + Thread for processing queries and updating result widgets. + + Parameters: + query The query object + model The model for the results + + Qt signals: + finished The update has completed. + raw_line (str) A string to be appended to the raw results. + """ + + finished = pyqtSignal() + raw_line = pyqtSignal(str) + + def __init__(self, query): + super(ResultsUpdater, self).__init__() + self.query = query + + def update(self): + """Run the query and update results.""" + + assert self.query.limit, "Code doesn't currently handle unlimited (limit=0) paths." + if self.query.mode == "all_paths": + self.transitive(self.query.all_paths(self.query.source, self.query.target, + self.query.max_path_len)) + elif self.query.mode == "all_shortest_paths": + self.transitive(self.query.all_shortest_paths(self.query.source, self.query.target)) + elif self.query.mode == "flows_out": + self.direct(self.query.infoflows(self.query.source, out=True)) + else: # flows_in + self.direct(self.query.infoflows(self.query.target, out=False)) + + self.finished.emit() + + def transitive(self, paths): + pathnum = 0 + for pathnum, path in enumerate(paths, start=1): + self.raw_line.emit("Flow {0}:".format(pathnum)) + for stepnum, step in enumerate(path, start=1): + self.raw_line.emit(" Step {0}: {1} -> {2}".format(stepnum, + step.source, + step.target)) + + for rule in sorted(step.rules): + self.raw_line.emit(" {0}".format(rule)) + + self.raw_line.emit("") + + if QThread.currentThread().isInterruptionRequested() or (pathnum >= self.query.limit): + break + else: + QThread.yieldCurrentThread() + + self.raw_line.emit("") + + self.raw_line.emit("{0} information flow path(s) found.\n".format(pathnum)) + + def direct(self, flows): + flownum = 0 + for flownum, flow in enumerate(flows, start=1): + self.raw_line.emit("Flow {0}: {1} -> {2}".format(flownum, flow.source, flow.target)) + for rule in sorted(flow.rules): + self.raw_line.emit(" {0}".format(rule)) + + self.raw_line.emit("") + + if QThread.currentThread().isInterruptionRequested() or (flownum >= self.query.limit): + break + else: + QThread.yieldCurrentThread() + + self.raw_line.emit("{0} information flow(s) found.\n".format(flownum)) diff --git a/lib/python2.7/site-packages/setoolsgui/apol/mainwindow.py b/lib/python2.7/site-packages/setoolsgui/apol/mainwindow.py index 53b9f87..69a76ce 100644 --- a/lib/python2.7/site-packages/setoolsgui/apol/mainwindow.py +++ b/lib/python2.7/site-packages/setoolsgui/apol/mainwindow.py @@ -25,6 +25,8 @@ from PyQt5.QtWidgets import QAction, QDialog, QFileDialog, QLineEdit, QMainWindo from setools import PermissionMap, SELinuxPolicy from ..widget import SEToolsWidget +# Analysis tabs: +from .infoflow import InfoFlowAnalysisTab from .terulequery import TERuleQueryTab @@ -136,7 +138,7 @@ class ApolMainWindow(SEToolsWidget, QMainWindow): newtab = QWidget() newtab.setObjectName(counted_name) - newanalysis = tabclass(newtab, self._policy) + newanalysis = tabclass(newtab, self._policy, self._permmap) # create a vertical layout in the tab, place the analysis ui inside. tabLayout = QVBoxLayout() @@ -192,35 +194,40 @@ class ChooseAnalysis(SEToolsWidget, QDialog): The item_mapping attribute will be populated to map the tree list items to the analysis tab widgets. """ - _components_map = {"Attributes (Type)": TERuleQueryTab, - "Booleans": TERuleQueryTab, - "Categories": TERuleQueryTab, - "Common Permission Sets": TERuleQueryTab, - "Object Classes": TERuleQueryTab, - "Policy Capabilities": TERuleQueryTab, - "Roles": TERuleQueryTab, - "Types": TERuleQueryTab, - "Users": TERuleQueryTab} - - _rule_map = {"TE Rules": TERuleQueryTab, - "RBAC Rules": TERuleQueryTab, - "MLS Rules": TERuleQueryTab, - "Constraints": TERuleQueryTab} - - _analysis_map = {"Domain Transition Analysis": TERuleQueryTab, - "Information Flow Analysis": TERuleQueryTab} - - _labeling_map = {"fs_use Statements": TERuleQueryTab, - "Genfscon Statements": TERuleQueryTab, - "Initial SID Statements": TERuleQueryTab, - "Netifcon Statements": TERuleQueryTab, - "Nodecon Statements": TERuleQueryTab, - "Portcon Statements": TERuleQueryTab} - - _analysis_choices = {"Components": _components_map, - "Rules": _rule_map, - "Analysis": _analysis_map, - "Labeling Statements": _labeling_map} +# _components_map = {"Attributes (Type)": TERuleQueryTab, +# "Booleans": TERuleQueryTab, +# "Categories": TERuleQueryTab, +# "Common Permission Sets": TERuleQueryTab, +# "Object Classes": TERuleQueryTab, +# "Policy Capabilities": TERuleQueryTab, +# "Roles": TERuleQueryTab, +# "Types": TERuleQueryTab, +# "Users": TERuleQueryTab} +# +# _rule_map = {"TE Rules": TERuleQueryTab, +# "RBAC Rules": TERuleQueryTab, +# "MLS Rules": TERuleQueryTab, +# "Constraints": TERuleQueryTab} +# +# _analysis_map = {"Domain Transition Analysis": TERuleQueryTab, +# "Information Flow Analysis": TERuleQueryTab} +# +# _labeling_map = {"fs_use Statements": TERuleQueryTab, +# "Genfscon Statements": TERuleQueryTab, +# "Initial SID Statements": TERuleQueryTab, +# "Netifcon Statements": TERuleQueryTab, +# "Nodecon Statements": TERuleQueryTab, +# "Portcon Statements": TERuleQueryTab} +# +# _analysis_choices = {"Components": _components_map, +# "Rules": _rule_map, +# "Analysis": _analysis_map, +# "Labeling Statements": _labeling_map} + + _analysis_map = {"Information Flow Analysis": InfoFlowAnalysisTab} + _rule_map = {"TE Rules": TERuleQueryTab} + _analysis_choices = {"Rules": _rule_map, + "Analyses": _analysis_map} def __init__(self, parent): super(ChooseAnalysis, self).__init__(parent) diff --git a/lib/python2.7/site-packages/setoolsgui/apol/models.py b/lib/python2.7/site-packages/setoolsgui/apol/models.py index 2744ad6..f8a5a5d 100644 --- a/lib/python2.7/site-packages/setoolsgui/apol/models.py +++ b/lib/python2.7/site-packages/setoolsgui/apol/models.py @@ -17,11 +17,20 @@ # <http://www.gnu.org/licenses/>. # -from PyQt5 import QtCore -from PyQt5.QtCore import QAbstractListModel, QModelIndex, QStringListModel, Qt +from PyQt5.QtCore import QAbstractListModel, QItemSelectionModel, QModelIndex, QStringListModel, Qt from setools.policyrep.exception import NoCommon +def invert_list_selection(selection_model): + """Invert the selection of a list-based model.""" + + model = selection_model.model() + rowcount = model.rowCount() + for row in range(rowcount): + index = model.createIndex(row, 0) + selection_model.select(index, QItemSelectionModel.Toggle) + + class SEToolsListModel(QAbstractListModel): """ diff --git a/lib/python2.7/site-packages/setoolsgui/apol/rulemodels.py b/lib/python2.7/site-packages/setoolsgui/apol/rulemodels.py index 4367cfb..a340040 100644 --- a/lib/python2.7/site-packages/setoolsgui/apol/rulemodels.py +++ b/lib/python2.7/site-packages/setoolsgui/apol/rulemodels.py @@ -24,7 +24,7 @@ from setools.policyrep.exception import RuleNotConditional, RuleUseError class RuleResultModel(QAbstractTableModel): def __init__(self, parent): super(RuleResultModel, self).__init__(parent) - self.resultlist = None + self.resultlist = [] def rowCount(self, parent=QModelIndex()): if self.resultlist: @@ -85,11 +85,6 @@ class RuleResultModel(QAbstractTableModel): # get the whole rule for user role return self.resultlist[row].statement() - def set_rules(self, result_list): - self.beginResetModel() - self.resultlist = result_list - self.endResetModel() - class TERuleListModel(RuleResultModel): diff --git a/lib/python2.7/site-packages/setoolsgui/apol/terulequery.py b/lib/python2.7/site-packages/setoolsgui/apol/terulequery.py index 75148fc..70d32d2 100644 --- a/lib/python2.7/site-packages/setoolsgui/apol/terulequery.py +++ b/lib/python2.7/site-packages/setoolsgui/apol/terulequery.py @@ -19,24 +19,31 @@ import logging -from PyQt5.QtCore import Qt, QSortFilterProxyModel, QStringListModel +from PyQt5.QtCore import pyqtSignal, Qt, QObject, QSortFilterProxyModel, QStringListModel, QThread from PyQt5.QtGui import QPalette, QTextCursor -from PyQt5.QtWidgets import QCompleter, QHeaderView, QScrollArea +from PyQt5.QtWidgets import QCompleter, QHeaderView, QMessageBox, QProgressDialog, QScrollArea from setools import TERuleQuery from ..widget import SEToolsWidget from .rulemodels import TERuleListModel -from .models import PermListModel, SEToolsListModel +from .models import PermListModel, SEToolsListModel, invert_list_selection class TERuleQueryTab(SEToolsWidget, QScrollArea): - def __init__(self, parent, policy): + + """A Type Enforcement rule query.""" + + def __init__(self, parent, policy, perm_map): super(TERuleQueryTab, self).__init__(parent) self.log = logging.getLogger(self.__class__.__name__) self.policy = policy self.query = TERuleQuery(policy) self.setupUi() + def __del__(self): + self.thread.quit() + self.thread.wait(5000) + def setupUi(self): self.load_ui("terulequery.ui") @@ -86,6 +93,22 @@ class TERuleQueryTab(SEToolsWidget, QScrollArea): self.sort_proxy.setSourceModel(self.table_results_model) self.table_results.setModel(self.sort_proxy) + # set up processing thread + self.thread = QThread() + self.worker = ResultsUpdater(self.query, self.table_results_model) + self.worker.moveToThread(self.thread) + self.worker.raw_line.connect(self.raw_results.appendPlainText) + self.worker.finished.connect(self.update_complete) + self.worker.finished.connect(self.thread.quit) + self.thread.started.connect(self.worker.update) + + # create a "busy, please wait" dialog + self.busy = QProgressDialog(self) + self.busy.setModal(True) + self.busy.setRange(0, 0) + self.busy.setMinimumDuration(0) + self.busy.canceled.connect(self.thread.requestInterruption) + # Ensure settings are consistent with the initial .ui state self.set_source_regex(self.source_regex.isChecked()) self.set_target_regex(self.target_regex.isChecked()) @@ -105,7 +128,9 @@ class TERuleQueryTab(SEToolsWidget, QScrollArea): self.target.editingFinished.connect(self.set_target) self.target_regex.toggled.connect(self.set_target_regex) self.tclass.selectionModel().selectionChanged.connect(self.set_tclass) + self.invert_class.clicked.connect(self.invert_tclass_selection) self.perms.selectionModel().selectionChanged.connect(self.set_perms) + self.invert_perms.clicked.connect(self.invert_perms_selection) self.default_type.textEdited.connect(self.clear_default_error) self.default_type.editingFinished.connect(self.set_default_type) self.default_regex.toggled.connect(self.set_default_regex) @@ -184,6 +209,9 @@ class TERuleQueryTab(SEToolsWidget, QScrollArea): self.query.tclass = selected_classes self.perms_model.set_classes(selected_classes) + def invert_tclass_selection(self): + invert_list_selection(self.tclass.selectionModel()) + # # Permissions criteria # @@ -195,6 +223,9 @@ class TERuleQueryTab(SEToolsWidget, QScrollArea): self.query.perms = selected_perms + def invert_perms_selection(self): + invert_list_selection(self.perms.selectionModel()) + # # Default criteria # @@ -236,21 +267,29 @@ class TERuleQueryTab(SEToolsWidget, QScrollArea): def run(self, button): # right now there is only one button. rule_types = [] + max_results = 0 if self.allow.isChecked(): rule_types.append("allow") + max_results += self.policy.allow_count if self.auditallow.isChecked(): rule_types.append("auditallow") + max_results += self.policy.auditallow_count if self.neverallow.isChecked(): rule_types.append("neverallow") + max_results += self.policy.neverallow_count if self.dontaudit.isChecked(): rule_types.append("dontaudit") + max_results += self.policy.dontaudit_count if self.type_transition.isChecked(): rule_types.append("type_transition") + max_results += self.policy.type_transition_count if self.type_member.isChecked(): rule_types.append("type_member") + max_results += self.policy.type_member_count if self.type_change.isChecked(): rule_types.append("type_change") + max_results += self.policy.type_change_count self.query.ruletype = rule_types self.query.source_indirect = self.source_indirect.isChecked() @@ -258,14 +297,89 @@ class TERuleQueryTab(SEToolsWidget, QScrollArea): self.query.perms_equal = self.perms_equal.isChecked() self.query.boolean_equal = self.bools_equal.isChecked() - # update results table - results = list(self.query.results()) - self.table_results_model.set_rules(results) - self.table_results.resizeColumnsToContents() + # if query is broad, show warning. + if not self.query.source and not self.query.target and not self.query.tclass and \ + not self.query.perms and not self.query.default and not self.query.boolean: + reply = QMessageBox.question( + self, "Continue?", + "This is a broad query, estimated to return {0} results. Continue?". + format(max_results), QMessageBox.Yes | QMessageBox.No) - # update raw results + if reply == QMessageBox.No: + return + + # start processing + self.busy.setLabelText("Processing query...") + self.busy.show() self.raw_results.clear() - for line in results: - self.raw_results.appendPlainText(str(line)) + self.thread.start() + + def update_complete(self): + # update sizes/location of result displays + if not self.busy.wasCanceled(): + self.busy.setLabelText("Resizing the result table's columns; GUI may be unresponsive") + self.busy.repaint() + self.table_results.resizeColumnsToContents() + # If the permissions column width is too long, pull back + # to a reasonable size + header = self.table_results.horizontalHeader() + if header.sectionSize(4) > 400: + header.resizeSection(4, 400) + + if not self.busy.wasCanceled(): + self.busy.setLabelText("Resizing the result table's rows; GUI may be unresponsive") + self.busy.repaint() + self.table_results.resizeRowsToContents() + + if not self.busy.wasCanceled(): + self.busy.setLabelText("Moving the raw result to top; GUI may be unresponsive") + self.busy.repaint() + self.raw_results.moveCursor(QTextCursor.Start) + + self.busy.reset() + + +class ResultsUpdater(QObject): + + """ + Thread for processing queries and updating result widgets. + + Parameters: + query The query object + model The model for the results + + Qt signals: + finished The update has completed. + raw_line (str) A string to be appended to the raw results. + """ + + finished = pyqtSignal() + raw_line = pyqtSignal(str) + + def __init__(self, query, model): + super(ResultsUpdater, self).__init__() + self.query = query + self.table_results_model = model + + def update(self): + """Run the query and update results.""" + self.table_results_model.beginResetModel() + + results = [] + counter = 0 + + for counter, item in enumerate(self.query.results(), start=1): + results.append(item) + + self.raw_line.emit(str(item)) + + if QThread.currentThread().isInterruptionRequested(): + break + elif not counter % 10: + # yield execution every 10 rules + QThread.yieldCurrentThread() + + self.table_results_model.resultlist = results + self.table_results_model.endResetModel() - self.raw_results.moveCursor(QTextCursor.Start) + self.finished.emit() diff --git a/lib/python2.7/site-packages/setoolsgui/libselinux.so.1 b/lib/python2.7/site-packages/setoolsgui/libselinux.so.1 Binary files differdeleted file mode 100755 index dc9280d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/libselinux.so.1 +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/__init__.py deleted file mode 100644 index 7090794..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -NetworkX -======== - - NetworkX (NX) is a Python package for the creation, manipulation, and - study of the structure, dynamics, and functions of complex networks. - - https://networkx.lanl.gov/ - -Using ------ - - Just write in Python - - >>> import networkx as nx - >>> G=nx.Graph() - >>> G.add_edge(1,2) - >>> G.add_node(42) - >>> print(sorted(G.nodes())) - [1, 2, 42] - >>> print(sorted(G.edges())) - [(1, 2)] -""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# -# Add platform dependent shared library path to sys.path -# - -from __future__ import absolute_import - -import sys -if sys.version_info[:2] < (2, 6): - m = "Python version 2.6 or later is required for NetworkX (%d.%d detected)." - raise ImportError(m % sys.version_info[:2]) -del sys - -# Release data -from networkx import release - -__author__ = '%s <%s>\n%s <%s>\n%s <%s>' % \ - ( release.authors['Hagberg'] + release.authors['Schult'] + \ - release.authors['Swart'] ) -__license__ = release.license - -__date__ = release.date -__version__ = release.version - -#These are import orderwise -from networkx.exception import * -import networkx.external -import networkx.utils -# these packages work with Python >= 2.6 - -import networkx.classes -from networkx.classes import * - - -import networkx.convert -from networkx.convert import * - -import networkx.relabel -from networkx.relabel import * - -import networkx.generators -from networkx.generators import * - -import networkx.readwrite -from networkx.readwrite import * - -#Need to test with SciPy, when available -import networkx.algorithms -from networkx.algorithms import * -import networkx.linalg - -from networkx.linalg import * -from networkx.tests.test import run as test - -import networkx.drawing -from networkx.drawing import * - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/__init__.py deleted file mode 100644 index 6230da3..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/__init__.py +++ /dev/null @@ -1,51 +0,0 @@ -from networkx.algorithms.assortativity import * -from networkx.algorithms.block import * -from networkx.algorithms.boundary import * -from networkx.algorithms.centrality import * -from networkx.algorithms.cluster import * -from networkx.algorithms.clique import * -from networkx.algorithms.community import * -from networkx.algorithms.components import * -from networkx.algorithms.connectivity import * -from networkx.algorithms.core import * -from networkx.algorithms.cycles import * -from networkx.algorithms.dag import * -from networkx.algorithms.distance_measures import * -from networkx.algorithms.flow import * -from networkx.algorithms.hierarchy import * -from networkx.algorithms.matching import * -from networkx.algorithms.mis import * -from networkx.algorithms.mst import * -from networkx.algorithms.link_analysis import * -from networkx.algorithms.operators import * -from networkx.algorithms.shortest_paths import * -from networkx.algorithms.smetric import * -from networkx.algorithms.traversal import * -from networkx.algorithms.isolate import * -from networkx.algorithms.euler import * -from networkx.algorithms.vitality import * -from networkx.algorithms.chordal import * -from networkx.algorithms.richclub import * -from networkx.algorithms.distance_regular import * -from networkx.algorithms.swap import * -from networkx.algorithms.graphical import * -from networkx.algorithms.simple_paths import * - -import networkx.algorithms.assortativity -import networkx.algorithms.bipartite -import networkx.algorithms.centrality -import networkx.algorithms.cluster -import networkx.algorithms.clique -import networkx.algorithms.components -import networkx.algorithms.connectivity -import networkx.algorithms.flow -import networkx.algorithms.isomorphism -import networkx.algorithms.link_analysis -import networkx.algorithms.shortest_paths -import networkx.algorithms.traversal -import networkx.algorithms.chordal -import networkx.algorithms.operators - -from networkx.algorithms.bipartite import projected_graph,project,is_bipartite -from networkx.algorithms.isomorphism import is_isomorphic,could_be_isomorphic,\ - fast_could_be_isomorphic,faster_could_be_isomorphic diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/__init__.py deleted file mode 100644 index eb797c2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from networkx.algorithms.approximation.clique import * -from networkx.algorithms.approximation.dominating_set import * -from networkx.algorithms.approximation.independent_set import * -from networkx.algorithms.approximation.matching import * -from networkx.algorithms.approximation.ramsey import * -from networkx.algorithms.approximation.vertex_cover import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/clique.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/clique.py deleted file mode 100644 index be363f6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/clique.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Cliques. -""" -# Copyright (C) 2011-2012 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.algorithms.approximation import ramsey -__author__ = """Nicholas Mancuso (nick.mancuso@gmail.com)""" -__all__ = ["clique_removal","max_clique"] - -def max_clique(G): - r"""Find the Maximum Clique - - Finds the `O(|V|/(log|V|)^2)` apx of maximum clique/independent set - in the worst case. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - clique : set - The apx-maximum clique of the graph - - Notes - ------ - A clique in an undirected graph G = (V, E) is a subset of the vertex set - `C \subseteq V`, such that for every two vertices in C, there exists an edge - connecting the two. This is equivalent to saying that the subgraph - induced by C is complete (in some cases, the term clique may also refer - to the subgraph). - - A maximum clique is a clique of the largest possible size in a given graph. - The clique number `\omega(G)` of a graph G is the number of - vertices in a maximum clique in G. The intersection number of - G is the smallest number of cliques that together cover all edges of G. - - http://en.wikipedia.org/wiki/Maximum_clique - - References - ---------- - .. [1] Boppana, R., & Halldórsson, M. M. (1992). - Approximating maximum independent sets by excluding subgraphs. - BIT Numerical Mathematics, 32(2), 180–196. Springer. - doi:10.1007/BF01994876 - """ - if G is None: - raise ValueError("Expected NetworkX graph!") - - # finding the maximum clique in a graph is equivalent to finding - # the independent set in the complementary graph - cgraph = nx.complement(G) - iset, _ = clique_removal(cgraph) - return iset - -def clique_removal(G): - """ Repeatedly remove cliques from the graph. - - Results in a `O(|V|/(\log |V|)^2)` approximation of maximum clique - & independent set. Returns the largest independent set found, along - with found maximal cliques. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - max_ind_cliques : (set, list) tuple - Maximal independent set and list of maximal cliques (sets) in the graph. - - References - ---------- - .. [1] Boppana, R., & Halldórsson, M. M. (1992). - Approximating maximum independent sets by excluding subgraphs. - BIT Numerical Mathematics, 32(2), 180–196. Springer. - """ - graph = G.copy() - c_i, i_i = ramsey.ramsey_R2(graph) - cliques = [c_i] - isets = [i_i] - while graph: - graph.remove_nodes_from(c_i) - c_i, i_i = ramsey.ramsey_R2(graph) - if c_i: - cliques.append(c_i) - if i_i: - isets.append(i_i) - - maxiset = max(isets) - return maxiset, cliques diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/dominating_set.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/dominating_set.py deleted file mode 100644 index 6a167e2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/dominating_set.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -""" -************************************** -Minimum Vertex and Edge Dominating Set -************************************** - - -A dominating set for a graph G = (V, E) is a subset D of V such that every -vertex not in D is joined to at least one member of D by some edge. The -domination number gamma(G) is the number of vertices in a smallest dominating -set for G. Given a graph G = (V, E) find a minimum weight dominating set V'. - -http://en.wikipedia.org/wiki/Dominating_set - -An edge dominating set for a graph G = (V, E) is a subset D of E such that -every edge not in D is adjacent to at least one edge in D. - -http://en.wikipedia.org/wiki/Edge_dominating_set -""" -# Copyright (C) 2011-2012 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -import networkx as nx -__all__ = ["min_weighted_dominating_set", - "min_edge_dominating_set"] -__author__ = """Nicholas Mancuso (nick.mancuso@gmail.com)""" - - -def min_weighted_dominating_set(G, weight=None): - r"""Return minimum weight vertex dominating set. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - weight : None or string, optional (default = None) - If None, every edge has weight/distance/weight 1. If a string, use this - edge attribute as the edge weight. Any edge attribute not present - defaults to 1. - - Returns - ------- - min_weight_dominating_set : set - Returns a set of vertices whose weight sum is no more than log w(V) * OPT - - Notes - ----- - This algorithm computes an approximate minimum weighted dominating set - for the graph G. The upper-bound on the size of the solution is - log w(V) * OPT. Runtime of the algorithm is `O(|E|)`. - - References - ---------- - .. [1] Vazirani, Vijay Approximation Algorithms (2001) - """ - if not G: - raise ValueError("Expected non-empty NetworkX graph!") - - # min cover = min dominating set - dom_set = set([]) - cost_func = dict((node, nd.get(weight, 1)) \ - for node, nd in G.nodes_iter(data=True)) - - vertices = set(G) - sets = dict((node, set([node]) | set(G[node])) for node in G) - - def _cost(subset): - """ Our cost effectiveness function for sets given its weight - """ - cost = sum(cost_func[node] for node in subset) - return cost / float(len(subset - dom_set)) - - while vertices: - # find the most cost effective set, and the vertex that for that set - dom_node, min_set = min(sets.items(), - key=lambda x: (x[0], _cost(x[1]))) - alpha = _cost(min_set) - - # reduce the cost for the rest - for node in min_set - dom_set: - cost_func[node] = alpha - - # add the node to the dominating set and reduce what we must cover - dom_set.add(dom_node) - del sets[dom_node] - vertices = vertices - min_set - - return dom_set - - -def min_edge_dominating_set(G): - r"""Return minimum cardinality edge dominating set. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - min_edge_dominating_set : set - Returns a set of dominating edges whose size is no more than 2 * OPT. - - Notes - ----- - The algorithm computes an approximate solution to the edge dominating set - problem. The result is no more than 2 * OPT in terms of size of the set. - Runtime of the algorithm is `O(|E|)`. - """ - if not G: - raise ValueError("Expected non-empty NetworkX graph!") - return nx.maximal_matching(G) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/independent_set.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/independent_set.py deleted file mode 100644 index 3b18ade..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/independent_set.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Independent Set - -Independent set or stable set is a set of vertices in a graph, no two of -which are adjacent. That is, it is a set I of vertices such that for every -two vertices in I, there is no edge connecting the two. Equivalently, each -edge in the graph has at most one endpoint in I. The size of an independent -set is the number of vertices it contains. - -A maximum independent set is a largest independent set for a given graph G -and its size is denoted α(G). The problem of finding such a set is called -the maximum independent set problem and is an NP-hard optimization problem. -As such, it is unlikely that there exists an efficient algorithm for finding -a maximum independent set of a graph. - -http://en.wikipedia.org/wiki/Independent_set_(graph_theory) - -Independent set algorithm is based on the following paper: - -`O(|V|/(log|V|)^2)` apx of maximum clique/independent set. - -Boppana, R., & Halldórsson, M. M. (1992). -Approximating maximum independent sets by excluding subgraphs. -BIT Numerical Mathematics, 32(2), 180–196. Springer. -doi:10.1007/BF01994876 - -""" -# Copyright (C) 2011-2012 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -from networkx.algorithms.approximation import clique_removal -__all__ = ["maximum_independent_set"] -__author__ = """Nicholas Mancuso (nick.mancuso@gmail.com)""" - - -def maximum_independent_set(G): - """Return an approximate maximum independent set. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - iset : Set - The apx-maximum independent set - - Notes - ----- - Finds the `O(|V|/(log|V|)^2)` apx of independent set in the worst case. - - - References - ---------- - .. [1] Boppana, R., & Halldórsson, M. M. (1992). - Approximating maximum independent sets by excluding subgraphs. - BIT Numerical Mathematics, 32(2), 180–196. Springer. - """ - iset, _ = clique_removal(G) - return iset diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/matching.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/matching.py deleted file mode 100644 index 231d501..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/matching.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -""" -************** -Graph Matching -************** - -Given a graph G = (V,E), a matching M in G is a set of pairwise non-adjacent -edges; that is, no two edges share a common vertex. - -http://en.wikipedia.org/wiki/Matching_(graph_theory) -""" -# Copyright (C) 2011-2012 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -import networkx as nx -__all__ = ["min_maximal_matching"] -__author__ = """Nicholas Mancuso (nick.mancuso@gmail.com)""" - -def min_maximal_matching(G): - r"""Returns the minimum maximal matching of G. That is, out of all maximal - matchings of the graph G, the smallest is returned. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - min_maximal_matching : set - Returns a set of edges such that no two edges share a common endpoint - and every edge not in the set shares some common endpoint in the set. - Cardinality will be 2*OPT in the worst case. - - Notes - ----- - The algorithm computes an approximate solution fo the minimum maximal - cardinality matching problem. The solution is no more than 2 * OPT in size. - Runtime is `O(|E|)`. - - References - ---------- - .. [1] Vazirani, Vijay Approximation Algorithms (2001) - """ - return nx.maximal_matching(G) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/ramsey.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/ramsey.py deleted file mode 100644 index 03535ce..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/ramsey.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Ramsey numbers. -""" -# Copyright (C) 2011 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -import networkx as nx -__all__ = ["ramsey_R2"] -__author__ = """Nicholas Mancuso (nick.mancuso@gmail.com)""" - -def ramsey_R2(G): - r"""Approximately computes the Ramsey number `R(2;s,t)` for graph. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - max_pair : (set, set) tuple - Maximum clique, Maximum independent set. - """ - if not G: - return (set([]), set([])) - - node = next(G.nodes_iter()) - nbrs = nx.all_neighbors(G, node) - nnbrs = nx.non_neighbors(G, node) - c_1, i_1 = ramsey_R2(G.subgraph(nbrs)) - c_2, i_2 = ramsey_R2(G.subgraph(nnbrs)) - - c_1.add(node) - i_2.add(node) - return (max([c_1, c_2]), max([i_1, i_2])) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_clique.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_clique.py deleted file mode 100644 index 0f384a5..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_clique.py +++ /dev/null @@ -1,41 +0,0 @@ -from nose.tools import * -import networkx as nx -import networkx.algorithms.approximation as apxa - -def test_clique_removal(): - graph = nx.complete_graph(10) - i, cs = apxa.clique_removal(graph) - idens = nx.density(graph.subgraph(i)) - eq_(idens, 0.0, "i-set not found by clique_removal!") - for clique in cs: - cdens = nx.density(graph.subgraph(clique)) - eq_(cdens, 1.0, "clique not found by clique_removal!") - - graph = nx.trivial_graph(nx.Graph()) - i, cs = apxa.clique_removal(graph) - idens = nx.density(graph.subgraph(i)) - eq_(idens, 0.0, "i-set not found by ramsey!") - # we should only have 1-cliques. Just singleton nodes. - for clique in cs: - cdens = nx.density(graph.subgraph(clique)) - eq_(cdens, 0.0, "clique not found by clique_removal!") - - graph = nx.barbell_graph(10, 5, nx.Graph()) - i, cs = apxa.clique_removal(graph) - idens = nx.density(graph.subgraph(i)) - eq_(idens, 0.0, "i-set not found by ramsey!") - for clique in cs: - cdens = nx.density(graph.subgraph(clique)) - eq_(cdens, 1.0, "clique not found by clique_removal!") - -def test_max_clique_smoke(): - # smoke test - G = nx.Graph() - assert_equal(len(apxa.max_clique(G)),0) - -def test_max_clique(): - # create a complete graph - graph = nx.complete_graph(30) - # this should return the entire graph - mc = apxa.max_clique(graph) - assert_equals(30, len(mc)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_dominating_set.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_dominating_set.py deleted file mode 100644 index 0dbc79f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_dominating_set.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -import networkx.algorithms.approximation as apxa - - -class TestMinWeightDominatingSet: - - def test_min_weighted_dominating_set(self): - graph = nx.Graph() - graph.add_edge(1, 2) - graph.add_edge(1, 5) - graph.add_edge(2, 3) - graph.add_edge(2, 5) - graph.add_edge(3, 4) - graph.add_edge(3, 6) - graph.add_edge(5, 6) - - vertices = set([1, 2, 3, 4, 5, 6]) - # due to ties, this might be hard to test tight bounds - dom_set = apxa.min_weighted_dominating_set(graph) - for vertex in vertices - dom_set: - neighbors = set(graph.neighbors(vertex)) - ok_(len(neighbors & dom_set) > 0, "Non dominating set found!") - - def test_min_edge_dominating_set(self): - graph = nx.path_graph(5) - dom_set = apxa.min_edge_dominating_set(graph) - - # this is a crappy way to test, but good enough for now. - for edge in graph.edges_iter(): - if edge in dom_set: - continue - else: - u, v = edge - found = False - for dom_edge in dom_set: - found |= u == dom_edge[0] or u == dom_edge[1] - ok_(found, "Non adjacent edge found!") - - graph = nx.complete_graph(10) - dom_set = apxa.min_edge_dominating_set(graph) - - # this is a crappy way to test, but good enough for now. - for edge in graph.edges_iter(): - if edge in dom_set: - continue - else: - u, v = edge - found = False - for dom_edge in dom_set: - found |= u == dom_edge[0] or u == dom_edge[1] - ok_(found, "Non adjacent edge found!") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_independent_set.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_independent_set.py deleted file mode 100644 index 8825ec8..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_independent_set.py +++ /dev/null @@ -1,8 +0,0 @@ -from nose.tools import * -import networkx as nx -import networkx.algorithms.approximation as a - -def test_independent_set(): - # smoke test - G = nx.Graph() - assert_equal(len(a.maximum_independent_set(G)),0) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_matching.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_matching.py deleted file mode 100644 index b768c39..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_matching.py +++ /dev/null @@ -1,8 +0,0 @@ -from nose.tools import * -import networkx as nx -import networkx.algorithms.approximation as a - -def test_min_maximal_matching(): - # smoke test - G = nx.Graph() - assert_equal(len(a.min_maximal_matching(G)),0) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_ramsey.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_ramsey.py deleted file mode 100644 index 7ab8dac..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_ramsey.py +++ /dev/null @@ -1,27 +0,0 @@ -from nose.tools import * -import networkx as nx -import networkx.algorithms.approximation as apxa - -def test_ramsey(): - # this should only find the complete graph - graph = nx.complete_graph(10) - c, i = apxa.ramsey_R2(graph) - cdens = nx.density(graph.subgraph(c)) - eq_(cdens, 1.0, "clique not found by ramsey!") - idens = nx.density(graph.subgraph(i)) - eq_(idens, 0.0, "i-set not found by ramsey!") - - # this trival graph has no cliques. should just find i-sets - graph = nx.trivial_graph(nx.Graph()) - c, i = apxa.ramsey_R2(graph) - cdens = nx.density(graph.subgraph(c)) - eq_(cdens, 0.0, "clique not found by ramsey!") - idens = nx.density(graph.subgraph(i)) - eq_(idens, 0.0, "i-set not found by ramsey!") - - graph = nx.barbell_graph(10, 5, nx.Graph()) - c, i = apxa.ramsey_R2(graph) - cdens = nx.density(graph.subgraph(c)) - eq_(cdens, 1.0, "clique not found by ramsey!") - idens = nx.density(graph.subgraph(i)) - eq_(idens, 0.0, "i-set not found by ramsey!") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_vertex_cover.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_vertex_cover.py deleted file mode 100644 index 74b3f51..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/tests/test_vertex_cover.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx.algorithms import approximation as a - -class TestMWVC: - - def test_min_vertex_cover(self): - # create a simple star graph - size = 50 - sg = nx.star_graph(size) - cover = a.min_weighted_vertex_cover(sg) - assert_equals(2, len(cover)) - for u, v in sg.edges_iter(): - ok_((u in cover or v in cover), "Node node covered!") - - wg = nx.Graph() - wg.add_node(0, weight=10) - wg.add_node(1, weight=1) - wg.add_node(2, weight=1) - wg.add_node(3, weight=1) - wg.add_node(4, weight=1) - - wg.add_edge(0, 1) - wg.add_edge(0, 2) - wg.add_edge(0, 3) - wg.add_edge(0, 4) - - wg.add_edge(1,2) - wg.add_edge(2,3) - wg.add_edge(3,4) - wg.add_edge(4,1) - - cover = a.min_weighted_vertex_cover(wg, weight="weight") - csum = sum(wg.node[node]["weight"] for node in cover) - assert_equals(4, csum) - - for u, v in wg.edges_iter(): - ok_((u in cover or v in cover), "Node node covered!") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/vertex_cover.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/vertex_cover.py deleted file mode 100644 index c588e18..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/approximation/vertex_cover.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -""" -************ -Vertex Cover -************ - -Given an undirected graph `G = (V, E)` and a function w assigning nonnegative -weights to its vertices, find a minimum weight subset of V such that each edge -in E is incident to at least one vertex in the subset. - -http://en.wikipedia.org/wiki/Vertex_cover -""" -# Copyright (C) 2011-2012 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -from networkx.utils import * -__all__ = ["min_weighted_vertex_cover"] -__author__ = """Nicholas Mancuso (nick.mancuso@gmail.com)""" - -@not_implemented_for('directed') -def min_weighted_vertex_cover(G, weight=None): - r"""2-OPT Local Ratio for Minimum Weighted Vertex Cover - - Find an approximate minimum weighted vertex cover of a graph. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - weight : None or string, optional (default = None) - If None, every edge has weight/distance/cost 1. If a string, use this - edge attribute as the edge weight. Any edge attribute not present - defaults to 1. - - Returns - ------- - min_weighted_cover : set - Returns a set of vertices whose weight sum is no more than 2 * OPT. - - Notes - ----- - Local-Ratio algorithm for computing an approximate vertex cover. - Algorithm greedily reduces the costs over edges and iteratively - builds a cover. Worst-case runtime is `O(|E|)`. - - References - ---------- - .. [1] Bar-Yehuda, R., & Even, S. (1985). A local-ratio theorem for - approximating the weighted vertex cover problem. - Annals of Discrete Mathematics, 25, 27–46 - http://www.cs.technion.ac.il/~reuven/PDF/vc_lr.pdf - """ - weight_func = lambda nd: nd.get(weight, 1) - cost = dict((n, weight_func(nd)) for n, nd in G.nodes(data=True)) - - # while there are edges uncovered, continue - for u,v in G.edges_iter(): - # select some uncovered edge - min_cost = min([cost[u], cost[v]]) - cost[u] -= min_cost - cost[v] -= min_cost - - return set(u for u in cost if cost[u] == 0) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/__init__.py deleted file mode 100644 index 4d98886..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from networkx.algorithms.assortativity.connectivity import * -from networkx.algorithms.assortativity.correlation import * -from networkx.algorithms.assortativity.mixing import * -from networkx.algorithms.assortativity.neighbor_degree import * -from networkx.algorithms.assortativity.pairs import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/connectivity.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/connectivity.py deleted file mode 100644 index 17b0265..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/connectivity.py +++ /dev/null @@ -1,123 +0,0 @@ -#-*- coding: utf-8 -*- -# Copyright (C) 2011 by -# Jordi Torrents <jtorrents@milnou.net> -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -from collections import defaultdict -import networkx as nx -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Aric Hagberg (hagberg@lanl.gov)']) -__all__ = ['average_degree_connectivity', - 'k_nearest_neighbors'] - -def _avg_deg_conn(G, neighbors, source_degree, target_degree, - nodes=None, weight=None): - # "k nearest neighbors, or neighbor_connectivity - dsum = defaultdict(float) - dnorm = defaultdict(float) - for n,k in source_degree(nodes).items(): - nbrdeg = target_degree(neighbors(n)) - if weight is None: - s = float(sum(nbrdeg.values())) - else: # weight nbr degree by weight of (n,nbr) edge - if neighbors == G.neighbors: - s = float(sum((G[n][nbr].get(weight,1)*d - for nbr,d in nbrdeg.items()))) - elif neighbors == G.successors: - s = float(sum((G[n][nbr].get(weight,1)*d - for nbr,d in nbrdeg.items()))) - elif neighbors == G.predecessors: - s = float(sum((G[nbr][n].get(weight,1)*d - for nbr,d in nbrdeg.items()))) - dnorm[k] += source_degree(n, weight=weight) - dsum[k] += s - - # normalize - dc = {} - for k,avg in dsum.items(): - dc[k]=avg - norm = dnorm[k] - if avg > 0 and norm > 0: - dc[k]/=norm - return dc - -def average_degree_connectivity(G, source="in+out", target="in+out", - nodes=None, weight=None): - r"""Compute the average degree connectivity of graph. - - The average degree connectivity is the average nearest neighbor degree of - nodes with degree k. For weighted graphs, an analogous measure can - be computed using the weighted average neighbors degree defined in - [1]_, for a node `i`, as: - - .. math:: - - k_{nn,i}^{w} = \frac{1}{s_i} \sum_{j \in N(i)} w_{ij} k_j - - where `s_i` is the weighted degree of node `i`, - `w_{ij}` is the weight of the edge that links `i` and `j`, - and `N(i)` are the neighbors of node `i`. - - Parameters - ---------- - G : NetworkX graph - - source : "in"|"out"|"in+out" (default:"in+out") - Directed graphs only. Use "in"- or "out"-degree for source node. - - target : "in"|"out"|"in+out" (default:"in+out" - Directed graphs only. Use "in"- or "out"-degree for target node. - - nodes: list or iterable (optional) - Compute neighbor connectivity for these nodes. The default is all nodes. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used as a weight. - If None, then each edge has weight 1. - - Returns - ------- - d: dict - A dictionary keyed by degree k with the value of average connectivity. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> G.edge[1][2]['weight'] = 3 - >>> nx.k_nearest_neighbors(G) - {1: 2.0, 2: 1.5} - >>> nx.k_nearest_neighbors(G, weight='weight') - {1: 2.0, 2: 1.75} - - See also - -------- - neighbors_average_degree - - Notes - ----- - This algorithm is sometimes called "k nearest neighbors'. - - References - ---------- - .. [1] A. Barrat, M. Barthélemy, R. Pastor-Satorras, and A. Vespignani, - "The architecture of complex weighted networks". - PNAS 101 (11): 3747–3752 (2004). - """ - source_degree = G.degree - target_degree = G.degree - neighbors = G.neighbors - if G.is_directed(): - direction = {'out':G.out_degree, - 'in':G.in_degree, - 'in+out': G.degree} - source_degree = direction[source] - target_degree = direction[target] - if source == 'in': - neighbors=G.predecessors - elif source == 'out': - neighbors=G.successors - return _avg_deg_conn(G, neighbors, source_degree, target_degree, - nodes=nodes, weight=weight) - -k_nearest_neighbors=average_degree_connectivity diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/correlation.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/correlation.py deleted file mode 100644 index 6d471c9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/correlation.py +++ /dev/null @@ -1,298 +0,0 @@ -#-*- coding: utf-8 -*- -"""Node assortativity coefficients and correlation measures. -""" -import networkx as nx -from networkx.algorithms.assortativity.mixing import degree_mixing_matrix, \ - attribute_mixing_matrix, numeric_mixing_matrix -from networkx.algorithms.assortativity.pairs import node_degree_xy, \ - node_attribute_xy -__author__ = ' '.join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Oleguer Sagarra <oleguer.sagarra@gmail.com>']) -__all__ = ['degree_pearson_correlation_coefficient', - 'degree_assortativity_coefficient', - 'attribute_assortativity_coefficient', - 'numeric_assortativity_coefficient'] - -def degree_assortativity_coefficient(G, x='out', y='in', weight=None, - nodes=None): - """Compute degree assortativity of graph. - - Assortativity measures the similarity of connections - in the graph with respect to the node degree. - - Parameters - ---------- - G : NetworkX graph - - x: string ('in','out') - The degree type for source node (directed graphs only). - - y: string ('in','out') - The degree type for target node (directed graphs only). - - weight: string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - nodes: list or iterable (optional) - Compute degree assortativity only for nodes in container. - The default is all nodes. - - Returns - ------- - r : float - Assortativity of graph by degree. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> r=nx.degree_assortativity_coefficient(G) - >>> print("%3.1f"%r) - -0.5 - - See Also - -------- - attribute_assortativity_coefficient - numeric_assortativity_coefficient - neighbor_connectivity - degree_mixing_dict - degree_mixing_matrix - - Notes - ----- - This computes Eq. (21) in Ref. [1]_ , where e is the joint - probability distribution (mixing matrix) of the degrees. If G is - directed than the matrix e is the joint probability of the - user-specified degree type for the source and target. - - References - ---------- - .. [1] M. E. J. Newman, Mixing patterns in networks, - Physical Review E, 67 026126, 2003 - .. [2] Foster, J.G., Foster, D.V., Grassberger, P. & Paczuski, M. - Edge direction and the structure of networks, PNAS 107, 10815-20 (2010). - """ - M = degree_mixing_matrix(G, x=x, y=y, nodes=nodes, weight=weight) - return numeric_ac(M) - - -def degree_pearson_correlation_coefficient(G, x='out', y='in', - weight=None, nodes=None): - """Compute degree assortativity of graph. - - Assortativity measures the similarity of connections - in the graph with respect to the node degree. - - This is the same as degree_assortativity_coefficient but uses the - potentially faster scipy.stats.pearsonr function. - - Parameters - ---------- - G : NetworkX graph - - x: string ('in','out') - The degree type for source node (directed graphs only). - - y: string ('in','out') - The degree type for target node (directed graphs only). - - weight: string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - nodes: list or iterable (optional) - Compute pearson correlation of degrees only for specified nodes. - The default is all nodes. - - Returns - ------- - r : float - Assortativity of graph by degree. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> r=nx.degree_pearson_correlation_coefficient(G) - >>> r - -0.5 - - Notes - ----- - This calls scipy.stats.pearsonr. - - References - ---------- - .. [1] M. E. J. Newman, Mixing patterns in networks - Physical Review E, 67 026126, 2003 - .. [2] Foster, J.G., Foster, D.V., Grassberger, P. & Paczuski, M. - Edge direction and the structure of networks, PNAS 107, 10815-20 (2010). - """ - try: - import scipy.stats as stats - except ImportError: - raise ImportError( - "Assortativity requires SciPy: http://scipy.org/ ") - xy=node_degree_xy(G, x=x, y=y, nodes=nodes, weight=weight) - x,y=zip(*xy) - return stats.pearsonr(x,y)[0] - - -def attribute_assortativity_coefficient(G,attribute,nodes=None): - """Compute assortativity for node attributes. - - Assortativity measures the similarity of connections - in the graph with respect to the given attribute. - - Parameters - ---------- - G : NetworkX graph - - attribute : string - Node attribute key - - nodes: list or iterable (optional) - Compute attribute assortativity for nodes in container. - The default is all nodes. - - Returns - ------- - r: float - Assortativity of graph for given attribute - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_nodes_from([0,1],color='red') - >>> G.add_nodes_from([2,3],color='blue') - >>> G.add_edges_from([(0,1),(2,3)]) - >>> print(nx.attribute_assortativity_coefficient(G,'color')) - 1.0 - - Notes - ----- - This computes Eq. (2) in Ref. [1]_ , trace(M)-sum(M))/(1-sum(M), - where M is the joint probability distribution (mixing matrix) - of the specified attribute. - - References - ---------- - .. [1] M. E. J. Newman, Mixing patterns in networks, - Physical Review E, 67 026126, 2003 - """ - M = attribute_mixing_matrix(G,attribute,nodes) - return attribute_ac(M) - - -def numeric_assortativity_coefficient(G, attribute, nodes=None): - """Compute assortativity for numerical node attributes. - - Assortativity measures the similarity of connections - in the graph with respect to the given numeric attribute. - - Parameters - ---------- - G : NetworkX graph - - attribute : string - Node attribute key - - nodes: list or iterable (optional) - Compute numeric assortativity only for attributes of nodes in - container. The default is all nodes. - - Returns - ------- - r: float - Assortativity of graph for given attribute - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_nodes_from([0,1],size=2) - >>> G.add_nodes_from([2,3],size=3) - >>> G.add_edges_from([(0,1),(2,3)]) - >>> print(nx.numeric_assortativity_coefficient(G,'size')) - 1.0 - - Notes - ----- - This computes Eq. (21) in Ref. [1]_ , for the mixing matrix of - of the specified attribute. - - References - ---------- - .. [1] M. E. J. Newman, Mixing patterns in networks - Physical Review E, 67 026126, 2003 - """ - a = numeric_mixing_matrix(G,attribute,nodes) - return numeric_ac(a) - - -def attribute_ac(M): - """Compute assortativity for attribute matrix M. - - Parameters - ---------- - M : numpy array or matrix - Attribute mixing matrix. - - Notes - ----- - This computes Eq. (2) in Ref. [1]_ , (trace(e)-sum(e))/(1-sum(e)), - where e is the joint probability distribution (mixing matrix) - of the specified attribute. - - References - ---------- - .. [1] M. E. J. Newman, Mixing patterns in networks, - Physical Review E, 67 026126, 2003 - """ - try: - import numpy - except ImportError: - raise ImportError( - "attribute_assortativity requires NumPy: http://scipy.org/ ") - if M.sum() != 1.0: - M=M/float(M.sum()) - M=numpy.asmatrix(M) - s=(M*M).sum() - t=M.trace() - r=(t-s)/(1-s) - return float(r) - - -def numeric_ac(M): - # M is a numpy matrix or array - # numeric assortativity coefficient, pearsonr - try: - import numpy - except ImportError: - raise ImportError('numeric_assortativity requires ', - 'NumPy: http://scipy.org/') - if M.sum() != 1.0: - M=M/float(M.sum()) - nx,ny=M.shape # nx=ny - x=numpy.arange(nx) - y=numpy.arange(ny) - a=M.sum(axis=0) - b=M.sum(axis=1) - vara=(a*x**2).sum()-((a*x).sum())**2 - varb=(b*x**2).sum()-((b*x).sum())**2 - xy=numpy.outer(x,y) - ab=numpy.outer(a,b) - return (xy*(M-ab)).sum()/numpy.sqrt(vara*varb) - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/mixing.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/mixing.py deleted file mode 100644 index 2c0e4f0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/mixing.py +++ /dev/null @@ -1,248 +0,0 @@ -#-*- coding: utf-8 -*- -""" -Mixing matrices for node attributes and degree. -""" -import networkx as nx -from networkx.utils import dict_to_numpy_array -from networkx.algorithms.assortativity.pairs import node_degree_xy, \ - node_attribute_xy -__author__ = ' '.join(['Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['attribute_mixing_matrix', - 'attribute_mixing_dict', - 'degree_mixing_matrix', - 'degree_mixing_dict', - 'numeric_mixing_matrix', - 'mixing_dict'] - -def attribute_mixing_dict(G,attribute,nodes=None,normalized=False): - """Return dictionary representation of mixing matrix for attribute. - - Parameters - ---------- - G : graph - NetworkX graph object. - - attribute : string - Node attribute key. - - nodes: list or iterable (optional) - Unse nodes in container to build the dict. The default is all nodes. - - normalized : bool (default=False) - Return counts if False or probabilities if True. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_nodes_from([0,1],color='red') - >>> G.add_nodes_from([2,3],color='blue') - >>> G.add_edge(1,3) - >>> d=nx.attribute_mixing_dict(G,'color') - >>> print(d['red']['blue']) - 1 - >>> print(d['blue']['red']) # d symmetric for undirected graphs - 1 - - Returns - ------- - d : dictionary - Counts or joint probability of occurrence of attribute pairs. - """ - xy_iter=node_attribute_xy(G,attribute,nodes) - return mixing_dict(xy_iter,normalized=normalized) - - -def attribute_mixing_matrix(G,attribute,nodes=None,mapping=None, - normalized=True): - """Return mixing matrix for attribute. - - Parameters - ---------- - G : graph - NetworkX graph object. - - attribute : string - Node attribute key. - - nodes: list or iterable (optional) - Use only nodes in container to build the matrix. The default is - all nodes. - - mapping : dictionary, optional - Mapping from node attribute to integer index in matrix. - If not specified, an arbitrary ordering will be used. - - normalized : bool (default=False) - Return counts if False or probabilities if True. - - Returns - ------- - m: numpy array - Counts or joint probability of occurrence of attribute pairs. - """ - d=attribute_mixing_dict(G,attribute,nodes) - a=dict_to_numpy_array(d,mapping=mapping) - if normalized: - a=a/a.sum() - return a - - -def degree_mixing_dict(G, x='out', y='in', weight=None, - nodes=None, normalized=False): - """Return dictionary representation of mixing matrix for degree. - - Parameters - ---------- - G : graph - NetworkX graph object. - - x: string ('in','out') - The degree type for source node (directed graphs only). - - y: string ('in','out') - The degree type for target node (directed graphs only). - - weight: string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - normalized : bool (default=False) - Return counts if False or probabilities if True. - - Returns - ------- - d: dictionary - Counts or joint probability of occurrence of degree pairs. - """ - xy_iter=node_degree_xy(G, x=x, y=y, nodes=nodes, weight=weight) - return mixing_dict(xy_iter,normalized=normalized) - - - -def degree_mixing_matrix(G, x='out', y='in', weight=None, - nodes=None, normalized=True): - """Return mixing matrix for attribute. - - Parameters - ---------- - G : graph - NetworkX graph object. - - x: string ('in','out') - The degree type for source node (directed graphs only). - - y: string ('in','out') - The degree type for target node (directed graphs only). - - nodes: list or iterable (optional) - Build the matrix using only nodes in container. - The default is all nodes. - - weight: string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - normalized : bool (default=False) - Return counts if False or probabilities if True. - - Returns - ------- - m: numpy array - Counts, or joint probability, of occurrence of node degree. - """ - d=degree_mixing_dict(G, x=x, y=y, nodes=nodes, weight=weight) - s=set(d.keys()) - for k,v in d.items(): - s.update(v.keys()) - m=max(s) - mapping=dict(zip(range(m+1),range(m+1))) - a=dict_to_numpy_array(d,mapping=mapping) - if normalized: - a=a/a.sum() - return a - -def numeric_mixing_matrix(G,attribute,nodes=None,normalized=True): - """Return numeric mixing matrix for attribute. - - Parameters - ---------- - G : graph - NetworkX graph object. - - attribute : string - Node attribute key. - - nodes: list or iterable (optional) - Build the matrix only with nodes in container. The default is all nodes. - - normalized : bool (default=False) - Return counts if False or probabilities if True. - - Returns - ------- - m: numpy array - Counts, or joint, probability of occurrence of node attribute pairs. - """ - d=attribute_mixing_dict(G,attribute,nodes) - s=set(d.keys()) - for k,v in d.items(): - s.update(v.keys()) - m=max(s) - mapping=dict(zip(range(m+1),range(m+1))) - a=dict_to_numpy_array(d,mapping=mapping) - if normalized: - a=a/a.sum() - return a - -def mixing_dict(xy,normalized=False): - """Return a dictionary representation of mixing matrix. - - Parameters - ---------- - xy : list or container of two-tuples - Pairs of (x,y) items. - - attribute : string - Node attribute key - - normalized : bool (default=False) - Return counts if False or probabilities if True. - - Returns - ------- - d: dictionary - Counts or Joint probability of occurrence of values in xy. - """ - d={} - psum=0.0 - for x,y in xy: - if x not in d: - d[x]={} - if y not in d: - d[y]={} - v = d[x].get(y,0) - d[x][y] = v+1 - psum+=1 - - - if normalized: - for k,jdict in d.items(): - for j in jdict: - jdict[j]/=psum - return d - - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/neighbor_degree.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/neighbor_degree.py deleted file mode 100644 index 9257954..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/neighbor_degree.py +++ /dev/null @@ -1,133 +0,0 @@ -#-*- coding: utf-8 -*- -# Copyright (C) 2011 by -# Jordi Torrents <jtorrents@milnou.net> -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Aric Hagberg (hagberg@lanl.gov)']) -__all__ = ["average_neighbor_degree"] - - -def _average_nbr_deg(G, source_degree, target_degree, nodes=None, weight=None): - # average degree of neighbors - avg = {} - for n,deg in source_degree(nodes,weight=weight).items(): - # normalize but not by zero degree - if deg == 0: - deg = 1 - nbrdeg = target_degree(G[n]) - if weight is None: - avg[n] = sum(nbrdeg.values())/float(deg) - else: - avg[n] = sum((G[n][nbr].get(weight,1)*d - for nbr,d in nbrdeg.items()))/float(deg) - return avg - -def average_neighbor_degree(G, source='out', target='out', - nodes=None, weight=None): - r"""Returns the average degree of the neighborhood of each node. - - The average degree of a node `i` is - - .. math:: - - k_{nn,i} = \frac{1}{|N(i)|} \sum_{j \in N(i)} k_j - - where `N(i)` are the neighbors of node `i` and `k_j` is - the degree of node `j` which belongs to `N(i)`. For weighted - graphs, an analogous measure can be defined [1]_, - - .. math:: - - k_{nn,i}^{w} = \frac{1}{s_i} \sum_{j \in N(i)} w_{ij} k_j - - where `s_i` is the weighted degree of node `i`, `w_{ij}` - is the weight of the edge that links `i` and `j` and - `N(i)` are the neighbors of node `i`. - - - Parameters - ---------- - G : NetworkX graph - - source : string ("in"|"out") - Directed graphs only. - Use "in"- or "out"-degree for source node. - - target : string ("in"|"out") - Directed graphs only. - Use "in"- or "out"-degree for target node. - - nodes : list or iterable, optional - Compute neighbor degree for specified nodes. The default is - all nodes in the graph. - - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used as a weight. - If None, then each edge has weight 1. - - Returns - ------- - d: dict - A dictionary keyed by node with average neighbors degree value. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> G.edge[0][1]['weight'] = 5 - >>> G.edge[2][3]['weight'] = 3 - - >>> nx.average_neighbor_degree(G) - {0: 2.0, 1: 1.5, 2: 1.5, 3: 2.0} - >>> nx.average_neighbor_degree(G, weight='weight') - {0: 2.0, 1: 1.1666666666666667, 2: 1.25, 3: 2.0} - - >>> G=nx.DiGraph() - >>> G.add_path([0,1,2,3]) - >>> nx.average_neighbor_degree(G, source='in', target='in') - {0: 1.0, 1: 1.0, 2: 1.0, 3: 0.0} - - >>> nx.average_neighbor_degree(G, source='out', target='out') - {0: 1.0, 1: 1.0, 2: 0.0, 3: 0.0} - - Notes - ----- - For directed graphs you can also specify in-degree or out-degree - by passing keyword arguments. - - See Also - -------- - average_degree_connectivity - - References - ---------- - .. [1] A. Barrat, M. Barthélemy, R. Pastor-Satorras, and A. Vespignani, - "The architecture of complex weighted networks". - PNAS 101 (11): 3747–3752 (2004). - """ - source_degree = G.degree - target_degree = G.degree - if G.is_directed(): - direction = {'out':G.out_degree, - 'in':G.in_degree} - source_degree = direction[source] - target_degree = direction[target] - return _average_nbr_deg(G, source_degree, target_degree, - nodes=nodes, weight=weight) - -# obsolete -# def average_neighbor_in_degree(G, nodes=None, weight=None): -# if not G.is_directed(): -# raise nx.NetworkXError("Not defined for undirected graphs.") -# return _average_nbr_deg(G, G.in_degree, G.in_degree, nodes, weight) -# average_neighbor_in_degree.__doc__=average_neighbor_degree.__doc__ - -# def average_neighbor_out_degree(G, nodes=None, weight=None): -# if not G.is_directed(): -# raise nx.NetworkXError("Not defined for undirected graphs.") -# return _average_nbr_deg(G, G.out_degree, G.out_degree, nodes, weight) -# average_neighbor_out_degree.__doc__=average_neighbor_degree.__doc__ - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/pairs.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/pairs.py deleted file mode 100644 index 0ed0fa9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/pairs.py +++ /dev/null @@ -1,134 +0,0 @@ -#-*- coding: utf-8 -*- -"""Generators of x-y pairs of node data.""" -import networkx as nx -from networkx.utils import dict_to_numpy_array -__author__ = ' '.join(['Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['node_attribute_xy', - 'node_degree_xy'] - -def node_attribute_xy(G, attribute, nodes=None): - """Return iterator of node-attribute pairs for all edges in G. - - Parameters - ---------- - G: NetworkX graph - - attribute: key - The node attribute key. - - nodes: list or iterable (optional) - Use only edges that are adjacency to specified nodes. - The default is all nodes. - - Returns - ------- - (x,y): 2-tuple - Generates 2-tuple of (attribute,attribute) values. - - Examples - -------- - >>> G = nx.DiGraph() - >>> G.add_node(1,color='red') - >>> G.add_node(2,color='blue') - >>> G.add_edge(1,2) - >>> list(nx.node_attribute_xy(G,'color')) - [('red', 'blue')] - - Notes - ----- - For undirected graphs each edge is produced twice, once for each edge - representation (u,v) and (v,u), with the exception of self-loop edges - which only appear once. - """ - if nodes is None: - nodes = set(G) - else: - nodes = set(nodes) - node = G.node - for u,nbrsdict in G.adjacency_iter(): - if u not in nodes: - continue - uattr = node[u].get(attribute,None) - if G.is_multigraph(): - for v,keys in nbrsdict.items(): - vattr = node[v].get(attribute,None) - for k,d in keys.items(): - yield (uattr,vattr) - else: - for v,eattr in nbrsdict.items(): - vattr = node[v].get(attribute,None) - yield (uattr,vattr) - - -def node_degree_xy(G, x='out', y='in', weight=None, nodes=None): - """Generate node degree-degree pairs for edges in G. - - Parameters - ---------- - G: NetworkX graph - - x: string ('in','out') - The degree type for source node (directed graphs only). - - y: string ('in','out') - The degree type for target node (directed graphs only). - - weight: string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - nodes: list or iterable (optional) - Use only edges that are adjacency to specified nodes. - The default is all nodes. - - Returns - ------- - (x,y): 2-tuple - Generates 2-tuple of (degree,degree) values. - - - Examples - -------- - >>> G = nx.DiGraph() - >>> G.add_edge(1,2) - >>> list(nx.node_degree_xy(G,x='out',y='in')) - [(1, 1)] - >>> list(nx.node_degree_xy(G,x='in',y='out')) - [(0, 0)] - - Notes - ----- - For undirected graphs each edge is produced twice, once for each edge - representation (u,v) and (v,u), with the exception of self-loop edges - which only appear once. - """ - if nodes is None: - nodes = set(G) - else: - nodes = set(nodes) - xdeg = G.degree_iter - ydeg = G.degree_iter - if G.is_directed(): - direction = {'out':G.out_degree_iter, - 'in':G.in_degree_iter} - xdeg = direction[x] - ydeg = direction[y] - - for u,degu in xdeg(nodes, weight=weight): - neighbors = (nbr for _,nbr in G.edges_iter(u) if nbr in nodes) - for v,degv in ydeg(neighbors, weight=weight): - yield degu,degv - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/base_test.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/base_test.py deleted file mode 100644 index 2e16544..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/base_test.py +++ /dev/null @@ -1,50 +0,0 @@ -import networkx as nx - -class BaseTestAttributeMixing(object): - - def setUp(self): - G=nx.Graph() - G.add_nodes_from([0,1],fish='one') - G.add_nodes_from([2,3],fish='two') - G.add_nodes_from([4],fish='red') - G.add_nodes_from([5],fish='blue') - G.add_edges_from([(0,1),(2,3),(0,4),(2,5)]) - self.G=G - - D=nx.DiGraph() - D.add_nodes_from([0,1],fish='one') - D.add_nodes_from([2,3],fish='two') - D.add_nodes_from([4],fish='red') - D.add_nodes_from([5],fish='blue') - D.add_edges_from([(0,1),(2,3),(0,4),(2,5)]) - self.D=D - - M=nx.MultiGraph() - M.add_nodes_from([0,1],fish='one') - M.add_nodes_from([2,3],fish='two') - M.add_nodes_from([4],fish='red') - M.add_nodes_from([5],fish='blue') - M.add_edges_from([(0,1),(0,1),(2,3)]) - self.M=M - - S=nx.Graph() - S.add_nodes_from([0,1],fish='one') - S.add_nodes_from([2,3],fish='two') - S.add_nodes_from([4],fish='red') - S.add_nodes_from([5],fish='blue') - S.add_edge(0,0) - S.add_edge(2,2) - self.S=S - -class BaseTestDegreeMixing(object): - - def setUp(self): - self.P4=nx.path_graph(4) - self.D=nx.DiGraph() - self.D.add_edges_from([(0, 2), (0, 3), (1, 3), (2, 3)]) - self.M=nx.MultiGraph() - self.M.add_path(list(range(4))) - self.M.add_edge(0,1) - self.S=nx.Graph() - self.S.add_edges_from([(0,0),(1,1)]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_connectivity.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_connectivity.py deleted file mode 100644 index 5091161..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_connectivity.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestNeighborConnectivity(object): - - def test_degree_p4(self): - G=nx.path_graph(4) - answer={1:2.0,2:1.5} - nd = nx.average_degree_connectivity(G) - assert_equal(nd,answer) - - D=G.to_directed() - answer={2:2.0,4:1.5} - nd = nx.average_degree_connectivity(D) - assert_equal(nd,answer) - - answer={1:2.0,2:1.5} - D=G.to_directed() - nd = nx.average_degree_connectivity(D, source='in', target='in') - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_degree_connectivity(D, source='in', target='in') - assert_equal(nd,answer) - - def test_degree_p4_weighted(self): - G=nx.path_graph(4) - G[1][2]['weight']=4 - answer={1:2.0,2:1.8} - nd = nx.average_degree_connectivity(G,weight='weight') - assert_equal(nd,answer) - answer={1:2.0,2:1.5} - nd = nx.average_degree_connectivity(G) - assert_equal(nd,answer) - - D=G.to_directed() - answer={2:2.0,4:1.8} - nd = nx.average_degree_connectivity(D,weight='weight') - assert_equal(nd,answer) - - answer={1:2.0,2:1.8} - D=G.to_directed() - nd = nx.average_degree_connectivity(D,weight='weight', source='in', - target='in') - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_degree_connectivity(D,source='in',target='out', - weight='weight') - assert_equal(nd,answer) - - def test_weight_keyword(self): - G=nx.path_graph(4) - G[1][2]['other']=4 - answer={1:2.0,2:1.8} - nd = nx.average_degree_connectivity(G,weight='other') - assert_equal(nd,answer) - answer={1:2.0,2:1.5} - nd = nx.average_degree_connectivity(G,weight=None) - assert_equal(nd,answer) - - D=G.to_directed() - answer={2:2.0,4:1.8} - nd = nx.average_degree_connectivity(D,weight='other') - assert_equal(nd,answer) - - answer={1:2.0,2:1.8} - D=G.to_directed() - nd = nx.average_degree_connectivity(D,weight='other', source='in', - target='in') - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_degree_connectivity(D,weight='other',source='in', - target='in') - assert_equal(nd,answer) - - def test_degree_barrat(self): - G=nx.star_graph(5) - G.add_edges_from([(5,6),(5,7),(5,8),(5,9)]) - G[0][5]['weight']=5 - nd = nx.average_degree_connectivity(G)[5] - assert_equal(nd,1.8) - nd = nx.average_degree_connectivity(G,weight='weight')[5] - assert_almost_equal(nd,3.222222,places=5) - nd = nx.k_nearest_neighbors(G,weight='weight')[5] - assert_almost_equal(nd,3.222222,places=5) - - def test_zero_deg(self): - G=nx.DiGraph() - G.add_edge(1,2) - G.add_edge(1,3) - G.add_edge(1,4) - c = nx.average_degree_connectivity(G) - assert_equal(c,{1:0,3:1}) - c = nx.average_degree_connectivity(G, source='in', target='in') - assert_equal(c,{0:0,1:0}) - c = nx.average_degree_connectivity(G, source='in', target='out') - assert_equal(c,{0:0,1:3}) - c = nx.average_degree_connectivity(G, source='in', target='in+out') - assert_equal(c,{0:0,1:3}) - c = nx.average_degree_connectivity(G, source='out', target='out') - assert_equal(c,{0:0,3:0}) - c = nx.average_degree_connectivity(G, source='out', target='in') - assert_equal(c,{0:0,3:1}) - c = nx.average_degree_connectivity(G, source='out', target='in+out') - assert_equal(c,{0:0,3:1}) - - - def test_in_out_weight(self): - from itertools import permutations - G=nx.DiGraph() - G.add_edge(1,2,weight=1) - G.add_edge(1,3,weight=1) - G.add_edge(3,1,weight=1) - for s,t in permutations(['in','out','in+out'],2): - c = nx.average_degree_connectivity(G, source=s, target=t) - cw = nx.average_degree_connectivity(G,source=s, target=t, - weight='weight') - assert_equal(c,cw) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_correlation.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_correlation.py deleted file mode 100644 index fbb2d51..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_correlation.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx as nx -from base_test import BaseTestAttributeMixing,BaseTestDegreeMixing -from networkx.algorithms.assortativity.correlation import attribute_ac - - -class TestDegreeMixingCorrelation(BaseTestDegreeMixing): - @classmethod - def setupClass(cls): - global np - global npt - try: - import numpy as np - import numpy.testing as npt - except ImportError: - raise SkipTest('NumPy not available.') - try: - import scipy - import scipy.stats - except ImportError: - raise SkipTest('SciPy not available.') - - - - def test_degree_assortativity_undirected(self): - r=nx.degree_assortativity_coefficient(self.P4) - npt.assert_almost_equal(r,-1.0/2,decimal=4) - - def test_degree_assortativity_directed(self): - r=nx.degree_assortativity_coefficient(self.D) - npt.assert_almost_equal(r,-0.57735,decimal=4) - - def test_degree_assortativity_multigraph(self): - r=nx.degree_assortativity_coefficient(self.M) - npt.assert_almost_equal(r,-1.0/7.0,decimal=4) - - - def test_degree_assortativity_undirected(self): - r=nx.degree_pearson_correlation_coefficient(self.P4) - npt.assert_almost_equal(r,-1.0/2,decimal=4) - - def test_degree_assortativity_directed(self): - r=nx.degree_pearson_correlation_coefficient(self.D) - npt.assert_almost_equal(r,-0.57735,decimal=4) - - def test_degree_assortativity_multigraph(self): - r=nx.degree_pearson_correlation_coefficient(self.M) - npt.assert_almost_equal(r,-1.0/7.0,decimal=4) - - - -class TestAttributeMixingCorrelation(BaseTestAttributeMixing): - @classmethod - def setupClass(cls): - global np - global npt - try: - import numpy as np - import numpy.testing as npt - - except ImportError: - raise SkipTest('NumPy not available.') - - - def test_attribute_assortativity_undirected(self): - r=nx.attribute_assortativity_coefficient(self.G,'fish') - assert_equal(r,6.0/22.0) - - def test_attribute_assortativity_directed(self): - r=nx.attribute_assortativity_coefficient(self.D,'fish') - assert_equal(r,1.0/3.0) - - def test_attribute_assortativity_multigraph(self): - r=nx.attribute_assortativity_coefficient(self.M,'fish') - assert_equal(r,1.0) - - def test_attribute_assortativity_coefficient(self): - # from "Mixing patterns in networks" - a=np.array([[0.258,0.016,0.035,0.013], - [0.012,0.157,0.058,0.019], - [0.013,0.023,0.306,0.035], - [0.005,0.007,0.024,0.016]]) - r=attribute_ac(a) - npt.assert_almost_equal(r,0.623,decimal=3) - - def test_attribute_assortativity_coefficient2(self): - a=np.array([[0.18,0.02,0.01,0.03], - [0.02,0.20,0.03,0.02], - [0.01,0.03,0.16,0.01], - [0.03,0.02,0.01,0.22]]) - - r=attribute_ac(a) - npt.assert_almost_equal(r,0.68,decimal=2) - - def test_attribute_assortativity(self): - a=np.array([[50,50,0],[50,50,0],[0,0,2]]) - r=attribute_ac(a) - npt.assert_almost_equal(r,0.029,decimal=3) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_mixing.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_mixing.py deleted file mode 100644 index ce60a94..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_mixing.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx as nx -from base_test import BaseTestAttributeMixing,BaseTestDegreeMixing - - -class TestDegreeMixingDict(BaseTestDegreeMixing): - - - def test_degree_mixing_dict_undirected(self): - d=nx.degree_mixing_dict(self.P4) - d_result={1:{2:2}, - 2:{1:2,2:2}, - } - assert_equal(d,d_result) - - def test_degree_mixing_dict_undirected_normalized(self): - d=nx.degree_mixing_dict(self.P4, normalized=True) - d_result={1:{2:1.0/3}, - 2:{1:1.0/3,2:1.0/3}, - } - assert_equal(d,d_result) - - def test_degree_mixing_dict_directed(self): - d=nx.degree_mixing_dict(self.D) - print(d) - d_result={1:{3:2}, - 2:{1:1,3:1}, - 3:{} - } - assert_equal(d,d_result) - - def test_degree_mixing_dict_multigraph(self): - d=nx.degree_mixing_dict(self.M) - d_result={1:{2:1}, - 2:{1:1,3:3}, - 3:{2:3} - } - assert_equal(d,d_result) - - -class TestDegreeMixingMatrix(BaseTestDegreeMixing): - - @classmethod - def setupClass(cls): - global np - global npt - try: - import numpy as np - import numpy.testing as npt - - except ImportError: - raise SkipTest('NumPy not available.') - - def test_degree_mixing_matrix_undirected(self): - a_result=np.array([[0,0,0], - [0,0,2], - [0,2,2]] - ) - a=nx.degree_mixing_matrix(self.P4,normalized=False) - npt.assert_equal(a,a_result) - a=nx.degree_mixing_matrix(self.P4) - npt.assert_equal(a,a_result/float(a_result.sum())) - - def test_degree_mixing_matrix_directed(self): - a_result=np.array([[0,0,0,0], - [0,0,0,2], - [0,1,0,1], - [0,0,0,0]] - ) - a=nx.degree_mixing_matrix(self.D,normalized=False) - npt.assert_equal(a,a_result) - a=nx.degree_mixing_matrix(self.D) - npt.assert_equal(a,a_result/float(a_result.sum())) - - def test_degree_mixing_matrix_multigraph(self): - a_result=np.array([[0,0,0,0], - [0,0,1,0], - [0,1,0,3], - [0,0,3,0]] - ) - a=nx.degree_mixing_matrix(self.M,normalized=False) - npt.assert_equal(a,a_result) - a=nx.degree_mixing_matrix(self.M) - npt.assert_equal(a,a_result/float(a_result.sum())) - - - def test_degree_mixing_matrix_selfloop(self): - a_result=np.array([[0,0,0], - [0,0,0], - [0,0,2]] - ) - a=nx.degree_mixing_matrix(self.S,normalized=False) - npt.assert_equal(a,a_result) - a=nx.degree_mixing_matrix(self.S) - npt.assert_equal(a,a_result/float(a_result.sum())) - - -class TestAttributeMixingDict(BaseTestAttributeMixing): - - def test_attribute_mixing_dict_undirected(self): - d=nx.attribute_mixing_dict(self.G,'fish') - d_result={'one':{'one':2,'red':1}, - 'two':{'two':2,'blue':1}, - 'red':{'one':1}, - 'blue':{'two':1} - } - assert_equal(d,d_result) - - def test_attribute_mixing_dict_directed(self): - d=nx.attribute_mixing_dict(self.D,'fish') - d_result={'one':{'one':1,'red':1}, - 'two':{'two':1,'blue':1}, - 'red':{}, - 'blue':{} - } - assert_equal(d,d_result) - - - def test_attribute_mixing_dict_multigraph(self): - d=nx.attribute_mixing_dict(self.M,'fish') - d_result={'one':{'one':4}, - 'two':{'two':2}, - } - assert_equal(d,d_result) - - - -class TestAttributeMixingMatrix(BaseTestAttributeMixing): - @classmethod - def setupClass(cls): - global np - global npt - try: - import numpy as np - import numpy.testing as npt - - except ImportError: - raise SkipTest('NumPy not available.') - - def test_attribute_mixing_matrix_undirected(self): - mapping={'one':0,'two':1,'red':2,'blue':3} - a_result=np.array([[2,0,1,0], - [0,2,0,1], - [1,0,0,0], - [0,1,0,0]] - ) - a=nx.attribute_mixing_matrix(self.G,'fish', - mapping=mapping, - normalized=False) - npt.assert_equal(a,a_result) - a=nx.attribute_mixing_matrix(self.G,'fish', - mapping=mapping) - npt.assert_equal(a,a_result/float(a_result.sum())) - - def test_attribute_mixing_matrix_directed(self): - mapping={'one':0,'two':1,'red':2,'blue':3} - a_result=np.array([[1,0,1,0], - [0,1,0,1], - [0,0,0,0], - [0,0,0,0]] - ) - a=nx.attribute_mixing_matrix(self.D,'fish', - mapping=mapping, - normalized=False) - npt.assert_equal(a,a_result) - a=nx.attribute_mixing_matrix(self.D,'fish', - mapping=mapping) - npt.assert_equal(a,a_result/float(a_result.sum())) - - def test_attribute_mixing_matrix_multigraph(self): - mapping={'one':0,'two':1,'red':2,'blue':3} - a_result=np.array([[4,0,0,0], - [0,2,0,0], - [0,0,0,0], - [0,0,0,0]] - ) - a=nx.attribute_mixing_matrix(self.M,'fish', - mapping=mapping, - normalized=False) - npt.assert_equal(a,a_result) - a=nx.attribute_mixing_matrix(self.M,'fish', - mapping=mapping) - npt.assert_equal(a,a_result/float(a_result.sum())) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_neighbor_degree.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_neighbor_degree.py deleted file mode 100644 index 7ab99fb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestAverageNeighbor(object): - - def test_degree_p4(self): - G=nx.path_graph(4) - answer={0:2,1:1.5,2:1.5,3:2} - nd = nx.average_neighbor_degree(G) - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D) - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D) - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D, source='in', target='in') - assert_equal(nd,answer) - - def test_degree_p4_weighted(self): - G=nx.path_graph(4) - G[1][2]['weight']=4 - answer={0:2,1:1.8,2:1.8,3:2} - nd = nx.average_neighbor_degree(G,weight='weight') - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D,weight='weight') - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D,weight='weight') - assert_equal(nd,answer) - nd = nx.average_neighbor_degree(D,source='out',target='out', - weight='weight') - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D,source='in',target='in', - weight='weight') - assert_equal(nd,answer) - - - def test_degree_k4(self): - G=nx.complete_graph(4) - answer={0:3,1:3,2:3,3:3} - nd = nx.average_neighbor_degree(G) - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D) - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D) - assert_equal(nd,answer) - - D=G.to_directed() - nd = nx.average_neighbor_degree(D,source='in',target='in') - assert_equal(nd,answer) - - def test_degree_k4_nodes(self): - G=nx.complete_graph(4) - answer={1:3.0,2:3.0} - nd = nx.average_neighbor_degree(G,nodes=[1,2]) - assert_equal(nd,answer) - - def test_degree_barrat(self): - G=nx.star_graph(5) - G.add_edges_from([(5,6),(5,7),(5,8),(5,9)]) - G[0][5]['weight']=5 - nd = nx.average_neighbor_degree(G)[5] - assert_equal(nd,1.8) - nd = nx.average_neighbor_degree(G,weight='weight')[5] - assert_almost_equal(nd,3.222222,places=5) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_pairs.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_pairs.py deleted file mode 100644 index fa67a45..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/assortativity/tests/test_pairs.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from base_test import BaseTestAttributeMixing,BaseTestDegreeMixing - -class TestAttributeMixingXY(BaseTestAttributeMixing): - - def test_node_attribute_xy_undirected(self): - attrxy=sorted(nx.node_attribute_xy(self.G,'fish')) - attrxy_result=sorted([('one','one'), - ('one','one'), - ('two','two'), - ('two','two'), - ('one','red'), - ('red','one'), - ('blue','two'), - ('two','blue') - ]) - assert_equal(attrxy,attrxy_result) - - def test_node_attribute_xy_undirected_nodes(self): - attrxy=sorted(nx.node_attribute_xy(self.G,'fish', - nodes=['one','yellow'])) - attrxy_result=sorted( [ - ]) - assert_equal(attrxy,attrxy_result) - - - def test_node_attribute_xy_directed(self): - attrxy=sorted(nx.node_attribute_xy(self.D,'fish')) - attrxy_result=sorted([('one','one'), - ('two','two'), - ('one','red'), - ('two','blue') - ]) - assert_equal(attrxy,attrxy_result) - - def test_node_attribute_xy_multigraph(self): - attrxy=sorted(nx.node_attribute_xy(self.M,'fish')) - attrxy_result=[('one','one'), - ('one','one'), - ('one','one'), - ('one','one'), - ('two','two'), - ('two','two') - ] - assert_equal(attrxy,attrxy_result) - - def test_node_attribute_xy_selfloop(self): - attrxy=sorted(nx.node_attribute_xy(self.S,'fish')) - attrxy_result=[('one','one'), - ('two','two') - ] - assert_equal(attrxy,attrxy_result) - - -class TestDegreeMixingXY(BaseTestDegreeMixing): - - def test_node_degree_xy_undirected(self): - xy=sorted(nx.node_degree_xy(self.P4)) - xy_result=sorted([(1,2), - (2,1), - (2,2), - (2,2), - (1,2), - (2,1)]) - assert_equal(xy,xy_result) - - def test_node_degree_xy_undirected_nodes(self): - xy=sorted(nx.node_degree_xy(self.P4,nodes=[0,1,-1])) - xy_result=sorted([(1,2), - (2,1),]) - assert_equal(xy,xy_result) - - - def test_node_degree_xy_directed(self): - xy=sorted(nx.node_degree_xy(self.D)) - xy_result=sorted([(2,1), - (2,3), - (1,3), - (1,3)]) - assert_equal(xy,xy_result) - - def test_node_degree_xy_multigraph(self): - xy=sorted(nx.node_degree_xy(self.M)) - xy_result=sorted([(2,3), - (2,3), - (3,2), - (3,2), - (2,3), - (3,2), - (1,2), - (2,1)]) - assert_equal(xy,xy_result) - - - def test_node_degree_xy_selfloop(self): - xy=sorted(nx.node_degree_xy(self.S)) - xy_result=sorted([(2,2), - (2,2)]) - assert_equal(xy,xy_result) - - def test_node_degree_xy_weighted(self): - G = nx.Graph() - G.add_edge(1,2,weight=7) - G.add_edge(2,3,weight=10) - xy=sorted(nx.node_degree_xy(G,weight='weight')) - xy_result=sorted([(7,17), - (17,10), - (17,7), - (10,17)]) - assert_equal(xy,xy_result) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/__init__.py deleted file mode 100644 index 53ba9d3..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/__init__.py +++ /dev/null @@ -1,93 +0,0 @@ -r""" This module provides functions and operations for bipartite -graphs. Bipartite graphs `B = (U, V, E)` have two node sets `U,V` and edges in -`E` that only connect nodes from opposite sets. It is common in the literature -to use an spatial analogy referring to the two node sets as top and bottom nodes. - -The bipartite algorithms are not imported into the networkx namespace -at the top level so the easiest way to use them is with: - ->>> import networkx as nx ->>> from networkx.algorithms import bipartite - -NetworkX does not have a custom bipartite graph class but the Graph() -or DiGraph() classes can be used to represent bipartite graphs. However, -you have to keep track of which set each node belongs to, and make -sure that there is no edge between nodes of the same set. The convention used -in NetworkX is to use a node attribute named "bipartite" with values 0 or 1 to -identify the sets each node belongs to. - -For example: - ->>> B = nx.Graph() ->>> B.add_nodes_from([1,2,3,4], bipartite=0) # Add the node attribute "bipartite" ->>> B.add_nodes_from(['a','b','c'], bipartite=1) ->>> B.add_edges_from([(1,'a'), (1,'b'), (2,'b'), (2,'c'), (3,'c'), (4,'a')]) - -Many algorithms of the bipartite module of NetworkX require, as an argument, a -container with all the nodes that belong to one set, in addition to the bipartite -graph `B`. If `B` is connected, you can find the node sets using a two-coloring -algorithm: - ->>> nx.is_connected(B) -True ->>> bottom_nodes, top_nodes = bipartite.sets(B) - -list(top_nodes) -[1, 2, 3, 4] -list(bottom_nodes) -['a', 'c', 'b'] - -However, if the input graph is not connected, there are more than one possible -colorations. Thus, the following result is correct: - ->>> B.remove_edge(2,'c') ->>> nx.is_connected(B) -False ->>> bottom_nodes, top_nodes = bipartite.sets(B) - -list(top_nodes) -[1, 2, 4, 'c'] -list(bottom_nodes) -['a', 3, 'b'] - -Using the "bipartite" node attribute, you can easily get the two node sets: - ->>> top_nodes = set(n for n,d in B.nodes(data=True) if d['bipartite']==0) ->>> bottom_nodes = set(B) - top_nodes - -list(top_nodes) -[1, 2, 3, 4] -list(bottom_nodes) -['a', 'c', 'b'] - -So you can easily use the bipartite algorithms that require, as an argument, a -container with all nodes that belong to one node set: - ->>> print(round(bipartite.density(B, bottom_nodes),2)) -0.42 ->>> G = bipartite.projected_graph(B, top_nodes) ->>> G.edges() -[(1, 2), (1, 4)] - -All bipartite graph generators in NetworkX build bipartite graphs with the -"bipartite" node attribute. Thus, you can use the same approach: - ->>> RB = nx.bipartite_random_graph(5, 7, 0.2) ->>> RB_top = set(n for n,d in RB.nodes(data=True) if d['bipartite']==0) ->>> RB_bottom = set(RB) - RB_top ->>> list(RB_top) -[0, 1, 2, 3, 4] ->>> list(RB_bottom) -[5, 6, 7, 8, 9, 10, 11] - -For other bipartite graph generators see the bipartite section of -:doc:`generators`. - -""" - -from networkx.algorithms.bipartite.basic import * -from networkx.algorithms.bipartite.centrality import * -from networkx.algorithms.bipartite.cluster import * -from networkx.algorithms.bipartite.projection import * -from networkx.algorithms.bipartite.redundancy import * -from networkx.algorithms.bipartite.spectral import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/basic.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/basic.py deleted file mode 100644 index e902889..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/basic.py +++ /dev/null @@ -1,335 +0,0 @@ -# -*- coding: utf-8 -*- -""" -========================== -Bipartite Graph Algorithms -========================== -""" -# Copyright (C) 2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from itertools import count -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = [ 'is_bipartite', - 'is_bipartite_node_set', - 'color', - 'sets', - 'density', - 'degrees', - 'biadjacency_matrix'] - -def biadjacency_matrix(G, row_order, column_order=None, - weight='weight', dtype=None): - r"""Return the biadjacency matrix of the bipartite graph G. - - Let `G = (U, V, E)` be a bipartite graph with node sets - `U = u_{1},...,u_{r}` and `V = v_{1},...,v_{s}`. The biadjacency - matrix [1] is the `r` x `s` matrix `B` in which `b_{i,j} = 1` - if, and only if, `(u_i, v_j) \in E`. If the parameter `weight` is - not `None` and matches the name of an edge attribute, its value is - used instead of 1. - - Parameters - ---------- - G : graph - A NetworkX graph - - row_order : list of nodes - The rows of the matrix are ordered according to the list of nodes. - - column_order : list, optional - The columns of the matrix are ordered according to the list of nodes. - If column_order is None, then the ordering of columns is arbitrary. - - weight : string or None, optional (default='weight') - The edge data key used to provide each value in the matrix. - If None, then each edge has weight 1. - - dtype : NumPy data type, optional - A valid single NumPy data type used to initialize the array. - This must be a simple type such as int or numpy.float64 and - not a compound data type (see to_numpy_recarray) - If None, then the NumPy default is used. - - Returns - ------- - B : numpy matrix - Biadjacency matrix representation of the bipartite graph G. - - Notes - ----- - No attempt is made to check that the input graph is bipartite. - - For directed bipartite graphs only successors are considered as neighbors. - To obtain an adjacency matrix with ones (or weight values) for both - predecessors and successors you have to generate two biadjacency matrices - where the rows of one of them are the columns of the other, and then add - one to the transpose of the other. - - See Also - -------- - to_numpy_matrix - adjacency_matrix - - References - ---------- - [1] http://en.wikipedia.org/wiki/Adjacency_matrix#Adjacency_matrix_of_a_bipartite_graph - """ - try: - import numpy as np - except ImportError: - raise ImportError('adjacency_matrix() requires numpy ', - 'http://scipy.org/') - if column_order is None: - column_order = list(set(G) - set(row_order)) - row = dict(zip(row_order,count())) - col = dict(zip(column_order,count())) - M = np.zeros((len(row),len(col)), dtype=dtype) - for u in row_order: - for v, d in G[u].items(): - M[row[u],col[v]] = d.get(weight, 1) - return np.asmatrix(M) - -def color(G): - """Returns a two-coloring of the graph. - - Raises an exception if the graph is not bipartite. - - Parameters - ---------- - G : NetworkX graph - - Returns - ------- - color : dictionary - A dictionary keyed by node with a 1 or 0 as data for each node color. - - Raises - ------ - NetworkXError if the graph is not two-colorable. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.path_graph(4) - >>> c = bipartite.color(G) - >>> print(c) - {0: 1, 1: 0, 2: 1, 3: 0} - - You can use this to set a node attribute indicating the biparite set: - - >>> nx.set_node_attributes(G, 'bipartite', c) - >>> print(G.node[0]['bipartite']) - 1 - >>> print(G.node[1]['bipartite']) - 0 - """ - if G.is_directed(): - import itertools - def neighbors(v): - return itertools.chain.from_iterable([G.predecessors_iter(v), - G.successors_iter(v)]) - else: - neighbors=G.neighbors_iter - - color = {} - for n in G: # handle disconnected graphs - if n in color or len(G[n])==0: # skip isolates - continue - queue = [n] - color[n] = 1 # nodes seen with color (1 or 0) - while queue: - v = queue.pop() - c = 1 - color[v] # opposite color of node v - for w in neighbors(v): - if w in color: - if color[w] == color[v]: - raise nx.NetworkXError("Graph is not bipartite.") - else: - color[w] = c - queue.append(w) - # color isolates with 0 - color.update(dict.fromkeys(nx.isolates(G),0)) - return color - -def is_bipartite(G): - """ Returns True if graph G is bipartite, False if not. - - Parameters - ---------- - G : NetworkX graph - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.path_graph(4) - >>> print(bipartite.is_bipartite(G)) - True - - See Also - -------- - color, is_bipartite_node_set - """ - try: - color(G) - return True - except nx.NetworkXError: - return False - -def is_bipartite_node_set(G,nodes): - """Returns True if nodes and G/nodes are a bipartition of G. - - Parameters - ---------- - G : NetworkX graph - - nodes: list or container - Check if nodes are a one of a bipartite set. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.path_graph(4) - >>> X = set([1,3]) - >>> bipartite.is_bipartite_node_set(G,X) - True - - Notes - ----- - For connected graphs the bipartite sets are unique. This function handles - disconnected graphs. - """ - S=set(nodes) - for CC in nx.connected_component_subgraphs(G): - X,Y=sets(CC) - if not ( (X.issubset(S) and Y.isdisjoint(S)) or - (Y.issubset(S) and X.isdisjoint(S)) ): - return False - return True - - -def sets(G): - """Returns bipartite node sets of graph G. - - Raises an exception if the graph is not bipartite. - - Parameters - ---------- - G : NetworkX graph - - Returns - ------- - (X,Y) : two-tuple of sets - One set of nodes for each part of the bipartite graph. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.path_graph(4) - >>> X, Y = bipartite.sets(G) - >>> list(X) - [0, 2] - >>> list(Y) - [1, 3] - - See Also - -------- - color - """ - c = color(G) - X = set(n for n in c if c[n]) # c[n] == 1 - Y = set(n for n in c if not c[n]) # c[n] == 0 - return (X, Y) - -def density(B, nodes): - """Return density of bipartite graph B. - - Parameters - ---------- - G : NetworkX graph - - nodes: list or container - Nodes in one set of the bipartite graph. - - Returns - ------- - d : float - The bipartite density - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.complete_bipartite_graph(3,2) - >>> X=set([0,1,2]) - >>> bipartite.density(G,X) - 1.0 - >>> Y=set([3,4]) - >>> bipartite.density(G,Y) - 1.0 - - See Also - -------- - color - """ - n=len(B) - m=nx.number_of_edges(B) - nb=len(nodes) - nt=n-nb - if m==0: # includes cases n==0 and n==1 - d=0.0 - else: - if B.is_directed(): - d=m/(2.0*float(nb*nt)) - else: - d= m/float(nb*nt) - return d - -def degrees(B, nodes, weight=None): - """Return the degrees of the two node sets in the bipartite graph B. - - Parameters - ---------- - G : NetworkX graph - - nodes: list or container - Nodes in one set of the bipartite graph. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used as a weight. - If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - (degX,degY) : tuple of dictionaries - The degrees of the two bipartite sets as dictionaries keyed by node. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.complete_bipartite_graph(3,2) - >>> Y=set([3,4]) - >>> degX,degY=bipartite.degrees(G,Y) - >>> degX - {0: 2, 1: 2, 2: 2} - - See Also - -------- - color, density - """ - bottom=set(nodes) - top=set(B)-bottom - return (B.degree(top,weight),B.degree(bottom,weight)) - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/centrality.py deleted file mode 100644 index 0b885a7..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/centrality.py +++ /dev/null @@ -1,266 +0,0 @@ -#-*- coding: utf-8 -*- -# Copyright (C) 2011 by -# Jordi Torrents <jtorrents@milnou.net> -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Aric Hagberg (hagberg@lanl.gov)']) -__all__=['degree_centrality', - 'betweenness_centrality', - 'closeness_centrality'] - -def degree_centrality(G, nodes): - r"""Compute the degree centrality for nodes in a bipartite network. - - The degree centrality for a node `v` is the fraction of nodes - connected to it. - - Parameters - ---------- - G : graph - A bipartite network - - nodes : list or container - Container with all nodes in one bipartite node set. - - Returns - ------- - centrality : dictionary - Dictionary keyed by node with bipartite degree centrality as the value. - - See Also - -------- - betweenness_centrality, - closeness_centrality, - sets, - is_bipartite - - Notes - ----- - The nodes input parameter must conatin all nodes in one bipartite node set, - but the dictionary returned contains all nodes from both bipartite node - sets. - - For unipartite networks, the degree centrality values are - normalized by dividing by the maximum possible degree (which is - `n-1` where `n` is the number of nodes in G). - - In the bipartite case, the maximum possible degree of a node in a - bipartite node set is the number of nodes in the opposite node set - [1]_. The degree centrality for a node `v` in the bipartite - sets `U` with `n` nodes and `V` with `m` nodes is - - .. math:: - - d_{v} = \frac{deg(v)}{m}, \mbox{for} v \in U , - - d_{v} = \frac{deg(v)}{n}, \mbox{for} v \in V , - - - where `deg(v)` is the degree of node `v`. - - References - ---------- - .. [1] Borgatti, S.P. and Halgin, D. In press. "Analyzing Affiliation - Networks". In Carrington, P. and Scott, J. (eds) The Sage Handbook - of Social Network Analysis. Sage Publications. - http://www.steveborgatti.com/papers/bhaffiliations.pdf - """ - top = set(nodes) - bottom = set(G) - top - s = 1.0/len(bottom) - centrality = dict((n,d*s) for n,d in G.degree_iter(top)) - s = 1.0/len(top) - centrality.update(dict((n,d*s) for n,d in G.degree_iter(bottom))) - return centrality - - -def betweenness_centrality(G, nodes): - r"""Compute betweenness centrality for nodes in a bipartite network. - - Betweenness centrality of a node `v` is the sum of the - fraction of all-pairs shortest paths that pass through `v`. - - Values of betweenness are normalized by the maximum possible - value which for bipartite graphs is limited by the relative size - of the two node sets [1]_. - - Let `n` be the number of nodes in the node set `U` and - `m` be the number of nodes in the node set `V`, then - nodes in `U` are normalized by dividing by - - .. math:: - - \frac{1}{2} [m^2 (s + 1)^2 + m (s + 1)(2t - s - 1) - t (2s - t + 3)] , - - where - - .. math:: - - s = (n - 1) \div m , t = (n - 1) \mod m , - - and nodes in `V` are normalized by dividing by - - .. math:: - - \frac{1}{2} [n^2 (p + 1)^2 + n (p + 1)(2r - p - 1) - r (2p - r + 3)] , - - where, - - .. math:: - - p = (m - 1) \div n , r = (m - 1) \mod n . - - Parameters - ---------- - G : graph - A bipartite graph - - nodes : list or container - Container with all nodes in one bipartite node set. - - Returns - ------- - betweenness : dictionary - Dictionary keyed by node with bipartite betweenness centrality - as the value. - - See Also - -------- - degree_centrality, - closeness_centrality, - sets, - is_bipartite - - Notes - ----- - The nodes input parameter must contain all nodes in one bipartite node set, - but the dictionary returned contains all nodes from both node sets. - - References - ---------- - .. [1] Borgatti, S.P. and Halgin, D. In press. "Analyzing Affiliation - Networks". In Carrington, P. and Scott, J. (eds) The Sage Handbook - of Social Network Analysis. Sage Publications. - http://www.steveborgatti.com/papers/bhaffiliations.pdf - """ - top = set(nodes) - bottom = set(G) - top - n = float(len(top)) - m = float(len(bottom)) - s = (n-1) // m - t = (n-1) % m - bet_max_top = (((m**2)*((s+1)**2))+ - (m*(s+1)*(2*t-s-1))- - (t*((2*s)-t+3)))/2.0 - p = (m-1) // n - r = (m-1) % n - bet_max_bot = (((n**2)*((p+1)**2))+ - (n*(p+1)*(2*r-p-1))- - (r*((2*p)-r+3)))/2.0 - betweenness = nx.betweenness_centrality(G, normalized=False, - weight=None) - for node in top: - betweenness[node]/=bet_max_top - for node in bottom: - betweenness[node]/=bet_max_bot - return betweenness - -def closeness_centrality(G, nodes, normalized=True): - r"""Compute the closeness centrality for nodes in a bipartite network. - - The closeness of a node is the distance to all other nodes in the - graph or in the case that the graph is not connected to all other nodes - in the connected component containing that node. - - Parameters - ---------- - G : graph - A bipartite network - - nodes : list or container - Container with all nodes in one bipartite node set. - - normalized : bool, optional - If True (default) normalize by connected component size. - - Returns - ------- - closeness : dictionary - Dictionary keyed by node with bipartite closeness centrality - as the value. - - See Also - -------- - betweenness_centrality, - degree_centrality - sets, - is_bipartite - - Notes - ----- - The nodes input parameter must conatin all nodes in one bipartite node set, - but the dictionary returned contains all nodes from both node sets. - - Closeness centrality is normalized by the minimum distance possible. - In the bipartite case the minimum distance for a node in one bipartite - node set is 1 from all nodes in the other node set and 2 from all - other nodes in its own set [1]_. Thus the closeness centrality - for node `v` in the two bipartite sets `U` with - `n` nodes and `V` with `m` nodes is - - .. math:: - - c_{v} = \frac{m + 2(n - 1)}{d}, \mbox{for} v \in U, - - c_{v} = \frac{n + 2(m - 1)}{d}, \mbox{for} v \in V, - - where `d` is the sum of the distances from `v` to all - other nodes. - - Higher values of closeness indicate higher centrality. - - As in the unipartite case, setting normalized=True causes the - values to normalized further to n-1 / size(G)-1 where n is the - number of nodes in the connected part of graph containing the - node. If the graph is not completely connected, this algorithm - computes the closeness centrality for each connected part - separately. - - References - ---------- - .. [1] Borgatti, S.P. and Halgin, D. In press. "Analyzing Affiliation - Networks". In Carrington, P. and Scott, J. (eds) The Sage Handbook - of Social Network Analysis. Sage Publications. - http://www.steveborgatti.com/papers/bhaffiliations.pdf - """ - closeness={} - path_length=nx.single_source_shortest_path_length - top = set(nodes) - bottom = set(G) - top - n = float(len(top)) - m = float(len(bottom)) - for node in top: - sp=path_length(G,node) - totsp=sum(sp.values()) - if totsp > 0.0 and len(G) > 1: - closeness[node]= (m + 2*(n-1)) / totsp - if normalized: - s=(len(sp)-1.0) / ( len(G) - 1 ) - closeness[node] *= s - else: - closeness[n]=0.0 - for node in bottom: - sp=path_length(G,node) - totsp=sum(sp.values()) - if totsp > 0.0 and len(G) > 1: - closeness[node]= (n + 2*(m-1)) / totsp - if normalized: - s=(len(sp)-1.0) / ( len(G) - 1 ) - closeness[node] *= s - else: - closeness[n]=0.0 - return closeness - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/cluster.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/cluster.py deleted file mode 100644 index 8adf92d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/cluster.py +++ /dev/null @@ -1,266 +0,0 @@ -#-*- coding: utf-8 -*- -# Copyright (C) 2011 by -# Jordi Torrents <jtorrents@milnou.net> -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -import itertools -import networkx as nx -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Aric Hagberg (hagberg@lanl.gov)']) -__all__ = [ 'clustering', - 'average_clustering', - 'latapy_clustering', - 'robins_alexander_clustering'] - -# functions for computing clustering of pairs -def cc_dot(nu,nv): - return float(len(nu & nv))/len(nu | nv) - -def cc_max(nu,nv): - return float(len(nu & nv))/max(len(nu),len(nv)) - -def cc_min(nu,nv): - return float(len(nu & nv))/min(len(nu),len(nv)) - -modes={'dot':cc_dot, - 'min':cc_min, - 'max':cc_max} - -def latapy_clustering(G, nodes=None, mode='dot'): - r"""Compute a bipartite clustering coefficient for nodes. - - The bipartie clustering coefficient is a measure of local density - of connections defined as [1]_: - - .. math:: - - c_u = \frac{\sum_{v \in N(N(v))} c_{uv} }{|N(N(u))|} - - where `N(N(u))` are the second order neighbors of `u` in `G` excluding `u`, - and `c_{uv}` is the pairwise clustering coefficient between nodes - `u` and `v`. - - The mode selects the function for `c_{uv}` which can be: - - `dot`: - - .. math:: - - c_{uv}=\frac{|N(u)\cap N(v)|}{|N(u) \cup N(v)|} - - `min`: - - .. math:: - - c_{uv}=\frac{|N(u)\cap N(v)|}{min(|N(u)|,|N(v)|)} - - `max`: - - .. math:: - - c_{uv}=\frac{|N(u)\cap N(v)|}{max(|N(u)|,|N(v)|)} - - - Parameters - ---------- - G : graph - A bipartite graph - - nodes : list or iterable (optional) - Compute bipartite clustering for these nodes. The default - is all nodes in G. - - mode : string - The pariwise bipartite clustering method to be used in the computation. - It must be "dot", "max", or "min". - - Returns - ------- - clustering : dictionary - A dictionary keyed by node with the clustering coefficient value. - - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.path_graph(4) # path graphs are bipartite - >>> c = bipartite.clustering(G) - >>> c[0] - 0.5 - >>> c = bipartite.clustering(G,mode='min') - >>> c[0] - 1.0 - - See Also - -------- - robins_alexander_clustering - square_clustering - average_clustering - - References - ---------- - .. [1] Latapy, Matthieu, Clémence Magnien, and Nathalie Del Vecchio (2008). - Basic notions for the analysis of large two-mode networks. - Social Networks 30(1), 31--48. - """ - if not nx.algorithms.bipartite.is_bipartite(G): - raise nx.NetworkXError("Graph is not bipartite") - - try: - cc_func = modes[mode] - except KeyError: - raise nx.NetworkXError(\ - "Mode for bipartite clustering must be: dot, min or max") - - if nodes is None: - nodes = G - ccs = {} - for v in nodes: - cc = 0.0 - nbrs2=set([u for nbr in G[v] for u in G[nbr]])-set([v]) - for u in nbrs2: - cc += cc_func(set(G[u]),set(G[v])) - if cc > 0.0: # len(nbrs2)>0 - cc /= len(nbrs2) - ccs[v] = cc - return ccs - -clustering = latapy_clustering - -def average_clustering(G, nodes=None, mode='dot'): - r"""Compute the average bipartite clustering coefficient. - - A clustering coefficient for the whole graph is the average, - - .. math:: - - C = \frac{1}{n}\sum_{v \in G} c_v, - - where `n` is the number of nodes in `G`. - - Similar measures for the two bipartite sets can be defined [1]_ - - .. math:: - - C_X = \frac{1}{|X|}\sum_{v \in X} c_v, - - where `X` is a bipartite set of `G`. - - Parameters - ---------- - G : graph - a bipartite graph - - nodes : list or iterable, optional - A container of nodes to use in computing the average. - The nodes should be either the entire graph (the default) or one of the - bipartite sets. - - mode : string - The pariwise bipartite clustering method. - It must be "dot", "max", or "min" - - Returns - ------- - clustering : float - The average bipartite clustering for the given set of nodes or the - entire graph if no nodes are specified. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G=nx.star_graph(3) # star graphs are bipartite - >>> bipartite.average_clustering(G) - 0.75 - >>> X,Y=bipartite.sets(G) - >>> bipartite.average_clustering(G,X) - 0.0 - >>> bipartite.average_clustering(G,Y) - 1.0 - - See Also - -------- - clustering - - Notes - ----- - The container of nodes passed to this function must contain all of the nodes - in one of the bipartite sets ("top" or "bottom") in order to compute - the correct average bipartite clustering coefficients. - - References - ---------- - .. [1] Latapy, Matthieu, Clémence Magnien, and Nathalie Del Vecchio (2008). - Basic notions for the analysis of large two-mode networks. - Social Networks 30(1), 31--48. - """ - if nodes is None: - nodes=G - ccs=latapy_clustering(G, nodes=nodes, mode=mode) - return float(sum(ccs[v] for v in nodes))/len(nodes) - -def robins_alexander_clustering(G): - r"""Compute the bipartite clustering of G. - - Robins and Alexander [1]_ defined bipartite clustering coefficient as - four times the number of four cycles `C_4` divided by the number of - three paths `L_3` in a bipartite graph: - - .. math:: - - CC_4 = \frac{4 * C_4}{L_3} - - Parameters - ---------- - G : graph - a bipartite graph - - Returns - ------- - clustering : float - The Robins and Alexander bipartite clustering for the input graph. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.davis_southern_women_graph() - >>> print(round(bipartite.robins_alexander_clustering(G), 3)) - 0.468 - - See Also - -------- - latapy_clustering - square_clustering - - References - ---------- - .. [1] Robins, G. and M. Alexander (2004). Small worlds among interlocking - directors: Network structure and distance in bipartite graphs. - Computational & Mathematical Organization Theory 10(1), 69–94. - - """ - if G.order() < 4 or G.size() < 3: - return 0 - L_3 = _threepaths(G) - if L_3 == 0: - return 0 - C_4 = _four_cycles(G) - return (4. * C_4) / L_3 - -def _four_cycles(G): - cycles = 0 - for v in G: - for u, w in itertools.combinations(G[v], 2): - cycles += len((set(G[u]) & set(G[w])) - set([v])) - return cycles / 4 - -def _threepaths(G): - paths = 0 - for v in G: - for u in G[v]: - for w in set(G[u]) - set([v]): - paths += len(set(G[w]) - set([v, u])) - # Divide by two because we count each three path twice - # one for each possible starting point - return paths / 2 diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/projection.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/projection.py deleted file mode 100644 index 7f08244..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/projection.py +++ /dev/null @@ -1,497 +0,0 @@ -# -*- coding: utf-8 -*- -"""One-mode (unipartite) projections of bipartite graphs. -""" -import networkx as nx -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Jordi Torrents <jtorrents@milnou.net>']) -__all__ = ['project', - 'projected_graph', - 'weighted_projected_graph', - 'collaboration_weighted_projected_graph', - 'overlap_weighted_projected_graph', - 'generic_weighted_projected_graph'] - -def projected_graph(B, nodes, multigraph=False): - r"""Returns the projection of B onto one of its node sets. - - Returns the graph G that is the projection of the bipartite graph B - onto the specified nodes. They retain their attributes and are connected - in G if they have a common neighbor in B. - - Parameters - ---------- - B : NetworkX graph - The input graph should be bipartite. - - nodes : list or iterable - Nodes to project onto (the "bottom" nodes). - - multigraph: bool (default=False) - If True return a multigraph where the multiple edges represent multiple - shared neighbors. They edge key in the multigraph is assigned to the - label of the neighbor. - - Returns - ------- - Graph : NetworkX graph or multigraph - A graph that is the projection onto the given nodes. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> B = nx.path_graph(4) - >>> G = bipartite.projected_graph(B, [1,3]) - >>> print(G.nodes()) - [1, 3] - >>> print(G.edges()) - [(1, 3)] - - If nodes `a`, and `b` are connected through both nodes 1 and 2 then - building a multigraph results in two edges in the projection onto - [`a`,`b`]: - - >>> B = nx.Graph() - >>> B.add_edges_from([('a', 1), ('b', 1), ('a', 2), ('b', 2)]) - >>> G = bipartite.projected_graph(B, ['a', 'b'], multigraph=True) - >>> print([sorted((u,v)) for u,v in G.edges()]) - [['a', 'b'], ['a', 'b']] - - Notes - ------ - No attempt is made to verify that the input graph B is bipartite. - Returns a simple graph that is the projection of the bipartite graph B - onto the set of nodes given in list nodes. If multigraph=True then - a multigraph is returned with an edge for every shared neighbor. - - Directed graphs are allowed as input. The output will also then - be a directed graph with edges if there is a directed path between - the nodes. - - The graph and node properties are (shallow) copied to the projected graph. - - See Also - -------- - is_bipartite, - is_bipartite_node_set, - sets, - weighted_projected_graph, - collaboration_weighted_projected_graph, - overlap_weighted_projected_graph, - generic_weighted_projected_graph - """ - if B.is_multigraph(): - raise nx.NetworkXError("not defined for multigraphs") - if B.is_directed(): - directed=True - if multigraph: - G=nx.MultiDiGraph() - else: - G=nx.DiGraph() - else: - directed=False - if multigraph: - G=nx.MultiGraph() - else: - G=nx.Graph() - G.graph.update(B.graph) - G.add_nodes_from((n,B.node[n]) for n in nodes) - for u in nodes: - nbrs2=set((v for nbr in B[u] for v in B[nbr])) -set([u]) - if multigraph: - for n in nbrs2: - if directed: - links=set(B[u]) & set(B.pred[n]) - else: - links=set(B[u]) & set(B[n]) - for l in links: - if not G.has_edge(u,n,l): - G.add_edge(u,n,key=l) - else: - G.add_edges_from((u,n) for n in nbrs2) - return G - -def weighted_projected_graph(B, nodes, ratio=False): - r"""Returns a weighted projection of B onto one of its node sets. - - The weighted projected graph is the projection of the bipartite - network B onto the specified nodes with weights representing the - number of shared neighbors or the ratio between actual shared - neighbors and possible shared neighbors if ratio=True [1]_. The - nodes retain their attributes and are connected in the resulting graph - if they have an edge to a common node in the original graph. - - Parameters - ---------- - B : NetworkX graph - The input graph should be bipartite. - - nodes : list or iterable - Nodes to project onto (the "bottom" nodes). - - ratio: Bool (default=False) - If True, edge weight is the ratio between actual shared neighbors - and possible shared neighbors. If False, edges weight is the number - of shared neighbors. - - Returns - ------- - Graph : NetworkX graph - A graph that is the projection onto the given nodes. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> B = nx.path_graph(4) - >>> G = bipartite.weighted_projected_graph(B, [1,3]) - >>> print(G.nodes()) - [1, 3] - >>> print(G.edges(data=True)) - [(1, 3, {'weight': 1})] - >>> G = bipartite.weighted_projected_graph(B, [1,3], ratio=True) - >>> print(G.edges(data=True)) - [(1, 3, {'weight': 0.5})] - - Notes - ------ - No attempt is made to verify that the input graph B is bipartite. - The graph and node properties are (shallow) copied to the projected graph. - - See Also - -------- - is_bipartite, - is_bipartite_node_set, - sets, - collaboration_weighted_projected_graph, - overlap_weighted_projected_graph, - generic_weighted_projected_graph - projected_graph - - References - ---------- - .. [1] Borgatti, S.P. and Halgin, D. In press. "Analyzing Affiliation - Networks". In Carrington, P. and Scott, J. (eds) The Sage Handbook - of Social Network Analysis. Sage Publications. - """ - if B.is_multigraph(): - raise nx.NetworkXError("not defined for multigraphs") - if B.is_directed(): - pred=B.pred - G=nx.DiGraph() - else: - pred=B.adj - G=nx.Graph() - G.graph.update(B.graph) - G.add_nodes_from((n,B.node[n]) for n in nodes) - n_top = float(len(B) - len(nodes)) - for u in nodes: - unbrs = set(B[u]) - nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - set([u]) - for v in nbrs2: - vnbrs = set(pred[v]) - common = unbrs & vnbrs - if not ratio: - weight = len(common) - else: - weight = len(common) / n_top - G.add_edge(u,v,weight=weight) - return G - -def collaboration_weighted_projected_graph(B, nodes): - r"""Newman's weighted projection of B onto one of its node sets. - - The collaboration weighted projection is the projection of the - bipartite network B onto the specified nodes with weights assigned - using Newman's collaboration model [1]_: - - .. math:: - - w_{v,u} = \sum_k \frac{\delta_{v}^{w} \delta_{w}^{k}}{k_w - 1} - - where `v` and `u` are nodes from the same bipartite node set, - and `w` is a node of the opposite node set. - The value `k_w` is the degree of node `w` in the bipartite - network and `\delta_{v}^{w}` is 1 if node `v` is - linked to node `w` in the original bipartite graph or 0 otherwise. - - The nodes retain their attributes and are connected in the resulting - graph if have an edge to a common node in the original bipartite - graph. - - Parameters - ---------- - B : NetworkX graph - The input graph should be bipartite. - - nodes : list or iterable - Nodes to project onto (the "bottom" nodes). - - Returns - ------- - Graph : NetworkX graph - A graph that is the projection onto the given nodes. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> B = nx.path_graph(5) - >>> B.add_edge(1,5) - >>> G = bipartite.collaboration_weighted_projected_graph(B, [0, 2, 4, 5]) - >>> print(G.nodes()) - [0, 2, 4, 5] - >>> for edge in G.edges(data=True): print(edge) - ... - (0, 2, {'weight': 0.5}) - (0, 5, {'weight': 0.5}) - (2, 4, {'weight': 1.0}) - (2, 5, {'weight': 0.5}) - - Notes - ------ - No attempt is made to verify that the input graph B is bipartite. - The graph and node properties are (shallow) copied to the projected graph. - - See Also - -------- - is_bipartite, - is_bipartite_node_set, - sets, - weighted_projected_graph, - overlap_weighted_projected_graph, - generic_weighted_projected_graph, - projected_graph - - References - ---------- - .. [1] Scientific collaboration networks: II. - Shortest paths, weighted networks, and centrality, - M. E. J. Newman, Phys. Rev. E 64, 016132 (2001). - """ - if B.is_multigraph(): - raise nx.NetworkXError("not defined for multigraphs") - if B.is_directed(): - pred=B.pred - G=nx.DiGraph() - else: - pred=B.adj - G=nx.Graph() - G.graph.update(B.graph) - G.add_nodes_from((n,B.node[n]) for n in nodes) - for u in nodes: - unbrs = set(B[u]) - nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - set([u]) - for v in nbrs2: - vnbrs = set(pred[v]) - common = unbrs & vnbrs - weight = sum([1.0/(len(B[n]) - 1) for n in common if len(B[n])>1]) - G.add_edge(u,v,weight=weight) - return G - -def overlap_weighted_projected_graph(B, nodes, jaccard=True): - r"""Overlap weighted projection of B onto one of its node sets. - - The overlap weighted projection is the projection of the bipartite - network B onto the specified nodes with weights representing - the Jaccard index between the neighborhoods of the two nodes in the - original bipartite network [1]_: - - .. math:: - - w_{v,u} = \frac{|N(u) \cap N(v)|}{|N(u) \cup N(v)|} - - or if the parameter 'jaccard' is False, the fraction of common - neighbors by minimum of both nodes degree in the original - bipartite graph [1]_: - - .. math:: - - w_{v,u} = \frac{|N(u) \cap N(v)|}{min(|N(u)|,|N(v)|)} - - The nodes retain their attributes and are connected in the resulting - graph if have an edge to a common node in the original bipartite graph. - - Parameters - ---------- - B : NetworkX graph - The input graph should be bipartite. - - nodes : list or iterable - Nodes to project onto (the "bottom" nodes). - - jaccard: Bool (default=True) - - Returns - ------- - Graph : NetworkX graph - A graph that is the projection onto the given nodes. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> B = nx.path_graph(5) - >>> G = bipartite.overlap_weighted_projected_graph(B, [0, 2, 4]) - >>> print(G.nodes()) - [0, 2, 4] - >>> print(G.edges(data=True)) - [(0, 2, {'weight': 0.5}), (2, 4, {'weight': 0.5})] - >>> G = bipartite.overlap_weighted_projected_graph(B, [0, 2, 4], jaccard=False) - >>> print(G.edges(data=True)) - [(0, 2, {'weight': 1.0}), (2, 4, {'weight': 1.0})] - - Notes - ------ - No attempt is made to verify that the input graph B is bipartite. - The graph and node properties are (shallow) copied to the projected graph. - - See Also - -------- - is_bipartite, - is_bipartite_node_set, - sets, - weighted_projected_graph, - collaboration_weighted_projected_graph, - generic_weighted_projected_graph, - projected_graph - - References - ---------- - .. [1] Borgatti, S.P. and Halgin, D. In press. Analyzing Affiliation - Networks. In Carrington, P. and Scott, J. (eds) The Sage Handbook - of Social Network Analysis. Sage Publications. - - """ - if B.is_multigraph(): - raise nx.NetworkXError("not defined for multigraphs") - if B.is_directed(): - pred=B.pred - G=nx.DiGraph() - else: - pred=B.adj - G=nx.Graph() - G.graph.update(B.graph) - G.add_nodes_from((n,B.node[n]) for n in nodes) - for u in nodes: - unbrs = set(B[u]) - nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - set([u]) - for v in nbrs2: - vnbrs = set(pred[v]) - if jaccard: - weight = float(len(unbrs & vnbrs)) / len(unbrs | vnbrs) - else: - weight = float(len(unbrs & vnbrs)) / min(len(unbrs),len(vnbrs)) - G.add_edge(u,v,weight=weight) - return G - -def generic_weighted_projected_graph(B, nodes, weight_function=None): - r"""Weighted projection of B with a user-specified weight function. - - The bipartite network B is projected on to the specified nodes - with weights computed by a user-specified function. This function - must accept as a parameter the neighborhood sets of two nodes and - return an integer or a float. - - The nodes retain their attributes and are connected in the resulting graph - if they have an edge to a common node in the original graph. - - Parameters - ---------- - B : NetworkX graph - The input graph should be bipartite. - - nodes : list or iterable - Nodes to project onto (the "bottom" nodes). - - weight_function: function - This function must accept as parameters the same input graph - that this function, and two nodes; and return an integer or a float. - The default function computes the number of shared neighbors. - - Returns - ------- - Graph : NetworkX graph - A graph that is the projection onto the given nodes. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> # Define some custom weight functions - >>> def jaccard(G, u, v): - ... unbrs = set(G[u]) - ... vnbrs = set(G[v]) - ... return float(len(unbrs & vnbrs)) / len(unbrs | vnbrs) - ... - >>> def my_weight(G, u, v, weight='weight'): - ... w = 0 - ... for nbr in set(G[u]) & set(G[v]): - ... w += G.edge[u][nbr].get(weight, 1) + G.edge[v][nbr].get(weight, 1) - ... return w - ... - >>> # A complete bipartite graph with 4 nodes and 4 edges - >>> B = nx.complete_bipartite_graph(2,2) - >>> # Add some arbitrary weight to the edges - >>> for i,(u,v) in enumerate(B.edges()): - ... B.edge[u][v]['weight'] = i + 1 - ... - >>> for edge in B.edges(data=True): - ... print(edge) - ... - (0, 2, {'weight': 1}) - (0, 3, {'weight': 2}) - (1, 2, {'weight': 3}) - (1, 3, {'weight': 4}) - >>> # Without specifying a function, the weight is equal to # shared partners - >>> G = bipartite.generic_weighted_projected_graph(B, [0, 1]) - >>> print(G.edges(data=True)) - [(0, 1, {'weight': 2})] - >>> # To specify a custom weight function use the weight_function parameter - >>> G = bipartite.generic_weighted_projected_graph(B, [0, 1], weight_function=jaccard) - >>> print(G.edges(data=True)) - [(0, 1, {'weight': 1.0})] - >>> G = bipartite.generic_weighted_projected_graph(B, [0, 1], weight_function=my_weight) - >>> print(G.edges(data=True)) - [(0, 1, {'weight': 10})] - - Notes - ------ - No attempt is made to verify that the input graph B is bipartite. - The graph and node properties are (shallow) copied to the projected graph. - - See Also - -------- - is_bipartite, - is_bipartite_node_set, - sets, - weighted_projected_graph, - collaboration_weighted_projected_graph, - overlap_weighted_projected_graph, - projected_graph - - """ - if B.is_multigraph(): - raise nx.NetworkXError("not defined for multigraphs") - if B.is_directed(): - pred=B.pred - G=nx.DiGraph() - else: - pred=B.adj - G=nx.Graph() - if weight_function is None: - def weight_function(G, u, v): - # Notice that we use set(pred[v]) for handling the directed case. - return len(set(G[u]) & set(pred[v])) - G.graph.update(B.graph) - G.add_nodes_from((n,B.node[n]) for n in nodes) - for u in nodes: - nbrs2 = set((n for nbr in set(B[u]) for n in B[nbr])) - set([u]) - for v in nbrs2: - weight = weight_function(B, u, v) - G.add_edge(u,v,weight=weight) - return G - -def project(B, nodes, create_using=None): - return projected_graph(B, nodes) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/redundancy.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/redundancy.py deleted file mode 100644 index 055fdcb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/redundancy.py +++ /dev/null @@ -1,84 +0,0 @@ -#-*- coding: utf-8 -*- -"""Node redundancy for bipartite graphs.""" -# Copyright (C) 2011 by -# Jordi Torrents <jtorrents@milnou.net> -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -from itertools import combinations -import networkx as nx - -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Aric Hagberg (hagberg@lanl.gov)']) -__all__ = ['node_redundancy'] - -def node_redundancy(G, nodes=None): - r"""Compute bipartite node redundancy coefficient. - - The redundancy coefficient of a node `v` is the fraction of pairs of - neighbors of `v` that are both linked to other nodes. In a one-mode - projection these nodes would be linked together even if `v` were - not there. - - .. math:: - - rc(v) = \frac{|\{\{u,w\} \subseteq N(v), - \: \exists v' \neq v,\: (v',u) \in E\: - \mathrm{and}\: (v',w) \in E\}|}{ \frac{|N(v)|(|N(v)|-1)}{2}} - - where `N(v)` are the neighbors of `v` in `G`. - - Parameters - ---------- - G : graph - A bipartite graph - - nodes : list or iterable (optional) - Compute redundancy for these nodes. The default is all nodes in G. - - Returns - ------- - redundancy : dictionary - A dictionary keyed by node with the node redundancy value. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.cycle_graph(4) - >>> rc = bipartite.node_redundancy(G) - >>> rc[0] - 1.0 - - Compute the average redundancy for the graph: - - >>> sum(rc.values())/len(G) - 1.0 - - Compute the average redundancy for a set of nodes: - - >>> nodes = [0, 2] - >>> sum(rc[n] for n in nodes)/len(nodes) - 1.0 - - References - ---------- - .. [1] Latapy, Matthieu, Clémence Magnien, and Nathalie Del Vecchio (2008). - Basic notions for the analysis of large two-mode networks. - Social Networks 30(1), 31--48. - """ - if nodes is None: - nodes = G - rc = {} - for v in nodes: - overlap = 0.0 - for u, w in combinations(G[v], 2): - if len((set(G[u]) & set(G[w])) - set([v])) > 0: - overlap += 1 - if overlap > 0: - n = len(G[v]) - norm = 2.0/(n*(n-1)) - else: - norm = 1.0 - rc[v] = overlap*norm - return rc - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/spectral.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/spectral.py deleted file mode 100644 index d0ebdd4..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/spectral.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Spectral bipartivity measure. -""" -import networkx as nx -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__all__ = ['spectral_bipartivity'] - -def spectral_bipartivity(G, nodes=None, weight='weight'): - """Returns the spectral bipartivity. - - Parameters - ---------- - G : NetworkX graph - - nodes : list or container optional(default is all nodes) - Nodes to return value of spectral bipartivity contribution. - - weight : string or None optional (default = 'weight') - Edge data key to use for edge weights. If None, weights set to 1. - - Returns - ------- - sb : float or dict - A single number if the keyword nodes is not specified, or - a dictionary keyed by node with the spectral bipartivity contribution - of that node as the value. - - Examples - -------- - >>> from networkx.algorithms import bipartite - >>> G = nx.path_graph(4) - >>> bipartite.spectral_bipartivity(G) - 1.0 - - Notes - ----- - This implementation uses Numpy (dense) matrices which are not efficient - for storing large sparse graphs. - - See Also - -------- - color - - References - ---------- - .. [1] E. Estrada and J. A. RodrÃguez-Velázquez, "Spectral measures of - bipartivity in complex networks", PhysRev E 72, 046105 (2005) - """ - try: - import scipy.linalg - except ImportError: - raise ImportError('spectral_bipartivity() requires SciPy: ', - 'http://scipy.org/') - nodelist = G.nodes() # ordering of nodes in matrix - A = nx.to_numpy_matrix(G, nodelist, weight=weight) - expA = scipy.linalg.expm(A) - expmA = scipy.linalg.expm(-A) - coshA = 0.5 * (expA + expmA) - if nodes is None: - # return single number for entire graph - return coshA.diagonal().sum() / expA.diagonal().sum() - else: - # contribution for individual nodes - index = dict(zip(nodelist, range(len(nodelist)))) - sb = {} - for n in nodes: - i = index[n] - sb[n] = coshA[i, i] / expA[i, i] - return sb - -def setup_module(module): - """Fixture for nose tests.""" - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_basic.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_basic.py deleted file mode 100644 index 5b22e9a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_basic.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -from nose.plugins.attrib import attr -import networkx as nx -from networkx.algorithms import bipartite -class TestBipartiteBasic: - - def test_is_bipartite(self): - assert_true(bipartite.is_bipartite(nx.path_graph(4))) - assert_true(bipartite.is_bipartite(nx.DiGraph([(1,0)]))) - assert_false(bipartite.is_bipartite(nx.complete_graph(3))) - - - def test_bipartite_color(self): - G=nx.path_graph(4) - c=bipartite.color(G) - assert_equal(c,{0: 1, 1: 0, 2: 1, 3: 0}) - - @raises(nx.NetworkXError) - def test_not_bipartite_color(self): - c=bipartite.color(nx.complete_graph(4)) - - - def test_bipartite_directed(self): - G = nx.bipartite_random_graph(10, 10, 0.1, directed=True) - assert_true(bipartite.is_bipartite(G)) - - def test_bipartite_sets(self): - G=nx.path_graph(4) - X,Y=bipartite.sets(G) - assert_equal(X,set([0,2])) - assert_equal(Y,set([1,3])) - - def test_is_bipartite_node_set(self): - G=nx.path_graph(4) - assert_true(bipartite.is_bipartite_node_set(G,[0,2])) - assert_true(bipartite.is_bipartite_node_set(G,[1,3])) - assert_false(bipartite.is_bipartite_node_set(G,[1,2])) - G.add_path([10,20]) - assert_true(bipartite.is_bipartite_node_set(G,[0,2,10])) - assert_true(bipartite.is_bipartite_node_set(G,[0,2,20])) - assert_true(bipartite.is_bipartite_node_set(G,[1,3,10])) - assert_true(bipartite.is_bipartite_node_set(G,[1,3,20])) - - def test_bipartite_density(self): - G=nx.path_graph(5) - X,Y=bipartite.sets(G) - density=float(len(G.edges()))/(len(X)*len(Y)) - assert_equal(bipartite.density(G,X),density) - D = nx.DiGraph(G.edges()) - assert_equal(bipartite.density(D,X),density/2.0) - assert_equal(bipartite.density(nx.Graph(),{}),0.0) - - def test_bipartite_degrees(self): - G=nx.path_graph(5) - X=set([1,3]) - Y=set([0,2,4]) - u,d=bipartite.degrees(G,Y) - assert_equal(u,{1:2,3:2}) - assert_equal(d,{0:1,2:2,4:1}) - - def test_bipartite_weighted_degrees(self): - G=nx.path_graph(5) - G.add_edge(0,1,weight=0.1,other=0.2) - X=set([1,3]) - Y=set([0,2,4]) - u,d=bipartite.degrees(G,Y,weight='weight') - assert_equal(u,{1:1.1,3:2}) - assert_equal(d,{0:0.1,2:2,4:1}) - u,d=bipartite.degrees(G,Y,weight='other') - assert_equal(u,{1:1.2,3:2}) - assert_equal(d,{0:0.2,2:2,4:1}) - - - @attr('numpy') - def test_biadjacency_matrix_weight(self): - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - G=nx.path_graph(5) - G.add_edge(0,1,weight=2,other=4) - X=[1,3] - Y=[0,2,4] - M = bipartite.biadjacency_matrix(G,X,weight='weight') - assert_equal(M[0,0], 2) - M = bipartite.biadjacency_matrix(G, X, weight='other') - assert_equal(M[0,0], 4) - - @attr('numpy') - def test_biadjacency_matrix(self): - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - tops = [2,5,10] - bots = [5,10,15] - for i in range(len(tops)): - G = nx.bipartite_random_graph(tops[i], bots[i], 0.2) - top = [n for n,d in G.nodes(data=True) if d['bipartite']==0] - M = bipartite.biadjacency_matrix(G, top) - assert_equal(M.shape[0],tops[i]) - assert_equal(M.shape[1],bots[i]) - - @attr('numpy') - def test_biadjacency_matrix_order(self): - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - G=nx.path_graph(5) - G.add_edge(0,1,weight=2) - X=[3,1] - Y=[4,2,0] - M = bipartite.biadjacency_matrix(G,X,Y,weight='weight') - assert_equal(M[1,2], 2) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_centrality.py deleted file mode 100644 index 992d643..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_centrality.py +++ /dev/null @@ -1,169 +0,0 @@ -from nose.tools import * -import networkx as nx -from networkx.algorithms import bipartite - -class TestBipartiteCentrality(object): - - def setUp(self): - self.P4 = nx.path_graph(4) - self.K3 = nx.complete_bipartite_graph(3,3) - self.C4 = nx.cycle_graph(4) - self.davis = nx.davis_southern_women_graph() - self.top_nodes = [n for n,d in self.davis.nodes(data=True) - if d['bipartite']==0] - - def test_degree_centrality(self): - d = bipartite.degree_centrality(self.P4, [1,3]) - answer = {0: 0.5, 1: 1.0, 2: 1.0, 3: 0.5} - assert_equal(d, answer) - d = bipartite.degree_centrality(self.K3, [0,1,2]) - answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0} - assert_equal(d, answer) - d = bipartite.degree_centrality(self.C4, [0,2]) - answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0} - assert_equal(d,answer) - - def test_betweenness_centrality(self): - c = bipartite.betweenness_centrality(self.P4, [1,3]) - answer = {0: 0.0, 1: 1.0, 2: 1.0, 3: 0.0} - assert_equal(c, answer) - c = bipartite.betweenness_centrality(self.K3, [0,1,2]) - answer = {0: 0.125, 1: 0.125, 2: 0.125, 3: 0.125, 4: 0.125, 5: 0.125} - assert_equal(c, answer) - c = bipartite.betweenness_centrality(self.C4, [0,2]) - answer = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25} - assert_equal(c, answer) - - def test_closeness_centrality(self): - c = bipartite.closeness_centrality(self.P4, [1,3]) - answer = {0: 2.0/3, 1: 1.0, 2: 1.0, 3:2.0/3} - assert_equal(c, answer) - c = bipartite.closeness_centrality(self.K3, [0,1,2]) - answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0} - assert_equal(c, answer) - c = bipartite.closeness_centrality(self.C4, [0,2]) - answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0} - assert_equal(c, answer) - G = nx.Graph() - G.add_node(0) - G.add_node(1) - c = bipartite.closeness_centrality(G, [0]) - assert_equal(c, {1: 0.0}) - c = bipartite.closeness_centrality(G, [1]) - assert_equal(c, {1: 0.0}) - - def test_davis_degree_centrality(self): - G = self.davis - deg = bipartite.degree_centrality(G, self.top_nodes) - answer = {'E8':0.78, - 'E9':0.67, - 'E7':0.56, - 'Nora Fayette':0.57, - 'Evelyn Jefferson':0.57, - 'Theresa Anderson':0.57, - 'E6':0.44, - 'Sylvia Avondale':0.50, - 'Laura Mandeville':0.50, - 'Brenda Rogers':0.50, - 'Katherina Rogers':0.43, - 'E5':0.44, - 'Helen Lloyd':0.36, - 'E3':0.33, - 'Ruth DeSand':0.29, - 'Verne Sanderson':0.29, - 'E12':0.33, - 'Myra Liddel':0.29, - 'E11':0.22, - 'Eleanor Nye':0.29, - 'Frances Anderson':0.29, - 'Pearl Oglethorpe':0.21, - 'E4':0.22, - 'Charlotte McDowd':0.29, - 'E10':0.28, - 'Olivia Carleton':0.14, - 'Flora Price':0.14, - 'E2':0.17, - 'E1':0.17, - 'Dorothy Murchison':0.14, - 'E13':0.17, - 'E14':0.17} - for node, value in answer.items(): - assert_almost_equal(value, deg[node], places=2) - - def test_davis_betweenness_centrality(self): - G = self.davis - bet = bipartite.betweenness_centrality(G, self.top_nodes) - answer = {'E8':0.24, - 'E9':0.23, - 'E7':0.13, - 'Nora Fayette':0.11, - 'Evelyn Jefferson':0.10, - 'Theresa Anderson':0.09, - 'E6':0.07, - 'Sylvia Avondale':0.07, - 'Laura Mandeville':0.05, - 'Brenda Rogers':0.05, - 'Katherina Rogers':0.05, - 'E5':0.04, - 'Helen Lloyd':0.04, - 'E3':0.02, - 'Ruth DeSand':0.02, - 'Verne Sanderson':0.02, - 'E12':0.02, - 'Myra Liddel':0.02, - 'E11':0.02, - 'Eleanor Nye':0.01, - 'Frances Anderson':0.01, - 'Pearl Oglethorpe':0.01, - 'E4':0.01, - 'Charlotte McDowd':0.01, - 'E10':0.01, - 'Olivia Carleton':0.01, - 'Flora Price':0.01, - 'E2':0.00, - 'E1':0.00, - 'Dorothy Murchison':0.00, - 'E13':0.00, - 'E14':0.00} - for node, value in answer.items(): - assert_almost_equal(value, bet[node], places=2) - - def test_davis_closeness_centrality(self): - G = self.davis - clos = bipartite.closeness_centrality(G, self.top_nodes) - answer = {'E8':0.85, - 'E9':0.79, - 'E7':0.73, - 'Nora Fayette':0.80, - 'Evelyn Jefferson':0.80, - 'Theresa Anderson':0.80, - 'E6':0.69, - 'Sylvia Avondale':0.77, - 'Laura Mandeville':0.73, - 'Brenda Rogers':0.73, - 'Katherina Rogers':0.73, - 'E5':0.59, - 'Helen Lloyd':0.73, - 'E3':0.56, - 'Ruth DeSand':0.71, - 'Verne Sanderson':0.71, - 'E12':0.56, - 'Myra Liddel':0.69, - 'E11':0.54, - 'Eleanor Nye':0.67, - 'Frances Anderson':0.67, - 'Pearl Oglethorpe':0.67, - 'E4':0.54, - 'Charlotte McDowd':0.60, - 'E10':0.55, - 'Olivia Carleton':0.59, - 'Flora Price':0.59, - 'E2':0.52, - 'E1':0.52, - 'Dorothy Murchison':0.65, - 'E13':0.52, - 'E14':0.52} - for node, value in answer.items(): - assert_almost_equal(value, clos[node], places=2) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_cluster.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_cluster.py deleted file mode 100644 index aa158f9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_cluster.py +++ /dev/null @@ -1,70 +0,0 @@ -import networkx as nx -from nose.tools import * -from networkx.algorithms.bipartite.cluster import cc_dot,cc_min,cc_max -import networkx.algorithms.bipartite as bipartite - -def test_pairwise_bipartite_cc_functions(): - # Test functions for different kinds of bipartite clustering coefficients - # between pairs of nodes using 3 example graphs from figure 5 p. 40 - # Latapy et al (2008) - G1 = nx.Graph([(0,2),(0,3),(0,4),(0,5),(0,6),(1,5),(1,6),(1,7)]) - G2 = nx.Graph([(0,2),(0,3),(0,4),(1,3),(1,4),(1,5)]) - G3 = nx.Graph([(0,2),(0,3),(0,4),(0,5),(0,6),(1,5),(1,6),(1,7),(1,8),(1,9)]) - result = {0:[1/3.0, 2/3.0, 2/5.0], - 1:[1/2.0, 2/3.0, 2/3.0], - 2:[2/8.0, 2/5.0, 2/5.0]} - for i, G in enumerate([G1, G2, G3]): - assert(bipartite.is_bipartite(G)) - assert(cc_dot(set(G[0]), set(G[1])) == result[i][0]) - assert(cc_min(set(G[0]), set(G[1])) == result[i][1]) - assert(cc_max(set(G[0]), set(G[1])) == result[i][2]) - -def test_star_graph(): - G=nx.star_graph(3) - # all modes are the same - answer={0:0,1:1,2:1,3:1} - assert_equal(bipartite.clustering(G,mode='dot'),answer) - assert_equal(bipartite.clustering(G,mode='min'),answer) - assert_equal(bipartite.clustering(G,mode='max'),answer) - -@raises(nx.NetworkXError) -def test_not_bipartite(): - bipartite.clustering(nx.complete_graph(4)) - -@raises(nx.NetworkXError) -def test_bad_mode(): - bipartite.clustering(nx.path_graph(4),mode='foo') - -def test_path_graph(): - G=nx.path_graph(4) - answer={0:0.5,1:0.5,2:0.5,3:0.5} - assert_equal(bipartite.clustering(G,mode='dot'),answer) - assert_equal(bipartite.clustering(G,mode='max'),answer) - answer={0:1,1:1,2:1,3:1} - assert_equal(bipartite.clustering(G,mode='min'),answer) - -def test_average_path_graph(): - G=nx.path_graph(4) - assert_equal(bipartite.average_clustering(G,mode='dot'),0.5) - assert_equal(bipartite.average_clustering(G,mode='max'),0.5) - assert_equal(bipartite.average_clustering(G,mode='min'),1) - -def test_ra_clustering_davis(): - G = nx.davis_southern_women_graph() - cc4 = round(bipartite.robins_alexander_clustering(G), 3) - assert_equal(cc4, 0.468) - -def test_ra_clustering_square(): - G = nx.path_graph(4) - G.add_edge(0, 3) - assert_equal(bipartite.robins_alexander_clustering(G), 1.0) - -def test_ra_clustering_zero(): - G = nx.Graph() - assert_equal(bipartite.robins_alexander_clustering(G), 0) - G.add_nodes_from(range(4)) - assert_equal(bipartite.robins_alexander_clustering(G), 0) - G.add_edges_from([(0,1),(2,3),(3,4)]) - assert_equal(bipartite.robins_alexander_clustering(G), 0) - G.add_edge(1,2) - assert_equal(bipartite.robins_alexander_clustering(G), 0) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_project.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_project.py deleted file mode 100644 index 52a93b2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_project.py +++ /dev/null @@ -1,363 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx.algorithms import bipartite -from networkx.testing import * - -class TestBipartiteProject: - - def test_path_projected_graph(self): - G=nx.path_graph(4) - P=bipartite.projected_graph(G,[1,3]) - assert_equal(sorted(P.nodes()),[1,3]) - assert_equal(sorted(P.edges()),[(1,3)]) - P=bipartite.projected_graph(G,[0,2]) - assert_equal(sorted(P.nodes()),[0,2]) - assert_equal(sorted(P.edges()),[(0,2)]) - - def test_path_projected_properties_graph(self): - G=nx.path_graph(4) - G.add_node(1,name='one') - G.add_node(2,name='two') - P=bipartite.projected_graph(G,[1,3]) - assert_equal(sorted(P.nodes()),[1,3]) - assert_equal(sorted(P.edges()),[(1,3)]) - assert_equal(P.node[1]['name'],G.node[1]['name']) - P=bipartite.projected_graph(G,[0,2]) - assert_equal(sorted(P.nodes()),[0,2]) - assert_equal(sorted(P.edges()),[(0,2)]) - assert_equal(P.node[2]['name'],G.node[2]['name']) - - def test_path_collaboration_projected_graph(self): - G=nx.path_graph(4) - P=bipartite.collaboration_weighted_projected_graph(G,[1,3]) - assert_equal(sorted(P.nodes()),[1,3]) - assert_equal(sorted(P.edges()),[(1,3)]) - P[1][3]['weight']=1 - P=bipartite.collaboration_weighted_projected_graph(G,[0,2]) - assert_equal(sorted(P.nodes()),[0,2]) - assert_equal(sorted(P.edges()),[(0,2)]) - P[0][2]['weight']=1 - - def test_directed_path_collaboration_projected_graph(self): - G=nx.DiGraph() - G.add_path(list(range(4))) - P=bipartite.collaboration_weighted_projected_graph(G,[1,3]) - assert_equal(sorted(P.nodes()),[1,3]) - assert_equal(sorted(P.edges()),[(1,3)]) - P[1][3]['weight']=1 - P=bipartite.collaboration_weighted_projected_graph(G,[0,2]) - assert_equal(sorted(P.nodes()),[0,2]) - assert_equal(sorted(P.edges()),[(0,2)]) - P[0][2]['weight']=1 - - def test_path_weighted_projected_graph(self): - G=nx.path_graph(4) - P=bipartite.weighted_projected_graph(G,[1,3]) - assert_equal(sorted(P.nodes()),[1,3]) - assert_equal(sorted(P.edges()),[(1,3)]) - P[1][3]['weight']=1 - P=bipartite.weighted_projected_graph(G,[0,2]) - assert_equal(sorted(P.nodes()),[0,2]) - assert_equal(sorted(P.edges()),[(0,2)]) - P[0][2]['weight']=1 - - def test_path_weighted_projected_directed_graph(self): - G=nx.DiGraph() - G.add_path(list(range(4))) - P=bipartite.weighted_projected_graph(G,[1,3]) - assert_equal(sorted(P.nodes()),[1,3]) - assert_equal(sorted(P.edges()),[(1,3)]) - P[1][3]['weight']=1 - P=bipartite.weighted_projected_graph(G,[0,2]) - assert_equal(sorted(P.nodes()),[0,2]) - assert_equal(sorted(P.edges()),[(0,2)]) - P[0][2]['weight']=1 - - - def test_star_projected_graph(self): - G=nx.star_graph(3) - P=bipartite.projected_graph(G,[1,2,3]) - assert_equal(sorted(P.nodes()),[1,2,3]) - assert_equal(sorted(P.edges()),[(1,2),(1,3),(2,3)]) - P=bipartite.weighted_projected_graph(G,[1,2,3]) - assert_equal(sorted(P.nodes()),[1,2,3]) - assert_equal(sorted(P.edges()),[(1,2),(1,3),(2,3)]) - - P=bipartite.projected_graph(G,[0]) - assert_equal(sorted(P.nodes()),[0]) - assert_equal(sorted(P.edges()),[]) - - def test_project_multigraph(self): - G=nx.Graph() - G.add_edge('a',1) - G.add_edge('b',1) - G.add_edge('a',2) - G.add_edge('b',2) - P=bipartite.projected_graph(G,'ab') - assert_edges_equal(P.edges(),[('a','b')]) - P=bipartite.weighted_projected_graph(G,'ab') - assert_edges_equal(P.edges(),[('a','b')]) - P=bipartite.projected_graph(G,'ab',multigraph=True) - assert_edges_equal(P.edges(),[('a','b'),('a','b')]) - - def test_project_collaboration(self): - G=nx.Graph() - G.add_edge('a',1) - G.add_edge('b',1) - G.add_edge('b',2) - G.add_edge('c',2) - G.add_edge('c',3) - G.add_edge('c',4) - G.add_edge('b',4) - P=bipartite.collaboration_weighted_projected_graph(G,'abc') - assert_equal(P['a']['b']['weight'],1) - assert_equal(P['b']['c']['weight'],2) - - def test_directed_projection(self): - G=nx.DiGraph() - G.add_edge('A',1) - G.add_edge(1,'B') - G.add_edge('A',2) - G.add_edge('B',2) - P=bipartite.projected_graph(G,'AB') - assert_equal(sorted(P.edges()),[('A','B')]) - P=bipartite.weighted_projected_graph(G,'AB') - assert_equal(sorted(P.edges()),[('A','B')]) - assert_equal(P['A']['B']['weight'],1) - - P=bipartite.projected_graph(G,'AB',multigraph=True) - assert_equal(sorted(P.edges()),[('A','B')]) - - G=nx.DiGraph() - G.add_edge('A',1) - G.add_edge(1,'B') - G.add_edge('A',2) - G.add_edge(2,'B') - P=bipartite.projected_graph(G,'AB') - assert_equal(sorted(P.edges()),[('A','B')]) - P=bipartite.weighted_projected_graph(G,'AB') - assert_equal(sorted(P.edges()),[('A','B')]) - assert_equal(P['A']['B']['weight'],2) - - P=bipartite.projected_graph(G,'AB',multigraph=True) - assert_equal(sorted(P.edges()),[('A','B'),('A','B')]) - - -class TestBipartiteWeightedProjection: - - def setUp(self): - # Tore Opsahl's example - # http://toreopsahl.com/2009/05/01/projecting-two-mode-networks-onto-weighted-one-mode-networks/ - self.G=nx.Graph() - self.G.add_edge('A',1) - self.G.add_edge('A',2) - self.G.add_edge('B',1) - self.G.add_edge('B',2) - self.G.add_edge('B',3) - self.G.add_edge('B',4) - self.G.add_edge('B',5) - self.G.add_edge('C',1) - self.G.add_edge('D',3) - self.G.add_edge('E',4) - self.G.add_edge('E',5) - self.G.add_edge('E',6) - self.G.add_edge('F',6) - # Graph based on figure 6 from Newman (2001) - self.N=nx.Graph() - self.N.add_edge('A',1) - self.N.add_edge('A',2) - self.N.add_edge('A',3) - self.N.add_edge('B',1) - self.N.add_edge('B',2) - self.N.add_edge('B',3) - self.N.add_edge('C',1) - self.N.add_edge('D',1) - self.N.add_edge('E',3) - - def test_project_weighted_shared(self): - edges=[('A','B',2), - ('A','C',1), - ('B','C',1), - ('B','D',1), - ('B','E',2), - ('E','F',1)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.weighted_projected_graph(self.G,'ABCDEF') - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - edges=[('A','B',3), - ('A','E',1), - ('A','C',1), - ('A','D',1), - ('B','E',1), - ('B','C',1), - ('B','D',1), - ('C','D',1)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.weighted_projected_graph(self.N,'ABCDE') - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - def test_project_weighted_newman(self): - edges=[('A','B',1.5), - ('A','C',0.5), - ('B','C',0.5), - ('B','D',1), - ('B','E',2), - ('E','F',1)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.collaboration_weighted_projected_graph(self.G,'ABCDEF') - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - edges=[('A','B',11/6.0), - ('A','E',1/2.0), - ('A','C',1/3.0), - ('A','D',1/3.0), - ('B','E',1/2.0), - ('B','C',1/3.0), - ('B','D',1/3.0), - ('C','D',1/3.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.collaboration_weighted_projected_graph(self.N,'ABCDE') - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - def test_project_weighted_ratio(self): - edges=[('A','B',2/6.0), - ('A','C',1/6.0), - ('B','C',1/6.0), - ('B','D',1/6.0), - ('B','E',2/6.0), - ('E','F',1/6.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.weighted_projected_graph(self.G, 'ABCDEF', ratio=True) - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - edges=[('A','B',3/3.0), - ('A','E',1/3.0), - ('A','C',1/3.0), - ('A','D',1/3.0), - ('B','E',1/3.0), - ('B','C',1/3.0), - ('B','D',1/3.0), - ('C','D',1/3.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.weighted_projected_graph(self.N, 'ABCDE', ratio=True) - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - def test_project_weighted_overlap(self): - edges=[('A','B',2/2.0), - ('A','C',1/1.0), - ('B','C',1/1.0), - ('B','D',1/1.0), - ('B','E',2/3.0), - ('E','F',1/1.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.overlap_weighted_projected_graph(self.G,'ABCDEF', jaccard=False) - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - edges=[('A','B',3/3.0), - ('A','E',1/1.0), - ('A','C',1/1.0), - ('A','D',1/1.0), - ('B','E',1/1.0), - ('B','C',1/1.0), - ('B','D',1/1.0), - ('C','D',1/1.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.overlap_weighted_projected_graph(self.N,'ABCDE', jaccard=False) - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - def test_project_weighted_jaccard(self): - edges=[('A','B',2/5.0), - ('A','C',1/2.0), - ('B','C',1/5.0), - ('B','D',1/5.0), - ('B','E',2/6.0), - ('E','F',1/3.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.overlap_weighted_projected_graph(self.G,'ABCDEF') - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - edges=[('A','B',3/3.0), - ('A','E',1/3.0), - ('A','C',1/3.0), - ('A','D',1/3.0), - ('B','E',1/3.0), - ('B','C',1/3.0), - ('B','D',1/3.0), - ('C','D',1/1.0)] - Panswer=nx.Graph() - Panswer.add_weighted_edges_from(edges) - P=bipartite.overlap_weighted_projected_graph(self.N,'ABCDE') - assert_equal(P.edges(),Panswer.edges()) - for u,v in P.edges(): - assert_equal(P[u][v]['weight'],Panswer[u][v]['weight']) - - def test_generic_weighted_projected_graph_simple(self): - def shared(G, u, v): - return len(set(G[u]) & set(G[v])) - B = nx.path_graph(5) - G = bipartite.generic_weighted_projected_graph(B, [0, 2, 4], weight_function=shared) - assert_equal(sorted(G.nodes()), [0, 2, 4]) - assert_equal(G.edges(data=True), - [(0, 2, {'weight': 1}), (2, 4, {'weight': 1})] ) - - G = bipartite.generic_weighted_projected_graph(B, [0, 2, 4]) - assert_equal(sorted(G.nodes()), [0, 2, 4]) - assert_equal(G.edges(data=True), - [(0, 2, {'weight': 1}), (2, 4, {'weight': 1})] ) - B = nx.DiGraph() - B.add_path(list(range(5))) - G = bipartite.generic_weighted_projected_graph(B, [0, 2, 4]) - assert_equal(sorted(G.nodes()), [0, 2, 4]) - assert_equal(G.edges(data=True), - [(0, 2, {'weight': 1}), (2, 4, {'weight': 1})] ) - - def test_generic_weighted_projected_graph_custom(self): - def jaccard(G, u, v): - unbrs = set(G[u]) - vnbrs = set(G[v]) - return float(len(unbrs & vnbrs)) / len(unbrs | vnbrs) - def my_weight(G, u, v, weight='weight'): - w = 0 - for nbr in set(G[u]) & set(G[v]): - w += G.edge[u][nbr].get(weight, 1) + G.edge[v][nbr].get(weight, 1) - return w - B = nx.complete_bipartite_graph(2,2) - for i,(u,v) in enumerate(B.edges()): - B.edge[u][v]['weight'] = i + 1 - G = bipartite.generic_weighted_projected_graph(B, [0, 1], - weight_function=jaccard) - assert_equal(G.edges(data=True), [(0, 1, {'weight': 1.0})]) - G = bipartite.generic_weighted_projected_graph(B, [0, 1], - weight_function=my_weight) - assert_equal(G.edges(data=True), [(0, 1, {'weight': 10})]) - G = bipartite.generic_weighted_projected_graph(B, [0, 1]) - assert_equal(G.edges(data=True), [(0, 1, {'weight': 2})]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py deleted file mode 100644 index e244a42..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -from nose import SkipTest -from nose.tools import * -import networkx as nx -from networkx.algorithms.bipartite import spectral_bipartivity as sb - -# Examples from Figure 1 -# E. Estrada and J. A. RodrÃguez-Velázquez, "Spectral measures of -# bipartivity in complex networks", PhysRev E 72, 046105 (2005) - -class TestSpectralBipartivity(object): - @classmethod - def setupClass(cls): - global scipy - global assert_equal - global assert_almost_equal - try: - import scipy.linalg - except ImportError: - raise SkipTest('SciPy not available.') - - - def test_star_like(self): - # star-like - - G=nx.star_graph(2) - G.add_edge(1,2) - assert_almost_equal(sb(G),0.843,places=3) - - G=nx.star_graph(3) - G.add_edge(1,2) - assert_almost_equal(sb(G),0.871,places=3) - - G=nx.star_graph(4) - G.add_edge(1,2) - assert_almost_equal(sb(G),0.890,places=3) - - - def k23_like(self): - # K2,3-like - G=nx.complete_bipartite_graph(2,3) - G.add_edge(0,1) - assert_almost_equal(sb(G),0.769,places=3) - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(2,4) - assert_almost_equal(sb(G),0.829,places=3) - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(2,4) - G.add_edge(3,4) - assert_almost_equal(sb(G),0.731,places=3) - - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(0,1) - G.add_edge(2,4) - assert_almost_equal(sb(G),0.692,places=3) - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(2,4) - G.add_edge(3,4) - G.add_edge(0,1) - assert_almost_equal(sb(G),0.645,places=3) - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(2,4) - G.add_edge(3,4) - G.add_edge(2,3) - assert_almost_equal(sb(G),0.645,places=3) - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(2,4) - G.add_edge(3,4) - G.add_edge(2,3) - G.add_edge(0,1) - assert_almost_equal(sb(G),0.597,places=3) - - def test_single_nodes(self): - - # single nodes - G=nx.complete_bipartite_graph(2,3) - G.add_edge(2,4) - sbn=sb(G,nodes=[1,2]) - assert_almost_equal(sbn[1],0.85,places=2) - assert_almost_equal(sbn[2],0.77,places=2) - - G=nx.complete_bipartite_graph(2,3) - G.add_edge(0,1) - sbn=sb(G,nodes=[1,2]) - assert_almost_equal(sbn[1],0.73,places=2) - assert_almost_equal(sbn[2],0.82,places=2) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/block.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/block.py deleted file mode 100644 index cc2ff1d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/block.py +++ /dev/null @@ -1,115 +0,0 @@ -# encoding: utf-8 -""" -Functions for creating network blockmodels from node partitions. - -Created by Drew Conway <drew.conway@nyu.edu> -Copyright (c) 2010. All rights reserved. -""" -__author__ = """\n""".join(['Drew Conway <drew.conway@nyu.edu>', - 'Aric Hagberg <hagberg@lanl.gov>']) -__all__=['blockmodel'] - -import networkx as nx - -def blockmodel(G,partitions,multigraph=False): - """Returns a reduced graph constructed using the generalized block modeling - technique. - - The blockmodel technique collapses nodes into blocks based on a - given partitioning of the node set. Each partition of nodes - (block) is represented as a single node in the reduced graph. - - Edges between nodes in the block graph are added according to the - edges in the original graph. If the parameter multigraph is False - (the default) a single edge is added with a weight equal to the - sum of the edge weights between nodes in the original graph - The default is a weight of 1 if weights are not specified. If the - parameter multigraph is True then multiple edges are added each - with the edge data from the original graph. - - Parameters - ---------- - G : graph - A networkx Graph or DiGraph - partitions : list of lists, or list of sets - The partition of the nodes. Must be non-overlapping. - multigraph : bool, optional - If True return a MultiGraph with the edge data of the original - graph applied to each corresponding edge in the new graph. - If False return a Graph with the sum of the edge weights, or a - count of the edges if the original graph is unweighted. - - Returns - ------- - blockmodel : a Networkx graph object - - Examples - -------- - >>> G=nx.path_graph(6) - >>> partition=[[0,1],[2,3],[4,5]] - >>> M=nx.blockmodel(G,partition) - - References - ---------- - .. [1] Patrick Doreian, Vladimir Batagelj, and Anuska Ferligoj - "Generalized Blockmodeling",Cambridge University Press, 2004. - """ - # Create sets of node partitions - part=list(map(set,partitions)) - - # Check for overlapping node partitions - u=set() - for p1,p2 in zip(part[:-1],part[1:]): - u.update(p1) - #if not u.isdisjoint(p2): # Python 2.6 required - if len (u.intersection(p2))>0: - raise nx.NetworkXException("Overlapping node partitions.") - - # Initialize blockmodel graph - if multigraph: - if G.is_directed(): - M=nx.MultiDiGraph() - else: - M=nx.MultiGraph() - else: - if G.is_directed(): - M=nx.DiGraph() - else: - M=nx.Graph() - - # Add nodes and properties to blockmodel - # The blockmodel nodes are node-induced subgraphs of G - # Label them with integers starting at 0 - for i,p in zip(range(len(part)),part): - M.add_node(i) - # The node-induced subgraph is stored as the node 'graph' attribute - SG=G.subgraph(p) - M.node[i]['graph']=SG - M.node[i]['nnodes']=SG.number_of_nodes() - M.node[i]['nedges']=SG.number_of_edges() - M.node[i]['density']=nx.density(SG) - - # Create mapping between original node labels and new blockmodel node labels - block_mapping={} - for n in M: - nodes_in_block=M.node[n]['graph'].nodes() - block_mapping.update(dict.fromkeys(nodes_in_block,n)) - - # Add edges to block graph - for u,v,d in G.edges(data=True): - bmu=block_mapping[u] - bmv=block_mapping[v] - if bmu==bmv: # no self loops - continue - if multigraph: - # For multigraphs add an edge for each edge in original graph - M.add_edge(bmu,bmv,attr_dict=d) - else: - # For graphs and digraphs add single weighted edge - weight=d.get('weight',1.0) # default to 1 if no weight specified - if M.has_edge(bmu,bmv): - M[bmu][bmv]['weight']+=weight - else: - M.add_edge(bmu,bmv,weight=weight) - return M - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/boundary.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/boundary.py deleted file mode 100644 index ec7b11c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/boundary.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -Routines to find the boundary of a set of nodes. - -Edge boundaries are edges that have only one end -in the set of nodes. - -Node boundaries are nodes outside the set of nodes -that have an edge to a node in the set. - -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)\nDan Schult (dschult@colgate.edu)""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__=['edge_boundary','node_boundary'] - -def edge_boundary(G, nbunch1, nbunch2=None): - """Return the edge boundary. - - Edge boundaries are edges that have only one end - in the given set of nodes. - - Parameters - ----------- - G : graph - A networkx graph - - nbunch1 : list, container - Interior node set - - nbunch2 : list, container - Exterior node set. If None then it is set to all of the - nodes in G not in nbunch1. - - Returns - ------- - elist : list - List of edges - - Notes - ------ - Nodes in nbunch1 and nbunch2 that are not in G are ignored. - - nbunch1 and nbunch2 are usually meant to be disjoint, - but in the interest of speed and generality, that is - not required here. - - """ - if nbunch2 is None: # Then nbunch2 is complement of nbunch1 - nset1=set((n for n in nbunch1 if n in G)) - return [(n1,n2) for n1 in nset1 for n2 in G[n1] \ - if n2 not in nset1] - - nset2=set(nbunch2) - return [(n1,n2) for n1 in nbunch1 if n1 in G for n2 in G[n1] \ - if n2 in nset2] - -def node_boundary(G, nbunch1, nbunch2=None): - """Return the node boundary. - - The node boundary is all nodes in the edge boundary of a given - set of nodes that are in the set. - - Parameters - ----------- - G : graph - A networkx graph - - nbunch1 : list, container - Interior node set - - nbunch2 : list, container - Exterior node set. If None then it is set to all of the - nodes in G not in nbunch1. - - Returns - ------- - nlist : list - List of nodes. - - Notes - ------ - Nodes in nbunch1 and nbunch2 that are not in G are ignored. - - nbunch1 and nbunch2 are usually meant to be disjoint, - but in the interest of speed and generality, that is - not required here. - - """ - nset1=set(n for n in nbunch1 if n in G) - bdy=set() - for n1 in nset1: - bdy.update(G[n1]) - bdy -= nset1 - if nbunch2 is not None: # else nbunch2 is complement of nbunch1 - bdy &= set(nbunch2) - return list(bdy) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/__init__.py deleted file mode 100644 index d60154b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from networkx.algorithms.centrality.betweenness import * -from networkx.algorithms.centrality.betweenness_subset import * -from networkx.algorithms.centrality.closeness import * -from networkx.algorithms.centrality.current_flow_closeness import * -from networkx.algorithms.centrality.current_flow_betweenness import * -from networkx.algorithms.centrality.current_flow_betweenness_subset import * -from networkx.algorithms.centrality.degree_alg import * -from networkx.algorithms.centrality.eigenvector import * -from networkx.algorithms.centrality.katz import * -from networkx.algorithms.centrality.load import * -from networkx.algorithms.centrality.communicability_alg import * -import networkx.algorithms.centrality.betweenness -import networkx.algorithms.centrality.closeness -import networkx.algorithms.centrality.current_flow_betweenness -import networkx.algorithms.centrality.current_flow_closeness -import networkx.algorithms.centrality.degree_alg -import networkx.algorithms.centrality.eigenvector -import networkx.algorithms.centrality.load -import networkx.algorithms.centrality.communicability_alg -import networkx.algorithms.centrality.katz diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness.py deleted file mode 100644 index af2cf6a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness.py +++ /dev/null @@ -1,334 +0,0 @@ -""" -Betweenness centrality measures. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import heapq -import networkx as nx -import random -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" - -__all__ = ['betweenness_centrality', - 'edge_betweenness_centrality', - 'edge_betweenness'] - -def betweenness_centrality(G, k=None, normalized=True, weight=None, - endpoints=False, - seed=None): - r"""Compute the shortest-path betweenness centrality for nodes. - - Betweenness centrality of a node `v` is the sum of the - fraction of all-pairs shortest paths that pass through `v`: - - .. math:: - - c_B(v) =\sum_{s,t \in V} \frac{\sigma(s, t|v)}{\sigma(s, t)} - - where `V` is the set of nodes, `\sigma(s, t)` is the number of - shortest `(s, t)`-paths, and `\sigma(s, t|v)` is the number of those - paths passing through some node `v` other than `s, t`. - If `s = t`, `\sigma(s, t) = 1`, and if `v \in {s, t}`, - `\sigma(s, t|v) = 0` [2]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - k : int, optional (default=None) - If k is not None use k node samples to estimate betweenness. - The value of k <= n where n is the number of nodes in the graph. - Higher values give better approximation. - - normalized : bool, optional - If True the betweenness values are normalized by `2/((n-1)(n-2))` - for graphs, and `1/((n-1)(n-2))` for directed graphs where `n` - is the number of nodes in G. - - weight : None or string, optional - If None, all edge weights are considered equal. - Otherwise holds the name of the edge attribute used as weight. - - endpoints : bool, optional - If True include the endpoints in the shortest path counts. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with betweenness centrality as the value. - - See Also - -------- - edge_betweenness_centrality - load_centrality - - Notes - ----- - The algorithm is from Ulrik Brandes [1]_. - See [2]_ for details on algorithms for variations and related metrics. - - For approximate betweenness calculations set k=#samples to use - k nodes ("pivots") to estimate the betweenness values. For an estimate - of the number of pivots needed see [3]_. - - For weighted graphs the edge weights must be greater than zero. - Zero edge weights can produce an infinite number of equal length - paths between pairs of nodes. - - References - ---------- - .. [1] A Faster Algorithm for Betweenness Centrality. - Ulrik Brandes, - Journal of Mathematical Sociology 25(2):163-177, 2001. - http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf - .. [2] Ulrik Brandes: On Variants of Shortest-Path Betweenness - Centrality and their Generic Computation. - Social Networks 30(2):136-145, 2008. - http://www.inf.uni-konstanz.de/algo/publications/b-vspbc-08.pdf - .. [3] Ulrik Brandes and Christian Pich: - Centrality Estimation in Large Networks. - International Journal of Bifurcation and Chaos 17(7):2303-2318, 2007. - http://www.inf.uni-konstanz.de/algo/publications/bp-celn-06.pdf - """ - betweenness=dict.fromkeys(G,0.0) # b[v]=0 for v in G - if k is None: - nodes = G - else: - random.seed(seed) - nodes = random.sample(G.nodes(), k) - for s in nodes: - # single source shortest paths - if weight is None: # use BFS - S,P,sigma=_single_source_shortest_path_basic(G,s) - else: # use Dijkstra's algorithm - S,P,sigma=_single_source_dijkstra_path_basic(G,s,weight) - # accumulation - if endpoints: - betweenness=_accumulate_endpoints(betweenness,S,P,sigma,s) - else: - betweenness=_accumulate_basic(betweenness,S,P,sigma,s) - # rescaling - betweenness=_rescale(betweenness, len(G), - normalized=normalized, - directed=G.is_directed(), - k=k) - return betweenness - - -def edge_betweenness_centrality(G,normalized=True,weight=None): - r"""Compute betweenness centrality for edges. - - Betweenness centrality of an edge `e` is the sum of the - fraction of all-pairs shortest paths that pass through `e`: - - .. math:: - - c_B(v) =\sum_{s,t \in V} \frac{\sigma(s, t|e)}{\sigma(s, t)} - - where `V` is the set of nodes,`\sigma(s, t)` is the number of - shortest `(s, t)`-paths, and `\sigma(s, t|e)` is the number of - those paths passing through edge `e` [2]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - normalized : bool, optional - If True the betweenness values are normalized by `2/(n(n-1))` - for graphs, and `1/(n(n-1))` for directed graphs where `n` - is the number of nodes in G. - - weight : None or string, optional - If None, all edge weights are considered equal. - Otherwise holds the name of the edge attribute used as weight. - - Returns - ------- - edges : dictionary - Dictionary of edges with betweenness centrality as the value. - - See Also - -------- - betweenness_centrality - edge_load - - Notes - ----- - The algorithm is from Ulrik Brandes [1]_. - - For weighted graphs the edge weights must be greater than zero. - Zero edge weights can produce an infinite number of equal length - paths between pairs of nodes. - - References - ---------- - .. [1] A Faster Algorithm for Betweenness Centrality. Ulrik Brandes, - Journal of Mathematical Sociology 25(2):163-177, 2001. - http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf - .. [2] Ulrik Brandes: On Variants of Shortest-Path Betweenness - Centrality and their Generic Computation. - Social Networks 30(2):136-145, 2008. - http://www.inf.uni-konstanz.de/algo/publications/b-vspbc-08.pdf - """ - betweenness=dict.fromkeys(G,0.0) # b[v]=0 for v in G - # b[e]=0 for e in G.edges() - betweenness.update(dict.fromkeys(G.edges(),0.0)) - for s in G: - # single source shortest paths - if weight is None: # use BFS - S,P,sigma=_single_source_shortest_path_basic(G,s) - else: # use Dijkstra's algorithm - S,P,sigma=_single_source_dijkstra_path_basic(G,s,weight) - # accumulation - betweenness=_accumulate_edges(betweenness,S,P,sigma,s) - # rescaling - for n in G: # remove nodes to only return edges - del betweenness[n] - betweenness=_rescale_e(betweenness, len(G), - normalized=normalized, - directed=G.is_directed()) - return betweenness - -# obsolete name -def edge_betweenness(G,normalized=True,weight=None): - return edge_betweenness_centrality(G,normalized,weight) - - -# helpers for betweenness centrality - -def _single_source_shortest_path_basic(G,s): - S=[] - P={} - for v in G: - P[v]=[] - sigma=dict.fromkeys(G,0.0) # sigma[v]=0 for v in G - D={} - sigma[s]=1.0 - D[s]=0 - Q=[s] - while Q: # use BFS to find shortest paths - v=Q.pop(0) - S.append(v) - Dv=D[v] - sigmav=sigma[v] - for w in G[v]: - if w not in D: - Q.append(w) - D[w]=Dv+1 - if D[w]==Dv+1: # this is a shortest path, count paths - sigma[w] += sigmav - P[w].append(v) # predecessors - return S,P,sigma - - - -def _single_source_dijkstra_path_basic(G,s,weight='weight'): - # modified from Eppstein - S=[] - P={} - for v in G: - P[v]=[] - sigma=dict.fromkeys(G,0.0) # sigma[v]=0 for v in G - D={} - sigma[s]=1.0 - push=heapq.heappush - pop=heapq.heappop - seen = {s:0} - Q=[] # use Q as heap with (distance,node id) tuples - push(Q,(0,s,s)) - while Q: - (dist,pred,v)=pop(Q) - if v in D: - continue # already searched this node. - sigma[v] += sigma[pred] # count paths - S.append(v) - D[v] = dist - for w,edgedata in G[v].items(): - vw_dist = dist + edgedata.get(weight,1) - if w not in D and (w not in seen or vw_dist < seen[w]): - seen[w] = vw_dist - push(Q,(vw_dist,v,w)) - sigma[w]=0.0 - P[w]=[v] - elif vw_dist==seen[w]: # handle equal paths - sigma[w] += sigma[v] - P[w].append(v) - return S,P,sigma - -def _accumulate_basic(betweenness,S,P,sigma,s): - delta=dict.fromkeys(S,0) - while S: - w=S.pop() - coeff=(1.0+delta[w])/sigma[w] - for v in P[w]: - delta[v] += sigma[v]*coeff - if w != s: - betweenness[w]+=delta[w] - return betweenness - -def _accumulate_endpoints(betweenness,S,P,sigma,s): - betweenness[s]+=len(S)-1 - delta=dict.fromkeys(S,0) - while S: - w=S.pop() - coeff=(1.0+delta[w])/sigma[w] - for v in P[w]: - delta[v] += sigma[v]*coeff - if w != s: - betweenness[w] += delta[w]+1 - return betweenness - -def _accumulate_edges(betweenness,S,P,sigma,s): - delta=dict.fromkeys(S,0) - while S: - w=S.pop() - coeff=(1.0+delta[w])/sigma[w] - for v in P[w]: - c=sigma[v]*coeff - if (v,w) not in betweenness: - betweenness[(w,v)]+=c - else: - betweenness[(v,w)]+=c - delta[v]+=c - if w != s: - betweenness[w]+=delta[w] - return betweenness - -def _rescale(betweenness,n,normalized,directed=False,k=None): - if normalized is True: - if n <=2: - scale=None # no normalization b=0 for all nodes - else: - scale=1.0/((n-1)*(n-2)) - else: # rescale by 2 for undirected graphs - if not directed: - scale=1.0/2.0 - else: - scale=None - if scale is not None: - if k is not None: - scale=scale*n/k - for v in betweenness: - betweenness[v] *= scale - return betweenness - -def _rescale_e(betweenness,n,normalized,directed=False): - if normalized is True: - if n <=1: - scale=None # no normalization b=0 for all nodes - else: - scale=1.0/(n*(n-1)) - else: # rescale by 2 for undirected graphs - if not directed: - scale=1.0/2.0 - else: - scale=None - if scale is not None: - for v in betweenness: - betweenness[v] *= scale - return betweenness diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py deleted file mode 100644 index cd4f8a2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py +++ /dev/null @@ -1,263 +0,0 @@ -""" -Betweenness centrality measures for subsets of nodes. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" - -__all__ = ['betweenness_centrality_subset', - 'edge_betweenness_centrality_subset', - 'betweenness_centrality_source'] - -import networkx as nx - -from networkx.algorithms.centrality.betweenness import\ - _single_source_dijkstra_path_basic as dijkstra -from networkx.algorithms.centrality.betweenness import\ - _single_source_shortest_path_basic as shortest_path - - -def betweenness_centrality_subset(G,sources,targets, - normalized=False, - weight=None): - """Compute betweenness centrality for a subset of nodes. - - .. math:: - - c_B(v) =\sum_{s\in S, t \in T} \frac{\sigma(s, t|v)}{\sigma(s, t)} - - where `S` is the set of sources, `T` is the set of targets, - `\sigma(s, t)` is the number of shortest `(s, t)`-paths, - and `\sigma(s, t|v)` is the number of those paths - passing through some node `v` other than `s, t`. - If `s = t`, `\sigma(s, t) = 1`, - and if `v \in {s, t}`, `\sigma(s, t|v) = 0` [2]_. - - - Parameters - ---------- - G : graph - - sources: list of nodes - Nodes to use as sources for shortest paths in betweenness - - targets: list of nodes - Nodes to use as targets for shortest paths in betweenness - - normalized : bool, optional - If True the betweenness values are normalized by `2/((n-1)(n-2))` - for graphs, and `1/((n-1)(n-2))` for directed graphs where `n` - is the number of nodes in G. - - weight : None or string, optional - If None, all edge weights are considered equal. - Otherwise holds the name of the edge attribute used as weight. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with betweenness centrality as the value. - - See Also - -------- - edge_betweenness_centrality - load_centrality - - Notes - ----- - The basic algorithm is from [1]_. - - For weighted graphs the edge weights must be greater than zero. - Zero edge weights can produce an infinite number of equal length - paths between pairs of nodes. - - The normalization might seem a little strange but it is the same - as in betweenness_centrality() and is designed to make - betweenness_centrality(G) be the same as - betweenness_centrality_subset(G,sources=G.nodes(),targets=G.nodes()). - - - References - ---------- - .. [1] Ulrik Brandes, A Faster Algorithm for Betweenness Centrality. - Journal of Mathematical Sociology 25(2):163-177, 2001. - http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf - .. [2] Ulrik Brandes: On Variants of Shortest-Path Betweenness - Centrality and their Generic Computation. - Social Networks 30(2):136-145, 2008. - http://www.inf.uni-konstanz.de/algo/publications/b-vspbc-08.pdf - """ - b=dict.fromkeys(G,0.0) # b[v]=0 for v in G - for s in sources: - # single source shortest paths - if weight is None: # use BFS - S,P,sigma=shortest_path(G,s) - else: # use Dijkstra's algorithm - S,P,sigma=dijkstra(G,s,weight) - b=_accumulate_subset(b,S,P,sigma,s,targets) - b=_rescale(b,len(G),normalized=normalized,directed=G.is_directed()) - return b - - -def edge_betweenness_centrality_subset(G,sources,targets, - normalized=False, - weight=None): - """Compute betweenness centrality for edges for a subset of nodes. - - .. math:: - - c_B(v) =\sum_{s\in S,t \in T} \frac{\sigma(s, t|e)}{\sigma(s, t)} - - where `S` is the set of sources, `T` is the set of targets, - `\sigma(s, t)` is the number of shortest `(s, t)`-paths, - and `\sigma(s, t|e)` is the number of those paths - passing through edge `e` [2]_. - - Parameters - ---------- - G : graph - A networkx graph - - sources: list of nodes - Nodes to use as sources for shortest paths in betweenness - - targets: list of nodes - Nodes to use as targets for shortest paths in betweenness - - normalized : bool, optional - If True the betweenness values are normalized by `2/(n(n-1))` - for graphs, and `1/(n(n-1))` for directed graphs where `n` - is the number of nodes in G. - - weight : None or string, optional - If None, all edge weights are considered equal. - Otherwise holds the name of the edge attribute used as weight. - - Returns - ------- - edges : dictionary - Dictionary of edges with Betweenness centrality as the value. - - See Also - -------- - betweenness_centrality - edge_load - - Notes - ----- - The basic algorithm is from [1]_. - - For weighted graphs the edge weights must be greater than zero. - Zero edge weights can produce an infinite number of equal length - paths between pairs of nodes. - - The normalization might seem a little strange but it is the same - as in edge_betweenness_centrality() and is designed to make - edge_betweenness_centrality(G) be the same as - edge_betweenness_centrality_subset(G,sources=G.nodes(),targets=G.nodes()). - - References - ---------- - .. [1] Ulrik Brandes, A Faster Algorithm for Betweenness Centrality. - Journal of Mathematical Sociology 25(2):163-177, 2001. - http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf - .. [2] Ulrik Brandes: On Variants of Shortest-Path Betweenness - Centrality and their Generic Computation. - Social Networks 30(2):136-145, 2008. - http://www.inf.uni-konstanz.de/algo/publications/b-vspbc-08.pdf - - """ - - b=dict.fromkeys(G,0.0) # b[v]=0 for v in G - b.update(dict.fromkeys(G.edges(),0.0)) # b[e] for e in G.edges() - for s in sources: - # single source shortest paths - if weight is None: # use BFS - S,P,sigma=shortest_path(G,s) - else: # use Dijkstra's algorithm - S,P,sigma=dijkstra(G,s,weight) - b=_accumulate_edges_subset(b,S,P,sigma,s,targets) - for n in G: # remove nodes to only return edges - del b[n] - b=_rescale_e(b,len(G),normalized=normalized,directed=G.is_directed()) - return b - -# obsolete name -def betweenness_centrality_source(G,normalized=True,weight=None,sources=None): - if sources is None: - sources=G.nodes() - targets=G.nodes() - return betweenness_centrality_subset(G,sources,targets,normalized,weight) - - -def _accumulate_subset(betweenness,S,P,sigma,s,targets): - delta=dict.fromkeys(S,0) - target_set=set(targets) - while S: - w=S.pop() - for v in P[w]: - if w in target_set: - delta[v]+=(sigma[v]/sigma[w])*(1.0+delta[w]) - else: - delta[v]+=delta[w]/len(P[w]) - if w != s: - betweenness[w]+=delta[w] - return betweenness - -def _accumulate_edges_subset(betweenness,S,P,sigma,s,targets): - delta=dict.fromkeys(S,0) - target_set=set(targets) - while S: - w=S.pop() - for v in P[w]: - if w in target_set: - c=(sigma[v]/sigma[w])*(1.0+delta[w]) - else: - c=delta[w]/len(P[w]) - if (v,w) not in betweenness: - betweenness[(w,v)]+=c - else: - betweenness[(v,w)]+=c - delta[v]+=c - if w != s: - betweenness[w]+=delta[w] - return betweenness - - - - -def _rescale(betweenness,n,normalized,directed=False): - if normalized is True: - if n <=2: - scale=None # no normalization b=0 for all nodes - else: - scale=1.0/((n-1)*(n-2)) - else: # rescale by 2 for undirected graphs - if not directed: - scale=1.0/2.0 - else: - scale=None - if scale is not None: - for v in betweenness: - betweenness[v] *= scale - return betweenness - -def _rescale_e(betweenness,n,normalized,directed=False): - if normalized is True: - if n <=1: - scale=None # no normalization b=0 for all nodes - else: - scale=1.0/(n*(n-1)) - else: # rescale by 2 for undirected graphs - if not directed: - scale=1.0/2.0 - else: - scale=None - if scale is not None: - for v in betweenness: - betweenness[v] *= scale - return betweenness diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/closeness.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/closeness.py deleted file mode 100644 index 67d8089..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/closeness.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -Closeness centrality measures. -""" -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import functools -import networkx as nx -__author__ = "\n".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Pieter Swart (swart@lanl.gov)', - 'Sasha Gutfraind (ag362@cornell.edu)']) -__all__ = ['closeness_centrality'] - - -def closeness_centrality(G, u=None, distance=None, normalized=True): - r"""Compute closeness centrality for nodes. - - Closeness centrality [1]_ of a node `u` is the reciprocal of the - sum of the shortest path distances from `u` to all `n-1` other nodes. - Since the sum of distances depends on the number of nodes in the - graph, closeness is normalized by the sum of minimum possible - distances `n-1`. - - .. math:: - - C(u) = \frac{n - 1}{\sum_{v=1}^{n} d(v, u)}, - - where `d(v, u)` is the shortest-path distance between `v` and `u`, - and `n` is the number of nodes in the graph. - - Notice that higher values of closeness indicate higher centrality. - - Parameters - ---------- - G : graph - A NetworkX graph - u : node, optional - Return only the value for node u - distance : edge attribute key, optional (default=None) - Use the specified edge attribute as the edge distance in shortest - path calculations - normalized : bool, optional - If True (default) normalize by the number of nodes in the connected - part of the graph. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with closeness centrality as the value. - - See Also - -------- - betweenness_centrality, load_centrality, eigenvector_centrality, - degree_centrality - - Notes - ----- - The closeness centrality is normalized to `(n-1)/(|G|-1)` where - `n` is the number of nodes in the connected part of graph - containing the node. If the graph is not completely connected, - this algorithm computes the closeness centrality for each - connected part separately. - - If the 'distance' keyword is set to an edge attribute key then the - shortest-path length will be computed using Dijkstra's algorithm with - that edge attribute as the edge weight. - - References - ---------- - .. [1] Freeman, L.C., 1979. Centrality in networks: I. - Conceptual clarification. Social Networks 1, 215--239. - http://www.soc.ucsb.edu/faculty/friedkin/Syllabi/Soc146/Freeman78.PDF - """ - if distance is not None: - # use Dijkstra's algorithm with specified attribute as edge weight - path_length = functools.partial(nx.single_source_dijkstra_path_length, - weight=distance) - else: - path_length = nx.single_source_shortest_path_length - - if u is None: - nodes = G.nodes() - else: - nodes = [u] - closeness_centrality = {} - for n in nodes: - sp = path_length(G,n) - totsp = sum(sp.values()) - if totsp > 0.0 and len(G) > 1: - closeness_centrality[n] = (len(sp)-1.0) / totsp - # normalize to number of nodes-1 in connected part - if normalized: - s = (len(sp)-1.0) / ( len(G) - 1 ) - closeness_centrality[n] *= s - else: - closeness_centrality[n] = 0.0 - if u is not None: - return closeness_centrality[u] - else: - return closeness_centrality diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/communicability_alg.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/communicability_alg.py deleted file mode 100644 index 3c8fc6b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/communicability_alg.py +++ /dev/null @@ -1,495 +0,0 @@ -""" -Communicability and centrality measures. -""" -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import * -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Franck Kalala (franckkalala@yahoo.fr']) -__all__ = ['communicability_centrality_exp', - 'communicability_centrality', - 'communicability_betweenness_centrality', - 'communicability', - 'communicability_exp', - 'estrada_index', - ] - -@require('scipy') -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def communicability_centrality_exp(G): - r"""Return the communicability centrality for each node of G - - Communicability centrality, also called subgraph centrality, of a node `n` - is the sum of closed walks of all lengths starting and ending at node `n`. - - Parameters - ---------- - G: graph - - Returns - ------- - nodes:dictionary - Dictionary of nodes with communicability centrality as the value. - - Raises - ------ - NetworkXError - If the graph is not undirected and simple. - - See Also - -------- - communicability: - Communicability between all pairs of nodes in G. - communicability_centrality: - Communicability centrality for each node of G. - - Notes - ----- - This version of the algorithm exponentiates the adjacency matrix. - The communicability centrality of a node `u` in G can be found using - the matrix exponential of the adjacency matrix of G [1]_ [2]_, - - .. math:: - - SC(u)=(e^A)_{uu} . - - References - ---------- - .. [1] Ernesto Estrada, Juan A. Rodriguez-Velazquez, - "Subgraph centrality in complex networks", - Physical Review E 71, 056103 (2005). - http://arxiv.org/abs/cond-mat/0504730 - - .. [2] Ernesto Estrada, Naomichi Hatano, - "Communicability in complex networks", - Phys. Rev. E 77, 036111 (2008). - http://arxiv.org/abs/0707.0756 - - Examples - -------- - >>> G = nx.Graph([(0,1),(1,2),(1,5),(5,4),(2,4),(2,3),(4,3),(3,6)]) - >>> sc = nx.communicability_centrality_exp(G) - """ - # alternative implementation that calculates the matrix exponential - import scipy.linalg - nodelist = G.nodes() # ordering of nodes in matrix - A = nx.to_numpy_matrix(G,nodelist) - # convert to 0-1 matrix - A[A!=0.0] = 1 - expA = scipy.linalg.expm(A) - # convert diagonal to dictionary keyed by node - sc = dict(zip(nodelist,map(float,expA.diagonal()))) - return sc - -@require('numpy') -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def communicability_centrality(G): - r"""Return communicability centrality for each node in G. - - Communicability centrality, also called subgraph centrality, of a node `n` - is the sum of closed walks of all lengths starting and ending at node `n`. - - Parameters - ---------- - G: graph - - Returns - ------- - nodes: dictionary - Dictionary of nodes with communicability centrality as the value. - - Raises - ------ - NetworkXError - If the graph is not undirected and simple. - - See Also - -------- - communicability: - Communicability between all pairs of nodes in G. - communicability_centrality: - Communicability centrality for each node of G. - - Notes - ----- - This version of the algorithm computes eigenvalues and eigenvectors - of the adjacency matrix. - - Communicability centrality of a node `u` in G can be found using - a spectral decomposition of the adjacency matrix [1]_ [2]_, - - .. math:: - - SC(u)=\sum_{j=1}^{N}(v_{j}^{u})^2 e^{\lambda_{j}}, - - where `v_j` is an eigenvector of the adjacency matrix `A` of G - corresponding corresponding to the eigenvalue `\lambda_j`. - - Examples - -------- - >>> G = nx.Graph([(0,1),(1,2),(1,5),(5,4),(2,4),(2,3),(4,3),(3,6)]) - >>> sc = nx.communicability_centrality(G) - - References - ---------- - .. [1] Ernesto Estrada, Juan A. Rodriguez-Velazquez, - "Subgraph centrality in complex networks", - Physical Review E 71, 056103 (2005). - http://arxiv.org/abs/cond-mat/0504730 - .. [2] Ernesto Estrada, Naomichi Hatano, - "Communicability in complex networks", - Phys. Rev. E 77, 036111 (2008). - http://arxiv.org/abs/0707.0756 - """ - import numpy - import numpy.linalg - nodelist = G.nodes() # ordering of nodes in matrix - A = nx.to_numpy_matrix(G,nodelist) - # convert to 0-1 matrix - A[A!=0.0] = 1 - w,v = numpy.linalg.eigh(A) - vsquare = numpy.array(v)**2 - expw = numpy.exp(w) - xg = numpy.dot(vsquare,expw) - # convert vector dictionary keyed by node - sc = dict(zip(nodelist,map(float,xg))) - return sc - -@require('scipy') -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def communicability_betweenness_centrality(G, normalized=True): - r"""Return communicability betweenness for all pairs of nodes in G. - - Communicability betweenness measure makes use of the number of walks - connecting every pair of nodes as the basis of a betweenness centrality - measure. - - Parameters - ---------- - G: graph - - Returns - ------- - nodes:dictionary - Dictionary of nodes with communicability betweenness as the value. - - Raises - ------ - NetworkXError - If the graph is not undirected and simple. - - See Also - -------- - communicability: - Communicability between all pairs of nodes in G. - communicability_centrality: - Communicability centrality for each node of G using matrix exponential. - communicability_centrality_exp: - Communicability centrality for each node in G using - spectral decomposition. - - Notes - ----- - Let `G=(V,E)` be a simple undirected graph with `n` nodes and `m` edges, - and `A` denote the adjacency matrix of `G`. - - Let `G(r)=(V,E(r))` be the graph resulting from - removing all edges connected to node `r` but not the node itself. - - The adjacency matrix for `G(r)` is `A+E(r)`, where `E(r)` has nonzeros - only in row and column `r`. - - The communicability betweenness of a node `r` is [1]_ - - .. math:: - \omega_{r} = \frac{1}{C}\sum_{p}\sum_{q}\frac{G_{prq}}{G_{pq}}, - p\neq q, q\neq r, - - where - `G_{prq}=(e^{A}_{pq} - (e^{A+E(r)})_{pq}` is the number of walks - involving node r, - `G_{pq}=(e^{A})_{pq}` is the number of closed walks starting - at node `p` and ending at node `q`, - and `C=(n-1)^{2}-(n-1)` is a normalization factor equal to the - number of terms in the sum. - - The resulting `\omega_{r}` takes values between zero and one. - The lower bound cannot be attained for a connected - graph, and the upper bound is attained in the star graph. - - References - ---------- - .. [1] Ernesto Estrada, Desmond J. Higham, Naomichi Hatano, - "Communicability Betweenness in Complex Networks" - Physica A 388 (2009) 764-774. - http://arxiv.org/abs/0905.4102 - - Examples - -------- - >>> G = nx.Graph([(0,1),(1,2),(1,5),(5,4),(2,4),(2,3),(4,3),(3,6)]) - >>> cbc = nx.communicability_betweenness_centrality(G) - """ - import scipy - import scipy.linalg - nodelist = G.nodes() # ordering of nodes in matrix - n = len(nodelist) - A = nx.to_numpy_matrix(G,nodelist) - # convert to 0-1 matrix - A[A!=0.0] = 1 - expA = scipy.linalg.expm(A) - mapping = dict(zip(nodelist,range(n))) - sc = {} - for v in G: - # remove row and col of node v - i = mapping[v] - row = A[i,:].copy() - col = A[:,i].copy() - A[i,:] = 0 - A[:,i] = 0 - B = (expA - scipy.linalg.expm(A)) / expA - # sum with row/col of node v and diag set to zero - B[i,:] = 0 - B[:,i] = 0 - B -= scipy.diag(scipy.diag(B)) - sc[v] = float(B.sum()) - # put row and col back - A[i,:] = row - A[:,i] = col - # rescaling - sc = _rescale(sc,normalized=normalized) - return sc - -def _rescale(sc,normalized): - # helper to rescale betweenness centrality - if normalized is True: - order=len(sc) - if order <=2: - scale=None - else: - scale=1.0/((order-1.0)**2-(order-1.0)) - if scale is not None: - for v in sc: - sc[v] *= scale - return sc - - -@require('numpy','scipy') -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def communicability(G): - r"""Return communicability between all pairs of nodes in G. - - The communicability between pairs of nodes in G is the sum of - closed walks of different lengths starting at node u and ending at node v. - - Parameters - ---------- - G: graph - - Returns - ------- - comm: dictionary of dictionaries - Dictionary of dictionaries keyed by nodes with communicability - as the value. - - Raises - ------ - NetworkXError - If the graph is not undirected and simple. - - See Also - -------- - communicability_centrality_exp: - Communicability centrality for each node of G using matrix exponential. - communicability_centrality: - Communicability centrality for each node in G using spectral - decomposition. - communicability: - Communicability between pairs of nodes in G. - - Notes - ----- - This algorithm uses a spectral decomposition of the adjacency matrix. - Let G=(V,E) be a simple undirected graph. Using the connection between - the powers of the adjacency matrix and the number of walks in the graph, - the communicability between nodes `u` and `v` based on the graph spectrum - is [1]_ - - .. math:: - C(u,v)=\sum_{j=1}^{n}\phi_{j}(u)\phi_{j}(v)e^{\lambda_{j}}, - - where `\phi_{j}(u)` is the `u\rm{th}` element of the `j\rm{th}` orthonormal - eigenvector of the adjacency matrix associated with the eigenvalue - `\lambda_{j}`. - - References - ---------- - .. [1] Ernesto Estrada, Naomichi Hatano, - "Communicability in complex networks", - Phys. Rev. E 77, 036111 (2008). - http://arxiv.org/abs/0707.0756 - - Examples - -------- - >>> G = nx.Graph([(0,1),(1,2),(1,5),(5,4),(2,4),(2,3),(4,3),(3,6)]) - >>> c = nx.communicability(G) - """ - import numpy - import scipy.linalg - nodelist = G.nodes() # ordering of nodes in matrix - A = nx.to_numpy_matrix(G,nodelist) - # convert to 0-1 matrix - A[A!=0.0] = 1 - w,vec = numpy.linalg.eigh(A) - expw = numpy.exp(w) - mapping = dict(zip(nodelist,range(len(nodelist)))) - sc={} - # computing communicabilities - for u in G: - sc[u]={} - for v in G: - s = 0 - p = mapping[u] - q = mapping[v] - for j in range(len(nodelist)): - s += vec[:,j][p,0]*vec[:,j][q,0]*expw[j] - sc[u][v] = float(s) - return sc - -@require('scipy') -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def communicability_exp(G): - r"""Return communicability between all pairs of nodes in G. - - Communicability between pair of node (u,v) of node in G is the sum of - closed walks of different lengths starting at node u and ending at node v. - - Parameters - ---------- - G: graph - - Returns - ------- - comm: dictionary of dictionaries - Dictionary of dictionaries keyed by nodes with communicability - as the value. - - Raises - ------ - NetworkXError - If the graph is not undirected and simple. - - See Also - -------- - communicability_centrality_exp: - Communicability centrality for each node of G using matrix exponential. - communicability_centrality: - Communicability centrality for each node in G using spectral - decomposition. - communicability_exp: - Communicability between all pairs of nodes in G using spectral - decomposition. - - Notes - ----- - This algorithm uses matrix exponentiation of the adjacency matrix. - - Let G=(V,E) be a simple undirected graph. Using the connection between - the powers of the adjacency matrix and the number of walks in the graph, - the communicability between nodes u and v is [1]_, - - .. math:: - C(u,v) = (e^A)_{uv}, - - where `A` is the adjacency matrix of G. - - References - ---------- - .. [1] Ernesto Estrada, Naomichi Hatano, - "Communicability in complex networks", - Phys. Rev. E 77, 036111 (2008). - http://arxiv.org/abs/0707.0756 - - Examples - -------- - >>> G = nx.Graph([(0,1),(1,2),(1,5),(5,4),(2,4),(2,3),(4,3),(3,6)]) - >>> c = nx.communicability_exp(G) - """ - import scipy.linalg - nodelist = G.nodes() # ordering of nodes in matrix - A = nx.to_numpy_matrix(G,nodelist) - # convert to 0-1 matrix - A[A!=0.0] = 1 - # communicability matrix - expA = scipy.linalg.expm(A) - mapping = dict(zip(nodelist,range(len(nodelist)))) - sc = {} - for u in G: - sc[u]={} - for v in G: - sc[u][v] = float(expA[mapping[u],mapping[v]]) - return sc - -@require('numpy') -def estrada_index(G): - r"""Return the Estrada index of a the graph G. - - Parameters - ---------- - G: graph - - Returns - ------- - estrada index: float - - Raises - ------ - NetworkXError - If the graph is not undirected and simple. - - See also - -------- - estrada_index_exp - - Notes - ----- - Let `G=(V,E)` be a simple undirected graph with `n` nodes and let - `\lambda_{1}\leq\lambda_{2}\leq\cdots\lambda_{n}` - be a non-increasing ordering of the eigenvalues of its adjacency - matrix `A`. The Estrada index is - - .. math:: - EE(G)=\sum_{j=1}^n e^{\lambda _j}. - - References - ---------- - .. [1] E. Estrada, Characterization of 3D molecular structure, - Chem. Phys. Lett. 319, 713 (2000). - - Examples - -------- - >>> G=nx.Graph([(0,1),(1,2),(1,5),(5,4),(2,4),(2,3),(4,3),(3,6)]) - >>> ei=nx.estrada_index(G) - """ - return sum(communicability_centrality(G).values()) - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_betweenness.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_betweenness.py deleted file mode 100644 index 23cb5bf..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_betweenness.py +++ /dev/null @@ -1,361 +0,0 @@ -""" -Current-flow betweenness centrality measures. -""" -# Copyright (C) 2010-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import random -import networkx as nx -from networkx.algorithms.centrality.flow_matrix import * -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" - -__all__ = ['current_flow_betweenness_centrality', - 'approximate_current_flow_betweenness_centrality', - 'edge_current_flow_betweenness_centrality'] - - -def approximate_current_flow_betweenness_centrality(G, normalized=True, - weight='weight', - dtype=float, solver='full', - epsilon=0.5, kmax=10000): - r"""Compute the approximate current-flow betweenness centrality for nodes. - - Approximates the current-flow betweenness centrality within absolute - error of epsilon with high probability [1]_. - - - Parameters - ---------- - G : graph - A NetworkX graph - - normalized : bool, optional (default=True) - If True the betweenness values are normalized by 2/[(n-1)(n-2)] where - n is the number of nodes in G. - - weight : string or None, optional (default='weight') - Key for edge data used as the edge weight. - If None, then use 1 as each edge weight. - - dtype: data type (float) - Default data type for internal matrices. - Set to np.float32 for lower memory consumption. - - solver: string (default='lu') - Type of linear solver to use for computing the flow matrix. - Options are "full" (uses most memory), "lu" (recommended), and - "cg" (uses least memory). - - epsilon: float - Absolute error tolerance. - - kmax: int - Maximum number of sample node pairs to use for approximation. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with betweenness centrality as the value. - - See Also - -------- - current_flow_betweenness_centrality - - Notes - ----- - The running time is `O((1/\epsilon^2)m{\sqrt k} \log n)` - and the space required is `O(m)` for n nodes and m edges. - - If the edges have a 'weight' attribute they will be used as - weights in this algorithm. Unspecified weights are set to 1. - - References - ---------- - .. [1] Centrality Measures Based on Current Flow. - Ulrik Brandes and Daniel Fleischer, - Proc. 22nd Symp. Theoretical Aspects of Computer Science (STACS '05). - LNCS 3404, pp. 533-544. Springer-Verlag, 2005. - http://www.inf.uni-konstanz.de/algo/publications/bf-cmbcf-05.pdf - """ - from networkx.utils import reverse_cuthill_mckee_ordering - try: - import numpy as np - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires NumPy ', - 'http://scipy.org/') - try: - from scipy import sparse - from scipy.sparse import linalg - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires SciPy ', - 'http://scipy.org/') - if G.is_directed(): - raise nx.NetworkXError('current_flow_betweenness_centrality() ', - 'not defined for digraphs.') - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected.") - solvername={"full" :FullInverseLaplacian, - "lu": SuperLUInverseLaplacian, - "cg": CGInverseLaplacian} - n = G.number_of_nodes() - ordering = list(reverse_cuthill_mckee_ordering(G)) - # make a copy with integer labels according to rcm ordering - # this could be done without a copy if we really wanted to - H = nx.relabel_nodes(G,dict(zip(ordering,range(n)))) - L = laplacian_sparse_matrix(H, nodelist=range(n), weight=weight, - dtype=dtype, format='csc') - C = solvername[solver](L, dtype=dtype) # initialize solver - betweenness = dict.fromkeys(H,0.0) - nb = (n-1.0)*(n-2.0) # normalization factor - cstar = n*(n-1)/nb - l = 1 # parameter in approximation, adjustable - k = l*int(np.ceil((cstar/epsilon)**2*np.log(n))) - if k > kmax: - raise nx.NetworkXError('Number random pairs k>kmax (%d>%d) '%(k,kmax), - 'Increase kmax or epsilon') - cstar2k = cstar/(2*k) - for i in range(k): - s,t = random.sample(range(n),2) - b = np.zeros(n, dtype=dtype) - b[s] = 1 - b[t] = -1 - p = C.solve(b) - for v in H: - if v==s or v==t: - continue - for nbr in H[v]: - w = H[v][nbr].get(weight,1.0) - betweenness[v] += w*np.abs(p[v]-p[nbr])*cstar2k - if normalized: - factor = 1.0 - else: - factor = nb/2.0 - # remap to original node names and "unnormalize" if required - return dict((ordering[k],float(v*factor)) for k,v in betweenness.items()) - - -def current_flow_betweenness_centrality(G, normalized=True, weight='weight', - dtype=float, solver='full'): - r"""Compute current-flow betweenness centrality for nodes. - - Current-flow betweenness centrality uses an electrical current - model for information spreading in contrast to betweenness - centrality which uses shortest paths. - - Current-flow betweenness centrality is also known as - random-walk betweenness centrality [2]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - normalized : bool, optional (default=True) - If True the betweenness values are normalized by 2/[(n-1)(n-2)] where - n is the number of nodes in G. - - weight : string or None, optional (default='weight') - Key for edge data used as the edge weight. - If None, then use 1 as each edge weight. - - dtype: data type (float) - Default data type for internal matrices. - Set to np.float32 for lower memory consumption. - - solver: string (default='lu') - Type of linear solver to use for computing the flow matrix. - Options are "full" (uses most memory), "lu" (recommended), and - "cg" (uses least memory). - - Returns - ------- - nodes : dictionary - Dictionary of nodes with betweenness centrality as the value. - - See Also - -------- - approximate_current_flow_betweenness_centrality - betweenness_centrality - edge_betweenness_centrality - edge_current_flow_betweenness_centrality - - Notes - ----- - Current-flow betweenness can be computed in `O(I(n-1)+mn \log n)` - time [1]_, where `I(n-1)` is the time needed to compute the - inverse Laplacian. For a full matrix this is `O(n^3)` but using - sparse methods you can achieve `O(nm{\sqrt k})` where `k` is the - Laplacian matrix condition number. - - The space required is `O(nw) where `w` is the width of the sparse - Laplacian matrix. Worse case is `w=n` for `O(n^2)`. - - If the edges have a 'weight' attribute they will be used as - weights in this algorithm. Unspecified weights are set to 1. - - References - ---------- - .. [1] Centrality Measures Based on Current Flow. - Ulrik Brandes and Daniel Fleischer, - Proc. 22nd Symp. Theoretical Aspects of Computer Science (STACS '05). - LNCS 3404, pp. 533-544. Springer-Verlag, 2005. - http://www.inf.uni-konstanz.de/algo/publications/bf-cmbcf-05.pdf - - .. [2] A measure of betweenness centrality based on random walks, - M. E. J. Newman, Social Networks 27, 39-54 (2005). - """ - from networkx.utils import reverse_cuthill_mckee_ordering - try: - import numpy as np - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires NumPy ', - 'http://scipy.org/') - try: - import scipy - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires SciPy ', - 'http://scipy.org/') - if G.is_directed(): - raise nx.NetworkXError('current_flow_betweenness_centrality() ', - 'not defined for digraphs.') - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected.") - n = G.number_of_nodes() - ordering = list(reverse_cuthill_mckee_ordering(G)) - # make a copy with integer labels according to rcm ordering - # this could be done without a copy if we really wanted to - H = nx.relabel_nodes(G,dict(zip(ordering,range(n)))) - betweenness = dict.fromkeys(H,0.0) # b[v]=0 for v in H - for row,(s,t) in flow_matrix_row(H, weight=weight, dtype=dtype, - solver=solver): - pos = dict(zip(row.argsort()[::-1],range(n))) - for i in range(n): - betweenness[s] += (i-pos[i])*row[i] - betweenness[t] += (n-i-1-pos[i])*row[i] - if normalized: - nb = (n-1.0)*(n-2.0) # normalization factor - else: - nb = 2.0 - for i,v in enumerate(H): # map integers to nodes - betweenness[v] = float((betweenness[v]-i)*2.0/nb) - return dict((ordering[k],v) for k,v in betweenness.items()) - - -def edge_current_flow_betweenness_centrality(G, normalized=True, - weight='weight', - dtype=float, solver='full'): - """Compute current-flow betweenness centrality for edges. - - Current-flow betweenness centrality uses an electrical current - model for information spreading in contrast to betweenness - centrality which uses shortest paths. - - Current-flow betweenness centrality is also known as - random-walk betweenness centrality [2]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - normalized : bool, optional (default=True) - If True the betweenness values are normalized by 2/[(n-1)(n-2)] where - n is the number of nodes in G. - - weight : string or None, optional (default='weight') - Key for edge data used as the edge weight. - If None, then use 1 as each edge weight. - - dtype: data type (float) - Default data type for internal matrices. - Set to np.float32 for lower memory consumption. - - solver: string (default='lu') - Type of linear solver to use for computing the flow matrix. - Options are "full" (uses most memory), "lu" (recommended), and - "cg" (uses least memory). - - Returns - ------- - nodes : dictionary - Dictionary of edge tuples with betweenness centrality as the value. - - See Also - -------- - betweenness_centrality - edge_betweenness_centrality - current_flow_betweenness_centrality - - Notes - ----- - Current-flow betweenness can be computed in `O(I(n-1)+mn \log n)` - time [1]_, where `I(n-1)` is the time needed to compute the - inverse Laplacian. For a full matrix this is `O(n^3)` but using - sparse methods you can achieve `O(nm{\sqrt k})` where `k` is the - Laplacian matrix condition number. - - The space required is `O(nw) where `w` is the width of the sparse - Laplacian matrix. Worse case is `w=n` for `O(n^2)`. - - If the edges have a 'weight' attribute they will be used as - weights in this algorithm. Unspecified weights are set to 1. - - References - ---------- - .. [1] Centrality Measures Based on Current Flow. - Ulrik Brandes and Daniel Fleischer, - Proc. 22nd Symp. Theoretical Aspects of Computer Science (STACS '05). - LNCS 3404, pp. 533-544. Springer-Verlag, 2005. - http://www.inf.uni-konstanz.de/algo/publications/bf-cmbcf-05.pdf - - .. [2] A measure of betweenness centrality based on random walks, - M. E. J. Newman, Social Networks 27, 39-54 (2005). - """ - from networkx.utils import reverse_cuthill_mckee_ordering - try: - import numpy as np - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires NumPy ', - 'http://scipy.org/') - try: - import scipy - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires SciPy ', - 'http://scipy.org/') - if G.is_directed(): - raise nx.NetworkXError('edge_current_flow_betweenness_centrality ', - 'not defined for digraphs.') - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected.") - n = G.number_of_nodes() - ordering = list(reverse_cuthill_mckee_ordering(G)) - # make a copy with integer labels according to rcm ordering - # this could be done without a copy if we really wanted to - H = nx.relabel_nodes(G,dict(zip(ordering,range(n)))) - betweenness=(dict.fromkeys(H.edges(),0.0)) - if normalized: - nb=(n-1.0)*(n-2.0) # normalization factor - else: - nb=2.0 - for row,(e) in flow_matrix_row(H, weight=weight, dtype=dtype, - solver=solver): - pos=dict(zip(row.argsort()[::-1],range(1,n+1))) - for i in range(n): - betweenness[e]+=(i+1-pos[i])*row[i] - betweenness[e]+=(n-i-pos[i])*row[i] - betweenness[e]/=nb - return dict(((ordering[s],ordering[t]),float(v)) - for (s,t),v in betweenness.items()) - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - import scipy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_betweenness_subset.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_betweenness_subset.py deleted file mode 100644 index 7902f30..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_betweenness_subset.py +++ /dev/null @@ -1,263 +0,0 @@ -""" -Current-flow betweenness centrality measures for subsets of nodes. -""" -# Copyright (C) 2010-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" - -__all__ = ['current_flow_betweenness_centrality_subset', - 'edge_current_flow_betweenness_centrality_subset'] - -import itertools -import networkx as nx -from networkx.algorithms.centrality.flow_matrix import * - - -def current_flow_betweenness_centrality_subset(G,sources,targets, - normalized=True, - weight='weight', - dtype=float, solver='lu'): - r"""Compute current-flow betweenness centrality for subsets of nodes. - - Current-flow betweenness centrality uses an electrical current - model for information spreading in contrast to betweenness - centrality which uses shortest paths. - - Current-flow betweenness centrality is also known as - random-walk betweenness centrality [2]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - sources: list of nodes - Nodes to use as sources for current - - targets: list of nodes - Nodes to use as sinks for current - - normalized : bool, optional (default=True) - If True the betweenness values are normalized by b=b/(n-1)(n-2) where - n is the number of nodes in G. - - weight : string or None, optional (default='weight') - Key for edge data used as the edge weight. - If None, then use 1 as each edge weight. - - dtype: data type (float) - Default data type for internal matrices. - Set to np.float32 for lower memory consumption. - - solver: string (default='lu') - Type of linear solver to use for computing the flow matrix. - Options are "full" (uses most memory), "lu" (recommended), and - "cg" (uses least memory). - - Returns - ------- - nodes : dictionary - Dictionary of nodes with betweenness centrality as the value. - - See Also - -------- - approximate_current_flow_betweenness_centrality - betweenness_centrality - edge_betweenness_centrality - edge_current_flow_betweenness_centrality - - Notes - ----- - Current-flow betweenness can be computed in `O(I(n-1)+mn \log n)` - time [1]_, where `I(n-1)` is the time needed to compute the - inverse Laplacian. For a full matrix this is `O(n^3)` but using - sparse methods you can achieve `O(nm{\sqrt k})` where `k` is the - Laplacian matrix condition number. - - The space required is `O(nw) where `w` is the width of the sparse - Laplacian matrix. Worse case is `w=n` for `O(n^2)`. - - If the edges have a 'weight' attribute they will be used as - weights in this algorithm. Unspecified weights are set to 1. - - References - ---------- - .. [1] Centrality Measures Based on Current Flow. - Ulrik Brandes and Daniel Fleischer, - Proc. 22nd Symp. Theoretical Aspects of Computer Science (STACS '05). - LNCS 3404, pp. 533-544. Springer-Verlag, 2005. - http://www.inf.uni-konstanz.de/algo/publications/bf-cmbcf-05.pdf - - .. [2] A measure of betweenness centrality based on random walks, - M. E. J. Newman, Social Networks 27, 39-54 (2005). - """ - from networkx.utils import reverse_cuthill_mckee_ordering - try: - import numpy as np - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires NumPy ', - 'http://scipy.org/') - try: - import scipy - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires SciPy ', - 'http://scipy.org/') - if G.is_directed(): - raise nx.NetworkXError('current_flow_betweenness_centrality() ', - 'not defined for digraphs.') - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected.") - n = G.number_of_nodes() - ordering = list(reverse_cuthill_mckee_ordering(G)) - # make a copy with integer labels according to rcm ordering - # this could be done without a copy if we really wanted to - mapping=dict(zip(ordering,range(n))) - H = nx.relabel_nodes(G,mapping) - betweenness = dict.fromkeys(H,0.0) # b[v]=0 for v in H - for row,(s,t) in flow_matrix_row(H, weight=weight, dtype=dtype, - solver=solver): - for ss in sources: - i=mapping[ss] - for tt in targets: - j=mapping[tt] - betweenness[s]+=0.5*np.abs(row[i]-row[j]) - betweenness[t]+=0.5*np.abs(row[i]-row[j]) - if normalized: - nb=(n-1.0)*(n-2.0) # normalization factor - else: - nb=2.0 - for v in H: - betweenness[v]=betweenness[v]/nb+1.0/(2-n) - return dict((ordering[k],v) for k,v in betweenness.items()) - - -def edge_current_flow_betweenness_centrality_subset(G, sources, targets, - normalized=True, - weight='weight', - dtype=float, solver='lu'): - """Compute current-flow betweenness centrality for edges using subsets - of nodes. - - Current-flow betweenness centrality uses an electrical current - model for information spreading in contrast to betweenness - centrality which uses shortest paths. - - Current-flow betweenness centrality is also known as - random-walk betweenness centrality [2]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - sources: list of nodes - Nodes to use as sources for current - - targets: list of nodes - Nodes to use as sinks for current - - normalized : bool, optional (default=True) - If True the betweenness values are normalized by b=b/(n-1)(n-2) where - n is the number of nodes in G. - - weight : string or None, optional (default='weight') - Key for edge data used as the edge weight. - If None, then use 1 as each edge weight. - - dtype: data type (float) - Default data type for internal matrices. - Set to np.float32 for lower memory consumption. - - solver: string (default='lu') - Type of linear solver to use for computing the flow matrix. - Options are "full" (uses most memory), "lu" (recommended), and - "cg" (uses least memory). - - Returns - ------- - nodes : dictionary - Dictionary of edge tuples with betweenness centrality as the value. - - See Also - -------- - betweenness_centrality - edge_betweenness_centrality - current_flow_betweenness_centrality - - Notes - ----- - Current-flow betweenness can be computed in `O(I(n-1)+mn \log n)` - time [1]_, where `I(n-1)` is the time needed to compute the - inverse Laplacian. For a full matrix this is `O(n^3)` but using - sparse methods you can achieve `O(nm{\sqrt k})` where `k` is the - Laplacian matrix condition number. - - The space required is `O(nw) where `w` is the width of the sparse - Laplacian matrix. Worse case is `w=n` for `O(n^2)`. - - If the edges have a 'weight' attribute they will be used as - weights in this algorithm. Unspecified weights are set to 1. - - References - ---------- - .. [1] Centrality Measures Based on Current Flow. - Ulrik Brandes and Daniel Fleischer, - Proc. 22nd Symp. Theoretical Aspects of Computer Science (STACS '05). - LNCS 3404, pp. 533-544. Springer-Verlag, 2005. - http://www.inf.uni-konstanz.de/algo/publications/bf-cmbcf-05.pdf - - .. [2] A measure of betweenness centrality based on random walks, - M. E. J. Newman, Social Networks 27, 39-54 (2005). - """ - from networkx.utils import reverse_cuthill_mckee_ordering - try: - import numpy as np - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires NumPy ', - 'http://scipy.org/') - try: - import scipy - except ImportError: - raise ImportError('current_flow_betweenness_centrality requires SciPy ', - 'http://scipy.org/') - if G.is_directed(): - raise nx.NetworkXError('edge_current_flow_betweenness_centrality ', - 'not defined for digraphs.') - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected.") - n = G.number_of_nodes() - ordering = list(reverse_cuthill_mckee_ordering(G)) - # make a copy with integer labels according to rcm ordering - # this could be done without a copy if we really wanted to - mapping=dict(zip(ordering,range(n))) - H = nx.relabel_nodes(G,mapping) - betweenness=(dict.fromkeys(H.edges(),0.0)) - if normalized: - nb=(n-1.0)*(n-2.0) # normalization factor - else: - nb=2.0 - for row,(e) in flow_matrix_row(H, weight=weight, dtype=dtype, - solver=solver): - for ss in sources: - i=mapping[ss] - for tt in targets: - j=mapping[tt] - betweenness[e]+=0.5*np.abs(row[i]-row[j]) - betweenness[e]/=nb - return dict(((ordering[s],ordering[t]),v) - for (s,t),v in betweenness.items()) - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - import scipy - except: - raise SkipTest("NumPy not available") - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_closeness.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_closeness.py deleted file mode 100644 index 1a484b2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/current_flow_closeness.py +++ /dev/null @@ -1,127 +0,0 @@ -""" -Current-flow closeness centrality measures. - -""" -# Copyright (C) 2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """Aric Hagberg <aric.hagberg@gmail.com>""" - -__all__ = ['current_flow_closeness_centrality','information_centrality'] - -import networkx as nx -from networkx.algorithms.centrality.flow_matrix import * - - -def current_flow_closeness_centrality(G, normalized=True, weight='weight', - dtype=float, solver='lu'): - """Compute current-flow closeness centrality for nodes. - - A variant of closeness centrality based on effective - resistance between nodes in a network. This metric - is also known as information centrality. - - Parameters - ---------- - G : graph - A NetworkX graph - - normalized : bool, optional - If True the values are normalized by 1/(n-1) where n is the - number of nodes in G. - - dtype: data type (float) - Default data type for internal matrices. - Set to np.float32 for lower memory consumption. - - solver: string (default='lu') - Type of linear solver to use for computing the flow matrix. - Options are "full" (uses most memory), "lu" (recommended), and - "cg" (uses least memory). - - Returns - ------- - nodes : dictionary - Dictionary of nodes with current flow closeness centrality as the value. - - See Also - -------- - closeness_centrality - - Notes - ----- - The algorithm is from Brandes [1]_. - - See also [2]_ for the original definition of information centrality. - - References - ---------- - .. [1] Ulrik Brandes and Daniel Fleischer, - Centrality Measures Based on Current Flow. - Proc. 22nd Symp. Theoretical Aspects of Computer Science (STACS '05). - LNCS 3404, pp. 533-544. Springer-Verlag, 2005. - http://www.inf.uni-konstanz.de/algo/publications/bf-cmbcf-05.pdf - - .. [2] Stephenson, K. and Zelen, M. - Rethinking centrality: Methods and examples. - Social Networks. Volume 11, Issue 1, March 1989, pp. 1-37 - http://dx.doi.org/10.1016/0378-8733(89)90016-6 - """ - from networkx.utils import reverse_cuthill_mckee_ordering - try: - import numpy as np - except ImportError: - raise ImportError('current_flow_closeness_centrality requires NumPy ', - 'http://scipy.org/') - try: - import scipy - except ImportError: - raise ImportError('current_flow_closeness_centrality requires SciPy ', - 'http://scipy.org/') - if G.is_directed(): - raise nx.NetworkXError('current_flow_closeness_centrality ', - 'not defined for digraphs.') - if G.is_directed(): - raise nx.NetworkXError(\ - "current_flow_closeness_centrality() not defined for digraphs.") - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected.") - solvername={"full" :FullInverseLaplacian, - "lu": SuperLUInverseLaplacian, - "cg": CGInverseLaplacian} - n = G.number_of_nodes() - ordering = list(reverse_cuthill_mckee_ordering(G)) - # make a copy with integer labels according to rcm ordering - # this could be done without a copy if we really wanted to - H = nx.relabel_nodes(G,dict(zip(ordering,range(n)))) - betweenness = dict.fromkeys(H,0.0) # b[v]=0 for v in H - n = G.number_of_nodes() - L = laplacian_sparse_matrix(H, nodelist=range(n), weight=weight, - dtype=dtype, format='csc') - C2 = solvername[solver](L, width=1, dtype=dtype) # initialize solver - for v in H: - col=C2.get_row(v) - for w in H: - betweenness[v]+=col[v]-2*col[w] - betweenness[w]+=col[v] - - if normalized: - nb=len(betweenness)-1.0 - else: - nb=1.0 - for v in H: - betweenness[v]=nb/(betweenness[v]) - return dict((ordering[k],float(v)) for k,v in betweenness.items()) - -information_centrality=current_flow_closeness_centrality - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/degree_alg.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/degree_alg.py deleted file mode 100644 index c65d967..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/degree_alg.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -Degree centrality measures. - -""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Sasha Gutfraind (ag362@cornell.edu)']) - -__all__ = ['degree_centrality', - 'in_degree_centrality', - 'out_degree_centrality'] - -import networkx as nx - -def degree_centrality(G): - """Compute the degree centrality for nodes. - - The degree centrality for a node v is the fraction of nodes it - is connected to. - - Parameters - ---------- - G : graph - A networkx graph - - Returns - ------- - nodes : dictionary - Dictionary of nodes with degree centrality as the value. - - See Also - -------- - betweenness_centrality, load_centrality, eigenvector_centrality - - Notes - ----- - The degree centrality values are normalized by dividing by the maximum - possible degree in a simple graph n-1 where n is the number of nodes in G. - - For multigraphs or graphs with self loops the maximum degree might - be higher than n-1 and values of degree centrality greater than 1 - are possible. - """ - centrality={} - s=1.0/(len(G)-1.0) - centrality=dict((n,d*s) for n,d in G.degree_iter()) - return centrality - -def in_degree_centrality(G): - """Compute the in-degree centrality for nodes. - - The in-degree centrality for a node v is the fraction of nodes its - incoming edges are connected to. - - Parameters - ---------- - G : graph - A NetworkX graph - - Returns - ------- - nodes : dictionary - Dictionary of nodes with in-degree centrality as values. - - See Also - -------- - degree_centrality, out_degree_centrality - - Notes - ----- - The degree centrality values are normalized by dividing by the maximum - possible degree in a simple graph n-1 where n is the number of nodes in G. - - For multigraphs or graphs with self loops the maximum degree might - be higher than n-1 and values of degree centrality greater than 1 - are possible. - """ - if not G.is_directed(): - raise nx.NetworkXError(\ - "in_degree_centrality() not defined for undirected graphs.") - centrality={} - s=1.0/(len(G)-1.0) - centrality=dict((n,d*s) for n,d in G.in_degree_iter()) - return centrality - - -def out_degree_centrality(G): - """Compute the out-degree centrality for nodes. - - The out-degree centrality for a node v is the fraction of nodes its - outgoing edges are connected to. - - Parameters - ---------- - G : graph - A NetworkX graph - - Returns - ------- - nodes : dictionary - Dictionary of nodes with out-degree centrality as values. - - See Also - -------- - degree_centrality, in_degree_centrality - - Notes - ----- - The degree centrality values are normalized by dividing by the maximum - possible degree in a simple graph n-1 where n is the number of nodes in G. - - For multigraphs or graphs with self loops the maximum degree might - be higher than n-1 and values of degree centrality greater than 1 - are possible. - """ - if not G.is_directed(): - raise nx.NetworkXError(\ - "out_degree_centrality() not defined for undirected graphs.") - centrality={} - s=1.0/(len(G)-1.0) - centrality=dict((n,d*s) for n,d in G.out_degree_iter()) - return centrality - - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/eigenvector.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/eigenvector.py deleted file mode 100644 index 28e0013..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/eigenvector.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -Eigenvector centrality. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Sasha Gutfraind (ag362@cornell.edu)']) -__all__ = ['eigenvector_centrality', - 'eigenvector_centrality_numpy'] - -def eigenvector_centrality(G,max_iter=100,tol=1.0e-6,nstart=None): - """Compute the eigenvector centrality for the graph G. - - Uses the power method to find the eigenvector for the - largest eigenvalue of the adjacency matrix of G. - - Parameters - ---------- - G : graph - A networkx graph - - max_iter : interger, optional - Maximum number of iterations in power method. - - tol : float, optional - Error tolerance used to check convergence in power method iteration. - - nstart : dictionary, optional - Starting value of eigenvector iteration for each node. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with eigenvector centrality as the value. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> centrality=nx.eigenvector_centrality(G) - >>> print(['%s %0.2f'%(node,centrality[node]) for node in centrality]) - ['0 0.37', '1 0.60', '2 0.60', '3 0.37'] - - Notes - ------ - The eigenvector calculation is done by the power iteration method - and has no guarantee of convergence. The iteration will stop - after max_iter iterations or an error tolerance of - number_of_nodes(G)*tol has been reached. - - For directed graphs this is "right" eigevector centrality. For - "left" eigenvector centrality, first reverse the graph with - G.reverse(). - - See Also - -------- - eigenvector_centrality_numpy - pagerank - hits - """ - from math import sqrt - if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph: - raise nx.NetworkXException("Not defined for multigraphs.") - - if len(G)==0: - raise nx.NetworkXException("Empty graph.") - - if nstart is None: - # choose starting vector with entries of 1/len(G) - x=dict([(n,1.0/len(G)) for n in G]) - else: - x=nstart - # normalize starting vector - s=1.0/sum(x.values()) - for k in x: x[k]*=s - nnodes=G.number_of_nodes() - # make up to max_iter iterations - for i in range(max_iter): - xlast=x - x=dict.fromkeys(xlast, 0) - # do the multiplication y=Ax - for n in x: - for nbr in G[n]: - x[n]+=xlast[nbr]*G[n][nbr].get('weight',1) - # normalize vector - try: - s=1.0/sqrt(sum(v**2 for v in x.values())) - # this should never be zero? - except ZeroDivisionError: - s=1.0 - for n in x: x[n]*=s - # check convergence - err=sum([abs(x[n]-xlast[n]) for n in x]) - if err < nnodes*tol: - return x - - raise nx.NetworkXError("""eigenvector_centrality(): -power iteration failed to converge in %d iterations."%(i+1))""") - - -def eigenvector_centrality_numpy(G): - """Compute the eigenvector centrality for the graph G. - - Parameters - ---------- - G : graph - A networkx graph - - Returns - ------- - nodes : dictionary - Dictionary of nodes with eigenvector centrality as the value. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> centrality=nx.eigenvector_centrality_numpy(G) - >>> print(['%s %0.2f'%(node,centrality[node]) for node in centrality]) - ['0 0.37', '1 0.60', '2 0.60', '3 0.37'] - - Notes - ------ - This algorithm uses the NumPy eigenvalue solver. - - For directed graphs this is "right" eigevector centrality. For - "left" eigenvector centrality, first reverse the graph with - G.reverse(). - - See Also - -------- - eigenvector_centrality - pagerank - hits - """ - try: - import numpy as np - except ImportError: - raise ImportError('Requires NumPy: http://scipy.org/') - - if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph: - raise nx.NetworkXException('Not defined for multigraphs.') - - if len(G)==0: - raise nx.NetworkXException('Empty graph.') - - A=nx.adj_matrix(G,nodelist=G.nodes()) - eigenvalues,eigenvectors=np.linalg.eig(A) - # eigenvalue indices in reverse sorted order - ind=eigenvalues.argsort()[::-1] - # eigenvector of largest eigenvalue at ind[0], normalized - largest=np.array(eigenvectors[:,ind[0]]).flatten().real - norm=np.sign(largest.sum())*np.linalg.norm(largest) - centrality=dict(zip(G,map(float,largest/norm))) - return centrality - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - import numpy.linalg - except: - raise SkipTest("numpy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/flow_matrix.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/flow_matrix.py deleted file mode 100644 index d886182..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/flow_matrix.py +++ /dev/null @@ -1,139 +0,0 @@ -# Helpers for current-flow betweenness and current-flow closness -# Lazy computations for inverse Laplacian and flow-matrix rows. -import networkx as nx - -def flow_matrix_row(G, weight='weight', dtype=float, solver='lu'): - # Generate a row of the current-flow matrix - import numpy as np - from scipy import sparse - from scipy.sparse import linalg - solvername={"full" :FullInverseLaplacian, - "lu": SuperLUInverseLaplacian, - "cg": CGInverseLaplacian} - n = G.number_of_nodes() - L = laplacian_sparse_matrix(G, nodelist=range(n), weight=weight, - dtype=dtype, format='csc') - C = solvername[solver](L, dtype=dtype) # initialize solver - w = C.w # w is the Laplacian matrix width - # row-by-row flow matrix - for u,v,d in G.edges_iter(data=True): - B = np.zeros(w, dtype=dtype) - c = d.get(weight,1.0) - B[u%w] = c - B[v%w] = -c - # get only the rows needed in the inverse laplacian - # and multiply to get the flow matrix row - row = np.dot(B, C.get_rows(u,v)) - yield row,(u,v) - - -# Class to compute the inverse laplacian only for specified rows -# Allows computation of the current-flow matrix without storing entire -# inverse laplacian matrix -class InverseLaplacian(object): - def __init__(self, L, width=None, dtype=None): - global np - import numpy as np - (n,n) = L.shape - self.dtype = dtype - self.n = n - if width is None: - self.w = self.width(L) - else: - self.w = width - self.C = np.zeros((self.w,n), dtype=dtype) - self.L1 = L[1:,1:] - self.init_solver(L) - - def init_solver(self,L): - pass - - def solve(self,r): - raise("Implement solver") - - def solve_inverse(self,r): - raise("Implement solver") - - - def get_rows(self, r1, r2): - for r in range(r1, r2+1): - self.C[r%self.w, 1:] = self.solve_inverse(r) - return self.C - - def get_row(self, r): - self.C[r%self.w, 1:] = self.solve_inverse(r) - return self.C[r%self.w] - - - def width(self,L): - m=0 - for i,row in enumerate(L): - w=0 - x,y = np.nonzero(row) - if len(y) > 0: - v = y-i - w=v.max()-v.min()+1 - m = max(w,m) - return m - -class FullInverseLaplacian(InverseLaplacian): - def init_solver(self,L): - self.IL = np.zeros(L.shape, dtype=self.dtype) - self.IL[1:,1:] = np.linalg.inv(self.L1.todense()) - - def solve(self,rhs): - s = np.zeros(rhs.shape, dtype=self.dtype) - s = np.dot(self.IL,rhs) - return s - - def solve_inverse(self,r): - return self.IL[r,1:] - - -class SuperLUInverseLaplacian(InverseLaplacian): - def init_solver(self,L): - from scipy.sparse import linalg - self.lusolve = linalg.factorized(self.L1.tocsc()) - - def solve_inverse(self,r): - rhs = np.zeros(self.n, dtype=self.dtype) - rhs[r]=1 - return self.lusolve(rhs[1:]) - - def solve(self,rhs): - s = np.zeros(rhs.shape, dtype=self.dtype) - s[1:]=self.lusolve(rhs[1:]) - return s - - - -class CGInverseLaplacian(InverseLaplacian): - def init_solver(self,L): - global linalg - from scipy.sparse import linalg - ilu= linalg.spilu(self.L1.tocsc()) - n=self.n-1 - self.M = linalg.LinearOperator(shape=(n,n), matvec=ilu.solve) - - def solve(self,rhs): - s = np.zeros(rhs.shape, dtype=self.dtype) - s[1:]=linalg.cg(self.L1, rhs[1:], M=self.M)[0] - return s - - def solve_inverse(self,r): - rhs = np.zeros(self.n, self.dtype) - rhs[r] = 1 - return linalg.cg(self.L1, rhs[1:], M=self.M)[0] - - -# graph laplacian, sparse version, will move to linalg/laplacianmatrix.py -def laplacian_sparse_matrix(G, nodelist=None, weight='weight', dtype=None, - format='csr'): - import numpy as np - import scipy.sparse - A = nx.to_scipy_sparse_matrix(G, nodelist=nodelist, weight=weight, - dtype=dtype, format=format) - (n,n) = A.shape - data = np.asarray(A.sum(axis=1).T) - D = scipy.sparse.spdiags(data,0,n,n, format=format) - return D - A diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/katz.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/katz.py deleted file mode 100644 index 4babe25..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/katz.py +++ /dev/null @@ -1,296 +0,0 @@ -""" -Katz centrality. -""" -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import * -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Sasha Gutfraind (ag362@cornell.edu)', - 'Vincent Gauthier (vgauthier@luxbulb.org)']) - -__all__ = ['katz_centrality', - 'katz_centrality_numpy'] - -@not_implemented_for('multigraph') -def katz_centrality(G, alpha=0.1, beta=1.0, - max_iter=1000, tol=1.0e-6, nstart=None, normalized=True): - r"""Compute the Katz centrality for the nodes of the graph G. - - - Katz centrality is related to eigenvalue centrality and PageRank. - The Katz centrality for node `i` is - - .. math:: - - x_i = \alpha \sum_{j} A_{ij} x_j + \beta, - - where `A` is the adjacency matrix of the graph G with eigenvalues `\lambda`. - - The parameter `\beta` controls the initial centrality and - - .. math:: - - \alpha < \frac{1}{\lambda_{max}}. - - - Katz centrality computes the relative influence of a node within a - network by measuring the number of the immediate neighbors (first - degree nodes) and also all other nodes in the network that connect - to the node under consideration through these immediate neighbors. - - Extra weight can be provided to immediate neighbors through the - parameter :math:`\beta`. Connections made with distant neighbors - are, however, penalized by an attenuation factor `\alpha` which - should be strictly less than the inverse largest eigenvalue of the - adjacency matrix in order for the Katz centrality to be computed - correctly. More information is provided in [1]_ . - - - Parameters - ---------- - G : graph - A NetworkX graph - - alpha : float - Attenuation factor - - beta : scalar or dictionary, optional (default=1.0) - Weight attributed to the immediate neighborhood. If not a scalar the - dictionary must have an value for every node. - - max_iter : integer, optional (default=1000) - Maximum number of iterations in power method. - - tol : float, optional (default=1.0e-6) - Error tolerance used to check convergence in power method iteration. - - nstart : dictionary, optional - Starting value of Katz iteration for each node. - - normalized : bool, optional (default=True) - If True normalize the resulting values. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with Katz centrality as the value. - - Examples - -------- - >>> import math - >>> G = nx.path_graph(4) - >>> phi = (1+math.sqrt(5))/2.0 # largest eigenvalue of adj matrix - >>> centrality = nx.katz_centrality(G,1/phi-0.01) - >>> for n,c in sorted(centrality.items()): - ... print("%d %0.2f"%(n,c)) - 0 0.37 - 1 0.60 - 2 0.60 - 3 0.37 - - Notes - ----- - This algorithm it uses the power method to find the eigenvector - corresponding to the largest eigenvalue of the adjacency matrix of G. - The constant alpha should be strictly less than the inverse of largest - eigenvalue of the adjacency matrix for the algorithm to converge. - The iteration will stop after max_iter iterations or an error tolerance of - number_of_nodes(G)*tol has been reached. - - When `\alpha = 1/\lambda_{max}` and `\beta=1` Katz centrality is the same as - eigenvector centrality. - - References - ---------- - .. [1] M. Newman, Networks: An Introduction. Oxford University Press, - USA, 2010, p. 720. - - See Also - -------- - katz_centrality_numpy - eigenvector_centrality - eigenvector_centrality_numpy - pagerank - hits - """ - from math import sqrt - - if len(G)==0: - return {} - - nnodes=G.number_of_nodes() - - if nstart is None: - # choose starting vector with entries of 0 - x=dict([(n,0) for n in G]) - else: - x=nstart - - try: - b = dict.fromkeys(G,float(beta)) - except (TypeError,ValueError): - b = beta - if set(beta) != set(G): - raise nx.NetworkXError('beta dictionary ' - 'must have a value for every node') - - # make up to max_iter iterations - for i in range(max_iter): - xlast=x - x=dict.fromkeys(xlast, 0) - # do the multiplication y = Alpha * Ax - Beta - for n in x: - for nbr in G[n]: - x[n] += xlast[nbr] * G[n][nbr].get('weight',1) - x[n] = alpha*x[n] + b[n] - - # check convergence - err=sum([abs(x[n]-xlast[n]) for n in x]) - if err < nnodes*tol: - if normalized: - # normalize vector - try: - s=1.0/sqrt(sum(v**2 for v in x.values())) - # this should never be zero? - except ZeroDivisionError: - s=1.0 - else: - s = 1 - for n in x: - x[n]*=s - return x - - raise nx.NetworkXError('Power iteration failed to converge in ', - '%d iterations."%(i+1))') - -@not_implemented_for('multigraph') -def katz_centrality_numpy(G, alpha=0.1, beta=1.0, normalized=True): - r"""Compute the Katz centrality for the graph G. - - - Katz centrality is related to eigenvalue centrality and PageRank. - The Katz centrality for node `i` is - - .. math:: - - x_i = \alpha \sum_{j} A_{ij} x_j + \beta, - - where `A` is the adjacency matrix of the graph G with eigenvalues `\lambda`. - - The parameter `\beta` controls the initial centrality and - - .. math:: - - \alpha < \frac{1}{\lambda_{max}}. - - - Katz centrality computes the relative influence of a node within a - network by measuring the number of the immediate neighbors (first - degree nodes) and also all other nodes in the network that connect - to the node under consideration through these immediate neighbors. - - Extra weight can be provided to immediate neighbors through the - parameter :math:`\beta`. Connections made with distant neighbors - are, however, penalized by an attenuation factor `\alpha` which - should be strictly less than the inverse largest eigenvalue of the - adjacency matrix in order for the Katz centrality to be computed - correctly. More information is provided in [1]_ . - - Parameters - ---------- - G : graph - A NetworkX graph - - alpha : float - Attenuation factor - - beta : scalar or dictionary, optional (default=1.0) - Weight attributed to the immediate neighborhood. If not a scalar the - dictionary must have an value for every node. - - normalized : bool - If True normalize the resulting values. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with Katz centrality as the value. - - Examples - -------- - >>> import math - >>> G = nx.path_graph(4) - >>> phi = (1+math.sqrt(5))/2.0 # largest eigenvalue of adj matrix - >>> centrality = nx.katz_centrality_numpy(G,1/phi) - >>> for n,c in sorted(centrality.items()): - ... print("%d %0.2f"%(n,c)) - 0 0.37 - 1 0.60 - 2 0.60 - 3 0.37 - - Notes - ------ - This algorithm uses a direct linear solver to solve the above equation. - The constant alpha should be strictly less than the inverse of largest - eigenvalue of the adjacency matrix for there to be a solution. When - `\alpha = 1/\lambda_{max}` and `\beta=1` Katz centrality is the same as - eigenvector centrality. - - References - ---------- - .. [1] M. Newman, Networks: An Introduction. Oxford University Press, - USA, 2010, p. 720. - - See Also - -------- - katz_centrality - eigenvector_centrality_numpy - eigenvector_centrality - pagerank - hits - """ - try: - import numpy as np - except ImportError: - raise ImportError('Requires NumPy: http://scipy.org/') - if len(G)==0: - return {} - try: - nodelist = beta.keys() - if set(nodelist) != set(G): - raise nx.NetworkXError('beta dictionary ' - 'must have a value for every node') - b = np.array(list(beta.values()),dtype=float) - except AttributeError: - nodelist = G.nodes() - try: - b = np.ones((len(nodelist),1))*float(beta) - except (TypeError,ValueError): - raise nx.NetworkXError('beta must be a number') - - A=nx.adj_matrix(G, nodelist=nodelist) - n = np.array(A).shape[0] - centrality = np.linalg.solve( np.eye(n,n) - (alpha * A) , b) - if normalized: - norm = np.sign(sum(centrality)) * np.linalg.norm(centrality) - else: - norm = 1.0 - centrality=dict(zip(nodelist, map(float,centrality/norm))) - return centrality - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - import numpy.linalg - except: - raise SkipTest("numpy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/load.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/load.py deleted file mode 100644 index 2d279e8..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/load.py +++ /dev/null @@ -1,190 +0,0 @@ -""" -Load centrality. - -""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Sasha Gutfraind (ag362@cornell.edu)']) - -__all__ = ['load_centrality', - 'edge_load'] - -import networkx as nx - -def newman_betweenness_centrality(G,v=None,cutoff=None, - normalized=True, - weight=None): - """Compute load centrality for nodes. - - The load centrality of a node is the fraction of all shortest - paths that pass through that node. - - Parameters - ---------- - G : graph - A networkx graph - - normalized : bool, optional - If True the betweenness values are normalized by b=b/(n-1)(n-2) where - n is the number of nodes in G. - - weight : None or string, optional - If None, edge weights are ignored. - Otherwise holds the name of the edge attribute used as weight. - - cutoff : bool, optional - If specified, only consider paths of length <= cutoff. - - Returns - ------- - nodes : dictionary - Dictionary of nodes with centrality as the value. - - - See Also - -------- - betweenness_centrality() - - Notes - ----- - Load centrality is slightly different than betweenness. - For this load algorithm see the reference - Scientific collaboration networks: II. - Shortest paths, weighted networks, and centrality, - M. E. J. Newman, Phys. Rev. E 64, 016132 (2001). - - """ - if v is not None: # only one node - betweenness=0.0 - for source in G: - ubetween = _node_betweenness(G, source, cutoff, False, weight) - betweenness += ubetween[v] if v in ubetween else 0 - if normalized: - order = G.order() - if order <= 2: - return betweenness # no normalization b=0 for all nodes - betweenness *= 1.0 / ((order-1) * (order-2)) - return betweenness - else: - betweenness = {}.fromkeys(G,0.0) - for source in betweenness: - ubetween = _node_betweenness(G, source, cutoff, False, weight) - for vk in ubetween: - betweenness[vk] += ubetween[vk] - if normalized: - order = G.order() - if order <= 2: - return betweenness # no normalization b=0 for all nodes - scale = 1.0 / ((order-1) * (order-2)) - for v in betweenness: - betweenness[v] *= scale - return betweenness # all nodes - -def _node_betweenness(G,source,cutoff=False,normalized=True,weight=None): - """Node betweenness helper: - see betweenness_centrality for what you probably want. - - This actually computes "load" and not betweenness. - See https://networkx.lanl.gov/ticket/103 - - This calculates the load of each node for paths from a single source. - (The fraction of number of shortests paths from source that go - through each node.) - - To get the load for a node you need to do all-pairs shortest paths. - - If weight is not None then use Dijkstra for finding shortest paths. - In this case a cutoff is not implemented and so is ignored. - - """ - - # get the predecessor and path length data - if weight is None: - (pred,length)=nx.predecessor(G,source,cutoff=cutoff,return_seen=True) - else: - (pred,length)=nx.dijkstra_predecessor_and_distance(G,source,weight=weight) - - # order the nodes by path length - onodes = [ (l,vert) for (vert,l) in length.items() ] - onodes.sort() - onodes[:] = [vert for (l,vert) in onodes if l>0] - - # intialize betweenness - between={}.fromkeys(length,1.0) - - while onodes: - v=onodes.pop() - if v in pred: - num_paths=len(pred[v]) # Discount betweenness if more than - for x in pred[v]: # one shortest path. - if x==source: # stop if hit source because all remaining v - break # also have pred[v]==[source] - between[x]+=between[v]/float(num_paths) - # remove source - for v in between: - between[v]-=1 - # rescale to be between 0 and 1 - if normalized: - l=len(between) - if l > 2: - scale=1.0/float((l-1)*(l-2)) # 1/the number of possible paths - for v in between: - between[v] *= scale - return between - - -load_centrality=newman_betweenness_centrality - - -def edge_load(G,nodes=None,cutoff=False): - """Compute edge load. - - WARNING: - - This module is for demonstration and testing purposes. - - """ - betweenness={} - if not nodes: # find betweenness for every node in graph - nodes=G.nodes() # that probably is what you want... - for source in nodes: - ubetween=_edge_betweenness(G,source,nodes,cutoff=cutoff) - for v in ubetween.keys(): - b=betweenness.setdefault(v,0) # get or set default - betweenness[v]=ubetween[v]+b # cumulative total - return betweenness - -def _edge_betweenness(G,source,nodes,cutoff=False): - """ - Edge betweenness helper. - """ - between={} - # get the predecessor data - #(pred,length)=_fast_predecessor(G,source,cutoff=cutoff) - (pred,length)=nx.predecessor(G,source,cutoff=cutoff,return_seen=True) - # order the nodes by path length - onodes = [ nn for dd,nn in sorted( (dist,n) for n,dist in length.items() )] - # intialize betweenness, doesn't account for any edge weights - for u,v in G.edges(nodes): - between[(u,v)]=1.0 - between[(v,u)]=1.0 - - while onodes: # work through all paths - v=onodes.pop() - if v in pred: - num_paths=len(pred[v]) # Discount betweenness if more than - for w in pred[v]: # one shortest path. - if w in pred: - num_paths=len(pred[w]) # Discount betweenness, mult path - for x in pred[w]: - between[(w,x)]+=between[(v,w)]/num_paths - between[(x,w)]+=between[(w,v)]/num_paths - return between - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_betweenness_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_betweenness_centrality.py deleted file mode 100644 index b0169a9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +++ /dev/null @@ -1,462 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -def weighted_G(): - G=nx.Graph(); - G.add_edge(0,1,weight=3) - G.add_edge(0,2,weight=2) - G.add_edge(0,3,weight=6) - G.add_edge(0,4,weight=4) - G.add_edge(1,3,weight=5) - G.add_edge(1,5,weight=5) - G.add_edge(2,4,weight=1) - G.add_edge(3,4,weight=2) - G.add_edge(3,5,weight=1) - G.add_edge(4,5,weight=4) - - return G - - -class TestBetweennessCentrality(object): - - def test_K5(self): - """Betweenness centrality: K5""" - G=nx.complete_graph(5) - b=nx.betweenness_centrality(G, - weight=None, - normalized=False) - b_answer={0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_K5_endpoints(self): - """Betweenness centrality: K5 endpoints""" - G=nx.complete_graph(5) - b=nx.betweenness_centrality(G, - weight=None, - normalized=False, - endpoints=True) - b_answer={0: 4.0, 1: 4.0, 2: 4.0, 3: 4.0, 4: 4.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P3_normalized(self): - """Betweenness centrality: P3 normalized""" - G=nx.path_graph(3) - b=nx.betweenness_centrality(G, - weight=None, - normalized=True) - b_answer={0: 0.0, 1: 1.0, 2: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P3(self): - """Betweenness centrality: P3""" - G=nx.path_graph(3) - b_answer={0: 0.0, 1: 1.0, 2: 0.0} - b=nx.betweenness_centrality(G, - weight=None, - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_P3_endpoints(self): - """Betweenness centrality: P3 endpoints""" - G=nx.path_graph(3) - b_answer={0: 2.0, 1: 3.0, 2: 2.0} - b=nx.betweenness_centrality(G, - weight=None, - normalized=False, - endpoints=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_krackhardt_kite_graph(self): - """Betweenness centrality: Krackhardt kite graph""" - G=nx.krackhardt_kite_graph() - b_answer={0: 1.667,1: 1.667,2: 0.000,3: 7.333,4: 0.000, - 5: 16.667,6: 16.667,7: 28.000,8: 16.000,9: 0.000} - for b in b_answer: - b_answer[b]/=2.0 - b=nx.betweenness_centrality(G, - weight=None, - normalized=False) - - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_krackhardt_kite_graph_normalized(self): - """Betweenness centrality: Krackhardt kite graph normalized""" - G=nx.krackhardt_kite_graph() - b_answer={0:0.023,1:0.023,2:0.000,3:0.102,4:0.000, - 5:0.231,6:0.231,7:0.389,8:0.222,9:0.000} - b=nx.betweenness_centrality(G, - weight=None, - normalized=True) - - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_florentine_families_graph(self): - """Betweenness centrality: Florentine families graph""" - G=nx.florentine_families_graph() - b_answer=\ - {'Acciaiuoli': 0.000, - 'Albizzi': 0.212, - 'Barbadori': 0.093, - 'Bischeri': 0.104, - 'Castellani': 0.055, - 'Ginori': 0.000, - 'Guadagni': 0.255, - 'Lamberteschi': 0.000, - 'Medici': 0.522, - 'Pazzi': 0.000, - 'Peruzzi': 0.022, - 'Ridolfi': 0.114, - 'Salviati': 0.143, - 'Strozzi': 0.103, - 'Tornabuoni': 0.092} - - b=nx.betweenness_centrality(G, - weight=None, - normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_ladder_graph(self): - """Betweenness centrality: Ladder graph""" - G = nx.Graph() # ladder_graph(3) - G.add_edges_from([(0,1), (0,2), (1,3), (2,3), - (2,4), (4,5), (3,5)]) - b_answer={0:1.667,1: 1.667,2: 6.667, - 3: 6.667,4: 1.667,5: 1.667} - for b in b_answer: - b_answer[b]/=2.0 - b=nx.betweenness_centrality(G, - weight=None, - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - def test_disconnected_path(self): - """Betweenness centrality: disconnected path""" - G=nx.Graph() - G.add_path([0,1,2]) - G.add_path([3,4,5,6]) - b_answer={0:0,1:1,2:0,3:0,4:2,5:2,6:0} - b=nx.betweenness_centrality(G, - weight=None, - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_disconnected_path_endpoints(self): - """Betweenness centrality: disconnected path endpoints""" - G=nx.Graph() - G.add_path([0,1,2]) - G.add_path([3,4,5,6]) - b_answer={0:2,1:3,2:2,3:3,4:5,5:5,6:3} - b=nx.betweenness_centrality(G, - weight=None, - normalized=False, - endpoints=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_directed_path(self): - """Betweenness centrality: directed path""" - G=nx.DiGraph() - G.add_path([0,1,2]) - b=nx.betweenness_centrality(G, - weight=None, - normalized=False) - b_answer={0: 0.0, 1: 1.0, 2: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_directed_path_normalized(self): - """Betweenness centrality: directed path normalized""" - G=nx.DiGraph() - G.add_path([0,1,2]) - b=nx.betweenness_centrality(G, - weight=None, - normalized=True) - b_answer={0: 0.0, 1: 0.5, 2: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - -class TestWeightedBetweennessCentrality(object): - - def test_K5(self): - """Weighted betweenness centrality: K5""" - G=nx.complete_graph(5) - b=nx.betweenness_centrality(G, - weight='weight', - normalized=False) - b_answer={0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_P3_normalized(self): - """Weighted betweenness centrality: P3 normalized""" - G=nx.path_graph(3) - b=nx.betweenness_centrality(G, - weight='weight', - normalized=True) - b_answer={0: 0.0, 1: 1.0, 2: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P3(self): - """Weighted betweenness centrality: P3""" - G=nx.path_graph(3) - b_answer={0: 0.0, 1: 1.0, 2: 0.0} - b=nx.betweenness_centrality(G, - weight='weight', - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_krackhardt_kite_graph(self): - """Weighted betweenness centrality: Krackhardt kite graph""" - G=nx.krackhardt_kite_graph() - b_answer={0: 1.667,1: 1.667,2: 0.000,3: 7.333,4: 0.000, - 5: 16.667,6: 16.667,7: 28.000,8: 16.000,9: 0.000} - for b in b_answer: - b_answer[b]/=2.0 - - b=nx.betweenness_centrality(G, - weight='weight', - normalized=False) - - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_krackhardt_kite_graph_normalized(self): - """Weighted betweenness centrality: - Krackhardt kite graph normalized - """ - G=nx.krackhardt_kite_graph() - b_answer={0:0.023,1:0.023,2:0.000,3:0.102,4:0.000, - 5:0.231,6:0.231,7:0.389,8:0.222,9:0.000} - b=nx.betweenness_centrality(G, - weight='weight', - normalized=True) - - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_florentine_families_graph(self): - """Weighted betweenness centrality: - Florentine families graph""" - G=nx.florentine_families_graph() - b_answer=\ - {'Acciaiuoli': 0.000, - 'Albizzi': 0.212, - 'Barbadori': 0.093, - 'Bischeri': 0.104, - 'Castellani': 0.055, - 'Ginori': 0.000, - 'Guadagni': 0.255, - 'Lamberteschi': 0.000, - 'Medici': 0.522, - 'Pazzi': 0.000, - 'Peruzzi': 0.022, - 'Ridolfi': 0.114, - 'Salviati': 0.143, - 'Strozzi': 0.103, - 'Tornabuoni': 0.092} - - b=nx.betweenness_centrality(G, - weight='weight', - normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_ladder_graph(self): - """Weighted betweenness centrality: Ladder graph""" - G = nx.Graph() # ladder_graph(3) - G.add_edges_from([(0,1), (0,2), (1,3), (2,3), - (2,4), (4,5), (3,5)]) - b_answer={0:1.667,1: 1.667,2: 6.667, - 3: 6.667,4: 1.667,5: 1.667} - for b in b_answer: - b_answer[b]/=2.0 - b=nx.betweenness_centrality(G, - weight='weight', - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - def test_G(self): - """Weighted betweenness centrality: G""" - G = weighted_G() - b_answer={0: 2.0, 1: 0.0, 2: 4.0, 3: 3.0, 4: 4.0, 5: 0.0} - b=nx.betweenness_centrality(G, - weight='weight', - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_G2(self): - """Weighted betweenness centrality: G2""" - G=nx.DiGraph() - G.add_weighted_edges_from([('s','u',10) ,('s','x',5) , - ('u','v',1) ,('u','x',2) , - ('v','y',1) ,('x','u',3) , - ('x','v',5) ,('x','y',2) , - ('y','s',7) ,('y','v',6)]) - - b_answer={'y':5.0,'x':5.0,'s':4.0,'u':2.0,'v':2.0} - - b=nx.betweenness_centrality(G, - weight='weight', - normalized=False) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - -class TestEdgeBetweennessCentrality(object): - - def test_K5(self): - """Edge betweenness centrality: K5""" - G=nx.complete_graph(5) - b=nx.edge_betweenness_centrality(G, weight=None, normalized=False) - b_answer=dict.fromkeys(G.edges(),1) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_normalized_K5(self): - """Edge betweenness centrality: K5""" - G=nx.complete_graph(5) - b=nx.edge_betweenness_centrality(G, weight=None, normalized=True) - b_answer=dict.fromkeys(G.edges(),1/10.0) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - - def test_C4(self): - """Edge betweenness centrality: C4""" - G=nx.cycle_graph(4) - b=nx.edge_betweenness_centrality(G, weight=None, normalized=True) - b_answer={(0, 1):2,(0, 3):2, (1, 2):2, (2, 3): 2} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]/6.0) - - def test_P4(self): - """Edge betweenness centrality: P4""" - G=nx.path_graph(4) - b=nx.edge_betweenness_centrality(G, weight=None, normalized=False) - b_answer={(0, 1):3,(1, 2):4, (2, 3):3} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_normalized_P4(self): - """Edge betweenness centrality: P4""" - G=nx.path_graph(4) - b=nx.edge_betweenness_centrality(G, weight=None, normalized=True) - b_answer={(0, 1):3,(1, 2):4, (2, 3):3} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]/6.0) - - - def test_balanced_tree(self): - """Edge betweenness centrality: balanced tree""" - G=nx.balanced_tree(r=2,h=2) - b=nx.edge_betweenness_centrality(G, weight=None, normalized=False) - b_answer={(0, 1):12,(0, 2):12, - (1, 3):6,(1, 4):6,(2, 5):6,(2,6):6} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - -class TestWeightedEdgeBetweennessCentrality(object): - - def test_K5(self): - """Edge betweenness centrality: K5""" - G=nx.complete_graph(5) - b=nx.edge_betweenness_centrality(G, weight='weight', normalized=False) - b_answer=dict.fromkeys(G.edges(),1) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_C4(self): - """Edge betweenness centrality: C4""" - G=nx.cycle_graph(4) - b=nx.edge_betweenness_centrality(G, weight='weight', normalized=False) - b_answer={(0, 1):2,(0, 3):2, (1, 2):2, (2, 3): 2} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_P4(self): - """Edge betweenness centrality: P4""" - G=nx.path_graph(4) - b=nx.edge_betweenness_centrality(G, weight='weight', normalized=False) - b_answer={(0, 1):3,(1, 2):4, (2, 3):3} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - - def test_balanced_tree(self): - """Edge betweenness centrality: balanced tree""" - G=nx.balanced_tree(r=2,h=2) - b=nx.edge_betweenness_centrality(G, weight='weight', normalized=False) - b_answer={(0, 1):12,(0, 2):12, - (1, 3):6,(1, 4):6,(2, 5):6,(2,6):6} - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_weighted_graph(self): - eList = [(0, 1, 5), (0, 2, 4), (0, 3, 3), - (0, 4, 2), (1, 2, 4), (1, 3, 1), - (1, 4, 3), (2, 4, 5), (3, 4, 4)] - G = nx.Graph() - G.add_weighted_edges_from(eList) - b = nx.edge_betweenness_centrality(G, weight='weight', normalized=False) - b_answer={(0, 1):0.0, - (0, 2):1.0, - (0, 3):2.0, - (0, 4):1.0, - (1, 2):2.0, - (1, 3):3.5, - (1, 4):1.5, - (2, 4):1.0, - (3, 4):0.5} - - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_normalized_weighted_graph(self): - eList = [(0, 1, 5), (0, 2, 4), (0, 3, 3), - (0, 4, 2), (1, 2, 4), (1, 3, 1), - (1, 4, 3), (2, 4, 5), (3, 4, 4)] - G = nx.Graph() - G.add_weighted_edges_from(eList) - b = nx.edge_betweenness_centrality(G, weight='weight', normalized=True) - b_answer={(0, 1):0.0, - (0, 2):1.0, - (0, 3):2.0, - (0, 4):1.0, - (1, 2):2.0, - (1, 3):3.5, - (1, 4):1.5, - (2, 4):1.0, - (3, 4):0.5} - - norm = len(G)*(len(G)-1)/2.0 - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]/norm) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py deleted file mode 100644 index 762b873..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +++ /dev/null @@ -1,258 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx -from networkx import betweenness_centrality_subset,\ - edge_betweenness_centrality_subset - -class TestSubsetBetweennessCentrality: - - def test_K5(self): - """Betweenness centrality: K5""" - G=networkx.complete_graph(5) - b=betweenness_centrality_subset(G, - sources=[0], - targets=[1,3], - weight=None) - b_answer={0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_P5_directed(self): - """Betweenness centrality: P5 directed""" - G=networkx.DiGraph() - G.add_path(list(range(5))) - b_answer={0:0,1:1,2:1,3:0,4:0,5:0} - b=betweenness_centrality_subset(G, - sources=[0], - targets=[3], - weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_P5(self): - """Betweenness centrality: P5""" - G=networkx.Graph() - G.add_path(list(range(5))) - b_answer={0:0,1:0.5,2:0.5,3:0,4:0,5:0} - b=betweenness_centrality_subset(G, - sources=[0], - targets=[3], - weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_P5_multiple_target(self): - """Betweenness centrality: P5 multiple target""" - G=networkx.Graph() - G.add_path(list(range(5))) - b_answer={0:0,1:1,2:1,3:0.5,4:0,5:0} - b=betweenness_centrality_subset(G, - sources=[0], - targets=[3,4], - weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_box(self): - """Betweenness centrality: box""" - G=networkx.Graph() - G.add_edge(0,1) - G.add_edge(0,2) - G.add_edge(1,3) - G.add_edge(2,3) - b_answer={0:0,1:0.25,2:0.25,3:0} - b=betweenness_centrality_subset(G, - sources=[0], - targets=[3], - weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_box_and_path(self): - """Betweenness centrality: box and path""" - G=networkx.Graph() - G.add_edge(0,1) - G.add_edge(0,2) - G.add_edge(1,3) - G.add_edge(2,3) - G.add_edge(3,4) - G.add_edge(4,5) - b_answer={0:0,1:0.5,2:0.5,3:0.5,4:0,5:0} - b=betweenness_centrality_subset(G, - sources=[0], - targets=[3,4], - weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_box_and_path2(self): - """Betweenness centrality: box and path multiple target""" - G=networkx.Graph() - G.add_edge(0,1) - G.add_edge(1,2) - G.add_edge(2,3) - G.add_edge(1,20) - G.add_edge(20,3) - G.add_edge(3,4) - b_answer={0:0,1:1.0,2:0.5,20:0.5,3:0.5,4:0} - b=betweenness_centrality_subset(G, - sources=[0], - targets=[3,4]) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - -class TestBetweennessCentralitySources: - def test_K5(self): - """Betweenness centrality: K5""" - G=networkx.complete_graph(5) - b=networkx.betweenness_centrality_source(G, - weight=None, - normalized=False) - b_answer={0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_P3(self): - """Betweenness centrality: P3""" - G=networkx.path_graph(3) - b_answer={0: 0.0, 1: 1.0, 2: 0.0} - b=networkx.betweenness_centrality_source(G, - weight=None, - normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - - -class TestEdgeSubsetBetweennessCentrality: - - def test_K5(self): - """Edge betweenness centrality: K5""" - G=networkx.complete_graph(5) - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[1,3], - weight=None) - b_answer=dict.fromkeys(G.edges(),0) - b_answer[(0,3)]=0.5 - b_answer[(0,1)]=0.5 - for n in sorted(G.edges()): - print(n,b[n]) - assert_almost_equal(b[n],b_answer[n]) - - def test_P5_directed(self): - """Edge betweenness centrality: P5 directed""" - G=networkx.DiGraph() - G.add_path(list(range(5))) - b_answer=dict.fromkeys(G.edges(),0) - b_answer[(0,1)]=1 - b_answer[(1,2)]=1 - b_answer[(2,3)]=1 - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[3], - weight=None) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_P5(self): - """Edge betweenness centrality: P5""" - G=networkx.Graph() - G.add_path(list(range(5))) - b_answer=dict.fromkeys(G.edges(),0) - b_answer[(0,1)]=0.5 - b_answer[(1,2)]=0.5 - b_answer[(2,3)]=0.5 - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[3], - weight=None) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_P5_multiple_target(self): - """Edge betweenness centrality: P5 multiple target""" - G=networkx.Graph() - G.add_path(list(range(5))) - b_answer=dict.fromkeys(G.edges(),0) - b_answer[(0,1)]=1 - b_answer[(1,2)]=1 - b_answer[(2,3)]=1 - b_answer[(3,4)]=0.5 - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[3,4], - weight=None) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_box(self): - """Edge etweenness centrality: box""" - G=networkx.Graph() - G.add_edge(0,1) - G.add_edge(0,2) - G.add_edge(1,3) - G.add_edge(2,3) - b_answer=dict.fromkeys(G.edges(),0) - - b_answer[(0,1)]=0.25 - b_answer[(0,2)]=0.25 - b_answer[(1,3)]=0.25 - b_answer[(2,3)]=0.25 - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[3], - weight=None) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - def test_box_and_path(self): - """Edge etweenness centrality: box and path""" - G=networkx.Graph() - G.add_edge(0,1) - G.add_edge(0,2) - G.add_edge(1,3) - G.add_edge(2,3) - G.add_edge(3,4) - G.add_edge(4,5) - b_answer=dict.fromkeys(G.edges(),0) - b_answer[(0,1)]=1.0/2 - b_answer[(0,2)]=1.0/2 - b_answer[(1,3)]=1.0/2 - b_answer[(2,3)]=1.0/2 - b_answer[(3,4)]=1.0/2 - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[3,4], - weight=None) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - - def test_box_and_path2(self): - """Edge betweenness centrality: box and path multiple target""" - G=networkx.Graph() - G.add_edge(0,1) - G.add_edge(1,2) - G.add_edge(2,3) - G.add_edge(1,20) - G.add_edge(20,3) - G.add_edge(3,4) - b_answer=dict.fromkeys(G.edges(),0) - b_answer[(0,1)]=1.0 - b_answer[(1,20)]=1.0/2 - b_answer[(3,20)]=1.0/2 - b_answer[(1,2)]=1.0/2 - b_answer[(2,3)]=1.0/2 - b_answer[(3,4)]=1.0/2 - b=edge_betweenness_centrality_subset(G, - sources=[0], - targets=[3,4], - weight=None) - for n in sorted(G.edges()): - assert_almost_equal(b[n],b_answer[n]) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_closeness_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_closeness_centrality.py deleted file mode 100644 index 71b0009..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_closeness_centrality.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -Tests for degree centrality. -""" -from nose.tools import * -import networkx as nx - -class TestClosenessCentrality: - def setUp(self): - - self.K = nx.krackhardt_kite_graph() - self.P3 = nx.path_graph(3) - self.P4 = nx.path_graph(4) - self.K5 = nx.complete_graph(5) - - self.C4=nx.cycle_graph(4) - self.T=nx.balanced_tree(r=2, h=2) - self.Gb = nx.Graph() - self.Gb.add_edges_from([(0,1), (0,2), (1,3), (2,3), - (2,4), (4,5), (3,5)]) - - - F = nx.florentine_families_graph() - self.F = F - - - def test_k5_closeness(self): - c=nx.closeness_centrality(self.K5) - d={0: 1.000, - 1: 1.000, - 2: 1.000, - 3: 1.000, - 4: 1.000} - for n in sorted(self.K5): - assert_almost_equal(c[n],d[n],places=3) - - def test_p3_closeness(self): - c=nx.closeness_centrality(self.P3) - d={0: 0.667, - 1: 1.000, - 2: 0.667} - for n in sorted(self.P3): - assert_almost_equal(c[n],d[n],places=3) - - def test_krackhardt_closeness(self): - c=nx.closeness_centrality(self.K) - d={0: 0.529, - 1: 0.529, - 2: 0.500, - 3: 0.600, - 4: 0.500, - 5: 0.643, - 6: 0.643, - 7: 0.600, - 8: 0.429, - 9: 0.310} - for n in sorted(self.K): - assert_almost_equal(c[n],d[n],places=3) - - def test_florentine_families_closeness(self): - c=nx.closeness_centrality(self.F) - d={'Acciaiuoli': 0.368, - 'Albizzi': 0.483, - 'Barbadori': 0.4375, - 'Bischeri': 0.400, - 'Castellani': 0.389, - 'Ginori': 0.333, - 'Guadagni': 0.467, - 'Lamberteschi': 0.326, - 'Medici': 0.560, - 'Pazzi': 0.286, - 'Peruzzi': 0.368, - 'Ridolfi': 0.500, - 'Salviati': 0.389, - 'Strozzi': 0.4375, - 'Tornabuoni': 0.483} - for n in sorted(self.F): - assert_almost_equal(c[n],d[n],places=3) - - def test_weighted_closeness(self): - XG=nx.Graph() - XG.add_weighted_edges_from([('s','u',10), ('s','x',5), ('u','v',1), - ('u','x',2), ('v','y',1), ('x','u',3), - ('x','v',5), ('x','y',2), ('y','s',7), - ('y','v',6)]) - c=nx.closeness_centrality(XG,distance='weight') - d={'y': 0.200, - 'x': 0.286, - 's': 0.138, - 'u': 0.235, - 'v': 0.200} - for n in sorted(XG): - assert_almost_equal(c[n],d[n],places=3) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_communicability.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_communicability.py deleted file mode 100644 index d03be65..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_communicability.py +++ /dev/null @@ -1,134 +0,0 @@ -from collections import defaultdict -from nose.tools import * -from nose import SkipTest -import networkx as nx -from networkx.algorithms.centrality.communicability_alg import * - -class TestCommunicability: - @classmethod - def setupClass(cls): - global numpy - global scipy - try: - import numpy - except ImportError: - raise SkipTest('NumPy not available.') - try: - import scipy - except ImportError: - raise SkipTest('SciPy not available.') - - - def test_communicability_centrality(self): - answer={0: 1.5430806348152433, 1: 1.5430806348152433} - result=communicability_centrality(nx.path_graph(2)) - for k,v in result.items(): - assert_almost_equal(answer[k],result[k],places=7) - - answer1={'1': 1.6445956054135658, - 'Albert': 2.4368257358712189, - 'Aric': 2.4368257358712193, - 'Dan':3.1306328496328168, - 'Franck': 2.3876142275231915} - G1=nx.Graph([('Franck','Aric'),('Aric','Dan'),('Dan','Albert'), - ('Albert','Franck'),('Dan','1'),('Franck','Albert')]) - result1=communicability_centrality(G1) - for k,v in result1.items(): - assert_almost_equal(answer1[k],result1[k],places=7) - result1=communicability_centrality_exp(G1) - for k,v in result1.items(): - assert_almost_equal(answer1[k],result1[k],places=7) - - def test_communicability_betweenness_centrality(self): - answer={0: 0.07017447951484615, 1: 0.71565598701107991, - 2: 0.71565598701107991, 3: 0.07017447951484615} - result=communicability_betweenness_centrality(nx.path_graph(4)) - for k,v in result.items(): - assert_almost_equal(answer[k],result[k],places=7) - - answer1={'1': 0.060039074193949521, - 'Albert': 0.315470761661372, - 'Aric': 0.31547076166137211, - 'Dan': 0.68297778678316201, - 'Franck': 0.21977926617449497} - G1=nx.Graph([('Franck','Aric'), - ('Aric','Dan'),('Dan','Albert'),('Albert','Franck'), - ('Dan','1'),('Franck','Albert')]) - result1=communicability_betweenness_centrality(G1) - for k,v in result1.items(): - assert_almost_equal(answer1[k],result1[k],places=7) - - def test_communicability_betweenness_centrality_small(self): - G = nx.Graph([(1,2)]) - result=communicability_betweenness_centrality(G) - assert_equal(result, {1:0,2:0}) - - - def test_communicability(self): - answer={0 :{0: 1.5430806348152435, - 1: 1.1752011936438012 - }, - 1 :{0: 1.1752011936438012, - 1: 1.5430806348152435 - } - } -# answer={(0, 0): 1.5430806348152435, -# (0, 1): 1.1752011936438012, -# (1, 0): 1.1752011936438012, -# (1, 1): 1.5430806348152435} - - result=communicability(nx.path_graph(2)) - for k1,val in result.items(): - for k2 in val: - assert_almost_equal(answer[k1][k2],result[k1][k2],places=7) - - def test_communicability2(self): - - answer_orig ={('1', '1'): 1.6445956054135658, - ('1', 'Albert'): 0.7430186221096251, - ('1', 'Aric'): 0.7430186221096251, - ('1', 'Dan'): 1.6208126320442937, - ('1', 'Franck'): 0.42639707170035257, - ('Albert', '1'): 0.7430186221096251, - ('Albert', 'Albert'): 2.4368257358712189, - ('Albert', 'Aric'): 1.4368257358712191, - ('Albert', 'Dan'): 2.0472097037446453, - ('Albert', 'Franck'): 1.8340111678944691, - ('Aric', '1'): 0.7430186221096251, - ('Aric', 'Albert'): 1.4368257358712191, - ('Aric', 'Aric'): 2.4368257358712193, - ('Aric', 'Dan'): 2.0472097037446457, - ('Aric', 'Franck'): 1.8340111678944691, - ('Dan', '1'): 1.6208126320442937, - ('Dan', 'Albert'): 2.0472097037446453, - ('Dan', 'Aric'): 2.0472097037446457, - ('Dan', 'Dan'): 3.1306328496328168, - ('Dan', 'Franck'): 1.4860372442192515, - ('Franck', '1'): 0.42639707170035257, - ('Franck', 'Albert'): 1.8340111678944691, - ('Franck', 'Aric'): 1.8340111678944691, - ('Franck', 'Dan'): 1.4860372442192515, - ('Franck', 'Franck'): 2.3876142275231915} - - answer=defaultdict(dict) - for (k1,k2),v in answer_orig.items(): - answer[k1][k2]=v - - G1=nx.Graph([('Franck','Aric'),('Aric','Dan'),('Dan','Albert'), - ('Albert','Franck'),('Dan','1'),('Franck','Albert')]) - - result=communicability(G1) - for k1,val in result.items(): - for k2 in val: - assert_almost_equal(answer[k1][k2],result[k1][k2],places=7) - - result=communicability_exp(G1) - for k1,val in result.items(): - for k2 in val: - assert_almost_equal(answer[k1][k2],result[k1][k2],places=7) - - - def test_estrada_index(self): - answer=1041.2470334195475 - result=estrada_index(nx.karate_club_graph()) - assert_almost_equal(answer,result,places=7) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py deleted file mode 100644 index 46e8a2d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +++ /dev/null @@ -1,211 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx -from nose.plugins.attrib import attr - -from networkx import edge_current_flow_betweenness_centrality \ - as edge_current_flow - -from networkx import approximate_current_flow_betweenness_centrality \ - as approximate_cfbc - -class TestFlowBetweennessCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - import scipy - except ImportError: - raise SkipTest('NumPy not available.') - - def test_K4_normalized(self): - """Betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - b_answer={0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - G.add_edge(0,1,{'weight':0.5,'other':0.3}) - b=networkx.current_flow_betweenness_centrality(G,normalized=True,weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - wb_answer={0: 0.2222222, 1: 0.2222222, 2: 0.30555555, 3: 0.30555555} - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],wb_answer[n]) - wb_answer={0: 0.2051282, 1: 0.2051282, 2: 0.33974358, 3: 0.33974358} - b=networkx.current_flow_betweenness_centrality(G,normalized=True,weight='other') - for n in sorted(G): - assert_almost_equal(b[n],wb_answer[n]) - - def test_K4(self): - """Betweenness centrality: K4""" - G=networkx.complete_graph(4) - for solver in ['full','lu','cg']: - b=networkx.current_flow_betweenness_centrality(G, normalized=False, - solver=solver) - b_answer={0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P4_normalized(self): - """Betweenness centrality: P4 normalized""" - G=networkx.path_graph(4) - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - b_answer={0: 0, 1: 2./3, 2: 2./3, 3:0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P4(self): - """Betweenness centrality: P4""" - G=networkx.path_graph(4) - b=networkx.current_flow_betweenness_centrality(G,normalized=False) - b_answer={0: 0, 1: 2, 2: 2, 3: 0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_star(self): - """Betweenness centrality: star """ - G=networkx.Graph() - G.add_star(['a','b','c','d']) - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - b_answer={'a': 1.0, 'b': 0.0, 'c': 0.0, 'd':0.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - - def test_solers(self): - """Betweenness centrality: alternate solvers""" - G=networkx.complete_graph(4) - for solver in ['full','lu','cg']: - b=networkx.current_flow_betweenness_centrality(G,normalized=False, - solver=solver) - b_answer={0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - -class TestApproximateFlowBetweennessCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - global assert_allclose - try: - import numpy as np - import scipy - from numpy.testing import assert_allclose - except ImportError: - raise SkipTest('NumPy not available.') - - def test_K4_normalized(self): - "Approximate current-flow betweenness centrality: K4 normalized" - G=networkx.complete_graph(4) - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - epsilon=0.1 - ba = approximate_cfbc(G,normalized=True, epsilon=0.5*epsilon) - for n in sorted(G): - assert_allclose(b[n],ba[n],atol=epsilon) - - def test_K4(self): - "Approximate current-flow betweenness centrality: K4" - G=networkx.complete_graph(4) - b=networkx.current_flow_betweenness_centrality(G,normalized=False) - epsilon=0.1 - ba = approximate_cfbc(G,normalized=False, epsilon=0.5*epsilon) - for n in sorted(G): - assert_allclose(b[n],ba[n],atol=epsilon*len(G)**2) - - def test_star(self): - "Approximate current-flow betweenness centrality: star" - G=networkx.Graph() - G.add_star(['a','b','c','d']) - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - epsilon=0.1 - ba = approximate_cfbc(G,normalized=True, epsilon=0.5*epsilon) - for n in sorted(G): - assert_allclose(b[n],ba[n],atol=epsilon) - - def test_grid(self): - "Approximate current-flow betweenness centrality: 2d grid" - G=networkx.grid_2d_graph(4,4) - b=networkx.current_flow_betweenness_centrality(G,normalized=True) - epsilon=0.1 - ba = approximate_cfbc(G,normalized=True, epsilon=0.5*epsilon) - for n in sorted(G): - assert_allclose(b[n],ba[n],atol=epsilon) - - def test_solvers(self): - "Approximate current-flow betweenness centrality: solvers" - G=networkx.complete_graph(4) - epsilon=0.1 - for solver in ['full','lu','cg']: - b=approximate_cfbc(G,normalized=False,solver=solver, - epsilon=0.5*epsilon) - b_answer={0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75} - for n in sorted(G): - assert_allclose(b[n],b_answer[n],atol=epsilon) - - - - - -class TestWeightedFlowBetweennessCentrality(object): - pass - - -class TestEdgeFlowBetweennessCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - import scipy - except ImportError: - raise SkipTest('NumPy not available.') - - def test_K4(self): - """Edge flow betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=edge_current_flow(G,normalized=True) - b_answer=dict.fromkeys(G.edges(),0.25) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - def test_K4_normalized(self): - """Edge flow betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=edge_current_flow(G,normalized=False) - b_answer=dict.fromkeys(G.edges(),0.75) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - def test_C4(self): - """Edge flow betweenness centrality: C4""" - G=networkx.cycle_graph(4) - b=edge_current_flow(G,normalized=False) - b_answer={(0, 1):1.25,(0, 3):1.25, (1, 2):1.25, (2, 3): 1.25} - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - - def test_P4(self): - """Edge betweenness centrality: P4""" - G=networkx.path_graph(4) - b=edge_current_flow(G,normalized=False) - b_answer={(0, 1):1.5,(1, 2):2.0, (2, 3):1.5} - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py deleted file mode 100644 index 4c7acd6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx -from nose.plugins.attrib import attr - -from networkx import edge_current_flow_betweenness_centrality \ - as edge_current_flow - -from networkx import edge_current_flow_betweenness_centrality_subset \ - as edge_current_flow_subset - -class TestFlowBetweennessCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - import scipy - except ImportError: - raise SkipTest('NumPy not available.') - - - def test_K4_normalized(self): - """Betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True) - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_K4(self): - """Betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True) - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - # test weighted network - G.add_edge(0,1,{'weight':0.5,'other':0.3}) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True, - weight=None) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True) - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True, - weight='other') - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True,weight='other') - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P4_normalized(self): - """Betweenness centrality: P4 normalized""" - G=networkx.path_graph(4) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True) - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P4(self): - """Betweenness centrality: P4""" - G=networkx.path_graph(4) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True) - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_star(self): - """Betweenness centrality: star """ - G=networkx.Graph() - G.add_star(['a','b','c','d']) - b=networkx.current_flow_betweenness_centrality_subset(G, - G.nodes(), - G.nodes(), - normalized=True) - b_answer=networkx.current_flow_betweenness_centrality(G,normalized=True) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - -# class TestWeightedFlowBetweennessCentrality(): -# pass - - -class TestEdgeFlowBetweennessCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - import scipy - except ImportError: - raise SkipTest('NumPy not available.') - - def test_K4_normalized(self): - """Betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=True) - b_answer=edge_current_flow(G,normalized=True) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - def test_K4(self): - """Betweenness centrality: K4""" - G=networkx.complete_graph(4) - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=False) - b_answer=edge_current_flow(G,normalized=False) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - # test weighted network - G.add_edge(0,1,{'weight':0.5,'other':0.3}) - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=False,weight=None) - # weight is None => same as unweighted network - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=False) - b_answer=edge_current_flow(G,normalized=False) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=False,weight='other') - b_answer=edge_current_flow(G,normalized=False,weight='other') - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - - def test_C4(self): - """Edge betweenness centrality: C4""" - G=networkx.cycle_graph(4) - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=True) - b_answer=edge_current_flow(G,normalized=True) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - - - def test_P4(self): - """Edge betweenness centrality: P4""" - G=networkx.path_graph(4) - b=edge_current_flow_subset(G,G.nodes(),G.nodes(),normalized=True) - b_answer=edge_current_flow(G,normalized=True) - for (s,t),v1 in b_answer.items(): - v2=b.get((s,t),b.get((t,s))) - assert_almost_equal(v1,v2) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_closeness.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_closeness.py deleted file mode 100644 index 28598d4..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx - -class TestFlowClosenessCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - import scipy - except ImportError: - raise SkipTest('NumPy not available.') - - - def test_K4(self): - """Closeness centrality: K4""" - G=networkx.complete_graph(4) - b=networkx.current_flow_closeness_centrality(G,normalized=True) - b_answer={0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P4_normalized(self): - """Closeness centrality: P4 normalized""" - G=networkx.path_graph(4) - b=networkx.current_flow_closeness_centrality(G,normalized=True) - b_answer={0: 1./2, 1: 3./4, 2: 3./4, 3:1./2} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - def test_P4(self): - """Closeness centrality: P4""" - G=networkx.path_graph(4) - b=networkx.current_flow_closeness_centrality(G,normalized=False) - b_answer={0: 1.0/6, 1: 1.0/4, 2: 1.0/4, 3:1.0/6} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - def test_star(self): - """Closeness centrality: star """ - G=networkx.Graph() - G.add_star(['a','b','c','d']) - b=networkx.current_flow_closeness_centrality(G,normalized=True) - b_answer={'a': 1.0, 'b': 0.6, 'c': 0.6, 'd':0.6} - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - -class TestWeightedFlowClosenessCentrality(object): - pass diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_degree_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_degree_centrality.py deleted file mode 100644 index 9109ddc..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_degree_centrality.py +++ /dev/null @@ -1,92 +0,0 @@ -""" - Unit tests for degree centrality. -""" - -from nose.tools import * - -import networkx as nx - - -class TestDegreeCentrality: - def __init__(self): - - self.K = nx.krackhardt_kite_graph() - self.P3 = nx.path_graph(3) - self.K5 = nx.complete_graph(5) - - F = nx.Graph() # Florentine families - F.add_edge('Acciaiuoli','Medici') - F.add_edge('Castellani','Peruzzi') - F.add_edge('Castellani','Strozzi') - F.add_edge('Castellani','Barbadori') - F.add_edge('Medici','Barbadori') - F.add_edge('Medici','Ridolfi') - F.add_edge('Medici','Tornabuoni') - F.add_edge('Medici','Albizzi') - F.add_edge('Medici','Salviati') - F.add_edge('Salviati','Pazzi') - F.add_edge('Peruzzi','Strozzi') - F.add_edge('Peruzzi','Bischeri') - F.add_edge('Strozzi','Ridolfi') - F.add_edge('Strozzi','Bischeri') - F.add_edge('Ridolfi','Tornabuoni') - F.add_edge('Tornabuoni','Guadagni') - F.add_edge('Albizzi','Ginori') - F.add_edge('Albizzi','Guadagni') - F.add_edge('Bischeri','Guadagni') - F.add_edge('Guadagni','Lamberteschi') - self.F = F - - G = nx.DiGraph() - G.add_edge(0,5) - G.add_edge(1,5) - G.add_edge(2,5) - G.add_edge(3,5) - G.add_edge(4,5) - G.add_edge(5,6) - G.add_edge(5,7) - G.add_edge(5,8) - self.G = G - - def test_degree_centrality_1(self): - d = nx.degree_centrality(self.K5) - exact = dict(zip(range(5), [1]*5)) - for n,dc in d.items(): - assert_almost_equal(exact[n], dc) - - def test_degree_centrality_2(self): - d = nx.degree_centrality(self.P3) - exact = {0:0.5, 1:1, 2:0.5} - for n,dc in d.items(): - assert_almost_equal(exact[n], dc) - - def test_degree_centrality_3(self): - d = nx.degree_centrality(self.K) - exact = {0:.444, 1:.444, 2:.333, 3:.667, 4:.333, - 5:.556, 6:.556, 7:.333, 8:.222, 9:.111} - for n,dc in d.items(): - assert_almost_equal(exact[n], float("%5.3f" % dc)) - - def test_degree_centrality_4(self): - d = nx.degree_centrality(self.F) - names = sorted(self.F.nodes()) - dcs = [0.071, 0.214, 0.143, 0.214, 0.214, 0.071, 0.286, - 0.071, 0.429, 0.071, 0.214, 0.214, 0.143, 0.286, 0.214] - exact = dict(zip(names, dcs)) - for n,dc in d.items(): - assert_almost_equal(exact[n], float("%5.3f" % dc)) - - def test_indegree_centrality(self): - d = nx.in_degree_centrality(self.G) - exact = {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, - 5: 0.625, 6: 0.125, 7: 0.125, 8: 0.125} - for n,dc in d.items(): - assert_almost_equal(exact[n], dc) - - def test_outdegree_centrality(self): - d = nx.out_degree_centrality(self.G) - exact = {0: 0.125, 1: 0.125, 2: 0.125, 3: 0.125, - 4: 0.125, 5: 0.375, 6: 0.0, 7: 0.0, 8: 0.0} - for n,dc in d.items(): - assert_almost_equal(exact[n], dc) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py deleted file mode 100644 index 22b859c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python -import math -from nose import SkipTest -from nose.tools import * -import networkx - -class TestEigenvectorCentrality(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - except ImportError: - raise SkipTest('NumPy not available.') - - def test_K5(self): - """Eigenvector centrality: K5""" - G=networkx.complete_graph(5) - b=networkx.eigenvector_centrality(G) - v=math.sqrt(1/5.0) - b_answer=dict.fromkeys(G,v) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - nstart = dict([(n,1) for n in G]) - b=networkx.eigenvector_centrality(G,nstart=nstart) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n]) - - - b=networkx.eigenvector_centrality_numpy(G) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=3) - - - def test_P3(self): - """Eigenvector centrality: P3""" - G=networkx.path_graph(3) - b_answer={0: 0.5, 1: 0.7071, 2: 0.5} - b=networkx.eigenvector_centrality_numpy(G) - for n in sorted(G): - assert_almost_equal(b[n],b_answer[n],places=4) - - - @raises(networkx.NetworkXError) - def test_maxiter(self): - G=networkx.path_graph(3) - b=networkx.eigenvector_centrality(G,max_iter=0) - -class TestEigenvectorCentralityDirected(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - except ImportError: - raise SkipTest('NumPy not available.') - - def setUp(self): - - G=networkx.DiGraph() - - edges=[(1,2),(1,3),(2,4),(3,2),(3,5),(4,2),(4,5),(4,6),\ - (5,6),(5,7),(5,8),(6,8),(7,1),(7,5),\ - (7,8),(8,6),(8,7)] - - G.add_edges_from(edges,weight=2.0) - self.G=G - self.G.evc=[0.25368793, 0.19576478, 0.32817092, 0.40430835, - 0.48199885, 0.15724483, 0.51346196, 0.32475403] - - H=networkx.DiGraph() - - edges=[(1,2),(1,3),(2,4),(3,2),(3,5),(4,2),(4,5),(4,6),\ - (5,6),(5,7),(5,8),(6,8),(7,1),(7,5),\ - (7,8),(8,6),(8,7)] - - G.add_edges_from(edges) - self.H=G - self.H.evc=[0.25368793, 0.19576478, 0.32817092, 0.40430835, - 0.48199885, 0.15724483, 0.51346196, 0.32475403] - - - def test_eigenvector_centrality_weighted(self): - G=self.G - p=networkx.eigenvector_centrality_numpy(G) - for (a,b) in zip(list(p.values()),self.G.evc): - assert_almost_equal(a,b) - - def test_eigenvector_centrality_unweighted(self): - G=self.H - p=networkx.eigenvector_centrality_numpy(G) - for (a,b) in zip(list(p.values()),self.G.evc): - assert_almost_equal(a,b) - - -class TestEigenvectorCentralityExceptions(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - except ImportError: - raise SkipTest('NumPy not available.') - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @raises(networkx.NetworkXException) - def test_multigraph(self): - e = networkx.eigenvector_centrality(networkx.MultiGraph()) - - @raises(networkx.NetworkXException) - def test_multigraph_numpy(self): - e = networkx.eigenvector_centrality_numpy(networkx.MultiGraph()) - - - @raises(networkx.NetworkXException) - def test_empty(self): - e = networkx.eigenvector_centrality(networkx.Graph()) - - @raises(networkx.NetworkXException) - def test_empty_numpy(self): - e = networkx.eigenvector_centrality_numpy(networkx.Graph()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_katz_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_katz_centrality.py deleted file mode 100644 index 9e8e6d2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_katz_centrality.py +++ /dev/null @@ -1,289 +0,0 @@ -# -*- coding: utf-8 -*- -import math -from nose import SkipTest -from nose.tools import * -import networkx - -class TestKatzCentrality(object): - - def test_K5(self): - """Katz centrality: K5""" - G = networkx.complete_graph(5) - alpha = 0.1 - b = networkx.katz_centrality(G, alpha) - v = math.sqrt(1 / 5.0) - b_answer = dict.fromkeys(G, v) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n]) - nstart = dict([(n, 1) for n in G]) - b = networkx.katz_centrality(G, alpha, nstart=nstart) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n]) - - def test_P3(self): - """Katz centrality: P3""" - alpha = 0.1 - G = networkx.path_graph(3) - b_answer = {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162} - b = networkx.katz_centrality(G, alpha) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=4) - - @raises(networkx.NetworkXError) - def test_maxiter(self): - alpha = 0.1 - G = networkx.path_graph(3) - b = networkx.katz_centrality(G, alpha, max_iter=0) - - def test_beta_as_scalar(self): - alpha = 0.1 - beta = 0.1 - b_answer = {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162} - G = networkx.path_graph(3) - b = networkx.katz_centrality(G, alpha, beta) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=4) - - def test_beta_as_dict(self): - alpha = 0.1 - beta = {0: 1.0, 1: 1.0, 2: 1.0} - b_answer = {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162} - G = networkx.path_graph(3) - b = networkx.katz_centrality(G, alpha, beta) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=4) - - - def test_multiple_alpha(self): - alpha_list = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] - for alpha in alpha_list: - b_answer = {0.1: {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162}, - 0.2: {0: 0.5454545454545454, 1: 0.6363636363636365, - 2: 0.5454545454545454}, - 0.3: {0: 0.5333964609104419, 1: 0.6564879518897746, - 2: 0.5333964609104419}, - 0.4: {0: 0.5232045649263551, 1: 0.6726915834767423, - 2: 0.5232045649263551}, - 0.5: {0: 0.5144957746691622, 1: 0.6859943117075809, - 2: 0.5144957746691622}, - 0.6: {0: 0.5069794004195823, 1: 0.6970966755769258, - 2: 0.5069794004195823}} - G = networkx.path_graph(3) - b = networkx.katz_centrality(G, alpha) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[alpha][n], places=4) - - @raises(networkx.NetworkXException) - def test_multigraph(self): - e = networkx.katz_centrality(networkx.MultiGraph(), 0.1) - - def test_empty(self): - e = networkx.katz_centrality(networkx.Graph(), 0.1) - assert_equal(e, {}) - - @raises(networkx.NetworkXException) - def test_bad_beta(self): - G = networkx.Graph([(0,1)]) - beta = {0:77} - e = networkx.katz_centrality(G, 0.1,beta=beta) - - @raises(networkx.NetworkXException) - def test_bad_beta_numbe(self): - G = networkx.Graph([(0,1)]) - e = networkx.katz_centrality(G, 0.1,beta='foo') - - -class TestKatzCentralityNumpy(object): - numpy = 1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - except ImportError: - raise SkipTest('NumPy not available.') - - def test_K5(self): - """Katz centrality: K5""" - G = networkx.complete_graph(5) - alpha = 0.1 - b = networkx.katz_centrality(G, alpha) - v = math.sqrt(1 / 5.0) - b_answer = dict.fromkeys(G, v) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n]) - nstart = dict([(n, 1) for n in G]) - b = networkx.eigenvector_centrality_numpy(G) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=3) - - def test_P3(self): - """Katz centrality: P3""" - alpha = 0.1 - G = networkx.path_graph(3) - b_answer = {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162} - b = networkx.katz_centrality_numpy(G, alpha) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=4) - - - def test_beta_as_scalar(self): - alpha = 0.1 - beta = 0.1 - b_answer = {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162} - G = networkx.path_graph(3) - b = networkx.katz_centrality_numpy(G, alpha, beta) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=4) - - - def test_beta_as_dict(self): - alpha = 0.1 - beta = {0: 1.0, 1: 1.0, 2: 1.0} - b_answer = {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162} - G = networkx.path_graph(3) - b = networkx.katz_centrality_numpy(G, alpha, beta) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[n], places=4) - - - def test_multiple_alpha(self): - alpha_list = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] - for alpha in alpha_list: - b_answer = {0.1: {0: 0.5598852584152165, 1: 0.6107839182711449, - 2: 0.5598852584152162}, - 0.2: {0: 0.5454545454545454, 1: 0.6363636363636365, - 2: 0.5454545454545454}, - 0.3: {0: 0.5333964609104419, 1: 0.6564879518897746, - 2: 0.5333964609104419}, - 0.4: {0: 0.5232045649263551, 1: 0.6726915834767423, - 2: 0.5232045649263551}, - 0.5: {0: 0.5144957746691622, 1: 0.6859943117075809, - 2: 0.5144957746691622}, - 0.6: {0: 0.5069794004195823, 1: 0.6970966755769258, - 2: 0.5069794004195823}} - G = networkx.path_graph(3) - b = networkx.katz_centrality_numpy(G, alpha) - for n in sorted(G): - assert_almost_equal(b[n], b_answer[alpha][n], places=4) - - @raises(networkx.NetworkXException) - def test_multigraph(self): - e = networkx.katz_centrality(networkx.MultiGraph(), 0.1) - - def test_empty(self): - e = networkx.katz_centrality(networkx.Graph(), 0.1) - assert_equal(e, {}) - - @raises(networkx.NetworkXException) - def test_bad_beta(self): - G = networkx.Graph([(0,1)]) - beta = {0:77} - e = networkx.katz_centrality_numpy(G, 0.1,beta=beta) - - @raises(networkx.NetworkXException) - def test_bad_beta_numbe(self): - G = networkx.Graph([(0,1)]) - e = networkx.katz_centrality_numpy(G, 0.1,beta='foo') - - -class TestKatzCentralityDirected(object): - def setUp(self): - G = networkx.DiGraph() - edges = [(1, 2),(1, 3),(2, 4),(3, 2),(3, 5),(4, 2),(4, 5),(4, 6),(5, 6), - (5, 7),(5, 8),(6, 8),(7, 1),(7, 5),(7, 8),(8, 6),(8, 7)] - G.add_edges_from(edges, weight=2.0) - self.G = G - self.G.alpha = 0.1 - self.G.evc = [ - 0.3289589783189635, - 0.2832077296243516, - 0.3425906003685471, - 0.3970420865198392, - 0.41074871061646284, - 0.272257430756461, - 0.4201989685435462, - 0.34229059218038554, - ] - - H = networkx.DiGraph(edges) - self.H = G - self.H.alpha = 0.1 - self.H.evc = [ - 0.3289589783189635, - 0.2832077296243516, - 0.3425906003685471, - 0.3970420865198392, - 0.41074871061646284, - 0.272257430756461, - 0.4201989685435462, - 0.34229059218038554, - ] - - def test_eigenvector_centrality_weighted(self): - G = self.G - alpha = self.G.alpha - p = networkx.katz_centrality(G, alpha) - for (a, b) in zip(list(p.values()), self.G.evc): - assert_almost_equal(a, b) - - def test_eigenvector_centrality_unweighted(self): - G = self.H - alpha = self.H.alpha - p = networkx.katz_centrality(G, alpha) - for (a, b) in zip(list(p.values()), self.G.evc): - assert_almost_equal(a, b) - - -class TestKatzCentralityDirectedNumpy(TestKatzCentralityDirected): - numpy = 1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - - @classmethod - def setupClass(cls): - global np - try: - import numpy as np - except ImportError: - raise SkipTest('NumPy not available.') - - def test_eigenvector_centrality_weighted(self): - G = self.G - alpha = self.G.alpha - p = networkx.katz_centrality_numpy(G, alpha) - for (a, b) in zip(list(p.values()), self.G.evc): - assert_almost_equal(a, b) - - def test_eigenvector_centrality_unweighted(self): - G = self.H - alpha = self.H.alpha - p = networkx.katz_centrality_numpy(G, alpha) - for (a, b) in zip(list(p.values()), self.G.evc): - assert_almost_equal(a, b) - -class TestKatzEigenvectorVKatz(object): - numpy = 1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - - @classmethod - def setupClass(cls): - global np - global eigvals - try: - import numpy as np - from numpy.linalg import eigvals - except ImportError: - raise SkipTest('NumPy not available.') - - def test_eigenvector_v_katz_random(self): - G = networkx.gnp_random_graph(10,0.5) - l = float(max(eigvals(networkx.adjacency_matrix(G)))) - e = networkx.eigenvector_centrality_numpy(G) - k = networkx.katz_centrality_numpy(G, 1.0/l) - for n in G: - assert_almost_equal(e[n], k[n]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_load_centrality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_load_centrality.py deleted file mode 100644 index 8939d26..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/tests/test_load_centrality.py +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - - -class TestLoadCentrality: - - def setUp(self): - - G=nx.Graph(); - G.add_edge(0,1,weight=3) - G.add_edge(0,2,weight=2) - G.add_edge(0,3,weight=6) - G.add_edge(0,4,weight=4) - G.add_edge(1,3,weight=5) - G.add_edge(1,5,weight=5) - G.add_edge(2,4,weight=1) - G.add_edge(3,4,weight=2) - G.add_edge(3,5,weight=1) - G.add_edge(4,5,weight=4) - self.G=G - self.exact_weighted={0: 4.0, 1: 0.0, 2: 8.0, 3: 6.0, 4: 8.0, 5: 0.0} - self.K = nx.krackhardt_kite_graph() - self.P3 = nx.path_graph(3) - self.P4 = nx.path_graph(4) - self.K5 = nx.complete_graph(5) - - self.C4=nx.cycle_graph(4) - self.T=nx.balanced_tree(r=2, h=2) - self.Gb = nx.Graph() - self.Gb.add_edges_from([(0, 1), (0, 2), (1, 3), (2, 3), - (2, 4), (4, 5), (3, 5)]) - self.F = nx.florentine_families_graph() - self.D = nx.cycle_graph(3, create_using=nx.DiGraph()) - self.D.add_edges_from([(3, 0), (4, 3)]) - - def test_not_strongly_connected(self): - b = nx.load_centrality(self.D) - result = {0: 5./12, - 1: 1./4, - 2: 1./12, - 3: 1./4, - 4: 0.000} - for n in sorted(self.D): - assert_almost_equal(result[n], b[n], places=3) - assert_almost_equal(result[n], nx.load_centrality(self.D, n), places=3) - - def test_weighted_load(self): - b=nx.load_centrality(self.G,weight='weight',normalized=False) - for n in sorted(self.G): - assert_equal(b[n],self.exact_weighted[n]) - - def test_k5_load(self): - G=self.K5 - c=nx.load_centrality(G) - d={0: 0.000, - 1: 0.000, - 2: 0.000, - 3: 0.000, - 4: 0.000} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - def test_p3_load(self): - G=self.P3 - c=nx.load_centrality(G) - d={0: 0.000, - 1: 1.000, - 2: 0.000} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - c=nx.load_centrality(G,v=1) - assert_almost_equal(c,1.0) - c=nx.load_centrality(G,v=1,normalized=True) - assert_almost_equal(c,1.0) - - - def test_p2_load(self): - G=nx.path_graph(2) - c=nx.load_centrality(G) - d={0: 0.000, - 1: 0.000} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - - def test_krackhardt_load(self): - G=self.K - c=nx.load_centrality(G) - d={0: 0.023, - 1: 0.023, - 2: 0.000, - 3: 0.102, - 4: 0.000, - 5: 0.231, - 6: 0.231, - 7: 0.389, - 8: 0.222, - 9: 0.000} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - def test_florentine_families_load(self): - G=self.F - c=nx.load_centrality(G) - d={'Acciaiuoli': 0.000, - 'Albizzi': 0.211, - 'Barbadori': 0.093, - 'Bischeri': 0.104, - 'Castellani': 0.055, - 'Ginori': 0.000, - 'Guadagni': 0.251, - 'Lamberteschi': 0.000, - 'Medici': 0.522, - 'Pazzi': 0.000, - 'Peruzzi': 0.022, - 'Ridolfi': 0.117, - 'Salviati': 0.143, - 'Strozzi': 0.106, - 'Tornabuoni': 0.090} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - - def test_unnormalized_k5_load(self): - G=self.K5 - c=nx.load_centrality(G,normalized=False) - d={0: 0.000, - 1: 0.000, - 2: 0.000, - 3: 0.000, - 4: 0.000} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - def test_unnormalized_p3_load(self): - G=self.P3 - c=nx.load_centrality(G,normalized=False) - d={0: 0.000, - 1: 2.000, - 2: 0.000} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - - def test_unnormalized_krackhardt_load(self): - G=self.K - c=nx.load_centrality(G,normalized=False) - d={0: 1.667, - 1: 1.667, - 2: 0.000, - 3: 7.333, - 4: 0.000, - 5: 16.667, - 6: 16.667, - 7: 28.000, - 8: 16.000, - 9: 0.000} - - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - def test_unnormalized_florentine_families_load(self): - G=self.F - c=nx.load_centrality(G,normalized=False) - - d={'Acciaiuoli': 0.000, - 'Albizzi': 38.333, - 'Barbadori': 17.000, - 'Bischeri': 19.000, - 'Castellani': 10.000, - 'Ginori': 0.000, - 'Guadagni': 45.667, - 'Lamberteschi': 0.000, - 'Medici': 95.000, - 'Pazzi': 0.000, - 'Peruzzi': 4.000, - 'Ridolfi': 21.333, - 'Salviati': 26.000, - 'Strozzi': 19.333, - 'Tornabuoni': 16.333} - for n in sorted(G): - assert_almost_equal(c[n],d[n],places=3) - - - def test_load_betweenness_difference(self): - # Difference Between Load and Betweenness - # --------------------------------------- The smallest graph - # that shows the difference between load and betweenness is - # G=ladder_graph(3) (Graph B below) - - # Graph A and B are from Tao Zhou, Jian-Guo Liu, Bing-Hong - # Wang: Comment on ``Scientific collaboration - # networks. II. Shortest paths, weighted networks, and - # centrality". http://arxiv.org/pdf/physics/0511084 - - # Notice that unlike here, their calculation adds to 1 to the - # betweennes of every node i for every path from i to every - # other node. This is exactly what it should be, based on - # Eqn. (1) in their paper: the eqn is B(v) = \sum_{s\neq t, - # s\neq v}{\frac{\sigma_{st}(v)}{\sigma_{st}}}, therefore, - # they allow v to be the target node. - - # We follow Brandes 2001, who follows Freeman 1977 that make - # the sum for betweenness of v exclude paths where v is either - # the source or target node. To agree with their numbers, we - # must additionally, remove edge (4,8) from the graph, see AC - # example following (there is a mistake in the figure in their - # paper - personal communication). - - # A = nx.Graph() - # A.add_edges_from([(0,1), (1,2), (1,3), (2,4), - # (3,5), (4,6), (4,7), (4,8), - # (5,8), (6,9), (7,9), (8,9)]) - B = nx.Graph() # ladder_graph(3) - B.add_edges_from([(0,1), (0,2), (1,3), (2,3), (2,4), (4,5), (3,5)]) - c = nx.load_centrality(B,normalized=False) - d={0: 1.750, - 1: 1.750, - 2: 6.500, - 3: 6.500, - 4: 1.750, - 5: 1.750} - for n in sorted(B): - assert_almost_equal(c[n],d[n],places=3) - - - def test_c4_edge_load(self): - G=self.C4 - c = nx.edge_load(G) - d={(0, 1): 6.000, - (0, 3): 6.000, - (1, 2): 6.000, - (2, 3): 6.000} - for n in G.edges(): - assert_almost_equal(c[n],d[n],places=3) - - def test_p4_edge_load(self): - G=self.P4 - c = nx.edge_load(G) - d={(0, 1): 6.000, - (1, 2): 8.000, - (2, 3): 6.000} - for n in G.edges(): - assert_almost_equal(c[n],d[n],places=3) - - def test_k5_edge_load(self): - G=self.K5 - c = nx.edge_load(G) - d={(0, 1): 5.000, - (0, 2): 5.000, - (0, 3): 5.000, - (0, 4): 5.000, - (1, 2): 5.000, - (1, 3): 5.000, - (1, 4): 5.000, - (2, 3): 5.000, - (2, 4): 5.000, - (3, 4): 5.000} - for n in G.edges(): - assert_almost_equal(c[n],d[n],places=3) - - def test_tree_edge_load(self): - G=self.T - c = nx.edge_load(G) - d={(0, 1): 24.000, - (0, 2): 24.000, - (1, 3): 12.000, - (1, 4): 12.000, - (2, 5): 12.000, - (2, 6): 12.000} - for n in G.edges(): - assert_almost_equal(c[n],d[n],places=3) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/__init__.py deleted file mode 100644 index cf8e951..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from networkx.algorithms.chordal.chordal_alg import * - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/chordal_alg.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/chordal_alg.py deleted file mode 100644 index 8eb6404..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/chordal_alg.py +++ /dev/null @@ -1,347 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Algorithms for chordal graphs. - -A graph is chordal if every cycle of length at least 4 has a chord -(an edge joining two nodes not adjacent in the cycle). -http://en.wikipedia.org/wiki/Chordal_graph -""" -import networkx as nx -import random -import sys - -__authors__ = "\n".join(['Jesus Cerquides <cerquide@iiia.csic.es>']) -# Copyright (C) 2010 by -# Jesus Cerquides <cerquide@iiia.csic.es> -# All rights reserved. -# BSD license. - -__all__ = ['is_chordal', - 'find_induced_nodes', - 'chordal_graph_cliques', - 'chordal_graph_treewidth', - 'NetworkXTreewidthBoundExceeded'] - -class NetworkXTreewidthBoundExceeded(nx.NetworkXException): - """Exception raised when a treewidth bound has been provided and it has - been exceeded""" - - -def is_chordal(G): - """Checks whether G is a chordal graph. - - A graph is chordal if every cycle of length at least 4 has a chord - (an edge joining two nodes not adjacent in the cycle). - - Parameters - ---------- - G : graph - A NetworkX graph. - - Returns - ------- - chordal : bool - True if G is a chordal graph and False otherwise. - - Raises - ------ - NetworkXError - The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. - If the input graph is an instance of one of these classes, a - NetworkXError is raised. - - Examples - -------- - >>> import networkx as nx - >>> e=[(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6)] - >>> G=nx.Graph(e) - >>> nx.is_chordal(G) - True - - Notes - ----- - The routine tries to go through every node following maximum cardinality - search. It returns False when it finds that the separator for any node - is not a clique. Based on the algorithms in [1]_. - - References - ---------- - .. [1] R. E. Tarjan and M. Yannakakis, Simple linear-time algorithms - to test chordality of graphs, test acyclicity of hypergraphs, and - selectively reduce acyclic hypergraphs, SIAM J. Comput., 13 (1984), - pp. 566–579. - """ - if G.is_directed(): - raise nx.NetworkXError('Directed graphs not supported') - if G.is_multigraph(): - raise nx.NetworkXError('Multiply connected graphs not supported.') - if len(_find_chordality_breaker(G))==0: - return True - else: - return False - -def find_induced_nodes(G,s,t,treewidth_bound=sys.maxsize): - """Returns the set of induced nodes in the path from s to t. - - Parameters - ---------- - G : graph - A chordal NetworkX graph - s : node - Source node to look for induced nodes - t : node - Destination node to look for induced nodes - treewith_bound: float - Maximum treewidth acceptable for the graph H. The search - for induced nodes will end as soon as the treewidth_bound is exceeded. - - Returns - ------- - I : Set of nodes - The set of induced nodes in the path from s to t in G - - Raises - ------ - NetworkXError - The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. - If the input graph is an instance of one of these classes, a - NetworkXError is raised. - The algorithm can only be applied to chordal graphs. If - the input graph is found to be non-chordal, a NetworkXError is raised. - - Examples - -------- - >>> import networkx as nx - >>> G=nx.Graph() - >>> G = nx.generators.classic.path_graph(10) - >>> I = nx.find_induced_nodes(G,1,9,2) - >>> list(I) - [1, 2, 3, 4, 5, 6, 7, 8, 9] - - Notes - ----- - G must be a chordal graph and (s,t) an edge that is not in G. - - If a treewidth_bound is provided, the search for induced nodes will end - as soon as the treewidth_bound is exceeded. - - The algorithm is inspired by Algorithm 4 in [1]_. - A formal definition of induced node can also be found on that reference. - - References - ---------- - .. [1] Learning Bounded Treewidth Bayesian Networks. - Gal Elidan, Stephen Gould; JMLR, 9(Dec):2699--2731, 2008. - http://jmlr.csail.mit.edu/papers/volume9/elidan08a/elidan08a.pdf - """ - if not is_chordal(G): - raise nx.NetworkXError("Input graph is not chordal.") - - H = nx.Graph(G) - H.add_edge(s,t) - I = set() - triplet = _find_chordality_breaker(H,s,treewidth_bound) - while triplet: - (u,v,w) = triplet - I.update(triplet) - for n in triplet: - if n!=s: - H.add_edge(s,n) - triplet = _find_chordality_breaker(H,s,treewidth_bound) - if I: - # Add t and the second node in the induced path from s to t. - I.add(t) - for u in G[s]: - if len(I & set(G[u]))==2: - I.add(u) - break - return I - -def chordal_graph_cliques(G): - """Returns the set of maximal cliques of a chordal graph. - - The algorithm breaks the graph in connected components and performs a - maximum cardinality search in each component to get the cliques. - - Parameters - ---------- - G : graph - A NetworkX graph - - Returns - ------- - cliques : A set containing the maximal cliques in G. - - Raises - ------ - NetworkXError - The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. - If the input graph is an instance of one of these classes, a - NetworkXError is raised. - The algorithm can only be applied to chordal graphs. If the - input graph is found to be non-chordal, a NetworkXError is raised. - - Examples - -------- - >>> import networkx as nx - >>> e= [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] - >>> G = nx.Graph(e) - >>> G.add_node(9) - >>> setlist = nx.chordal_graph_cliques(G) - """ - if not is_chordal(G): - raise nx.NetworkXError("Input graph is not chordal.") - - cliques = set() - for C in nx.connected.connected_component_subgraphs(G): - cliques |= _connected_chordal_graph_cliques(C) - - return cliques - - -def chordal_graph_treewidth(G): - """Returns the treewidth of the chordal graph G. - - Parameters - ---------- - G : graph - A NetworkX graph - - Returns - ------- - treewidth : int - The size of the largest clique in the graph minus one. - - Raises - ------ - NetworkXError - The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. - If the input graph is an instance of one of these classes, a - NetworkXError is raised. - The algorithm can only be applied to chordal graphs. If - the input graph is found to be non-chordal, a NetworkXError is raised. - - Examples - -------- - >>> import networkx as nx - >>> e = [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] - >>> G = nx.Graph(e) - >>> G.add_node(9) - >>> nx.chordal_graph_treewidth(G) - 3 - - References - ---------- - .. [1] http://en.wikipedia.org/wiki/Tree_decomposition#Treewidth - """ - if not is_chordal(G): - raise nx.NetworkXError("Input graph is not chordal.") - - max_clique = -1 - for clique in nx.chordal_graph_cliques(G): - max_clique = max(max_clique,len(clique)) - return max_clique - 1 - -def _is_complete_graph(G): - """Returns True if G is a complete graph.""" - if G.number_of_selfloops()>0: - raise nx.NetworkXError("Self loop found in _is_complete_graph()") - n = G.number_of_nodes() - if n < 2: - return True - e = G.number_of_edges() - max_edges = ((n * (n-1))/2) - return e == max_edges - - -def _find_missing_edge(G): - """ Given a non-complete graph G, returns a missing edge.""" - nodes=set(G) - for u in G: - missing=nodes-set(list(G[u].keys())+[u]) - if missing: - return (u,missing.pop()) - - -def _max_cardinality_node(G,choices,wanna_connect): - """Returns a the node in choices that has more connections in G - to nodes in wanna_connect. - """ -# max_number = None - max_number = -1 - for x in choices: - number=len([y for y in G[x] if y in wanna_connect]) - if number > max_number: - max_number = number - max_cardinality_node = x - return max_cardinality_node - - -def _find_chordality_breaker(G,s=None,treewidth_bound=sys.maxsize): - """ Given a graph G, starts a max cardinality search - (starting from s if s is given and from a random node otherwise) - trying to find a non-chordal cycle. - - If it does find one, it returns (u,v,w) where u,v,w are the three - nodes that together with s are involved in the cycle. - """ - - unnumbered = set(G) - if s is None: - s = random.choice(list(unnumbered)) - unnumbered.remove(s) - numbered = set([s]) -# current_treewidth = None - current_treewidth = -1 - while unnumbered:# and current_treewidth <= treewidth_bound: - v = _max_cardinality_node(G,unnumbered,numbered) - unnumbered.remove(v) - numbered.add(v) - clique_wanna_be = set(G[v]) & numbered - sg = G.subgraph(clique_wanna_be) - if _is_complete_graph(sg): - # The graph seems to be chordal by now. We update the treewidth - current_treewidth = max(current_treewidth,len(clique_wanna_be)) - if current_treewidth > treewidth_bound: - raise nx.NetworkXTreewidthBoundExceeded(\ - "treewidth_bound exceeded: %s"%current_treewidth) - else: - # sg is not a clique, - # look for an edge that is not included in sg - (u,w) = _find_missing_edge(sg) - return (u,v,w) - return () - - - -def _connected_chordal_graph_cliques(G): - """Return the set of maximal cliques of a connected chordal graph.""" - if G.number_of_nodes() == 1: - x = frozenset(G.nodes()) - return set([x]) - else: - cliques = set() - unnumbered = set(G.nodes()) - v = random.choice(list(unnumbered)) - unnumbered.remove(v) - numbered = set([v]) - clique_wanna_be = set([v]) - while unnumbered: - v = _max_cardinality_node(G,unnumbered,numbered) - unnumbered.remove(v) - numbered.add(v) - new_clique_wanna_be = set(G.neighbors(v)) & numbered - sg = G.subgraph(clique_wanna_be) - if _is_complete_graph(sg): - new_clique_wanna_be.add(v) - if not new_clique_wanna_be >= clique_wanna_be: - cliques.add(frozenset(clique_wanna_be)) - clique_wanna_be = new_clique_wanna_be - else: - raise nx.NetworkXError("Input graph is not chordal.") - cliques.add(frozenset(clique_wanna_be)) - return cliques - - - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/tests/test_chordal.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/tests/test_chordal.py deleted file mode 100644 index 4ec0b5b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/chordal/tests/test_chordal.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestMCS: - - def setUp(self): - # simple graph - connected_chordal_G=nx.Graph() - connected_chordal_G.add_edges_from([(1,2),(1,3),(2,3),(2,4),(3,4), - (3,5),(3,6),(4,5),(4,6),(5,6)]) - self.connected_chordal_G=connected_chordal_G - - chordal_G = nx.Graph() - chordal_G.add_edges_from([(1,2),(1,3),(2,3),(2,4),(3,4), - (3,5),(3,6),(4,5),(4,6),(5,6),(7,8)]) - chordal_G.add_node(9) - self.chordal_G=chordal_G - - non_chordal_G = nx.Graph() - non_chordal_G.add_edges_from([(1,2),(1,3),(2,4),(2,5),(3,4),(3,5)]) - self.non_chordal_G = non_chordal_G - - def test_is_chordal(self): - assert_false(nx.is_chordal(self.non_chordal_G)) - assert_true(nx.is_chordal(self.chordal_G)) - assert_true(nx.is_chordal(self.connected_chordal_G)) - assert_true(nx.is_chordal(nx.complete_graph(3))) - assert_true(nx.is_chordal(nx.cycle_graph(3))) - assert_false(nx.is_chordal(nx.cycle_graph(5))) - - def test_induced_nodes(self): - G = nx.generators.classic.path_graph(10) - I = nx.find_induced_nodes(G,1,9,2) - assert_equal(I,set([1,2,3,4,5,6,7,8,9])) - assert_raises(nx.NetworkXTreewidthBoundExceeded, - nx.find_induced_nodes,G,1,9,1) - I = nx.find_induced_nodes(self.chordal_G,1,6) - assert_equal(I,set([1,2,4,6])) - assert_raises(nx.NetworkXError, - nx.find_induced_nodes,self.non_chordal_G,1,5) - - def test_chordal_find_cliques(self): - cliques = set([frozenset([9]),frozenset([7,8]),frozenset([1,2,3]), - frozenset([2,3,4]),frozenset([3,4,5,6])]) - assert_equal(nx.chordal_graph_cliques(self.chordal_G),cliques) - - def test_chordal_find_cliques_path(self): - G = nx.path_graph(10) - cliqueset = nx.chordal_graph_cliques(G) - for (u,v) in G.edges_iter(): - assert_true(frozenset([u,v]) in cliqueset - or frozenset([v,u]) in cliqueset) - - def test_chordal_find_cliquesCC(self): - cliques = set([frozenset([1,2,3]),frozenset([2,3,4]), - frozenset([3,4,5,6])]) - assert_equal(nx.chordal_graph_cliques(self.connected_chordal_G),cliques) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/clique.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/clique.py deleted file mode 100644 index 08d9ade..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/clique.py +++ /dev/null @@ -1,516 +0,0 @@ -""" -======= -Cliques -======= - -Find and manipulate cliques of graphs. - -Note that finding the largest clique of a graph has been -shown to be an NP-complete problem; the algorithms here -could take a long time to run. - -http://en.wikipedia.org/wiki/Clique_problem -""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx -from networkx.utils.decorators import * -__author__ = """Dan Schult (dschult@colgate.edu)""" -__all__ = ['find_cliques', 'find_cliques_recursive', 'make_max_clique_graph', - 'make_clique_bipartite' ,'graph_clique_number', - 'graph_number_of_cliques', 'node_clique_number', - 'number_of_cliques', 'cliques_containing_node', - 'project_down', 'project_up'] - - -@not_implemented_for('directed') -def find_cliques(G): - """Search for all maximal cliques in a graph. - - Maximal cliques are the largest complete subgraph containing - a given node. The largest maximal clique is sometimes called - the maximum clique. - - Returns - ------- - generator of lists: genetor of member list for each maximal clique - - See Also - -------- - find_cliques_recursive : - A recursive version of the same algorithm - - Notes - ----- - To obtain a list of cliques, use list(find_cliques(G)). - - Based on the algorithm published by Bron & Kerbosch (1973) [1]_ - as adapated by Tomita, Tanaka and Takahashi (2006) [2]_ - and discussed in Cazals and Karande (2008) [3]_. - The method essentially unrolls the recursion used in - the references to avoid issues of recursion stack depth. - - This algorithm is not suitable for directed graphs. - - This algorithm ignores self-loops and parallel edges as - clique is not conventionally defined with such edges. - - There are often many cliques in graphs. This algorithm can - run out of memory for large graphs. - - References - ---------- - .. [1] Bron, C. and Kerbosch, J. 1973. - Algorithm 457: finding all cliques of an undirected graph. - Commun. ACM 16, 9 (Sep. 1973), 575-577. - http://portal.acm.org/citation.cfm?doid=362342.362367 - - .. [2] Etsuji Tomita, Akira Tanaka, Haruhisa Takahashi, - The worst-case time complexity for generating all maximal - cliques and computational experiments, - Theoretical Computer Science, Volume 363, Issue 1, - Computing and Combinatorics, - 10th Annual International Conference on - Computing and Combinatorics (COCOON 2004), 25 October 2006, Pages 28-42 - http://dx.doi.org/10.1016/j.tcs.2006.06.015 - - .. [3] F. Cazals, C. Karande, - A note on the problem of reporting maximal cliques, - Theoretical Computer Science, - Volume 407, Issues 1-3, 6 November 2008, Pages 564-568, - http://dx.doi.org/10.1016/j.tcs.2008.05.010 - """ - # Cache nbrs and find first pivot (highest degree) - maxconn=-1 - nnbrs={} - pivotnbrs=set() # handle empty graph - for n,nbrs in G.adjacency_iter(): - nbrs=set(nbrs) - nbrs.discard(n) - conn = len(nbrs) - if conn > maxconn: - nnbrs[n] = pivotnbrs = nbrs - maxconn = conn - else: - nnbrs[n] = nbrs - # Initial setup - cand=set(nnbrs) - smallcand = set(cand - pivotnbrs) - done=set() - stack=[] - clique_so_far=[] - # Start main loop - while smallcand or stack: - try: - # Any nodes left to check? - n=smallcand.pop() - except KeyError: - # back out clique_so_far - cand,done,smallcand = stack.pop() - clique_so_far.pop() - continue - # Add next node to clique - clique_so_far.append(n) - cand.remove(n) - done.add(n) - nn=nnbrs[n] - new_cand = cand & nn - new_done = done & nn - # check if we have more to search - if not new_cand: - if not new_done: - # Found a clique! - yield clique_so_far[:] - clique_so_far.pop() - continue - # Shortcut--only one node left! - if not new_done and len(new_cand)==1: - yield clique_so_far + list(new_cand) - clique_so_far.pop() - continue - # find pivot node (max connected in cand) - # look in done nodes first - numb_cand=len(new_cand) - maxconndone=-1 - for n in new_done: - cn = new_cand & nnbrs[n] - conn=len(cn) - if conn > maxconndone: - pivotdonenbrs=cn - maxconndone=conn - if maxconndone==numb_cand: - break - # Shortcut--this part of tree already searched - if maxconndone == numb_cand: - clique_so_far.pop() - continue - # still finding pivot node - # look in cand nodes second - maxconn=-1 - for n in new_cand: - cn = new_cand & nnbrs[n] - conn=len(cn) - if conn > maxconn: - pivotnbrs=cn - maxconn=conn - if maxconn == numb_cand-1: - break - # pivot node is max connected in cand from done or cand - if maxconndone > maxconn: - pivotnbrs = pivotdonenbrs - # save search status for later backout - stack.append( (cand, done, smallcand) ) - cand=new_cand - done=new_done - smallcand = cand - pivotnbrs - - -def find_cliques_recursive(G): - """Recursive search for all maximal cliques in a graph. - - Maximal cliques are the largest complete subgraph containing - a given point. The largest maximal clique is sometimes called - the maximum clique. - - Returns - ------- - list of lists: list of members in each maximal clique - - See Also - -------- - find_cliques : An nonrecursive version of the same algorithm - - Notes - ----- - Based on the algorithm published by Bron & Kerbosch (1973) [1]_ - as adapated by Tomita, Tanaka and Takahashi (2006) [2]_ - and discussed in Cazals and Karande (2008) [3]_. - - This implementation returns a list of lists each of - which contains the members of a maximal clique. - - This algorithm ignores self-loops and parallel edges as - clique is not conventionally defined with such edges. - - References - ---------- - .. [1] Bron, C. and Kerbosch, J. 1973. - Algorithm 457: finding all cliques of an undirected graph. - Commun. ACM 16, 9 (Sep. 1973), 575-577. - http://portal.acm.org/citation.cfm?doid=362342.362367 - - .. [2] Etsuji Tomita, Akira Tanaka, Haruhisa Takahashi, - The worst-case time complexity for generating all maximal - cliques and computational experiments, - Theoretical Computer Science, Volume 363, Issue 1, - Computing and Combinatorics, - 10th Annual International Conference on - Computing and Combinatorics (COCOON 2004), 25 October 2006, Pages 28-42 - http://dx.doi.org/10.1016/j.tcs.2006.06.015 - - .. [3] F. Cazals, C. Karande, - A note on the problem of reporting maximal cliques, - Theoretical Computer Science, - Volume 407, Issues 1-3, 6 November 2008, Pages 564-568, - http://dx.doi.org/10.1016/j.tcs.2008.05.010 - """ - nnbrs={} - for n,nbrs in G.adjacency_iter(): - nbrs=set(nbrs) - nbrs.discard(n) - nnbrs[n]=nbrs - if not nnbrs: return [] # empty graph - cand=set(nnbrs) - done=set() - clique_so_far=[] - cliques=[] - _extend(nnbrs,cand,done,clique_so_far,cliques) - return cliques - -def _extend(nnbrs,cand,done,so_far,cliques): - # find pivot node (max connections in cand) - maxconn=-1 - numb_cand=len(cand) - for n in done: - cn = cand & nnbrs[n] - conn=len(cn) - if conn > maxconn: - pivotnbrs=cn - maxconn=conn - if conn==numb_cand: - # All possible cliques already found - return - for n in cand: - cn = cand & nnbrs[n] - conn=len(cn) - if conn > maxconn: - pivotnbrs=cn - maxconn=conn - # Use pivot to reduce number of nodes to examine - smallercand = set(cand - pivotnbrs) - for n in smallercand: - cand.remove(n) - so_far.append(n) - nn=nnbrs[n] - new_cand=cand & nn - new_done=done & nn - if not new_cand and not new_done: - # Found the clique - cliques.append(so_far[:]) - elif not new_done and len(new_cand) is 1: - # shortcut if only one node left - cliques.append(so_far+list(new_cand)) - else: - _extend(nnbrs, new_cand, new_done, so_far, cliques) - done.add(so_far.pop()) - - -def make_max_clique_graph(G,create_using=None,name=None): - """ Create the maximal clique graph of a graph. - - Finds the maximal cliques and treats these as nodes. - The nodes are connected if they have common members in - the original graph. Theory has done a lot with clique - graphs, but I haven't seen much on maximal clique graphs. - - Notes - ----- - This should be the same as make_clique_bipartite followed - by project_up, but it saves all the intermediate steps. - """ - cliq=list(map(set,find_cliques(G))) - if create_using: - B=create_using - B.clear() - else: - B=networkx.Graph() - if name is not None: - B.name=name - - for i,cl in enumerate(cliq): - B.add_node(i+1) - for j,other_cl in enumerate(cliq[:i]): - # if not cl.isdisjoint(other_cl): #Requires 2.6 - intersect=cl & other_cl - if intersect: # Not empty - B.add_edge(i+1,j+1) - return B - -def make_clique_bipartite(G,fpos=None,create_using=None,name=None): - """Create a bipartite clique graph from a graph G. - - Nodes of G are retained as the "bottom nodes" of B and - cliques of G become "top nodes" of B. - Edges are present if a bottom node belongs to the clique - represented by the top node. - - Returns a Graph with additional attribute dict B.node_type - which is keyed by nodes to "Bottom" or "Top" appropriately. - - if fpos is not None, a second additional attribute dict B.pos - is created to hold the position tuple of each node for viewing - the bipartite graph. - """ - cliq=list(find_cliques(G)) - if create_using: - B=create_using - B.clear() - else: - B=networkx.Graph() - if name is not None: - B.name=name - - B.add_nodes_from(G) - B.node_type={} # New Attribute for B - for n in B: - B.node_type[n]="Bottom" - - if fpos: - B.pos={} # New Attribute for B - delta_cpos=1./len(cliq) - delta_ppos=1./G.order() - cpos=0. - ppos=0. - for i,cl in enumerate(cliq): - name= -i-1 # Top nodes get negative names - B.add_node(name) - B.node_type[name]="Top" - if fpos: - if name not in B.pos: - B.pos[name]=(0.2,cpos) - cpos +=delta_cpos - for v in cl: - B.add_edge(name,v) - if fpos is not None: - if v not in B.pos: - B.pos[v]=(0.8,ppos) - ppos +=delta_ppos - return B - -def project_down(B,create_using=None,name=None): - """Project a bipartite graph B down onto its "bottom nodes". - - The nodes retain their names and are connected if they - share a common top node in the bipartite graph. - - Returns a Graph. - """ - if create_using: - G=create_using - G.clear() - else: - G=networkx.Graph() - if name is not None: - G.name=name - - for v,Bvnbrs in B.adjacency_iter(): - if B.node_type[v]=="Bottom": - G.add_node(v) - for cv in Bvnbrs: - G.add_edges_from([(v,u) for u in B[cv] if u!=v]) - return G - -def project_up(B,create_using=None,name=None): - """Project a bipartite graph B down onto its "bottom nodes". - - The nodes retain their names and are connected if they - share a common Bottom Node in the Bipartite Graph. - - Returns a Graph. - """ - if create_using: - G=create_using - G.clear() - else: - G=networkx.Graph() - if name is not None: - G.name=name - - for v,Bvnbrs in B.adjacency_iter(): - if B.node_type[v]=="Top": - vname= -v #Change sign of name for Top Nodes - G.add_node(vname) - for cv in Bvnbrs: - # Note: -u changes the name (not Top node anymore) - G.add_edges_from([(vname,-u) for u in B[cv] if u!=v]) - return G - -def graph_clique_number(G,cliques=None): - """Return the clique number (size of the largest clique) for G. - - An optional list of cliques can be input if already computed. - """ - if cliques is None: - cliques=find_cliques(G) - return max( [len(c) for c in cliques] ) - - -def graph_number_of_cliques(G,cliques=None): - """Returns the number of maximal cliques in G. - - An optional list of cliques can be input if already computed. - """ - if cliques is None: - cliques=list(find_cliques(G)) - return len(cliques) - - -def node_clique_number(G,nodes=None,cliques=None): - """ Returns the size of the largest maximal clique containing - each given node. - - Returns a single or list depending on input nodes. - Optional list of cliques can be input if already computed. - """ - if cliques is None: - if nodes is not None: - # Use ego_graph to decrease size of graph - if isinstance(nodes,list): - d={} - for n in nodes: - H=networkx.ego_graph(G,n) - d[n]=max( (len(c) for c in find_cliques(H)) ) - else: - H=networkx.ego_graph(G,nodes) - d=max( (len(c) for c in find_cliques(H)) ) - return d - # nodes is None--find all cliques - cliques=list(find_cliques(G)) - - if nodes is None: - nodes=G.nodes() # none, get entire graph - - if not isinstance(nodes, list): # check for a list - v=nodes - # assume it is a single value - d=max([len(c) for c in cliques if v in c]) - else: - d={} - for v in nodes: - d[v]=max([len(c) for c in cliques if v in c]) - return d - - # if nodes is None: # none, use entire graph - # nodes=G.nodes() - # elif not isinstance(nodes, list): # check for a list - # nodes=[nodes] # assume it is a single value - - # if cliques is None: - # cliques=list(find_cliques(G)) - # d={} - # for v in nodes: - # d[v]=max([len(c) for c in cliques if v in c]) - - # if nodes in G: - # return d[v] #return single value - # return d - - -def number_of_cliques(G,nodes=None,cliques=None): - """Returns the number of maximal cliques for each node. - - Returns a single or list depending on input nodes. - Optional list of cliques can be input if already computed. - """ - if cliques is None: - cliques=list(find_cliques(G)) - - if nodes is None: - nodes=G.nodes() # none, get entire graph - - if not isinstance(nodes, list): # check for a list - v=nodes - # assume it is a single value - numcliq=len([1 for c in cliques if v in c]) - else: - numcliq={} - for v in nodes: - numcliq[v]=len([1 for c in cliques if v in c]) - return numcliq - - -def cliques_containing_node(G,nodes=None,cliques=None): - """Returns a list of cliques containing the given node. - - Returns a single list or list of lists depending on input nodes. - Optional list of cliques can be input if already computed. - """ - if cliques is None: - cliques=list(find_cliques(G)) - - if nodes is None: - nodes=G.nodes() # none, get entire graph - - if not isinstance(nodes, list): # check for a list - v=nodes - # assume it is a single value - vcliques=[c for c in cliques if v in c] - else: - vcliques={} - for v in nodes: - vcliques[v]=[c for c in cliques if v in c] - return vcliques diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/cluster.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/cluster.py deleted file mode 100644 index a442431..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/cluster.py +++ /dev/null @@ -1,363 +0,0 @@ -# -*- coding: utf-8 -*- -"""Algorithms to characterize the number of triangles in a graph.""" -from itertools import combinations -import networkx as nx -from networkx import NetworkXError -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Dan Schult (dschult@colgate.edu)', - 'Pieter Swart (swart@lanl.gov)', - 'Jordi Torrents <jtorrents@milnou.net>']) -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__all__= ['triangles', 'average_clustering', 'clustering', 'transitivity', - 'square_clustering'] - -def triangles(G, nodes=None): - """Compute the number of triangles. - - Finds the number of triangles that include a node as one vertex. - - Parameters - ---------- - G : graph - A networkx graph - nodes : container of nodes, optional (default= all nodes in G) - Compute triangles for nodes in this container. - - Returns - ------- - out : dictionary - Number of triangles keyed by node label. - - Examples - -------- - >>> G=nx.complete_graph(5) - >>> print(nx.triangles(G,0)) - 6 - >>> print(nx.triangles(G)) - {0: 6, 1: 6, 2: 6, 3: 6, 4: 6} - >>> print(list(nx.triangles(G,(0,1)).values())) - [6, 6] - - Notes - ----- - When computing triangles for the entire graph each triangle is counted - three times, once at each node. Self loops are ignored. - - """ - if G.is_directed(): - raise NetworkXError("triangles() is not defined for directed graphs.") - if nodes in G: - # return single value - return next(_triangles_and_degree_iter(G,nodes))[2] // 2 - return dict( (v,t // 2) for v,d,t in _triangles_and_degree_iter(G,nodes)) - -def _triangles_and_degree_iter(G,nodes=None): - """ Return an iterator of (node, degree, triangles). - - This double counts triangles so you may want to divide by 2. - See degree() and triangles() for definitions and details. - - """ - if G.is_multigraph(): - raise NetworkXError("Not defined for multigraphs.") - - if nodes is None: - nodes_nbrs = G.adj.items() - else: - nodes_nbrs= ( (n,G[n]) for n in G.nbunch_iter(nodes) ) - - for v,v_nbrs in nodes_nbrs: - vs=set(v_nbrs)-set([v]) - ntriangles=0 - for w in vs: - ws=set(G[w])-set([w]) - ntriangles+=len(vs.intersection(ws)) - yield (v,len(vs),ntriangles) - - -def _weighted_triangles_and_degree_iter(G, nodes=None, weight='weight'): - """ Return an iterator of (node, degree, weighted_triangles). - - Used for weighted clustering. - - """ - if G.is_multigraph(): - raise NetworkXError("Not defined for multigraphs.") - - if weight is None or G.edges()==[]: - max_weight=1.0 - else: - max_weight=float(max(d.get(weight,1.0) - for u,v,d in G.edges(data=True))) - if nodes is None: - nodes_nbrs = G.adj.items() - else: - nodes_nbrs= ( (n,G[n]) for n in G.nbunch_iter(nodes) ) - - for i,nbrs in nodes_nbrs: - inbrs=set(nbrs)-set([i]) - weighted_triangles=0.0 - seen=set() - for j in inbrs: - wij=G[i][j].get(weight,1.0)/max_weight - seen.add(j) - jnbrs=set(G[j])-seen # this keeps from double counting - for k in inbrs&jnbrs: - wjk=G[j][k].get(weight,1.0)/max_weight - wki=G[i][k].get(weight,1.0)/max_weight - weighted_triangles+=(wij*wjk*wki)**(1.0/3.0) - yield (i,len(inbrs),weighted_triangles*2) - - -def average_clustering(G, nodes=None, weight=None, count_zeros=True): - r"""Compute the average clustering coefficient for the graph G. - - The clustering coefficient for the graph is the average, - - .. math:: - - C = \frac{1}{n}\sum_{v \in G} c_v, - - where `n` is the number of nodes in `G`. - - Parameters - ---------- - G : graph - - nodes : container of nodes, optional (default=all nodes in G) - Compute average clustering for nodes in this container. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used as a weight. - If None, then each edge has weight 1. - - count_zeros : bool (default=False) - If False include only the nodes with nonzero clustering in the average. - - Returns - ------- - avg : float - Average clustering - - Examples - -------- - >>> G=nx.complete_graph(5) - >>> print(nx.average_clustering(G)) - 1.0 - - Notes - ----- - This is a space saving routine; it might be faster - to use the clustering function to get a list and then take the average. - - Self loops are ignored. - - References - ---------- - .. [1] Generalizations of the clustering coefficient to weighted - complex networks by J. Saramäki, M. Kivelä, J.-P. Onnela, - K. Kaski, and J. Kertész, Physical Review E, 75 027105 (2007). - http://jponnela.com/web_documents/a9.pdf - .. [2] Marcus Kaiser, Mean clustering coefficients: the role of isolated - nodes and leafs on clustering measures for small-world networks. - http://arxiv.org/abs/0802.2512 - """ - c=clustering(G,nodes,weight=weight).values() - if not count_zeros: - c = [v for v in c if v > 0] - return sum(c)/float(len(c)) - -def clustering(G, nodes=None, weight=None): - r"""Compute the clustering coefficient for nodes. - - For unweighted graphs, the clustering of a node `u` - is the fraction of possible triangles through that node that exist, - - .. math:: - - c_u = \frac{2 T(u)}{deg(u)(deg(u)-1)}, - - where `T(u)` is the number of triangles through node `u` and - `deg(u)` is the degree of `u`. - - For weighted graphs, the clustering is defined - as the geometric average of the subgraph edge weights [1]_, - - .. math:: - - c_u = \frac{1}{deg(u)(deg(u)-1))} - \sum_{uv} (\hat{w}_{uv} \hat{w}_{uw} \hat{w}_{vw})^{1/3}. - - The edge weights `\hat{w}_{uv}` are normalized by the maximum weight in the - network `\hat{w}_{uv} = w_{uv}/\max(w)`. - - The value of `c_u` is assigned to 0 if `deg(u) < 2`. - - Parameters - ---------- - G : graph - - nodes : container of nodes, optional (default=all nodes in G) - Compute clustering for nodes in this container. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used as a weight. - If None, then each edge has weight 1. - - Returns - ------- - out : float, or dictionary - Clustering coefficient at specified nodes - - Examples - -------- - >>> G=nx.complete_graph(5) - >>> print(nx.clustering(G,0)) - 1.0 - >>> print(nx.clustering(G)) - {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0} - - Notes - ----- - Self loops are ignored. - - References - ---------- - .. [1] Generalizations of the clustering coefficient to weighted - complex networks by J. Saramäki, M. Kivelä, J.-P. Onnela, - K. Kaski, and J. Kertész, Physical Review E, 75 027105 (2007). - http://jponnela.com/web_documents/a9.pdf - """ - if G.is_directed(): - raise NetworkXError('Clustering algorithms are not defined ', - 'for directed graphs.') - if weight is not None: - td_iter=_weighted_triangles_and_degree_iter(G,nodes,weight) - else: - td_iter=_triangles_and_degree_iter(G,nodes) - - clusterc={} - - for v,d,t in td_iter: - if t==0: - clusterc[v]=0.0 - else: - clusterc[v]=t/float(d*(d-1)) - - if nodes in G: - return list(clusterc.values())[0] # return single value - return clusterc - -def transitivity(G): - r"""Compute graph transitivity, the fraction of all possible triangles - present in G. - - Possible triangles are identified by the number of "triads" - (two edges with a shared vertex). - - The transitivity is - - .. math:: - - T = 3\frac{\#triangles}{\#triads}. - - Parameters - ---------- - G : graph - - Returns - ------- - out : float - Transitivity - - Examples - -------- - >>> G = nx.complete_graph(5) - >>> print(nx.transitivity(G)) - 1.0 - """ - triangles=0 # 6 times number of triangles - contri=0 # 2 times number of connected triples - for v,d,t in _triangles_and_degree_iter(G): - contri += d*(d-1) - triangles += t - if triangles==0: # we had no triangles or possible triangles - return 0.0 - else: - return triangles/float(contri) - -def square_clustering(G, nodes=None): - r""" Compute the squares clustering coefficient for nodes. - - For each node return the fraction of possible squares that exist at - the node [1]_ - - .. math:: - C_4(v) = \frac{ \sum_{u=1}^{k_v} - \sum_{w=u+1}^{k_v} q_v(u,w) }{ \sum_{u=1}^{k_v} - \sum_{w=u+1}^{k_v} [a_v(u,w) + q_v(u,w)]}, - - where `q_v(u,w)` are the number of common neighbors of `u` and `w` - other than `v` (ie squares), and - `a_v(u,w) = (k_u - (1+q_v(u,w)+\theta_{uv}))(k_w - (1+q_v(u,w)+\theta_{uw}))`, - where `\theta_{uw} = 1` if `u` and `w` are connected and 0 otherwise. - - Parameters - ---------- - G : graph - - nodes : container of nodes, optional (default=all nodes in G) - Compute clustering for nodes in this container. - - Returns - ------- - c4 : dictionary - A dictionary keyed by node with the square clustering coefficient value. - - Examples - -------- - >>> G=nx.complete_graph(5) - >>> print(nx.square_clustering(G,0)) - 1.0 - >>> print(nx.square_clustering(G)) - {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0} - - Notes - ----- - While `C_3(v)` (triangle clustering) gives the probability that - two neighbors of node v are connected with each other, `C_4(v)` is - the probability that two neighbors of node v share a common - neighbor different from v. This algorithm can be applied to both - bipartite and unipartite networks. - - References - ---------- - .. [1] Pedro G. Lind, Marta C. González, and Hans J. Herrmann. 2005 - Cycles and clustering in bipartite networks. - Physical Review E (72) 056127. - """ - if nodes is None: - node_iter = G - else: - node_iter = G.nbunch_iter(nodes) - clustering = {} - for v in node_iter: - clustering[v] = 0.0 - potential=0 - for u,w in combinations(G[v], 2): - squares = len((set(G[u]) & set(G[w])) - set([v])) - clustering[v] += squares - degm = squares + 1.0 - if w in G[u]: - degm += 1 - potential += (len(G[u]) - degm) * (len(G[w]) - degm) + squares - if potential > 0: - clustering[v] /= potential - if nodes in G: - return list(clustering.values())[0] # return single value - return clustering diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/__init__.py deleted file mode 100644 index c3c2285..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from networkx.algorithms.community.kclique import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/kclique.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/kclique.py deleted file mode 100644 index dc95b58..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/kclique.py +++ /dev/null @@ -1,82 +0,0 @@ -#-*- coding: utf-8 -*- -# Copyright (C) 2011 by -# Conrad Lee <conradlee@gmail.com> -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -from collections import defaultdict -import networkx as nx -__author__ = """\n""".join(['Conrad Lee <conradlee@gmail.com>', - 'Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['k_clique_communities'] - -def k_clique_communities(G, k, cliques=None): - """Find k-clique communities in graph using the percolation method. - - A k-clique community is the union of all cliques of size k that - can be reached through adjacent (sharing k-1 nodes) k-cliques. - - Parameters - ---------- - G : NetworkX graph - - k : int - Size of smallest clique - - cliques: list or generator - Precomputed cliques (use networkx.find_cliques(G)) - - Returns - ------- - Yields sets of nodes, one for each k-clique community. - - Examples - -------- - >>> G = nx.complete_graph(5) - >>> K5 = nx.convert_node_labels_to_integers(G,first_label=2) - >>> G.add_edges_from(K5.edges()) - >>> c = list(nx.k_clique_communities(G, 4)) - >>> list(c[0]) - [0, 1, 2, 3, 4, 5, 6] - >>> list(nx.k_clique_communities(G, 6)) - [] - - References - ---------- - .. [1] Gergely Palla, Imre Derényi, Illés Farkas1, and Tamás Vicsek, - Uncovering the overlapping community structure of complex networks - in nature and society Nature 435, 814-818, 2005, - doi:10.1038/nature03607 - """ - if k < 2: - raise nx.NetworkXError("k=%d, k must be greater than 1."%k) - if cliques is None: - cliques = nx.find_cliques(G) - cliques = [frozenset(c) for c in cliques if len(c) >= k] - - # First index which nodes are in which cliques - membership_dict = defaultdict(list) - for clique in cliques: - for node in clique: - membership_dict[node].append(clique) - - # For each clique, see which adjacent cliques percolate - perc_graph = nx.Graph() - perc_graph.add_nodes_from(cliques) - for clique in cliques: - for adj_clique in _get_adjacent_cliques(clique, membership_dict): - if len(clique.intersection(adj_clique)) >= (k - 1): - perc_graph.add_edge(clique, adj_clique) - - # Connected components of clique graph with perc edges - # are the percolated cliques - for component in nx.connected_components(perc_graph): - yield(frozenset.union(*component)) - -def _get_adjacent_cliques(clique, membership_dict): - adjacent_cliques = set() - for n in clique: - for adj_clique in membership_dict[n]: - if clique != adj_clique: - adjacent_cliques.add(adj_clique) - return adjacent_cliques diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/tests/test_kclique.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/tests/test_kclique.py deleted file mode 100644 index 8debca6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/community/tests/test_kclique.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from itertools import combinations -from networkx import k_clique_communities - -def test_overlaping_K5(): - G = nx.Graph() - G.add_edges_from(combinations(range(5), 2)) # Add a five clique - G.add_edges_from(combinations(range(2,7), 2)) # Add another five clique - c = list(nx.k_clique_communities(G, 4)) - assert_equal(c,[frozenset([0, 1, 2, 3, 4, 5, 6])]) - c= list(nx.k_clique_communities(G, 5)) - assert_equal(set(c),set([frozenset([0,1,2,3,4]),frozenset([2,3,4,5,6])])) - -def test_isolated_K5(): - G = nx.Graph() - G.add_edges_from(combinations(range(0,5), 2)) # Add a five clique - G.add_edges_from(combinations(range(5,10), 2)) # Add another five clique - c= list(nx.k_clique_communities(G, 5)) - assert_equal(set(c),set([frozenset([0,1,2,3,4]),frozenset([5,6,7,8,9])])) - -def test_zachary(): - z = nx.karate_club_graph() - # clique percolation with k=2 is just connected components - zachary_k2_ground_truth = set([frozenset(z.nodes())]) - zachary_k3_ground_truth = set([frozenset([0, 1, 2, 3, 7, 8, 12, 13, 14, - 15, 17, 18, 19, 20, 21, 22, 23, - 26, 27, 28, 29, 30, 31, 32, 33]), - frozenset([0, 4, 5, 6, 10, 16]), - frozenset([24, 25, 31])]) - zachary_k4_ground_truth = set([frozenset([0, 1, 2, 3, 7, 13]), - frozenset([8, 32, 30, 33]), - frozenset([32, 33, 29, 23])]) - zachary_k5_ground_truth = set([frozenset([0, 1, 2, 3, 7, 13])]) - zachary_k6_ground_truth = set([]) - - assert set(k_clique_communities(z, 2)) == zachary_k2_ground_truth - assert set(k_clique_communities(z, 3)) == zachary_k3_ground_truth - assert set(k_clique_communities(z, 4)) == zachary_k4_ground_truth - assert set(k_clique_communities(z, 5)) == zachary_k5_ground_truth - assert set(k_clique_communities(z, 6)) == zachary_k6_ground_truth - -@raises(nx.NetworkXError) -def test_bad_k(): - c = list(k_clique_communities(nx.Graph(),1)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/__init__.py deleted file mode 100644 index 36c9391..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from networkx.algorithms.components.connected import * -from networkx.algorithms.components.strongly_connected import * -from networkx.algorithms.components.weakly_connected import * -from networkx.algorithms.components.attracting import * -from networkx.algorithms.components.biconnected import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/attracting.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/attracting.py deleted file mode 100644 index d0e75c2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/attracting.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Attracting components. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__authors__ = "\n".join(['Christopher Ellison']) -__all__ = ['number_attracting_components', - 'attracting_components', - 'is_attracting_component', - 'attracting_component_subgraphs', - ] - -def attracting_components(G): - """Returns a list of attracting components in `G`. - - An attracting component in a directed graph `G` is a strongly connected - component with the property that a random walker on the graph will never - leave the component, once it enters the component. - - The nodes in attracting components can also be thought of as recurrent - nodes. If a random walker enters the attractor containing the node, then - the node will be visited infinitely often. - - Parameters - ---------- - G : DiGraph, MultiDiGraph - The graph to be analyzed. - - Returns - ------- - attractors : list - The list of attracting components, sorted from largest attracting - component to smallest attracting component. - - See Also - -------- - number_attracting_components - is_attracting_component - attracting_component_subgraphs - - """ - scc = nx.strongly_connected_components(G) - cG = nx.condensation(G, scc) - attractors = [scc[n] for n in cG if cG.out_degree(n) == 0] - attractors.sort(key=len,reverse=True) - return attractors - - -def number_attracting_components(G): - """Returns the number of attracting components in `G`. - - Parameters - ---------- - G : DiGraph, MultiDiGraph - The graph to be analyzed. - - Returns - ------- - n : int - The number of attracting components in G. - - See Also - -------- - attracting_components - is_attracting_component - attracting_component_subgraphs - - """ - n = len(attracting_components(G)) - return n - - -def is_attracting_component(G): - """Returns True if `G` consists of a single attracting component. - - Parameters - ---------- - G : DiGraph, MultiDiGraph - The graph to be analyzed. - - Returns - ------- - attracting : bool - True if `G` has a single attracting component. Otherwise, False. - - See Also - -------- - attracting_components - number_attracting_components - attracting_component_subgraphs - - """ - ac = attracting_components(G) - if len(ac[0]) == len(G): - attracting = True - else: - attracting = False - return attracting - - -def attracting_component_subgraphs(G): - """Returns a list of attracting component subgraphs from `G`. - - Parameters - ---------- - G : DiGraph, MultiDiGraph - The graph to be analyzed. - - Returns - ------- - subgraphs : list - A list of node-induced subgraphs of the attracting components of `G`. - - Notes - ----- - Graph, node, and edge attributes are copied to the subgraphs. - - See Also - -------- - attracting_components - number_attracting_components - is_attracting_component - - """ - subgraphs = [G.subgraph(ac).copy() for ac in attracting_components(G)] - return subgraphs - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/biconnected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/biconnected.py deleted file mode 100644 index 0185c2c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/biconnected.py +++ /dev/null @@ -1,417 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Biconnected components and articulation points. -""" -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from itertools import chain -import networkx as nx -__author__ = '\n'.join(['Jordi Torrents <jtorrents@milnou.net>', - 'Dan Schult <dschult@colgate.edu>', - 'Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['biconnected_components', - 'biconnected_component_edges', - 'biconnected_component_subgraphs', - 'is_biconnected', - 'articulation_points', - ] - -def is_biconnected(G): - """Return True if the graph is biconnected, False otherwise. - - A graph is biconnected if, and only if, it cannot be disconnected by - removing only one node (and all edges incident on that node). If - removing a node increases the number of disconnected components - in the graph, that node is called an articulation point, or cut - vertex. A biconnected graph has no articulation points. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - biconnected : bool - True if the graph is biconnected, False otherwise. - - Raises - ------ - NetworkXError : - If the input graph is not undirected. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> print(nx.is_biconnected(G)) - False - >>> G.add_edge(0,3) - >>> print(nx.is_biconnected(G)) - True - - See Also - -------- - biconnected_components, - articulation_points, - biconnected_component_edges, - biconnected_component_subgraphs - - Notes - ----- - The algorithm to find articulation points and biconnected - components is implemented using a non-recursive depth-first-search - (DFS) that keeps track of the highest level that back edges reach - in the DFS tree. A node `n` is an articulation point if, and only - if, there exists a subtree rooted at `n` such that there is no - back edge from any successor of `n` that links to a predecessor of - `n` in the DFS tree. By keeping track of all the edges traversed - by the DFS we can obtain the biconnected components because all - edges of a bicomponent will be traversed consecutively between - articulation points. - - References - ---------- - .. [1] Hopcroft, J.; Tarjan, R. (1973). - "Efficient algorithms for graph manipulation". - Communications of the ACM 16: 372–378. doi:10.1145/362248.362272 - """ - bcc = list(biconnected_components(G)) - if not bcc: # No bicomponents (it could be an empty graph) - return False - return len(bcc[0]) == len(G) - -def biconnected_component_edges(G): - """Return a generator of lists of edges, one list for each biconnected - component of the input graph. - - Biconnected components are maximal subgraphs such that the removal of a - node (and all edges incident on that node) will not disconnect the - subgraph. Note that nodes may be part of more than one biconnected - component. Those nodes are articulation points, or cut vertices. However, - each edge belongs to one, and only one, biconnected component. - - Notice that by convention a dyad is considered a biconnected component. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - edges : generator - Generator of lists of edges, one list for each bicomponent. - - Raises - ------ - NetworkXError : - If the input graph is not undirected. - - Examples - -------- - >>> G = nx.barbell_graph(4,2) - >>> print(nx.is_biconnected(G)) - False - >>> components = nx.biconnected_component_edges(G) - >>> G.add_edge(2,8) - >>> print(nx.is_biconnected(G)) - True - >>> components = nx.biconnected_component_edges(G) - - See Also - -------- - is_biconnected, - biconnected_components, - articulation_points, - biconnected_component_subgraphs - - Notes - ----- - The algorithm to find articulation points and biconnected - components is implemented using a non-recursive depth-first-search - (DFS) that keeps track of the highest level that back edges reach - in the DFS tree. A node `n` is an articulation point if, and only - if, there exists a subtree rooted at `n` such that there is no - back edge from any successor of `n` that links to a predecessor of - `n` in the DFS tree. By keeping track of all the edges traversed - by the DFS we can obtain the biconnected components because all - edges of a bicomponent will be traversed consecutively between - articulation points. - - References - ---------- - .. [1] Hopcroft, J.; Tarjan, R. (1973). - "Efficient algorithms for graph manipulation". - Communications of the ACM 16: 372–378. doi:10.1145/362248.362272 - """ - return sorted(_biconnected_dfs(G,components=True), key=len, reverse=True) - -def biconnected_components(G): - """Return a generator of sets of nodes, one set for each biconnected - component of the graph - - Biconnected components are maximal subgraphs such that the removal of a - node (and all edges incident on that node) will not disconnect the - subgraph. Note that nodes may be part of more than one biconnected - component. Those nodes are articulation points, or cut vertices. The - removal of articulation points will increase the number of connected - components of the graph. - - Notice that by convention a dyad is considered a biconnected component. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - nodes : generator - Generator of sets of nodes, one set for each biconnected component. - - Raises - ------ - NetworkXError : - If the input graph is not undirected. - - Examples - -------- - >>> G = nx.barbell_graph(4,2) - >>> print(nx.is_biconnected(G)) - False - >>> components = nx.biconnected_components(G) - >>> G.add_edge(2,8) - >>> print(nx.is_biconnected(G)) - True - >>> components = nx.biconnected_components(G) - - See Also - -------- - is_biconnected, - articulation_points, - biconnected_component_edges, - biconnected_component_subgraphs - - Notes - ----- - The algorithm to find articulation points and biconnected - components is implemented using a non-recursive depth-first-search - (DFS) that keeps track of the highest level that back edges reach - in the DFS tree. A node `n` is an articulation point if, and only - if, there exists a subtree rooted at `n` such that there is no - back edge from any successor of `n` that links to a predecessor of - `n` in the DFS tree. By keeping track of all the edges traversed - by the DFS we can obtain the biconnected components because all - edges of a bicomponent will be traversed consecutively between - articulation points. - - References - ---------- - .. [1] Hopcroft, J.; Tarjan, R. (1973). - "Efficient algorithms for graph manipulation". - Communications of the ACM 16: 372–378. doi:10.1145/362248.362272 - """ - bicomponents = (set(chain.from_iterable(comp)) - for comp in _biconnected_dfs(G,components=True)) - return sorted(bicomponents, key=len, reverse=True) - -def biconnected_component_subgraphs(G): - """Return a generator of graphs, one graph for each biconnected component - of the input graph. - - Biconnected components are maximal subgraphs such that the removal of a - node (and all edges incident on that node) will not disconnect the - subgraph. Note that nodes may be part of more than one biconnected - component. Those nodes are articulation points, or cut vertices. The - removal of articulation points will increase the number of connected - components of the graph. - - Notice that by convention a dyad is considered a biconnected component. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - graphs : generator - Generator of graphs, one graph for each biconnected component. - - Raises - ------ - NetworkXError : - If the input graph is not undirected. - - Examples - -------- - >>> G = nx.barbell_graph(4,2) - >>> print(nx.is_biconnected(G)) - False - >>> subgraphs = nx.biconnected_component_subgraphs(G) - - See Also - -------- - is_biconnected, - articulation_points, - biconnected_component_edges, - biconnected_components - - Notes - ----- - The algorithm to find articulation points and biconnected - components is implemented using a non-recursive depth-first-search - (DFS) that keeps track of the highest level that back edges reach - in the DFS tree. A node `n` is an articulation point if, and only - if, there exists a subtree rooted at `n` such that there is no - back edge from any successor of `n` that links to a predecessor of - `n` in the DFS tree. By keeping track of all the edges traversed - by the DFS we can obtain the biconnected components because all - edges of a bicomponent will be traversed consecutively between - articulation points. - - Graph, node, and edge attributes are copied to the subgraphs. - - References - ---------- - .. [1] Hopcroft, J.; Tarjan, R. (1973). - "Efficient algorithms for graph manipulation". - Communications of the ACM 16: 372–378. doi:10.1145/362248.362272 - """ - def edge_subgraph(G,edges): - # create new graph and copy subgraph into it - H = G.__class__() - for u,v in edges: - H.add_edge(u,v,attr_dict=G[u][v]) - for n in H: - H.node[n]=G.node[n].copy() - H.graph=G.graph.copy() - return H - return (edge_subgraph(G,edges) for edges in - sorted(_biconnected_dfs(G,components=True), key=len, reverse=True)) - -def articulation_points(G): - """Return a generator of articulation points, or cut vertices, of a graph. - - An articulation point or cut vertex is any node whose removal (along with - all its incident edges) increases the number of connected components of - a graph. An undirected connected graph without articulation points is - biconnected. Articulation points belong to more than one biconnected - component of a graph. - - Notice that by convention a dyad is considered a biconnected component. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - articulation points : generator - generator of nodes - - Raises - ------ - NetworkXError : - If the input graph is not undirected. - - Examples - -------- - >>> G = nx.barbell_graph(4,2) - >>> print(nx.is_biconnected(G)) - False - >>> list(nx.articulation_points(G)) - [6, 5, 4, 3] - >>> G.add_edge(2,8) - >>> print(nx.is_biconnected(G)) - True - >>> list(nx.articulation_points(G)) - [] - - See Also - -------- - is_biconnected, - biconnected_components, - biconnected_component_edges, - biconnected_component_subgraphs - - Notes - ----- - The algorithm to find articulation points and biconnected - components is implemented using a non-recursive depth-first-search - (DFS) that keeps track of the highest level that back edges reach - in the DFS tree. A node `n` is an articulation point if, and only - if, there exists a subtree rooted at `n` such that there is no - back edge from any successor of `n` that links to a predecessor of - `n` in the DFS tree. By keeping track of all the edges traversed - by the DFS we can obtain the biconnected components because all - edges of a bicomponent will be traversed consecutively between - articulation points. - - References - ---------- - .. [1] Hopcroft, J.; Tarjan, R. (1973). - "Efficient algorithms for graph manipulation". - Communications of the ACM 16: 372–378. doi:10.1145/362248.362272 - """ - return _biconnected_dfs(G,components=False) - -def _biconnected_dfs(G, components=True): - # depth-first search algorithm to generate articulation points - # and biconnected components - if G.is_directed(): - raise nx.NetworkXError('Not allowed for directed graph G. ' - 'Use UG=G.to_undirected() to create an ' - 'undirected graph.') - visited = set() - for start in G: - if start in visited: - continue - discovery = {start:0} # "time" of first discovery of node during search - low = {start:0} - root_children = 0 - visited.add(start) - edge_stack = [] - stack = [(start, start, iter(G[start]))] - while stack: - grandparent, parent, children = stack[-1] - try: - child = next(children) - if grandparent == child: - continue - if child in visited: - if discovery[child] <= discovery[parent]: # back edge - low[parent] = min(low[parent],discovery[child]) - if components: - edge_stack.append((parent,child)) - else: - low[child] = discovery[child] = len(discovery) - visited.add(child) - stack.append((parent, child, iter(G[child]))) - if components: - edge_stack.append((parent,child)) - except StopIteration: - stack.pop() - if len(stack) > 1: - if low[parent] >= discovery[grandparent]: - if components: - ind = edge_stack.index((grandparent,parent)) - yield edge_stack[ind:] - edge_stack=edge_stack[:ind] - else: - yield grandparent - low[grandparent] = min(low[parent], low[grandparent]) - elif stack: # length 1 so grandparent is root - root_children += 1 - if components: - ind = edge_stack.index((grandparent,parent)) - yield edge_stack[ind:] - if not components: - # root node is articulation point if it has more than 1 child - if root_children > 1: - yield start diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/connected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/connected.py deleted file mode 100644 index 088a99e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/connected.py +++ /dev/null @@ -1,192 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Connected components. -""" -__authors__ = "\n".join(['Eben Kenah', - 'Aric Hagberg (hagberg@lanl.gov)' - 'Christopher Ellison']) -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['number_connected_components', - 'connected_components', - 'connected_component_subgraphs', - 'is_connected', - 'node_connected_component', - ] - -import networkx as nx - -def connected_components(G): - """Return nodes in connected components of graph. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - comp : list of lists - A list of nodes for each component of G. - - See Also - -------- - strongly_connected_components - - Notes - ----- - The list is ordered from largest connected component to smallest. - For undirected graphs only. - """ - if G.is_directed(): - raise nx.NetworkXError("""Not allowed for directed graph G. - Use UG=G.to_undirected() to create an undirected graph.""") - seen={} - components=[] - for v in G: - if v not in seen: - c=nx.single_source_shortest_path_length(G,v) - components.append(list(c.keys())) - seen.update(c) - components.sort(key=len,reverse=True) - return components - - -def number_connected_components(G): - """Return number of connected components in graph. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - n : integer - Number of connected components - - See Also - -------- - connected_components - - Notes - ----- - For undirected graphs only. - """ - return len(connected_components(G)) - - -def is_connected(G): - """Test graph connectivity. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - connected : bool - True if the graph is connected, false otherwise. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> print(nx.is_connected(G)) - True - - See Also - -------- - connected_components - - Notes - ----- - For undirected graphs only. - """ - if G.is_directed(): - raise nx.NetworkXError(\ - """Not allowed for directed graph G. -Use UG=G.to_undirected() to create an undirected graph.""") - - if len(G)==0: - raise nx.NetworkXPointlessConcept( - """Connectivity is undefined for the null graph.""") - - return len(nx.single_source_shortest_path_length(G, - next(G.nodes_iter())))==len(G) - - -def connected_component_subgraphs(G): - """Return connected components as subgraphs. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - Returns - ------- - glist : list - A list of graphs, one for each connected component of G. - - Examples - -------- - Get largest connected component as subgraph - - >>> G=nx.path_graph(4) - >>> G.add_edge(5,6) - >>> H=nx.connected_component_subgraphs(G)[0] - - See Also - -------- - connected_components - - Notes - ----- - The list is ordered from largest connected component to smallest. - For undirected graphs only. - - Graph, node, and edge attributes are copied to the subgraphs. - """ - cc=connected_components(G) - graph_list=[] - for c in cc: - graph_list.append(G.subgraph(c).copy()) - return graph_list - - -def node_connected_component(G,n): - """Return nodes in connected components of graph containing node n. - - Parameters - ---------- - G : NetworkX Graph - An undirected graph. - - n : node label - A node in G - - Returns - ------- - comp : lists - A list of nodes in component of G containing node n. - - See Also - -------- - connected_components - - Notes - ----- - For undirected graphs only. - """ - if G.is_directed(): - raise nx.NetworkXError("""Not allowed for directed graph G. - Use UG=G.to_undirected() to create an undirected graph.""") - return list(nx.single_source_shortest_path_length(G,n).keys()) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/strongly_connected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/strongly_connected.py deleted file mode 100644 index fbdec13..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/strongly_connected.py +++ /dev/null @@ -1,359 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Strongly connected components. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__authors__ = "\n".join(['Eben Kenah', - 'Aric Hagberg (hagberg@lanl.gov)' - 'Christopher Ellison', - 'Ben Edwards (bedwards@cs.unm.edu)']) - -__all__ = ['number_strongly_connected_components', - 'strongly_connected_components', - 'strongly_connected_component_subgraphs', - 'is_strongly_connected', - 'strongly_connected_components_recursive', - 'kosaraju_strongly_connected_components', - 'condensation'] - -def strongly_connected_components(G): - """Return nodes in strongly connected components of graph. - - Parameters - ---------- - G : NetworkX Graph - An directed graph. - - Returns - ------- - comp : list of lists - A list of nodes for each component of G. - The list is ordered from largest connected component to smallest. - - Raises - ------ - NetworkXError: If G is undirected. - - See Also - -------- - connected_components, weakly_connected_components - - Notes - ----- - Uses Tarjan's algorithm with Nuutila's modifications. - Nonrecursive version of algorithm. - - References - ---------- - .. [1] Depth-first search and linear graph algorithms, R. Tarjan - SIAM Journal of Computing 1(2):146-160, (1972). - - .. [2] On finding the strongly connected components in a directed graph. - E. Nuutila and E. Soisalon-Soinen - Information Processing Letters 49(1): 9-14, (1994).. - """ - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - Use connected_components() """) - preorder={} - lowlink={} - scc_found={} - scc_queue = [] - scc_list=[] - i=0 # Preorder counter - for source in G: - if source not in scc_found: - queue=[source] - while queue: - v=queue[-1] - if v not in preorder: - i=i+1 - preorder[v]=i - done=1 - v_nbrs=G[v] - for w in v_nbrs: - if w not in preorder: - queue.append(w) - done=0 - break - if done==1: - lowlink[v]=preorder[v] - for w in v_nbrs: - if w not in scc_found: - if preorder[w]>preorder[v]: - lowlink[v]=min([lowlink[v],lowlink[w]]) - else: - lowlink[v]=min([lowlink[v],preorder[w]]) - queue.pop() - if lowlink[v]==preorder[v]: - scc_found[v]=True - scc=[v] - while scc_queue and preorder[scc_queue[-1]]>preorder[v]: - k=scc_queue.pop() - scc_found[k]=True - scc.append(k) - scc_list.append(scc) - else: - scc_queue.append(v) - scc_list.sort(key=len,reverse=True) - return scc_list - - -def kosaraju_strongly_connected_components(G,source=None): - """Return nodes in strongly connected components of graph. - - Parameters - ---------- - G : NetworkX Graph - An directed graph. - - Returns - ------- - comp : list of lists - A list of nodes for each component of G. - The list is ordered from largest connected component to smallest. - - Raises - ------ - NetworkXError: If G is undirected - - See Also - -------- - connected_components - - Notes - ----- - Uses Kosaraju's algorithm. - """ - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - Use connected_components() """) - components=[] - G=G.reverse(copy=False) - post=list(nx.dfs_postorder_nodes(G,source=source)) - G=G.reverse(copy=False) - seen={} - while post: - r=post.pop() - if r in seen: - continue - c=nx.dfs_preorder_nodes(G,r) - new=[v for v in c if v not in seen] - seen.update([(u,True) for u in new]) - components.append(new) - components.sort(key=len,reverse=True) - return components - - -def strongly_connected_components_recursive(G): - """Return nodes in strongly connected components of graph. - - Recursive version of algorithm. - - Parameters - ---------- - G : NetworkX Graph - An directed graph. - - Returns - ------- - comp : list of lists - A list of nodes for each component of G. - The list is ordered from largest connected component to smallest. - - Raises - ------ - NetworkXError : If G is undirected - - See Also - -------- - connected_components - - Notes - ----- - Uses Tarjan's algorithm with Nuutila's modifications. - - References - ---------- - .. [1] Depth-first search and linear graph algorithms, R. Tarjan - SIAM Journal of Computing 1(2):146-160, (1972). - - .. [2] On finding the strongly connected components in a directed graph. - E. Nuutila and E. Soisalon-Soinen - Information Processing Letters 49(1): 9-14, (1994).. - """ - def visit(v,cnt): - root[v]=cnt - visited[v]=cnt - cnt+=1 - stack.append(v) - for w in G[v]: - if w not in visited: visit(w,cnt) - if w not in component: - root[v]=min(root[v],root[w]) - if root[v]==visited[v]: - component[v]=root[v] - tmpc=[v] # hold nodes in this component - while stack[-1]!=v: - w=stack.pop() - component[w]=root[v] - tmpc.append(w) - stack.remove(v) - scc.append(tmpc) # add to scc list - - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - Use connected_components() """) - - scc=[] - visited={} - component={} - root={} - cnt=0 - stack=[] - for source in G: - if source not in visited: - visit(source,cnt) - - scc.sort(key=len,reverse=True) - return scc - - -def strongly_connected_component_subgraphs(G): - """Return strongly connected components as subgraphs. - - Parameters - ---------- - G : NetworkX Graph - A graph. - - Returns - ------- - glist : list - A list of graphs, one for each strongly connected component of G. - - See Also - -------- - connected_component_subgraphs - - Notes - ----- - The list is ordered from largest strongly connected component to smallest. - - Graph, node, and edge attributes are copied to the subgraphs. - """ - cc=strongly_connected_components(G) - graph_list=[] - for c in cc: - graph_list.append(G.subgraph(c).copy()) - return graph_list - - -def number_strongly_connected_components(G): - """Return number of strongly connected components in graph. - - Parameters - ---------- - G : NetworkX graph - A directed graph. - - Returns - ------- - n : integer - Number of strongly connected components - - See Also - -------- - connected_components - - Notes - ----- - For directed graphs only. - """ - return len(strongly_connected_components(G)) - - -def is_strongly_connected(G): - """Test directed graph for strong connectivity. - - Parameters - ---------- - G : NetworkX Graph - A directed graph. - - Returns - ------- - connected : bool - True if the graph is strongly connected, False otherwise. - - See Also - -------- - strongly_connected_components - - Notes - ----- - For directed graphs only. - """ - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - See is_connected() for connectivity test.""") - - if len(G)==0: - raise nx.NetworkXPointlessConcept( - """Connectivity is undefined for the null graph.""") - - return len(strongly_connected_components(G)[0])==len(G) - -def condensation(G, scc=None): - """Returns the condensation of G. - - The condensation of G is the graph with each of the strongly connected - components contracted into a single node. - - Parameters - ---------- - G : NetworkX DiGraph - A directed graph. - - scc: list (optional, default=None) - A list of strongly connected components. If provided, the elements in - `scc` must partition the nodes in `G`. If not provided, it will be - calculated as scc=nx.strongly_connected_components(G). - - Returns - ------- - C : NetworkX DiGraph - The condensation of G. The node labels are integers corresponding - to the index of the component in the list of strongly connected - components. - - Raises - ------ - NetworkXError: If G is not directed - - Notes - ----- - After contracting all strongly connected components to a single node, - the resulting graph is a directed acyclic graph. - """ - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - See is_connected() for connectivity test.""") - if scc is None: - scc = nx.strongly_connected_components(G) - mapping = {} - C = nx.DiGraph() - for i,component in enumerate(scc): - for n in component: - mapping[n] = i - C.add_nodes_from(range(len(scc))) - for u,v in G.edges(): - if mapping[u] != mapping[v]: - C.add_edge(mapping[u],mapping[v]) - return C diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_attracting.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_attracting.py deleted file mode 100644 index c2108dd..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_attracting.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - - -class TestAttractingComponents(object): - def setUp(self): - self.G1 = nx.DiGraph() - self.G1.add_edges_from([(5,11),(11,2),(11,9),(11,10), - (7,11),(7,8),(8,9),(3,8),(3,10)]) - self.G2 = nx.DiGraph() - self.G2.add_edges_from([(0,1),(0,2),(1,1),(1,2),(2,1)]) - - self.G3 = nx.DiGraph() - self.G3.add_edges_from([(0,1),(1,2),(2,1),(0,3),(3,4),(4,3)]) - - def test_attracting_components(self): - ac = nx.attracting_components(self.G1) - assert_true([2] in ac) - assert_true([9] in ac) - assert_true([10] in ac) - - ac = nx.attracting_components(self.G2) - ac = [tuple(sorted(x)) for x in ac] - assert_true(ac == [(1,2)]) - - ac = nx.attracting_components(self.G3) - ac = [tuple(sorted(x)) for x in ac] - assert_true((1,2) in ac) - assert_true((3,4) in ac) - assert_equal(len(ac), 2) - - def test_number_attacting_components(self): - assert_equal(len(nx.attracting_components(self.G1)), 3) - assert_equal(len(nx.attracting_components(self.G2)), 1) - assert_equal(len(nx.attracting_components(self.G3)), 2) - - def test_is_attracting_component(self): - assert_false(nx.is_attracting_component(self.G1)) - assert_false(nx.is_attracting_component(self.G2)) - assert_false(nx.is_attracting_component(self.G3)) - g2 = self.G3.subgraph([1,2]) - assert_true(nx.is_attracting_component(g2)) - - def test_attracting_component_subgraphs(self): - subgraphs = nx.attracting_component_subgraphs(self.G1) - for subgraph in subgraphs: - assert_equal(len(subgraph), 1) - - self.G2.add_edge(1,2,eattr='red') # test attrs copied to subgraphs - self.G2.node[2]['nattr']='blue' - self.G2.graph['gattr']='green' - subgraphs = nx.attracting_component_subgraphs(self.G2) - assert_equal(len(subgraphs), 1) - SG2=subgraphs[0] - assert_true(1 in SG2) - assert_true(2 in SG2) - assert_equal(SG2[1][2]['eattr'],'red') - assert_equal(SG2.node[2]['nattr'],'blue') - assert_equal(SG2.graph['gattr'],'green') - SG2.add_edge(1,2,eattr='blue') - assert_equal(SG2[1][2]['eattr'],'blue') - assert_equal(self.G2[1][2]['eattr'],'red') - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_biconnected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_biconnected.py deleted file mode 100644 index 85f967a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_biconnected.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx.algorithms.components import biconnected - -def assert_components_equal(x,y): - sx = set((frozenset([frozenset(e) for e in c]) for c in x)) - sy = set((frozenset([frozenset(e) for e in c]) for c in y)) - assert_equal(sx,sy) - -def test_barbell(): - G=nx.barbell_graph(8,4) - G.add_path([7,20,21,22]) - G.add_cycle([22,23,24,25]) - pts=set(biconnected.articulation_points(G)) - assert_equal(pts,set([7,8,9,10,11,12,20,21,22])) - - answer = [set([12, 13, 14, 15, 16, 17, 18, 19]), - set([0, 1, 2, 3, 4, 5, 6, 7]), - set([22, 23, 24, 25]), - set([11, 12]), - set([10, 11]), - set([9, 10]), - set([8, 9]), - set([7, 8]), - set([21, 22]), - set([20, 21]), - set([7, 20])] - bcc=list(biconnected.biconnected_components(G)) - bcc.sort(key=len, reverse=True) - assert_equal(bcc,answer) - - G.add_edge(2,17) - pts=set(biconnected.articulation_points(G)) - assert_equal(pts,set([7,20,21,22])) - -def test_articulation_points_cycle(): - G=nx.cycle_graph(3) - G.add_cycle([1,3,4]) - pts=set(biconnected.articulation_points(G)) - assert_equal(pts,set([1])) - -def test_is_biconnected(): - G=nx.cycle_graph(3) - assert_true(biconnected.is_biconnected(G)) - G.add_cycle([1,3,4]) - assert_false(biconnected.is_biconnected(G)) - -def test_empty_is_biconnected(): - G=nx.empty_graph(5) - assert_false(biconnected.is_biconnected(G)) - G.add_edge(0,1) - assert_false(biconnected.is_biconnected(G)) - -def test_biconnected_components_cycle(): - G=nx.cycle_graph(3) - G.add_cycle([1,3,4]) - pts = set(map(frozenset,biconnected.biconnected_components(G))) - assert_equal(pts,set([frozenset([0,1,2]),frozenset([1,3,4])])) - -def test_biconnected_component_subgraphs_cycle(): - G=nx.cycle_graph(3) - G.add_cycle([1,3,4,5]) - G.add_edge(1,3,eattr='red') # test copying of edge data - G.node[1]['nattr']='blue' - G.graph['gattr']='green' - Gc = set(biconnected.biconnected_component_subgraphs(G)) - assert_equal(len(Gc),2) - g1,g2=Gc - if 0 in g1: - assert_true(nx.is_isomorphic(g1,nx.Graph([(0,1),(0,2),(1,2)]))) - assert_true(nx.is_isomorphic(g2,nx.Graph([(1,3),(1,5),(3,4),(4,5)]))) - assert_equal(g2[1][3]['eattr'],'red') - assert_equal(g2.node[1]['nattr'],'blue') - assert_equal(g2.graph['gattr'],'green') - g2[1][3]['eattr']='blue' - assert_equal(g2[1][3]['eattr'],'blue') - assert_equal(G[1][3]['eattr'],'red') - else: - assert_true(nx.is_isomorphic(g1,nx.Graph([(1,3),(1,5),(3,4),(4,5)]))) - assert_true(nx.is_isomorphic(g2,nx.Graph([(0,1),(0,2),(1,2)]))) - assert_equal(g1[1][3]['eattr'],'red') - assert_equal(g1.node[1]['nattr'],'blue') - assert_equal(g1.graph['gattr'],'green') - g1[1][3]['eattr']='blue' - assert_equal(g1[1][3]['eattr'],'blue') - assert_equal(G[1][3]['eattr'],'red') - - -def test_biconnected_components1(): - # graph example from - # http://www.ibluemojo.com/school/articul_algorithm.html - edges=[(0,1), - (0,5), - (0,6), - (0,14), - (1,5), - (1,6), - (1,14), - (2,4), - (2,10), - (3,4), - (3,15), - (4,6), - (4,7), - (4,10), - (5,14), - (6,14), - (7,9), - (8,9), - (8,12), - (8,13), - (10,15), - (11,12), - (11,13), - (12,13)] - G=nx.Graph(edges) - pts = set(biconnected.articulation_points(G)) - assert_equal(pts,set([4,6,7,8,9])) - comps = list(biconnected.biconnected_component_edges(G)) - answer = [ - [(3,4),(15,3),(10,15),(10,4),(2,10),(4,2)], - [(13,12),(13,8),(11,13),(12,11),(8,12)], - [(9,8)], - [(7,9)], - [(4,7)], - [(6,4)], - [(14,0),(5,1),(5,0),(14,5),(14,1),(6,14),(6,0),(1,6),(0,1)], - ] - assert_components_equal(comps,answer) - -def test_biconnected_components2(): - G=nx.Graph() - G.add_cycle('ABC') - G.add_cycle('CDE') - G.add_cycle('FIJHG') - G.add_cycle('GIJ') - G.add_edge('E','G') - comps = list(biconnected.biconnected_component_edges(G)) - answer = [ - [tuple('GF'),tuple('FI'),tuple('IG'),tuple('IJ'),tuple('JG'),tuple('JH'),tuple('HG')], - [tuple('EG')], - [tuple('CD'),tuple('DE'),tuple('CE')], - [tuple('AB'),tuple('BC'),tuple('AC')] - ] - assert_components_equal(comps,answer) - -def test_biconnected_davis(): - D = nx.davis_southern_women_graph() - bcc = list(biconnected.biconnected_components(D))[0] - assert_true(set(D) == bcc) # All nodes in a giant bicomponent - # So no articulation points - assert_equal(list(biconnected.articulation_points(D)),[]) - -def test_biconnected_karate(): - K = nx.karate_club_graph() - answer = [set([0, 1, 2, 3, 7, 8, 9, 12, 13, 14, 15, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]), - set([0, 4, 5, 6, 10, 16]), - set([0, 11])] - bcc = list(biconnected.biconnected_components(K)) - bcc.sort(key=len, reverse=True) - assert_true(list(biconnected.biconnected_components(K)) == answer) - assert_equal(list(biconnected.articulation_points(K)),[0]) - -def test_biconnected_eppstein(): - # tests from http://www.ics.uci.edu/~eppstein/PADS/Biconnectivity.py - G1 = nx.Graph({ - 0: [1,2,5], - 1: [0,5], - 2: [0,3,4], - 3: [2,4,5,6], - 4: [2,3,5,6], - 5: [0,1,3,4], - 6: [3,4]}) - G2 = nx.Graph({ - 0: [2,5], - 1: [3,8], - 2: [0,3,5], - 3: [1,2,6,8], - 4: [7], - 5: [0,2], - 6: [3,8], - 7: [4], - 8: [1,3,6]}) - assert_true(biconnected.is_biconnected(G1)) - assert_false(biconnected.is_biconnected(G2)) - answer_G2 = [set([1, 3, 6, 8]), set([0, 2, 5]), set([2, 3]), set([4, 7])] - bcc = list(biconnected.biconnected_components(G2)) - bcc.sort(key=len, reverse=True) - assert_equal(bcc, answer_G2) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_connected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_connected.py deleted file mode 100644 index ae0247b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_connected.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx import convert_node_labels_to_integers as cnlti -from networkx import NetworkXError - -class TestConnected: - - def setUp(self): - G1=cnlti(nx.grid_2d_graph(2,2),first_label=0,ordering="sorted") - G2=cnlti(nx.lollipop_graph(3,3),first_label=4,ordering="sorted") - G3=cnlti(nx.house_graph(),first_label=10,ordering="sorted") - self.G=nx.union(G1,G2) - self.G=nx.union(self.G,G3) - self.DG=nx.DiGraph([(1,2),(1,3),(2,3)]) - self.grid=cnlti(nx.grid_2d_graph(4,4),first_label=1) - - def test_connected_components(self): - cc=nx.connected_components - G=self.G - C=[[0, 1, 2, 3], [4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] - assert_equal(sorted([sorted(g) for g in cc(G)]),sorted(C)) - - def test_number_connected_components(self): - ncc=nx.number_connected_components - assert_equal(ncc(self.G),3) - - def test_number_connected_components2(self): - ncc=nx.number_connected_components - assert_equal(ncc(self.grid),1) - - def test_connected_components2(self): - cc=nx.connected_components - G=self.grid - C=[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] - assert_equal(sorted([sorted(g) for g in cc(G)]),sorted(C)) - - def test_node_connected_components(self): - ncc=nx.node_connected_component - G=self.grid - C=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] - assert_equal(sorted(ncc(G,1)),sorted(C)) - - def test_connected_component_subgraphs(self): - G=self.grid - G.add_edge(1,2,eattr='red') # test attributes copied to subgraphs - G.node[1]['nattr']='blue' - G.graph['gattr']='green' - ccs=nx.connected_component_subgraphs(G) - assert_equal(len(ccs),1) - sg=ccs[0] - assert_equal(sorted(sg.nodes()),list(range(1,17))) - assert_equal(sg[1][2]['eattr'],'red') - assert_equal(sg.node[1]['nattr'],'blue') - assert_equal(sg.graph['gattr'],'green') - sg[1][2]['eattr']='blue' - assert_equal(G[1][2]['eattr'],'red') - assert_equal(sg[1][2]['eattr'],'blue') - - - def test_is_connected(self): - assert_true(nx.is_connected(self.grid)) - G=nx.Graph() - G.add_nodes_from([1,2]) - assert_false(nx.is_connected(G)) - - def test_connected_raise(self): - assert_raises(NetworkXError,nx.connected_components,self.DG) - assert_raises(NetworkXError,nx.number_connected_components,self.DG) - assert_raises(NetworkXError,nx.connected_component_subgraphs,self.DG) - assert_raises(NetworkXError,nx.node_connected_component,self.DG,1) - assert_raises(NetworkXError,nx.is_connected,self.DG) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_strongly_connected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_strongly_connected.py deleted file mode 100644 index d2569a9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_strongly_connected.py +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx import NetworkXError - -class TestStronglyConnected: - - def setUp(self): - self.gc=[] - G=nx.DiGraph() - G.add_edges_from([(1,2),(2,3),(2,8),(3,4),(3,7), - (4,5),(5,3),(5,6),(7,4),(7,6),(8,1),(8,7)]) - C=[[3, 4, 5, 7], [1, 2, 8], [6]] - self.gc.append((G,C)) - - G= nx.DiGraph() - G.add_edges_from([(1,2),(1,3),(1,4),(4,2),(3,4),(2,3)]) - C = [[2, 3, 4],[1]] - self.gc.append((G,C)) - - G = nx.DiGraph() - G.add_edges_from([(1,2),(2,3),(3,2),(2,1)]) - C = [[1, 2, 3]] - self.gc.append((G,C)) - - # Eppstein's tests - G = nx.DiGraph({ 0:[1],1:[2,3],2:[4,5],3:[4,5],4:[6],5:[],6:[]}) - C = [[0],[1],[2],[3],[4],[5],[6]] - self.gc.append((G,C)) - - G = nx.DiGraph({0:[1],1:[2,3,4],2:[0,3],3:[4],4:[3]}) - C = [[0,1,2],[3,4]] - self.gc.append((G,C)) - - - def test_tarjan(self): - scc=nx.strongly_connected_components - for G,C in self.gc: - assert_equal(sorted([sorted(g) for g in scc(G)]),sorted(C)) - - - def test_tarjan_recursive(self): - scc=nx.strongly_connected_components_recursive - for G,C in self.gc: - assert_equal(sorted([sorted(g) for g in scc(G)]),sorted(C)) - - - def test_kosaraju(self): - scc=nx.kosaraju_strongly_connected_components - for G,C in self.gc: - assert_equal(sorted([sorted(g) for g in scc(G)]),sorted(C)) - - def test_number_strongly_connected_components(self): - ncc=nx.number_strongly_connected_components - for G,C in self.gc: - assert_equal(ncc(G),len(C)) - - def test_is_strongly_connected(self): - for G,C in self.gc: - if len(C)==1: - assert_true(nx.is_strongly_connected(G)) - else: - assert_false(nx.is_strongly_connected(G)) - - - def test_strongly_connected_component_subgraphs(self): - scc=nx.strongly_connected_component_subgraphs - for G,C in self.gc: - assert_equal(sorted([sorted(g.nodes()) for g in scc(G)]),sorted(C)) - G,C=self.gc[0] - G.add_edge(1,2,eattr='red') - G.node[1]['nattr']='blue' - G.graph['gattr']='green' - sgs=scc(G)[1] - assert_equal(sgs[1][2]['eattr'],'red') - assert_equal(sgs.node[1]['nattr'],'blue') - assert_equal(sgs.graph['gattr'],'green') - sgs[1][2]['eattr']='blue' - assert_equal(G[1][2]['eattr'],'red') - assert_equal(sgs[1][2]['eattr'],'blue') - - def test_contract_scc1(self): - G = nx.DiGraph() - G.add_edges_from([(1,2),(2,3),(2,11),(2,12),(3,4),(4,3),(4,5), - (5,6),(6,5),(6,7),(7,8),(7,9),(7,10),(8,9), - (9,7),(10,6),(11,2),(11,4),(11,6),(12,6),(12,11)]) - scc = nx.strongly_connected_components(G) - cG = nx.condensation(G, scc) - # DAG - assert_true(nx.is_directed_acyclic_graph(cG)) - # # nodes - assert_equal(sorted(cG.nodes()),[0,1,2,3]) - # # edges - mapping={} - for i,component in enumerate(scc): - for n in component: - mapping[n] = i - edge=(mapping[2],mapping[3]) - assert_true(cG.has_edge(*edge)) - edge=(mapping[2],mapping[5]) - assert_true(cG.has_edge(*edge)) - edge=(mapping[3],mapping[5]) - assert_true(cG.has_edge(*edge)) - - def test_contract_scc_isolate(self): - # Bug found and fixed in [1687]. - G = nx.DiGraph() - G.add_edge(1,2) - G.add_edge(2,1) - scc = nx.strongly_connected_components(G) - cG = nx.condensation(G, scc) - assert_equal(cG.nodes(),[0]) - assert_equal(cG.edges(),[]) - - def test_contract_scc_edge(self): - G = nx.DiGraph() - G.add_edge(1,2) - G.add_edge(2,1) - G.add_edge(2,3) - G.add_edge(3,4) - G.add_edge(4,3) - scc = nx.strongly_connected_components(G) - cG = nx.condensation(G, scc) - assert_equal(cG.nodes(),[0,1]) - if 1 in scc[0]: - edge = (0,1) - else: - edge = (1,0) - assert_equal(cG.edges(),[edge]) - - def test_connected_raise(self): - G=nx.Graph() - assert_raises(NetworkXError,nx.strongly_connected_components,G) - assert_raises(NetworkXError,nx.kosaraju_strongly_connected_components,G) - assert_raises(NetworkXError,nx.strongly_connected_components_recursive,G) - assert_raises(NetworkXError,nx.strongly_connected_component_subgraphs,G) - assert_raises(NetworkXError,nx.is_strongly_connected,G) - assert_raises(NetworkXError,nx.condensation,G) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_weakly_connected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_weakly_connected.py deleted file mode 100644 index d05e8ed..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/tests/test_weakly_connected.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx import NetworkXError - -class TestWeaklyConnected: - - def setUp(self): - self.gc=[] - G=nx.DiGraph() - G.add_edges_from([(1,2),(2,3),(2,8),(3,4),(3,7), - (4,5),(5,3),(5,6),(7,4),(7,6),(8,1),(8,7)]) - C=[[3, 4, 5, 7], [1, 2, 8], [6]] - self.gc.append((G,C)) - - G= nx.DiGraph() - G.add_edges_from([(1,2),(1,3),(1,4),(4,2),(3,4),(2,3)]) - C = [[2, 3, 4],[1]] - self.gc.append((G,C)) - - G = nx.DiGraph() - G.add_edges_from([(1,2),(2,3),(3,2),(2,1)]) - C = [[1, 2, 3]] - self.gc.append((G,C)) - - # Eppstein's tests - G = nx.DiGraph({ 0:[1],1:[2,3],2:[4,5],3:[4,5],4:[6],5:[],6:[]}) - C = [[0],[1],[2],[3],[4],[5],[6]] - self.gc.append((G,C)) - - G = nx.DiGraph({0:[1],1:[2,3,4],2:[0,3],3:[4],4:[3]}) - C = [[0,1,2],[3,4]] - self.gc.append((G,C)) - - - def test_weakly_connected_components(self): - wcc=nx.weakly_connected_components - cc=nx.connected_components - for G,C in self.gc: - U=G.to_undirected() - w=sorted([sorted(g) for g in wcc(G)]) - c=sorted([sorted(g) for g in cc(U)]) - assert_equal(w,c) - - def test_number_weakly_connected_components(self): - wcc=nx.number_weakly_connected_components - cc=nx.number_connected_components - for G,C in self.gc: - U=G.to_undirected() - w=wcc(G) - c=cc(U) - assert_equal(w,c) - - def test_weakly_connected_component_subgraphs(self): - wcc=nx.weakly_connected_component_subgraphs - cc=nx.connected_component_subgraphs - for G,C in self.gc: - U=G.to_undirected() - w=sorted([sorted(g.nodes()) for g in wcc(G)]) - c=sorted([sorted(g.nodes()) for g in cc(U)]) - assert_equal(w,c) - G,C=self.gc[0] - G.add_edge(1,2,eattr='red') - G.node[1]['nattr']='blue' - G.graph['gattr']='green' - sgs=wcc(G)[0] - assert_equal(sgs[1][2]['eattr'],'red') - assert_equal(sgs.node[1]['nattr'],'blue') - assert_equal(sgs.graph['gattr'],'green') - sgs[1][2]['eattr']='blue' - assert_equal(G[1][2]['eattr'],'red') - assert_equal(sgs[1][2]['eattr'],'blue') - - def test_is_weakly_connected(self): - wcc=nx.is_weakly_connected - cc=nx.is_connected - for G,C in self.gc: - U=G.to_undirected() - assert_equal(wcc(G),cc(U)) - - - def test_connected_raise(self): - G=nx.Graph() - assert_raises(NetworkXError,nx.weakly_connected_components,G) - assert_raises(NetworkXError,nx.number_weakly_connected_components,G) - assert_raises(NetworkXError,nx.weakly_connected_component_subgraphs,G) - assert_raises(NetworkXError,nx.is_weakly_connected,G) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/weakly_connected.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/weakly_connected.py deleted file mode 100644 index 410a6c2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/components/weakly_connected.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Weakly connected components. -""" -__authors__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)' - 'Christopher Ellison']) -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['number_weakly_connected_components', - 'weakly_connected_components', - 'weakly_connected_component_subgraphs', - 'is_weakly_connected' - ] - -import networkx as nx - -def weakly_connected_components(G): - """Return weakly connected components of G. - """ - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - Use connected_components() """) - seen={} - components=[] - for v in G: - if v not in seen: - c=_single_source_shortest_unipath_length(G,v) - components.append(list(c.keys())) - seen.update(c) - components.sort(key=len,reverse=True) - return components - - -def number_weakly_connected_components(G): - """Return the number of connected components in G. - For directed graphs only. - """ - return len(weakly_connected_components(G)) - -def weakly_connected_component_subgraphs(G): - """Return weakly connected components as subgraphs. - - Graph, node, and edge attributes are copied to the subgraphs. - """ - wcc=weakly_connected_components(G) - graph_list=[] - for c in wcc: - graph_list.append(G.subgraph(c).copy()) - return graph_list - -def is_weakly_connected(G): - """Test directed graph for weak connectivity. - - Parameters - ---------- - G : NetworkX Graph - A directed graph. - - Returns - ------- - connected : bool - True if the graph is weakly connected, False otherwise. - - See Also - -------- - strongly_connected_components - - Notes - ----- - For directed graphs only. - """ - if not G.is_directed(): - raise nx.NetworkXError("""Not allowed for undirected graph G. - See is_connected() for connectivity test.""") - - if len(G)==0: - raise nx.NetworkXPointlessConcept( - """Connectivity is undefined for the null graph.""") - - return len(weakly_connected_components(G)[0])==len(G) - -def _single_source_shortest_unipath_length(G,source,cutoff=None): - """Compute the shortest path lengths from source to all reachable nodes. - - The direction of the edge between nodes is ignored. - - For directed graphs only. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path - - cutoff : integer, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - lengths : dictionary - Dictionary of shortest path lengths keyed by target. - """ - # namespace speedups - Gsucc = G.succ - Gpred = G.pred - - seen={} # level (number of hops) when seen in BFS - level=0 # the current level - nextlevel = set([source]) # set of nodes to check at next level - while nextlevel: - thislevel=nextlevel # advance to next level - nextlevel = set() # and start a new list (fringe) - for v in thislevel: - if v not in seen: - seen[v]=level # set the level of vertex v - nextlevel.update(Gsucc[v]) # add successors of v - nextlevel.update(Gpred[v]) # add predecessors of v - if (cutoff is not None and cutoff <= level): break - level=level+1 - return seen # return all path lengths as dictionary diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/__init__.py deleted file mode 100644 index d14c33e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Flow based connectivity and cut algorithms -""" -from networkx.algorithms.connectivity.connectivity import * -from networkx.algorithms.connectivity.cuts import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/connectivity.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/connectivity.py deleted file mode 100644 index bf6f272..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/connectivity.py +++ /dev/null @@ -1,607 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Flow based connectivity algorithms -""" -import itertools -import networkx as nx - -__author__ = '\n'.join(['Jordi Torrents <jtorrents@milnou.net>']) - -__all__ = [ 'average_node_connectivity', - 'local_node_connectivity', - 'node_connectivity', - 'local_edge_connectivity', - 'edge_connectivity', - 'all_pairs_node_connectivity_matrix', - 'dominating_set', - ] - -def average_node_connectivity(G): - r"""Returns the average connectivity of a graph G. - - The average connectivity `\bar{\kappa}` of a graph G is the average - of local node connectivity over all pairs of nodes of G [1]_ . - - .. math:: - - \bar{\kappa}(G) = \frac{\sum_{u,v} \kappa_{G}(u,v)}{{n \choose 2}} - - Parameters - ---------- - - G : NetworkX graph - Undirected graph - - Returns - ------- - K : float - Average node connectivity - - See also - -------- - local_node_connectivity - node_connectivity - local_edge_connectivity - edge_connectivity - max_flow - ford_fulkerson - - References - ---------- - .. [1] Beineke, L., O. Oellermann, and R. Pippert (2002). The average - connectivity of a graph. Discrete mathematics 252(1-3), 31-45. - http://www.sciencedirect.com/science/article/pii/S0012365X01001807 - - """ - if G.is_directed(): - iter_func = itertools.permutations - else: - iter_func = itertools.combinations - - H, mapping = _aux_digraph_node_connectivity(G) - num = 0. - den = 0. - for u,v in iter_func(G, 2): - den += 1 - num += local_node_connectivity(G, u, v, aux_digraph=H, mapping=mapping) - - if den == 0: # Null Graph - return 0 - return num/den - -def _aux_digraph_node_connectivity(G): - r""" Creates a directed graph D from an undirected graph G to compute flow - based node connectivity. - - For an undirected graph G having `n` nodes and `m` edges we derive a - directed graph D with 2n nodes and 2m+n arcs by replacing each - original node `v` with two nodes `vA`,`vB` linked by an (internal) - arc in D. Then for each edge (u,v) in G we add two arcs (uB,vA) - and (vB,uA) in D. Finally we set the attribute capacity = 1 for each - arc in D [1]. - - For a directed graph having `n` nodes and `m` arcs we derive a - directed graph D with 2n nodes and m+n arcs by replacing each - original node `v` with two nodes `vA`,`vB` linked by an (internal) - arc `(vA,vB)` in D. Then for each arc (u,v) in G we add one arc (uB,vA) - in D. Finally we set the attribute capacity = 1 for each arc in D. - - References - ---------- - .. [1] Kammer, Frank and Hanjo Taubig. Graph Connectivity. in Brandes and - Erlebach, 'Network Analysis: Methodological Foundations', Lecture - Notes in Computer Science, Volume 3418, Springer-Verlag, 2005. - http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf - - """ - directed = G.is_directed() - - mapping = {} - D = nx.DiGraph() - for i,node in enumerate(G): - mapping[node] = i - D.add_node('%dA' % i,id=node) - D.add_node('%dB' % i,id=node) - D.add_edge('%dA' % i, '%dB' % i, capacity=1) - - edges = [] - for (source, target) in G.edges(): - edges.append(('%sB' % mapping[source], '%sA' % mapping[target])) - if not directed: - edges.append(('%sB' % mapping[target], '%sA' % mapping[source])) - - D.add_edges_from(edges, capacity=1) - return D, mapping - -def local_node_connectivity(G, s, t, aux_digraph=None, mapping=None): - r"""Computes local node connectivity for nodes s and t. - - Local node connectivity for two non adjacent nodes s and t is the - minimum number of nodes that must be removed (along with their incident - edges) to disconnect them. - - This is a flow based implementation of node connectivity. We compute the - maximum flow on an auxiliary digraph build from the original input - graph (see below for details). This is equal to the local node - connectivity because the value of a maximum s-t-flow is equal to the - capacity of a minimum s-t-cut (Ford and Fulkerson theorem) [1]_ . - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - s : node - Source node - - t : node - Target node - - aux_digraph : NetworkX DiGraph (default=None) - Auxiliary digraph to compute flow based node connectivity. If None - the auxiliary digraph is build. - - mapping : dict (default=None) - Dictionary with a mapping of node names in G and in the auxiliary digraph. - - Returns - ------- - K : integer - local node connectivity for nodes s and t - - Examples - -------- - >>> # Platonic icosahedral graph has node connectivity 5 - >>> # for each non adjacent node pair - >>> G = nx.icosahedral_graph() - >>> nx.local_node_connectivity(G,0,6) - 5 - - Notes - ----- - This is a flow based implementation of node connectivity. We compute the - maximum flow using the Ford and Fulkerson algorithm on an auxiliary digraph - build from the original input graph: - - For an undirected graph G having `n` nodes and `m` edges we derive a - directed graph D with 2n nodes and 2m+n arcs by replacing each - original node `v` with two nodes `v_A`, `v_B` linked by an (internal) - arc in `D`. Then for each edge (`u`, `v`) in G we add two arcs - (`u_B`, `v_A`) and (`v_B`, `u_A`) in `D`. Finally we set the attribute - capacity = 1 for each arc in `D` [1]_ . - - For a directed graph G having `n` nodes and `m` arcs we derive a - directed graph `D` with `2n` nodes and `m+n` arcs by replacing each - original node `v` with two nodes `v_A`, `v_B` linked by an (internal) - arc `(v_A, v_B)` in D. Then for each arc `(u,v)` in G we add one arc - `(u_B,v_A)` in `D`. Finally we set the attribute capacity = 1 for - each arc in `D`. - - This is equal to the local node connectivity because the value of - a maximum s-t-flow is equal to the capacity of a minimum s-t-cut (Ford - and Fulkerson theorem). - - See also - -------- - node_connectivity - all_pairs_node_connectivity_matrix - local_edge_connectivity - edge_connectivity - max_flow - ford_fulkerson - - References - ---------- - .. [1] Kammer, Frank and Hanjo Taubig. Graph Connectivity. in Brandes and - Erlebach, 'Network Analysis: Methodological Foundations', Lecture - Notes in Computer Science, Volume 3418, Springer-Verlag, 2005. - http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf - - """ - if aux_digraph is None or mapping is None: - H, mapping = _aux_digraph_node_connectivity(G) - else: - H = aux_digraph - return nx.max_flow(H,'%sB' % mapping[s], '%sA' % mapping[t]) - -def node_connectivity(G, s=None, t=None): - r"""Returns node connectivity for a graph or digraph G. - - Node connectivity is equal to the minimum number of nodes that - must be removed to disconnect G or render it trivial. If source - and target nodes are provided, this function returns the local node - connectivity: the minimum number of nodes that must be removed to break - all paths from source to target in G. - - This is a flow based implementation. The algorithm is based in - solving a number of max-flow problems (ie local st-node connectivity, - see local_node_connectivity) to determine the capacity of the - minimum cut on an auxiliary directed network that corresponds to the - minimum node cut of G. It handles both directed and undirected graphs. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - s : node - Source node. Optional (default=None) - - t : node - Target node. Optional (default=None) - - Returns - ------- - K : integer - Node connectivity of G, or local node connectivity if source - and target were provided - - Examples - -------- - >>> # Platonic icosahedral graph is 5-node-connected - >>> G = nx.icosahedral_graph() - >>> nx.node_connectivity(G) - 5 - >>> nx.node_connectivity(G, 3, 7) - 5 - - Notes - ----- - This is a flow based implementation of node connectivity. The - algorithm works by solving `O((n-\delta-1+\delta(\delta-1)/2)` max-flow - problems on an auxiliary digraph. Where `\delta` is the minimum degree - of G. For details about the auxiliary digraph and the computation of - local node connectivity see local_node_connectivity. - - This implementation is based on algorithm 11 in [1]_. We use the Ford - and Fulkerson algorithm to compute max flow (see ford_fulkerson). - - See also - -------- - local_node_connectivity - all_pairs_node_connectivity_matrix - local_edge_connectivity - edge_connectivity - max_flow - ford_fulkerson - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - - """ - # Local node connectivity - if s is not None and t is not None: - if s not in G: - raise nx.NetworkXError('node %s not in graph' % s) - if t not in G: - raise nx.NetworkXError('node %s not in graph' % t) - return local_node_connectivity(G, s, t) - # Global node connectivity - if G.is_directed(): - if not nx.is_weakly_connected(G): - return 0 - iter_func = itertools.permutations - # I think that it is necessary to consider both predecessors - # and successors for directed graphs - def neighbors(v): - return itertools.chain.from_iterable([G.predecessors_iter(v), - G.successors_iter(v)]) - else: - if not nx.is_connected(G): - return 0 - iter_func = itertools.combinations - neighbors = G.neighbors_iter - # Initial guess \kappa = n - 1 - K = G.order()-1 - deg = G.degree() - min_deg = min(deg.values()) - v = next(n for n,d in deg.items() if d==min_deg) - # Reuse the auxiliary digraph - H, mapping = _aux_digraph_node_connectivity(G) - # compute local node connectivity with all non-neighbors nodes - for w in set(G) - set(neighbors(v)) - set([v]): - K = min(K, local_node_connectivity(G, v, w, - aux_digraph=H, mapping=mapping)) - # Same for non adjacent pairs of neighbors of v - for x,y in iter_func(neighbors(v), 2): - if y in G[x]: continue - K = min(K, local_node_connectivity(G, x, y, - aux_digraph=H, mapping=mapping)) - return K - -def all_pairs_node_connectivity_matrix(G): - """Return a numpy 2d ndarray with node connectivity between all pairs - of nodes. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - K : 2d numpy ndarray - node connectivity between all pairs of nodes. - - See also - -------- - local_node_connectivity - node_connectivity - local_edge_connectivity - edge_connectivity - max_flow - ford_fulkerson - - """ - try: - import numpy - except ImportError: - raise ImportError(\ - "all_pairs_node_connectivity_matrix() requires NumPy") - - n = G.order() - M = numpy.zeros((n, n), dtype=int) - # Create auxiliary Digraph - D, mapping = _aux_digraph_node_connectivity(G) - - if G.is_directed(): - for u, v in itertools.permutations(G, 2): - K = local_node_connectivity(G, u, v, aux_digraph=D, mapping=mapping) - M[mapping[u],mapping[v]] = K - else: - for u, v in itertools.combinations(G, 2): - K = local_node_connectivity(G, u, v, aux_digraph=D, mapping=mapping) - M[mapping[u],mapping[v]] = M[mapping[v],mapping[u]] = K - - return M - -def _aux_digraph_edge_connectivity(G): - """Auxiliary digraph for computing flow based edge connectivity - - If the input graph is undirected, we replace each edge (u,v) with - two reciprocal arcs (u,v) and (v,u) and then we set the attribute - 'capacity' for each arc to 1. If the input graph is directed we simply - add the 'capacity' attribute. Part of algorithm 1 in [1]_ . - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. (this is a - chapter, look for the reference of the book). - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - """ - if G.is_directed(): - if nx.get_edge_attributes(G, 'capacity'): - return G - D = G.copy() - capacity = dict((e,1) for e in D.edges()) - nx.set_edge_attributes(D, 'capacity', capacity) - return D - else: - D = G.to_directed() - capacity = dict((e,1) for e in D.edges()) - nx.set_edge_attributes(D, 'capacity', capacity) - return D - -def local_edge_connectivity(G, u, v, aux_digraph=None): - r"""Returns local edge connectivity for nodes s and t in G. - - Local edge connectivity for two nodes s and t is the minimum number - of edges that must be removed to disconnect them. - - This is a flow based implementation of edge connectivity. We compute the - maximum flow on an auxiliary digraph build from the original - network (see below for details). This is equal to the local edge - connectivity because the value of a maximum s-t-flow is equal to the - capacity of a minimum s-t-cut (Ford and Fulkerson theorem) [1]_ . - - Parameters - ---------- - G : NetworkX graph - Undirected or directed graph - - s : node - Source node - - t : node - Target node - - aux_digraph : NetworkX DiGraph (default=None) - Auxiliary digraph to compute flow based edge connectivity. If None - the auxiliary digraph is build. - - Returns - ------- - K : integer - local edge connectivity for nodes s and t - - Examples - -------- - >>> # Platonic icosahedral graph has edge connectivity 5 - >>> # for each non adjacent node pair - >>> G = nx.icosahedral_graph() - >>> nx.local_edge_connectivity(G,0,6) - 5 - - Notes - ----- - This is a flow based implementation of edge connectivity. We compute the - maximum flow using the Ford and Fulkerson algorithm on an auxiliary digraph - build from the original graph: - - If the input graph is undirected, we replace each edge (u,v) with - two reciprocal arcs `(u,v)` and `(v,u)` and then we set the attribute - 'capacity' for each arc to 1. If the input graph is directed we simply - add the 'capacity' attribute. This is an implementation of algorithm 1 - in [1]_. - - The maximum flow in the auxiliary network is equal to the local edge - connectivity because the value of a maximum s-t-flow is equal to the - capacity of a minimum s-t-cut (Ford and Fulkerson theorem). - - See also - -------- - local_node_connectivity - node_connectivity - edge_connectivity - max_flow - ford_fulkerson - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - - """ - if aux_digraph is None: - H = _aux_digraph_edge_connectivity(G) - else: - H = aux_digraph - return nx.max_flow(H, u, v) - -def edge_connectivity(G, s=None, t=None): - r"""Returns the edge connectivity of the graph or digraph G. - - The edge connectivity is equal to the minimum number of edges that - must be removed to disconnect G or render it trivial. If source - and target nodes are provided, this function returns the local edge - connectivity: the minimum number of edges that must be removed to - break all paths from source to target in G. - - This is a flow based implementation. The algorithm is based in solving - a number of max-flow problems (ie local st-edge connectivity, see - local_edge_connectivity) to determine the capacity of the minimum - cut on an auxiliary directed network that corresponds to the minimum - edge cut of G. It handles both directed and undirected graphs. - - Parameters - ---------- - G : NetworkX graph - Undirected or directed graph - - s : node - Source node. Optional (default=None) - - t : node - Target node. Optional (default=None) - - Returns - ------- - K : integer - Edge connectivity for G, or local edge connectivity if source - and target were provided - - Examples - -------- - >>> # Platonic icosahedral graph is 5-edge-connected - >>> G = nx.icosahedral_graph() - >>> nx.edge_connectivity(G) - 5 - - Notes - ----- - This is a flow based implementation of global edge connectivity. For - undirected graphs the algorithm works by finding a 'small' dominating - set of nodes of G (see algorithm 7 in [1]_ ) and computing local max flow - (see local_edge_connectivity) between an arbitrary node in the dominating - set and the rest of nodes in it. This is an implementation of - algorithm 6 in [1]_ . - - For directed graphs, the algorithm does n calls to the max flow function. - This is an implementation of algorithm 8 in [1]_ . We use the Ford and - Fulkerson algorithm to compute max flow (see ford_fulkerson). - - See also - -------- - local_node_connectivity - node_connectivity - local_edge_connectivity - max_flow - ford_fulkerson - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - - """ - # Local edge connectivity - if s is not None and t is not None: - if s not in G: - raise nx.NetworkXError('node %s not in graph' % s) - if t not in G: - raise nx.NetworkXError('node %s not in graph' % t) - return local_edge_connectivity(G, s, t) - # Global edge connectivity - if G.is_directed(): - # Algorithm 8 in [1] - if not nx.is_weakly_connected(G): - return 0 - # initial value for lambda is min degree (\delta(G)) - L = min(G.degree().values()) - # reuse auxiliary digraph - H = _aux_digraph_edge_connectivity(G) - nodes = G.nodes() - n = len(nodes) - for i in range(n): - try: - L = min(L, local_edge_connectivity(G, nodes[i], - nodes[i+1], aux_digraph=H)) - except IndexError: # last node! - L = min(L, local_edge_connectivity(G, nodes[i], - nodes[0], aux_digraph=H)) - return L - else: # undirected - # Algorithm 6 in [1] - if not nx.is_connected(G): - return 0 - # initial value for lambda is min degree (\delta(G)) - L = min(G.degree().values()) - # reuse auxiliary digraph - H = _aux_digraph_edge_connectivity(G) - # A dominating set is \lambda-covering - # We need a dominating set with at least two nodes - for node in G: - D = dominating_set(G, start_with=node) - v = D.pop() - if D: break - else: - # in complete graphs the dominating sets will always be of one node - # thus we return min degree - return L - for w in D: - L = min(L, local_edge_connectivity(G, v, w, aux_digraph=H)) - return L - -def dominating_set(G, start_with=None): - # Algorithm 7 in [1] - all_nodes = set(G) - if start_with is None: - v = set(G).pop() # pick a node - else: - if start_with not in G: - raise nx.NetworkXError('node %s not in G' % start_with) - v = start_with - D = set([v]) - ND = set([nbr for nbr in G[v]]) - other = all_nodes - ND - D - while other: - w = other.pop() - D.add(w) - ND.update([nbr for nbr in G[w] if nbr not in D]) - other = all_nodes - ND - D - return D - -def is_dominating_set(G, nbunch): - # Proposed by Dan on the mailing list - allnodes=set(G) - testset=set(n for n in nbunch if n in G) - nbrs=set() - for n in testset: - nbrs.update(G[n]) - if nbrs - allnodes: # some nodes left--not dominating - return False - else: - return True - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/cuts.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/cuts.py deleted file mode 100644 index a55bc0d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/cuts.py +++ /dev/null @@ -1,382 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Flow based cut algorithms -""" -# http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf -# http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf -import itertools -from operator import itemgetter -import networkx as nx -from networkx.algorithms.connectivity.connectivity import \ - _aux_digraph_node_connectivity, _aux_digraph_edge_connectivity, \ - dominating_set, node_connectivity - -__author__ = '\n'.join(['Jordi Torrents <jtorrents@milnou.net>']) - -__all__ = [ 'minimum_st_node_cut', - 'minimum_node_cut', - 'minimum_st_edge_cut', - 'minimum_edge_cut', - ] - -def minimum_st_edge_cut(G, s, t, capacity='capacity'): - """Returns the edges of the cut-set of a minimum (s, t)-cut. - - We use the max-flow min-cut theorem, i.e., the capacity of a minimum - capacity cut is equal to the flow value of a maximum flow. - - Parameters - ---------- - G : NetworkX graph - Edges of the graph are expected to have an attribute called - 'capacity'. If this attribute is not present, the edge is - considered to have infinite capacity. - - s : node - Source node for the flow. - - t : node - Sink node for the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - Returns - ------- - cutset : set - Set of edges that, if removed from the graph, will disconnect it - - Raises - ------ - NetworkXUnbounded - If the graph has a path of infinite capacity, all cuts have - infinite capacity and the function raises a NetworkXError. - - Examples - -------- - >>> G = nx.DiGraph() - >>> G.add_edge('x','a', capacity = 3.0) - >>> G.add_edge('x','b', capacity = 1.0) - >>> G.add_edge('a','c', capacity = 3.0) - >>> G.add_edge('b','c', capacity = 5.0) - >>> G.add_edge('b','d', capacity = 4.0) - >>> G.add_edge('d','e', capacity = 2.0) - >>> G.add_edge('c','y', capacity = 2.0) - >>> G.add_edge('e','y', capacity = 3.0) - >>> sorted(nx.minimum_edge_cut(G, 'x', 'y')) - [('c', 'y'), ('x', 'b')] - >>> nx.min_cut(G, 'x', 'y') - 3.0 - """ - try: - flow, H = nx.ford_fulkerson_flow_and_auxiliary(G, s, t, capacity=capacity) - cutset = set() - # Compute reachable nodes from source in the residual network - reachable = set(nx.single_source_shortest_path(H,s)) - # And unreachable nodes - others = set(H) - reachable # - set([s]) - # Any edge in the original network linking these two partitions - # is part of the edge cutset - for u, nbrs in ((n, G[n]) for n in reachable): - cutset.update((u,v) for v in nbrs if v in others) - return cutset - except nx.NetworkXUnbounded: - # Should we raise any other exception or just let ford_fulkerson - # propagate nx.NetworkXUnbounded ? - raise nx.NetworkXUnbounded("Infinite capacity path, no minimum cut.") - -def minimum_st_node_cut(G, s, t, aux_digraph=None, mapping=None): - r"""Returns a set of nodes of minimum cardinality that disconnect source - from target in G. - - This function returns the set of nodes of minimum cardinality that, - if removed, would destroy all paths among source and target in G. - - Parameters - ---------- - G : NetworkX graph - - s : node - Source node. - - t : node - Target node. - - Returns - ------- - cutset : set - Set of nodes that, if removed, would destroy all paths between - source and target in G. - - Examples - -------- - >>> # Platonic icosahedral graph has node connectivity 5 - >>> G = nx.icosahedral_graph() - >>> len(nx.minimum_node_cut(G, 0, 6)) - 5 - - Notes - ----- - This is a flow based implementation of minimum node cut. The algorithm - is based in solving a number of max-flow problems (ie local st-node - connectivity, see local_node_connectivity) to determine the capacity - of the minimum cut on an auxiliary directed network that corresponds - to the minimum node cut of G. It handles both directed and undirected - graphs. - - This implementation is based on algorithm 11 in [1]_. We use the Ford - and Fulkerson algorithm to compute max flow (see ford_fulkerson). - - See also - -------- - node_connectivity - edge_connectivity - minimum_edge_cut - max_flow - ford_fulkerson - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - - """ - if aux_digraph is None or mapping is None: - H, mapping = _aux_digraph_node_connectivity(G) - else: - H = aux_digraph - edge_cut = minimum_st_edge_cut(H, '%sB' % mapping[s], '%sA' % mapping[t]) - # Each node in the original graph maps to two nodes of the auxiliary graph - node_cut = set(H.node[node]['id'] for edge in edge_cut for node in edge) - return node_cut - set([s,t]) - -def minimum_node_cut(G, s=None, t=None): - r"""Returns a set of nodes of minimum cardinality that disconnects G. - - If source and target nodes are provided, this function returns the - set of nodes of minimum cardinality that, if removed, would destroy - all paths among source and target in G. If not, it returns a set - of nodes of minimum cardinality that disconnects G. - - Parameters - ---------- - G : NetworkX graph - - s : node - Source node. Optional (default=None) - - t : node - Target node. Optional (default=None) - - Returns - ------- - cutset : set - Set of nodes that, if removed, would disconnect G. If source - and target nodes are provided, the set contians the nodes that - if removed, would destroy all paths between source and target. - - Examples - -------- - >>> # Platonic icosahedral graph has node connectivity 5 - >>> G = nx.icosahedral_graph() - >>> len(nx.minimum_node_cut(G)) - 5 - >>> # this is the minimum over any pair of non adjacent nodes - >>> from itertools import combinations - >>> for u,v in combinations(G, 2): - ... if v not in G[u]: - ... assert(len(nx.minimum_node_cut(G,u,v)) == 5) - ... - - Notes - ----- - This is a flow based implementation of minimum node cut. The algorithm - is based in solving a number of max-flow problems (ie local st-node - connectivity, see local_node_connectivity) to determine the capacity - of the minimum cut on an auxiliary directed network that corresponds - to the minimum node cut of G. It handles both directed and undirected - graphs. - - This implementation is based on algorithm 11 in [1]_. We use the Ford - and Fulkerson algorithm to compute max flow (see ford_fulkerson). - - See also - -------- - node_connectivity - edge_connectivity - minimum_edge_cut - max_flow - ford_fulkerson - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - - """ - # Local minimum node cut - if s is not None and t is not None: - if s not in G: - raise nx.NetworkXError('node %s not in graph' % s) - if t not in G: - raise nx.NetworkXError('node %s not in graph' % t) - return minimum_st_node_cut(G, s, t) - # Global minimum node cut - # Analog to the algoritm 11 for global node connectivity in [1] - if G.is_directed(): - if not nx.is_weakly_connected(G): - raise nx.NetworkXError('Input graph is not connected') - iter_func = itertools.permutations - def neighbors(v): - return itertools.chain.from_iterable([G.predecessors_iter(v), - G.successors_iter(v)]) - else: - if not nx.is_connected(G): - raise nx.NetworkXError('Input graph is not connected') - iter_func = itertools.combinations - neighbors = G.neighbors_iter - # Choose a node with minimum degree - deg = G.degree() - min_deg = min(deg.values()) - v = next(n for n,d in deg.items() if d == min_deg) - # Initial node cutset is all neighbors of the node with minimum degree - min_cut = set(G[v]) - # Reuse the auxiliary digraph - H, mapping = _aux_digraph_node_connectivity(G) - # compute st node cuts between v and all its non-neighbors nodes in G - # and store the minimum - for w in set(G) - set(neighbors(v)) - set([v]): - this_cut = minimum_st_node_cut(G, v, w, aux_digraph=H, mapping=mapping) - if len(min_cut) >= len(this_cut): - min_cut = this_cut - # Same for non adjacent pairs of neighbors of v - for x,y in iter_func(neighbors(v),2): - if y in G[x]: continue - this_cut = minimum_st_node_cut(G, x, y, aux_digraph=H, mapping=mapping) - if len(min_cut) >= len(this_cut): - min_cut = this_cut - return min_cut - -def minimum_edge_cut(G, s=None, t=None): - r"""Returns a set of edges of minimum cardinality that disconnects G. - - If source and target nodes are provided, this function returns the - set of edges of minimum cardinality that, if removed, would break - all paths among source and target in G. If not, it returns a set of - edges of minimum cardinality that disconnects G. - - Parameters - ---------- - G : NetworkX graph - - s : node - Source node. Optional (default=None) - - t : node - Target node. Optional (default=None) - - Returns - ------- - cutset : set - Set of edges that, if removed, would disconnect G. If source - and target nodes are provided, the set contians the edges that - if removed, would destroy all paths between source and target. - - Examples - -------- - >>> # Platonic icosahedral graph has edge connectivity 5 - >>> G = nx.icosahedral_graph() - >>> len(nx.minimum_edge_cut(G)) - 5 - >>> # this is the minimum over any pair of nodes - >>> from itertools import combinations - >>> for u,v in combinations(G, 2): - ... assert(len(nx.minimum_edge_cut(G,u,v)) == 5) - ... - - Notes - ----- - This is a flow based implementation of minimum edge cut. For - undirected graphs the algorithm works by finding a 'small' dominating - set of nodes of G (see algorithm 7 in [1]_) and computing the maximum - flow between an arbitrary node in the dominating set and the rest of - nodes in it. This is an implementation of algorithm 6 in [1]_. - - For directed graphs, the algorithm does n calls to the max flow function. - This is an implementation of algorithm 8 in [1]_. We use the Ford and - Fulkerson algorithm to compute max flow (see ford_fulkerson). - - See also - -------- - node_connectivity - edge_connectivity - minimum_node_cut - max_flow - ford_fulkerson - - References - ---------- - .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms. - http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf - - """ - # reuse auxiliary digraph - H = _aux_digraph_edge_connectivity(G) - # Local minimum edge cut if s and t are not None - if s is not None and t is not None: - if s not in G: - raise nx.NetworkXError('node %s not in graph' % s) - if t not in G: - raise nx.NetworkXError('node %s not in graph' % t) - return minimum_st_edge_cut(H, s, t) - # Global minimum edge cut - # Analog to the algoritm for global edge connectivity - if G.is_directed(): - # Based on algorithm 8 in [1] - if not nx.is_weakly_connected(G): - raise nx.NetworkXError('Input graph is not connected') - # Initial cutset is all edges of a node with minimum degree - deg = G.degree() - min_deg = min(deg.values()) - node = next(n for n,d in deg.items() if d==min_deg) - min_cut = G.edges(node) - nodes = G.nodes() - n = len(nodes) - for i in range(n): - try: - this_cut = minimum_st_edge_cut(H, nodes[i], nodes[i+1]) - if len(this_cut) <= len(min_cut): - min_cut = this_cut - except IndexError: # Last node! - this_cut = minimum_st_edge_cut(H, nodes[i], nodes[0]) - if len(this_cut) <= len(min_cut): - min_cut = this_cut - return min_cut - else: # undirected - # Based on algorithm 6 in [1] - if not nx.is_connected(G): - raise nx.NetworkXError('Input graph is not connected') - # Initial cutset is all edges of a node with minimum degree - deg = G.degree() - min_deg = min(deg.values()) - node = next(n for n,d in deg.items() if d==min_deg) - min_cut = G.edges(node) - # A dominating set is \lambda-covering - # We need a dominating set with at least two nodes - for node in G: - D = dominating_set(G, start_with=node) - v = D.pop() - if D: break - else: - # in complete graphs the dominating set will always be of one node - # thus we return min_cut, which now contains the edges of a node - # with minimum degree - return min_cut - for w in D: - this_cut = minimum_st_edge_cut(H, v, w) - if len(this_cut) <= len(min_cut): - min_cut = this_cut - return min_cut diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/tests/test_connectivity.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/tests/test_connectivity.py deleted file mode 100644 index 2745504..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/tests/test_connectivity.py +++ /dev/null @@ -1,145 +0,0 @@ -from nose.tools import assert_equal, assert_true, assert_false -import networkx as nx - -# helper functions for tests -def _generate_no_biconnected(max_attempts=50): - attempts = 0 - while True: - G = nx.fast_gnp_random_graph(100,0.0575) - if nx.is_connected(G) and not nx.is_biconnected(G): - attempts = 0 - yield G - else: - if attempts >= max_attempts: - msg = "Tried %d times: no suitable Graph." - raise Exception(msg % max_attempts) - else: - attempts += 1 - -def is_dominating_set(G, nbunch): - # Proposed by Dan on the mailing list - allnodes=set(G) - testset=set(n for n in nbunch if n in G) - nbrs=set() - for n in testset: - nbrs.update(G[n]) - if nbrs - allnodes: # some nodes left--not dominating - return False - else: - return True - -# Tests for node and edge connectivity -def test_average_connectivity(): - # figure 1 from: - # Beineke, L., O. Oellermann, and R. Pippert (2002). The average - # connectivity of a graph. Discrete mathematics 252(1-3), 31-45 - # http://www.sciencedirect.com/science/article/pii/S0012365X01001807 - G1 = nx.path_graph(3) - G1.add_edges_from([(1,3),(1,4)]) - assert_equal(nx.average_node_connectivity(G1),1) - G2 = nx.path_graph(3) - G2.add_edges_from([(1,3),(1,4),(0,3),(0,4),(3,4)]) - assert_equal(nx.average_node_connectivity(G2),2.2) - G3 = nx.Graph() - assert_equal(nx.average_node_connectivity(G3),0) - -def test_articulation_points(): - Ggen = _generate_no_biconnected() - for i in range(5): - G = next(Ggen) - assert_equal(nx.node_connectivity(G), 1) - -def test_brandes_erlebach(): - # Figure 1 chapter 7: Connectivity - # http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf - G = nx.Graph() - G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(2,3),(2,6),(3,4), - (3,6),(4,6),(4,7),(5,7),(6,8),(6,9),(7,8), - (7,10),(8,11),(9,10),(9,11),(10,11)]) - assert_equal(3,nx.local_edge_connectivity(G,1,11)) - assert_equal(3,nx.edge_connectivity(G,1,11)) - assert_equal(2,nx.local_node_connectivity(G,1,11)) - assert_equal(2,nx.node_connectivity(G,1,11)) - assert_equal(2,nx.edge_connectivity(G)) # node 5 has degree 2 - assert_equal(2,nx.node_connectivity(G)) - -def test_white_harary_1(): - # Figure 1b white and harary (2001) - # # http://eclectic.ss.uci.edu/~drwhite/sm-w23.PDF - # A graph with high adhesion (edge connectivity) and low cohesion - # (vertex connectivity) - G = nx.disjoint_union(nx.complete_graph(4), nx.complete_graph(4)) - G.remove_node(7) - for i in range(4,7): - G.add_edge(0,i) - G = nx.disjoint_union(G, nx.complete_graph(4)) - G.remove_node(G.order()-1) - for i in range(7,10): - G.add_edge(0,i) - assert_equal(1, nx.node_connectivity(G)) - assert_equal(3, nx.edge_connectivity(G)) - -def test_white_harary_2(): - # Figure 8 white and harary (2001) - # # http://eclectic.ss.uci.edu/~drwhite/sm-w23.PDF - G = nx.disjoint_union(nx.complete_graph(4), nx.complete_graph(4)) - G.add_edge(0,4) - # kappa <= lambda <= delta - assert_equal(3, min(nx.core_number(G).values())) - assert_equal(1, nx.node_connectivity(G)) - assert_equal(1, nx.edge_connectivity(G)) - -def test_complete_graphs(): - for n in range(5, 25, 5): - G = nx.complete_graph(n) - assert_equal(n-1, nx.node_connectivity(G)) - assert_equal(n-1, nx.node_connectivity(G.to_directed())) - assert_equal(n-1, nx.edge_connectivity(G)) - assert_equal(n-1, nx.edge_connectivity(G.to_directed())) - -def test_empty_graphs(): - for k in range(5, 25, 5): - G = nx.empty_graph(k) - assert_equal(0, nx.node_connectivity(G)) - assert_equal(0, nx.edge_connectivity(G)) - -def test_petersen(): - G = nx.petersen_graph() - assert_equal(3, nx.node_connectivity(G)) - assert_equal(3, nx.edge_connectivity(G)) - -def test_tutte(): - G = nx.tutte_graph() - assert_equal(3, nx.node_connectivity(G)) - assert_equal(3, nx.edge_connectivity(G)) - -def test_dodecahedral(): - G = nx.dodecahedral_graph() - assert_equal(3, nx.node_connectivity(G)) - assert_equal(3, nx.edge_connectivity(G)) - -def test_octahedral(): - G=nx.octahedral_graph() - assert_equal(4, nx.node_connectivity(G)) - assert_equal(4, nx.edge_connectivity(G)) - -def test_icosahedral(): - G=nx.icosahedral_graph() - assert_equal(5, nx.node_connectivity(G)) - assert_equal(5, nx.edge_connectivity(G)) - -def test_directed_edge_connectivity(): - G = nx.cycle_graph(10,create_using=nx.DiGraph()) # only one direction - D = nx.cycle_graph(10).to_directed() # 2 reciprocal edges - assert_equal(1, nx.edge_connectivity(G)) - assert_equal(1, nx.local_edge_connectivity(G,1,4)) - assert_equal(1, nx.edge_connectivity(G,1,4)) - assert_equal(2, nx.edge_connectivity(D)) - assert_equal(2, nx.local_edge_connectivity(D,1,4)) - assert_equal(2, nx.edge_connectivity(D,1,4)) - -def test_dominating_set(): - for i in range(5): - G = nx.gnp_random_graph(100,0.1) - D = nx.dominating_set(G) - assert_true(is_dominating_set(G,D)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/tests/test_cuts.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/tests/test_cuts.py deleted file mode 100644 index 0570494..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/connectivity/tests/test_cuts.py +++ /dev/null @@ -1,157 +0,0 @@ -from nose.tools import assert_equal, assert_true, assert_false, assert_raises -import networkx as nx - -# Tests for node and edge cutsets -def _generate_no_biconnected(max_attempts=50): - attempts = 0 - while True: - G = nx.fast_gnp_random_graph(100,0.0575) - if nx.is_connected(G) and not nx.is_biconnected(G): - attempts = 0 - yield G - else: - if attempts >= max_attempts: - msg = "Tried %d times: no suitable Graph."%attempts - raise Exception(msg % max_attempts) - else: - attempts += 1 - -def test_articulation_points(): - Ggen = _generate_no_biconnected() - for i in range(5): - G = next(Ggen) - cut = nx.minimum_node_cut(G) - assert_true(len(cut) == 1) - assert_true(cut.pop() in set(nx.articulation_points(G))) - -def test_brandes_erlebach_book(): - # Figure 1 chapter 7: Connectivity - # http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf - G = nx.Graph() - G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(2,3),(2,6),(3,4), - (3,6),(4,6),(4,7),(5,7),(6,8),(6,9),(7,8), - (7,10),(8,11),(9,10),(9,11),(10,11)]) - # edge cutsets - assert_equal(3, len(nx.minimum_edge_cut(G,1,11))) - edge_cut = nx.minimum_edge_cut(G) - assert_equal(2, len(edge_cut)) # Node 5 has only two edges - H = G.copy() - H.remove_edges_from(edge_cut) - assert_false(nx.is_connected(H)) - # node cuts - assert_equal(set([6,7]), nx.minimum_st_node_cut(G,1,11)) - assert_equal(set([6,7]), nx.minimum_node_cut(G,1,11)) - node_cut = nx.minimum_node_cut(G) - assert_equal(2,len(node_cut)) - H = G.copy() - H.remove_nodes_from(node_cut) - assert_false(nx.is_connected(H)) - -def test_white_harary_paper(): - # Figure 1b white and harary (2001) - # http://eclectic.ss.uci.edu/~drwhite/sm-w23.PDF - # A graph with high adhesion (edge connectivity) and low cohesion - # (node connectivity) - G = nx.disjoint_union(nx.complete_graph(4), nx.complete_graph(4)) - G.remove_node(7) - for i in range(4,7): - G.add_edge(0,i) - G = nx.disjoint_union(G, nx.complete_graph(4)) - G.remove_node(G.order()-1) - for i in range(7,10): - G.add_edge(0,i) - # edge cuts - edge_cut = nx.minimum_edge_cut(G) - assert_equal(3, len(edge_cut)) - H = G.copy() - H.remove_edges_from(edge_cut) - assert_false(nx.is_connected(H)) - # node cuts - node_cut = nx.minimum_node_cut(G) - assert_equal(set([0]), node_cut) - H = G.copy() - H.remove_nodes_from(node_cut) - assert_false(nx.is_connected(H)) - -def test_petersen_cutset(): - G = nx.petersen_graph() - # edge cuts - edge_cut = nx.minimum_edge_cut(G) - assert_equal(3, len(edge_cut)) - H = G.copy() - H.remove_edges_from(edge_cut) - assert_false(nx.is_connected(H)) - # node cuts - node_cut = nx.minimum_node_cut(G) - assert_equal(3,len(node_cut)) - H = G.copy() - H.remove_nodes_from(node_cut) - assert_false(nx.is_connected(H)) - -def test_octahedral_cutset(): - G=nx.octahedral_graph() - # edge cuts - edge_cut = nx.minimum_edge_cut(G) - assert_equal(4, len(edge_cut)) - H = G.copy() - H.remove_edges_from(edge_cut) - assert_false(nx.is_connected(H)) - # node cuts - node_cut = nx.minimum_node_cut(G) - assert_equal(4,len(node_cut)) - H = G.copy() - H.remove_nodes_from(node_cut) - assert_false(nx.is_connected(H)) - -def test_icosahedral_cutset(): - G=nx.icosahedral_graph() - # edge cuts - edge_cut = nx.minimum_edge_cut(G) - assert_equal(5, len(edge_cut)) - H = G.copy() - H.remove_edges_from(edge_cut) - assert_false(nx.is_connected(H)) - # node cuts - node_cut = nx.minimum_node_cut(G) - assert_equal(5,len(node_cut)) - H = G.copy() - H.remove_nodes_from(node_cut) - assert_false(nx.is_connected(H)) - -def test_node_cutset_exception(): - G=nx.Graph() - G.add_edges_from([(1,2),(3,4)]) - assert_raises(nx.NetworkXError, nx.minimum_node_cut,G) - -def test_node_cutset_random_graphs(): - for i in range(5): - G = nx.fast_gnp_random_graph(50,0.2) - if not nx.is_connected(G): - ccs = iter(nx.connected_components(G)) - start = next(ccs)[0] - G.add_edges_from( (start,c[0]) for c in ccs ) - cutset = nx.minimum_node_cut(G) - assert_equal(nx.node_connectivity(G), len(cutset)) - G.remove_nodes_from(cutset) - assert_false(nx.is_connected(G)) - -def test_edge_cutset_random_graphs(): - for i in range(5): - G = nx.fast_gnp_random_graph(50,0.2) - if not nx.is_connected(G): - ccs = iter(nx.connected_components(G)) - start = next(ccs)[0] - G.add_edges_from( (start,c[0]) for c in ccs ) - cutset = nx.minimum_edge_cut(G) - assert_equal(nx.edge_connectivity(G), len(cutset)) - G.remove_edges_from(cutset) - assert_false(nx.is_connected(G)) - -# Test empty graphs -def test_empty_graphs(): - G = nx.Graph() - D = nx.DiGraph() - assert_raises(nx.NetworkXPointlessConcept, nx.minimum_node_cut, G) - assert_raises(nx.NetworkXPointlessConcept, nx.minimum_node_cut, D) - assert_raises(nx.NetworkXPointlessConcept, nx.minimum_edge_cut, G) - assert_raises(nx.NetworkXPointlessConcept, nx.minimum_edge_cut, D) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/core.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/core.py deleted file mode 100644 index 4daba25..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/core.py +++ /dev/null @@ -1,324 +0,0 @@ -""" -Find the k-cores of a graph. - -The k-core is found by recursively pruning nodes with degrees less than k. - -See the following reference for details: - -An O(m) Algorithm for Cores Decomposition of Networks -Vladimir Batagelj and Matjaz Zaversnik, 2003. -http://arxiv.org/abs/cs.DS/0310049 - -""" -__author__ = "\n".join(['Dan Schult (dschult@colgate.edu)', - 'Jason Grout (jason-sage@creativetrax.com)', - 'Aric Hagberg (hagberg@lanl.gov)']) - -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__all__ = ['core_number','k_core','k_shell','k_crust','k_corona','find_cores'] - -import networkx as nx - -def core_number(G): - """Return the core number for each vertex. - - A k-core is a maximal subgraph that contains nodes of degree k or more. - - The core number of a node is the largest value k of a k-core containing - that node. - - Parameters - ---------- - G : NetworkX graph - A graph or directed graph - - Returns - ------- - core_number : dictionary - A dictionary keyed by node to the core number. - - Raises - ------ - NetworkXError - The k-core is not defined for graphs with self loops or parallel edges. - - Notes - ----- - Not implemented for graphs with parallel edges or self loops. - - For directed graphs the node degree is defined to be the - in-degree + out-degree. - - References - ---------- - .. [1] An O(m) Algorithm for Cores Decomposition of Networks - Vladimir Batagelj and Matjaz Zaversnik, 2003. - http://arxiv.org/abs/cs.DS/0310049 - """ - if G.is_multigraph(): - raise nx.NetworkXError( - 'MultiGraph and MultiDiGraph types not supported.') - - if G.number_of_selfloops()>0: - raise nx.NetworkXError( - 'Input graph has self loops; the core number is not defined.', - 'Consider using G.remove_edges_from(G.selfloop_edges()).') - - if G.is_directed(): - import itertools - def neighbors(v): - return itertools.chain.from_iterable([G.predecessors_iter(v), - G.successors_iter(v)]) - else: - neighbors=G.neighbors_iter - degrees=G.degree() - # sort nodes by degree - nodes=sorted(degrees,key=degrees.get) - bin_boundaries=[0] - curr_degree=0 - for i,v in enumerate(nodes): - if degrees[v]>curr_degree: - bin_boundaries.extend([i]*(degrees[v]-curr_degree)) - curr_degree=degrees[v] - node_pos = dict((v,pos) for pos,v in enumerate(nodes)) - # initial guesses for core is degree - core=degrees - nbrs=dict((v,set(neighbors(v))) for v in G) - for v in nodes: - for u in nbrs[v]: - if core[u] > core[v]: - nbrs[u].remove(v) - pos=node_pos[u] - bin_start=bin_boundaries[core[u]] - node_pos[u]=bin_start - node_pos[nodes[bin_start]]=pos - nodes[bin_start],nodes[pos]=nodes[pos],nodes[bin_start] - bin_boundaries[core[u]]+=1 - core[u]-=1 - return core - -find_cores=core_number - -def k_core(G,k=None,core_number=None): - """Return the k-core of G. - - A k-core is a maximal subgraph that contains nodes of degree k or more. - - Parameters - ---------- - G : NetworkX graph - A graph or directed graph - k : int, optional - The order of the core. If not specified return the main core. - core_number : dictionary, optional - Precomputed core numbers for the graph G. - - Returns - ------- - G : NetworkX graph - The k-core subgraph - - Raises - ------ - NetworkXError - The k-core is not defined for graphs with self loops or parallel edges. - - Notes - ----- - The main core is the core with the largest degree. - - Not implemented for graphs with parallel edges or self loops. - - For directed graphs the node degree is defined to be the - in-degree + out-degree. - - Graph, node, and edge attributes are copied to the subgraph. - - See Also - -------- - core_number - - References - ---------- - .. [1] An O(m) Algorithm for Cores Decomposition of Networks - Vladimir Batagelj and Matjaz Zaversnik, 2003. - http://arxiv.org/abs/cs.DS/0310049 - """ - if core_number is None: - core_number=nx.core_number(G) - if k is None: - k=max(core_number.values()) # max core - nodes=(n for n in core_number if core_number[n]>=k) - return G.subgraph(nodes).copy() - -def k_shell(G,k=None,core_number=None): - """Return the k-shell of G. - - The k-shell is the subgraph of nodes in the k-core containing - nodes of exactly degree k. - - Parameters - ---------- - G : NetworkX graph - A graph or directed graph. - k : int, optional - The order of the shell. If not specified return the main shell. - core_number : dictionary, optional - Precomputed core numbers for the graph G. - - - Returns - ------- - G : NetworkX graph - The k-shell subgraph - - Raises - ------ - NetworkXError - The k-shell is not defined for graphs with self loops or parallel edges. - - Notes - ----- - This is similar to k_corona but in that case only neighbors in the - k-core are considered. - - Not implemented for graphs with parallel edges or self loops. - - For directed graphs the node degree is defined to be the - in-degree + out-degree. - - Graph, node, and edge attributes are copied to the subgraph. - - See Also - -------- - core_number - k_corona - - - ---------- - .. [1] A model of Internet topology using k-shell decomposition - Shai Carmi, Shlomo Havlin, Scott Kirkpatrick, Yuval Shavitt, - and Eran Shir, PNAS July 3, 2007 vol. 104 no. 27 11150-11154 - http://www.pnas.org/content/104/27/11150.full - """ - if core_number is None: - core_number=nx.core_number(G) - if k is None: - k=max(core_number.values()) # max core - nodes=(n for n in core_number if core_number[n]==k) - return G.subgraph(nodes).copy() - -def k_crust(G,k=None,core_number=None): - """Return the k-crust of G. - - The k-crust is the graph G with the k-core removed. - - Parameters - ---------- - G : NetworkX graph - A graph or directed graph. - k : int, optional - The order of the shell. If not specified return the main crust. - core_number : dictionary, optional - Precomputed core numbers for the graph G. - - Returns - ------- - G : NetworkX graph - The k-crust subgraph - - Raises - ------ - NetworkXError - The k-crust is not defined for graphs with self loops or parallel edges. - - Notes - ----- - This definition of k-crust is different than the definition in [1]_. - The k-crust in [1]_ is equivalent to the k+1 crust of this algorithm. - - Not implemented for graphs with parallel edges or self loops. - - For directed graphs the node degree is defined to be the - in-degree + out-degree. - - Graph, node, and edge attributes are copied to the subgraph. - - See Also - -------- - core_number - - References - ---------- - .. [1] A model of Internet topology using k-shell decomposition - Shai Carmi, Shlomo Havlin, Scott Kirkpatrick, Yuval Shavitt, - and Eran Shir, PNAS July 3, 2007 vol. 104 no. 27 11150-11154 - http://www.pnas.org/content/104/27/11150.full - """ - if core_number is None: - core_number=nx.core_number(G) - if k is None: - k=max(core_number.values())-1 - nodes=(n for n in core_number if core_number[n]<=k) - return G.subgraph(nodes).copy() - - -def k_corona(G, k, core_number=None): - """Return the k-crust of G. - - The k-corona is the subset of vertices in the k-core which have - exactly k neighbours in the k-core. - - Parameters - ---------- - G : NetworkX graph - A graph or directed graph - k : int - The order of the corona. - core_number : dictionary, optional - Precomputed core numbers for the graph G. - - Returns - ------- - G : NetworkX graph - The k-corona subgraph - - Raises - ------ - NetworkXError - The k-cornoa is not defined for graphs with self loops or - parallel edges. - - Notes - ----- - Not implemented for graphs with parallel edges or self loops. - - For directed graphs the node degree is defined to be the - in-degree + out-degree. - - Graph, node, and edge attributes are copied to the subgraph. - - See Also - -------- - core_number - - References - ---------- - .. [1] k -core (bootstrap) percolation on complex networks: - Critical phenomena and nonlocal effects, - A. V. Goltsev, S. N. Dorogovtsev, and J. F. F. Mendes, - Phys. Rev. E 73, 056101 (2006) - http://link.aps.org/doi/10.1103/PhysRevE.73.056101 - """ - - if core_number is None: - core_number = nx.core_number(G) - nodes = (n for n in core_number - if core_number[n] >= k - and len([v for v in G[n] if core_number[v] >= k]) == k) - return G.subgraph(nodes).copy() diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/cycles.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/cycles.py deleted file mode 100644 index 4955538..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/cycles.py +++ /dev/null @@ -1,317 +0,0 @@ -""" -======================== -Cycle finding algorithms -======================== -""" -# Copyright (C) 2010-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import * -from collections import defaultdict - -__all__ = ['cycle_basis','simple_cycles','recursive_simple_cycles'] -__author__ = "\n".join(['Jon Olav Vik <jonovik@gmail.com>', - 'Dan Schult <dschult@colgate.edu>', - 'Aric Hagberg <hagberg@lanl.gov>']) - -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def cycle_basis(G,root=None): - """ Returns a list of cycles which form a basis for cycles of G. - - A basis for cycles of a network is a minimal collection of - cycles such that any cycle in the network can be written - as a sum of cycles in the basis. Here summation of cycles - is defined as "exclusive or" of the edges. Cycle bases are - useful, e.g. when deriving equations for electric circuits - using Kirchhoff's Laws. - - Parameters - ---------- - G : NetworkX Graph - root : node, optional - Specify starting node for basis. - - Returns - ------- - A list of cycle lists. Each cycle list is a list of nodes - which forms a cycle (loop) in G. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_cycle([0,1,2,3]) - >>> G.add_cycle([0,3,4,5]) - >>> print(nx.cycle_basis(G,0)) - [[3, 4, 5, 0], [1, 2, 3, 0]] - - Notes - ----- - This is adapted from algorithm CACM 491 [1]_. - - References - ---------- - .. [1] Paton, K. An algorithm for finding a fundamental set of - cycles of a graph. Comm. ACM 12, 9 (Sept 1969), 514-518. - - See Also - -------- - simple_cycles - """ - gnodes=set(G.nodes()) - cycles=[] - while gnodes: # loop over connected components - if root is None: - root=gnodes.pop() - stack=[root] - pred={root:root} - used={root:set()} - while stack: # walk the spanning tree finding cycles - z=stack.pop() # use last-in so cycles easier to find - zused=used[z] - for nbr in G[z]: - if nbr not in used: # new node - pred[nbr]=z - stack.append(nbr) - used[nbr]=set([z]) - elif nbr == z: # self loops - cycles.append([z]) - elif nbr not in zused:# found a cycle - pn=used[nbr] - cycle=[nbr,z] - p=pred[z] - while p not in pn: - cycle.append(p) - p=pred[p] - cycle.append(p) - cycles.append(cycle) - used[nbr].add(z) - gnodes-=set(pred) - root=None - return cycles - - -@not_implemented_for('undirected') -def simple_cycles(G): - """Find simple cycles (elementary circuits) of a directed graph. - - An simple cycle, or elementary circuit, is a closed path where no - node appears twice, except that the first and last node are the same. - Two elementary circuits are distinct if they are not cyclic permutations - of each other. - - This is a nonrecursive, iterator/generator version of Johnson's - algorithm [1]_. There may be better algorithms for some cases [2]_ [3]_. - - Parameters - ---------- - G : NetworkX DiGraph - A directed graph - - Returns - ------- - cycle_generator: generator - A generator that produces elementary cycles of the graph. Each cycle is - a list of nodes with the first and last nodes being the same. - - Examples - -------- - >>> G = nx.DiGraph([(0, 0), (0, 1), (0, 2), (1, 2), (2, 0), (2, 1), (2, 2)]) - >>> list(nx.simple_cycles(G)) - [[2], [2, 1], [2, 0], [2, 0, 1], [0]] - - Notes - ----- - The implementation follows pp. 79-80 in [1]_. - - The time complexity is O((n+e)(c+1)) for n nodes, e edges and c - elementary circuits. - - To filter the cycles so that they don't include certain nodes or edges, - copy your graph and eliminate those nodes or edges before calling. - >>> copyG = G.copy() - >>> copyG.remove_nodes_from([1]) - >>> copyG.remove_edges_from([(0,1)]) - >>> list(nx.simple_cycles(copyG)) - [[2], [2, 0], [0]] - - References - ---------- - .. [1] Finding all the elementary circuits of a directed graph. - D. B. Johnson, SIAM Journal on Computing 4, no. 1, 77-84, 1975. - http://dx.doi.org/10.1137/0204007 - - .. [2] Enumerating the cycles of a digraph: a new preprocessing strategy. - G. Loizou and P. Thanish, Information Sciences, v. 27, 163-182, 1982. - - .. [3] A search strategy for the elementary cycles of a directed graph. - J.L. Szwarcfiter and P.E. Lauer, BIT NUMERICAL MATHEMATICS, - v. 16, no. 2, 192-204, 1976. - - See Also - -------- - cycle_basis - """ - def _unblock(thisnode,blocked,B): - stack=set([thisnode]) - while stack: - node=stack.pop() - if node in blocked: - blocked.remove(node) - stack.update(B[node]) - B[node].clear() - - # Johnson's algorithm requires some ordering of the nodes. - # We assign the arbitrary ordering given by the strongly connected comps - # There is no need to track the ordering as each node removed as processed. - subG=G.copy() # save the actual graph so we can mutate it here - sccs = nx.strongly_connected_components(subG) - while sccs: - scc=sccs.pop() - # order of scc determines ordering of nodes - startnode = scc.pop() - # Processing node runs "circuit" routine from recursive version - path=[startnode] - blocked = set() # vertex: blocked from search? - closed = set() # nodes involved in a cycle - blocked.add(startnode) - B=defaultdict(set) # graph portions that yield no elementary circuit - stack=[ (startnode,list(subG[startnode])) ] # subG gives component nbrs - while stack: - thisnode,nbrs = stack[-1] - if nbrs: - nextnode = nbrs.pop() -# print thisnode,nbrs,":",nextnode,blocked,B,path,stack,startnode -# f=raw_input("pause") - if nextnode == startnode: - yield path[:] - closed.update(path) -# print "Found a cycle",path,closed - elif nextnode not in blocked: - path.append(nextnode) - stack.append( (nextnode,list(subG[nextnode])) ) - blocked.add(nextnode) - continue - # done with nextnode... look for more neighbors - if not nbrs: # no more nbrs - if thisnode in closed: - _unblock(thisnode,blocked,B) - else: - for nbr in G[thisnode]: - if thisnode not in B[nbr]: - B[nbr].add(thisnode) - stack.pop() -# assert path[-1]==thisnode - path.pop() - # done processing this node - subG.remove_node(startnode) - H=subG.subgraph(scc) # make smaller to avoid work in SCC routine - sccs.extend(nx.strongly_connected_components(H)) - - -@not_implemented_for('undirected') -def recursive_simple_cycles(G): - """Find simple cycles (elementary circuits) of a directed graph. - - A simple cycle, or elementary circuit, is a closed path where no - node appears twice, except that the first and last node are the same. - Two elementary circuits are distinct if they are not cyclic permutations - of each other. - - This version uses a recursive algorithm to build a list of cycles. - You should probably use the iterator version caled simple_cycles(). - Warning: This recursive version uses lots of RAM! - - Parameters - ---------- - G : NetworkX DiGraph - A directed graph - - Returns - ------- - A list of circuits, where each circuit is a list of nodes, with the first - and last node being the same. - - Example: - >>> G = nx.DiGraph([(0, 0), (0, 1), (0, 2), (1, 2), (2, 0), (2, 1), (2, 2)]) - >>> nx.recursive_simple_cycles(G) - [[0], [0, 1, 2], [0, 2], [1, 2], [2]] - - See Also - -------- - cycle_basis (for undirected graphs) - - Notes - ----- - The implementation follows pp. 79-80 in [1]_. - - The time complexity is O((n+e)(c+1)) for n nodes, e edges and c - elementary circuits. - - References - ---------- - .. [1] Finding all the elementary circuits of a directed graph. - D. B. Johnson, SIAM Journal on Computing 4, no. 1, 77-84, 1975. - http://dx.doi.org/10.1137/0204007 - - See Also - -------- - simple_cycles, cycle_basis - """ - # Jon Olav Vik, 2010-08-09 - def _unblock(thisnode): - """Recursively unblock and remove nodes from B[thisnode].""" - if blocked[thisnode]: - blocked[thisnode] = False - while B[thisnode]: - _unblock(B[thisnode].pop()) - - def circuit(thisnode, startnode, component): - closed = False # set to True if elementary path is closed - path.append(thisnode) - blocked[thisnode] = True - for nextnode in component[thisnode]: # direct successors of thisnode - if nextnode == startnode: - result.append(path[:]) - closed = True - elif not blocked[nextnode]: - if circuit(nextnode, startnode, component): - closed = True - if closed: - _unblock(thisnode) - else: - for nextnode in component[thisnode]: - if thisnode not in B[nextnode]: # TODO: use set for speedup? - B[nextnode].append(thisnode) - path.pop() # remove thisnode from path - return closed - - path = [] # stack of nodes in current path - blocked = defaultdict(bool) # vertex: blocked from search? - B = defaultdict(list) # graph portions that yield no elementary circuit - result = [] # list to accumulate the circuits found - # Johnson's algorithm requires some ordering of the nodes. - # They might not be sortable so we assign an arbitrary ordering. - ordering=dict(zip(G,range(len(G)))) - for s in ordering: - # Build the subgraph induced by s and following nodes in the ordering - subgraph = G.subgraph(node for node in G - if ordering[node] >= ordering[s]) - # Find the strongly connected component in the subgraph - # that contains the least node according to the ordering - strongcomp = nx.strongly_connected_components(subgraph) - mincomp=min(strongcomp, - key=lambda nodes: min(ordering[n] for n in nodes)) - component = G.subgraph(mincomp) - if component: - # smallest node in the component according to the ordering - startnode = min(component,key=ordering.__getitem__) - for node in component: - blocked[node] = False - B[node][:] = [] - dummy=circuit(startnode, startnode, component) - return result diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/dag.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/dag.py deleted file mode 100644 index 4d376e0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/dag.py +++ /dev/null @@ -1,275 +0,0 @@ -# -*- coding: utf-8 -*- -from fractions import gcd -import networkx as nx -"""Algorithms for directed acyclic graphs (DAGs).""" -# Copyright (C) 2006-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Dan Schult (dschult@colgate.edu)', - 'Ben Edwards (bedwards@cs.unm.edu)']) -__all__ = ['descendants', - 'ancestors', - 'topological_sort', - 'topological_sort_recursive', - 'is_directed_acyclic_graph', - 'is_aperiodic'] - -def descendants(G, source): - """Return all nodes reachable from `source` in G. - - Parameters - ---------- - G : NetworkX DiGraph - source : node in G - - Returns - ------- - des : set() - The descendants of source in G - """ - if not G.has_node(source): - raise nx.NetworkXError("The node %s is not in the graph." % source) - des = set(nx.shortest_path_length(G, source=source).keys()) - set([source]) - return des - -def ancestors(G, source): - """Return all nodes having a path to `source` in G. - - Parameters - ---------- - G : NetworkX DiGraph - source : node in G - - Returns - ------- - ancestors : set() - The ancestors of source in G - """ - if not G.has_node(source): - raise nx.NetworkXError("The node %s is not in the graph." % source) - anc = set(nx.shortest_path_length(G, target=source).keys()) - set([source]) - return anc - -def is_directed_acyclic_graph(G): - """Return True if the graph G is a directed acyclic graph (DAG) or - False if not. - - Parameters - ---------- - G : NetworkX graph - A graph - - Returns - ------- - is_dag : bool - True if G is a DAG, false otherwise - """ - if not G.is_directed(): - return False - try: - topological_sort(G) - return True - except nx.NetworkXUnfeasible: - return False - -def topological_sort(G,nbunch=None): - """Return a list of nodes in topological sort order. - - A topological sort is a nonunique permutation of the nodes - such that an edge from u to v implies that u appears before v in the - topological sort order. - - Parameters - ---------- - G : NetworkX digraph - A directed graph - - nbunch : container of nodes (optional) - Explore graph in specified order given in nbunch - - Raises - ------ - NetworkXError - Topological sort is defined for directed graphs only. If the - graph G is undirected, a NetworkXError is raised. - - NetworkXUnfeasible - If G is not a directed acyclic graph (DAG) no topological sort - exists and a NetworkXUnfeasible exception is raised. - - Notes - ----- - This algorithm is based on a description and proof in - The Algorithm Design Manual [1]_ . - - See also - -------- - is_directed_acyclic_graph - - References - ---------- - .. [1] Skiena, S. S. The Algorithm Design Manual (Springer-Verlag, 1998). - http://www.amazon.com/exec/obidos/ASIN/0387948600/ref=ase_thealgorithmrepo/ - """ - if not G.is_directed(): - raise nx.NetworkXError( - "Topological sort not defined on undirected graphs.") - - # nonrecursive version - seen = set() - order = [] - explored = set() - - if nbunch is None: - nbunch = G.nodes_iter() - for v in nbunch: # process all vertices in G - if v in explored: - continue - fringe = [v] # nodes yet to look at - while fringe: - w = fringe[-1] # depth first search - if w in explored: # already looked down this branch - fringe.pop() - continue - seen.add(w) # mark as seen - # Check successors for cycles and for new nodes - new_nodes = [] - for n in G[w]: - if n not in explored: - if n in seen: #CYCLE !! - raise nx.NetworkXUnfeasible("Graph contains a cycle.") - new_nodes.append(n) - if new_nodes: # Add new_nodes to fringe - fringe.extend(new_nodes) - else: # No new nodes so w is fully explored - explored.add(w) - order.append(w) - fringe.pop() # done considering this node - return list(reversed(order)) - -def topological_sort_recursive(G,nbunch=None): - """Return a list of nodes in topological sort order. - - A topological sort is a nonunique permutation of the nodes such - that an edge from u to v implies that u appears before v in the - topological sort order. - - Parameters - ---------- - G : NetworkX digraph - - nbunch : container of nodes (optional) - Explore graph in specified order given in nbunch - - Raises - ------ - NetworkXError - Topological sort is defined for directed graphs only. If the - graph G is undirected, a NetworkXError is raised. - - NetworkXUnfeasible - If G is not a directed acyclic graph (DAG) no topological sort - exists and a NetworkXUnfeasible exception is raised. - - Notes - ----- - This is a recursive version of topological sort. - - See also - -------- - topological_sort - is_directed_acyclic_graph - - """ - if not G.is_directed(): - raise nx.NetworkXError( - "Topological sort not defined on undirected graphs.") - - def _dfs(v): - ancestors.add(v) - - for w in G[v]: - if w in ancestors: - raise nx.NetworkXUnfeasible("Graph contains a cycle.") - - if w not in explored: - _dfs(w) - - ancestors.remove(v) - explored.add(v) - order.append(v) - - ancestors = set() - explored = set() - order = [] - - if nbunch is None: - nbunch = G.nodes_iter() - - for v in nbunch: - if v not in explored: - _dfs(v) - - return list(reversed(order)) - -def is_aperiodic(G): - """Return True if G is aperiodic. - - A directed graph is aperiodic if there is no integer k > 1 that - divides the length of every cycle in the graph. - - Parameters - ---------- - G : NetworkX DiGraph - Graph - - Returns - ------- - aperiodic : boolean - True if the graph is aperiodic False otherwise - - Raises - ------ - NetworkXError - If G is not directed - - Notes - ----- - This uses the method outlined in [1]_, which runs in O(m) time - given m edges in G. Note that a graph is not aperiodic if it is - acyclic as every integer trivial divides length 0 cycles. - - References - ---------- - .. [1] Jarvis, J. P.; Shier, D. R. (1996), - Graph-theoretic analysis of finite Markov chains, - in Shier, D. R.; Wallenius, K. T., Applied Mathematical Modeling: - A Multidisciplinary Approach, CRC Press. - """ - if not G.is_directed(): - raise nx.NetworkXError("is_aperiodic not defined for undirected graphs") - - s = next(G.nodes_iter()) - levels = {s:0} - this_level = [s] - g = 0 - l = 1 - while this_level: - next_level = [] - for u in this_level: - for v in G[u]: - if v in levels: # Non-Tree Edge - g = gcd(g, levels[u]-levels[v] + 1) - else: # Tree Edge - next_level.append(v) - levels[v] = l - this_level = next_level - l += 1 - if len(levels)==len(G): #All nodes in tree - return g==1 - else: - return g==1 and nx.is_aperiodic(G.subgraph(set(G)-set(levels))) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/distance_measures.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/distance_measures.py deleted file mode 100644 index 33df686..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/distance_measures.py +++ /dev/null @@ -1,170 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Graph diameter, radius, eccentricity and other properties. -""" -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['eccentricity', 'diameter', 'radius', 'periphery', 'center'] - -import networkx - -def eccentricity(G, v=None, sp=None): - """Return the eccentricity of nodes in G. - - The eccentricity of a node v is the maximum distance from v to - all other nodes in G. - - Parameters - ---------- - G : NetworkX graph - A graph - - v : node, optional - Return value of specified node - - sp : dict of dicts, optional - All pairs shortest path lengths as a dictionary of dictionaries - - Returns - ------- - ecc : dictionary - A dictionary of eccentricity values keyed by node. - """ -# nodes= -# nodes=[] -# if v is None: # none, use entire graph -# nodes=G.nodes() -# elif v in G: # is v a single node -# nodes=[v] -# else: # assume v is a container of nodes -# nodes=v - order=G.order() - - e={} - for n in G.nbunch_iter(v): - if sp is None: - length=networkx.single_source_shortest_path_length(G,n) - L = len(length) - else: - try: - length=sp[n] - L = len(length) - except TypeError: - raise networkx.NetworkXError('Format of "sp" is invalid.') - if L != order: - msg = "Graph not connected: infinite path length" - raise networkx.NetworkXError(msg) - - e[n]=max(length.values()) - - if v in G: - return e[v] # return single value - else: - return e - - -def diameter(G, e=None): - """Return the diameter of the graph G. - - The diameter is the maximum eccentricity. - - Parameters - ---------- - G : NetworkX graph - A graph - - e : eccentricity dictionary, optional - A precomputed dictionary of eccentricities. - - Returns - ------- - d : integer - Diameter of graph - - See Also - -------- - eccentricity - """ - if e is None: - e=eccentricity(G) - return max(e.values()) - -def periphery(G, e=None): - """Return the periphery of the graph G. - - The periphery is the set of nodes with eccentricity equal to the diameter. - - Parameters - ---------- - G : NetworkX graph - A graph - - e : eccentricity dictionary, optional - A precomputed dictionary of eccentricities. - - Returns - ------- - p : list - List of nodes in periphery - """ - if e is None: - e=eccentricity(G) - diameter=max(e.values()) - p=[v for v in e if e[v]==diameter] - return p - - -def radius(G, e=None): - """Return the radius of the graph G. - - The radius is the minimum eccentricity. - - Parameters - ---------- - G : NetworkX graph - A graph - - e : eccentricity dictionary, optional - A precomputed dictionary of eccentricities. - - Returns - ------- - r : integer - Radius of graph - """ - if e is None: - e=eccentricity(G) - return min(e.values()) - -def center(G, e=None): - """Return the center of the graph G. - - The center is the set of nodes with eccentricity equal to radius. - - Parameters - ---------- - G : NetworkX graph - A graph - - e : eccentricity dictionary, optional - A precomputed dictionary of eccentricities. - - Returns - ------- - c : list - List of nodes in center - """ - if e is None: - e=eccentricity(G) - # order the nodes by path length - radius=min(e.values()) - p=[v for v in e if e[v]==radius] - return p - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/distance_regular.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/distance_regular.py deleted file mode 100644 index 3fbcdbc..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/distance_regular.py +++ /dev/null @@ -1,179 +0,0 @@ -""" -======================= -Distance-regular graphs -======================= -""" -# Copyright (C) 2011 by -# Dheeraj M R <dheerajrav@gmail.com> -# Aric Hagberg <aric.hagberg@gmail.com> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Dheeraj M R <dheerajrav@gmail.com>', - 'Aric Hagberg <aric.hagberg@gmail.com>']) - -__all__ = ['is_distance_regular','intersection_array','global_parameters'] - -def is_distance_regular(G): - """Returns True if the graph is distance regular, False otherwise. - - A connected graph G is distance-regular if for any nodes x,y - and any integers i,j=0,1,...,d (where d is the graph - diameter), the number of vertices at distance i from x and - distance j from y depends only on i,j and the graph distance - between x and y, independently of the choice of x and y. - - Parameters - ---------- - G: Networkx graph (undirected) - - Returns - ------- - bool - True if the graph is Distance Regular, False otherwise - - Examples - -------- - >>> G=nx.hypercube_graph(6) - >>> nx.is_distance_regular(G) - True - - See Also - -------- - intersection_array, global_parameters - - Notes - ----- - For undirected and simple graphs only - - References - ---------- - .. [1] Brouwer, A. E.; Cohen, A. M.; and Neumaier, A. - Distance-Regular Graphs. New York: Springer-Verlag, 1989. - .. [2] Weisstein, Eric W. "Distance-Regular Graph." - http://mathworld.wolfram.com/Distance-RegularGraph.html - - """ - try: - a=intersection_array(G) - return True - except nx.NetworkXError: - return False - -def global_parameters(b,c): - """Return global parameters for a given intersection array. - - Given a distance-regular graph G with integers b_i, c_i,i = 0,....,d - such that for any 2 vertices x,y in G at a distance i=d(x,y), there - are exactly c_i neighbors of y at a distance of i-1 from x and b_i - neighbors of y at a distance of i+1 from x. - - Thus, a distance regular graph has the global parameters, - [[c_0,a_0,b_0],[c_1,a_1,b_1],......,[c_d,a_d,b_d]] for the - intersection array [b_0,b_1,.....b_{d-1};c_1,c_2,.....c_d] - where a_i+b_i+c_i=k , k= degree of every vertex. - - Parameters - ---------- - b,c: tuple of lists - - Returns - ------- - p : list of three-tuples - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> b,c=nx.intersection_array(G) - >>> list(nx.global_parameters(b,c)) - [(0, 0, 3), (1, 0, 2), (1, 1, 1), (1, 1, 1), (2, 0, 1), (3, 0, 0)] - - References - ---------- - .. [1] Weisstein, Eric W. "Global Parameters." - From MathWorld--A Wolfram Web Resource. - http://mathworld.wolfram.com/GlobalParameters.html - - See Also - -------- - intersection_array - """ - d=len(b) - ba=b[:] - ca=c[:] - ba.append(0) - ca.insert(0,0) - k = ba[0] - aa = [k-x-y for x,y in zip(ba,ca)] - return zip(*[ca,aa,ba]) - - -def intersection_array(G): - """Returns the intersection array of a distance-regular graph. - - Given a distance-regular graph G with integers b_i, c_i,i = 0,....,d - such that for any 2 vertices x,y in G at a distance i=d(x,y), there - are exactly c_i neighbors of y at a distance of i-1 from x and b_i - neighbors of y at a distance of i+1 from x. - - A distance regular graph'sintersection array is given by, - [b_0,b_1,.....b_{d-1};c_1,c_2,.....c_d] - - Parameters - ---------- - G: Networkx graph (undirected) - - Returns - ------- - b,c: tuple of lists - - Examples - -------- - >>> G=nx.icosahedral_graph() - >>> nx.intersection_array(G) - ([5, 2, 1], [1, 2, 5]) - - References - ---------- - .. [1] Weisstein, Eric W. "Intersection Array." - From MathWorld--A Wolfram Web Resource. - http://mathworld.wolfram.com/IntersectionArray.html - - - See Also - -------- - global_parameters - """ - if G.is_multigraph() or G.is_directed(): - raise nx.NetworkxException('Not implemented for directed ', - 'or multiedge graphs.') - # test for regular graph (all degrees must be equal) - degree = G.degree_iter() - (_,k) = next(degree) - for _,knext in degree: - if knext != k: - raise nx.NetworkXError('Graph is not distance regular.') - k = knext - path_length = nx.all_pairs_shortest_path_length(G) - diameter = max([max(path_length[n].values()) for n in path_length]) - bint = {} # 'b' intersection array - cint = {} # 'c' intersection array - for u in G: - for v in G: - try: - i = path_length[u][v] - except KeyError: # graph must be connected - raise nx.NetworkXError('Graph is not distance regular.') - # number of neighbors of v at a distance of i-1 from u - c = len([n for n in G[v] if path_length[n][u]==i-1]) - # number of neighbors of v at a distance of i+1 from u - b = len([n for n in G[v] if path_length[n][u]==i+1]) - # b,c are independent of u and v - if cint.get(i,c) != c or bint.get(i,b) != b: - raise nx.NetworkXError('Graph is not distance regular') - bint[i] = b - cint[i] = c - return ([bint.get(i,0) for i in range(diameter)], - [cint.get(i+1,0) for i in range(diameter)]) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/euler.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/euler.py deleted file mode 100644 index 4e834c7..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/euler.py +++ /dev/null @@ -1,135 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Eulerian circuits and graphs. -""" -import networkx as nx - -__author__ = """\n""".join(['Nima Mohammadi (nima.irt[AT]gmail.com)', - 'Aric Hagberg <hagberg@lanl.gov>']) -# Copyright (C) 2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['is_eulerian', 'eulerian_circuit'] - -def is_eulerian(G): - """Return True if G is an Eulerian graph, False otherwise. - - An Eulerian graph is a graph with an Eulerian circuit. - - Parameters - ---------- - G : graph - A NetworkX Graph - - Examples - -------- - >>> nx.is_eulerian(nx.DiGraph({0:[3], 1:[2], 2:[3], 3:[0, 1]})) - True - >>> nx.is_eulerian(nx.complete_graph(5)) - True - >>> nx.is_eulerian(nx.petersen_graph()) - False - - Notes - ----- - This implementation requires the graph to be connected - (or strongly connected for directed graphs). - """ - if G.is_directed(): - # Every node must have equal in degree and out degree - for n in G.nodes_iter(): - if G.in_degree(n) != G.out_degree(n): - return False - # Must be strongly connected - if not nx.is_strongly_connected(G): - return False - else: - # An undirected Eulerian graph has no vertices of odd degrees - for v,d in G.degree_iter(): - if d % 2 != 0: - return False - # Must be connected - if not nx.is_connected(G): - return False - return True - - -def eulerian_circuit(G, source=None): - """Return the edges of an Eulerian circuit in G. - - An Eulerian circuit is a path that crosses every edge in G exactly once - and finishes at the starting node. - - Parameters - ---------- - G : graph - A NetworkX Graph - source : node, optional - Starting node for circuit. - - Returns - ------- - edges : generator - A generator that produces edges in the Eulerian circuit. - - Raises - ------ - NetworkXError - If the graph is not Eulerian. - - See Also - -------- - is_eulerian - - Notes - ----- - Uses Fleury's algorithm [1]_,[2]_ - - References - ---------- - .. [1] Fleury, "Deux problemes de geometrie de situation", - Journal de mathematiques elementaires (1883), 257-261. - .. [2] http://en.wikipedia.org/wiki/Eulerian_path - - Examples - -------- - >>> G=nx.complete_graph(3) - >>> list(nx.eulerian_circuit(G)) - [(0, 1), (1, 2), (2, 0)] - >>> list(nx.eulerian_circuit(G,source=1)) - [(1, 0), (0, 2), (2, 1)] - >>> [u for u,v in nx.eulerian_circuit(G)] # nodes in circuit - [0, 1, 2] - """ - if not is_eulerian(G): - raise nx.NetworkXError("G is not Eulerian.") - - g = G.__class__(G) # copy graph structure (not attributes) - - # set starting node - if source is None: - v = next(g.nodes_iter()) - else: - v = source - - while g.size() > 0: - n = v - # sort nbrs here to provide stable ordering of alternate cycles - nbrs = sorted([v for u,v in g.edges(n)]) - for v in nbrs: - g.remove_edge(n,v) - bridge = not nx.is_connected(g.to_undirected()) - if bridge: - g.add_edge(n,v) # add this edge back and try another - else: - break # this edge is good, break the for loop - if bridge: - g.remove_edge(n,v) - g.remove_node(n) - yield (n,v) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/__init__.py deleted file mode 100644 index 438ab5f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from networkx.algorithms.flow.maxflow import * -from networkx.algorithms.flow.mincost import * - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/maxflow.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/maxflow.py deleted file mode 100644 index ee71528..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/maxflow.py +++ /dev/null @@ -1,477 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Maximum flow (and minimum cut) algorithms on capacitated graphs. -""" - -__author__ = """Loïc Séguin-C. <loicseguin@gmail.com>""" -# Copyright (C) 2010 Loïc Séguin-C. <loicseguin@gmail.com> -# All rights reserved. -# BSD license. - -import networkx as nx - -__all__ = ['ford_fulkerson', - 'ford_fulkerson_flow', - 'ford_fulkerson_flow_and_auxiliary', - 'max_flow', - 'min_cut'] - -def ford_fulkerson_flow_and_auxiliary(G, s, t, capacity='capacity'): - """Find a maximum single-commodity flow using the Ford-Fulkerson - algorithm. - - This function returns both the value of the maximum flow and the - auxiliary network resulting after finding the maximum flow, which - is also named residual network in the literature. The - auxiliary network has edges with capacity equal to the capacity - of the edge in the original network minus the flow that went - throught that edge. Notice that it can happen that a flow - from v to u is allowed in the auxiliary network, though disallowed - in the original network. A dictionary with infinite capacity edges - can be found as an attribute of the auxiliary network. - - Parameters - ---------- - G : NetworkX graph - Edges of the graph are expected to have an attribute called - 'capacity'. If this attribute is not present, the edge is - considered to have infinite capacity. - - s : node - Source node for the flow. - - t : node - Sink node for the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - Returns - ------- - flow_value : integer, float - Value of the maximum flow, i.e., net outflow from the source. - - auxiliary : DiGraph - Residual/auxiliary network after finding the maximum flow. - A dictionary with infinite capacity edges can be found as - an attribute of this network: auxiliary.graph['inf_capacity_flows'] - - Raises - ------ - NetworkXError - The algorithm does not support MultiGraph and MultiDiGraph. If - the input graph is an instance of one of these two classes, a - NetworkXError is raised. - - NetworkXUnbounded - If the graph has a path of infinite capacity, the value of a - feasible flow on the graph is unbounded above and the function - raises a NetworkXUnbounded. - - Notes - ----- - This algorithm uses Edmonds-Karp-Dinitz path selection rule which - guarantees a running time of `O(nm^2)` for `n` nodes and `m` edges. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_edge('x','a', capacity=3.0) - >>> G.add_edge('x','b', capacity=1.0) - >>> G.add_edge('a','c', capacity=3.0) - >>> G.add_edge('b','c', capacity=5.0) - >>> G.add_edge('b','d', capacity=4.0) - >>> G.add_edge('d','e', capacity=2.0) - >>> G.add_edge('c','y', capacity=2.0) - >>> G.add_edge('e','y', capacity=3.0) - >>> flow, auxiliary = nx.ford_fulkerson_flow_and_auxiliary(G, 'x', 'y') - >>> flow - 3.0 - >>> # A dictionary with infinite capacity flows can be found as an - >>> # attribute of the auxiliary network - >>> inf_capacity_flows = auxiliary.graph['inf_capacity_flows'] - - """ - if G.is_multigraph(): - raise nx.NetworkXError( - 'MultiGraph and MultiDiGraph not supported (yet).') - - if s not in G: - raise nx.NetworkXError('node %s not in graph' % str(s)) - if t not in G: - raise nx.NetworkXError('node %s not in graph' % str(t)) - - auxiliary = _create_auxiliary_digraph(G, capacity=capacity) - inf_capacity_flows = auxiliary.graph['inf_capacity_flows'] - - flow_value = 0 # Initial feasible flow. - - # As long as there is an (s, t)-path in the auxiliary digraph, find - # the shortest (with respect to the number of arcs) such path and - # augment the flow on this path. - while True: - try: - path_nodes = nx.bidirectional_shortest_path(auxiliary, s, t) - except nx.NetworkXNoPath: - break - - # Get the list of edges in the shortest path. - path_edges = list(zip(path_nodes[:-1], path_nodes[1:])) - - # Find the minimum capacity of an edge in the path. - try: - path_capacity = min([auxiliary[u][v][capacity] - for u, v in path_edges - if capacity in auxiliary[u][v]]) - except ValueError: - # path of infinite capacity implies no max flow - raise nx.NetworkXUnbounded( - "Infinite capacity path, flow unbounded above.") - - flow_value += path_capacity - - # Augment the flow along the path. - for u, v in path_edges: - edge_attr = auxiliary[u][v] - if capacity in edge_attr: - edge_attr[capacity] -= path_capacity - if edge_attr[capacity] == 0: - auxiliary.remove_edge(u, v) - else: - inf_capacity_flows[(u, v)] += path_capacity - - if auxiliary.has_edge(v, u): - if capacity in auxiliary[v][u]: - auxiliary[v][u][capacity] += path_capacity - else: - auxiliary.add_edge(v, u, {capacity: path_capacity}) - - auxiliary.graph['inf_capacity_flows'] = inf_capacity_flows - return flow_value, auxiliary - -def _create_auxiliary_digraph(G, capacity='capacity'): - """Initialize an auxiliary digraph and dict of infinite capacity - edges for a given graph G. - Ignore edges with capacity <= 0. - """ - auxiliary = nx.DiGraph() - auxiliary.add_nodes_from(G) - inf_capacity_flows = {} - if nx.is_directed(G): - for edge in G.edges(data = True): - if capacity in edge[2]: - if edge[2][capacity] > 0: - auxiliary.add_edge(*edge) - else: - auxiliary.add_edge(*edge) - inf_capacity_flows[(edge[0], edge[1])] = 0 - else: - for edge in G.edges(data = True): - if capacity in edge[2]: - if edge[2][capacity] > 0: - auxiliary.add_edge(*edge) - auxiliary.add_edge(edge[1], edge[0], edge[2]) - else: - auxiliary.add_edge(*edge) - auxiliary.add_edge(edge[1], edge[0], edge[2]) - inf_capacity_flows[(edge[0], edge[1])] = 0 - inf_capacity_flows[(edge[1], edge[0])] = 0 - - auxiliary.graph['inf_capacity_flows'] = inf_capacity_flows - return auxiliary - - -def _create_flow_dict(G, H, capacity='capacity'): - """Creates the flow dict of dicts on G corresponding to the - auxiliary digraph H and infinite capacity edges flows - inf_capacity_flows. - """ - inf_capacity_flows = H.graph['inf_capacity_flows'] - flow = dict([(u, {}) for u in G]) - - if G.is_directed(): - for u, v in G.edges_iter(): - if H.has_edge(u, v): - if capacity in G[u][v]: - flow[u][v] = max(0, G[u][v][capacity] - H[u][v][capacity]) - elif G.has_edge(v, u) and not capacity in G[v][u]: - flow[u][v] = max(0, inf_capacity_flows[(u, v)] - - inf_capacity_flows[(v, u)]) - else: - flow[u][v] = max(0, H[v].get(u, {}).get(capacity, 0) - - G[v].get(u, {}).get(capacity, 0)) - else: - flow[u][v] = G[u][v][capacity] - - else: # undirected - for u, v in G.edges_iter(): - if H.has_edge(u, v): - if capacity in G[u][v]: - flow[u][v] = abs(G[u][v][capacity] - H[u][v][capacity]) - else: - flow[u][v] = abs(inf_capacity_flows[(u, v)] - - inf_capacity_flows[(v, u)]) - else: - flow[u][v] = G[u][v][capacity] - flow[v][u] = flow[u][v] - - return flow - -def ford_fulkerson(G, s, t, capacity='capacity'): - """Find a maximum single-commodity flow using the Ford-Fulkerson - algorithm. - - This algorithm uses Edmonds-Karp-Dinitz path selection rule which - guarantees a running time of `O(nm^2)` for `n` nodes and `m` edges. - - - Parameters - ---------- - G : NetworkX graph - Edges of the graph are expected to have an attribute called - 'capacity'. If this attribute is not present, the edge is - considered to have infinite capacity. - - s : node - Source node for the flow. - - t : node - Sink node for the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - Returns - ------- - flow_value : integer, float - Value of the maximum flow, i.e., net outflow from the source. - - flow_dict : dictionary - Dictionary of dictionaries keyed by nodes such that - flow_dict[u][v] is the flow edge (u, v). - - Raises - ------ - NetworkXError - The algorithm does not support MultiGraph and MultiDiGraph. If - the input graph is an instance of one of these two classes, a - NetworkXError is raised. - - NetworkXUnbounded - If the graph has a path of infinite capacity, the value of a - feasible flow on the graph is unbounded above and the function - raises a NetworkXUnbounded. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_edge('x','a', capacity=3.0) - >>> G.add_edge('x','b', capacity=1.0) - >>> G.add_edge('a','c', capacity=3.0) - >>> G.add_edge('b','c', capacity=5.0) - >>> G.add_edge('b','d', capacity=4.0) - >>> G.add_edge('d','e', capacity=2.0) - >>> G.add_edge('c','y', capacity=2.0) - >>> G.add_edge('e','y', capacity=3.0) - >>> flow, F = nx.ford_fulkerson(G, 'x', 'y') - >>> flow - 3.0 - """ - flow_value, auxiliary = ford_fulkerson_flow_and_auxiliary(G, - s, t, capacity=capacity) - flow_dict = _create_flow_dict(G, auxiliary, capacity=capacity) - return flow_value, flow_dict - -def ford_fulkerson_flow(G, s, t, capacity='capacity'): - """Return a maximum flow for a single-commodity flow problem. - - Parameters - ---------- - G : NetworkX graph - Edges of the graph are expected to have an attribute called - 'capacity'. If this attribute is not present, the edge is - considered to have infinite capacity. - - s : node - Source node for the flow. - - t : node - Sink node for the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - Returns - ------- - flow_dict : dictionary - Dictionary of dictionaries keyed by nodes such that - flow_dict[u][v] is the flow edge (u, v). - - Raises - ------ - NetworkXError - The algorithm does not support MultiGraph and MultiDiGraph. If - the input graph is an instance of one of these two classes, a - NetworkXError is raised. - - NetworkXUnbounded - If the graph has a path of infinite capacity, the value of a - feasible flow on the graph is unbounded above and the function - raises a NetworkXUnbounded. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_edge('x','a', capacity=3.0) - >>> G.add_edge('x','b', capacity=1.0) - >>> G.add_edge('a','c', capacity=3.0) - >>> G.add_edge('b','c', capacity=5.0) - >>> G.add_edge('b','d', capacity=4.0) - >>> G.add_edge('d','e', capacity=2.0) - >>> G.add_edge('c','y', capacity=2.0) - >>> G.add_edge('e','y', capacity=3.0) - >>> F = nx.ford_fulkerson_flow(G, 'x', 'y') - >>> for u, v in sorted(G.edges_iter()): - ... print('(%s, %s) %.2f' % (u, v, F[u][v])) - ... - (a, c) 2.00 - (b, c) 0.00 - (b, d) 1.00 - (c, y) 2.00 - (d, e) 1.00 - (e, y) 1.00 - (x, a) 2.00 - (x, b) 1.00 - """ - flow_value, auxiliary = ford_fulkerson_flow_and_auxiliary(G, - s, t, capacity=capacity) - return _create_flow_dict(G, auxiliary, capacity=capacity) - -def max_flow(G, s, t, capacity='capacity'): - """Find the value of a maximum single-commodity flow. - - Parameters - ---------- - G : NetworkX graph - Edges of the graph are expected to have an attribute called - 'capacity'. If this attribute is not present, the edge is - considered to have infinite capacity. - - s : node - Source node for the flow. - - t : node - Sink node for the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - Returns - ------- - flow_value : integer, float - Value of the maximum flow, i.e., net outflow from the source. - - Raises - ------ - NetworkXError - The algorithm does not support MultiGraph and MultiDiGraph. If - the input graph is an instance of one of these two classes, a - NetworkXError is raised. - - NetworkXUnbounded - If the graph has a path of infinite capacity, the value of a - feasible flow on the graph is unbounded above and the function - raises a NetworkXUnbounded. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_edge('x','a', capacity=3.0) - >>> G.add_edge('x','b', capacity=1.0) - >>> G.add_edge('a','c', capacity=3.0) - >>> G.add_edge('b','c', capacity=5.0) - >>> G.add_edge('b','d', capacity=4.0) - >>> G.add_edge('d','e', capacity=2.0) - >>> G.add_edge('c','y', capacity=2.0) - >>> G.add_edge('e','y', capacity=3.0) - >>> flow = nx.max_flow(G, 'x', 'y') - >>> flow - 3.0 - """ - return ford_fulkerson_flow_and_auxiliary(G, s, t, capacity=capacity)[0] - - -def min_cut(G, s, t, capacity='capacity'): - """Compute the value of a minimum (s, t)-cut. - - Use the max-flow min-cut theorem, i.e., the capacity of a minimum - capacity cut is equal to the flow value of a maximum flow. - - Parameters - ---------- - G : NetworkX graph - Edges of the graph are expected to have an attribute called - 'capacity'. If this attribute is not present, the edge is - considered to have infinite capacity. - - s : node - Source node for the flow. - - t : node - Sink node for the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - Returns - ------- - cutValue : integer, float - Value of the minimum cut. - - Raises - ------ - NetworkXUnbounded - If the graph has a path of infinite capacity, all cuts have - infinite capacity and the function raises a NetworkXError. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_edge('x','a', capacity = 3.0) - >>> G.add_edge('x','b', capacity = 1.0) - >>> G.add_edge('a','c', capacity = 3.0) - >>> G.add_edge('b','c', capacity = 5.0) - >>> G.add_edge('b','d', capacity = 4.0) - >>> G.add_edge('d','e', capacity = 2.0) - >>> G.add_edge('c','y', capacity = 2.0) - >>> G.add_edge('e','y', capacity = 3.0) - >>> nx.min_cut(G, 'x', 'y') - 3.0 - """ - - try: - return ford_fulkerson_flow_and_auxiliary(G, s, t, capacity=capacity)[0] - except nx.NetworkXUnbounded: - raise nx.NetworkXUnbounded( - "Infinite capacity path, no minimum cut.") - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/mincost.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/mincost.py deleted file mode 100644 index 9e5f574..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/mincost.py +++ /dev/null @@ -1,802 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Minimum cost flow algorithms on directed connected graphs. -""" - -__author__ = """Loïc Séguin-C. <loicseguin@gmail.com>""" -# Copyright (C) 2010 Loïc Séguin-C. <loicseguin@gmail.com> -# All rights reserved. -# BSD license. - - -__all__ = ['network_simplex', - 'min_cost_flow_cost', - 'min_cost_flow', - 'cost_of_flow', - 'max_flow_min_cost'] - -import networkx as nx -from networkx.utils import generate_unique_node - -def _initial_tree_solution(G, demand = 'demand', capacity = 'capacity', - weight = 'weight'): - """Find a initial tree solution rooted at r. - - The initial tree solution is obtained by considering edges (r, v) - for all nodes v with non-negative demand and (v, r) for all nodes - with negative demand. If these edges do not exist, we add them to - the graph and call them artificial edges. - """ - H = nx.DiGraph((edge for edge in G.edges(data=True) if - edge[2].get(capacity, 1) > 0)) - demand_nodes = (node for node in G.nodes_iter(data=True) if - node[1].get(demand, 0) != 0) - H.add_nodes_from(demand_nodes) - r = H.nodes()[0] - - T = nx.DiGraph() - y = {r: 0} - artificialEdges = [] - flowCost = 0 - - n = H.number_of_nodes() - try: - maxWeight = max(abs(d[weight]) for u, v, d in H.edges(data = True) - if weight in d) - except ValueError: - maxWeight = 0 - hugeWeight = 1 + n * maxWeight - - for v, d in H.nodes(data = True)[1:]: - vDemand = d.get(demand, 0) - if vDemand >= 0: - if not (r, v) in H.edges(): - H.add_edge(r, v, {weight: hugeWeight, 'flow': vDemand}) - artificialEdges.append((r, v)) - y[v] = H[r][v].get(weight, 0) - T.add_edge(r, v) - flowCost += vDemand * H[r][v].get(weight, 0) - - else: # (r, v) in H.edges() - if (not capacity in H[r][v] - or vDemand <= H[r][v][capacity]): - H[r][v]['flow'] = vDemand - y[v] = H[r][v].get(weight, 0) - T.add_edge(r, v) - flowCost += vDemand * H[r][v].get(weight, 0) - - else: # existing edge does not have enough capacity - newLabel = generate_unique_node() - H.add_edge(r, newLabel, {weight: hugeWeight, 'flow': vDemand}) - H.add_edge(newLabel, v, {weight: hugeWeight, 'flow': vDemand}) - artificialEdges.append((r, newLabel)) - artificialEdges.append((newLabel, v)) - y[v] = 2 * hugeWeight - y[newLabel] = hugeWeight - T.add_edge(r, newLabel) - T.add_edge(newLabel, v) - flowCost += 2 * vDemand * hugeWeight - - else: # vDemand < 0 - if not (v, r) in H.edges(): - H.add_edge(v, r, {weight: hugeWeight, 'flow': -vDemand}) - artificialEdges.append((v, r)) - y[v] = -H[v][r].get(weight, 0) - T.add_edge(v, r) - flowCost += -vDemand * H[v][r].get(weight, 0) - - else: - if (not capacity in H[v][r] - or -vDemand <= H[v][r][capacity]): - H[v][r]['flow'] = -vDemand - y[v] = -H[v][r].get(weight, 0) - T.add_edge(v, r) - flowCost += -vDemand * H[v][r].get(weight, 0) - else: # existing edge does not have enough capacity - newLabel = generate_unique_node() - H.add_edge(v, newLabel, - {weight: hugeWeight, 'flow': -vDemand}) - H.add_edge(newLabel, r, - {weight: hugeWeight, 'flow': -vDemand}) - artificialEdges.append((v, newLabel)) - artificialEdges.append((newLabel, r)) - y[v] = -2 * hugeWeight - y[newLabel] = -hugeWeight - T.add_edge(v, newLabel) - T.add_edge(newLabel, r) - flowCost += 2 * -vDemand * hugeWeight - - return H, T, y, artificialEdges, flowCost, r - - -def _find_entering_edge(H, c, capacity = 'capacity'): - """Find an edge which creates a negative cost cycle in the actual - tree solution. - - The reduced cost of every edge gives the value of the cycle - obtained by adding that edge to the tree solution. If that value is - negative, we will augment the flow in the direction indicated by - the edge. Otherwise, we will augment the flow in the reverse - direction. - - If no edge is found, return and empty tuple. This will cause the - main loop of the algorithm to terminate. - """ - newEdge = () - for u, v, d in H.edges_iter(data = True): - if d.get('flow', 0) == 0: - if c[(u, v)] < 0: - newEdge = (u, v) - break - else: - if capacity in d: - if (d.get('flow', 0) == d[capacity] - and c[(u, v)] > 0): - newEdge = (u, v) - break - return newEdge - - -def _find_leaving_edge(H, T, cycle, newEdge, capacity = 'capacity', - reverse=False): - """Find an edge that will leave the basis and the value by which we - can increase or decrease the flow on that edge. - - The leaving arc rule is used to prevent cycling. - - If cycle has no reverse edge and no forward edge of finite - capacity, it means that cycle is a negative cost infinite capacity - cycle. This implies that the cost of a flow satisfying all demands - is unbounded below. An exception is raised in this case. - """ - eps = False - leavingEdge = () - - # If cycle is a digon. - if len(cycle) == 3: - u, v = newEdge - if capacity not in H[u][v] and capacity not in H[v][u]: - raise nx.NetworkXUnbounded( - "Negative cost cycle of infinite capacity found. " - + "Min cost flow unbounded below.") - - if reverse: - if H[u][v].get('flow', 0) > H[v][u].get('flow', 0): - return (v, u), H[v][u].get('flow', 0) - else: - return (u, v), H[u][v].get('flow', 0) - else: - uv_residual = H[u][v].get(capacity, 0) - H[u][v].get('flow', 0) - vu_residual = H[v][u].get(capacity, 0) - H[v][u].get('flow', 0) - if (uv_residual > vu_residual): - return (v, u), vu_residual - else: - return (u, v), uv_residual - - # Find the forward edge with the minimum value for capacity - 'flow' - # and the reverse edge with the minimum value for 'flow'. - for index, u in enumerate(cycle[:-1]): - edgeCapacity = False - edge = () - v = cycle[index + 1] - if (u, v) in T.edges() + [newEdge]: #forward edge - if capacity in H[u][v]: # edge (u, v) has finite capacity - edgeCapacity = H[u][v][capacity] - H[u][v].get('flow', 0) - edge = (u, v) - else: #reverse edge - edgeCapacity = H[v][u].get('flow', 0) - edge = (v, u) - - # Determine if edge might be the leaving edge. - if edge: - if leavingEdge: - if edgeCapacity < eps: - eps = edgeCapacity - leavingEdge = edge - else: - eps = edgeCapacity - leavingEdge = edge - - if not leavingEdge: - raise nx.NetworkXUnbounded( - "Negative cost cycle of infinite capacity found. " - + "Min cost flow unbounded below.") - - return leavingEdge, eps - - -def _create_flow_dict(G, H): - """Creates the flow dict of dicts of graph G with auxiliary graph H.""" - flowDict = dict([(u, {}) for u in G]) - - for u in G.nodes_iter(): - for v in G.neighbors(u): - if H.has_edge(u, v): - flowDict[u][v] = H[u][v].get('flow', 0) - else: - flowDict[u][v] = 0 - return flowDict - - -def network_simplex(G, demand = 'demand', capacity = 'capacity', - weight = 'weight'): - """Find a minimum cost flow satisfying all demands in digraph G. - - This is a primal network simplex algorithm that uses the leaving - arc rule to prevent cycling. - - G is a digraph with edge costs and capacities and in which nodes - have demand, i.e., they want to send or receive some amount of - flow. A negative demand means that the node wants to send flow, a - positive demand means that the node want to receive flow. A flow on - the digraph G satisfies all demand if the net flow into each node - is equal to the demand of that node. - - Parameters - ---------- - G : NetworkX graph - DiGraph on which a minimum cost flow satisfying all demands is - to be found. - - demand: string - Nodes of the graph G are expected to have an attribute demand - that indicates how much flow a node wants to send (negative - demand) or receive (positive demand). Note that the sum of the - demands should be 0 otherwise the problem in not feasible. If - this attribute is not present, a node is considered to have 0 - demand. Default value: 'demand'. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - weight: string - Edges of the graph G are expected to have an attribute weight - that indicates the cost incurred by sending one unit of flow on - that edge. If not present, the weight is considered to be 0. - Default value: 'weight'. - - Returns - ------- - flowCost: integer, float - Cost of a minimum cost flow satisfying all demands. - - flowDict: dictionary - Dictionary of dictionaries keyed by nodes such that - flowDict[u][v] is the flow edge (u, v). - - Raises - ------ - NetworkXError - This exception is raised if the input graph is not directed, - not connected or is a multigraph. - - NetworkXUnfeasible - This exception is raised in the following situations: - * The sum of the demands is not zero. Then, there is no - flow satisfying all demands. - * There is no flow satisfying all demand. - - NetworkXUnbounded - This exception is raised if the digraph G has a cycle of - negative cost and infinite capacity. Then, the cost of a flow - satisfying all demands is unbounded below. - - Notes - ----- - This algorithm is not guaranteed to work if edge weights - are floating point numbers (overflows and roundoff errors can - cause problems). - - See also - -------- - cost_of_flow, max_flow_min_cost, min_cost_flow, min_cost_flow_cost - - Examples - -------- - A simple example of a min cost flow problem. - - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_node('a', demand = -5) - >>> G.add_node('d', demand = 5) - >>> G.add_edge('a', 'b', weight = 3, capacity = 4) - >>> G.add_edge('a', 'c', weight = 6, capacity = 10) - >>> G.add_edge('b', 'd', weight = 1, capacity = 9) - >>> G.add_edge('c', 'd', weight = 2, capacity = 5) - >>> flowCost, flowDict = nx.network_simplex(G) - >>> flowCost - 24 - >>> flowDict # doctest: +SKIP - {'a': {'c': 1, 'b': 4}, 'c': {'d': 1}, 'b': {'d': 4}, 'd': {}} - - The mincost flow algorithm can also be used to solve shortest path - problems. To find the shortest path between two nodes u and v, - give all edges an infinite capacity, give node u a demand of -1 and - node v a demand a 1. Then run the network simplex. The value of a - min cost flow will be the distance between u and v and edges - carrying positive flow will indicate the path. - - >>> G=nx.DiGraph() - >>> G.add_weighted_edges_from([('s','u',10), ('s','x',5), - ... ('u','v',1), ('u','x',2), - ... ('v','y',1), ('x','u',3), - ... ('x','v',5), ('x','y',2), - ... ('y','s',7), ('y','v',6)]) - >>> G.add_node('s', demand = -1) - >>> G.add_node('v', demand = 1) - >>> flowCost, flowDict = nx.network_simplex(G) - >>> flowCost == nx.shortest_path_length(G, 's', 'v', weight = 'weight') - True - >>> sorted([(u, v) for u in flowDict for v in flowDict[u] if flowDict[u][v] > 0]) - [('s', 'x'), ('u', 'v'), ('x', 'u')] - >>> nx.shortest_path(G, 's', 'v', weight = 'weight') - ['s', 'x', 'u', 'v'] - - It is possible to change the name of the attributes used for the - algorithm. - - >>> G = nx.DiGraph() - >>> G.add_node('p', spam = -4) - >>> G.add_node('q', spam = 2) - >>> G.add_node('a', spam = -2) - >>> G.add_node('d', spam = -1) - >>> G.add_node('t', spam = 2) - >>> G.add_node('w', spam = 3) - >>> G.add_edge('p', 'q', cost = 7, vacancies = 5) - >>> G.add_edge('p', 'a', cost = 1, vacancies = 4) - >>> G.add_edge('q', 'd', cost = 2, vacancies = 3) - >>> G.add_edge('t', 'q', cost = 1, vacancies = 2) - >>> G.add_edge('a', 't', cost = 2, vacancies = 4) - >>> G.add_edge('d', 'w', cost = 3, vacancies = 4) - >>> G.add_edge('t', 'w', cost = 4, vacancies = 1) - >>> flowCost, flowDict = nx.network_simplex(G, demand = 'spam', - ... capacity = 'vacancies', - ... weight = 'cost') - >>> flowCost - 37 - >>> flowDict # doctest: +SKIP - {'a': {'t': 4}, 'd': {'w': 2}, 'q': {'d': 1}, 'p': {'q': 2, 'a': 2}, 't': {'q': 1, 'w': 1}, 'w': {}} - - References - ---------- - W. J. Cook, W. H. Cunningham, W. R. Pulleyblank and A. Schrijver. - Combinatorial Optimization. Wiley-Interscience, 1998. - - """ - - if not G.is_directed(): - raise nx.NetworkXError("Undirected graph not supported.") - if not nx.is_connected(G.to_undirected()): - raise nx.NetworkXError("Not connected graph not supported.") - if G.is_multigraph(): - raise nx.NetworkXError("MultiDiGraph not supported.") - if sum(d[demand] for v, d in G.nodes(data = True) - if demand in d) != 0: - raise nx.NetworkXUnfeasible("Sum of the demands should be 0.") - - # Fix an arbitrarily chosen root node and find an initial tree solution. - H, T, y, artificialEdges, flowCost, r = \ - _initial_tree_solution(G, demand = demand, capacity = capacity, - weight = weight) - - # Initialize the reduced costs. - c = {} - for u, v, d in H.edges_iter(data = True): - c[(u, v)] = d.get(weight, 0) + y[u] - y[v] - - # Print stuff for debugging. - # print('-' * 78) - # nbIter = 0 - # print('Iteration %d' % nbIter) - # nbIter += 1 - # print('Tree solution: %s' % T.edges()) - # print(' Edge %11s%10s' % ('Flow', 'Red Cost')) - # for u, v, d in H.edges(data = True): - # flag = '' - # if (u, v) in artificialEdges: - # flag = '*' - # print('(%s, %s)%1s%10d%10d' % (u, v, flag, d.get('flow', 0), - # c[(u, v)])) - # print('Distances: %s' % y) - - # Main loop. - while True: - newEdge = _find_entering_edge(H, c, capacity = capacity) - if not newEdge: - break # Optimal basis found. Main loop is over. - cycleCost = abs(c[newEdge]) - - # Find the cycle created by adding newEdge to T. - path1 = nx.shortest_path(T.to_undirected(), r, newEdge[0]) - path2 = nx.shortest_path(T.to_undirected(), r, newEdge[1]) - join = r - for index, node in enumerate(path1[1:]): - if index + 1 < len(path2) and node == path2[index + 1]: - join = node - else: - break - path1 = path1[path1.index(join):] - path2 = path2[path2.index(join):] - cycle = [] - if H[newEdge[0]][newEdge[1]].get('flow', 0) == 0: - reverse = False - path2.reverse() - cycle = path1 + path2 - else: # newEdge is at capacity - reverse = True - path1.reverse() - cycle = path2 + path1 - - # Find the leaving edge. Will stop here if cycle is an infinite - # capacity negative cost cycle. - leavingEdge, eps = _find_leaving_edge(H, T, cycle, newEdge, - capacity=capacity, - reverse=reverse) - - # Actual augmentation happens here. If eps = 0, don't bother. - if eps: - flowCost -= cycleCost * eps - if len(cycle) == 3: - if reverse: - eps = -eps - u, v = newEdge - H[u][v]['flow'] = H[u][v].get('flow', 0) + eps - H[v][u]['flow'] = H[v][u].get('flow', 0) + eps - else: - for index, u in enumerate(cycle[:-1]): - v = cycle[index + 1] - if (u, v) in T.edges() + [newEdge]: - H[u][v]['flow'] = H[u][v].get('flow', 0) + eps - else: # (v, u) in T.edges(): - H[v][u]['flow'] -= eps - - # Update tree solution. - T.add_edge(*newEdge) - T.remove_edge(*leavingEdge) - - # Update distances and reduced costs. - if newEdge != leavingEdge: - forest = nx.DiGraph(T) - forest.remove_edge(*newEdge) - R, notR = nx.connected_component_subgraphs(forest.to_undirected()) - if r in notR.nodes(): # make sure r is in R - R, notR = notR, R - if newEdge[0] in R.nodes(): - for v in notR.nodes(): - y[v] += c[newEdge] - else: - for v in notR.nodes(): - y[v] -= c[newEdge] - for u, v in H.edges(): - if u in notR.nodes() or v in notR.nodes(): - c[(u, v)] = H[u][v].get(weight, 0) + y[u] - y[v] - - # Print stuff for debugging. - # print('-' * 78) - # print('Iteration %d' % nbIter) - # nbIter += 1 - # print('Tree solution: %s' % T.edges()) - # print('New edge: (%s, %s)' % (newEdge[0], newEdge[1])) - # print('Leaving edge: (%s, %s)' % (leavingEdge[0], leavingEdge[1])) - # print('Cycle: %s' % cycle) - # print('eps: %d' % eps) - # print(' Edge %11s%10s' % ('Flow', 'Red Cost')) - # for u, v, d in H.edges(data = True): - # flag = '' - # if (u, v) in artificialEdges: - # flag = '*' - # print('(%s, %s)%1s%10d%10d' % (u, v, flag, d.get('flow', 0), - # c[(u, v)])) - # print('Distances: %s' % y) - - - # If an artificial edge has positive flow, the initial problem was - # not feasible. - for u, v in artificialEdges: - if H[u][v]['flow'] != 0: - raise nx.NetworkXUnfeasible("No flow satisfying all demands.") - H.remove_edge(u, v) - - for u in H.nodes(): - if not u in G: - H.remove_node(u) - - flowDict = _create_flow_dict(G, H) - - return flowCost, flowDict - - -def min_cost_flow_cost(G, demand = 'demand', capacity = 'capacity', - weight = 'weight'): - """Find the cost of a minimum cost flow satisfying all demands in digraph G. - - G is a digraph with edge costs and capacities and in which nodes - have demand, i.e., they want to send or receive some amount of - flow. A negative demand means that the node wants to send flow, a - positive demand means that the node want to receive flow. A flow on - the digraph G satisfies all demand if the net flow into each node - is equal to the demand of that node. - - Parameters - ---------- - G : NetworkX graph - DiGraph on which a minimum cost flow satisfying all demands is - to be found. - - demand: string - Nodes of the graph G are expected to have an attribute demand - that indicates how much flow a node wants to send (negative - demand) or receive (positive demand). Note that the sum of the - demands should be 0 otherwise the problem in not feasible. If - this attribute is not present, a node is considered to have 0 - demand. Default value: 'demand'. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - weight: string - Edges of the graph G are expected to have an attribute weight - that indicates the cost incurred by sending one unit of flow on - that edge. If not present, the weight is considered to be 0. - Default value: 'weight'. - - Returns - ------- - flowCost: integer, float - Cost of a minimum cost flow satisfying all demands. - - Raises - ------ - NetworkXError - This exception is raised if the input graph is not directed or - not connected. - - NetworkXUnfeasible - This exception is raised in the following situations: - * The sum of the demands is not zero. Then, there is no - flow satisfying all demands. - * There is no flow satisfying all demand. - - NetworkXUnbounded - This exception is raised if the digraph G has a cycle of - negative cost and infinite capacity. Then, the cost of a flow - satisfying all demands is unbounded below. - - See also - -------- - cost_of_flow, max_flow_min_cost, min_cost_flow, network_simplex - - Examples - -------- - A simple example of a min cost flow problem. - - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_node('a', demand = -5) - >>> G.add_node('d', demand = 5) - >>> G.add_edge('a', 'b', weight = 3, capacity = 4) - >>> G.add_edge('a', 'c', weight = 6, capacity = 10) - >>> G.add_edge('b', 'd', weight = 1, capacity = 9) - >>> G.add_edge('c', 'd', weight = 2, capacity = 5) - >>> flowCost = nx.min_cost_flow_cost(G) - >>> flowCost - 24 - """ - return network_simplex(G, demand = demand, capacity = capacity, - weight = weight)[0] - - -def min_cost_flow(G, demand = 'demand', capacity = 'capacity', - weight = 'weight'): - """Return a minimum cost flow satisfying all demands in digraph G. - - G is a digraph with edge costs and capacities and in which nodes - have demand, i.e., they want to send or receive some amount of - flow. A negative demand means that the node wants to send flow, a - positive demand means that the node want to receive flow. A flow on - the digraph G satisfies all demand if the net flow into each node - is equal to the demand of that node. - - Parameters - ---------- - G : NetworkX graph - DiGraph on which a minimum cost flow satisfying all demands is - to be found. - - demand: string - Nodes of the graph G are expected to have an attribute demand - that indicates how much flow a node wants to send (negative - demand) or receive (positive demand). Note that the sum of the - demands should be 0 otherwise the problem in not feasible. If - this attribute is not present, a node is considered to have 0 - demand. Default value: 'demand'. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - weight: string - Edges of the graph G are expected to have an attribute weight - that indicates the cost incurred by sending one unit of flow on - that edge. If not present, the weight is considered to be 0. - Default value: 'weight'. - - Returns - ------- - flowDict: dictionary - Dictionary of dictionaries keyed by nodes such that - flowDict[u][v] is the flow edge (u, v). - - Raises - ------ - NetworkXError - This exception is raised if the input graph is not directed or - not connected. - - NetworkXUnfeasible - This exception is raised in the following situations: - * The sum of the demands is not zero. Then, there is no - flow satisfying all demands. - * There is no flow satisfying all demand. - - NetworkXUnbounded - This exception is raised if the digraph G has a cycle of - negative cost and infinite capacity. Then, the cost of a flow - satisfying all demands is unbounded below. - - See also - -------- - cost_of_flow, max_flow_min_cost, min_cost_flow_cost, network_simplex - - Examples - -------- - A simple example of a min cost flow problem. - - >>> import networkx as nx - >>> G = nx.DiGraph() - >>> G.add_node('a', demand = -5) - >>> G.add_node('d', demand = 5) - >>> G.add_edge('a', 'b', weight = 3, capacity = 4) - >>> G.add_edge('a', 'c', weight = 6, capacity = 10) - >>> G.add_edge('b', 'd', weight = 1, capacity = 9) - >>> G.add_edge('c', 'd', weight = 2, capacity = 5) - >>> flowDict = nx.min_cost_flow(G) - """ - return network_simplex(G, demand = demand, capacity = capacity, - weight = weight)[1] - - -def cost_of_flow(G, flowDict, weight = 'weight'): - """Compute the cost of the flow given by flowDict on graph G. - - Note that this function does not check for the validity of the - flow flowDict. This function will fail if the graph G and the - flow don't have the same edge set. - - Parameters - ---------- - G : NetworkX graph - DiGraph on which a minimum cost flow satisfying all demands is - to be found. - - weight: string - Edges of the graph G are expected to have an attribute weight - that indicates the cost incurred by sending one unit of flow on - that edge. If not present, the weight is considered to be 0. - Default value: 'weight'. - - flowDict: dictionary - Dictionary of dictionaries keyed by nodes such that - flowDict[u][v] is the flow edge (u, v). - - Returns - ------- - cost: Integer, float - The total cost of the flow. This is given by the sum over all - edges of the product of the edge's flow and the edge's weight. - - See also - -------- - max_flow_min_cost, min_cost_flow, min_cost_flow_cost, network_simplex - """ - return sum((flowDict[u][v] * d.get(weight, 0) - for u, v, d in G.edges_iter(data = True))) - - -def max_flow_min_cost(G, s, t, capacity = 'capacity', weight = 'weight'): - """Return a maximum (s, t)-flow of minimum cost. - - G is a digraph with edge costs and capacities. There is a source - node s and a sink node t. This function finds a maximum flow from - s to t whose total cost is minimized. - - Parameters - ---------- - G : NetworkX graph - DiGraph on which a minimum cost flow satisfying all demands is - to be found. - - s: node label - Source of the flow. - - t: node label - Destination of the flow. - - capacity: string - Edges of the graph G are expected to have an attribute capacity - that indicates how much flow the edge can support. If this - attribute is not present, the edge is considered to have - infinite capacity. Default value: 'capacity'. - - weight: string - Edges of the graph G are expected to have an attribute weight - that indicates the cost incurred by sending one unit of flow on - that edge. If not present, the weight is considered to be 0. - Default value: 'weight'. - - Returns - ------- - flowDict: dictionary - Dictionary of dictionaries keyed by nodes such that - flowDict[u][v] is the flow edge (u, v). - - Raises - ------ - NetworkXError - This exception is raised if the input graph is not directed or - not connected. - - NetworkXUnbounded - This exception is raised if there is an infinite capacity path - from s to t in G. In this case there is no maximum flow. This - exception is also raised if the digraph G has a cycle of - negative cost and infinite capacity. Then, the cost of a flow - is unbounded below. - - See also - -------- - cost_of_flow, ford_fulkerson, min_cost_flow, min_cost_flow_cost, - network_simplex - - Examples - -------- - >>> G = nx.DiGraph() - >>> G.add_edges_from([(1, 2, {'capacity': 12, 'weight': 4}), - ... (1, 3, {'capacity': 20, 'weight': 6}), - ... (2, 3, {'capacity': 6, 'weight': -3}), - ... (2, 6, {'capacity': 14, 'weight': 1}), - ... (3, 4, {'weight': 9}), - ... (3, 5, {'capacity': 10, 'weight': 5}), - ... (4, 2, {'capacity': 19, 'weight': 13}), - ... (4, 5, {'capacity': 4, 'weight': 0}), - ... (5, 7, {'capacity': 28, 'weight': 2}), - ... (6, 5, {'capacity': 11, 'weight': 1}), - ... (6, 7, {'weight': 8}), - ... (7, 4, {'capacity': 6, 'weight': 6})]) - >>> mincostFlow = nx.max_flow_min_cost(G, 1, 7) - >>> nx.cost_of_flow(G, mincostFlow) - 373 - >>> maxFlow = nx.ford_fulkerson_flow(G, 1, 7) - >>> nx.cost_of_flow(G, maxFlow) - 428 - >>> mincostFlowValue = (sum((mincostFlow[u][7] for u in G.predecessors(7))) - ... - sum((mincostFlow[7][v] for v in G.successors(7)))) - >>> mincostFlowValue == nx.max_flow(G, 1, 7) - True - - - """ - maxFlow = nx.max_flow(G, s, t, capacity = capacity) - H = nx.DiGraph(G) - H.add_node(s, demand = -maxFlow) - H.add_node(t, demand = maxFlow) - return min_cost_flow(H, capacity = capacity, weight = weight) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_maxflow.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_maxflow.py deleted file mode 100644 index 41393c2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_maxflow.py +++ /dev/null @@ -1,273 +0,0 @@ -# -*- coding: utf-8 -*- -"""Max flow algorithm test suite. - -Run with nose: nosetests -v test_max_flow.py -""" - -__author__ = """Loïc Séguin-C. <loicseguin@gmail.com>""" -# Copyright (C) 2010 Loïc Séguin-C. <loicseguin@gmail.com> -# All rights reserved. -# BSD license. - - -import networkx as nx -from nose.tools import * - -def compare_flows(G, s, t, solnFlows, solnValue): - flowValue, flowDict = nx.ford_fulkerson(G, s, t) - assert_equal(flowValue, solnValue) - assert_equal(flowDict, solnFlows) - assert_equal(nx.min_cut(G, s, t), solnValue) - assert_equal(nx.max_flow(G, s, t), solnValue) - assert_equal(nx.ford_fulkerson_flow(G, s, t), solnFlows) - - -class TestMaxflow: - def test_graph1(self): - # Trivial undirected graph - G = nx.Graph() - G.add_edge(1,2, capacity = 1.0) - - solnFlows = {1: {2: 1.0}, - 2: {1: 1.0}} - - compare_flows(G, 1, 2, solnFlows, 1.0) - - def test_graph2(self): - # A more complex undirected graph - # adapted from www.topcoder.com/tc?module=Statc&d1=tutorials&d2=maxFlow - G = nx.Graph() - G.add_edge('x','a', capacity = 3.0) - G.add_edge('x','b', capacity = 1.0) - G.add_edge('a','c', capacity = 3.0) - G.add_edge('b','c', capacity = 5.0) - G.add_edge('b','d', capacity = 4.0) - G.add_edge('d','e', capacity = 2.0) - G.add_edge('c','y', capacity = 2.0) - G.add_edge('e','y', capacity = 3.0) - - H = {'x': {'a': 3, 'b': 1}, - 'a': {'c': 3, 'x': 3}, - 'b': {'c': 1, 'd': 2, 'x': 1}, - 'c': {'a': 3, 'b': 1, 'y': 2}, - 'd': {'b': 2, 'e': 2}, - 'e': {'d': 2, 'y': 2}, - 'y': {'c': 2, 'e': 2}} - - compare_flows(G, 'x', 'y', H, 4.0) - - def test_digraph1(self): - # The classic directed graph example - G = nx.DiGraph() - G.add_edge('a','b', capacity = 1000.0) - G.add_edge('a','c', capacity = 1000.0) - G.add_edge('b','c', capacity = 1.0) - G.add_edge('b','d', capacity = 1000.0) - G.add_edge('c','d', capacity = 1000.0) - - H = {'a': {'b': 1000.0, 'c': 1000.0}, - 'b': {'c': 0, 'd': 1000.0}, - 'c': {'d': 1000.0}, - 'd': {}} - - compare_flows(G, 'a', 'd', H, 2000.0) - - # An example in which some edges end up with zero flow. - G = nx.DiGraph() - G.add_edge('s', 'b', capacity = 2) - G.add_edge('s', 'c', capacity = 1) - G.add_edge('c', 'd', capacity = 1) - G.add_edge('d', 'a', capacity = 1) - G.add_edge('b', 'a', capacity = 2) - G.add_edge('a', 't', capacity = 2) - - H = {'s': {'b': 2, 'c': 0}, - 'c': {'d': 0}, - 'd': {'a': 0}, - 'b': {'a': 2}, - 'a': {'t': 2}, - 't': {}} - - compare_flows(G, 's', 't', H, 2) - - def test_digraph2(self): - # A directed graph example from Cormen et al. - G = nx.DiGraph() - G.add_edge('s','v1', capacity = 16.0) - G.add_edge('s','v2', capacity = 13.0) - G.add_edge('v1','v2', capacity = 10.0) - G.add_edge('v2','v1', capacity = 4.0) - G.add_edge('v1','v3', capacity = 12.0) - G.add_edge('v3','v2', capacity = 9.0) - G.add_edge('v2','v4', capacity = 14.0) - G.add_edge('v4','v3', capacity = 7.0) - G.add_edge('v3','t', capacity = 20.0) - G.add_edge('v4','t', capacity = 4.0) - - H = {'s': {'v1': 12.0, 'v2': 11.0}, - 'v2': {'v1': 0, 'v4': 11.0}, - 'v1': {'v2': 0, 'v3': 12.0}, - 'v3': {'v2': 0, 't': 19.0}, - 'v4': {'v3': 7.0, 't': 4.0}, - 't': {}} - - compare_flows(G, 's', 't', H, 23.0) - - def test_digraph3(self): - # A more complex directed graph - # from www.topcoder.com/tc?module=Statc&d1=tutorials&d2=maxFlow - G = nx.DiGraph() - G.add_edge('x','a', capacity = 3.0) - G.add_edge('x','b', capacity = 1.0) - G.add_edge('a','c', capacity = 3.0) - G.add_edge('b','c', capacity = 5.0) - G.add_edge('b','d', capacity = 4.0) - G.add_edge('d','e', capacity = 2.0) - G.add_edge('c','y', capacity = 2.0) - G.add_edge('e','y', capacity = 3.0) - - H = {'x': {'a': 2.0, 'b': 1.0}, - 'a': {'c': 2.0}, - 'b': {'c': 0, 'd': 1.0}, - 'c': {'y': 2.0}, - 'd': {'e': 1.0}, - 'e': {'y': 1.0}, - 'y': {}} - - compare_flows(G, 'x', 'y', H, 3.0) - - def test_optional_capacity(self): - # Test optional capacity parameter. - G = nx.DiGraph() - G.add_edge('x','a', spam = 3.0) - G.add_edge('x','b', spam = 1.0) - G.add_edge('a','c', spam = 3.0) - G.add_edge('b','c', spam = 5.0) - G.add_edge('b','d', spam = 4.0) - G.add_edge('d','e', spam = 2.0) - G.add_edge('c','y', spam = 2.0) - G.add_edge('e','y', spam = 3.0) - - solnFlows = {'x': {'a': 2.0, 'b': 1.0}, - 'a': {'c': 2.0}, - 'b': {'c': 0, 'd': 1.0}, - 'c': {'y': 2.0}, - 'd': {'e': 1.0}, - 'e': {'y': 1.0}, - 'y': {}} - solnValue = 3.0 - s = 'x' - t = 'y' - - flowValue, flowDict = nx.ford_fulkerson(G, s, t, capacity = 'spam') - assert_equal(flowValue, solnValue) - assert_equal(flowDict, solnFlows) - assert_equal(nx.min_cut(G, s, t, capacity = 'spam'), solnValue) - assert_equal(nx.max_flow(G, s, t, capacity = 'spam'), solnValue) - assert_equal(nx.ford_fulkerson_flow(G, s, t, capacity = 'spam'), - solnFlows) - - def test_digraph_infcap_edges(self): - # DiGraph with infinite capacity edges - G = nx.DiGraph() - G.add_edge('s', 'a') - G.add_edge('s', 'b', capacity = 30) - G.add_edge('a', 'c', capacity = 25) - G.add_edge('b', 'c', capacity = 12) - G.add_edge('a', 't', capacity = 60) - G.add_edge('c', 't') - - H = {'s': {'a': 85, 'b': 12}, - 'a': {'c': 25, 't': 60}, - 'b': {'c': 12}, - 'c': {'t': 37}, - 't': {}} - - compare_flows(G, 's', 't', H, 97) - - # DiGraph with infinite capacity digon - G = nx.DiGraph() - G.add_edge('s', 'a', capacity = 85) - G.add_edge('s', 'b', capacity = 30) - G.add_edge('a', 'c') - G.add_edge('c', 'a') - G.add_edge('b', 'c', capacity = 12) - G.add_edge('a', 't', capacity = 60) - G.add_edge('c', 't', capacity = 37) - - H = {'s': {'a': 85, 'b': 12}, - 'a': {'c': 25, 't': 60}, - 'c': {'a': 0, 't': 37}, - 'b': {'c': 12}, - 't': {}} - - compare_flows(G, 's', 't', H, 97) - - - def test_digraph_infcap_path(self): - # Graph with infinite capacity (s, t)-path - G = nx.DiGraph() - G.add_edge('s', 'a') - G.add_edge('s', 'b', capacity = 30) - G.add_edge('a', 'c') - G.add_edge('b', 'c', capacity = 12) - G.add_edge('a', 't', capacity = 60) - G.add_edge('c', 't') - - assert_raises(nx.NetworkXUnbounded, - nx.ford_fulkerson, G, 's', 't') - assert_raises(nx.NetworkXUnbounded, - nx.max_flow, G, 's', 't') - assert_raises(nx.NetworkXUnbounded, - nx.ford_fulkerson_flow, G, 's', 't') - assert_raises(nx.NetworkXUnbounded, - nx.min_cut, G, 's', 't') - - def test_graph_infcap_edges(self): - # Undirected graph with infinite capacity edges - G = nx.Graph() - G.add_edge('s', 'a') - G.add_edge('s', 'b', capacity = 30) - G.add_edge('a', 'c', capacity = 25) - G.add_edge('b', 'c', capacity = 12) - G.add_edge('a', 't', capacity = 60) - G.add_edge('c', 't') - - H = {'s': {'a': 85, 'b': 12}, - 'a': {'c': 25, 's': 85, 't': 60}, - 'b': {'c': 12, 's': 12}, - 'c': {'a': 25, 'b': 12, 't': 37}, - 't': {'a': 60, 'c': 37}} - - compare_flows(G, 's', 't', H, 97) - - def test_digraph4(self): - # From ticket #429 by mfrasca. - G = nx.DiGraph() - G.add_edge('s', 'a', capacity = 2) - G.add_edge('s', 'b', capacity = 2) - G.add_edge('a', 'b', capacity = 5) - G.add_edge('a', 't', capacity = 1) - G.add_edge('b', 'a', capacity = 1) - G.add_edge('b', 't', capacity = 3) - flowSoln = {'a': {'b': 1, 't': 1}, - 'b': {'a': 0, 't': 3}, - 's': {'a': 2, 'b': 2}, - 't': {}} - compare_flows(G, 's', 't', flowSoln, 4) - - - def test_disconnected(self): - G = nx.Graph() - G.add_weighted_edges_from([(0,1,1),(1,2,1),(2,3,1)],weight='capacity') - G.remove_node(1) - assert_equal(nx.max_flow(G,0,3),0) - - def test_source_target_not_in_graph(self): - G = nx.Graph() - G.add_weighted_edges_from([(0,1,1),(1,2,1),(2,3,1)],weight='capacity') - G.remove_node(0) - assert_raises(nx.NetworkXError,nx.max_flow,G,0,3) - G.add_weighted_edges_from([(0,1,1),(1,2,1),(2,3,1)],weight='capacity') - G.remove_node(3) - assert_raises(nx.NetworkXError,nx.max_flow,G,0,3) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_maxflow_large_graph.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_maxflow_large_graph.py deleted file mode 100644 index 578e2df..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -"""Max flow algorithm test suite on large graphs. - -Run with nose: nosetests -v test_max_flow.py -""" - -__author__ = """Loïc Séguin-C. <loicseguin@gmail.com>""" -# Copyright (C) 2010 Loïc Séguin-C. <loicseguin@gmail.com> -# All rights reserved. -# BSD license. - - -import networkx as nx -from nose.tools import * - -def gen_pyramid(N): - # This graph admits a flow of value 1 for which every arc is at - # capacity (except the arcs incident to the sink which have - # infinite capacity). - G = nx.DiGraph() - - for i in range(N - 1): - cap = 1. / (i + 2) - for j in range(i + 1): - G.add_edge((i, j), (i + 1, j), - capacity = cap) - cap = 1. / (i + 1) - cap - G.add_edge((i, j), (i + 1, j + 1), - capacity = cap) - cap = 1. / (i + 2) - cap - - for j in range(N): - G.add_edge((N - 1, j), 't') - - return G - - -class TestMaxflowLargeGraph: - def test_complete_graph(self): - N = 50 - G = nx.complete_graph(N) - for (u, v) in G.edges(): - G[u][v]['capacity'] = 5 - assert_equal(nx.ford_fulkerson(G, 1, 2)[0], 5 * (N - 1)) - - def test_pyramid(self): - N = 10 -# N = 100 # this gives a graph with 5051 nodes - G = gen_pyramid(N) - assert_almost_equal(nx.ford_fulkerson(G, (0, 0), 't')[0], 1.) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_mincost.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_mincost.py deleted file mode 100644 index 72df2f0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/flow/tests/test_mincost.py +++ /dev/null @@ -1,284 +0,0 @@ -# -*- coding: utf-8 -*- - -import networkx as nx -from nose.tools import assert_equal, assert_raises - -class TestNetworkSimplex: - def test_simple_digraph(self): - G = nx.DiGraph() - G.add_node('a', demand = -5) - G.add_node('d', demand = 5) - G.add_edge('a', 'b', weight = 3, capacity = 4) - G.add_edge('a', 'c', weight = 6, capacity = 10) - G.add_edge('b', 'd', weight = 1, capacity = 9) - G.add_edge('c', 'd', weight = 2, capacity = 5) - flowCost, H = nx.network_simplex(G) - soln = {'a': {'b': 4, 'c': 1}, - 'b': {'d': 4}, - 'c': {'d': 1}, - 'd': {}} - assert_equal(flowCost, 24) - assert_equal(nx.min_cost_flow_cost(G), 24) - assert_equal(H, soln) - assert_equal(nx.min_cost_flow(G), soln) - assert_equal(nx.cost_of_flow(G, H), 24) - - def test_negcycle_infcap(self): - G = nx.DiGraph() - G.add_node('s', demand = -5) - G.add_node('t', demand = 5) - G.add_edge('s', 'a', weight = 1, capacity = 3) - G.add_edge('a', 'b', weight = 3) - G.add_edge('c', 'a', weight = -6) - G.add_edge('b', 'd', weight = 1) - G.add_edge('d', 'c', weight = -2) - G.add_edge('d', 't', weight = 1, capacity = 3) - assert_raises(nx.NetworkXUnbounded, nx.network_simplex, G) - - def test_sum_demands_not_zero(self): - G = nx.DiGraph() - G.add_node('s', demand = -5) - G.add_node('t', demand = 4) - G.add_edge('s', 'a', weight = 1, capacity = 3) - G.add_edge('a', 'b', weight = 3) - G.add_edge('a', 'c', weight = -6) - G.add_edge('b', 'd', weight = 1) - G.add_edge('c', 'd', weight = -2) - G.add_edge('d', 't', weight = 1, capacity = 3) - assert_raises(nx.NetworkXUnfeasible, nx.network_simplex, G) - - def test_no_flow_satisfying_demands(self): - G = nx.DiGraph() - G.add_node('s', demand = -5) - G.add_node('t', demand = 5) - G.add_edge('s', 'a', weight = 1, capacity = 3) - G.add_edge('a', 'b', weight = 3) - G.add_edge('a', 'c', weight = -6) - G.add_edge('b', 'd', weight = 1) - G.add_edge('c', 'd', weight = -2) - G.add_edge('d', 't', weight = 1, capacity = 3) - assert_raises(nx.NetworkXUnfeasible, nx.network_simplex, G) - - def test_transshipment(self): - G = nx.DiGraph() - G.add_node('a', demand = 1) - G.add_node('b', demand = -2) - G.add_node('c', demand = -2) - G.add_node('d', demand = 3) - G.add_node('e', demand = -4) - G.add_node('f', demand = -4) - G.add_node('g', demand = 3) - G.add_node('h', demand = 2) - G.add_node('r', demand = 3) - G.add_edge('a', 'c', weight = 3) - G.add_edge('r', 'a', weight = 2) - G.add_edge('b', 'a', weight = 9) - G.add_edge('r', 'c', weight = 0) - G.add_edge('b', 'r', weight = -6) - G.add_edge('c', 'd', weight = 5) - G.add_edge('e', 'r', weight = 4) - G.add_edge('e', 'f', weight = 3) - G.add_edge('h', 'b', weight = 4) - G.add_edge('f', 'd', weight = 7) - G.add_edge('f', 'h', weight = 12) - G.add_edge('g', 'd', weight = 12) - G.add_edge('f', 'g', weight = -1) - G.add_edge('h', 'g', weight = -10) - flowCost, H = nx.network_simplex(G) - soln = {'a': {'c': 0}, - 'b': {'a': 0, 'r': 2}, - 'c': {'d': 3}, - 'd': {}, - 'e': {'r': 3, 'f': 1}, - 'f': {'d': 0, 'g': 3, 'h': 2}, - 'g': {'d': 0}, - 'h': {'b': 0, 'g': 0}, - 'r': {'a': 1, 'c': 1}} - assert_equal(flowCost, 41) - assert_equal(nx.min_cost_flow_cost(G), 41) - assert_equal(H, soln) - assert_equal(nx.min_cost_flow(G), soln) - assert_equal(nx.cost_of_flow(G, H), 41) - - def test_max_flow_min_cost(self): - G = nx.DiGraph() - G.add_edge('s', 'a', bandwidth = 6) - G.add_edge('s', 'c', bandwidth = 10, cost = 10) - G.add_edge('a', 'b', cost = 6) - G.add_edge('b', 'd', bandwidth = 8, cost = 7) - G.add_edge('c', 'd', cost = 10) - G.add_edge('d', 't', bandwidth = 5, cost = 5) - soln = {'s': {'a': 5, 'c': 0}, - 'a': {'b': 5}, - 'b': {'d': 5}, - 'c': {'d': 0}, - 'd': {'t': 5}, - 't': {}} - flow = nx.max_flow_min_cost(G, 's', 't', capacity = 'bandwidth', - weight = 'cost') - assert_equal(flow, soln) - assert_equal(nx.cost_of_flow(G, flow, weight = 'cost'), 90) - - def test_digraph1(self): - # From Bradley, S. P., Hax, A. C. and Magnanti, T. L. Applied - # Mathematical Programming. Addison-Wesley, 1977. - G = nx.DiGraph() - G.add_node(1, demand = -20) - G.add_node(4, demand = 5) - G.add_node(5, demand = 15) - G.add_edges_from([(1, 2, {'capacity': 15, 'weight': 4}), - (1, 3, {'capacity': 8, 'weight': 4}), - (2, 3, {'weight': 2}), - (2, 4, {'capacity': 4, 'weight': 2}), - (2, 5, {'capacity': 10, 'weight': 6}), - (3, 4, {'capacity': 15, 'weight': 1}), - (3, 5, {'capacity': 5, 'weight': 3}), - (4, 5, {'weight': 2}), - (5, 3, {'capacity': 4, 'weight': 1})]) - flowCost, H = nx.network_simplex(G) - soln = {1: {2: 12, 3: 8}, - 2: {3: 8, 4: 4, 5: 0}, - 3: {4: 11, 5: 5}, - 4: {5: 10}, - 5: {3: 0}} - assert_equal(flowCost, 150) - assert_equal(nx.min_cost_flow_cost(G), 150) - assert_equal(H, soln) - assert_equal(nx.min_cost_flow(G), soln) - assert_equal(nx.cost_of_flow(G, H), 150) - - def test_digraph2(self): - # Example from ticket #430 from mfrasca. Original source: - # http://www.cs.princeton.edu/courses/archive/spr03/cs226/lectures/mincost.4up.pdf, slide 11. - G = nx.DiGraph() - G.add_edge('s', 1, capacity=12) - G.add_edge('s', 2, capacity=6) - G.add_edge('s', 3, capacity=14) - G.add_edge(1, 2, capacity=11, weight=4) - G.add_edge(2, 3, capacity=9, weight=6) - G.add_edge(1, 4, capacity=5, weight=5) - G.add_edge(1, 5, capacity=2, weight=12) - G.add_edge(2, 5, capacity=4, weight=4) - G.add_edge(2, 6, capacity=2, weight=6) - G.add_edge(3, 6, capacity=31, weight=3) - G.add_edge(4, 5, capacity=18, weight=4) - G.add_edge(5, 6, capacity=9, weight=5) - G.add_edge(4, 't', capacity=3) - G.add_edge(5, 't', capacity=7) - G.add_edge(6, 't', capacity=22) - flow = nx.max_flow_min_cost(G, 's', 't') - soln = {1: {2: 6, 4: 5, 5: 1}, - 2: {3: 6, 5: 4, 6: 2}, - 3: {6: 20}, - 4: {5: 2, 't': 3}, - 5: {6: 0, 't': 7}, - 6: {'t': 22}, - 's': {1: 12, 2: 6, 3: 14}, - 't': {}} - assert_equal(flow, soln) - - def test_digraph3(self): - """Combinatorial Optimization: Algorithms and Complexity, - Papadimitriou Steiglitz at page 140 has an example, 7.1, but that - admits multiple solutions, so I alter it a bit. From ticket #430 - by mfrasca.""" - - G = nx.DiGraph() - G.add_edge('s', 'a', {0: 2, 1: 4}) - G.add_edge('s', 'b', {0: 2, 1: 1}) - G.add_edge('a', 'b', {0: 5, 1: 2}) - G.add_edge('a', 't', {0: 1, 1: 5}) - G.add_edge('b', 'a', {0: 1, 1: 3}) - G.add_edge('b', 't', {0: 3, 1: 2}) - - "PS.ex.7.1: testing main function" - sol = nx.max_flow_min_cost(G, 's', 't', capacity=0, weight=1) - flow = sum(v for v in sol['s'].values()) - assert_equal(4, flow) - assert_equal(23, nx.cost_of_flow(G, sol, weight=1)) - assert_equal(sol['s'], {'a': 2, 'b': 2}) - assert_equal(sol['a'], {'b': 1, 't': 1}) - assert_equal(sol['b'], {'a': 0, 't': 3}) - assert_equal(sol['t'], {}) - - def test_zero_capacity_edges(self): - """Address issue raised in ticket #617 by arv.""" - G = nx.DiGraph() - G.add_edges_from([(1, 2, {'capacity': 1, 'weight': 1}), - (1, 5, {'capacity': 1, 'weight': 1}), - (2, 3, {'capacity': 0, 'weight': 1}), - (2, 5, {'capacity': 1, 'weight': 1}), - (5, 3, {'capacity': 2, 'weight': 1}), - (5, 4, {'capacity': 0, 'weight': 1}), - (3, 4, {'capacity': 2, 'weight': 1})]) - G.node[1]['demand'] = -1 - G.node[2]['demand'] = -1 - G.node[4]['demand'] = 2 - - flowCost, H = nx.network_simplex(G) - soln = {1: {2: 0, 5: 1}, - 2: {3: 0, 5: 1}, - 3: {4: 2}, - 4: {}, - 5: {3: 2, 4: 0}} - assert_equal(flowCost, 6) - assert_equal(nx.min_cost_flow_cost(G), 6) - assert_equal(H, soln) - assert_equal(nx.min_cost_flow(G), soln) - assert_equal(nx.cost_of_flow(G, H), 6) - - def test_digon(self): - """Check if digons are handled properly. Taken from ticket - #618 by arv.""" - nodes = [(1, {}), - (2, {'demand': -4}), - (3, {'demand': 4}), - ] - edges = [(1, 2, {'capacity': 3, 'weight': 600000}), - (2, 1, {'capacity': 2, 'weight': 0}), - (2, 3, {'capacity': 5, 'weight': 714285}), - (3, 2, {'capacity': 2, 'weight': 0}), - ] - G = nx.DiGraph(edges) - G.add_nodes_from(nodes) - flowCost, H = nx.network_simplex(G) - soln = {1: {2: 0}, - 2: {1: 0, 3: 4}, - 3: {2: 0}} - assert_equal(flowCost, 2857140) - assert_equal(nx.min_cost_flow_cost(G), 2857140) - assert_equal(H, soln) - assert_equal(nx.min_cost_flow(G), soln) - assert_equal(nx.cost_of_flow(G, H), 2857140) - - def test_infinite_capacity_neg_digon(self): - """An infinite capacity negative cost digon results in an unbounded - instance.""" - nodes = [(1, {}), - (2, {'demand': -4}), - (3, {'demand': 4}), - ] - edges = [(1, 2, {'weight': -600}), - (2, 1, {'weight': 0}), - (2, 3, {'capacity': 5, 'weight': 714285}), - (3, 2, {'capacity': 2, 'weight': 0}), - ] - G = nx.DiGraph(edges) - G.add_nodes_from(nodes) - assert_raises(nx.NetworkXUnbounded, nx.network_simplex, G) - - def test_finite_capacity_neg_digon(self): - """The digon should receive the maximum amount of flow it can handle. - Taken from ticket #749 by @chuongdo.""" - G = nx.DiGraph() - G.add_edge('a', 'b', capacity=1, weight=-1) - G.add_edge('b', 'a', capacity=1, weight=-1) - min_cost = -2 - assert_equal(nx.min_cost_flow_cost(G), min_cost) - - def test_multidigraph(self): - """Raise an exception for multidigraph.""" - G = nx.MultiDiGraph() - G.add_weighted_edges_from([(1, 2, 1), (2, 3, 2)], weight='capacity') - assert_raises(nx.NetworkXError, nx.network_simplex, G) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/graphical.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/graphical.py deleted file mode 100644 index 5c82761..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/graphical.py +++ /dev/null @@ -1,405 +0,0 @@ -# -*- coding: utf-8 -*- -"""Test sequences for graphiness. -""" -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from collections import defaultdict -import heapq -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult (dschult@colgate.edu)' - 'Joel Miller (joel.c.miller.research@gmail.com)' - 'Ben Edwards' - 'Brian Cloteaux <brian.cloteaux@nist.gov>']) - -__all__ = ['is_graphical', - 'is_multigraphical', - 'is_pseudographical', - 'is_digraphical', - 'is_valid_degree_sequence_erdos_gallai', - 'is_valid_degree_sequence_havel_hakimi', - 'is_valid_degree_sequence', # deprecated - ] - -def is_graphical(sequence, method='eg'): - """Returns True if sequence is a valid degree sequence. - - A degree sequence is valid if some graph can realize it. - - Parameters - ---------- - sequence : list or iterable container - A sequence of integer node degrees - - - method : "eg" | "hh" - The method used to validate the degree sequence. - "eg" corresponds to the ErdÅ‘s-Gallai algorithm, and - "hh" to the Havel-Hakimi algorithm. - - Returns - ------- - valid : bool - True if the sequence is a valid degree sequence and False if not. - - Examples - -------- - >>> G = nx.path_graph(4) - >>> sequence = G.degree().values() - >>> nx.is_valid_degree_sequence(sequence) - True - - References - ---------- - ErdÅ‘s-Gallai - [EG1960]_, [choudum1986]_ - - Havel-Hakimi - [havel1955]_, [hakimi1962]_, [CL1996]_ - """ - if method == 'eg': - valid = is_valid_degree_sequence_erdos_gallai(list(sequence)) - elif method == 'hh': - valid = is_valid_degree_sequence_havel_hakimi(list(sequence)) - else: - msg = "`method` must be 'eg' or 'hh'" - raise nx.NetworkXException(msg) - return valid - -is_valid_degree_sequence = is_graphical - -def _basic_graphical_tests(deg_sequence): - # Sort and perform some simple tests on the sequence - if not nx.utils.is_list_of_ints(deg_sequence): - raise nx.NetworkXUnfeasible - p = len(deg_sequence) - num_degs = [0]*p - dmax, dmin, dsum, n = 0, p, 0, 0 - for d in deg_sequence: - # Reject if degree is negative or larger than the sequence length - if d<0 or d>=p: - raise nx.NetworkXUnfeasible - # Process only the non-zero integers - elif d>0: - dmax, dmin, dsum, n = max(dmax,d), min(dmin,d), dsum+d, n+1 - num_degs[d] += 1 - # Reject sequence if it has odd sum or is oversaturated - if dsum%2 or dsum>n*(n-1): - raise nx.NetworkXUnfeasible - return dmax,dmin,dsum,n,num_degs - -def is_valid_degree_sequence_havel_hakimi(deg_sequence): - r"""Returns True if deg_sequence can be realized by a simple graph. - - The validation proceeds using the Havel-Hakimi theorem. - Worst-case run time is: O(s) where s is the sum of the sequence. - - Parameters - ---------- - deg_sequence : list - A list of integers where each element specifies the degree of a node - in a graph. - - Returns - ------- - valid : bool - True if deg_sequence is graphical and False if not. - - Notes - ----- - The ZZ condition says that for the sequence d if - - .. math:: - |d| >= \frac{(\max(d) + \min(d) + 1)^2}{4*\min(d)} - - then d is graphical. This was shown in Theorem 6 in [1]_. - - References - ---------- - .. [1] I.E. Zverovich and V.E. Zverovich. "Contributions to the theory - of graphic sequences", Discrete Mathematics, 105, pp. 292-303 (1992). - - [havel1955]_, [hakimi1962]_, [CL1996]_ - - """ - try: - dmax,dmin,dsum,n,num_degs = _basic_graphical_tests(deg_sequence) - except nx.NetworkXUnfeasible: - return False - # Accept if sequence has no non-zero degrees or passes the ZZ condition - if n==0 or 4*dmin*n >= (dmax+dmin+1) * (dmax+dmin+1): - return True - - modstubs = [0]*(dmax+1) - # Successively reduce degree sequence by removing the maximum degree - while n > 0: - # Retrieve the maximum degree in the sequence - while num_degs[dmax] == 0: - dmax -= 1; - # If there are not enough stubs to connect to, then the sequence is - # not graphical - if dmax > n-1: - return False - - # Remove largest stub in list - num_degs[dmax], n = num_degs[dmax]-1, n-1 - # Reduce the next dmax largest stubs - mslen = 0 - k = dmax - for i in range(dmax): - while num_degs[k] == 0: - k -= 1 - num_degs[k], n = num_degs[k]-1, n-1 - if k > 1: - modstubs[mslen] = k-1 - mslen += 1 - # Add back to the list any non-zero stubs that were removed - for i in range(mslen): - stub = modstubs[i] - num_degs[stub], n = num_degs[stub]+1, n+1 - return True - - -def is_valid_degree_sequence_erdos_gallai(deg_sequence): - r"""Returns True if deg_sequence can be realized by a simple graph. - - The validation is done using the ErdÅ‘s-Gallai theorem [EG1960]_. - - Parameters - ---------- - deg_sequence : list - A list of integers - - Returns - ------- - valid : bool - True if deg_sequence is graphical and False if not. - - Notes - ----- - - This implementation uses an equivalent form of the ErdÅ‘s-Gallai criterion. - Worst-case run time is: O(n) where n is the length of the sequence. - - Specifically, a sequence d is graphical if and only if the - sum of the sequence is even and for all strong indices k in the sequence, - - .. math:: - - \sum_{i=1}^{k} d_i \leq k(k-1) + \sum_{j=k+1}^{n} \min(d_i,k) - = k(n-1) - ( k \sum_{j=0}^{k-1} n_j - \sum_{j=0}^{k-1} j n_j ) - - A strong index k is any index where `d_k \geq k` and the value `n_j` is the - number of occurrences of j in d. The maximal strong index is called the - Durfee index. - - This particular rearrangement comes from the proof of Theorem 3 in [2]_. - - The ZZ condition says that for the sequence d if - - .. math:: - |d| >= \frac{(\max(d) + \min(d) + 1)^2}{4*\min(d)} - - then d is graphical. This was shown in Theorem 6 in [2]_. - - References - ---------- - .. [1] A. Tripathi and S. Vijay. "A note on a theorem of ErdÅ‘s & Gallai", - Discrete Mathematics, 265, pp. 417-420 (2003). - .. [2] I.E. Zverovich and V.E. Zverovich. "Contributions to the theory - of graphic sequences", Discrete Mathematics, 105, pp. 292-303 (1992). - - [EG1960]_, [choudum1986]_ - """ - try: - dmax,dmin,dsum,n,num_degs = _basic_graphical_tests(deg_sequence) - except nx.NetworkXUnfeasible: - return False - # Accept if sequence has no non-zero degrees or passes the ZZ condition - if n==0 or 4*dmin*n >= (dmax+dmin+1) * (dmax+dmin+1): - return True - - # Perform the EG checks using the reformulation of Zverovich and Zverovich - k, sum_deg, sum_nj, sum_jnj = 0, 0, 0, 0 - for dk in range(dmax, dmin-1, -1): - if dk < k+1: # Check if already past Durfee index - return True - if num_degs[dk] > 0: - run_size = num_degs[dk] # Process a run of identical-valued degrees - if dk < k+run_size: # Check if end of run is past Durfee index - run_size = dk-k # Adjust back to Durfee index - sum_deg += run_size * dk - for v in range(run_size): - sum_nj += num_degs[k+v] - sum_jnj += (k+v) * num_degs[k+v] - k += run_size - if sum_deg > k*(n-1) - k*sum_nj + sum_jnj: - return False - return True - -def is_multigraphical(sequence): - """Returns True if some multigraph can realize the sequence. - - Parameters - ---------- - deg_sequence : list - A list of integers - - Returns - ------- - valid : bool - True if deg_sequence is a multigraphic degree sequence and False if not. - - Notes - ----- - The worst-case run time is O(n) where n is the length of the sequence. - - References - ---------- - .. [1] S. L. Hakimi. "On the realizability of a set of integers as - degrees of the vertices of a linear graph", J. SIAM, 10, pp. 496-506 - (1962). - """ - deg_sequence = list(sequence) - if not nx.utils.is_list_of_ints(deg_sequence): - return False - dsum, dmax = 0, 0 - for d in deg_sequence: - if d<0: - return False - dsum, dmax = dsum+d, max(dmax,d) - if dsum%2 or dsum<2*dmax: - return False - return True - -def is_pseudographical(sequence): - """Returns True if some pseudograph can realize the sequence. - - Every nonnegative integer sequence with an even sum is pseudographical - (see [1]_). - - Parameters - ---------- - sequence : list or iterable container - A sequence of integer node degrees - - Returns - ------- - valid : bool - True if the sequence is a pseudographic degree sequence and False if not. - - Notes - ----- - The worst-case run time is O(n) where n is the length of the sequence. - - References - ---------- - .. [1] F. Boesch and F. Harary. "Line removal algorithms for graphs - and their degree lists", IEEE Trans. Circuits and Systems, CAS-23(12), - pp. 778-782 (1976). - """ - s = list(sequence) - if not nx.utils.is_list_of_ints(s): - return False - return sum(s)%2 == 0 and min(s) >= 0 - -def is_digraphical(in_sequence, out_sequence): - r"""Returns True if some directed graph can realize the in- and out-degree - sequences. - - Parameters - ---------- - in_sequence : list or iterable container - A sequence of integer node in-degrees - - out_sequence : list or iterable container - A sequence of integer node out-degrees - - Returns - ------- - valid : bool - True if in and out-sequences are digraphic False if not. - - Notes - ----- - This algorithm is from Kleitman and Wang [1]_. - The worst case runtime is O(s * log n) where s and n are the sum and length - of the sequences respectively. - - References - ---------- - .. [1] D.J. Kleitman and D.L. Wang - Algorithms for Constructing Graphs and Digraphs with Given Valences - and Factors, Discrete Mathematics, 6(1), pp. 79-88 (1973) - """ - in_deg_sequence = list(in_sequence) - out_deg_sequence = list(out_sequence) - if not nx.utils.is_list_of_ints(in_deg_sequence): - return False - if not nx.utils.is_list_of_ints(out_deg_sequence): - return False - # Process the sequences and form two heaps to store degree pairs with - # either zero or non-zero out degrees - sumin, sumout, nin, nout = 0, 0, len(in_deg_sequence), len(out_deg_sequence) - maxn = max(nin, nout) - maxin = 0 - if maxn==0: - return True - stubheap, zeroheap = [ ], [ ] - for n in range(maxn): - in_deg, out_deg = 0, 0 - if n<nout: - out_deg = out_deg_sequence[n] - if n<nin: - in_deg = in_deg_sequence[n] - if in_deg<0 or out_deg<0: - return False - sumin, sumout, maxin = sumin+in_deg, sumout+out_deg, max(maxin, in_deg) - if in_deg > 0: - stubheap.append((-1*out_deg, -1*in_deg)) - elif out_deg > 0: - zeroheap.append(-1*out_deg) - if sumin != sumout: - return False - heapq.heapify(stubheap) - heapq.heapify(zeroheap) - - modstubs = [(0,0)]*(maxin+1) - # Successively reduce degree sequence by removing the maximum out degree - while stubheap: - # Take the first value in the sequence with non-zero in degree - (freeout, freein) = heapq.heappop( stubheap ) - freein *= -1 - if freein > len(stubheap)+len(zeroheap): - return False - - # Attach out stubs to the nodes with the most in stubs - mslen = 0 - for i in range(freein): - if zeroheap and (not stubheap or stubheap[0][0] > zeroheap[0]): - stubout = heapq.heappop(zeroheap) - stubin = 0 - else: - (stubout, stubin) = heapq.heappop(stubheap) - if stubout == 0: - return False - # Check if target is now totally connected - if stubout+1<0 or stubin<0: - modstubs[mslen] = (stubout+1, stubin) - mslen += 1 - - # Add back the nodes to the heap that still have available stubs - for i in range(mslen): - stub = modstubs[i] - if stub[1] < 0: - heapq.heappush(stubheap, stub) - else: - heapq.heappush(zeroheap, stub[0]) - if freeout<0: - heapq.heappush(zeroheap, freeout) - return True diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/hierarchy.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/hierarchy.py deleted file mode 100644 index c38337b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/hierarchy.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Flow Hierarchy. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__authors__ = "\n".join(['Ben Edwards (bedwards@cs.unm.edu)']) -__all__ = ['flow_hierarchy'] - -def flow_hierarchy(G, weight=None): - """Returns the flow hierarchy of a directed network. - - Flow hierarchy is defined as the fraction of edges not participating - in cycles in a directed graph [1]_. - - Parameters - ---------- - G : DiGraph or MultiDiGraph - A directed graph - - weight : key,optional (default=None) - Attribute to use for node weights. If None the weight defaults to 1. - - Returns - ------- - h : float - Flow heirarchy value - - Notes - ----- - The algorithm described in [1]_ computes the flow hierarchy through - exponentiation of the adjacency matrix. This function implements an - alternative approach that finds strongly connected components. - An edge is in a cycle if and only if it is in a strongly connected - component, which can be found in `O(m)` time using Tarjan's algorithm. - - References - ---------- - .. [1] Luo, J.; Magee, C.L. (2011), - Detecting evolving patterns of self-organizing networks by flow - hierarchy measurement, Complexity, Volume 16 Issue 6 53-61. - DOI: 10.1002/cplx.20368 - http://web.mit.edu/~cmagee/www/documents/28-DetectingEvolvingPatterns_FlowHierarchy.pdf - """ - if not G.is_directed(): - raise nx.NetworkXError("G must be a digraph in flow_heirarchy") - scc = nx.strongly_connected_components(G) - return 1.-sum(G.subgraph(c).size(weight) for c in scc)/float(G.size(weight)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isolate.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isolate.py deleted file mode 100644 index a14178b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isolate.py +++ /dev/null @@ -1,77 +0,0 @@ -# encoding: utf-8 -""" -Functions for identifying isolate (degree zero) nodes. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Drew Conway <drew.conway@nyu.edu>', - 'Aric Hagberg <hagberg@lanl.gov>']) -__all__=['is_isolate','isolates'] - -def is_isolate(G,n): - """Determine of node n is an isolate (degree zero). - - Parameters - ---------- - G : graph - A networkx graph - n : node - A node in G - - Returns - ------- - isolate : bool - True if n has no neighbors, False otherwise. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_edge(1,2) - >>> G.add_node(3) - >>> nx.is_isolate(G,2) - False - >>> nx.is_isolate(G,3) - True - """ - return G.degree(n)==0 - -def isolates(G): - """Return list of isolates in the graph. - - Isolates are nodes with no neighbors (degree zero). - - Parameters - ---------- - G : graph - A networkx graph - - Returns - ------- - isolates : list - List of isolate nodes. - - Examples - -------- - >>> G = nx.Graph() - >>> G.add_edge(1,2) - >>> G.add_node(3) - >>> nx.isolates(G) - [3] - - To remove all isolates in the graph use - >>> G.remove_nodes_from(nx.isolates(G)) - >>> G.nodes() - [1, 2] - - For digraphs isolates have zero in-degree and zero out_degre - >>> G = nx.DiGraph([(0,1),(1,2)]) - >>> G.add_node(3) - >>> nx.isolates(G) - [3] - """ - return [n for (n,d) in G.degree_iter() if d==0] diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/__init__.py deleted file mode 100644 index 7821bc2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from networkx.algorithms.isomorphism.isomorph import * -from networkx.algorithms.isomorphism.vf2userfunc import * -from networkx.algorithms.isomorphism.matchhelpers import * - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/isomorph.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/isomorph.py deleted file mode 100644 index 7de3308..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/isomorph.py +++ /dev/null @@ -1,227 +0,0 @@ -""" -Graph isomorphism functions. -""" -import networkx as nx -from networkx.exception import NetworkXError -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Christopher Ellison cellison@cse.ucdavis.edu)']) -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__all__ = ['could_be_isomorphic', - 'fast_could_be_isomorphic', - 'faster_could_be_isomorphic', - 'is_isomorphic'] - -def could_be_isomorphic(G1,G2): - """Returns False if graphs are definitely not isomorphic. - True does NOT guarantee isomorphism. - - Parameters - ---------- - G1, G2 : graphs - The two graphs G1 and G2 must be the same type. - - Notes - ----- - Checks for matching degree, triangle, and number of cliques sequences. - """ - - # Check global properties - if G1.order() != G2.order(): return False - - # Check local properties - d1=G1.degree() - t1=nx.triangles(G1) - c1=nx.number_of_cliques(G1) - props1=[ [d1[v], t1[v], c1[v]] for v in d1 ] - props1.sort() - - d2=G2.degree() - t2=nx.triangles(G2) - c2=nx.number_of_cliques(G2) - props2=[ [d2[v], t2[v], c2[v]] for v in d2 ] - props2.sort() - - if props1 != props2: - return False - - # OK... - return True - -graph_could_be_isomorphic=could_be_isomorphic - -def fast_could_be_isomorphic(G1,G2): - """Returns False if graphs are definitely not isomorphic. - - True does NOT guarantee isomorphism. - - Parameters - ---------- - G1, G2 : graphs - The two graphs G1 and G2 must be the same type. - - Notes - ----- - Checks for matching degree and triangle sequences. - """ - # Check global properties - if G1.order() != G2.order(): return False - - # Check local properties - d1=G1.degree() - t1=nx.triangles(G1) - props1=[ [d1[v], t1[v]] for v in d1 ] - props1.sort() - - d2=G2.degree() - t2=nx.triangles(G2) - props2=[ [d2[v], t2[v]] for v in d2 ] - props2.sort() - - if props1 != props2: return False - - # OK... - return True - -fast_graph_could_be_isomorphic=fast_could_be_isomorphic - -def faster_could_be_isomorphic(G1,G2): - """Returns False if graphs are definitely not isomorphic. - - True does NOT guarantee isomorphism. - - Parameters - ---------- - G1, G2 : graphs - The two graphs G1 and G2 must be the same type. - - Notes - ----- - Checks for matching degree sequences. - """ - # Check global properties - if G1.order() != G2.order(): return False - - # Check local properties - d1=list(G1.degree().values()) - d1.sort() - d2=list(G2.degree().values()) - d2.sort() - - if d1 != d2: return False - - # OK... - return True - -faster_graph_could_be_isomorphic=faster_could_be_isomorphic - -def is_isomorphic(G1, G2, node_match=None, edge_match=None): - """Returns True if the graphs G1 and G2 are isomorphic and False otherwise. - - Parameters - ---------- - G1, G2: graphs - The two graphs G1 and G2 must be the same type. - - node_match : callable - A function that returns True if node n1 in G1 and n2 in G2 should - be considered equal during the isomorphism test. - If node_match is not specified then node attributes are not considered. - - The function will be called like - - node_match(G1.node[n1], G2.node[n2]). - - That is, the function will receive the node attribute dictionaries - for n1 and n2 as inputs. - - edge_match : callable - A function that returns True if the edge attribute dictionary - for the pair of nodes (u1, v1) in G1 and (u2, v2) in G2 should - be considered equal during the isomorphism test. If edge_match is - not specified then edge attributes are not considered. - - The function will be called like - - edge_match(G1[u1][v1], G2[u2][v2]). - - That is, the function will receive the edge attribute dictionaries - of the edges under consideration. - - Notes - ----- - Uses the vf2 algorithm [1]_. - - Examples - -------- - >>> import networkx.algorithms.isomorphism as iso - - For digraphs G1 and G2, using 'weight' edge attribute (default: 1) - - >>> G1 = nx.DiGraph() - >>> G2 = nx.DiGraph() - >>> G1.add_path([1,2,3,4],weight=1) - >>> G2.add_path([10,20,30,40],weight=2) - >>> em = iso.numerical_edge_match('weight', 1) - >>> nx.is_isomorphic(G1, G2) # no weights considered - True - >>> nx.is_isomorphic(G1, G2, edge_match=em) # match weights - False - - For multidigraphs G1 and G2, using 'fill' node attribute (default: '') - - >>> G1 = nx.MultiDiGraph() - >>> G2 = nx.MultiDiGraph() - >>> G1.add_nodes_from([1,2,3],fill='red') - >>> G2.add_nodes_from([10,20,30,40],fill='red') - >>> G1.add_path([1,2,3,4],weight=3, linewidth=2.5) - >>> G2.add_path([10,20,30,40],weight=3) - >>> nm = iso.categorical_node_match('fill', 'red') - >>> nx.is_isomorphic(G1, G2, node_match=nm) - True - - For multidigraphs G1 and G2, using 'weight' edge attribute (default: 7) - - >>> G1.add_edge(1,2, weight=7) - >>> G2.add_edge(10,20) - >>> em = iso.numerical_multiedge_match('weight', 7, rtol=1e-6) - >>> nx.is_isomorphic(G1, G2, edge_match=em) - True - - For multigraphs G1 and G2, using 'weight' and 'linewidth' edge attributes - with default values 7 and 2.5. Also using 'fill' node attribute with - default value 'red'. - - >>> em = iso.numerical_multiedge_match(['weight', 'linewidth'], [7, 2.5]) - >>> nm = iso.categorical_node_match('fill', 'red') - >>> nx.is_isomorphic(G1, G2, edge_match=em, node_match=nm) - True - - See Also - -------- - numerical_node_match, numerical_edge_match, numerical_multiedge_match - categorical_node_match, categorical_edge_match, categorical_multiedge_match - - References - ---------- - .. [1] L. P. Cordella, P. Foggia, C. Sansone, M. Vento, - "An Improved Algorithm for Matching Large Graphs", - 3rd IAPR-TC15 Workshop on Graph-based Representations in - Pattern Recognition, Cuen, pp. 149-159, 2001. - http://amalfi.dis.unina.it/graph/db/papers/vf-algorithm.pdf - """ - if G1.is_directed() and G2.is_directed(): - GM = nx.algorithms.isomorphism.DiGraphMatcher - elif (not G1.is_directed()) and (not G2.is_directed()): - GM = nx.algorithms.isomorphism.GraphMatcher - else: - raise NetworkXError("Graphs G1 and G2 are not of the same type.") - - gm = GM(G1, G2, node_match=node_match, edge_match=edge_match) - - return gm.is_isomorphic() diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/isomorphvf2.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/isomorphvf2.py deleted file mode 100644 index 1efe74d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/isomorphvf2.py +++ /dev/null @@ -1,965 +0,0 @@ -# -*- coding: utf-8 -*- -""" -************* -VF2 Algorithm -************* - -An implementation of VF2 algorithm for graph ismorphism testing. - -The simplest interface to use this module is to call networkx.is_isomorphic(). - -Introduction ------------- - -The GraphMatcher and DiGraphMatcher are responsible for matching -graphs or directed graphs in a predetermined manner. This -usually means a check for an isomorphism, though other checks -are also possible. For example, a subgraph of one graph -can be checked for isomorphism to a second graph. - -Matching is done via syntactic feasibility. It is also possible -to check for semantic feasibility. Feasibility, then, is defined -as the logical AND of the two functions. - -To include a semantic check, the (Di)GraphMatcher class should be -subclassed, and the semantic_feasibility() function should be -redefined. By default, the semantic feasibility function always -returns True. The effect of this is that semantics are not -considered in the matching of G1 and G2. - -Examples --------- - -Suppose G1 and G2 are isomorphic graphs. Verification is as follows: - ->>> from networkx.algorithms import isomorphism ->>> G1 = nx.path_graph(4) ->>> G2 = nx.path_graph(4) ->>> GM = isomorphism.GraphMatcher(G1,G2) ->>> GM.is_isomorphic() -True - -GM.mapping stores the isomorphism mapping from G1 to G2. - ->>> GM.mapping -{0: 0, 1: 1, 2: 2, 3: 3} - - -Suppose G1 and G2 are isomorphic directed graphs -graphs. Verification is as follows: - ->>> G1 = nx.path_graph(4, create_using=nx.DiGraph()) ->>> G2 = nx.path_graph(4, create_using=nx.DiGraph()) ->>> DiGM = isomorphism.DiGraphMatcher(G1,G2) ->>> DiGM.is_isomorphic() -True - -DiGM.mapping stores the isomorphism mapping from G1 to G2. - ->>> DiGM.mapping -{0: 0, 1: 1, 2: 2, 3: 3} - - - -Subgraph Isomorphism --------------------- -Graph theory literature can be ambiguious about the meaning of the -above statement, and we seek to clarify it now. - -In the VF2 literature, a mapping M is said to be a graph-subgraph -isomorphism iff M is an isomorphism between G2 and a subgraph of G1. -Thus, to say that G1 and G2 are graph-subgraph isomorphic is to say -that a subgraph of G1 is isomorphic to G2. - -Other literature uses the phrase 'subgraph isomorphic' as in 'G1 does -not have a subgraph isomorphic to G2'. Another use is as an in adverb -for isomorphic. Thus, to say that G1 and G2 are subgraph isomorphic -is to say that a subgraph of G1 is isomorphic to G2. - -Finally, the term 'subgraph' can have multiple meanings. In this -context, 'subgraph' always means a 'node-induced subgraph'. Edge-induced -subgraph isomorphisms are not directly supported, but one should be -able to perform the check by making use of nx.line_graph(). For -subgraphs which are not induced, the term 'monomorphism' is preferred -over 'isomorphism'. Currently, it is not possible to check for -monomorphisms. - -Let G=(N,E) be a graph with a set of nodes N and set of edges E. - -If G'=(N',E') is a subgraph, then: - N' is a subset of N - E' is a subset of E - -If G'=(N',E') is a node-induced subgraph, then: - N' is a subset of N - E' is the subset of edges in E relating nodes in N' - -If G'=(N',E') is an edge-induced subgrpah, then: - N' is the subset of nodes in N related by edges in E' - E' is a subset of E - -References ----------- -[1] Luigi P. Cordella, Pasquale Foggia, Carlo Sansone, Mario Vento, - "A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs", - IEEE Transactions on Pattern Analysis and Machine Intelligence, - vol. 26, no. 10, pp. 1367-1372, Oct., 2004. - http://ieeexplore.ieee.org/iel5/34/29305/01323804.pdf - -[2] L. P. Cordella, P. Foggia, C. Sansone, M. Vento, "An Improved - Algorithm for Matching Large Graphs", 3rd IAPR-TC15 Workshop - on Graph-based Representations in Pattern Recognition, Cuen, - pp. 149-159, 2001. - http://amalfi.dis.unina.it/graph/db/papers/vf-algorithm.pdf - -See Also --------- -syntactic_feasibliity(), semantic_feasibility() - -Notes ------ -Modified to handle undirected graphs. -Modified to handle multiple edges. - - -In general, this problem is NP-Complete. - - - -""" - -# Copyright (C) 2007-2009 by the NetworkX maintainers -# All rights reserved. -# BSD license. - -# This work was originally coded by Christopher Ellison -# as part of the Computational Mechanics Python (CMPy) project. -# James P. Crutchfield, principal investigator. -# Complexity Sciences Center and Physics Department, UC Davis. - -import sys -import networkx as nx - -__all__ = ['GraphMatcher', - 'DiGraphMatcher'] - -class GraphMatcher(object): - """Implementation of VF2 algorithm for matching undirected graphs. - - Suitable for Graph and MultiGraph instances. - """ - def __init__(self, G1, G2): - """Initialize GraphMatcher. - - Parameters - ---------- - G1,G2: NetworkX Graph or MultiGraph instances. - The two graphs to check for isomorphism. - - Examples - -------- - To create a GraphMatcher which checks for syntactic feasibility: - - >>> from networkx.algorithms import isomorphism - >>> G1 = nx.path_graph(4) - >>> G2 = nx.path_graph(4) - >>> GM = isomorphism.GraphMatcher(G1,G2) - """ - self.G1 = G1 - self.G2 = G2 - self.G1_nodes = set(G1.nodes()) - self.G2_nodes = set(G2.nodes()) - - # Set recursion limit. - self.old_recursion_limit = sys.getrecursionlimit() - expected_max_recursion_level = len(self.G2) - if self.old_recursion_limit < 1.5 * expected_max_recursion_level: - # Give some breathing room. - sys.setrecursionlimit(int(1.5 * expected_max_recursion_level)) - - # Declare that we will be searching for a graph-graph isomorphism. - self.test = 'graph' - - # Initialize state - self.initialize() - - def reset_recursion_limit(self): - """Restores the recursion limit.""" - ### TODO: - ### Currently, we use recursion and set the recursion level higher. - ### It would be nice to restore the level, but because the - ### (Di)GraphMatcher classes make use of cyclic references, garbage - ### collection will never happen when we define __del__() to - ### restore the recursion level. The result is a memory leak. - ### So for now, we do not automatically restore the recursion level, - ### and instead provide a method to do this manually. Eventually, - ### we should turn this into a non-recursive implementation. - sys.setrecursionlimit(self.old_recursion_limit) - - def candidate_pairs_iter(self): - """Iterator over candidate pairs of nodes in G1 and G2.""" - - # All computations are done using the current state! - - G1_nodes = self.G1_nodes - G2_nodes = self.G2_nodes - - # First we compute the inout-terminal sets. - T1_inout = [node for node in G1_nodes if (node in self.inout_1) and (node not in self.core_1)] - T2_inout = [node for node in G2_nodes if (node in self.inout_2) and (node not in self.core_2)] - - # If T1_inout and T2_inout are both nonempty. - # P(s) = T1_inout x {min T2_inout} - if T1_inout and T2_inout: - for node in T1_inout: - yield node, min(T2_inout) - - else: - # If T1_inout and T2_inout were both empty.... - # P(s) = (N_1 - M_1) x {min (N_2 - M_2)} - ##if not (T1_inout or T2_inout): # as suggested by [2], incorrect - if 1: # as inferred from [1], correct - # First we determine the candidate node for G2 - other_node = min(G2_nodes - set(self.core_2)) - for node in self.G1: - if node not in self.core_1: - yield node, other_node - - # For all other cases, we don't have any candidate pairs. - - def initialize(self): - """Reinitializes the state of the algorithm. - - This method should be redefined if using something other than GMState. - If only subclassing GraphMatcher, a redefinition is not necessary. - - """ - - # core_1[n] contains the index of the node paired with n, which is m, - # provided n is in the mapping. - # core_2[m] contains the index of the node paired with m, which is n, - # provided m is in the mapping. - self.core_1 = {} - self.core_2 = {} - - # See the paper for definitions of M_x and T_x^{y} - - # inout_1[n] is non-zero if n is in M_1 or in T_1^{inout} - # inout_2[m] is non-zero if m is in M_2 or in T_2^{inout} - # - # The value stored is the depth of the SSR tree when the node became - # part of the corresponding set. - self.inout_1 = {} - self.inout_2 = {} - # Practically, these sets simply store the nodes in the subgraph. - - self.state = GMState(self) - - # Provide a convienient way to access the isomorphism mapping. - self.mapping = self.core_1.copy() - - def is_isomorphic(self): - """Returns True if G1 and G2 are isomorphic graphs.""" - - # Let's do two very quick checks! - # QUESTION: Should we call faster_graph_could_be_isomorphic(G1,G2)? - # For now, I just copy the code. - - # Check global properties - if self.G1.order() != self.G2.order(): return False - - # Check local properties - d1=sorted(self.G1.degree().values()) - d2=sorted(self.G2.degree().values()) - if d1 != d2: return False - - try: - x = next(self.isomorphisms_iter()) - return True - except StopIteration: - return False - - def isomorphisms_iter(self): - """Generator over isomorphisms between G1 and G2.""" - # Declare that we are looking for a graph-graph isomorphism. - self.test = 'graph' - self.initialize() - for mapping in self.match(): - yield mapping - - def match(self): - """Extends the isomorphism mapping. - - This function is called recursively to determine if a complete - isomorphism can be found between G1 and G2. It cleans up the class - variables after each recursive call. If an isomorphism is found, - we yield the mapping. - - """ - if len(self.core_1) == len(self.G2): - # Save the final mapping, otherwise garbage collection deletes it. - self.mapping = self.core_1.copy() - # The mapping is complete. - yield self.mapping - else: - for G1_node, G2_node in self.candidate_pairs_iter(): - if self.syntactic_feasibility(G1_node, G2_node): - if self.semantic_feasibility(G1_node, G2_node): - # Recursive call, adding the feasible state. - newstate = self.state.__class__(self, G1_node, G2_node) - for mapping in self.match(): - yield mapping - - # restore data structures - newstate.restore() - - def semantic_feasibility(self, G1_node, G2_node): - """Returns True if adding (G1_node, G2_node) is symantically feasible. - - The semantic feasibility function should return True if it is - acceptable to add the candidate pair (G1_node, G2_node) to the current - partial isomorphism mapping. The logic should focus on semantic - information contained in the edge data or a formalized node class. - - By acceptable, we mean that the subsequent mapping can still become a - complete isomorphism mapping. Thus, if adding the candidate pair - definitely makes it so that the subsequent mapping cannot become a - complete isomorphism mapping, then this function must return False. - - The default semantic feasibility function always returns True. The - effect is that semantics are not considered in the matching of G1 - and G2. - - The semantic checks might differ based on the what type of test is - being performed. A keyword description of the test is stored in - self.test. Here is a quick description of the currently implemented - tests:: - - test='graph' - Indicates that the graph matcher is looking for a graph-graph - isomorphism. - - test='subgraph' - Indicates that the graph matcher is looking for a subgraph-graph - isomorphism such that a subgraph of G1 is isomorphic to G2. - - Any subclass which redefines semantic_feasibility() must maintain - the above form to keep the match() method functional. Implementations - should consider multigraphs. - """ - return True - - def subgraph_is_isomorphic(self): - """Returns True if a subgraph of G1 is isomorphic to G2.""" - try: - x = next(self.subgraph_isomorphisms_iter()) - return True - except StopIteration: - return False - -# subgraph_is_isomorphic.__doc__ += "\n" + subgraph.replace('\n','\n'+indent) - - def subgraph_isomorphisms_iter(self): - """Generator over isomorphisms between a subgraph of G1 and G2.""" - # Declare that we are looking for graph-subgraph isomorphism. - self.test = 'subgraph' - self.initialize() - for mapping in self.match(): - yield mapping - -# subgraph_isomorphisms_iter.__doc__ += "\n" + subgraph.replace('\n','\n'+indent) - - def syntactic_feasibility(self, G1_node, G2_node): - """Returns True if adding (G1_node, G2_node) is syntactically feasible. - - This function returns True if it is adding the candidate pair - to the current partial isomorphism mapping is allowable. The addition - is allowable if the inclusion of the candidate pair does not make it - impossible for an isomorphism to be found. - """ - - # The VF2 algorithm was designed to work with graphs having, at most, - # one edge connecting any two nodes. This is not the case when - # dealing with an MultiGraphs. - # - # Basically, when we test the look-ahead rules R_neighbor, we will - # make sure that the number of edges are checked. We also add - # a R_self check to verify that the number of selfloops is acceptable. - # - # Users might be comparing Graph instances with MultiGraph instances. - # So the generic GraphMatcher class must work with MultiGraphs. - # Care must be taken since the value in the innermost dictionary is a - # singlet for Graph instances. For MultiGraphs, the value in the - # innermost dictionary is a list. - - - ### - ### Test at each step to get a return value as soon as possible. - ### - - ### Look ahead 0 - - # R_self - - # The number of selfloops for G1_node must equal the number of - # self-loops for G2_node. Without this check, we would fail on - # R_neighbor at the next recursion level. But it is good to prune the - # search tree now. - if self.G1.number_of_edges(G1_node,G1_node) != self.G2.number_of_edges(G2_node,G2_node): - return False - - - # R_neighbor - - # For each neighbor n' of n in the partial mapping, the corresponding - # node m' is a neighbor of m, and vice versa. Also, the number of - # edges must be equal. - for neighbor in self.G1[G1_node]: - if neighbor in self.core_1: - if not (self.core_1[neighbor] in self.G2[G2_node]): - return False - elif self.G1.number_of_edges(neighbor, G1_node) != self.G2.number_of_edges(self.core_1[neighbor], G2_node): - return False - for neighbor in self.G2[G2_node]: - if neighbor in self.core_2: - if not (self.core_2[neighbor] in self.G1[G1_node]): - return False - elif self.G1.number_of_edges(self.core_2[neighbor], G1_node) != self.G2.number_of_edges(neighbor, G2_node): - return False - - ### Look ahead 1 - - # R_terminout - # The number of neighbors of n that are in T_1^{inout} is equal to the - # number of neighbors of m that are in T_2^{inout}, and vice versa. - num1 = 0 - for neighbor in self.G1[G1_node]: - if (neighbor in self.inout_1) and (neighbor not in self.core_1): - num1 += 1 - num2 = 0 - for neighbor in self.G2[G2_node]: - if (neighbor in self.inout_2) and (neighbor not in self.core_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - - ### Look ahead 2 - - # R_new - - # The number of neighbors of n that are neither in the core_1 nor - # T_1^{inout} is equal to the number of neighbors of m - # that are neither in core_2 nor T_2^{inout}. - num1 = 0 - for neighbor in self.G1[G1_node]: - if neighbor not in self.inout_1: - num1 += 1 - num2 = 0 - for neighbor in self.G2[G2_node]: - if neighbor not in self.inout_2: - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - # Otherwise, this node pair is syntactically feasible! - return True - - -class DiGraphMatcher(GraphMatcher): - """Implementation of VF2 algorithm for matching directed graphs. - - Suitable for DiGraph and MultiDiGraph instances. - """ -# __doc__ += "Notes\n%s-----" % (indent,) + sources.replace('\n','\n'+indent) - - def __init__(self, G1, G2): - """Initialize DiGraphMatcher. - - G1 and G2 should be nx.Graph or nx.MultiGraph instances. - - Examples - -------- - To create a GraphMatcher which checks for syntactic feasibility: - - >>> from networkx.algorithms import isomorphism - >>> G1 = nx.DiGraph(nx.path_graph(4, create_using=nx.DiGraph())) - >>> G2 = nx.DiGraph(nx.path_graph(4, create_using=nx.DiGraph())) - >>> DiGM = isomorphism.DiGraphMatcher(G1,G2) - """ - super(DiGraphMatcher, self).__init__(G1, G2) - - def candidate_pairs_iter(self): - """Iterator over candidate pairs of nodes in G1 and G2.""" - - # All computations are done using the current state! - - G1_nodes = self.G1_nodes - G2_nodes = self.G2_nodes - - # First we compute the out-terminal sets. - T1_out = [node for node in G1_nodes if (node in self.out_1) and (node not in self.core_1)] - T2_out = [node for node in G2_nodes if (node in self.out_2) and (node not in self.core_2)] - - # If T1_out and T2_out are both nonempty. - # P(s) = T1_out x {min T2_out} - if T1_out and T2_out: - node_2 = min(T2_out) - for node_1 in T1_out: - yield node_1, node_2 - - # If T1_out and T2_out were both empty.... - # We compute the in-terminal sets. - - ##elif not (T1_out or T2_out): # as suggested by [2], incorrect - else: # as suggested by [1], correct - T1_in = [node for node in G1_nodes if (node in self.in_1) and (node not in self.core_1)] - T2_in = [node for node in G2_nodes if (node in self.in_2) and (node not in self.core_2)] - - # If T1_in and T2_in are both nonempty. - # P(s) = T1_out x {min T2_out} - if T1_in and T2_in: - node_2 = min(T2_in) - for node_1 in T1_in: - yield node_1, node_2 - - # If all terminal sets are empty... - # P(s) = (N_1 - M_1) x {min (N_2 - M_2)} - - ##elif not (T1_in or T2_in): # as suggested by [2], incorrect - else: # as inferred from [1], correct - node_2 = min(G2_nodes - set(self.core_2)) - for node_1 in G1_nodes: - if node_1 not in self.core_1: - yield node_1, node_2 - - # For all other cases, we don't have any candidate pairs. - - def initialize(self): - """Reinitializes the state of the algorithm. - - This method should be redefined if using something other than DiGMState. - If only subclassing GraphMatcher, a redefinition is not necessary. - """ - - # core_1[n] contains the index of the node paired with n, which is m, - # provided n is in the mapping. - # core_2[m] contains the index of the node paired with m, which is n, - # provided m is in the mapping. - self.core_1 = {} - self.core_2 = {} - - # See the paper for definitions of M_x and T_x^{y} - - # in_1[n] is non-zero if n is in M_1 or in T_1^{in} - # out_1[n] is non-zero if n is in M_1 or in T_1^{out} - # - # in_2[m] is non-zero if m is in M_2 or in T_2^{in} - # out_2[m] is non-zero if m is in M_2 or in T_2^{out} - # - # The value stored is the depth of the search tree when the node became - # part of the corresponding set. - self.in_1 = {} - self.in_2 = {} - self.out_1 = {} - self.out_2 = {} - - self.state = DiGMState(self) - - # Provide a convienient way to access the isomorphism mapping. - self.mapping = self.core_1.copy() - - def syntactic_feasibility(self, G1_node, G2_node): - """Returns True if adding (G1_node, G2_node) is syntactically feasible. - - This function returns True if it is adding the candidate pair - to the current partial isomorphism mapping is allowable. The addition - is allowable if the inclusion of the candidate pair does not make it - impossible for an isomorphism to be found. - """ - - # The VF2 algorithm was designed to work with graphs having, at most, - # one edge connecting any two nodes. This is not the case when - # dealing with an MultiGraphs. - # - # Basically, when we test the look-ahead rules R_pred and R_succ, we - # will make sure that the number of edges are checked. We also add - # a R_self check to verify that the number of selfloops is acceptable. - - # Users might be comparing DiGraph instances with MultiDiGraph - # instances. So the generic DiGraphMatcher class must work with - # MultiDiGraphs. Care must be taken since the value in the innermost - # dictionary is a singlet for DiGraph instances. For MultiDiGraphs, - # the value in the innermost dictionary is a list. - - - ### - ### Test at each step to get a return value as soon as possible. - ### - - - - ### Look ahead 0 - - # R_self - - # The number of selfloops for G1_node must equal the number of - # self-loops for G2_node. Without this check, we would fail on R_pred - # at the next recursion level. This should prune the tree even further. - - if self.G1.number_of_edges(G1_node,G1_node) != self.G2.number_of_edges(G2_node,G2_node): - return False - - - # R_pred - - # For each predecessor n' of n in the partial mapping, the - # corresponding node m' is a predecessor of m, and vice versa. Also, - # the number of edges must be equal - for predecessor in self.G1.pred[G1_node]: - if predecessor in self.core_1: - if not (self.core_1[predecessor] in self.G2.pred[G2_node]): - return False - elif self.G1.number_of_edges(predecessor, G1_node) != self.G2.number_of_edges(self.core_1[predecessor], G2_node): - return False - - for predecessor in self.G2.pred[G2_node]: - if predecessor in self.core_2: - if not (self.core_2[predecessor] in self.G1.pred[G1_node]): - return False - elif self.G1.number_of_edges(self.core_2[predecessor], G1_node) != self.G2.number_of_edges(predecessor, G2_node): - return False - - - # R_succ - - # For each successor n' of n in the partial mapping, the corresponding - # node m' is a successor of m, and vice versa. Also, the number of - # edges must be equal. - for successor in self.G1[G1_node]: - if successor in self.core_1: - if not (self.core_1[successor] in self.G2[G2_node]): - return False - elif self.G1.number_of_edges(G1_node, successor) != self.G2.number_of_edges(G2_node, self.core_1[successor]): - return False - - for successor in self.G2[G2_node]: - if successor in self.core_2: - if not (self.core_2[successor] in self.G1[G1_node]): - return False - elif self.G1.number_of_edges(G1_node, self.core_2[successor]) != self.G2.number_of_edges(G2_node, successor): - return False - - - ### Look ahead 1 - - # R_termin - # The number of predecessors of n that are in T_1^{in} is equal to the - # number of predecessors of m that are in T_2^{in}. - num1 = 0 - for predecessor in self.G1.pred[G1_node]: - if (predecessor in self.in_1) and (predecessor not in self.core_1): - num1 += 1 - num2 = 0 - for predecessor in self.G2.pred[G2_node]: - if (predecessor in self.in_2) and (predecessor not in self.core_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - # The number of successors of n that are in T_1^{in} is equal to the - # number of successors of m that are in T_2^{in}. - num1 = 0 - for successor in self.G1[G1_node]: - if (successor in self.in_1) and (successor not in self.core_1): - num1 += 1 - num2 = 0 - for successor in self.G2[G2_node]: - if (successor in self.in_2) and (successor not in self.core_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - # R_termout - - # The number of predecessors of n that are in T_1^{out} is equal to the - # number of predecessors of m that are in T_2^{out}. - num1 = 0 - for predecessor in self.G1.pred[G1_node]: - if (predecessor in self.out_1) and (predecessor not in self.core_1): - num1 += 1 - num2 = 0 - for predecessor in self.G2.pred[G2_node]: - if (predecessor in self.out_2) and (predecessor not in self.core_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - # The number of successors of n that are in T_1^{out} is equal to the - # number of successors of m that are in T_2^{out}. - num1 = 0 - for successor in self.G1[G1_node]: - if (successor in self.out_1) and (successor not in self.core_1): - num1 += 1 - num2 = 0 - for successor in self.G2[G2_node]: - if (successor in self.out_2) and (successor not in self.core_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - ### Look ahead 2 - - # R_new - - # The number of predecessors of n that are neither in the core_1 nor - # T_1^{in} nor T_1^{out} is equal to the number of predecessors of m - # that are neither in core_2 nor T_2^{in} nor T_2^{out}. - num1 = 0 - for predecessor in self.G1.pred[G1_node]: - if (predecessor not in self.in_1) and (predecessor not in self.out_1): - num1 += 1 - num2 = 0 - for predecessor in self.G2.pred[G2_node]: - if (predecessor not in self.in_2) and (predecessor not in self.out_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - # The number of successors of n that are neither in the core_1 nor - # T_1^{in} nor T_1^{out} is equal to the number of successors of m - # that are neither in core_2 nor T_2^{in} nor T_2^{out}. - num1 = 0 - for successor in self.G1[G1_node]: - if (successor not in self.in_1) and (successor not in self.out_1): - num1 += 1 - num2 = 0 - for successor in self.G2[G2_node]: - if (successor not in self.in_2) and (successor not in self.out_2): - num2 += 1 - if self.test == 'graph': - if not (num1 == num2): - return False - else: # self.test == 'subgraph' - if not (num1 >= num2): - return False - - # Otherwise, this node pair is syntactically feasible! - return True - - -class GMState(object): - """Internal representation of state for the GraphMatcher class. - - This class is used internally by the GraphMatcher class. It is used - only to store state specific data. There will be at most G2.order() of - these objects in memory at a time, due to the depth-first search - strategy employed by the VF2 algorithm. - """ - def __init__(self, GM, G1_node=None, G2_node=None): - """Initializes GMState object. - - Pass in the GraphMatcher to which this GMState belongs and the - new node pair that will be added to the GraphMatcher's current - isomorphism mapping. - """ - self.GM = GM - - # Initialize the last stored node pair. - self.G1_node = None - self.G2_node = None - self.depth = len(GM.core_1) - - if G1_node is None or G2_node is None: - # Then we reset the class variables - GM.core_1 = {} - GM.core_2 = {} - GM.inout_1 = {} - GM.inout_2 = {} - - # Watch out! G1_node == 0 should evaluate to True. - if G1_node is not None and G2_node is not None: - # Add the node pair to the isomorphism mapping. - GM.core_1[G1_node] = G2_node - GM.core_2[G2_node] = G1_node - - # Store the node that was added last. - self.G1_node = G1_node - self.G2_node = G2_node - - # Now we must update the other two vectors. - # We will add only if it is not in there already! - self.depth = len(GM.core_1) - - # First we add the new nodes... - if G1_node not in GM.inout_1: - GM.inout_1[G1_node] = self.depth - if G2_node not in GM.inout_2: - GM.inout_2[G2_node] = self.depth - - # Now we add every other node... - - # Updates for T_1^{inout} - new_nodes = set([]) - for node in GM.core_1: - new_nodes.update([neighbor for neighbor in GM.G1[node] if neighbor not in GM.core_1]) - for node in new_nodes: - if node not in GM.inout_1: - GM.inout_1[node] = self.depth - - # Updates for T_2^{inout} - new_nodes = set([]) - for node in GM.core_2: - new_nodes.update([neighbor for neighbor in GM.G2[node] if neighbor not in GM.core_2]) - for node in new_nodes: - if node not in GM.inout_2: - GM.inout_2[node] = self.depth - - def restore(self): - """Deletes the GMState object and restores the class variables.""" - # First we remove the node that was added from the core vectors. - # Watch out! G1_node == 0 should evaluate to True. - if self.G1_node is not None and self.G2_node is not None: - del self.GM.core_1[self.G1_node] - del self.GM.core_2[self.G2_node] - - # Now we revert the other two vectors. - # Thus, we delete all entries which have this depth level. - for vector in (self.GM.inout_1, self.GM.inout_2): - for node in list(vector.keys()): - if vector[node] == self.depth: - del vector[node] - - -class DiGMState(object): - """Internal representation of state for the DiGraphMatcher class. - - This class is used internally by the DiGraphMatcher class. It is used - only to store state specific data. There will be at most G2.order() of - these objects in memory at a time, due to the depth-first search - strategy employed by the VF2 algorithm. - - """ - def __init__(self, GM, G1_node=None, G2_node=None): - """Initializes DiGMState object. - - Pass in the DiGraphMatcher to which this DiGMState belongs and the - new node pair that will be added to the GraphMatcher's current - isomorphism mapping. - """ - self.GM = GM - - # Initialize the last stored node pair. - self.G1_node = None - self.G2_node = None - self.depth = len(GM.core_1) - - if G1_node is None or G2_node is None: - # Then we reset the class variables - GM.core_1 = {} - GM.core_2 = {} - GM.in_1 = {} - GM.in_2 = {} - GM.out_1 = {} - GM.out_2 = {} - - # Watch out! G1_node == 0 should evaluate to True. - if G1_node is not None and G2_node is not None: - # Add the node pair to the isomorphism mapping. - GM.core_1[G1_node] = G2_node - GM.core_2[G2_node] = G1_node - - # Store the node that was added last. - self.G1_node = G1_node - self.G2_node = G2_node - - # Now we must update the other four vectors. - # We will add only if it is not in there already! - self.depth = len(GM.core_1) - - # First we add the new nodes... - for vector in (GM.in_1, GM.out_1): - if G1_node not in vector: - vector[G1_node] = self.depth - for vector in (GM.in_2, GM.out_2): - if G2_node not in vector: - vector[G2_node] = self.depth - - # Now we add every other node... - - # Updates for T_1^{in} - new_nodes = set([]) - for node in GM.core_1: - new_nodes.update([predecessor for predecessor in GM.G1.predecessors(node) if predecessor not in GM.core_1]) - for node in new_nodes: - if node not in GM.in_1: - GM.in_1[node] = self.depth - - # Updates for T_2^{in} - new_nodes = set([]) - for node in GM.core_2: - new_nodes.update([predecessor for predecessor in GM.G2.predecessors(node) if predecessor not in GM.core_2]) - for node in new_nodes: - if node not in GM.in_2: - GM.in_2[node] = self.depth - - # Updates for T_1^{out} - new_nodes = set([]) - for node in GM.core_1: - new_nodes.update([successor for successor in GM.G1.successors(node) if successor not in GM.core_1]) - for node in new_nodes: - if node not in GM.out_1: - GM.out_1[node] = self.depth - - # Updates for T_2^{out} - new_nodes = set([]) - for node in GM.core_2: - new_nodes.update([successor for successor in GM.G2.successors(node) if successor not in GM.core_2]) - for node in new_nodes: - if node not in GM.out_2: - GM.out_2[node] = self.depth - - def restore(self): - """Deletes the DiGMState object and restores the class variables.""" - - # First we remove the node that was added from the core vectors. - # Watch out! G1_node == 0 should evaluate to True. - if self.G1_node is not None and self.G2_node is not None: - del self.GM.core_1[self.G1_node] - del self.GM.core_2[self.G2_node] - - # Now we revert the other four vectors. - # Thus, we delete all entries which have this depth level. - for vector in (self.GM.in_1, self.GM.in_2, self.GM.out_1, self.GM.out_2): - for node in list(vector.keys()): - if vector[node] == self.depth: - del vector[node] - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/matchhelpers.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/matchhelpers.py deleted file mode 100644 index f9af38b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/matchhelpers.py +++ /dev/null @@ -1,346 +0,0 @@ -"""Functions which help end users define customize node_match and -edge_match functions to use during isomorphism checks. -""" -from itertools import permutations -import types -import networkx as nx - -__all__ = ['categorical_node_match', - 'categorical_edge_match', - 'categorical_multiedge_match', - 'numerical_node_match', - 'numerical_edge_match', - 'numerical_multiedge_match', - 'generic_node_match', - 'generic_edge_match', - 'generic_multiedge_match', - ] - - -def copyfunc(f, name=None): - """Returns a deepcopy of a function.""" - try: - return types.FunctionType(f.func_code, f.func_globals, name or f.name, - f.func_defaults, f.func_closure) - except AttributeError: - return types.FunctionType(f.__code__, f.__globals__, name or f.name, - f.__defaults__, f.__closure__) - -def allclose(x, y, rtol=1.0000000000000001e-05, atol=1e-08): - """Returns True if x and y are sufficiently close, elementwise. - - Parameters - ---------- - rtol : float - The relative error tolerance. - atol : float - The absolute error tolerance. - - """ - # assume finite weights, see numpy.allclose() for reference - for xi, yi in zip(x,y): - if not ( abs(xi-yi) <= atol + rtol * abs(yi) ): - return False - return True - - -def close(x, y, rtol=1.0000000000000001e-05, atol=1e-08): - """Returns True if x and y are sufficiently close. - - Parameters - ---------- - rtol : float - The relative error tolerance. - atol : float - The absolute error tolerance. - - """ - # assume finite weights, see numpy.allclose() for reference - return abs(x-y) <= atol + rtol * abs(y) - - -categorical_doc = """ -Returns a comparison function for a categorical node attribute. - -The value(s) of the attr(s) must be hashable and comparable via the == -operator since they are placed into a set([]) object. If the sets from -G1 and G2 are the same, then the constructed function returns True. - -Parameters ----------- -attr : string | list - The categorical node attribute to compare, or a list of categorical - node attributes to compare. -default : value | list - The default value for the categorical node attribute, or a list of - default values for the categorical node attributes. - -Returns -------- -match : function - The customized, categorical `node_match` function. - -Examples --------- ->>> import networkx.algorithms.isomorphism as iso ->>> nm = iso.categorical_node_match('size', 1) ->>> nm = iso.categorical_node_match(['color', 'size'], ['red', 2]) - -""" - -def categorical_node_match(attr, default): - if nx.utils.is_string_like(attr): - def match(data1, data2): - return data1.get(attr, default) == data2.get(attr, default) - else: - attrs = list(zip(attr, default)) # Python 3 - def match(data1, data2): - values1 = set([data1.get(attr, d) for attr, d in attrs]) - values2 = set([data2.get(attr, d) for attr, d in attrs]) - return values1 == values2 - return match - -categorical_edge_match = copyfunc(categorical_node_match, 'categorical_edge_match') - -def categorical_multiedge_match(attr, default): - if nx.utils.is_string_like(attr): - def match(datasets1, datasets2): - values1 = set([data.get(attr, default) for data in datasets1.values()]) - values2 = set([data.get(attr, default) for data in datasets2.values()]) - return values1 == values2 - else: - attrs = list(zip(attr, default)) # Python 3 - def match(datasets1, datasets2): - values1 = set([]) - for data1 in datasets1.values(): - x = tuple( data1.get(attr, d) for attr, d in attrs ) - values1.add(x) - values2 = set([]) - for data2 in datasets2.values(): - x = tuple( data2.get(attr, d) for attr, d in attrs ) - values2.add(x) - return values1 == values2 - return match - -# Docstrings for categorical functions. -categorical_node_match.__doc__ = categorical_doc -categorical_edge_match.__doc__ = categorical_doc.replace('node', 'edge') -tmpdoc = categorical_doc.replace('node', 'edge') -tmpdoc = tmpdoc.replace('categorical_edge_match', 'categorical_multiedge_match') -categorical_multiedge_match.__doc__ = tmpdoc - - -numerical_doc = """ -Returns a comparison function for a numerical node attribute. - -The value(s) of the attr(s) must be numerical and sortable. If the -sorted list of values from G1 and G2 are the same within some -tolerance, then the constructed function returns True. - -Parameters ----------- -attr : string | list - The numerical node attribute to compare, or a list of numerical - node attributes to compare. -default : value | list - The default value for the numerical node attribute, or a list of - default values for the numerical node attributes. -rtol : float - The relative error tolerance. -atol : float - The absolute error tolerance. - -Returns -------- -match : function - The customized, numerical `node_match` function. - -Examples --------- ->>> import networkx.algorithms.isomorphism as iso ->>> nm = iso.numerical_node_match('weight', 1.0) ->>> nm = iso.numerical_node_match(['weight', 'linewidth'], [.25, .5]) - -""" - -def numerical_node_match(attr, default, rtol=1.0000000000000001e-05, atol=1e-08): - if nx.utils.is_string_like(attr): - def match(data1, data2): - return close(data1.get(attr, default), - data2.get(attr, default), - rtol=rtol, atol=atol) - else: - attrs = list(zip(attr, default)) # Python 3 - def match(data1, data2): - values1 = [data1.get(attr, d) for attr, d in attrs] - values2 = [data2.get(attr, d) for attr, d in attrs] - return allclose(values1, values2, rtol=rtol, atol=atol) - return match - -numerical_edge_match = copyfunc(numerical_node_match, 'numerical_edge_match') - -def numerical_multiedge_match(attr, default, rtol=1.0000000000000001e-05, atol=1e-08): - if nx.utils.is_string_like(attr): - def match(datasets1, datasets2): - values1 = sorted([data.get(attr, default) for data in datasets1.values()]) - values2 = sorted([data.get(attr, default) for data in datasets2.values()]) - return allclose(values1, values2, rtol=rtol, atol=atol) - else: - attrs = list(zip(attr, default)) # Python 3 - def match(datasets1, datasets2): - values1 = [] - for data1 in datasets1.values(): - x = tuple( data1.get(attr, d) for attr, d in attrs ) - values1.append(x) - values2 = [] - for data2 in datasets2.values(): - x = tuple( data2.get(attr, d) for attr, d in attrs ) - values2.append(x) - values1.sort() - values2.sort() - for xi, yi in zip(values1, values2): - if not allclose(xi, yi, rtol=rtol, atol=atol): - return False - else: - return True - return match - -# Docstrings for numerical functions. -numerical_node_match.__doc__ = numerical_doc -numerical_edge_match.__doc__ = numerical_doc.replace('node', 'edge') -tmpdoc = numerical_doc.replace('node', 'edge') -tmpdoc = tmpdoc.replace('numerical_edge_match', 'numerical_multiedge_match') -numerical_multiedge_match.__doc__ = tmpdoc - - -generic_doc = """ -Returns a comparison function for a generic attribute. - -The value(s) of the attr(s) are compared using the specified -operators. If all the attributes are equal, then the constructed -function returns True. - -Parameters ----------- -attr : string | list - The node attribute to compare, or a list of node attributes - to compare. -default : value | list - The default value for the node attribute, or a list of - default values for the node attributes. -op : callable | list - The operator to use when comparing attribute values, or a list - of operators to use when comparing values for each attribute. - -Returns -------- -match : function - The customized, generic `node_match` function. - -Examples --------- ->>> from operator import eq ->>> from networkx.algorithms.isomorphism.matchhelpers import close ->>> from networkx.algorithms.isomorphism import generic_node_match ->>> nm = generic_node_match('weight', 1.0, close) ->>> nm = generic_node_match('color', 'red', eq) ->>> nm = generic_node_match(['weight', 'color'], [1.0, 'red'], [close, eq]) - -""" - -def generic_node_match(attr, default, op): - if nx.utils.is_string_like(attr): - def match(data1, data2): - return op(data1.get(attr, default), data2.get(attr, default)) - else: - attrs = list(zip(attr, default, op)) # Python 3 - def match(data1, data2): - for attr, d, operator in attrs: - if not operator(data1.get(attr, d), data2.get(attr, d)): - return False - else: - return True - return match - -generic_edge_match = copyfunc(generic_node_match, 'generic_edge_match') - -def generic_multiedge_match(attr, default, op): - """Returns a comparison function for a generic attribute. - - The value(s) of the attr(s) are compared using the specified - operators. If all the attributes are equal, then the constructed - function returns True. Potentially, the constructed edge_match - function can be slow since it must verify that no isomorphism - exists between the multiedges before it returns False. - - Parameters - ---------- - attr : string | list - The edge attribute to compare, or a list of node attributes - to compare. - default : value | list - The default value for the edge attribute, or a list of - default values for the dgeattributes. - op : callable | list - The operator to use when comparing attribute values, or a list - of operators to use when comparing values for each attribute. - - Returns - ------- - match : function - The customized, generic `edge_match` function. - - Examples - -------- - >>> from operator import eq - >>> from networkx.algorithms.isomorphism.matchhelpers import close - >>> from networkx.algorithms.isomorphism import generic_node_match - >>> nm = generic_node_match('weight', 1.0, close) - >>> nm = generic_node_match('color', 'red', eq) - >>> nm = generic_node_match(['weight', 'color'], - ... [1.0, 'red'], - ... [close, eq]) - ... - - """ - - # This is slow, but generic. - # We must test every possible isomorphism between the edges. - if nx.utils.is_string_like(attr): - def match(datasets1, datasets2): - values1 = [data.get(attr, default) for data in datasets1.values()] - values2 = [data.get(attr, default) for data in datasets2.values()] - for vals2 in permutations(values2): - for xi, yi in zip(values1, vals2): - if not op(xi, yi): - # This is not an isomorphism, go to next permutation. - break - else: - # Then we found an isomorphism. - return True - else: - # Then there are no isomorphisms between the multiedges. - return False - else: - attrs = list(zip(attr, default)) # Python 3 - def match(datasets1, datasets2): - values1 = [] - for data1 in datasets1.values(): - x = tuple( data1.get(attr, d) for attr, d in attrs ) - values1.append(x) - values2 = [] - for data2 in datasets2.values(): - x = tuple( data2.get(attr, d) for attr, d in attrs ) - values2.append(x) - for vals2 in permutations(values2): - for xi, yi, operator in zip(values1, vals2, op): - if not operator(xi, yi): - return False - else: - return True - return match - -# Docstrings for numerical functions. -generic_node_match.__doc__ = generic_doc -generic_edge_match.__doc__ = generic_doc.replace('node', 'edge') - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 Binary files differdeleted file mode 100644 index dac54f0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 Binary files differdeleted file mode 100644 index 6c6af68..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 Binary files differdeleted file mode 100644 index 60c3a3c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 Binary files differdeleted file mode 100644 index 0236872..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphism.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphism.py deleted file mode 100644 index b9c7e63..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphism.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx.algorithms import isomorphism as iso - -class TestIsomorph: - - def setUp(self): - self.G1=nx.Graph() - self.G2=nx.Graph() - self.G3=nx.Graph() - self.G4=nx.Graph() - self.G1.add_edges_from([ [1,2],[1,3],[1,5],[2,3] ]) - self.G2.add_edges_from([ [10,20],[20,30],[10,30],[10,50] ]) - self.G3.add_edges_from([ [1,2],[1,3],[1,5],[2,5] ]) - self.G4.add_edges_from([ [1,2],[1,3],[1,5],[2,4] ]) - - def test_could_be_isomorphic(self): - assert_true(iso.could_be_isomorphic(self.G1,self.G2)) - assert_true(iso.could_be_isomorphic(self.G1,self.G3)) - assert_false(iso.could_be_isomorphic(self.G1,self.G4)) - assert_true(iso.could_be_isomorphic(self.G3,self.G2)) - - def test_fast_could_be_isomorphic(self): - assert_true(iso.fast_could_be_isomorphic(self.G3,self.G2)) - - def test_faster_could_be_isomorphic(self): - assert_true(iso.faster_could_be_isomorphic(self.G3,self.G2)) - - def test_is_isomorphic(self): - assert_true(iso.is_isomorphic(self.G1,self.G2)) - assert_false(iso.is_isomorphic(self.G1,self.G4)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py deleted file mode 100644 index 562d396..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +++ /dev/null @@ -1,217 +0,0 @@ -""" - Tests for VF2 isomorphism algorithm. -""" - -import os -import struct -import random - -from nose.tools import assert_true, assert_equal -import networkx as nx -from networkx.algorithms import isomorphism as iso - -class TestWikipediaExample(object): - # Source: http://en.wikipedia.org/wiki/Graph_isomorphism - - # Nodes 'a', 'b', 'c' and 'd' form a column. - # Nodes 'g', 'h', 'i' and 'j' form a column. - g1edges = [['a','g'], ['a','h'], ['a','i'], - ['b','g'], ['b','h'], ['b','j'], - ['c','g'], ['c','i'], ['c','j'], - ['d','h'], ['d','i'], ['d','j']] - - # Nodes 1,2,3,4 form the clockwise corners of a large square. - # Nodes 5,6,7,8 form the clockwise corners of a small square - g2edges = [[1,2], [2,3], [3,4], [4,1], - [5,6], [6,7], [7,8], [8,5], - [1,5], [2,6], [3,7], [4,8]] - - def test_graph(self): - g1 = nx.Graph() - g2 = nx.Graph() - g1.add_edges_from(self.g1edges) - g2.add_edges_from(self.g2edges) - gm = iso.GraphMatcher(g1,g2) - assert_true(gm.is_isomorphic()) - - mapping = sorted(gm.mapping.items()) -# this mapping is only one of the possibilies -# so this test needs to be reconsidered -# isomap = [('a', 1), ('b', 6), ('c', 3), ('d', 8), -# ('g', 2), ('h', 5), ('i', 4), ('j', 7)] -# assert_equal(mapping, isomap) - - def test_subgraph(self): - g1 = nx.Graph() - g2 = nx.Graph() - g1.add_edges_from(self.g1edges) - g2.add_edges_from(self.g2edges) - g3 = g2.subgraph([1,2,3,4]) - gm = iso.GraphMatcher(g1,g3) - assert_true(gm.subgraph_is_isomorphic()) - -class TestVF2GraphDB(object): - # http://amalfi.dis.unina.it/graph/db/ - - @staticmethod - def create_graph(filename): - """Creates a Graph instance from the filename.""" - - # The file is assumed to be in the format from the VF2 graph database. - # Each file is composed of 16-bit numbers (unsigned short int). - # So we will want to read 2 bytes at a time. - - # We can read the number as follows: - # number = struct.unpack('<H', file.read(2)) - # This says, expect the data in little-endian encoding - # as an unsigned short int and unpack 2 bytes from the file. - - fh = open(filename, mode='rb') - - # Grab the number of nodes. - # Node numeration is 0-based, so the first node has index 0. - nodes = struct.unpack('<H', fh.read(2))[0] - - graph = nx.Graph() - for from_node in range(nodes): - # Get the number of edges. - edges = struct.unpack('<H', fh.read(2))[0] - for edge in range(edges): - # Get the terminal node. - to_node = struct.unpack('<H', fh.read(2))[0] - graph.add_edge(from_node, to_node) - - fh.close() - return graph - - def test_graph(self): - head,tail = os.path.split(__file__) - g1 = self.create_graph(os.path.join(head,'iso_r01_s80.A99')) - g2 = self.create_graph(os.path.join(head,'iso_r01_s80.B99')) - gm = iso.GraphMatcher(g1,g2) - assert_true(gm.is_isomorphic()) - - def test_subgraph(self): - # A is the subgraph - # B is the full graph - head,tail = os.path.split(__file__) - subgraph = self.create_graph(os.path.join(head,'si2_b06_m200.A99')) - graph = self.create_graph(os.path.join(head,'si2_b06_m200.B99')) - gm = iso.GraphMatcher(graph, subgraph) - assert_true(gm.subgraph_is_isomorphic()) - -def test_graph_atlas(): - #Atlas = nx.graph_atlas_g()[0:208] # 208, 6 nodes or less - Atlas = nx.graph_atlas_g()[0:100] - alphabet = list(range(26)) - for graph in Atlas: - nlist = graph.nodes() - labels = alphabet[:len(nlist)] - for s in range(10): - random.shuffle(labels) - d = dict(zip(nlist,labels)) - relabel = nx.relabel_nodes(graph, d) - gm = iso.GraphMatcher(graph, relabel) - assert_true(gm.is_isomorphic()) - -def test_multiedge(): - # Simple test for multigraphs - # Need something much more rigorous - edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), - (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), - (10, 11), (10, 11), (11, 12), (11, 12), - (12, 13), (12, 13), (13, 14), (13, 14), - (14, 15), (14, 15), (15, 16), (15, 16), - (16, 17), (16, 17), (17, 18), (17, 18), - (18, 19), (18, 19), (19, 0), (19, 0)] - nodes = list(range(20)) - - for g1 in [nx.MultiGraph(), nx.MultiDiGraph()]: - g1.add_edges_from(edges) - for _ in range(10): - new_nodes = list(nodes) - random.shuffle(new_nodes) - d = dict(zip(nodes, new_nodes)) - g2 = nx.relabel_nodes(g1, d) - if not g1.is_directed(): - gm = iso.GraphMatcher(g1,g2) - else: - gm = iso.DiGraphMatcher(g1,g2) - assert_true(gm.is_isomorphic()) - -def test_selfloop(): - # Simple test for graphs with selfloops - edges = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 2), - (2, 4), (3, 1), (3, 2), (4, 2), (4, 5), (5, 4)] - nodes = list(range(6)) - - for g1 in [nx.Graph(), nx.DiGraph()]: - g1.add_edges_from(edges) - for _ in range(100): - new_nodes = list(nodes) - random.shuffle(new_nodes) - d = dict(zip(nodes, new_nodes)) - g2 = nx.relabel_nodes(g1, d) - if not g1.is_directed(): - gm = iso.GraphMatcher(g1,g2) - else: - gm = iso.DiGraphMatcher(g1,g2) - assert_true(gm.is_isomorphic()) - -def test_isomorphism_iter1(): - # As described in: - # http://groups.google.com/group/networkx-discuss/browse_thread/thread/2ff65c67f5e3b99f/d674544ebea359bb?fwc=1 - g1 = nx.DiGraph() - g2 = nx.DiGraph() - g3 = nx.DiGraph() - g1.add_edge('A','B') - g1.add_edge('B','C') - g2.add_edge('Y','Z') - g3.add_edge('Z','Y') - gm12 = iso.DiGraphMatcher(g1,g2) - gm13 = iso.DiGraphMatcher(g1,g3) - x = list(gm12.subgraph_isomorphisms_iter()) - y = list(gm13.subgraph_isomorphisms_iter()) - assert_true({'A':'Y','B':'Z'} in x) - assert_true({'B':'Y','C':'Z'} in x) - assert_true({'A':'Z','B':'Y'} in y) - assert_true({'B':'Z','C':'Y'} in y) - assert_equal(len(x),len(y)) - assert_equal(len(x),2) - -def test_isomorphism_iter2(): - # Path - for L in range(2,10): - g1 = nx.path_graph(L) - gm = iso.GraphMatcher(g1,g1) - s = len(list(gm.isomorphisms_iter())) - assert_equal(s,2) - # Cycle - for L in range(3,10): - g1 = nx.cycle_graph(L) - gm = iso.GraphMatcher(g1,g1) - s = len(list(gm.isomorphisms_iter())) - assert_equal(s, 2*L) - -def test_multiple(): - # Verify that we can use the graph matcher multiple times - edges = [('A','B'),('B','A'),('B','C')] - for g1,g2 in [(nx.Graph(),nx.Graph()), (nx.DiGraph(),nx.DiGraph())]: - g1.add_edges_from(edges) - g2.add_edges_from(edges) - g3 = nx.subgraph(g2, ['A','B']) - if not g1.is_directed(): - gmA = iso.GraphMatcher(g1,g2) - gmB = iso.GraphMatcher(g1,g3) - else: - gmA = iso.DiGraphMatcher(g1,g2) - gmB = iso.DiGraphMatcher(g1,g3) - assert_true(gmA.is_isomorphic()) - g2.remove_node('C') - assert_true(gmA.subgraph_is_isomorphic()) - assert_true(gmB.subgraph_is_isomorphic()) -# for m in [gmB.mapping, gmB.mapping]: -# assert_true(m['A'] == 'A') -# assert_true(m['B'] == 'B') -# assert_true('C' not in m) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py deleted file mode 100644 index ca4f6bd..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +++ /dev/null @@ -1,192 +0,0 @@ -""" - Tests for VF2 isomorphism algorithm for weighted graphs. -""" - -from nose.tools import assert_true, assert_false -from operator import eq - -import networkx as nx -import networkx.algorithms.isomorphism as iso -def test_simple(): - # 16 simple tests - w = 'weight' - edges = [(0,0,1),(0,0,1.5),(0,1,2),(1,0,3)] - for g1 in [nx.Graph(), - nx.DiGraph(), - nx.MultiGraph(), - nx.MultiDiGraph(), - ]: - - g1.add_weighted_edges_from(edges) - g2 = g1.subgraph(g1.nodes()) - if g1.is_multigraph(): - em = iso.numerical_multiedge_match('weight', 1) - else: - em = iso.numerical_edge_match('weight', 1) - assert_true( nx.is_isomorphic(g1,g2,edge_match=em) ) - - for mod1, mod2 in [(False, True), (True, False), (True, True)]: - # mod1 tests a regular edge - # mod2 tests a selfloop - if g2.is_multigraph(): - if mod1: - data1 = {0:{'weight':10}} - if mod2: - data2 = {0:{'weight':1},1:{'weight':2.5}} - else: - if mod1: - data1 = {'weight':10} - if mod2: - data2 = {'weight':2.5} - - g2 = g1.subgraph(g1.nodes()) - if mod1: - if not g1.is_directed(): - g2.adj[1][0] = data1 - g2.adj[0][1] = data1 - else: - g2.succ[1][0] = data1 - g2.pred[0][1] = data1 - if mod2: - if not g1.is_directed(): - g2.adj[0][0] = data2 - else: - g2.succ[0][0] = data2 - g2.pred[0][0] = data2 - - assert_false(nx.is_isomorphic(g1,g2,edge_match=em)) - -def test_weightkey(): - g1 = nx.DiGraph() - g2 = nx.DiGraph() - - g1.add_edge('A','B', weight=1) - g2.add_edge('C','D', weight=0) - - assert_true( nx.is_isomorphic(g1, g2) ) - em = iso.numerical_edge_match('nonexistent attribute', 1) - assert_true( nx.is_isomorphic(g1, g2, edge_match=em) ) - em = iso.numerical_edge_match('weight', 1) - assert_false( nx.is_isomorphic(g1, g2, edge_match=em) ) - - g2 = nx.DiGraph() - g2.add_edge('C','D') - assert_true( nx.is_isomorphic(g1, g2, edge_match=em) ) - -class TestNodeMatch_Graph(object): - def setUp(self): - self.g1 = nx.Graph() - self.g2 = nx.Graph() - self.build() - - def build(self): - - self.nm = iso.categorical_node_match('color', '') - self.em = iso.numerical_edge_match('weight', 1) - - self.g1.add_node('A', color='red') - self.g2.add_node('C', color='blue') - - self.g1.add_edge('A','B', weight=1) - self.g2.add_edge('C','D', weight=1) - - def test_noweight_nocolor(self): - assert_true( nx.is_isomorphic(self.g1, self.g2) ) - - def test_color1(self): - assert_false( nx.is_isomorphic(self.g1, self.g2, node_match=self.nm) ) - - def test_color2(self): - self.g1.node['A']['color'] = 'blue' - assert_true( nx.is_isomorphic(self.g1, self.g2, node_match=self.nm) ) - - def test_weight1(self): - assert_true( nx.is_isomorphic(self.g1, self.g2, edge_match=self.em) ) - - def test_weight2(self): - self.g1.add_edge('A', 'B', weight=2) - assert_false( nx.is_isomorphic(self.g1, self.g2, edge_match=self.em) ) - - def test_colorsandweights1(self): - iso = nx.is_isomorphic(self.g1, self.g2, - node_match=self.nm, edge_match=self.em) - assert_false(iso) - - def test_colorsandweights2(self): - self.g1.node['A']['color'] = 'blue' - iso = nx.is_isomorphic(self.g1, self.g2, - node_match=self.nm, edge_match=self.em) - assert_true(iso) - - def test_colorsandweights3(self): - # make the weights disagree - self.g1.add_edge('A', 'B', weight=2) - assert_false( nx.is_isomorphic(self.g1, self.g2, - node_match=self.nm, edge_match=self.em) ) - -class TestEdgeMatch_MultiGraph(object): - def setUp(self): - self.g1 = nx.MultiGraph() - self.g2 = nx.MultiGraph() - self.GM = iso.MultiGraphMatcher - self.build() - - def build(self): - g1 = self.g1 - g2 = self.g2 - - # We will assume integer weights only. - g1.add_edge('A', 'B', color='green', weight=0, size=.5) - g1.add_edge('A', 'B', color='red', weight=1, size=.35) - g1.add_edge('A', 'B', color='red', weight=2, size=.65) - - g2.add_edge('C', 'D', color='green', weight=1, size=.5) - g2.add_edge('C', 'D', color='red', weight=0, size=.45) - g2.add_edge('C', 'D', color='red', weight=2, size=.65) - - if g1.is_multigraph(): - self.em = iso.numerical_multiedge_match('weight', 1) - self.emc = iso.categorical_multiedge_match('color', '') - self.emcm = iso.categorical_multiedge_match(['color', 'weight'], ['', 1]) - self.emg1 = iso.generic_multiedge_match('color', 'red', eq) - self.emg2 = iso.generic_multiedge_match(['color', 'weight', 'size'], ['red', 1, .5], [eq, eq, iso.matchhelpers.close]) - else: - self.em = iso.numerical_edge_match('weight', 1) - self.emc = iso.categorical_edge_match('color', '') - self.emcm = iso.categorical_edge_match(['color', 'weight'], ['', 1]) - self.emg1 = iso.generic_multiedge_match('color', 'red', eq) - self.emg2 = iso.generic_edge_match(['color', 'weight', 'size'], ['red', 1, .5], [eq, eq, iso.matchhelpers.close]) - - def test_weights_only(self): - assert_true( nx.is_isomorphic(self.g1, self.g2, edge_match=self.em) ) - - def test_colors_only(self): - gm = self.GM(self.g1, self.g2, edge_match=self.emc) - assert_true( gm.is_isomorphic() ) - - def test_colorsandweights(self): - gm = self.GM(self.g1, self.g2, edge_match=self.emcm) - assert_false( gm.is_isomorphic() ) - - def test_generic1(self): - gm = self.GM(self.g1, self.g2, edge_match=self.emg1) - assert_true( gm.is_isomorphic() ) - - def test_generic2(self): - gm = self.GM(self.g1, self.g2, edge_match=self.emg2) - assert_false( gm.is_isomorphic() ) - - -class TestEdgeMatch_DiGraph(TestNodeMatch_Graph): - def setUp(self): - self.g1 = nx.DiGraph() - self.g2 = nx.DiGraph() - self.build() - -class TestEdgeMatch_MultiDiGraph(TestEdgeMatch_MultiGraph): - def setUp(self): - self.g1 = nx.MultiDiGraph() - self.g2 = nx.MultiDiGraph() - self.GM = iso.MultiDiGraphMatcher - self.build() - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/vf2userfunc.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/vf2userfunc.py deleted file mode 100644 index 64685c7..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/vf2userfunc.py +++ /dev/null @@ -1,198 +0,0 @@ -""" - Module to simplify the specification of user-defined equality functions for - node and edge attributes during isomorphism checks. - - During the construction of an isomorphism, the algorithm considers two - candidate nodes n1 in G1 and n2 in G2. The graphs G1 and G2 are then - compared with respect to properties involving n1 and n2, and if the outcome - is good, then the candidate nodes are considered isomorphic. NetworkX - provides a simple mechanism for users to extend the comparisons to include - node and edge attributes. - - Node attributes are handled by the node_match keyword. When considering - n1 and n2, the algorithm passes their node attribute dictionaries to - node_match, and if it returns False, then n1 and n2 cannot be - considered to be isomorphic. - - Edge attributes are handled by the edge_match keyword. When considering - n1 and n2, the algorithm must verify that outgoing edges from n1 are - commensurate with the outgoing edges for n2. If the graph is directed, - then a similar check is also performed for incoming edges. - - Focusing only on outgoing edges, we consider pairs of nodes (n1, v1) from - G1 and (n2, v2) from G2. For graphs and digraphs, there is only one edge - between (n1, v1) and only one edge between (n2, v2). Those edge attribute - dictionaries are passed to edge_match, and if it returns False, then - n1 and n2 cannot be considered isomorphic. For multigraphs and - multidigraphs, there can be multiple edges between (n1, v1) and also - multiple edges between (n2, v2). Now, there must exist an isomorphism - from "all the edges between (n1, v1)" to "all the edges between (n2, v2)". - So, all of the edge attribute dictionaries are passed to edge_match, and - it must determine if there is an isomorphism between the two sets of edges. -""" - -import networkx as nx - -from . import isomorphvf2 as vf2 - -__all__ = ['GraphMatcher', - 'DiGraphMatcher', - 'MultiGraphMatcher', - 'MultiDiGraphMatcher', - ] - - -def _semantic_feasibility(self, G1_node, G2_node): - """Returns True if mapping G1_node to G2_node is semantically feasible. - """ - # Make sure the nodes match - if self.node_match is not None: - nm = self.node_match(self.G1.node[G1_node], self.G2.node[G2_node]) - if not nm: - return False - - # Make sure the edges match - if self.edge_match is not None: - - # Cached lookups - G1_adj = self.G1_adj - G2_adj = self.G2_adj - core_1 = self.core_1 - edge_match = self.edge_match - - for neighbor in G1_adj[G1_node]: - # G1_node is not in core_1, so we must handle R_self separately - if neighbor == G1_node: - if not edge_match(G1_adj[G1_node][G1_node], - G2_adj[G2_node][G2_node]): - return False - elif neighbor in core_1: - if not edge_match(G1_adj[G1_node][neighbor], - G2_adj[G2_node][core_1[neighbor]]): - return False - # syntactic check has already verified that neighbors are symmetric - - return True - - -class GraphMatcher(vf2.GraphMatcher): - """VF2 isomorphism checker for undirected graphs. - """ - def __init__(self, G1, G2, node_match=None, edge_match=None): - """Initialize graph matcher. - - Parameters - ---------- - G1, G2: graph - The graphs to be tested. - - node_match: callable - A function that returns True iff node n1 in G1 and n2 in G2 - should be considered equal during the isomorphism test. The - function will be called like:: - - node_match(G1.node[n1], G2.node[n2]) - - That is, the function will receive the node attribute dictionaries - of the nodes under consideration. If None, then no attributes are - considered when testing for an isomorphism. - - edge_match: callable - A function that returns True iff the edge attribute dictionary for - the pair of nodes (u1, v1) in G1 and (u2, v2) in G2 should be - considered equal during the isomorphism test. The function will be - called like:: - - edge_match(G1[u1][v1], G2[u2][v2]) - - That is, the function will receive the edge attribute dictionaries - of the edges under consideration. If None, then no attributes are - considered when testing for an isomorphism. - - """ - vf2.GraphMatcher.__init__(self, G1, G2) - - self.node_match = node_match - self.edge_match = edge_match - - # These will be modified during checks to minimize code repeat. - self.G1_adj = self.G1.adj - self.G2_adj = self.G2.adj - - semantic_feasibility = _semantic_feasibility - - -class DiGraphMatcher(vf2.DiGraphMatcher): - """VF2 isomorphism checker for directed graphs. - """ - def __init__(self, G1, G2, node_match=None, edge_match=None): - """Initialize graph matcher. - - Parameters - ---------- - G1, G2 : graph - The graphs to be tested. - - node_match : callable - A function that returns True iff node n1 in G1 and n2 in G2 - should be considered equal during the isomorphism test. The - function will be called like:: - - node_match(G1.node[n1], G2.node[n2]) - - That is, the function will receive the node attribute dictionaries - of the nodes under consideration. If None, then no attributes are - considered when testing for an isomorphism. - - edge_match : callable - A function that returns True iff the edge attribute dictionary for - the pair of nodes (u1, v1) in G1 and (u2, v2) in G2 should be - considered equal during the isomorphism test. The function will be - called like:: - - edge_match(G1[u1][v1], G2[u2][v2]) - - That is, the function will receive the edge attribute dictionaries - of the edges under consideration. If None, then no attributes are - considered when testing for an isomorphism. - - """ - vf2.DiGraphMatcher.__init__(self, G1, G2) - - self.node_match = node_match - self.edge_match = edge_match - - # These will be modified during checks to minimize code repeat. - self.G1_adj = self.G1.adj - self.G2_adj = self.G2.adj - - - def semantic_feasibility(self, G1_node, G2_node): - """Returns True if mapping G1_node to G2_node is semantically feasible.""" - - # Test node_match and also test edge_match on successors - feasible = _semantic_feasibility(self, G1_node, G2_node) - if not feasible: - return False - - # Test edge_match on predecessors - self.G1_adj = self.G1.pred - self.G2_adj = self.G2.pred - feasible = _semantic_feasibility(self, G1_node, G2_node) - self.G1_adj = self.G1.adj - self.G2_adj = self.G2.adj - - return feasible - -## The "semantics" of edge_match are different for multi(di)graphs, but -## the implementation is the same. So, technically we do not need to -## provide "multi" versions, but we do so to match NetworkX's base classes. - -class MultiGraphMatcher(GraphMatcher): - """VF2 isomorphism checker for undirected multigraphs. """ - pass - -class MultiDiGraphMatcher(DiGraphMatcher): - """VF2 isomorphism checker for directed multigraphs. """ - pass - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/__init__.py deleted file mode 100644 index d7e67c3..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from networkx.algorithms.link_analysis.pagerank_alg import * -from networkx.algorithms.link_analysis.hits_alg import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/hits_alg.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/hits_alg.py deleted file mode 100644 index 5b707d7..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/hits_alg.py +++ /dev/null @@ -1,308 +0,0 @@ -"""Hubs and authorities analysis of graph structure. -""" -# Copyright (C) 2008-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# NetworkX:http://networkx.lanl.gov/ -import networkx as nx -from networkx.exception import NetworkXError -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -__all__ = ['hits','hits_numpy','hits_scipy','authority_matrix','hub_matrix'] - -def hits(G,max_iter=100,tol=1.0e-8,nstart=None,normalized=True): - """Return HITS hubs and authorities values for nodes. - - The HITS algorithm computes two numbers for a node. - Authorities estimates the node value based on the incoming links. - Hubs estimates the node value based on outgoing links. - - Parameters - ---------- - G : graph - A NetworkX graph - - max_iter : interger, optional - Maximum number of iterations in power method. - - tol : float, optional - Error tolerance used to check convergence in power method iteration. - - nstart : dictionary, optional - Starting value of each node for power method iteration. - - normalized : bool (default=True) - Normalize results by the sum of all of the values. - - Returns - ------- - (hubs,authorities) : two-tuple of dictionaries - Two dictionaries keyed by node containing the hub and authority - values. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> h,a=nx.hits(G) - - Notes - ----- - The eigenvector calculation is done by the power iteration method - and has no guarantee of convergence. The iteration will stop - after max_iter iterations or an error tolerance of - number_of_nodes(G)*tol has been reached. - - The HITS algorithm was designed for directed graphs but this - algorithm does not check if the input graph is directed and will - execute on undirected graphs. - - References - ---------- - .. [1] A. Langville and C. Meyer, - "A survey of eigenvector methods of web information retrieval." - http://citeseer.ist.psu.edu/713792.html - .. [2] Jon Kleinberg, - Authoritative sources in a hyperlinked environment - Journal of the ACM 46 (5): 604-32, 1999. - doi:10.1145/324133.324140. - http://www.cs.cornell.edu/home/kleinber/auth.pdf. - """ - if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph: - raise Exception("hits() not defined for graphs with multiedges.") - if len(G) == 0: - return {},{} - # choose fixed starting vector if not given - if nstart is None: - h=dict.fromkeys(G,1.0/G.number_of_nodes()) - else: - h=nstart - # normalize starting vector - s=1.0/sum(h.values()) - for k in h: - h[k]*=s - i=0 - while True: # power iteration: make up to max_iter iterations - hlast=h - h=dict.fromkeys(hlast.keys(),0) - a=dict.fromkeys(hlast.keys(),0) - # this "matrix multiply" looks odd because it is - # doing a left multiply a^T=hlast^T*G - for n in h: - for nbr in G[n]: - a[nbr]+=hlast[n]*G[n][nbr].get('weight',1) - # now multiply h=Ga - for n in h: - for nbr in G[n]: - h[n]+=a[nbr]*G[n][nbr].get('weight',1) - # normalize vector - s=1.0/max(h.values()) - for n in h: h[n]*=s - # normalize vector - s=1.0/max(a.values()) - for n in a: a[n]*=s - # check convergence, l1 norm - err=sum([abs(h[n]-hlast[n]) for n in h]) - if err < tol: - break - if i>max_iter: - raise NetworkXError(\ - "HITS: power iteration failed to converge in %d iterations."%(i+1)) - i+=1 - if normalized: - s = 1.0/sum(a.values()) - for n in a: - a[n] *= s - s = 1.0/sum(h.values()) - for n in h: - h[n] *= s - return h,a - -def authority_matrix(G,nodelist=None): - """Return the HITS authority matrix.""" - M=nx.to_numpy_matrix(G,nodelist=nodelist) - return M.T*M - -def hub_matrix(G,nodelist=None): - """Return the HITS hub matrix.""" - M=nx.to_numpy_matrix(G,nodelist=nodelist) - return M*M.T - -def hits_numpy(G,normalized=True): - """Return HITS hubs and authorities values for nodes. - - The HITS algorithm computes two numbers for a node. - Authorities estimates the node value based on the incoming links. - Hubs estimates the node value based on outgoing links. - - Parameters - ----------- - G : graph - A NetworkX graph - - normalized : bool (default=True) - Normalize results by the sum of all of the values. - - Returns - ------- - (hubs,authorities) : two-tuple of dictionaries - Two dictionaries keyed by node containing the hub and authority - values. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> h,a=nx.hits(G) - - Notes - ----- - The eigenvector calculation uses NumPy's interface to LAPACK. - - The HITS algorithm was designed for directed graphs but this - algorithm does not check if the input graph is directed and will - execute on undirected graphs. - - References - ---------- - .. [1] A. Langville and C. Meyer, - "A survey of eigenvector methods of web information retrieval." - http://citeseer.ist.psu.edu/713792.html - .. [2] Jon Kleinberg, - Authoritative sources in a hyperlinked environment - Journal of the ACM 46 (5): 604-32, 1999. - doi:10.1145/324133.324140. - http://www.cs.cornell.edu/home/kleinber/auth.pdf. - """ - try: - import numpy as np - except ImportError: - raise ImportError(\ - "hits_numpy() requires NumPy: http://scipy.org/") - if len(G) == 0: - return {},{} - H=nx.hub_matrix(G,G.nodes()) - e,ev=np.linalg.eig(H) - m=e.argsort()[-1] # index of maximum eigenvalue - h=np.array(ev[:,m]).flatten() - A=nx.authority_matrix(G,G.nodes()) - e,ev=np.linalg.eig(A) - m=e.argsort()[-1] # index of maximum eigenvalue - a=np.array(ev[:,m]).flatten() - if normalized: - h = h/h.sum() - a = a/a.sum() - else: - h = h/h.max() - a = a/a.max() - hubs=dict(zip(G.nodes(),map(float,h))) - authorities=dict(zip(G.nodes(),map(float,a))) - return hubs,authorities - -def hits_scipy(G,max_iter=100,tol=1.0e-6,normalized=True): - """Return HITS hubs and authorities values for nodes. - - The HITS algorithm computes two numbers for a node. - Authorities estimates the node value based on the incoming links. - Hubs estimates the node value based on outgoing links. - - Parameters - ----------- - G : graph - A NetworkX graph - - max_iter : interger, optional - Maximum number of iterations in power method. - - tol : float, optional - Error tolerance used to check convergence in power method iteration. - - nstart : dictionary, optional - Starting value of each node for power method iteration. - - normalized : bool (default=True) - Normalize results by the sum of all of the values. - - Returns - ------- - (hubs,authorities) : two-tuple of dictionaries - Two dictionaries keyed by node containing the hub and authority - values. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> h,a=nx.hits(G) - - Notes - ----- - This implementation uses SciPy sparse matrices. - - The eigenvector calculation is done by the power iteration method - and has no guarantee of convergence. The iteration will stop - after max_iter iterations or an error tolerance of - number_of_nodes(G)*tol has been reached. - - The HITS algorithm was designed for directed graphs but this - algorithm does not check if the input graph is directed and will - execute on undirected graphs. - - References - ---------- - .. [1] A. Langville and C. Meyer, - "A survey of eigenvector methods of web information retrieval." - http://citeseer.ist.psu.edu/713792.html - .. [2] Jon Kleinberg, - Authoritative sources in a hyperlinked environment - Journal of the ACM 46 (5): 604-632, 1999. - doi:10.1145/324133.324140. - http://www.cs.cornell.edu/home/kleinber/auth.pdf. - """ - try: - import scipy.sparse - import numpy as np - except ImportError: - raise ImportError(\ - "hits_scipy() requires SciPy: http://scipy.org/") - if len(G) == 0: - return {},{} - M=nx.to_scipy_sparse_matrix(G,nodelist=G.nodes()) - (n,m)=M.shape # should be square - A=M.T*M # authority matrix - x=scipy.ones((n,1))/n # initial guess - # power iteration on authority matrix - i=0 - while True: - xlast=x - x=A*x - x=x/x.max() - # check convergence, l1 norm - err=scipy.absolute(x-xlast).sum() - if err < tol: - break - if i>max_iter: - raise NetworkXError(\ - "HITS: power iteration failed to converge in %d iterations."%(i+1)) - i+=1 - - a=np.asarray(x).flatten() - # h=M*a - h=np.asarray(M*a).flatten() - if normalized: - h = h/h.sum() - a = a/a.sum() - hubs=dict(zip(G.nodes(),map(float,h))) - authorities=dict(zip(G.nodes(),map(float,a))) - return hubs,authorities - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/pagerank_alg.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/pagerank_alg.py deleted file mode 100644 index 244350a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/pagerank_alg.py +++ /dev/null @@ -1,399 +0,0 @@ -"""PageRank analysis of graph structure. """ -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# NetworkX:http://networkx.lanl.gov/ -import networkx as nx -from networkx.exception import NetworkXError -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -__all__ = ['pagerank','pagerank_numpy','pagerank_scipy','google_matrix'] - -def pagerank(G,alpha=0.85,personalization=None, - max_iter=100,tol=1.0e-8,nstart=None,weight='weight'): - """Return the PageRank of the nodes in the graph. - - PageRank computes a ranking of the nodes in the graph G based on - the structure of the incoming links. It was originally designed as - an algorithm to rank web pages. - - Parameters - ----------- - G : graph - A NetworkX graph - - alpha : float, optional - Damping parameter for PageRank, default=0.85 - - personalization: dict, optional - The "personalization vector" consisting of a dictionary with a - key for every graph node and nonzero personalization value for each node. - - max_iter : integer, optional - Maximum number of iterations in power method eigenvalue solver. - - tol : float, optional - Error tolerance used to check convergence in power method solver. - - nstart : dictionary, optional - Starting value of PageRank iteration for each node. - - weight : key, optional - Edge data key to use as weight. If None weights are set to 1. - - Returns - ------- - pagerank : dictionary - Dictionary of nodes with PageRank as value - - Examples - -------- - >>> G=nx.DiGraph(nx.path_graph(4)) - >>> pr=nx.pagerank(G,alpha=0.9) - - Notes - ----- - The eigenvector calculation is done by the power iteration method - and has no guarantee of convergence. The iteration will stop - after max_iter iterations or an error tolerance of - number_of_nodes(G)*tol has been reached. - - The PageRank algorithm was designed for directed graphs but this - algorithm does not check if the input graph is directed and will - execute on undirected graphs by converting each oriented edge in the - directed graph to two edges. - - See Also - -------- - pagerank_numpy, pagerank_scipy, google_matrix - - References - ---------- - .. [1] A. Langville and C. Meyer, - "A survey of eigenvector methods of web information retrieval." - http://citeseer.ist.psu.edu/713792.html - .. [2] Page, Lawrence; Brin, Sergey; Motwani, Rajeev and Winograd, Terry, - The PageRank citation ranking: Bringing order to the Web. 1999 - http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?lang=en&doc=1999-66&format=pdf - """ - if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph: - raise Exception("pagerank() not defined for graphs with multiedges.") - - if len(G) == 0: - return {} - - if not G.is_directed(): - D=G.to_directed() - else: - D=G - - # create a copy in (right) stochastic form - W=nx.stochastic_graph(D, weight=weight) - scale=1.0/W.number_of_nodes() - - # choose fixed starting vector if not given - if nstart is None: - x=dict.fromkeys(W,scale) - else: - x=nstart - # normalize starting vector to 1 - s=1.0/sum(x.values()) - for k in x: x[k]*=s - - # assign uniform personalization/teleportation vector if not given - if personalization is None: - p=dict.fromkeys(W,scale) - else: - p=personalization - # normalize starting vector to 1 - s=1.0/sum(p.values()) - for k in p: - p[k]*=s - if set(p)!=set(G): - raise NetworkXError('Personalization vector ' - 'must have a value for every node') - - - # "dangling" nodes, no links out from them - out_degree=W.out_degree() - dangle=[n for n in W if out_degree[n]==0.0] - i=0 - while True: # power iteration: make up to max_iter iterations - xlast=x - x=dict.fromkeys(xlast.keys(),0) - danglesum=alpha*scale*sum(xlast[n] for n in dangle) - for n in x: - # this matrix multiply looks odd because it is - # doing a left multiply x^T=xlast^T*W - for nbr in W[n]: - x[nbr]+=alpha*xlast[n]*W[n][nbr][weight] - x[n]+=danglesum+(1.0-alpha)*p[n] - # normalize vector - s=1.0/sum(x.values()) - for n in x: - x[n]*=s - # check convergence, l1 norm - err=sum([abs(x[n]-xlast[n]) for n in x]) - if err < tol: - break - if i>max_iter: - raise NetworkXError('pagerank: power iteration failed to converge ' - 'in %d iterations.'%(i-1)) - i+=1 - return x - - -def google_matrix(G, alpha=0.85, personalization=None, - nodelist=None, weight='weight'): - """Return the Google matrix of the graph. - - Parameters - ----------- - G : graph - A NetworkX graph - - alpha : float - The damping factor - - personalization: dict, optional - The "personalization vector" consisting of a dictionary with a - key for every graph node and nonzero personalization value for each node. - - nodelist : list, optional - The rows and columns are ordered according to the nodes in nodelist. - If nodelist is None, then the ordering is produced by G.nodes(). - - weight : key, optional - Edge data key to use as weight. If None weights are set to 1. - - Returns - ------- - A : NumPy matrix - Google matrix of the graph - - See Also - -------- - pagerank, pagerank_numpy, pagerank_scipy - """ - try: - import numpy as np - except ImportError: - raise ImportError(\ - "google_matrix() requires NumPy: http://scipy.org/") - # choose ordering in matrix - if personalization is None: # use G.nodes() ordering - nodelist=G.nodes() - else: # use personalization "vector" ordering - nodelist=personalization.keys() - if set(nodelist)!=set(G): - raise NetworkXError('Personalization vector dictionary' - 'must have a value for every node') - M=nx.to_numpy_matrix(G,nodelist=nodelist,weight=weight) - (n,m)=M.shape # should be square - if n == 0: - return M - # add constant to dangling nodes' row - dangling=np.where(M.sum(axis=1)==0) - for d in dangling[0]: - M[d]=1.0/n - # normalize - M=M/M.sum(axis=1) - # add "teleportation"/personalization - e=np.ones((n)) - if personalization is not None: - v=np.array(list(personalization.values()),dtype=float) - else: - v=e - v=v/v.sum() - P=alpha*M+(1-alpha)*np.outer(e,v) - return P - - -def pagerank_numpy(G, alpha=0.85, personalization=None, weight='weight'): - """Return the PageRank of the nodes in the graph. - - PageRank computes a ranking of the nodes in the graph G based on - the structure of the incoming links. It was originally designed as - an algorithm to rank web pages. - - Parameters - ----------- - G : graph - A NetworkX graph - - alpha : float, optional - Damping parameter for PageRank, default=0.85 - - personalization: dict, optional - The "personalization vector" consisting of a dictionary with a - key for every graph node and nonzero personalization value for each node. - - weight : key, optional - Edge data key to use as weight. If None weights are set to 1. - - Returns - ------- - pagerank : dictionary - Dictionary of nodes with PageRank as value - - Examples - -------- - >>> G=nx.DiGraph(nx.path_graph(4)) - >>> pr=nx.pagerank_numpy(G,alpha=0.9) - - Notes - ----- - The eigenvector calculation uses NumPy's interface to the LAPACK - eigenvalue solvers. This will be the fastest and most accurate - for small graphs. - - This implementation works with Multi(Di)Graphs. - - See Also - -------- - pagerank, pagerank_scipy, google_matrix - - References - ---------- - .. [1] A. Langville and C. Meyer, - "A survey of eigenvector methods of web information retrieval." - http://citeseer.ist.psu.edu/713792.html - .. [2] Page, Lawrence; Brin, Sergey; Motwani, Rajeev and Winograd, Terry, - The PageRank citation ranking: Bringing order to the Web. 1999 - http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?lang=en&doc=1999-66&format=pdf - """ - try: - import numpy as np - except ImportError: - raise ImportError("pagerank_numpy() requires NumPy: http://scipy.org/") - if len(G) == 0: - return {} - # choose ordering in matrix - if personalization is None: # use G.nodes() ordering - nodelist=G.nodes() - else: # use personalization "vector" ordering - nodelist=personalization.keys() - M=google_matrix(G, alpha, personalization=personalization, - nodelist=nodelist, weight=weight) - # use numpy LAPACK solver - eigenvalues,eigenvectors=np.linalg.eig(M.T) - ind=eigenvalues.argsort() - # eigenvector of largest eigenvalue at ind[-1], normalized - largest=np.array(eigenvectors[:,ind[-1]]).flatten().real - norm=float(largest.sum()) - centrality=dict(zip(nodelist,map(float,largest/norm))) - return centrality - - -def pagerank_scipy(G, alpha=0.85, personalization=None, - max_iter=100, tol=1.0e-6, weight='weight'): - """Return the PageRank of the nodes in the graph. - - PageRank computes a ranking of the nodes in the graph G based on - the structure of the incoming links. It was originally designed as - an algorithm to rank web pages. - - Parameters - ----------- - G : graph - A NetworkX graph - - alpha : float, optional - Damping parameter for PageRank, default=0.85 - - personalization: dict, optional - The "personalization vector" consisting of a dictionary with a - key for every graph node and nonzero personalization value for each node. - - max_iter : integer, optional - Maximum number of iterations in power method eigenvalue solver. - - tol : float, optional - Error tolerance used to check convergence in power method solver. - - weight : key, optional - Edge data key to use as weight. If None weights are set to 1. - - Returns - ------- - pagerank : dictionary - Dictionary of nodes with PageRank as value - - Examples - -------- - >>> G=nx.DiGraph(nx.path_graph(4)) - >>> pr=nx.pagerank_scipy(G,alpha=0.9) - - Notes - ----- - The eigenvector calculation uses power iteration with a SciPy - sparse matrix representation. - - See Also - -------- - pagerank, pagerank_numpy, google_matrix - - References - ---------- - .. [1] A. Langville and C. Meyer, - "A survey of eigenvector methods of web information retrieval." - http://citeseer.ist.psu.edu/713792.html - .. [2] Page, Lawrence; Brin, Sergey; Motwani, Rajeev and Winograd, Terry, - The PageRank citation ranking: Bringing order to the Web. 1999 - http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?lang=en&doc=1999-66&format=pdf - """ - try: - import scipy.sparse - except ImportError: - raise ImportError("pagerank_scipy() requires SciPy: http://scipy.org/") - if len(G) == 0: - return {} - # choose ordering in matrix - if personalization is None: # use G.nodes() ordering - nodelist=G.nodes() - else: # use personalization "vector" ordering - nodelist=personalization.keys() - M=nx.to_scipy_sparse_matrix(G,nodelist=nodelist,weight=weight,dtype='f') - (n,m)=M.shape # should be square - S=scipy.array(M.sum(axis=1)).flatten() -# for i, j, v in zip( *scipy.sparse.find(M) ): -# M[i,j] = v / S[i] - S[S>0] = 1.0 / S[S>0] - Q = scipy.sparse.spdiags(S.T, 0, *M.shape, format='csr') - M = Q * M - x=scipy.ones((n))/n # initial guess - dangle=scipy.array(scipy.where(M.sum(axis=1)==0,1.0/n,0)).flatten() - # add "teleportation"/personalization - if personalization is not None: - v=scipy.array(list(personalization.values()),dtype=float) - v=v/v.sum() - else: - v=x - i=0 - while i <= max_iter: - # power iteration: make up to max_iter iterations - xlast=x - x=alpha*(x*M+scipy.dot(dangle,xlast))+(1-alpha)*v - x=x/x.sum() - # check convergence, l1 norm - err=scipy.absolute(x-xlast).sum() - if err < n*tol: - return dict(zip(nodelist,map(float,x))) - i+=1 - raise NetworkXError('pagerank_scipy: power iteration failed to converge' - 'in %d iterations.'%(i+1)) - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/tests/test_hits.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/tests/test_hits.py deleted file mode 100644 index 7092d1d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/tests/test_hits.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -from nose.plugins.attrib import attr -import networkx - -# Example from -# A. Langville and C. Meyer, "A survey of eigenvector methods of web -# information retrieval." http://citeseer.ist.psu.edu/713792.html - - -class TestHITS: - - def setUp(self): - - G=networkx.DiGraph() - - edges=[(1,3),(1,5),\ - (2,1),\ - (3,5),\ - (5,4),(5,3),\ - (6,5)] - - G.add_edges_from(edges,weight=1) - self.G=G - self.G.a=dict(zip(G,[0.000000, 0.000000, 0.366025, - 0.133975, 0.500000, 0.000000])) - self.G.h=dict(zip(G,[ 0.366025, 0.000000, 0.211325, - 0.000000, 0.211325, 0.211325])) - - - def test_hits(self): - G=self.G - h,a=networkx.hits(G,tol=1.e-08) - for n in G: - assert_almost_equal(h[n],G.h[n],places=4) - for n in G: - assert_almost_equal(a[n],G.a[n],places=4) - - def test_hits_nstart(self): - G = self.G - nstart = dict([(i, 1./2) for i in G]) - h, a = networkx.hits(G, nstart = nstart) - - @attr('numpy') - def test_hits_numpy(self): - try: - import numpy as np - except ImportError: - raise SkipTest('NumPy not available.') - - - G=self.G - h,a=networkx.hits_numpy(G) - for n in G: - assert_almost_equal(h[n],G.h[n],places=4) - for n in G: - assert_almost_equal(a[n],G.a[n],places=4) - - - def test_hits_scipy(self): - try: - import scipy as sp - except ImportError: - raise SkipTest('SciPy not available.') - - G=self.G - h,a=networkx.hits_scipy(G,tol=1.e-08) - for n in G: - assert_almost_equal(h[n],G.h[n],places=4) - for n in G: - assert_almost_equal(a[n],G.a[n],places=4) - - - @attr('numpy') - def test_empty(self): - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - G=networkx.Graph() - assert_equal(networkx.hits(G),({},{})) - assert_equal(networkx.hits_numpy(G),({},{})) - assert_equal(networkx.authority_matrix(G).shape,(0,0)) - assert_equal(networkx.hub_matrix(G).shape,(0,0)) - - def test_empty_scipy(self): - try: - import scipy - except ImportError: - raise SkipTest('scipy not available.') - G=networkx.Graph() - assert_equal(networkx.hits_scipy(G),({},{})) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/tests/test_pagerank.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/tests/test_pagerank.py deleted file mode 100644 index 7b409ff..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/link_analysis/tests/test_pagerank.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -from nose.plugins.attrib import attr -import random -import networkx - -# Example from -# A. Langville and C. Meyer, "A survey of eigenvector methods of web -# information retrieval." http://citeseer.ist.psu.edu/713792.html - - -class TestPageRank: - - def setUp(self): - G=networkx.DiGraph() - edges=[(1,2),(1,3),\ - (3,1),(3,2),(3,5),\ - (4,5),(4,6),\ - (5,4),(5,6),\ - (6,4)] - G.add_edges_from(edges) - self.G=G - self.G.pagerank=dict(zip(G, - [0.03721197,0.05395735,0.04150565, - 0.37508082,0.20599833, 0.28624589])) - - def test_pagerank(self): - G=self.G - p=networkx.pagerank(G,alpha=0.9,tol=1.e-08) - for n in G: - assert_almost_equal(p[n],G.pagerank[n],places=4) - - nstart = dict((n,random.random()) for n in G) - p=networkx.pagerank(G,alpha=0.9,tol=1.e-08, nstart=nstart) - for n in G: - assert_almost_equal(p[n],G.pagerank[n],places=4) - - assert_raises(networkx.NetworkXError,networkx.pagerank,G, - max_iter=0) - - - @attr('numpy') - def test_numpy_pagerank(self): - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - G=self.G - p=networkx.pagerank_numpy(G,alpha=0.9) - for n in G: - assert_almost_equal(p[n],G.pagerank[n],places=4) - personalize = dict((n,random.random()) for n in G) - p=networkx.pagerank_numpy(G,alpha=0.9, personalization=personalize) - - - - @attr('numpy') - def test_google_matrix(self): - try: - import numpy.linalg - except ImportError: - raise SkipTest('numpy not available.') - G=self.G - M=networkx.google_matrix(G,alpha=0.9) - e,ev=numpy.linalg.eig(M.T) - p=numpy.array(ev[:,0]/ev[:,0].sum())[:,0] - for (a,b) in zip(p,self.G.pagerank.values()): - assert_almost_equal(a,b) - - personalize = dict((n,random.random()) for n in G) - M=networkx.google_matrix(G,alpha=0.9, personalization=personalize) - _ = personalize.pop(1) - assert_raises(networkx.NetworkXError,networkx.google_matrix,G, - personalization=personalize) - - def test_scipy_pagerank(self): - G=self.G - try: - import scipy - except ImportError: - raise SkipTest('scipy not available.') - p=networkx.pagerank_scipy(G,alpha=0.9,tol=1.e-08) - for n in G: - assert_almost_equal(p[n],G.pagerank[n],places=4) - personalize = dict((n,random.random()) for n in G) - p=networkx.pagerank_scipy(G,alpha=0.9,tol=1.e-08, - personalization=personalize) - - assert_raises(networkx.NetworkXError,networkx.pagerank_scipy,G, - max_iter=0) - - def test_personalization(self): - G=networkx.complete_graph(4) - personalize={0:1,1:1,2:4,3:4} - answer={0:0.1,1:0.1,2:0.4,3:0.4} - p=networkx.pagerank(G,alpha=0.0,personalization=personalize) - for n in G: - assert_almost_equal(p[n],answer[n],places=4) - _ = personalize.pop(0) - assert_raises(networkx.NetworkXError,networkx.pagerank,G, - personalization=personalize) - - - @attr('numpy') - def test_empty(self): - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - G=networkx.Graph() - assert_equal(networkx.pagerank(G),{}) - assert_equal(networkx.pagerank_numpy(G),{}) - assert_equal(networkx.google_matrix(G).shape,(0,0)) - - def test_empty_scipy(self): - try: - import scipy - except ImportError: - raise SkipTest('scipy not available.') - G=networkx.Graph() - assert_equal(networkx.pagerank_scipy(G),{}) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/matching.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/matching.py deleted file mode 100644 index 70c424f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/matching.py +++ /dev/null @@ -1,825 +0,0 @@ -""" -******** -Matching -******** -""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# Copyright (C) 2011 by -# Nicholas Mancuso <nick.mancuso@gmail.com> -# All rights reserved. -# BSD license. -from itertools import repeat -__author__ = """\n""".join(['Joris van Rantwijk', - 'Nicholas Mancuso (nick.mancuso@gmail.com)']) - -_all__ = ['max_weight_matching', 'maximal_matching'] - - -def maximal_matching(G): - r"""Find a maximal cardinality matching in the graph. - - A matching is a subset of edges in which no node occurs more than once. - The cardinality of a matching is the number of matched edges. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - Returns - ------- - matching : set - A maximal matching of the graph. - - Notes - ----- - The algorithm greedily selects a maximal matching M of the graph G - (i.e. no superset of M exists). It runs in `O(|E|)` time. - """ - matching = set([]) - edges = set([]) - for edge in G.edges_iter(): - # If the edge isn't covered, add it to the matching - # then remove neighborhood of u and v from consideration. - if edge not in edges: - u, v = edge - matching.add(edge) - edges |= set(G.edges(u)) - edges |= set(G.edges(v)) - - return matching - - -def max_weight_matching(G, maxcardinality=False): - """Compute a maximum-weighted matching of G. - - A matching is a subset of edges in which no node occurs more than once. - The cardinality of a matching is the number of matched edges. - The weight of a matching is the sum of the weights of its edges. - - Parameters - ---------- - G : NetworkX graph - Undirected graph - - maxcardinality: bool, optional - If maxcardinality is True, compute the maximum-cardinality matching - with maximum weight among all maximum-cardinality matchings. - - Returns - ------- - mate : dictionary - The matching is returned as a dictionary, mate, such that - mate[v] == w if node v is matched to node w. Unmatched nodes do not - occur as a key in mate. - - - Notes - ------ - If G has edges with 'weight' attribute the edge data are used as - weight values else the weights are assumed to be 1. - - This function takes time O(number_of_nodes ** 3). - - If all edge weights are integers, the algorithm uses only integer - computations. If floating point weights are used, the algorithm - could return a slightly suboptimal matching due to numeric - precision errors. - - This method is based on the "blossom" method for finding augmenting - paths and the "primal-dual" method for finding a matching of maximum - weight, both methods invented by Jack Edmonds [1]_. - - References - ---------- - .. [1] "Efficient Algorithms for Finding Maximum Matching in Graphs", - Zvi Galil, ACM Computing Surveys, 1986. - """ - # - # The algorithm is taken from "Efficient Algorithms for Finding Maximum - # Matching in Graphs" by Zvi Galil, ACM Computing Surveys, 1986. - # It is based on the "blossom" method for finding augmenting paths and - # the "primal-dual" method for finding a matching of maximum weight, both - # methods invented by Jack Edmonds. - # - # A C program for maximum weight matching by Ed Rothberg was used - # extensively to validate this new code. - # - # Many terms used in the code comments are explained in the paper - # by Galil. You will probably need the paper to make sense of this code. - # - - class NoNode: - """Dummy value which is different from any node.""" - pass - - class Blossom: - """Representation of a non-trivial blossom or sub-blossom.""" - - __slots__ = [ 'childs', 'edges', 'mybestedges' ] - - # b.childs is an ordered list of b's sub-blossoms, starting with - # the base and going round the blossom. - - # b.edges is the list of b's connecting edges, such that - # b.edges[i] = (v, w) where v is a vertex in b.childs[i] - # and w is a vertex in b.childs[wrap(i+1)]. - - # If b is a top-level S-blossom, - # b.mybestedges is a list of least-slack edges to neighbouring - # S-blossoms, or None if no such list has been computed yet. - # This is used for efficient computation of delta3. - - # Generate the blossom's leaf vertices. - def leaves(self): - for t in self.childs: - if isinstance(t, Blossom): - for v in t.leaves(): - yield v - else: - yield t - - # Get a list of vertices. - gnodes = G.nodes() - if not gnodes: - return { } # don't bother with empty graphs - - # Find the maximum edge weight. - maxweight = 0 - allinteger = True - for i,j,d in G.edges_iter(data=True): - wt=d.get('weight',1) - if i != j and wt > maxweight: - maxweight = wt - allinteger = allinteger and (str(type(wt)).split("'")[1] - in ('int', 'long')) - - # If v is a matched vertex, mate[v] is its partner vertex. - # If v is a single vertex, v does not occur as a key in mate. - # Initially all vertices are single; updated during augmentation. - mate = { } - - # If b is a top-level blossom, - # label.get(b) is None if b is unlabeled (free), - # 1 if b is an S-blossom, - # 2 if b is a T-blossom. - # The label of a vertex is found by looking at the label of its top-level - # containing blossom. - # If v is a vertex inside a T-blossom, label[v] is 2 iff v is reachable - # from an S-vertex outside the blossom. - # Labels are assigned during a stage and reset after each augmentation. - label = { } - - # If b is a labeled top-level blossom, - # labeledge[b] = (v, w) is the edge through which b obtained its label - # such that w is a vertex in b, or None if b's base vertex is single. - # If w is a vertex inside a T-blossom and label[w] == 2, - # labeledge[w] = (v, w) is an edge through which w is reachable from - # outside the blossom. - labeledge = { } - - # If v is a vertex, inblossom[v] is the top-level blossom to which v - # belongs. - # If v is a top-level vertex, inblossom[v] == v since v is itself - # a (trivial) top-level blossom. - # Initially all vertices are top-level trivial blossoms. - inblossom = dict(zip(gnodes, gnodes)) - - # If b is a sub-blossom, - # blossomparent[b] is its immediate parent (sub-)blossom. - # If b is a top-level blossom, blossomparent[b] is None. - blossomparent = dict(zip(gnodes, repeat(None))) - - # If b is a (sub-)blossom, - # blossombase[b] is its base VERTEX (i.e. recursive sub-blossom). - blossombase = dict(zip(gnodes, gnodes)) - - # If w is a free vertex (or an unreached vertex inside a T-blossom), - # bestedge[w] = (v, w) is the least-slack edge from an S-vertex, - # or None if there is no such edge. - # If b is a (possibly trivial) top-level S-blossom, - # bestedge[b] = (v, w) is the least-slack edge to a different S-blossom - # (v inside b), or None if there is no such edge. - # This is used for efficient computation of delta2 and delta3. - bestedge = { } - - # If v is a vertex, - # dualvar[v] = 2 * u(v) where u(v) is the v's variable in the dual - # optimization problem (if all edge weights are integers, multiplication - # by two ensures that all values remain integers throughout the algorithm). - # Initially, u(v) = maxweight / 2. - dualvar = dict(zip(gnodes, repeat(maxweight))) - - # If b is a non-trivial blossom, - # blossomdual[b] = z(b) where z(b) is b's variable in the dual - # optimization problem. - blossomdual = { } - - # If (v, w) in allowedge or (w, v) in allowedg, then the edge - # (v, w) is known to have zero slack in the optimization problem; - # otherwise the edge may or may not have zero slack. - allowedge = { } - - # Queue of newly discovered S-vertices. - queue = [ ] - - # Return 2 * slack of edge (v, w) (does not work inside blossoms). - def slack(v, w): - return dualvar[v] + dualvar[w] - 2 * G[v][w].get('weight',1) - - # Assign label t to the top-level blossom containing vertex w, - # coming through an edge from vertex v. - def assignLabel(w, t, v): - b = inblossom[w] - assert label.get(w) is None and label.get(b) is None - label[w] = label[b] = t - if v is not None: - labeledge[w] = labeledge[b] = (v, w) - else: - labeledge[w] = labeledge[b] = None - bestedge[w] = bestedge[b] = None - if t == 1: - # b became an S-vertex/blossom; add it(s vertices) to the queue. - if isinstance(b, Blossom): - queue.extend(b.leaves()) - else: - queue.append(b) - elif t == 2: - # b became a T-vertex/blossom; assign label S to its mate. - # (If b is a non-trivial blossom, its base is the only vertex - # with an external mate.) - base = blossombase[b] - assignLabel(mate[base], 1, base) - - # Trace back from vertices v and w to discover either a new blossom - # or an augmenting path. Return the base vertex of the new blossom, - # or NoNode if an augmenting path was found. - def scanBlossom(v, w): - # Trace back from v and w, placing breadcrumbs as we go. - path = [ ] - base = NoNode - while v is not NoNode: - # Look for a breadcrumb in v's blossom or put a new breadcrumb. - b = inblossom[v] - if label[b] & 4: - base = blossombase[b] - break - assert label[b] == 1 - path.append(b) - label[b] = 5 - # Trace one step back. - if labeledge[b] is None: - # The base of blossom b is single; stop tracing this path. - assert blossombase[b] not in mate - v = NoNode - else: - assert labeledge[b][0] == mate[blossombase[b]] - v = labeledge[b][0] - b = inblossom[v] - assert label[b] == 2 - # b is a T-blossom; trace one more step back. - v = labeledge[b][0] - # Swap v and w so that we alternate between both paths. - if w is not NoNode: - v, w = w, v - # Remove breadcrumbs. - for b in path: - label[b] = 1 - # Return base vertex, if we found one. - return base - - # Construct a new blossom with given base, through S-vertices v and w. - # Label the new blossom as S; set its dual variable to zero; - # relabel its T-vertices to S and add them to the queue. - def addBlossom(base, v, w): - bb = inblossom[base] - bv = inblossom[v] - bw = inblossom[w] - # Create blossom. - b = Blossom() - blossombase[b] = base - blossomparent[b] = None - blossomparent[bb] = b - # Make list of sub-blossoms and their interconnecting edge endpoints. - b.childs = path = [ ] - b.edges = edgs = [ (v, w) ] - # Trace back from v to base. - while bv != bb: - # Add bv to the new blossom. - blossomparent[bv] = b - path.append(bv) - edgs.append(labeledge[bv]) - assert label[bv] == 2 or (label[bv] == 1 and labeledge[bv][0] == mate[blossombase[bv]]) - # Trace one step back. - v = labeledge[bv][0] - bv = inblossom[v] - # Add base sub-blossom; reverse lists. - path.append(bb) - path.reverse() - edgs.reverse() - # Trace back from w to base. - while bw != bb: - # Add bw to the new blossom. - blossomparent[bw] = b - path.append(bw) - edgs.append((labeledge[bw][1], labeledge[bw][0])) - assert label[bw] == 2 or (label[bw] == 1 and labeledge[bw][0] == mate[blossombase[bw]]) - # Trace one step back. - w = labeledge[bw][0] - bw = inblossom[w] - # Set label to S. - assert label[bb] == 1 - label[b] = 1 - labeledge[b] = labeledge[bb] - # Set dual variable to zero. - blossomdual[b] = 0 - # Relabel vertices. - for v in b.leaves(): - if label[inblossom[v]] == 2: - # This T-vertex now turns into an S-vertex because it becomes - # part of an S-blossom; add it to the queue. - queue.append(v) - inblossom[v] = b - # Compute b.mybestedges. - bestedgeto = { } - for bv in path: - if isinstance(bv, Blossom): - if bv.mybestedges is not None: - # Walk this subblossom's least-slack edges. - nblist = bv.mybestedges - # The sub-blossom won't need this data again. - bv.mybestedges = None - else: - # This subblossom does not have a list of least-slack - # edges; get the information from the vertices. - nblist = [ (v, w) - for v in bv.leaves() - for w in G.neighbors_iter(v) - if v != w ] - else: - nblist = [ (bv, w) - for w in G.neighbors_iter(bv) - if bv != w ] - for k in nblist: - (i, j) = k - if inblossom[j] == b: - i, j = j, i - bj = inblossom[j] - if (bj != b and label.get(bj) == 1 and - ((bj not in bestedgeto) or - slack(i, j) < slack(*bestedgeto[bj]))): - bestedgeto[bj] = k - # Forget about least-slack edge of the subblossom. - bestedge[bv] = None - b.mybestedges = list(bestedgeto.values()) - # Select bestedge[b]. - mybestedge = None - bestedge[b] = None - for k in b.mybestedges: - kslack = slack(*k) - if mybestedge is None or kslack < mybestslack: - mybestedge = k - mybestslack = kslack - bestedge[b] = mybestedge - - # Expand the given top-level blossom. - def expandBlossom(b, endstage): - # Convert sub-blossoms into top-level blossoms. - for s in b.childs: - blossomparent[s] = None - if isinstance(s, Blossom): - if endstage and blossomdual[s] == 0: - # Recursively expand this sub-blossom. - expandBlossom(s, endstage) - else: - for v in s.leaves(): - inblossom[v] = s - else: - inblossom[s] = s - # If we expand a T-blossom during a stage, its sub-blossoms must be - # relabeled. - if (not endstage) and label.get(b) == 2: - # Start at the sub-blossom through which the expanding - # blossom obtained its label, and relabel sub-blossoms untili - # we reach the base. - # Figure out through which sub-blossom the expanding blossom - # obtained its label initially. - entrychild = inblossom[labeledge[b][1]] - # Decide in which direction we will go round the blossom. - j = b.childs.index(entrychild) - if j & 1: - # Start index is odd; go forward and wrap. - j -= len(b.childs) - jstep = 1 - else: - # Start index is even; go backward. - jstep = -1 - # Move along the blossom until we get to the base. - v, w = labeledge[b] - while j != 0: - # Relabel the T-sub-blossom. - if jstep == 1: - p, q = b.edges[j] - else: - q, p = b.edges[j-1] - label[w] = None - label[q] = None - assignLabel(w, 2, v) - # Step to the next S-sub-blossom and note its forward edge. - allowedge[(p, q)] = allowedge[(q, p)] = True - j += jstep - if jstep == 1: - v, w = b.edges[j] - else: - w, v = b.edges[j-1] - # Step to the next T-sub-blossom. - allowedge[(v, w)] = allowedge[(w, v)] = True - j += jstep - # Relabel the base T-sub-blossom WITHOUT stepping through to - # its mate (so don't call assignLabel). - bw = b.childs[j] - label[w] = label[bw] = 2 - labeledge[w] = labeledge[bw] = (v, w) - bestedge[bw] = None - # Continue along the blossom until we get back to entrychild. - j += jstep - while b.childs[j] != entrychild: - # Examine the vertices of the sub-blossom to see whether - # it is reachable from a neighbouring S-vertex outside the - # expanding blossom. - bv = b.childs[j] - if label.get(bv) == 1: - # This sub-blossom just got label S through one of its - # neighbours; leave it be. - j += jstep - continue - if isinstance(bv, Blossom): - for v in bv.leaves(): - if label.get(v): - break - else: - v = bv - # If the sub-blossom contains a reachable vertex, assign - # label T to the sub-blossom. - if label.get(v): - assert label[v] == 2 - assert inblossom[v] == bv - label[v] = None - label[mate[blossombase[bv]]] = None - assignLabel(v, 2, labeledge[v][0]) - j += jstep - # Remove the expanded blossom entirely. - label.pop(b, None) - labeledge.pop(b, None) - bestedge.pop(b, None) - del blossomparent[b] - del blossombase[b] - del blossomdual[b] - - # Swap matched/unmatched edges over an alternating path through blossom b - # between vertex v and the base vertex. Keep blossom bookkeeping consistent. - def augmentBlossom(b, v): - # Bubble up through the blossom tree from vertex v to an immediate - # sub-blossom of b. - t = v - while blossomparent[t] != b: - t = blossomparent[t] - # Recursively deal with the first sub-blossom. - if isinstance(t, Blossom): - augmentBlossom(t, v) - # Decide in which direction we will go round the blossom. - i = j = b.childs.index(t) - if i & 1: - # Start index is odd; go forward and wrap. - j -= len(b.childs) - jstep = 1 - else: - # Start index is even; go backward. - jstep = -1 - # Move along the blossom until we get to the base. - while j != 0: - # Step to the next sub-blossom and augment it recursively. - j += jstep - t = b.childs[j] - if jstep == 1: - w, x = b.edges[j] - else: - x, w = b.edges[j-1] - if isinstance(t, Blossom): - augmentBlossom(t, w) - # Step to the next sub-blossom and augment it recursively. - j += jstep - t = b.childs[j] - if isinstance(t, Blossom): - augmentBlossom(t, x) - # Match the edge connecting those sub-blossoms. - mate[w] = x - mate[x] = w - # Rotate the list of sub-blossoms to put the new base at the front. - b.childs = b.childs[i:] + b.childs[:i] - b.edges = b.edges[i:] + b.edges[:i] - blossombase[b] = blossombase[b.childs[0]] - assert blossombase[b] == v - - # Swap matched/unmatched edges over an alternating path between two - # single vertices. The augmenting path runs through S-vertices v and w. - def augmentMatching(v, w): - for (s, j) in ((v, w), (w, v)): - # Match vertex s to vertex j. Then trace back from s - # until we find a single vertex, swapping matched and unmatched - # edges as we go. - while 1: - bs = inblossom[s] - assert label[bs] == 1 - assert (labeledge[bs] is None and blossombase[bs] not in mate) or (labeledge[bs][0] == mate[blossombase[bs]]) - # Augment through the S-blossom from s to base. - if isinstance(bs, Blossom): - augmentBlossom(bs, s) - # Update mate[s] - mate[s] = j - # Trace one step back. - if labeledge[bs] is None: - # Reached single vertex; stop. - break - t = labeledge[bs][0] - bt = inblossom[t] - assert label[bt] == 2 - # Trace one more step back. - s, j = labeledge[bt] - # Augment through the T-blossom from j to base. - assert blossombase[bt] == t - if isinstance(bt, Blossom): - augmentBlossom(bt, j) - # Update mate[j] - mate[j] = s - - # Verify that the optimum solution has been reached. - def verifyOptimum(): - if maxcardinality: - # Vertices may have negative dual; - # find a constant non-negative number to add to all vertex duals. - vdualoffset = max(0, -min(dualvar.values())) - else: - vdualoffset = 0 - # 0. all dual variables are non-negative - assert min(dualvar.values()) + vdualoffset >= 0 - assert len(blossomdual) == 0 or min(blossomdual.values()) >= 0 - # 0. all edges have non-negative slack and - # 1. all matched edges have zero slack; - for i,j,d in G.edges_iter(data=True): - wt=d.get('weight',1) - if i == j: - continue # ignore self-loops - s = dualvar[i] + dualvar[j] - 2 * wt - iblossoms = [ i ] - jblossoms = [ j ] - while blossomparent[iblossoms[-1]] is not None: - iblossoms.append(blossomparent[iblossoms[-1]]) - while blossomparent[jblossoms[-1]] is not None: - jblossoms.append(blossomparent[jblossoms[-1]]) - iblossoms.reverse() - jblossoms.reverse() - for (bi, bj) in zip(iblossoms, jblossoms): - if bi != bj: - break - s += 2 * blossomdual[bi] - assert s >= 0 - if mate.get(i) == j or mate.get(j) == i: - assert mate[i] == j and mate[j] == i - assert s == 0 - # 2. all single vertices have zero dual value; - for v in gnodes: - assert (v in mate) or dualvar[v] + vdualoffset == 0 - # 3. all blossoms with positive dual value are full. - for b in blossomdual: - if blossomdual[b] > 0: - assert len(b.edges) % 2 == 1 - for (i, j) in b.edges[1::2]: - assert mate[i] == j and mate[j] == i - # Ok. - - # Main loop: continue until no further improvement is possible. - while 1: - - # Each iteration of this loop is a "stage". - # A stage finds an augmenting path and uses that to improve - # the matching. - - # Remove labels from top-level blossoms/vertices. - label.clear() - labeledge.clear() - - # Forget all about least-slack edges. - bestedge.clear() - for b in blossomdual: - b.mybestedges = None - - # Loss of labeling means that we can not be sure that currently - # allowable edges remain allowable througout this stage. - allowedge.clear() - - # Make queue empty. - queue[:] = [ ] - - # Label single blossoms/vertices with S and put them in the queue. - for v in gnodes: - if (v not in mate) and label.get(inblossom[v]) is None: - assignLabel(v, 1, None) - - - # Loop until we succeed in augmenting the matching. - augmented = 0 - while 1: - - # Each iteration of this loop is a "substage". - # A substage tries to find an augmenting path; - # if found, the path is used to improve the matching and - # the stage ends. If there is no augmenting path, the - # primal-dual method is used to pump some slack out of - # the dual variables. - - # Continue labeling until all vertices which are reachable - # through an alternating path have got a label. - while queue and not augmented: - - # Take an S vertex from the queue. - v = queue.pop() - assert label[inblossom[v]] == 1 - - # Scan its neighbours: - for w in G.neighbors_iter(v): - if w == v: - continue # ignore self-loops - # w is a neighbour to v - bv = inblossom[v] - bw = inblossom[w] - if bv == bw: - # this edge is internal to a blossom; ignore it - continue - if (v, w) not in allowedge: - kslack = slack(v, w) - if kslack <= 0: - # edge k has zero slack => it is allowable - allowedge[(v, w)] = allowedge[(w, v)] = True - if (v, w) in allowedge: - if label.get(bw) is None: - # (C1) w is a free vertex; - # label w with T and label its mate with S (R12). - assignLabel(w, 2, v) - elif label.get(bw) == 1: - # (C2) w is an S-vertex (not in the same blossom); - # follow back-links to discover either an - # augmenting path or a new blossom. - base = scanBlossom(v, w) - if base is not NoNode: - # Found a new blossom; add it to the blossom - # bookkeeping and turn it into an S-blossom. - addBlossom(base, v, w) - else: - # Found an augmenting path; augment the - # matching and end this stage. - augmentMatching(v, w) - augmented = 1 - break - elif label.get(w) is None: - # w is inside a T-blossom, but w itself has not - # yet been reached from outside the blossom; - # mark it as reached (we need this to relabel - # during T-blossom expansion). - assert label[bw] == 2 - label[w] = 2 - labeledge[w] = (v, w) - elif label.get(bw) == 1: - # keep track of the least-slack non-allowable edge to - # a different S-blossom. - if bestedge.get(bv) is None or kslack < slack(*bestedge[bv]): - bestedge[bv] = (v, w) - elif label.get(w) is None: - # w is a free vertex (or an unreached vertex inside - # a T-blossom) but we can not reach it yet; - # keep track of the least-slack edge that reaches w. - if bestedge.get(w) is None or kslack < slack(*bestedge[w]): - bestedge[w] = (v, w) - - if augmented: - break - - # There is no augmenting path under these constraints; - # compute delta and reduce slack in the optimization problem. - # (Note that our vertex dual variables, edge slacks and delta's - # are pre-multiplied by two.) - deltatype = -1 - delta = deltaedge = deltablossom = None - - # Compute delta1: the minumum value of any vertex dual. - if not maxcardinality: - deltatype = 1 - delta = min(dualvar.values()) - - # Compute delta2: the minimum slack on any edge between - # an S-vertex and a free vertex. - for v in G.nodes_iter(): - if label.get(inblossom[v]) is None and bestedge.get(v) is not None: - d = slack(*bestedge[v]) - if deltatype == -1 or d < delta: - delta = d - deltatype = 2 - deltaedge = bestedge[v] - - # Compute delta3: half the minimum slack on any edge between - # a pair of S-blossoms. - for b in blossomparent: - if ( blossomparent[b] is None and label.get(b) == 1 and - bestedge.get(b) is not None ): - kslack = slack(*bestedge[b]) - if allinteger: - assert (kslack % 2) == 0 - d = kslack // 2 - else: - d = kslack / 2.0 - if deltatype == -1 or d < delta: - delta = d - deltatype = 3 - deltaedge = bestedge[b] - - # Compute delta4: minimum z variable of any T-blossom. - for b in blossomdual: - if ( blossomparent[b] is None and label.get(b) == 2 and - (deltatype == -1 or blossomdual[b] < delta) ): - delta = blossomdual[b] - deltatype = 4 - deltablossom = b - - if deltatype == -1: - # No further improvement possible; max-cardinality optimum - # reached. Do a final delta update to make the optimum - # verifyable. - assert maxcardinality - deltatype = 1 - delta = max(0, min(dualvar.values())) - - # Update dual variables according to delta. - for v in gnodes: - if label.get(inblossom[v]) == 1: - # S-vertex: 2*u = 2*u - 2*delta - dualvar[v] -= delta - elif label.get(inblossom[v]) == 2: - # T-vertex: 2*u = 2*u + 2*delta - dualvar[v] += delta - for b in blossomdual: - if blossomparent[b] is None: - if label.get(b) == 1: - # top-level S-blossom: z = z + 2*delta - blossomdual[b] += delta - elif label.get(b) == 2: - # top-level T-blossom: z = z - 2*delta - blossomdual[b] -= delta - - # Take action at the point where minimum delta occurred. - if deltatype == 1: - # No further improvement possible; optimum reached. - break - elif deltatype == 2: - # Use the least-slack edge to continue the search. - (v, w) = deltaedge - assert label[inblossom[v]] == 1 - allowedge[(v, w)] = allowedge[(w, v)] = True - queue.append(v) - elif deltatype == 3: - # Use the least-slack edge to continue the search. - (v, w) = deltaedge - allowedge[(v, w)] = allowedge[(w, v)] = True - assert label[inblossom[v]] == 1 - queue.append(v) - elif deltatype == 4: - # Expand the least-z blossom. - expandBlossom(deltablossom, False) - - # End of a this substage. - - # Paranoia check that the matching is symmetric. - for v in mate: - assert mate[mate[v]] == v - - # Stop when no more augmenting path can be found. - if not augmented: - break - - # End of a stage; expand all S-blossoms which have zero dual. - for b in list(blossomdual.keys()): - if b not in blossomdual: - continue # already expanded - if ( blossomparent[b] is None and label.get(b) == 1 and - blossomdual[b] == 0 ): - expandBlossom(b, True) - - # Verify that we reached the optimum solution (only for integer weights). - if allinteger: - verifyOptimum() - - return mate diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/mis.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/mis.py deleted file mode 100644 index d02c2d5..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/mis.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# $Id: maximalIndependentSet.py 576 2011-03-01 05:50:34Z lleeoo $ -""" -Algorithm to find a maximal (not maximum) independent set. - -""" -# Leo Lopes <leo.lopes@monash.edu> -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__author__ = "\n".join(["Leo Lopes <leo.lopes@monash.edu>", - "Loïc Séguin-C. <loicseguin@gmail.com>"]) - -__all__ = ['maximal_independent_set'] - -import random -import networkx as nx - -def maximal_independent_set(G, nodes=None): - """Return a random maximal independent set guaranteed to contain - a given set of nodes. - - An independent set is a set of nodes such that the subgraph - of G induced by these nodes contains no edges. A maximal - independent set is an independent set such that it is not possible - to add a new node and still get an independent set. - - Parameters - ---------- - G : NetworkX graph - - nodes : list or iterable - Nodes that must be part of the independent set. This set of nodes - must be independent. - - Returns - ------- - indep_nodes : list - List of nodes that are part of a maximal independent set. - - Raises - ------ - NetworkXUnfeasible - If the nodes in the provided list are not part of the graph or - do not form an independent set, an exception is raised. - - Examples - -------- - >>> G = nx.path_graph(5) - >>> nx.maximal_independent_set(G) # doctest: +SKIP - [4, 0, 2] - >>> nx.maximal_independent_set(G, [1]) # doctest: +SKIP - [1, 3] - - Notes - ------ - This algorithm does not solve the maximum independent set problem. - - """ - if not nodes: - nodes = set([random.choice(G.nodes())]) - else: - nodes = set(nodes) - if not nodes.issubset(G): - raise nx.NetworkXUnfeasible( - "%s is not a subset of the nodes of G" % nodes) - neighbors = set.union(*[set(G.neighbors(v)) for v in nodes]) - if set.intersection(neighbors, nodes): - raise nx.NetworkXUnfeasible( - "%s is not an independent set of G" % nodes) - indep_nodes = list(nodes) - available_nodes = set(G.nodes()).difference(neighbors.union(nodes)) - while available_nodes: - node = random.choice(list(available_nodes)) - indep_nodes.append(node) - available_nodes.difference_update(G.neighbors(node) + [node]) - return indep_nodes - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/mst.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/mst.py deleted file mode 100644 index 03ca5e8..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/mst.py +++ /dev/null @@ -1,254 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Computes minimum spanning tree of a weighted graph. - -""" -# Copyright (C) 2009-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# Loïc Séguin-C. <loicseguin@gmail.com> -# All rights reserved. -# BSD license. - -__all__ = ['kruskal_mst', - 'minimum_spanning_edges', - 'minimum_spanning_tree', - 'prim_mst_edges', 'prim_mst'] - -import networkx as nx -from heapq import heappop, heappush - -def minimum_spanning_edges(G,weight='weight',data=True): - """Generate edges in a minimum spanning forest of an undirected - weighted graph. - - A minimum spanning tree is a subgraph of the graph (a tree) - with the minimum sum of edge weights. A spanning forest is a - union of the spanning trees for each connected component of the graph. - - Parameters - ---------- - G : NetworkX Graph - - weight : string - Edge data key to use for weight (default 'weight'). - - data : bool, optional - If True yield the edge data along with the edge. - - Returns - ------- - edges : iterator - A generator that produces edges in the minimum spanning tree. - The edges are three-tuples (u,v,w) where w is the weight. - - Examples - -------- - >>> G=nx.cycle_graph(4) - >>> G.add_edge(0,3,weight=2) # assign weight 2 to edge 0-3 - >>> mst=nx.minimum_spanning_edges(G,data=False) # a generator of MST edges - >>> edgelist=list(mst) # make a list of the edges - >>> print(sorted(edgelist)) - [(0, 1), (1, 2), (2, 3)] - - Notes - ----- - Uses Kruskal's algorithm. - - If the graph edges do not have a weight attribute a default weight of 1 - will be used. - - Modified code from David Eppstein, April 2006 - http://www.ics.uci.edu/~eppstein/PADS/ - """ - # Modified code from David Eppstein, April 2006 - # http://www.ics.uci.edu/~eppstein/PADS/ - # Kruskal's algorithm: sort edges by weight, and add them one at a time. - # We use Kruskal's algorithm, first because it is very simple to - # implement once UnionFind exists, and second, because the only slow - # part (the sort) is sped up by being built in to Python. - from networkx.utils import UnionFind - if G.is_directed(): - raise nx.NetworkXError( - "Mimimum spanning tree not defined for directed graphs.") - - subtrees = UnionFind() - edges = sorted(G.edges(data=True),key=lambda t: t[2].get(weight,1)) - for u,v,d in edges: - if subtrees[u] != subtrees[v]: - if data: - yield (u,v,d) - else: - yield (u,v) - subtrees.union(u,v) - - -def minimum_spanning_tree(G,weight='weight'): - """Return a minimum spanning tree or forest of an undirected - weighted graph. - - A minimum spanning tree is a subgraph of the graph (a tree) with - the minimum sum of edge weights. - - If the graph is not connected a spanning forest is constructed. A - spanning forest is a union of the spanning trees for each - connected component of the graph. - - Parameters - ---------- - G : NetworkX Graph - - weight : string - Edge data key to use for weight (default 'weight'). - - Returns - ------- - G : NetworkX Graph - A minimum spanning tree or forest. - - Examples - -------- - >>> G=nx.cycle_graph(4) - >>> G.add_edge(0,3,weight=2) # assign weight 2 to edge 0-3 - >>> T=nx.minimum_spanning_tree(G) - >>> print(sorted(T.edges(data=True))) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - - Notes - ----- - Uses Kruskal's algorithm. - - If the graph edges do not have a weight attribute a default weight of 1 - will be used. - """ - T=nx.Graph(nx.minimum_spanning_edges(G,weight=weight,data=True)) - # Add isolated nodes - if len(T)!=len(G): - T.add_nodes_from([n for n,d in G.degree().items() if d==0]) - # Add node and graph attributes as shallow copy - for n in T: - T.node[n]=G.node[n].copy() - T.graph=G.graph.copy() - return T - -kruskal_mst=minimum_spanning_tree - -def prim_mst_edges(G, weight = 'weight', data = True): - """Generate edges in a minimum spanning forest of an undirected - weighted graph. - - A minimum spanning tree is a subgraph of the graph (a tree) - with the minimum sum of edge weights. A spanning forest is a - union of the spanning trees for each connected component of the graph. - - Parameters - ---------- - G : NetworkX Graph - - weight : string - Edge data key to use for weight (default 'weight'). - - data : bool, optional - If True yield the edge data along with the edge. - - Returns - ------- - edges : iterator - A generator that produces edges in the minimum spanning tree. - The edges are three-tuples (u,v,w) where w is the weight. - - Examples - -------- - >>> G=nx.cycle_graph(4) - >>> G.add_edge(0,3,weight=2) # assign weight 2 to edge 0-3 - >>> mst=nx.prim_mst_edges(G,data=False) # a generator of MST edges - >>> edgelist=list(mst) # make a list of the edges - >>> print(sorted(edgelist)) - [(0, 1), (1, 2), (2, 3)] - - Notes - ----- - Uses Prim's algorithm. - - If the graph edges do not have a weight attribute a default weight of 1 - will be used. - """ - - if G.is_directed(): - raise nx.NetworkXError( - "Mimimum spanning tree not defined for directed graphs.") - - nodes = G.nodes() - - while nodes: - u = nodes.pop(0) - frontier = [] - visited = [u] - for u, v in G.edges(u): - heappush(frontier, (G[u][v].get(weight, 1), u, v)) - - while frontier: - W, u, v = heappop(frontier) - if v in visited: - continue - visited.append(v) - nodes.remove(v) - for v, w in G.edges(v): - if not w in visited: - heappush(frontier, (G[v][w].get(weight, 1), v, w)) - if data: - yield u, v, G[u][v] - else: - yield u, v - - -def prim_mst(G, weight = 'weight'): - """Return a minimum spanning tree or forest of an undirected - weighted graph. - - A minimum spanning tree is a subgraph of the graph (a tree) with - the minimum sum of edge weights. - - If the graph is not connected a spanning forest is constructed. A - spanning forest is a union of the spanning trees for each - connected component of the graph. - - Parameters - ---------- - G : NetworkX Graph - - weight : string - Edge data key to use for weight (default 'weight'). - - Returns - ------- - G : NetworkX Graph - A minimum spanning tree or forest. - - Examples - -------- - >>> G=nx.cycle_graph(4) - >>> G.add_edge(0,3,weight=2) # assign weight 2 to edge 0-3 - >>> T=nx.prim_mst(G) - >>> print(sorted(T.edges(data=True))) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - - Notes - ----- - Uses Prim's algorithm. - - If the graph edges do not have a weight attribute a default weight of 1 - will be used. - """ - - T=nx.Graph(nx.prim_mst_edges(G,weight=weight,data=True)) - # Add isolated nodes - if len(T)!=len(G): - T.add_nodes_from([n for n,d in G.degree().items() if d==0]) - # Add node and graph attributes as shallow copy - for n in T: - T.node[n]=G.node[n].copy() - T.graph=G.graph.copy() - return T - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/__init__.py deleted file mode 100644 index 0ebc6ab..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from networkx.algorithms.operators.all import * -from networkx.algorithms.operators.binary import * -from networkx.algorithms.operators.product import * -from networkx.algorithms.operators.unary import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/all.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/all.py deleted file mode 100644 index 755256b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/all.py +++ /dev/null @@ -1,151 +0,0 @@ -"""Operations on many graphs. -""" -# Copyright (C) 2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -try: - from itertools import izip_longest as zip_longest -except ImportError: # Python3 has zip_longest - from itertools import zip_longest -import networkx as nx -from networkx.utils import is_string_like - -__author__ = """\n""".join([ 'Robert King <kingrobertking@gmail.com>', - 'Aric Hagberg <aric.hagberg@gmail.com>']) - -__all__ = ['union_all', 'compose_all', 'disjoint_union_all', - 'intersection_all'] - -def union_all(graphs, rename=(None,) , name=None): - """Return the union of all graphs. - - The graphs must be disjoint, otherwise an exception is raised. - - Parameters - ---------- - graphs : list of graphs - List of NetworkX graphs - - rename : bool , default=(None, None) - Node names of G and H can be changed by specifying the tuple - rename=('G-','H-') (for example). Node "u" in G is then renamed - "G-u" and "v" in H is renamed "H-v". - - name : string - Specify the name for the union graph@not_implemnted_for('direct - - Returns - ------- - U : a graph with the same type as the first graph in list - - Notes - ----- - To force a disjoint union with node relabeling, use - disjoint_union_all(G,H) or convert_node_labels_to integers(). - - Graph, edge, and node attributes are propagated to the union graph. - If a graph attribute is present in multiple graphs, then the value - from the last graph in the list with that attribute is used. - - See Also - -------- - union - disjoint_union_all - """ - graphs_names = zip_longest(graphs,rename) - U, gname = next(graphs_names) - for H,hname in graphs_names: - U = nx.union(U, H, (gname,hname),name=name) - gname = None - return U - -def disjoint_union_all(graphs): - """Return the disjoint union of all graphs. - - This operation forces distinct integer node labels starting with 0 - for the first graph in the list and numbering consecutively. - - Parameters - ---------- - graphs : list - List of NetworkX graphs - - Returns - ------- - U : A graph with the same type as the first graph in list - - Notes - ----- - It is recommended that the graphs be either all directed or all undirected. - - Graph, edge, and node attributes are propagated to the union graph. - If a graph attribute is present in multiple graphs, then the value - from the last graph in the list with that attribute is used. - """ - graphs = iter(graphs) - U = next(graphs) - for H in graphs: - U = nx.disjoint_union(U, H) - return U - -def compose_all(graphs, name=None): - """Return the composition of all graphs. - - Composition is the simple union of the node sets and edge sets. - The node sets of the supplied graphs need not be disjoint. - - Parameters - ---------- - graphs : list - List of NetworkX graphs - - name : string - Specify name for new graph - - Returns - ------- - C : A graph with the same type as the first graph in list - - Notes - ----- - It is recommended that the supplied graphs be either all directed or all - undirected. - - Graph, edge, and node attributes are propagated to the union graph. - If a graph attribute is present in multiple graphs, then the value - from the last graph in the list with that attribute is used. - """ - graphs = iter(graphs) - C = next(graphs) - for H in graphs: - C = nx.compose(C, H, name=name) - return C - -def intersection_all(graphs): - """Return a new graph that contains only the edges that exist in - all graphs. - - All supplied graphs must have the same node set. - - Parameters - ---------- - graphs_list : list - List of NetworkX graphs - - Returns - ------- - R : A new graph with the same type as the first graph in list - - Notes - ----- - Attributes from the graph, nodes, and edges are not copied to the new - graph. - """ - graphs = iter(graphs) - R = next(graphs) - for H in graphs: - R = nx.intersection(R, H) - return R diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/binary.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/binary.py deleted file mode 100644 index a710008..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/binary.py +++ /dev/null @@ -1,329 +0,0 @@ -""" -Operations on graphs including union, intersection, difference. -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import is_string_like -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) -__all__ = ['union', 'compose', 'disjoint_union', 'intersection', - 'difference', 'symmetric_difference'] - -def union(G, H, rename=(None, None), name=None): - """ Return the union of graphs G and H. - - Graphs G and H must be disjoint, otherwise an exception is raised. - - Parameters - ---------- - G,H : graph - A NetworkX graph - - create_using : NetworkX graph - Use specified graph for result. Otherwise - - rename : bool , default=(None, None) - Node names of G and H can be changed by specifying the tuple - rename=('G-','H-') (for example). Node "u" in G is then renamed - "G-u" and "v" in H is renamed "H-v". - - name : string - Specify the name for the union graph - - Returns - ------- - U : A union graph with the same type as G. - - Notes - ----- - To force a disjoint union with node relabeling, use - disjoint_union(G,H) or convert_node_labels_to integers(). - - Graph, edge, and node attributes are propagated from G and H - to the union graph. If a graph attribute is present in both - G and H the value from H is used. - - See Also - -------- - disjoint_union - """ - # Union is the same type as G - R = G.__class__() - if name is None: - name = "union( %s, %s )"%(G.name,H.name) - R.name = name - - # rename graph to obtain disjoint node labels - def add_prefix(graph, prefix): - if prefix is None: - return graph - def label(x): - if is_string_like(x): - name=prefix+x - else: - name=prefix+repr(x) - return name - return nx.relabel_nodes(graph, label) - G = add_prefix(G,rename[0]) - H = add_prefix(H,rename[1]) - if set(G) & set(H): - raise nx.NetworkXError('The node sets of G and H are not disjoint.', - 'Use appropriate rename=(Gprefix,Hprefix)' - 'or use disjoint_union(G,H).') - if G.is_multigraph(): - G_edges = G.edges_iter(keys=True, data=True) - else: - G_edges = G.edges_iter(data=True) - if H.is_multigraph(): - H_edges = H.edges_iter(keys=True, data=True) - else: - H_edges = H.edges_iter(data=True) - - # add nodes - R.add_nodes_from(G) - R.add_edges_from(G_edges) - # add edges - R.add_nodes_from(H) - R.add_edges_from(H_edges) - # add node attributes - R.node.update(G.node) - R.node.update(H.node) - # add graph attributes, H attributes take precedent over G attributes - R.graph.update(G.graph) - R.graph.update(H.graph) - - - return R - -def disjoint_union(G,H): - """ Return the disjoint union of graphs G and H. - - This algorithm forces distinct integer node labels. - - Parameters - ---------- - G,H : graph - A NetworkX graph - - Returns - ------- - U : A union graph with the same type as G. - - Notes - ----- - A new graph is created, of the same class as G. It is recommended - that G and H be either both directed or both undirected. - - The nodes of G are relabeled 0 to len(G)-1, and the nodes of H are - relabeled len(G) to len(G)+len(H)-1. - - Graph, edge, and node attributes are propagated from G and H - to the union graph. If a graph attribute is present in both - G and H the value from H is used. - """ - R1=nx.convert_node_labels_to_integers(G) - R2=nx.convert_node_labels_to_integers(H,first_label=len(R1)) - R=union(R1,R2) - R.name="disjoint_union( %s, %s )"%(G.name,H.name) - R.graph.update(G.graph) - R.graph.update(H.graph) - return R - - -def intersection(G, H): - """Return a new graph that contains only the edges that exist in - both G and H. - - The node sets of H and G must be the same. - - Parameters - ---------- - G,H : graph - A NetworkX graph. G and H must have the same node sets. - - Returns - ------- - GH : A new graph with the same type as G. - - Notes - ----- - Attributes from the graph, nodes, and edges are not copied to the new - graph. If you want a new graph of the intersection of G and H - with the attributes (including edge data) from G use remove_nodes_from() - as follows - - >>> G=nx.path_graph(3) - >>> H=nx.path_graph(5) - >>> R=G.copy() - >>> R.remove_nodes_from(n for n in G if n not in H) - """ - # create new graph - R=nx.create_empty_copy(G) - - R.name="Intersection of (%s and %s)"%(G.name, H.name) - - if set(G)!=set(H): - raise nx.NetworkXError("Node sets of graphs are not equal") - - if G.number_of_edges()<=H.number_of_edges(): - if G.is_multigraph(): - edges=G.edges_iter(keys=True) - else: - edges=G.edges_iter() - for e in edges: - if H.has_edge(*e): - R.add_edge(*e) - else: - if H.is_multigraph(): - edges=H.edges_iter(keys=True) - else: - edges=H.edges_iter() - for e in edges: - if G.has_edge(*e): - R.add_edge(*e) - - return R - -def difference(G, H): - """Return a new graph that contains the edges that exist in G but not in H. - - The node sets of H and G must be the same. - - Parameters - ---------- - G,H : graph - A NetworkX graph. G and H must have the same node sets. - - Returns - ------- - D : A new graph with the same type as G. - - Notes - ----- - Attributes from the graph, nodes, and edges are not copied to the new - graph. If you want a new graph of the difference of G and H with - with the attributes (including edge data) from G use remove_nodes_from() - as follows: - - >>> G=nx.path_graph(3) - >>> H=nx.path_graph(5) - >>> R=G.copy() - >>> R.remove_nodes_from(n for n in G if n in H) - """ - # create new graph - R=nx.create_empty_copy(G) - R.name="Difference of (%s and %s)"%(G.name, H.name) - - if set(G)!=set(H): - raise nx.NetworkXError("Node sets of graphs not equal") - - if G.is_multigraph(): - edges=G.edges_iter(keys=True) - else: - edges=G.edges_iter() - for e in edges: - if not H.has_edge(*e): - R.add_edge(*e) - return R - -def symmetric_difference(G, H): - """Return new graph with edges that exist in either G or H but not both. - - The node sets of H and G must be the same. - - Parameters - ---------- - G,H : graph - A NetworkX graph. G and H must have the same node sets. - - Returns - ------- - D : A new graph with the same type as G. - - Notes - ----- - Attributes from the graph, nodes, and edges are not copied to the new - graph. - """ - # create new graph - R=nx.create_empty_copy(G) - R.name="Symmetric difference of (%s and %s)"%(G.name, H.name) - - if set(G)!=set(H): - raise nx.NetworkXError("Node sets of graphs not equal") - - gnodes=set(G) # set of nodes in G - hnodes=set(H) # set of nodes in H - nodes=gnodes.symmetric_difference(hnodes) - R.add_nodes_from(nodes) - - if G.is_multigraph(): - edges=G.edges_iter(keys=True) - else: - edges=G.edges_iter() - # we could copy the data here but then this function doesn't - # match intersection and difference - for e in edges: - if not H.has_edge(*e): - R.add_edge(*e) - - if H.is_multigraph(): - edges=H.edges_iter(keys=True) - else: - edges=H.edges_iter() - for e in edges: - if not G.has_edge(*e): - R.add_edge(*e) - return R - -def compose(G, H, name=None): - """Return a new graph of G composed with H. - - Composition is the simple union of the node sets and edge sets. - The node sets of G and H need not be disjoint. - - Parameters - ---------- - G,H : graph - A NetworkX graph - - name : string - Specify name for new graph - - Returns - ------- - C: A new graph with the same type as G - - Notes - ----- - It is recommended that G and H be either both directed or both undirected. - Attributes from H take precedent over attributes from G. - """ - if name is None: - name="compose( %s, %s )"%(G.name,H.name) - R=G.__class__() - R.name=name - R.add_nodes_from(H.nodes()) - R.add_nodes_from(G.nodes()) - if H.is_multigraph(): - R.add_edges_from(H.edges_iter(keys=True,data=True)) - else: - R.add_edges_from(H.edges_iter(data=True)) - if G.is_multigraph(): - R.add_edges_from(G.edges_iter(keys=True,data=True)) - else: - R.add_edges_from(G.edges_iter(data=True)) - - # add node attributes, H attributes take precedent over G attributes - R.node.update(G.node) - R.node.update(H.node) - # add graph attributes, H attributes take precedent over G attributes - R.graph.update(G.graph) - R.graph.update(H.graph) - return R diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py deleted file mode 100644 index 0fa8a17..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py +++ /dev/null @@ -1,330 +0,0 @@ -""" -Graph products. -""" -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from itertools import product - -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)' - 'Ben Edwards(bedwards@cs.unm.edu)']) - -__all__ = ['tensor_product','cartesian_product', - 'lexicographic_product', 'strong_product'] - -def _dict_product(d1,d2): - return dict((k,(d1.get(k),d2.get(k))) for k in set(d1)|set(d2)) - - -# Generators for producting graph products -def _node_product(G,H): - for u,v in product(G, H): - yield ((u,v), _dict_product(G.node[u], H.node[v])) - -def _directed_edges_cross_edges(G,H): - if not G.is_multigraph() and not H.is_multigraph(): - for u,v,c in G.edges_iter(data=True): - for x,y,d in H.edges_iter(data=True): - yield (u,x),(v,y),_dict_product(c,d) - if not G.is_multigraph() and H.is_multigraph(): - for u,v,c in G.edges_iter(data=True): - for x,y,k,d in H.edges_iter(data=True,keys=True): - yield (u,x),(v,y),k,_dict_product(c,d) - if G.is_multigraph() and not H.is_multigraph(): - for u,v,k,c in G.edges_iter(data=True,keys=True): - for x,y,d in H.edges_iter(data=True): - yield (u,x),(v,y),k,_dict_product(c,d) - if G.is_multigraph() and H.is_multigraph(): - for u,v,j,c in G.edges_iter(data=True,keys=True): - for x,y,k,d in H.edges_iter(data=True,keys=True): - yield (u,x),(v,y),(j,k),_dict_product(c,d) - -def _undirected_edges_cross_edges(G,H): - if not G.is_multigraph() and not H.is_multigraph(): - for u,v,c in G.edges_iter(data=True): - for x,y,d in H.edges_iter(data=True): - yield (v,x),(u,y),_dict_product(c,d) - if not G.is_multigraph() and H.is_multigraph(): - for u,v,c in G.edges_iter(data=True): - for x,y,k,d in H.edges_iter(data=True,keys=True): - yield (v,x),(u,y),k,_dict_product(c,d) - if G.is_multigraph() and not H.is_multigraph(): - for u,v,k,c in G.edges_iter(data=True,keys=True): - for x,y,d in H.edges_iter(data=True): - yield (v,x),(u,y),k,_dict_product(c,d) - if G.is_multigraph() and H.is_multigraph(): - for u,v,j,c in G.edges_iter(data=True,keys=True): - for x,y,k,d in H.edges_iter(data=True,keys=True): - yield (v,x),(u,y),(j,k),_dict_product(c,d) - -def _edges_cross_nodes(G,H): - if G.is_multigraph(): - for u,v,k,d in G.edges_iter(data=True,keys=True): - for x in H: - yield (u,x),(v,x),k,d - else: - for u,v,d in G.edges_iter(data=True): - for x in H: - if H.is_multigraph(): - yield (u,x),(v,x),None,d - else: - yield (u,x),(v,x),d - - -def _nodes_cross_edges(G,H): - if H.is_multigraph(): - for x in G: - for u,v,k,d in H.edges_iter(data=True,keys=True): - yield (x,u),(x,v),k,d - else: - for x in G: - for u,v,d in H.edges_iter(data=True): - if G.is_multigraph(): - yield (x,u),(x,v),None,d - else: - yield (x,u),(x,v),d - -def _edges_cross_nodes_and_nodes(G,H): - if G.is_multigraph(): - for u,v,k,d in G.edges_iter(data=True,keys=True): - for x in H: - for y in H: - yield (u,x),(v,y),k,d - else: - for u,v,d in G.edges_iter(data=True): - for x in H: - for y in H: - if H.is_multigraph(): - yield (u,x),(v,y),None,d - else: - yield (u,x),(v,y),d - -def _init_product_graph(G,H): - if not G.is_directed() == H.is_directed(): - raise nx.NetworkXError("G and H must be both directed or", - "both undirected") - if G.is_multigraph() or H.is_multigraph(): - GH = nx.MultiGraph() - else: - GH = nx.Graph() - if G.is_directed(): - GH = GH.to_directed() - return GH - - -def tensor_product(G,H): - r"""Return the tensor product of G and H. - - The tensor product P of the graphs G and H has a node set that - is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$. - P has an edge ((u,v),(x,y)) if and only if (u,v) is an edge in G - and (x,y) is an edge in H. - - Sometimes referred to as the categorical product. - - - Parameters - ---------- - G, H: graphs - Networkx graphs. - - Returns - ------- - P: NetworkX graph - The tensor product of G and H. P will be a multi-graph if either G - or H is a multi-graph. Will be a directed if G and H are directed, - and undirected if G and H are undirected. - - Raises - ------ - NetworkXError - If G and H are not both directed or both undirected. - - Notes - ----- - Node attributes in P are two-tuple of the G and H node attributes. - Missing attributes are assigned None. - - For example - >>> G = nx.Graph() - >>> H = nx.Graph() - >>> G.add_node(0,a1=True) - >>> H.add_node('a',a2='Spam') - >>> P = nx.tensor_product(G,H) - >>> P.nodes() - [(0, 'a')] - - Edge attributes and edge keys (for multigraphs) are also copied to the - new product graph - """ - GH = _init_product_graph(G,H) - GH.add_nodes_from(_node_product(G,H)) - GH.add_edges_from(_directed_edges_cross_edges(G,H)) - if not GH.is_directed(): - GH.add_edges_from(_undirected_edges_cross_edges(G,H)) - GH.name = "Tensor product("+G.name+","+H.name+")" - return GH - -def cartesian_product(G,H): - """Return the Cartesian product of G and H. - - The tensor product P of the graphs G and H has a node set that - is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$. - P has an edge ((u,v),(x,y)) if and only if (u,v) is an edge in G - and x==y or and (x,y) is an edge in H and u==v. - and (x,y) is an edge in H. - - Parameters - ---------- - G, H: graphs - Networkx graphs. - - Returns - ------- - P: NetworkX graph - The Cartesian product of G and H. P will be a multi-graph if either G - or H is a multi-graph. Will be a directed if G and H are directed, - and undirected if G and H are undirected. - - Raises - ------ - NetworkXError - If G and H are not both directed or both undirected. - - Notes - ----- - Node attributes in P are two-tuple of the G and H node attributes. - Missing attributes are assigned None. - - For example - >>> G = nx.Graph() - >>> H = nx.Graph() - >>> G.add_node(0,a1=True) - >>> H.add_node('a',a2='Spam') - >>> P = nx.cartesian_product(G,H) - >>> P.nodes() - [(0, 'a')] - - Edge attributes and edge keys (for multigraphs) are also copied to the - new product graph - """ - if not G.is_directed() == H.is_directed(): - raise nx.NetworkXError("G and H must be both directed or", - "both undirected") - GH = _init_product_graph(G,H) - GH.add_nodes_from(_node_product(G,H)) - GH.add_edges_from(_edges_cross_nodes(G,H)) - GH.add_edges_from(_nodes_cross_edges(G,H)) - GH.name = "Cartesian product("+G.name+","+H.name+")" - return GH - -def lexicographic_product(G,H): - """Return the lexicographic product of G and H. - - The lexicographical product P of the graphs G and H has a node set that - is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$. - P has an edge ((u,v),(x,y)) if and only if (u,v) is an edge in G - or u==v and (x,y) is an edge in H. - - Parameters - ---------- - G, H: graphs - Networkx graphs. - - Returns - ------- - P: NetworkX graph - The Cartesian product of G and H. P will be a multi-graph if either G - or H is a multi-graph. Will be a directed if G and H are directed, - and undirected if G and H are undirected. - - Raises - ------ - NetworkXError - If G and H are not both directed or both undirected. - - Notes - ----- - Node attributes in P are two-tuple of the G and H node attributes. - Missing attributes are assigned None. - - For example - >>> G = nx.Graph() - >>> H = nx.Graph() - >>> G.add_node(0,a1=True) - >>> H.add_node('a',a2='Spam') - >>> P = nx.lexicographic_product(G,H) - >>> P.nodes() - [(0, 'a')] - - Edge attributes and edge keys (for multigraphs) are also copied to the - new product graph - """ - GH = _init_product_graph(G,H) - GH.add_nodes_from(_node_product(G,H)) - # Edges in G regardless of H designation - GH.add_edges_from(_edges_cross_nodes_and_nodes(G,H)) - # For each x in G, only if there is an edge in H - GH.add_edges_from(_nodes_cross_edges(G,H)) - GH.name = "Lexicographic product("+G.name+","+H.name+")" - return GH - -def strong_product(G,H): - """Return the strong product of G and H. - - The strong product P of the graphs G and H has a node set that - is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$. - P has an edge ((u,v),(x,y)) if and only if - u==v and (x,y) is an edge in H, or - x==y and (u,v) is an edge in G, or - (u,v) is an edge in G and (x,y) is an edge in H. - - Parameters - ---------- - G, H: graphs - Networkx graphs. - - Returns - ------- - P: NetworkX graph - The Cartesian product of G and H. P will be a multi-graph if either G - or H is a multi-graph. Will be a directed if G and H are directed, - and undirected if G and H are undirected. - - Raises - ------ - NetworkXError - If G and H are not both directed or both undirected. - - Notes - ----- - Node attributes in P are two-tuple of the G and H node attributes. - Missing attributes are assigned None. - - For example - >>> G = nx.Graph() - >>> H = nx.Graph() - >>> G.add_node(0,a1=True) - >>> H.add_node('a',a2='Spam') - >>> P = nx.strong_product(G,H) - >>> P.nodes() - [(0, 'a')] - - Edge attributes and edge keys (for multigraphs) are also copied to the - new product graph - """ - GH = _init_product_graph(G,H) - GH.add_nodes_from(_node_product(G,H)) - GH.add_edges_from(_nodes_cross_edges(G,H)) - GH.add_edges_from(_edges_cross_nodes(G,H)) - GH.add_edges_from(_directed_edges_cross_edges(G,H)) - if not GH.is_directed(): - GH.add_edges_from(_undirected_edges_cross_edges(G,H)) - GH.name = "Strong product("+G.name+","+H.name+")" - return GH diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_all.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_all.py deleted file mode 100644 index fc4fa4a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_all.py +++ /dev/null @@ -1,167 +0,0 @@ -from nose.tools import * -import networkx as nx -from networkx.testing import * - -def test_union_all_attributes(): - g = nx.Graph() - g.add_node(0, x=4) - g.add_node(1, x=5) - g.add_edge(0, 1, size=5) - g.graph['name'] = 'g' - - h = g.copy() - h.graph['name'] = 'h' - h.graph['attr'] = 'attr' - h.node[0]['x'] = 7 - - j = g.copy() - j.graph['name'] = 'j' - j.graph['attr'] = 'attr' - j.node[0]['x'] = 7 - - ghj = nx.union_all([g, h, j], rename=('g', 'h', 'j')) - assert_equal( set(ghj.nodes()) , set(['h0', 'h1', 'g0', 'g1', 'j0', 'j1']) ) - for n in ghj: - graph, node = n - assert_equal( ghj.node[n], eval(graph).node[int(node)] ) - - assert_equal(ghj.graph['attr'],'attr') - assert_equal(ghj.graph['name'],'j') # j graph attributes take precendent - - - -def test_intersection_all(): - G=nx.Graph() - H=nx.Graph() - R=nx.Graph() - G.add_nodes_from([1,2,3,4]) - G.add_edge(1,2) - G.add_edge(2,3) - H.add_nodes_from([1,2,3,4]) - H.add_edge(2,3) - H.add_edge(3,4) - R.add_nodes_from([1,2,3,4]) - R.add_edge(2,3) - R.add_edge(4,1) - I=nx.intersection_all([G,H,R]) - assert_equal( set(I.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(I.edges()) , [(2,3)] ) - - -def test_intersection_all_attributes(): - g = nx.Graph() - g.add_node(0, x=4) - g.add_node(1, x=5) - g.add_edge(0, 1, size=5) - g.graph['name'] = 'g' - - h = g.copy() - h.graph['name'] = 'h' - h.graph['attr'] = 'attr' - h.node[0]['x'] = 7 - - gh = nx.intersection_all([g, h]) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , sorted(g.edges()) ) - - h.remove_node(0) - assert_raises(nx.NetworkXError, nx.intersection, g, h) - -def test_intersection_all_multigraph_attributes(): - g = nx.MultiGraph() - g.add_edge(0, 1, key=0) - g.add_edge(0, 1, key=1) - g.add_edge(0, 1, key=2) - h = nx.MultiGraph() - h.add_edge(0, 1, key=0) - h.add_edge(0, 1, key=3) - gh = nx.intersection_all([g, h]) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , [(0,1)] ) - assert_equal( sorted(gh.edges(keys=True)) , [(0,1,0)] ) - -def test_union_all_and_compose_all(): - K3=nx.complete_graph(3) - P3=nx.path_graph(3) - - G1=nx.DiGraph() - G1.add_edge('A','B') - G1.add_edge('A','C') - G1.add_edge('A','D') - G2=nx.DiGraph() - G2.add_edge('1','2') - G2.add_edge('1','3') - G2.add_edge('1','4') - - G=nx.union_all([G1,G2]) - H=nx.compose_all([G1,G2]) - assert_edges_equal(G.edges(),H.edges()) - assert_false(G.has_edge('A','1')) - assert_raises(nx.NetworkXError, nx.union, K3, P3) - H1=nx.union_all([H,G1],rename=('H','G1')) - assert_equal(sorted(H1.nodes()), - ['G1A', 'G1B', 'G1C', 'G1D', - 'H1', 'H2', 'H3', 'H4', 'HA', 'HB', 'HC', 'HD']) - - H2=nx.union_all([H,G2],rename=("H","")) - assert_equal(sorted(H2.nodes()), - ['1', '2', '3', '4', - 'H1', 'H2', 'H3', 'H4', 'HA', 'HB', 'HC', 'HD']) - - assert_false(H1.has_edge('NB','NA')) - - G=nx.compose_all([G,G]) - assert_edges_equal(G.edges(),H.edges()) - - G2=nx.union_all([G2,G2],rename=('','copy')) - assert_equal(sorted(G2.nodes()), - ['1', '2', '3', '4', 'copy1', 'copy2', 'copy3', 'copy4']) - - assert_equal(G2.neighbors('copy4'),[]) - assert_equal(sorted(G2.neighbors('copy1')),['copy2', 'copy3', 'copy4']) - assert_equal(len(G),8) - assert_equal(nx.number_of_edges(G),6) - - E=nx.disjoint_union_all([G,G]) - assert_equal(len(E),16) - assert_equal(nx.number_of_edges(E),12) - - E=nx.disjoint_union_all([G1,G2]) - assert_equal(sorted(E.nodes()),[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) - - G1=nx.DiGraph() - G1.add_edge('A','B') - G2=nx.DiGraph() - G2.add_edge(1,2) - G3=nx.DiGraph() - G3.add_edge(11,22) - G4=nx.union_all([G1,G2,G3],rename=("G1","G2","G3")) - assert_equal(sorted(G4.nodes()), - ['G1A', 'G1B', 'G21', 'G22', - 'G311', 'G322']) - - -def test_union_all_multigraph(): - G=nx.MultiGraph() - G.add_edge(1,2,key=0) - G.add_edge(1,2,key=1) - H=nx.MultiGraph() - H.add_edge(3,4,key=0) - H.add_edge(3,4,key=1) - GH=nx.union_all([G,H]) - assert_equal( set(GH) , set(G)|set(H)) - assert_equal( set(GH.edges(keys=True)) , - set(G.edges(keys=True))|set(H.edges(keys=True))) - - -def test_input_output(): - l = [nx.Graph([(1,2)]),nx.Graph([(3,4)])] - U = nx.disjoint_union_all(l) - assert_equal(len(l),2) - C = nx.compose_all(l) - assert_equal(len(l),2) - l = [nx.Graph([(1,2)]),nx.Graph([(1,2)])] - R = nx.intersection_all(l) - assert_equal(len(l),2) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_binary.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_binary.py deleted file mode 100644 index 34b7e6e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_binary.py +++ /dev/null @@ -1,270 +0,0 @@ -from nose.tools import * -import networkx as nx -from networkx import * -from networkx.testing import * - -def test_union_attributes(): - g = nx.Graph() - g.add_node(0, x=4) - g.add_node(1, x=5) - g.add_edge(0, 1, size=5) - g.graph['name'] = 'g' - - h = g.copy() - h.graph['name'] = 'h' - h.graph['attr'] = 'attr' - h.node[0]['x'] = 7 - - gh = nx.union(g, h, rename=('g', 'h')) - assert_equal( set(gh.nodes()) , set(['h0', 'h1', 'g0', 'g1']) ) - for n in gh: - graph, node = n - assert_equal( gh.node[n], eval(graph).node[int(node)] ) - - assert_equal(gh.graph['attr'],'attr') - assert_equal(gh.graph['name'],'h') # h graph attributes take precendent - -def test_intersection(): - G=nx.Graph() - H=nx.Graph() - G.add_nodes_from([1,2,3,4]) - G.add_edge(1,2) - G.add_edge(2,3) - H.add_nodes_from([1,2,3,4]) - H.add_edge(2,3) - H.add_edge(3,4) - I=nx.intersection(G,H) - assert_equal( set(I.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(I.edges()) , [(2,3)] ) - - -def test_intersection_attributes(): - g = nx.Graph() - g.add_node(0, x=4) - g.add_node(1, x=5) - g.add_edge(0, 1, size=5) - g.graph['name'] = 'g' - - h = g.copy() - h.graph['name'] = 'h' - h.graph['attr'] = 'attr' - h.node[0]['x'] = 7 - - gh = nx.intersection(g, h) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , sorted(g.edges()) ) - - h.remove_node(0) - assert_raises(nx.NetworkXError, nx.intersection, g, h) - - - -def test_intersection_multigraph_attributes(): - g = nx.MultiGraph() - g.add_edge(0, 1, key=0) - g.add_edge(0, 1, key=1) - g.add_edge(0, 1, key=2) - h = nx.MultiGraph() - h.add_edge(0, 1, key=0) - h.add_edge(0, 1, key=3) - gh = nx.intersection(g, h) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , [(0,1)] ) - assert_equal( sorted(gh.edges(keys=True)) , [(0,1,0)] ) - - -def test_difference(): - G=nx.Graph() - H=nx.Graph() - G.add_nodes_from([1,2,3,4]) - G.add_edge(1,2) - G.add_edge(2,3) - H.add_nodes_from([1,2,3,4]) - H.add_edge(2,3) - H.add_edge(3,4) - D=nx.difference(G,H) - assert_equal( set(D.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(D.edges()) , [(1,2)] ) - D=nx.difference(H,G) - assert_equal( set(D.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(D.edges()) , [(3,4)] ) - D=nx.symmetric_difference(G,H) - assert_equal( set(D.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(D.edges()) , [(1,2),(3,4)] ) - - -def test_difference2(): - G=nx.Graph() - H=nx.Graph() - G.add_nodes_from([1,2,3,4]) - H.add_nodes_from([1,2,3,4]) - G.add_edge(1,2) - H.add_edge(1,2) - G.add_edge(2,3) - D=nx.difference(G,H) - assert_equal( set(D.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(D.edges()) , [(2,3)] ) - D=nx.difference(H,G) - assert_equal( set(D.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(D.edges()) , [] ) - H.add_edge(3,4) - D=nx.difference(H,G) - assert_equal( set(D.nodes()) , set([1,2,3,4]) ) - assert_equal( sorted(D.edges()) , [(3,4)] ) - - -def test_difference_attributes(): - g = nx.Graph() - g.add_node(0, x=4) - g.add_node(1, x=5) - g.add_edge(0, 1, size=5) - g.graph['name'] = 'g' - - h = g.copy() - h.graph['name'] = 'h' - h.graph['attr'] = 'attr' - h.node[0]['x'] = 7 - - gh = nx.difference(g, h) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , []) - - h.remove_node(0) - assert_raises(nx.NetworkXError, nx.intersection, g, h) - -def test_difference_multigraph_attributes(): - g = nx.MultiGraph() - g.add_edge(0, 1, key=0) - g.add_edge(0, 1, key=1) - g.add_edge(0, 1, key=2) - h = nx.MultiGraph() - h.add_edge(0, 1, key=0) - h.add_edge(0, 1, key=3) - gh = nx.difference(g, h) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , [(0,1),(0,1)] ) - assert_equal( sorted(gh.edges(keys=True)) , [(0,1,1),(0,1,2)] ) - - -@raises(nx.NetworkXError) -def test_difference_raise(): - G = nx.path_graph(4) - H = nx.path_graph(3) - GH = nx.difference(G, H) - -def test_symmetric_difference_multigraph(): - g = nx.MultiGraph() - g.add_edge(0, 1, key=0) - g.add_edge(0, 1, key=1) - g.add_edge(0, 1, key=2) - h = nx.MultiGraph() - h.add_edge(0, 1, key=0) - h.add_edge(0, 1, key=3) - gh = nx.symmetric_difference(g, h) - assert_equal( set(gh.nodes()) , set(g.nodes()) ) - assert_equal( set(gh.nodes()) , set(h.nodes()) ) - assert_equal( sorted(gh.edges()) , 3*[(0,1)] ) - assert_equal( sorted(sorted(e) for e in gh.edges(keys=True)), - [[0,1,1],[0,1,2],[0,1,3]] ) - -@raises(nx.NetworkXError) -def test_symmetric_difference_raise(): - G = nx.path_graph(4) - H = nx.path_graph(3) - GH = nx.symmetric_difference(G, H) - -def test_union_and_compose(): - K3=complete_graph(3) - P3=path_graph(3) - - G1=nx.DiGraph() - G1.add_edge('A','B') - G1.add_edge('A','C') - G1.add_edge('A','D') - G2=nx.DiGraph() - G2.add_edge('1','2') - G2.add_edge('1','3') - G2.add_edge('1','4') - - G=union(G1,G2) - H=compose(G1,G2) - assert_edges_equal(G.edges(),H.edges()) - assert_false(G.has_edge('A',1)) - assert_raises(nx.NetworkXError, nx.union, K3, P3) - H1=union(H,G1,rename=('H','G1')) - assert_equal(sorted(H1.nodes()), - ['G1A', 'G1B', 'G1C', 'G1D', - 'H1', 'H2', 'H3', 'H4', 'HA', 'HB', 'HC', 'HD']) - - H2=union(H,G2,rename=("H","")) - assert_equal(sorted(H2.nodes()), - ['1', '2', '3', '4', - 'H1', 'H2', 'H3', 'H4', 'HA', 'HB', 'HC', 'HD']) - - assert_false(H1.has_edge('NB','NA')) - - G=compose(G,G) - assert_edges_equal(G.edges(),H.edges()) - - G2=union(G2,G2,rename=('','copy')) - assert_equal(sorted(G2.nodes()), - ['1', '2', '3', '4', 'copy1', 'copy2', 'copy3', 'copy4']) - - assert_equal(G2.neighbors('copy4'),[]) - assert_equal(sorted(G2.neighbors('copy1')),['copy2', 'copy3', 'copy4']) - assert_equal(len(G),8) - assert_equal(number_of_edges(G),6) - - E=disjoint_union(G,G) - assert_equal(len(E),16) - assert_equal(number_of_edges(E),12) - - E=disjoint_union(G1,G2) - assert_equal(sorted(E.nodes()),[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) - - -def test_union_multigraph(): - G=nx.MultiGraph() - G.add_edge(1,2,key=0) - G.add_edge(1,2,key=1) - H=nx.MultiGraph() - H.add_edge(3,4,key=0) - H.add_edge(3,4,key=1) - GH=nx.union(G,H) - assert_equal( set(GH) , set(G)|set(H)) - assert_equal( set(GH.edges(keys=True)) , - set(G.edges(keys=True))|set(H.edges(keys=True))) - -def test_disjoint_union_multigraph(): - G=nx.MultiGraph() - G.add_edge(0,1,key=0) - G.add_edge(0,1,key=1) - H=nx.MultiGraph() - H.add_edge(2,3,key=0) - H.add_edge(2,3,key=1) - GH=nx.disjoint_union(G,H) - assert_equal( set(GH) , set(G)|set(H)) - assert_equal( set(GH.edges(keys=True)) , - set(G.edges(keys=True))|set(H.edges(keys=True))) - - -def test_compose_multigraph(): - G=nx.MultiGraph() - G.add_edge(1,2,key=0) - G.add_edge(1,2,key=1) - H=nx.MultiGraph() - H.add_edge(3,4,key=0) - H.add_edge(3,4,key=1) - GH=nx.compose(G,H) - assert_equal( set(GH) , set(G)|set(H)) - assert_equal( set(GH.edges(keys=True)) , - set(G.edges(keys=True))|set(H.edges(keys=True))) - H.add_edge(1,2,key=2) - GH=nx.compose(G,H) - assert_equal( set(GH) , set(G)|set(H)) - assert_equal( set(GH.edges(keys=True)) , - set(G.edges(keys=True))|set(H.edges(keys=True))) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_product.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_product.py deleted file mode 100644 index b157aac..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_product.py +++ /dev/null @@ -1,334 +0,0 @@ -import networkx as nx -from networkx import tensor_product,cartesian_product,lexicographic_product,strong_product -from nose.tools import assert_raises, assert_true, assert_equal, raises - -@raises(nx.NetworkXError) -def test_tensor_product_raises(): - P = tensor_product(nx.DiGraph(),nx.Graph()) - -def test_tensor_product_null(): - null=nx.null_graph() - empty10=nx.empty_graph(10) - K3=nx.complete_graph(3) - K10=nx.complete_graph(10) - P3=nx.path_graph(3) - P10=nx.path_graph(10) - # null graph - G=tensor_product(null,null) - assert_true(nx.is_isomorphic(G,null)) - # null_graph X anything = null_graph and v.v. - G=tensor_product(null,empty10) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(null,K3) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(null,K10) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(null,P3) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(null,P10) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(empty10,null) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(K3,null) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(K10,null) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(P3,null) - assert_true(nx.is_isomorphic(G,null)) - G=tensor_product(P10,null) - assert_true(nx.is_isomorphic(G,null)) - -def test_tensor_product_size(): - P5 = nx.path_graph(5) - K3 = nx.complete_graph(3) - K5 = nx.complete_graph(5) - - G=tensor_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=tensor_product(K3,K5) - assert_equal(nx.number_of_nodes(G),3*5) - - -def test_tensor_product_combinations(): - # basic smoke test, more realistic tests would be usefule - P5 = nx.path_graph(5) - K3 = nx.complete_graph(3) - G=tensor_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=tensor_product(P5,nx.MultiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - G=tensor_product(nx.MultiGraph(P5),K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=tensor_product(nx.MultiGraph(P5),nx.MultiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - - G=tensor_product(nx.DiGraph(P5),nx.DiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - - -def test_tensor_product_classic_result(): - K2 = nx.complete_graph(2) - G = nx.petersen_graph() - G = tensor_product(G,K2) - assert_true(nx.is_isomorphic(G,nx.desargues_graph())) - - G = nx.cycle_graph(5) - G = tensor_product(G,K2) - assert_true(nx.is_isomorphic(G,nx.cycle_graph(10))) - - G = nx.tetrahedral_graph() - G = tensor_product(G,K2) - assert_true(nx.is_isomorphic(G,nx.cubical_graph())) - -def test_tensor_product_random(): - G = nx.erdos_renyi_graph(10,2/10.) - H = nx.erdos_renyi_graph(10,2/10.) - GH = tensor_product(G,H) - - for (u_G,u_H) in GH.nodes_iter(): - for (v_G,v_H) in GH.nodes_iter(): - if H.has_edge(u_H,v_H) and G.has_edge(u_G,v_G): - assert_true(GH.has_edge((u_G,u_H),(v_G,v_H))) - else: - assert_true(not GH.has_edge((u_G,u_H),(v_G,v_H))) - - -def test_cartesian_product_multigraph(): - G=nx.MultiGraph() - G.add_edge(1,2,key=0) - G.add_edge(1,2,key=1) - H=nx.MultiGraph() - H.add_edge(3,4,key=0) - H.add_edge(3,4,key=1) - GH=cartesian_product(G,H) - assert_equal( set(GH) , set([(1, 3), (2, 3), (2, 4), (1, 4)])) - assert_equal( set(GH.edges(keys=True)) , - set([((1, 3), (2, 3), 0), ((1, 3), (2, 3), 1), - ((1, 3), (1, 4), 0), ((1, 3), (1, 4), 1), - ((2, 3), (2, 4), 0), ((2, 3), (2, 4), 1), - ((2, 4), (1, 4), 0), ((2, 4), (1, 4), 1)])) - -@raises(nx.NetworkXError) -def test_cartesian_product_raises(): - P = cartesian_product(nx.DiGraph(),nx.Graph()) - -def test_cartesian_product_null(): - null=nx.null_graph() - empty10=nx.empty_graph(10) - K3=nx.complete_graph(3) - K10=nx.complete_graph(10) - P3=nx.path_graph(3) - P10=nx.path_graph(10) - # null graph - G=cartesian_product(null,null) - assert_true(nx.is_isomorphic(G,null)) - # null_graph X anything = null_graph and v.v. - G=cartesian_product(null,empty10) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(null,K3) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(null,K10) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(null,P3) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(null,P10) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(empty10,null) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(K3,null) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(K10,null) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(P3,null) - assert_true(nx.is_isomorphic(G,null)) - G=cartesian_product(P10,null) - assert_true(nx.is_isomorphic(G,null)) - -def test_cartesian_product_size(): - # order(GXH)=order(G)*order(H) - K5=nx.complete_graph(5) - P5=nx.path_graph(5) - K3=nx.complete_graph(3) - G=cartesian_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - assert_equal(nx.number_of_edges(G), - nx.number_of_edges(P5)*nx.number_of_nodes(K3)+ - nx.number_of_edges(K3)*nx.number_of_nodes(P5)) - G=cartesian_product(K3,K5) - assert_equal(nx.number_of_nodes(G),3*5) - assert_equal(nx.number_of_edges(G), - nx.number_of_edges(K5)*nx.number_of_nodes(K3)+ - nx.number_of_edges(K3)*nx.number_of_nodes(K5)) - -def test_cartesian_product_classic(): - # test some classic product graphs - P2 = nx.path_graph(2) - P3 = nx.path_graph(3) - # cube = 2-path X 2-path - G=cartesian_product(P2,P2) - G=cartesian_product(P2,G) - assert_true(nx.is_isomorphic(G,nx.cubical_graph())) - - # 3x3 grid - G=cartesian_product(P3,P3) - assert_true(nx.is_isomorphic(G,nx.grid_2d_graph(3,3))) - -def test_cartesian_product_random(): - G = nx.erdos_renyi_graph(10,2/10.) - H = nx.erdos_renyi_graph(10,2/10.) - GH = cartesian_product(G,H) - - for (u_G,u_H) in GH.nodes_iter(): - for (v_G,v_H) in GH.nodes_iter(): - if (u_G==v_G and H.has_edge(u_H,v_H)) or \ - (u_H==v_H and G.has_edge(u_G,v_G)): - assert_true(GH.has_edge((u_G,u_H),(v_G,v_H))) - else: - assert_true(not GH.has_edge((u_G,u_H),(v_G,v_H))) - -@raises(nx.NetworkXError) -def test_lexicographic_product_raises(): - P=lexicographic_product(nx.DiGraph(),nx.Graph()) - -def test_lexicographic_product_null(): - null=nx.null_graph() - empty10=nx.empty_graph(10) - K3=nx.complete_graph(3) - K10=nx.complete_graph(10) - P3=nx.path_graph(3) - P10=nx.path_graph(10) - # null graph - G=lexicographic_product(null,null) - assert_true(nx.is_isomorphic(G,null)) - # null_graph X anything = null_graph and v.v. - G=lexicographic_product(null,empty10) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(null,K3) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(null,K10) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(null,P3) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(null,P10) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(empty10,null) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(K3,null) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(K10,null) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(P3,null) - assert_true(nx.is_isomorphic(G,null)) - G=lexicographic_product(P10,null) - assert_true(nx.is_isomorphic(G,null)) - -def test_lexicographic_product_size(): - K5=nx.complete_graph(5) - P5=nx.path_graph(5) - K3=nx.complete_graph(3) - G=lexicographic_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=lexicographic_product(K3,K5) - assert_equal(nx.number_of_nodes(G),3*5) - -def test_lexicographic_product_combinations(): - P5=nx.path_graph(5) - K3=nx.complete_graph(3) - G=lexicographic_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=lexicographic_product(nx.MultiGraph(P5),K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=lexicographic_product(P5,nx.MultiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - G=lexicographic_product(nx.MultiGraph(P5),nx.MultiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - - - - - #No classic easily found classic results for lexicographic product -def test_lexicographic_product_random(): - G = nx.erdos_renyi_graph(10,2/10.) - H = nx.erdos_renyi_graph(10,2/10.) - GH = lexicographic_product(G,H) - - for (u_G,u_H) in GH.nodes_iter(): - for (v_G,v_H) in GH.nodes_iter(): - if G.has_edge(u_G,v_G) or (u_G==v_G and H.has_edge(u_H,v_H)): - assert_true(GH.has_edge((u_G,u_H),(v_G,v_H))) - else: - assert_true(not GH.has_edge((u_G,u_H),(v_G,v_H))) - -@raises(nx.NetworkXError) -def test_strong_product_raises(): - P = strong_product(nx.DiGraph(),nx.Graph()) - -def test_strong_product_null(): - null=nx.null_graph() - empty10=nx.empty_graph(10) - K3=nx.complete_graph(3) - K10=nx.complete_graph(10) - P3=nx.path_graph(3) - P10=nx.path_graph(10) - # null graph - G=strong_product(null,null) - assert_true(nx.is_isomorphic(G,null)) - # null_graph X anything = null_graph and v.v. - G=strong_product(null,empty10) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(null,K3) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(null,K10) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(null,P3) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(null,P10) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(empty10,null) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(K3,null) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(K10,null) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(P3,null) - assert_true(nx.is_isomorphic(G,null)) - G=strong_product(P10,null) - assert_true(nx.is_isomorphic(G,null)) - -def test_strong_product_size(): - K5=nx.complete_graph(5) - P5=nx.path_graph(5) - K3 = nx.complete_graph(3) - G=strong_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=strong_product(K3,K5) - assert_equal(nx.number_of_nodes(G),3*5) - -def test_strong_product_combinations(): - P5=nx.path_graph(5) - K3 = nx.complete_graph(3) - G=strong_product(P5,K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=strong_product(nx.MultiGraph(P5),K3) - assert_equal(nx.number_of_nodes(G),5*3) - G=strong_product(P5,nx.MultiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - G=strong_product(nx.MultiGraph(P5),nx.MultiGraph(K3)) - assert_equal(nx.number_of_nodes(G),5*3) - - - - #No classic easily found classic results for strong product -def test_strong_product_random(): - G = nx.erdos_renyi_graph(10,2/10.) - H = nx.erdos_renyi_graph(10,2/10.) - GH = strong_product(G,H) - - for (u_G,u_H) in GH.nodes_iter(): - for (v_G,v_H) in GH.nodes_iter(): - if (u_G==v_G and H.has_edge(u_H,v_H)) or \ - (u_H==v_H and G.has_edge(u_G,v_G)) or \ - (G.has_edge(u_G,v_G) and H.has_edge(u_H,v_H)): - assert_true(GH.has_edge((u_G,u_H),(v_G,v_H))) - else: - assert_true(not GH.has_edge((u_G,u_H),(v_G,v_H))) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_unary.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_unary.py deleted file mode 100644 index ea10d75..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/tests/test_unary.py +++ /dev/null @@ -1,47 +0,0 @@ -from nose.tools import * -import networkx as nx -from networkx import * - - -def test_complement(): - null=null_graph() - empty1=empty_graph(1) - empty10=empty_graph(10) - K3=complete_graph(3) - K5=complete_graph(5) - K10=complete_graph(10) - P2=path_graph(2) - P3=path_graph(3) - P5=path_graph(5) - P10=path_graph(10) - #complement of the complete graph is empty - - G=complement(K3) - assert_true(is_isomorphic(G,empty_graph(3))) - G=complement(K5) - assert_true(is_isomorphic(G,empty_graph(5))) - # for any G, G=complement(complement(G)) - P3cc=complement(complement(P3)) - assert_true(is_isomorphic(P3,P3cc)) - nullcc=complement(complement(null)) - assert_true(is_isomorphic(null,nullcc)) - b=bull_graph() - bcc=complement(complement(b)) - assert_true(is_isomorphic(b,bcc)) - -def test_complement_2(): - G1=nx.DiGraph() - G1.add_edge('A','B') - G1.add_edge('A','C') - G1.add_edge('A','D') - G1C=complement(G1) - assert_equal(sorted(G1C.edges()), - [('B', 'A'), ('B', 'C'), - ('B', 'D'), ('C', 'A'), ('C', 'B'), - ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C')]) - -def test_reverse1(): - # Other tests for reverse are done by the DiGraph and MultiDigraph. - G1=nx.Graph() - assert_raises(nx.NetworkXError, nx.reverse, G1) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/unary.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/unary.py deleted file mode 100644 index fbbb31e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/unary.py +++ /dev/null @@ -1,69 +0,0 @@ -"""Unary operations on graphs""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import is_string_like -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) -__all__ = ['complement', 'reverse'] - -def complement(G, name=None): - """Return the graph complement of G. - - Parameters - ---------- - G : graph - A NetworkX graph - - name : string - Specify name for new graph - - Returns - ------- - GC : A new graph. - - Notes - ------ - Note that complement() does not create self-loops and also - does not produce parallel edges for MultiGraphs. - - Graph, node, and edge data are not propagated to the new graph. - """ - if name is None: - name="complement(%s)"%(G.name) - R=G.__class__() - R.name=name - R.add_nodes_from(G) - R.add_edges_from( ((n,n2) - for n,nbrs in G.adjacency_iter() - for n2 in G if n2 not in nbrs - if n != n2) ) - return R - -def reverse(G, copy=True): - """Return the reverse directed graph of G. - - Parameters - ---------- - G : directed graph - A NetworkX directed graph - copy : bool - If True, then a new graph is returned. If False, then the graph is - reversed in place. - - Returns - ------- - H : directed graph - The reversed G. - - """ - if not G.is_directed(): - raise nx.NetworkXError("Cannot reverse an undirected graph.") - else: - return G.reverse(copy=copy) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/richclub.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/richclub.py deleted file mode 100644 index 5701806..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/richclub.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding: utf-8 -*- -import networkx as nx -__author__ = """\n""".join(['Ben Edwards', - 'Aric Hagberg <hagberg@lanl.gov>']) - -__all__ = ['rich_club_coefficient'] - -def rich_club_coefficient(G, normalized=True, Q=100): - """Return the rich-club coefficient of the graph G. - - The rich-club coefficient is the ratio, for every degree k, of the - number of actual to the number of potential edges for nodes - with degree greater than k: - - .. math:: - - \\phi(k) = \\frac{2 Ek}{Nk(Nk-1)} - - where Nk is the number of nodes with degree larger than k, and Ek - be the number of edges among those nodes. - - Parameters - ---------- - G : NetworkX graph - normalized : bool (optional) - Normalize using randomized network (see [1]_) - Q : float (optional, default=100) - If normalized=True build a random network by performing - Q*M double-edge swaps, where M is the number of edges in G, - to use as a null-model for normalization. - - Returns - ------- - rc : dictionary - A dictionary, keyed by degree, with rich club coefficient values. - - Examples - -------- - >>> G = nx.Graph([(0,1),(0,2),(1,2),(1,3),(1,4),(4,5)]) - >>> rc = nx.rich_club_coefficient(G,normalized=False) - >>> rc[0] # doctest: +SKIP - 0.4 - - Notes - ------ - The rich club definition and algorithm are found in [1]_. This - algorithm ignores any edge weights and is not defined for directed - graphs or graphs with parallel edges or self loops. - - Estimates for appropriate values of Q are found in [2]_. - - References - ---------- - .. [1] Julian J. McAuley, Luciano da Fontoura Costa, and Tibério S. Caetano, - "The rich-club phenomenon across complex network hierarchies", - Applied Physics Letters Vol 91 Issue 8, August 2007. - http://arxiv.org/abs/physics/0701290 - .. [2] R. Milo, N. Kashtan, S. Itzkovitz, M. E. J. Newman, U. Alon, - "Uniform generation of random graphs with arbitrary degree - sequences", 2006. http://arxiv.org/abs/cond-mat/0312028 - """ - if G.is_multigraph() or G.is_directed(): - raise Exception('rich_club_coefficient is not implemented for ', - 'directed or multiedge graphs.') - if len(G.selfloop_edges()) > 0: - raise Exception('rich_club_coefficient is not implemented for ', - 'graphs with self loops.') - rc=_compute_rc(G) - if normalized: - # make R a copy of G, randomize with Q*|E| double edge swaps - # and use rich_club coefficient of R to normalize - R = G.copy() - E = R.number_of_edges() - nx.double_edge_swap(R,Q*E,max_tries=Q*E*10) - rcran=_compute_rc(R) - for d in rc: -# if rcran[d] > 0: - rc[d]/=rcran[d] - return rc - - -def _compute_rc(G): - # compute rich club coefficient for all k degrees in G - deghist = nx.degree_histogram(G) - total = sum(deghist) - # number of nodes with degree > k (omit last entry which is zero) - nks = [total-cs for cs in nx.utils.cumulative_sum(deghist) if total-cs > 1] - deg=G.degree() - edge_degrees=sorted(sorted((deg[u],deg[v])) for u,v in G.edges_iter()) - ek=G.number_of_edges() - k1,k2=edge_degrees.pop(0) - rc={} - for d,nk in zip(range(len(nks)),nks): - while k1 <= d: - if len(edge_degrees)==0: - break - k1,k2=edge_degrees.pop(0) - ek-=1 - rc[d] = 2.0*ek/(nk*(nk-1)) - return rc - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/__init__.py deleted file mode 100644 index 64846eb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from networkx.algorithms.shortest_paths.generic import * -from networkx.algorithms.shortest_paths.unweighted import * -from networkx.algorithms.shortest_paths.weighted import * -from networkx.algorithms.shortest_paths.astar import * -from networkx.algorithms.shortest_paths.dense import * - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/astar.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/astar.py deleted file mode 100644 index 7b25d64..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/astar.py +++ /dev/null @@ -1,159 +0,0 @@ -# -*- coding: utf-8 -*- -"""Shortest paths and path lengths using A* ("A star") algorithm. -""" - -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -from heapq import heappush, heappop -from networkx import NetworkXError -import networkx as nx - -__author__ = "\n".join(["Salim Fadhley <salimfadhley@gmail.com>", - "Matteo Dell'Amico <matteodellamico@gmail.com>"]) -__all__ = ['astar_path', 'astar_path_length'] - - -def astar_path(G, source, target, heuristic=None, weight='weight'): - """Return a list of nodes in a shortest path between source and target - using the A* ("A-star") algorithm. - - There may be more than one shortest path. This returns only one. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path - - target : node - Ending node for path - - heuristic : function - A function to evaluate the estimate of the distance - from the a node to the target. The function takes - two nodes arguments and must return a number. - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> print(nx.astar_path(G,0,4)) - [0, 1, 2, 3, 4] - >>> G=nx.grid_graph(dim=[3,3]) # nodes are two-tuples (x,y) - >>> def dist(a, b): - ... (x1, y1) = a - ... (x2, y2) = b - ... return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 - >>> print(nx.astar_path(G,(0,0),(2,2),dist)) - [(0, 0), (0, 1), (1, 1), (1, 2), (2, 2)] - - - See Also - -------- - shortest_path, dijkstra_path - - """ - if G.is_multigraph(): - raise NetworkXError("astar_path() not implemented for Multi(Di)Graphs") - - if heuristic is None: - # The default heuristic is h=0 - same as Dijkstra's algorithm - def heuristic(u, v): - return 0 - # The queue stores priority, node, cost to reach, and parent. - # Uses Python heapq to keep in priority order. - # Add each node's hash to the queue to prevent the underlying heap from - # attempting to compare the nodes themselves. The hash breaks ties in the - # priority and is guarenteed unique for all nodes in the graph. - queue = [(0, hash(source), source, 0, None)] - - # Maps enqueued nodes to distance of discovered paths and the - # computed heuristics to target. We avoid computing the heuristics - # more than once and inserting the node into the queue too many times. - enqueued = {} - # Maps explored nodes to parent closest to the source. - explored = {} - - while queue: - # Pop the smallest item from queue. - _, __, curnode, dist, parent = heappop(queue) - - if curnode == target: - path = [curnode] - node = parent - while node is not None: - path.append(node) - node = explored[node] - path.reverse() - return path - - if curnode in explored: - continue - - explored[curnode] = parent - - for neighbor, w in G[curnode].items(): - if neighbor in explored: - continue - ncost = dist + w.get(weight, 1) - if neighbor in enqueued: - qcost, h = enqueued[neighbor] - # if qcost < ncost, a longer path to neighbor remains - # enqueued. Removing it would need to filter the whole - # queue, it's better just to leave it there and ignore - # it when we visit the node a second time. - if qcost <= ncost: - continue - else: - h = heuristic(neighbor, target) - enqueued[neighbor] = ncost, h - heappush(queue, (ncost + h, hash(neighbor), neighbor, - ncost, curnode)) - - raise nx.NetworkXNoPath("Node %s not reachable from %s" % (source, target)) - - -def astar_path_length(G, source, target, heuristic=None, weight='weight'): - """Return the length of the shortest path between source and target using - the A* ("A-star") algorithm. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path - - target : node - Ending node for path - - heuristic : function - A function to evaluate the estimate of the distance - from the a node to the target. The function takes - two nodes arguments and must return a number. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - See Also - -------- - astar_path - - """ - path = astar_path(G, source, target, heuristic, weight) - return sum(G[u][v].get(weight, 1) for u, v in zip(path[:-1], path[1:])) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/dense.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/dense.py deleted file mode 100644 index 4dccae6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/dense.py +++ /dev/null @@ -1,156 +0,0 @@ -# -*- coding: utf-8 -*- -"""Floyd-Warshall algorithm for shortest paths. -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """Aric Hagberg <aric.hagberg@gmail.com>""" -__all__ = ['floyd_warshall', - 'floyd_warshall_predecessor_and_distance', - 'floyd_warshall_numpy'] - -def floyd_warshall_numpy(G, nodelist=None, weight='weight'): - """Find all-pairs shortest path lengths using Floyd's algorithm. - - Parameters - ---------- - G : NetworkX graph - - nodelist : list, optional - The rows and columns are ordered by the nodes in nodelist. - If nodelist is None then the ordering is produced by G.nodes(). - - weight: string, optional (default= 'weight') - Edge data key corresponding to the edge weight. - - Returns - ------- - distance : NumPy matrix - A matrix of shortest path distances between nodes. - If there is no path between to nodes the corresponding matrix entry - will be Inf. - - Notes - ------ - Floyd's algorithm is appropriate for finding shortest paths in - dense graphs or graphs with negative weights when Dijkstra's - algorithm fails. This algorithm can still fail if there are - negative cycles. It has running time O(n^3) with running space of O(n^2). - """ - try: - import numpy as np - except ImportError: - raise ImportError(\ - "to_numpy_matrix() requires numpy: http://scipy.org/ ") - A = nx.to_numpy_matrix(G, nodelist=nodelist, multigraph_weight=min, - weight=weight) - n,m = A.shape - I = np.identity(n) - A[A==0] = np.inf # set zero entries to inf - A[I==1] = 0 # except diagonal which should be zero - for i in range(n): - A = np.minimum(A, A[i,:] + A[:,i]) - return A - -def floyd_warshall_predecessor_and_distance(G, weight='weight'): - """Find all-pairs shortest path lengths using Floyd's algorithm. - - Parameters - ---------- - G : NetworkX graph - - weight: string, optional (default= 'weight') - Edge data key corresponding to the edge weight. - - Returns - ------- - predecessor,distance : dictionaries - Dictionaries, keyed by source and target, of predecessors and distances - in the shortest path. - - Notes - ------ - Floyd's algorithm is appropriate for finding shortest paths - in dense graphs or graphs with negative weights when Dijkstra's algorithm - fails. This algorithm can still fail if there are negative cycles. - It has running time O(n^3) with running space of O(n^2). - - See Also - -------- - floyd_warshall - floyd_warshall_numpy - all_pairs_shortest_path - all_pairs_shortest_path_length - """ - from collections import defaultdict - # dictionary-of-dictionaries representation for dist and pred - # use some defaultdict magick here - # for dist the default is the floating point inf value - dist = defaultdict(lambda : defaultdict(lambda: float('inf'))) - for u in G: - dist[u][u] = 0 - pred = defaultdict(dict) - # initialize path distance dictionary to be the adjacency matrix - # also set the distance to self to 0 (zero diagonal) - undirected = not G.is_directed() - for u,v,d in G.edges(data=True): - e_weight = d.get(weight, 1.0) - dist[u][v] = min(e_weight, dist[u][v]) - pred[u][v] = u - if undirected: - dist[v][u] = min(e_weight, dist[v][u]) - pred[v][u] = v - for w in G: - for u in G: - for v in G: - if dist[u][v] > dist[u][w] + dist[w][v]: - dist[u][v] = dist[u][w] + dist[w][v] - pred[u][v] = pred[w][v] - return dict(pred),dict(dist) - - -def floyd_warshall(G, weight='weight'): - """Find all-pairs shortest path lengths using Floyd's algorithm. - - Parameters - ---------- - G : NetworkX graph - - weight: string, optional (default= 'weight') - Edge data key corresponding to the edge weight. - - - Returns - ------- - distance : dict - A dictionary, keyed by source and target, of shortest paths distances - between nodes. - - Notes - ------ - Floyd's algorithm is appropriate for finding shortest paths - in dense graphs or graphs with negative weights when Dijkstra's algorithm - fails. This algorithm can still fail if there are negative cycles. - It has running time O(n^3) with running space of O(n^2). - - See Also - -------- - floyd_warshall_predecessor_and_distance - floyd_warshall_numpy - all_pairs_shortest_path - all_pairs_shortest_path_length - """ - # could make this its own function to reduce memory costs - return floyd_warshall_predecessor_and_distance(G, weight=weight)[1] - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/generic.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/generic.py deleted file mode 100644 index a337cbb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/generic.py +++ /dev/null @@ -1,392 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Compute the shortest paths and path lengths between nodes in the graph. - -These algorithms work with undirected and directed graphs. - -For directed graphs the paths can be computed in the reverse -order by first flipping the edge orientation using R=G.reverse(copy=False). - -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Sérgio Nery Simões <sergionery@gmail.com>']) -__all__ = ['shortest_path', 'all_shortest_paths', - 'shortest_path_length', 'average_shortest_path_length', - 'has_path'] - -def has_path(G, source, target): - """Return True if G has a path from source to target, False otherwise. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path - - target : node - Ending node for path - """ - try: - sp = nx.shortest_path(G,source, target) - except nx.NetworkXNoPath: - return False - return True - - -def shortest_path(G, source=None, target=None, weight=None): - """Compute shortest paths in the graph. - - Parameters - ---------- - G : NetworkX graph - - source : node, optional - Starting node for path. - If not specified, compute shortest paths using all nodes as source nodes. - - target : node, optional - Ending node for path. - If not specified, compute shortest paths using all nodes as target nodes. - - weight : None or string, optional (default = None) - If None, every edge has weight/distance/cost 1. - If a string, use this edge attribute as the edge weight. - Any edge attribute not present defaults to 1. - - Returns - ------- - path: list or dictionary - All returned paths include both the source and target in the path. - - If the source and target are both specified, return a single list - of nodes in a shortest path from the source to the target. - - If only the source is specified, return a dictionary keyed by - targets with a list of nodes in a shortest path from the source - to one of the targets. - - If only the target is specified, return a dictionary keyed by - sources with a list of nodes in a shortest path from one of the - sources to the target. - - If neither the source nor target are specified return a dictionary - of dictionaries with path[source][target]=[list of nodes in path]. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> print(nx.shortest_path(G,source=0,target=4)) - [0, 1, 2, 3, 4] - >>> p=nx.shortest_path(G,source=0) # target not specified - >>> p[4] - [0, 1, 2, 3, 4] - >>> p=nx.shortest_path(G,target=4) # source not specified - >>> p[0] - [0, 1, 2, 3, 4] - >>> p=nx.shortest_path(G) # source,target not specified - >>> p[0][4] - [0, 1, 2, 3, 4] - - Notes - ----- - There may be more than one shortest path between a source and target. - This returns only one of them. - - For digraphs this returns a shortest directed path. To find paths in the - reverse direction first use G.reverse(copy=False) to flip the edge - orientation. - - See Also - -------- - all_pairs_shortest_path() - all_pairs_dijkstra_path() - single_source_shortest_path() - single_source_dijkstra_path() - """ - if source is None: - if target is None: - ## Find paths between all pairs. - if weight is None: - paths=nx.all_pairs_shortest_path(G) - else: - paths=nx.all_pairs_dijkstra_path(G,weight=weight) - else: - ## Find paths from all nodes co-accessible to the target. - directed = G.is_directed() - if directed: - G.reverse(copy=False) - - if weight is None: - paths=nx.single_source_shortest_path(G,target) - else: - paths=nx.single_source_dijkstra_path(G,target,weight=weight) - - # Now flip the paths so they go from a source to the target. - for target in paths: - paths[target] = list(reversed(paths[target])) - - if directed: - G.reverse(copy=False) - else: - if target is None: - ## Find paths to all nodes accessible from the source. - if weight is None: - paths=nx.single_source_shortest_path(G,source) - else: - paths=nx.single_source_dijkstra_path(G,source,weight=weight) - else: - ## Find shortest source-target path. - if weight is None: - paths=nx.bidirectional_shortest_path(G,source,target) - else: - paths=nx.dijkstra_path(G,source,target,weight) - - return paths - - -def shortest_path_length(G, source=None, target=None, weight=None): - """Compute shortest path lengths in the graph. - - Parameters - ---------- - G : NetworkX graph - - source : node, optional - Starting node for path. - If not specified, compute shortest path lengths using all nodes as - source nodes. - - target : node, optional - Ending node for path. - If not specified, compute shortest path lengths using all nodes as - target nodes. - - weight : None or string, optional (default = None) - If None, every edge has weight/distance/cost 1. - If a string, use this edge attribute as the edge weight. - Any edge attribute not present defaults to 1. - - Returns - ------- - length: int or dictionary - If the source and target are both specified, return the length of - the shortest path from the source to the target. - - If only the source is specified, return a dictionary keyed by - targets whose values are the lengths of the shortest path from the - source to one of the targets. - - If only the target is specified, return a dictionary keyed by - sources whose values are the lengths of the shortest path from one - of the sources to the target. - - If neither the source nor target are specified return a dictionary - of dictionaries with path[source][target]=L, where L is the length - of the shortest path from source to target. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> print(nx.shortest_path_length(G,source=0,target=4)) - 4 - >>> p=nx.shortest_path_length(G,source=0) # target not specified - >>> p[4] - 4 - >>> p=nx.shortest_path_length(G,target=4) # source not specified - >>> p[0] - 4 - >>> p=nx.shortest_path_length(G) # source,target not specified - >>> p[0][4] - 4 - - Notes - ----- - The length of the path is always 1 less than the number of nodes involved - in the path since the length measures the number of edges followed. - - For digraphs this returns the shortest directed path length. To find path - lengths in the reverse direction use G.reverse(copy=False) first to flip - the edge orientation. - - See Also - -------- - all_pairs_shortest_path_length() - all_pairs_dijkstra_path_length() - single_source_shortest_path_length() - single_source_dijkstra_path_length() - - """ - if source is None: - if target is None: - ## Find paths between all pairs. - if weight is None: - paths=nx.all_pairs_shortest_path_length(G) - else: - paths=nx.all_pairs_dijkstra_path_length(G, weight=weight) - else: - ## Find paths from all nodes co-accessible to the target. - directed = G.is_directed() - if directed: - G.reverse(copy=False) - - if weight is None: - paths=nx.single_source_shortest_path_length(G,target) - else: - paths=nx.single_source_dijkstra_path_length(G,target, - weight=weight) - - if directed: - G.reverse(copy=False) - else: - if target is None: - ## Find paths to all nodes accessible from the source. - if weight is None: - paths=nx.single_source_shortest_path_length(G,source) - else: - paths=nx.single_source_dijkstra_path_length(G,source,weight=weight) - else: - ## Find shortest source-target path. - if weight is None: - p=nx.bidirectional_shortest_path(G,source,target) - paths=len(p)-1 - else: - paths=nx.dijkstra_path_length(G,source,target,weight) - return paths - - -def average_shortest_path_length(G, weight=None): - r"""Return the average shortest path length. - - The average shortest path length is - - .. math:: - - a =\sum_{s,t \in V} \frac{d(s, t)}{n(n-1)} - - where `V` is the set of nodes in `G`, - `d(s, t)` is the shortest path from `s` to `t`, - and `n` is the number of nodes in `G`. - - Parameters - ---------- - G : NetworkX graph - - weight : None or string, optional (default = None) - If None, every edge has weight/distance/cost 1. - If a string, use this edge attribute as the edge weight. - Any edge attribute not present defaults to 1. - - Raises - ------ - NetworkXError: - if the graph is not connected. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> print(nx.average_shortest_path_length(G)) - 2.0 - - For disconnected graphs you can compute the average shortest path - length for each component: - >>> G=nx.Graph([(1,2),(3,4)]) - >>> for g in nx.connected_component_subgraphs(G): - ... print(nx.average_shortest_path_length(g)) - 1.0 - 1.0 - - """ - if G.is_directed(): - if not nx.is_weakly_connected(G): - raise nx.NetworkXError("Graph is not connected.") - else: - if not nx.is_connected(G): - raise nx.NetworkXError("Graph is not connected.") - avg=0.0 - if weight is None: - for node in G: - path_length=nx.single_source_shortest_path_length(G, node) - avg += sum(path_length.values()) - else: - for node in G: - path_length=nx.single_source_dijkstra_path_length(G, node, weight=weight) - avg += sum(path_length.values()) - n=len(G) - return avg/(n*(n-1)) - - -def all_shortest_paths(G, source, target, weight=None): - """Compute all shortest paths in the graph. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path. - - target : node - Ending node for path. - - weight : None or string, optional (default = None) - If None, every edge has weight/distance/cost 1. - If a string, use this edge attribute as the edge weight. - Any edge attribute not present defaults to 1. - - Returns - ------- - paths: generator of lists - A generator of all paths between source and target. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_path([0,1,2]) - >>> G.add_path([0,10,2]) - >>> print([p for p in nx.all_shortest_paths(G,source=0,target=2)]) - [[0, 1, 2], [0, 10, 2]] - - Notes - ----- - There may be many shortest paths between the source and target. - - See Also - -------- - shortest_path() - single_source_shortest_path() - all_pairs_shortest_path() - """ - if weight is not None: - pred,dist = nx.dijkstra_predecessor_and_distance(G,source,weight=weight) - else: - pred = nx.predecessor(G,source) - if target not in pred: - raise nx.NetworkXNoPath() - stack = [[target,0]] - top = 0 - while top >= 0: - node,i = stack[top] - if node == source: - yield [p for p,n in reversed(stack[:top+1])] - if len(pred[node]) > i: - top += 1 - if top == len(stack): - stack.append([pred[node][i],0]) - else: - stack[top] = [pred[node][i],0] - else: - stack[top-1][1] += 1 - top -= 1 diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_astar.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_astar.py deleted file mode 100644 index 81ba6ab..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_astar.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from random import random, choice - -class TestAStar: - - def setUp(self): - self.XG=nx.DiGraph() - self.XG.add_edges_from([('s','u',{'weight':10}), - ('s','x',{'weight':5}), - ('u','v',{'weight':1}), - ('u','x',{'weight':2}), - ('v','y',{'weight':1}), - ('x','u',{'weight':3}), - ('x','v',{'weight':5}), - ('x','y',{'weight':2}), - ('y','s',{'weight':7}), - ('y','v',{'weight':6})]) - - def test_random_graph(self): - - def dist(a, b): - (x1, y1) = a - (x2, y2) = b - return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 - - G = nx.Graph() - - points = [(random(), random()) for _ in range(100)] - - # Build a path from points[0] to points[-1] to be sure it exists - for p1, p2 in zip(points[:-1], points[1:]): - G.add_edge(p1, p2, weight=dist(p1, p2)) - - # Add other random edges - for _ in range(100): - p1, p2 = choice(points), choice(points) - G.add_edge(p1, p2, weight=dist(p1, p2)) - - path = nx.astar_path(G, points[0], points[-1], dist) - assert path == nx.dijkstra_path(G, points[0], points[-1]) - - def test_astar_directed(self): - assert nx.astar_path(self.XG,'s','v')==['s', 'x', 'u', 'v'] - assert nx.astar_path_length(self.XG,'s','v')==9 - - def test_astar_multigraph(self): - G=nx.MultiDiGraph(self.XG) - assert_raises((TypeError,nx.NetworkXError), - nx.astar_path, [G,'s','v']) - assert_raises((TypeError,nx.NetworkXError), - nx.astar_path_length, [G,'s','v']) - - def test_astar_undirected(self): - GG=self.XG.to_undirected() - # make sure we get lower weight - # to_undirected might choose either edge with weight 2 or weight 3 - GG['u']['x']['weight']=2 - GG['y']['v']['weight'] = 2 - assert_equal(nx.astar_path(GG,'s','v'),['s', 'x', 'u', 'v']) - assert_equal(nx.astar_path_length(GG,'s','v'),8) - - def test_astar_directed2(self): - XG2=nx.DiGraph() - XG2.add_edges_from([[1,4,{'weight':1}], - [4,5,{'weight':1}], - [5,6,{'weight':1}], - [6,3,{'weight':1}], - [1,3,{'weight':50}], - [1,2,{'weight':100}], - [2,3,{'weight':100}]]) - assert nx.astar_path(XG2,1,3)==[1, 4, 5, 6, 3] - - def test_astar_undirected2(self): - XG3=nx.Graph() - XG3.add_edges_from([ [0,1,{'weight':2}], - [1,2,{'weight':12}], - [2,3,{'weight':1}], - [3,4,{'weight':5}], - [4,5,{'weight':1}], - [5,0,{'weight':10}] ]) - assert nx.astar_path(XG3,0,3)==[0, 1, 2, 3] - assert nx.astar_path_length(XG3,0,3)==15 - - - def test_astar_undirected3(self): - XG4=nx.Graph() - XG4.add_edges_from([ [0,1,{'weight':2}], - [1,2,{'weight':2}], - [2,3,{'weight':1}], - [3,4,{'weight':1}], - [4,5,{'weight':1}], - [5,6,{'weight':1}], - [6,7,{'weight':1}], - [7,0,{'weight':1}] ]) - assert nx.astar_path(XG4,0,2)==[0, 1, 2] - assert nx.astar_path_length(XG4,0,2)==4 - - -# >>> MXG4=NX.MultiGraph(XG4) -# >>> MXG4.add_edge(0,1,3) -# >>> NX.dijkstra_path(MXG4,0,2) -# [0, 1, 2] - - def test_astar_w1(self): - G=nx.DiGraph() - G.add_edges_from([('s','u'), ('s','x'), ('u','v'), ('u','x'), - ('v','y'), ('x','u'), ('x','w'), ('w', 'v'), ('x','y'), - ('y','s'), ('y','v')]) - assert nx.astar_path(G,'s','v')==['s', 'u', 'v'] - assert nx.astar_path_length(G,'s','v')== 2 - - @raises(nx.NetworkXNoPath) - def test_astar_nopath(self): - p = nx.astar_path(self.XG,'s','moon') - - def test_cycle(self): - C=nx.cycle_graph(7) - assert nx.astar_path(C,0,3)==[0, 1, 2, 3] - assert nx.dijkstra_path(C,0,4)==[0, 6, 5, 4] - - - def test_orderable(self): - class UnorderableClass: pass - node_1 = UnorderableClass() - node_2 = UnorderableClass() - node_3 = UnorderableClass() - node_4 = UnorderableClass() - G = nx.Graph() - G.add_edge(node_1, node_2) - G.add_edge(node_1, node_3) - G.add_edge(node_2, node_4) - G.add_edge(node_3, node_4) - path=nx.algorithms.shortest_paths.astar.astar_path(G, node_1, node_4) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_dense.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_dense.py deleted file mode 100644 index 6c170da..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_dense.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx as nx - -class TestFloyd: - def setUp(self): - pass - - def test_floyd_warshall_predecessor_and_distance(self): - XG=nx.DiGraph() - XG.add_weighted_edges_from([('s','u',10) ,('s','x',5) , - ('u','v',1) ,('u','x',2) , - ('v','y',1) ,('x','u',3) , - ('x','v',5) ,('x','y',2) , - ('y','s',7) ,('y','v',6)]) - path, dist =nx.floyd_warshall_predecessor_and_distance(XG) - assert_equal(dist['s']['v'],9) - assert_equal(path['s']['v'],'u') - assert_equal(dist, - {'y': {'y': 0, 'x': 12, 's': 7, 'u': 15, 'v': 6}, - 'x': {'y': 2, 'x': 0, 's': 9, 'u': 3, 'v': 4}, - 's': {'y': 7, 'x': 5, 's': 0, 'u': 8, 'v': 9}, - 'u': {'y': 2, 'x': 2, 's': 9, 'u': 0, 'v': 1}, - 'v': {'y': 1, 'x': 13, 's': 8, 'u': 16, 'v': 0}}) - - - GG=XG.to_undirected() - # make sure we get lower weight - # to_undirected might choose either edge with weight 2 or weight 3 - GG['u']['x']['weight']=2 - path, dist = nx.floyd_warshall_predecessor_and_distance(GG) - assert_equal(dist['s']['v'],8) - # skip this test, could be alternate path s-u-v -# assert_equal(path['s']['v'],'y') - - G=nx.DiGraph() # no weights - G.add_edges_from([('s','u'), ('s','x'), - ('u','v'), ('u','x'), - ('v','y'), ('x','u'), - ('x','v'), ('x','y'), - ('y','s'), ('y','v')]) - path, dist = nx.floyd_warshall_predecessor_and_distance(G) - assert_equal(dist['s']['v'],2) - # skip this test, could be alternate path s-u-v - # assert_equal(path['s']['v'],'x') - - # alternate interface - dist = nx.floyd_warshall(G) - assert_equal(dist['s']['v'],2) - - def test_cycle(self): - path, dist = nx.floyd_warshall_predecessor_and_distance(nx.cycle_graph(7)) - assert_equal(dist[0][3],3) - assert_equal(path[0][3],2) - assert_equal(dist[0][4],3) - - def test_weighted(self): - XG3=nx.Graph() - XG3.add_weighted_edges_from([ [0,1,2],[1,2,12],[2,3,1], - [3,4,5],[4,5,1],[5,0,10] ]) - path, dist = nx.floyd_warshall_predecessor_and_distance(XG3) - assert_equal(dist[0][3],15) - assert_equal(path[0][3],2) - - def test_weighted2(self): - XG4=nx.Graph() - XG4.add_weighted_edges_from([ [0,1,2],[1,2,2],[2,3,1], - [3,4,1],[4,5,1],[5,6,1], - [6,7,1],[7,0,1] ]) - path, dist = nx.floyd_warshall_predecessor_and_distance(XG4) - assert_equal(dist[0][2],4) - assert_equal(path[0][2],1) - - def test_weight_parameter(self): - XG4 = nx.Graph() - XG4.add_edges_from([ (0, 1, {'heavy': 2}), (1, 2, {'heavy': 2}), - (2, 3, {'heavy': 1}), (3, 4, {'heavy': 1}), - (4, 5, {'heavy': 1}), (5, 6, {'heavy': 1}), - (6, 7, {'heavy': 1}), (7, 0, {'heavy': 1}) ]) - path, dist = nx.floyd_warshall_predecessor_and_distance(XG4, - weight='heavy') - assert_equal(dist[0][2], 4) - assert_equal(path[0][2], 1) - - def test_zero_distance(self): - XG=nx.DiGraph() - XG.add_weighted_edges_from([('s','u',10) ,('s','x',5) , - ('u','v',1) ,('u','x',2) , - ('v','y',1) ,('x','u',3) , - ('x','v',5) ,('x','y',2) , - ('y','s',7) ,('y','v',6)]) - path, dist =nx.floyd_warshall_predecessor_and_distance(XG) - - for u in XG: - assert_equal(dist[u][u], 0) - - GG=XG.to_undirected() - # make sure we get lower weight - # to_undirected might choose either edge with weight 2 or weight 3 - GG['u']['x']['weight']=2 - path, dist = nx.floyd_warshall_predecessor_and_distance(GG) - - for u in GG: - dist[u][u] = 0 - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py deleted file mode 100644 index 2fa0b67..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx as nx - -class TestFloydNumpy(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global numpy - global assert_equal - global assert_almost_equal - try: - import numpy - from numpy.testing import assert_equal,assert_almost_equal - except ImportError: - raise SkipTest('NumPy not available.') - - def test_cycle_numpy(self): - dist = nx.floyd_warshall_numpy(nx.cycle_graph(7)) - assert_equal(dist[0,3],3) - assert_equal(dist[0,4],3) - - def test_weighted_numpy(self): - XG3=nx.Graph() - XG3.add_weighted_edges_from([ [0,1,2],[1,2,12],[2,3,1], - [3,4,5],[4,5,1],[5,0,10] ]) - dist = nx.floyd_warshall_numpy(XG3) - assert_equal(dist[0,3],15) - - def test_weighted_numpy(self): - XG4=nx.Graph() - XG4.add_weighted_edges_from([ [0,1,2],[1,2,2],[2,3,1], - [3,4,1],[4,5,1],[5,6,1], - [6,7,1],[7,0,1] ]) - dist = nx.floyd_warshall_numpy(XG4) - assert_equal(dist[0,2],4) - - def test_weight_parameter_numpy(self): - XG4 = nx.Graph() - XG4.add_edges_from([ (0, 1, {'heavy': 2}), (1, 2, {'heavy': 2}), - (2, 3, {'heavy': 1}), (3, 4, {'heavy': 1}), - (4, 5, {'heavy': 1}), (5, 6, {'heavy': 1}), - (6, 7, {'heavy': 1}), (7, 0, {'heavy': 1}) ]) - dist = nx.floyd_warshall_numpy(XG4, weight='heavy') - assert_equal(dist[0, 2], 4) - - def test_directed_cycle_numpy(self): - G = nx.DiGraph() - G.add_cycle([0,1,2,3]) - pred,dist = nx.floyd_warshall_predecessor_and_distance(G) - D = nx.utils.dict_to_numpy_array(dist) - assert_equal(nx.floyd_warshall_numpy(G),D) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_generic.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_generic.py deleted file mode 100644 index edaa9f9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_generic.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestGenericPath: - - def setUp(self): - from networkx import convert_node_labels_to_integers as cnlti - self.grid=cnlti(nx.grid_2d_graph(4,4),first_label=1,ordering="sorted") - self.cycle=nx.cycle_graph(7) - self.directed_cycle=nx.cycle_graph(7,create_using=nx.DiGraph()) - - - def test_shortest_path(self): - assert_equal(nx.shortest_path(self.cycle,0,3),[0, 1, 2, 3]) - assert_equal(nx.shortest_path(self.cycle,0,4),[0, 6, 5, 4]) - assert_equal(nx.shortest_path(self.grid,1,12),[1, 2, 3, 4, 8, 12]) - assert_equal(nx.shortest_path(self.directed_cycle,0,3),[0, 1, 2, 3]) - # now with weights - assert_equal(nx.shortest_path(self.cycle,0,3,weight='weight'),[0, 1, 2, 3]) - assert_equal(nx.shortest_path(self.cycle,0,4,weight='weight'),[0, 6, 5, 4]) - assert_equal(nx.shortest_path(self.grid,1,12,weight='weight'),[1, 2, 3, 4, 8, 12]) - assert_equal(nx.shortest_path(self.directed_cycle,0,3,weight='weight'), - [0, 1, 2, 3]) - - def test_shortest_path_target(self): - sp = nx.shortest_path(nx.path_graph(3), target=1) - assert_equal(sp, {0: [0, 1], 1: [1], 2: [2, 1]}) - - def test_shortest_path_length(self): - assert_equal(nx.shortest_path_length(self.cycle,0,3),3) - assert_equal(nx.shortest_path_length(self.grid,1,12),5) - assert_equal(nx.shortest_path_length(self.directed_cycle,0,4),4) - # now with weights - assert_equal(nx.shortest_path_length(self.cycle,0,3,weight='weight'),3) - assert_equal(nx.shortest_path_length(self.grid,1,12,weight='weight'),5) - assert_equal(nx.shortest_path_length(self.directed_cycle,0,4,weight='weight'),4) - - def test_shortest_path_length_target(self): - sp = nx.shortest_path_length(nx.path_graph(3), target=1) - assert_equal(sp[0], 1) - assert_equal(sp[1], 0) - assert_equal(sp[2], 1) - - def test_single_source_shortest_path(self): - p=nx.shortest_path(self.cycle,0) - assert_equal(p[3],[0,1,2,3]) - assert_equal(p,nx.single_source_shortest_path(self.cycle,0)) - p=nx.shortest_path(self.grid,1) - assert_equal(p[12],[1, 2, 3, 4, 8, 12]) - # now with weights - p=nx.shortest_path(self.cycle,0,weight='weight') - assert_equal(p[3],[0,1,2,3]) - assert_equal(p,nx.single_source_dijkstra_path(self.cycle,0)) - p=nx.shortest_path(self.grid,1,weight='weight') - assert_equal(p[12],[1, 2, 3, 4, 8, 12]) - - - def test_single_source_shortest_path_length(self): - l=nx.shortest_path_length(self.cycle,0) - assert_equal(l,{0:0,1:1,2:2,3:3,4:3,5:2,6:1}) - assert_equal(l,nx.single_source_shortest_path_length(self.cycle,0)) - l=nx.shortest_path_length(self.grid,1) - assert_equal(l[16],6) - # now with weights - l=nx.shortest_path_length(self.cycle,0,weight='weight') - assert_equal(l,{0:0,1:1,2:2,3:3,4:3,5:2,6:1}) - assert_equal(l,nx.single_source_dijkstra_path_length(self.cycle,0)) - l=nx.shortest_path_length(self.grid,1,weight='weight') - assert_equal(l[16],6) - - - def test_all_pairs_shortest_path(self): - p=nx.shortest_path(self.cycle) - assert_equal(p[0][3],[0,1,2,3]) - assert_equal(p,nx.all_pairs_shortest_path(self.cycle)) - p=nx.shortest_path(self.grid) - assert_equal(p[1][12],[1, 2, 3, 4, 8, 12]) - # now with weights - p=nx.shortest_path(self.cycle,weight='weight') - assert_equal(p[0][3],[0,1,2,3]) - assert_equal(p,nx.all_pairs_dijkstra_path(self.cycle)) - p=nx.shortest_path(self.grid,weight='weight') - assert_equal(p[1][12],[1, 2, 3, 4, 8, 12]) - - - def test_all_pairs_shortest_path_length(self): - l=nx.shortest_path_length(self.cycle) - assert_equal(l[0],{0:0,1:1,2:2,3:3,4:3,5:2,6:1}) - assert_equal(l,nx.all_pairs_shortest_path_length(self.cycle)) - l=nx.shortest_path_length(self.grid) - assert_equal(l[1][16],6) - # now with weights - l=nx.shortest_path_length(self.cycle,weight='weight') - assert_equal(l[0],{0:0,1:1,2:2,3:3,4:3,5:2,6:1}) - assert_equal(l,nx.all_pairs_dijkstra_path_length(self.cycle)) - l=nx.shortest_path_length(self.grid,weight='weight') - assert_equal(l[1][16],6) - - def test_average_shortest_path(self): - l=nx.average_shortest_path_length(self.cycle) - assert_almost_equal(l,2) - l=nx.average_shortest_path_length(nx.path_graph(5)) - assert_almost_equal(l,2) - - - def test_weighted_average_shortest_path(self): - G=nx.Graph() - G.add_cycle(range(7),weight=2) - l=nx.average_shortest_path_length(G,weight='weight') - assert_almost_equal(l,4) - G=nx.Graph() - G.add_path(range(5),weight=2) - l=nx.average_shortest_path_length(G,weight='weight') - assert_almost_equal(l,4) - - - def test_average_shortest_disconnected(self): - g = nx.Graph() - g.add_nodes_from(range(3)) - g.add_edge(0, 1) - assert_raises(nx.NetworkXError,nx.average_shortest_path_length,g) - g = g.to_directed() - assert_raises(nx.NetworkXError,nx.average_shortest_path_length,g) - - def test_has_path(self): - G = nx.Graph() - G.add_path(range(3)) - G.add_path(range(3,5)) - assert_true(nx.has_path(G,0,2)) - assert_false(nx.has_path(G,0,4)) - - def test_all_shortest_paths(self): - G = nx.Graph() - G.add_path([0,1,2,3]) - G.add_path([0,10,20,3]) - assert_equal([[0,1,2,3],[0,10,20,3]], - sorted(nx.all_shortest_paths(G,0,3))) - - @raises(nx.NetworkXNoPath) - def test_all_shortest_paths_raise(self): - G = nx.Graph() - G.add_path([0,1,2,3]) - G.add_node(4) - paths = list(nx.all_shortest_paths(G,0,4)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_unweighted.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_unweighted.py deleted file mode 100644 index fc2abfb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_unweighted.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestUnweightedPath: - - def setUp(self): - from networkx import convert_node_labels_to_integers as cnlti - self.grid=cnlti(nx.grid_2d_graph(4,4),first_label=1,ordering="sorted") - self.cycle=nx.cycle_graph(7) - self.directed_cycle=nx.cycle_graph(7,create_using=nx.DiGraph()) - - - def test_bidirectional_shortest_path(self): - assert_equal(nx.bidirectional_shortest_path(self.cycle,0,3), - [0, 1, 2, 3]) - assert_equal(nx.bidirectional_shortest_path(self.cycle,0,4), - [0, 6, 5, 4]) - assert_equal(nx.bidirectional_shortest_path(self.grid,1,12), - [1, 2, 3, 4, 8, 12]) - assert_equal(nx.bidirectional_shortest_path(self.directed_cycle,0,3), - [0, 1, 2, 3]) - - def test_shortest_path_length(self): - assert_equal(nx.shortest_path_length(self.cycle,0,3),3) - assert_equal(nx.shortest_path_length(self.grid,1,12),5) - assert_equal(nx.shortest_path_length(self.directed_cycle,0,4),4) - # now with weights - assert_equal(nx.shortest_path_length(self.cycle,0,3,weight=True),3) - assert_equal(nx.shortest_path_length(self.grid,1,12,weight=True),5) - assert_equal(nx.shortest_path_length(self.directed_cycle,0,4,weight=True),4) - - - def test_single_source_shortest_path(self): - p=nx.single_source_shortest_path(self.cycle,0) - assert_equal(p[3],[0,1,2,3]) - p=nx.single_source_shortest_path(self.cycle,0, cutoff=0) - assert_equal(p,{0 : [0]}) - - def test_single_source_shortest_path_length(self): - assert_equal(nx.single_source_shortest_path_length(self.cycle,0), - {0:0,1:1,2:2,3:3,4:3,5:2,6:1}) - - def test_all_pairs_shortest_path(self): - p=nx.all_pairs_shortest_path(self.cycle) - assert_equal(p[0][3],[0,1,2,3]) - p=nx.all_pairs_shortest_path(self.grid) - assert_equal(p[1][12],[1, 2, 3, 4, 8, 12]) - - def test_all_pairs_shortest_path_length(self): - l=nx.all_pairs_shortest_path_length(self.cycle) - assert_equal(l[0],{0:0,1:1,2:2,3:3,4:3,5:2,6:1}) - l=nx.all_pairs_shortest_path_length(self.grid) - assert_equal(l[1][16],6) - - def test_predecessor(self): - G=nx.path_graph(4) - assert_equal(nx.predecessor(G,0),{0: [], 1: [0], 2: [1], 3: [2]}) - assert_equal(nx.predecessor(G,0,3),[2]) - G=nx.grid_2d_graph(2,2) - assert_equal(sorted(nx.predecessor(G,(0,0)).items()), - [((0, 0), []), ((0, 1), [(0, 0)]), - ((1, 0), [(0, 0)]), ((1, 1), [(0, 1), (1, 0)])]) - - def test_predecessor_cutoff(self): - G=nx.path_graph(4) - p = nx.predecessor(G,0,3) - assert_false(4 in p) - - def test_predecessor_target(self): - G=nx.path_graph(4) - p = nx.predecessor(G,0,3) - assert_equal(p,[2]) - p = nx.predecessor(G,0,3,cutoff=2) - assert_equal(p,[]) - p,s = nx.predecessor(G,0,3,return_seen=True) - assert_equal(p,[2]) - assert_equal(s,3) - p,s = nx.predecessor(G,0,3,cutoff=2,return_seen=True) - assert_equal(p,[]) - assert_equal(s,-1) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_weighted.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_weighted.py deleted file mode 100644 index c3998d4..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/tests/test_weighted.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestWeightedPath: - - def setUp(self): - from networkx import convert_node_labels_to_integers as cnlti - self.grid=cnlti(nx.grid_2d_graph(4,4),first_label=1,ordering="sorted") - self.cycle=nx.cycle_graph(7) - self.directed_cycle=nx.cycle_graph(7,create_using=nx.DiGraph()) - self.XG=nx.DiGraph() - self.XG.add_weighted_edges_from([('s','u',10) ,('s','x',5) , - ('u','v',1) ,('u','x',2) , - ('v','y',1) ,('x','u',3) , - ('x','v',5) ,('x','y',2) , - ('y','s',7) ,('y','v',6)]) - self.MXG=nx.MultiDiGraph(self.XG) - self.MXG.add_edge('s','u',weight=15) - self.XG2=nx.DiGraph() - self.XG2.add_weighted_edges_from([[1,4,1],[4,5,1], - [5,6,1],[6,3,1], - [1,3,50],[1,2,100],[2,3,100]]) - - self.XG3=nx.Graph() - self.XG3.add_weighted_edges_from([ [0,1,2],[1,2,12], - [2,3,1],[3,4,5], - [4,5,1],[5,0,10] ]) - - self.XG4=nx.Graph() - self.XG4.add_weighted_edges_from([ [0,1,2],[1,2,2], - [2,3,1],[3,4,1], - [4,5,1],[5,6,1], - [6,7,1],[7,0,1] ]) - self.MXG4=nx.MultiGraph(self.XG4) - self.MXG4.add_edge(0,1,weight=3) - self.G=nx.DiGraph() # no weights - self.G.add_edges_from([('s','u'), ('s','x'), - ('u','v'), ('u','x'), - ('v','y'), ('x','u'), - ('x','v'), ('x','y'), - ('y','s'), ('y','v')]) - - def test_dijkstra(self): - (D,P)= nx.single_source_dijkstra(self.XG,'s') - assert_equal(P['v'], ['s', 'x', 'u', 'v']) - assert_equal(D['v'],9) - - assert_equal(nx.single_source_dijkstra_path(self.XG,'s')['v'], - ['s', 'x', 'u', 'v']) - assert_equal(nx.single_source_dijkstra_path_length(self.XG,'s')['v'],9) - - assert_equal(nx.single_source_dijkstra(self.XG,'s')[1]['v'], - ['s', 'x', 'u', 'v']) - - assert_equal(nx.single_source_dijkstra_path(self.MXG,'s')['v'], - ['s', 'x', 'u', 'v']) - - GG=self.XG.to_undirected() - # make sure we get lower weight - # to_undirected might choose either edge with weight 2 or weight 3 - GG['u']['x']['weight']=2 - (D,P)= nx.single_source_dijkstra(GG,'s') - assert_equal(P['v'] , ['s', 'x', 'u', 'v']) - assert_equal(D['v'],8) # uses lower weight of 2 on u<->x edge - assert_equal(nx.dijkstra_path(GG,'s','v'), ['s', 'x', 'u', 'v']) - assert_equal(nx.dijkstra_path_length(GG,'s','v'),8) - - assert_equal(nx.dijkstra_path(self.XG2,1,3), [1, 4, 5, 6, 3]) - assert_equal(nx.dijkstra_path(self.XG3,0,3), [0, 1, 2, 3]) - assert_equal(nx.dijkstra_path_length(self.XG3,0,3),15) - assert_equal(nx.dijkstra_path(self.XG4,0,2), [0, 1, 2]) - assert_equal(nx.dijkstra_path_length(self.XG4,0,2), 4) - assert_equal(nx.dijkstra_path(self.MXG4,0,2), [0, 1, 2]) - assert_equal(nx.single_source_dijkstra(self.G,'s','v')[1]['v'], - ['s', 'u', 'v']) - assert_equal(nx.single_source_dijkstra(self.G,'s')[1]['v'], - ['s', 'u', 'v']) - - assert_equal(nx.dijkstra_path(self.G,'s','v'), ['s', 'u', 'v']) - assert_equal(nx.dijkstra_path_length(self.G,'s','v'), 2) - - # NetworkXError: node s not reachable from moon - assert_raises(nx.NetworkXNoPath,nx.dijkstra_path,self.G,'s','moon') - assert_raises(nx.NetworkXNoPath,nx.dijkstra_path_length,self.G,'s','moon') - - assert_equal(nx.dijkstra_path(self.cycle,0,3),[0, 1, 2, 3]) - assert_equal(nx.dijkstra_path(self.cycle,0,4), [0, 6, 5, 4]) - - assert_equal(nx.single_source_dijkstra(self.cycle,0,0),({0:0}, {0:[0]}) ) - - def test_bidirectional_dijkstra(self): - assert_equal(nx.bidirectional_dijkstra(self.XG, 's', 'v'), - (9, ['s', 'x', 'u', 'v'])) - (dist,path) = nx.bidirectional_dijkstra(self.G,'s','v') - assert_equal(dist,2) - # skip this test, correct path could also be ['s','u','v'] -# assert_equal(nx.bidirectional_dijkstra(self.G,'s','v'), -# (2, ['s', 'x', 'v'])) - assert_equal(nx.bidirectional_dijkstra(self.cycle,0,3), - (3, [0, 1, 2, 3])) - assert_equal(nx.bidirectional_dijkstra(self.cycle,0,4), - (3, [0, 6, 5, 4])) - assert_equal(nx.bidirectional_dijkstra(self.XG3,0,3), - (15, [0, 1, 2, 3])) - assert_equal(nx.bidirectional_dijkstra(self.XG4,0,2), - (4, [0, 1, 2])) - - # need more tests here - assert_equal(nx.dijkstra_path(self.XG,'s','v'), - nx.single_source_dijkstra_path(self.XG,'s')['v']) - - - @raises(nx.NetworkXNoPath) - def test_bidirectional_dijkstra_no_path(self): - G = nx.Graph() - G.add_path([1,2,3]) - G.add_path([4,5,6]) - path = nx.bidirectional_dijkstra(G,1,6) - - def test_dijkstra_predecessor(self): - G=nx.path_graph(4) - assert_equal(nx.dijkstra_predecessor_and_distance(G,0), - ({0: [], 1: [0], 2: [1], 3: [2]}, {0: 0, 1: 1, 2: 2, 3: 3})) - G=nx.grid_2d_graph(2,2) - pred,dist=nx.dijkstra_predecessor_and_distance(G,(0,0)) - assert_equal(sorted(pred.items()), - [((0, 0), []), ((0, 1), [(0, 0)]), - ((1, 0), [(0, 0)]), ((1, 1), [(0, 1), (1, 0)])]) - assert_equal(sorted(dist.items()), - [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 2)]) - - XG=nx.DiGraph() - XG.add_weighted_edges_from([('s','u',10) ,('s','x',5) , - ('u','v',1) ,('u','x',2) , - ('v','y',1) ,('x','u',3) , - ('x','v',5) ,('x','y',2) , - ('y','s',7) ,('y','v',6)]) - (P,D)= nx.dijkstra_predecessor_and_distance(XG,'s') - assert_equal(P['v'],['u']) - assert_equal(D['v'],9) - (P,D)= nx.dijkstra_predecessor_and_distance(XG,'s',cutoff=8) - assert_false('v' in D) - - def test_single_source_dijkstra_path_length(self): - pl = nx.single_source_dijkstra_path_length - assert_equal(pl(self.MXG4,0)[2], 4) - spl = pl(self.MXG4,0,cutoff=2) - assert_false(2 in spl) - - def test_bidirectional_dijkstra_multigraph(self): - G = nx.MultiGraph() - G.add_edge('a', 'b', weight=10) - G.add_edge('a', 'b', weight=100) - dp= nx.bidirectional_dijkstra(G, 'a', 'b') - assert_equal(dp,(10, ['a', 'b'])) - - - def test_dijkstra_pred_distance_multigraph(self): - G = nx.MultiGraph() - G.add_edge('a', 'b', key='short',foo=5, weight=100) - G.add_edge('a', 'b', key='long',bar=1, weight=110) - p,d= nx.dijkstra_predecessor_and_distance(G, 'a') - assert_equal(p,{'a': [], 'b': ['a']}) - assert_equal(d,{'a': 0, 'b': 100}) - - def test_negative_edge_cycle(self): - G = nx.cycle_graph(5, create_using = nx.DiGraph()) - assert_equal(nx.negative_edge_cycle(G), False) - G.add_edge(8, 9, weight = -7) - G.add_edge(9, 8, weight = 3) - assert_equal(nx.negative_edge_cycle(G), True) - assert_raises(ValueError,nx.single_source_dijkstra_path_length,G,8) - assert_raises(ValueError,nx.single_source_dijkstra,G,8) - assert_raises(ValueError,nx.dijkstra_predecessor_and_distance,G,8) - G.add_edge(9,10) - assert_raises(ValueError,nx.bidirectional_dijkstra,G,8,10) - - def test_bellman_ford(self): - # single node graph - G = nx.DiGraph() - G.add_node(0) - assert_equal(nx.bellman_ford(G, 0), ({0: None}, {0: 0})) - assert_raises(KeyError, nx.bellman_ford, G, 1) - - # negative weight cycle - G = nx.cycle_graph(5, create_using = nx.DiGraph()) - G.add_edge(1, 2, weight = -7) - for i in range(5): - assert_raises(nx.NetworkXUnbounded, nx.bellman_ford, G, i) - G = nx.cycle_graph(5) # undirected Graph - G.add_edge(1, 2, weight = -3) - for i in range(5): - assert_raises(nx.NetworkXUnbounded, nx.bellman_ford, G, i) - # no negative cycle but negative weight - G = nx.cycle_graph(5, create_using = nx.DiGraph()) - G.add_edge(1, 2, weight = -3) - assert_equal(nx.bellman_ford(G, 0), - ({0: None, 1: 0, 2: 1, 3: 2, 4: 3}, - {0: 0, 1: 1, 2: -2, 3: -1, 4: 0})) - - # not connected - G = nx.complete_graph(6) - G.add_edge(10, 11) - G.add_edge(10, 12) - assert_equal(nx.bellman_ford(G, 0), - ({0: None, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}, - {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1})) - - # not connected, with a component not containing the source that - # contains a negative cost cycle. - G = nx.complete_graph(6) - G.add_edges_from([('A', 'B', {'load': 3}), - ('B', 'C', {'load': -10}), - ('C', 'A', {'load': 2})]) - assert_equal(nx.bellman_ford(G, 0, weight = 'load'), - ({0: None, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}, - {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1})) - - # multigraph - P, D = nx.bellman_ford(self.MXG,'s') - assert_equal(P['v'], 'u') - assert_equal(D['v'], 9) - P, D = nx.bellman_ford(self.MXG4, 0) - assert_equal(P[2], 1) - assert_equal(D[2], 4) - - # other tests - (P,D)= nx.bellman_ford(self.XG,'s') - assert_equal(P['v'], 'u') - assert_equal(D['v'], 9) - - G=nx.path_graph(4) - assert_equal(nx.bellman_ford(G,0), - ({0: None, 1: 0, 2: 1, 3: 2}, {0: 0, 1: 1, 2: 2, 3: 3})) - assert_equal(nx.bellman_ford(G, 3), - ({0: 1, 1: 2, 2: 3, 3: None}, {0: 3, 1: 2, 2: 1, 3: 0})) - - G=nx.grid_2d_graph(2,2) - pred,dist=nx.bellman_ford(G,(0,0)) - assert_equal(sorted(pred.items()), - [((0, 0), None), ((0, 1), (0, 0)), - ((1, 0), (0, 0)), ((1, 1), (0, 1))]) - assert_equal(sorted(dist.items()), - [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 2)]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/unweighted.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/unweighted.py deleted file mode 100644 index b7ce18a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/unweighted.py +++ /dev/null @@ -1,359 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Shortest path algorithms for unweighted graphs. -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['bidirectional_shortest_path', - 'single_source_shortest_path', - 'single_source_shortest_path_length', - 'all_pairs_shortest_path', - 'all_pairs_shortest_path_length', - 'predecessor'] - - -import networkx as nx - -def single_source_shortest_path_length(G,source,cutoff=None): - """Compute the shortest path lengths from source to all reachable nodes. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path - - cutoff : integer, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - lengths : dictionary - Dictionary of shortest path lengths keyed by target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> length=nx.single_source_shortest_path_length(G,0) - >>> length[4] - 4 - >>> print(length) - {0: 0, 1: 1, 2: 2, 3: 3, 4: 4} - - See Also - -------- - shortest_path_length - """ - seen={} # level (number of hops) when seen in BFS - level=0 # the current level - nextlevel={source:1} # dict of nodes to check at next level - while nextlevel: - thislevel=nextlevel # advance to next level - nextlevel={} # and start a new list (fringe) - for v in thislevel: - if v not in seen: - seen[v]=level # set the level of vertex v - nextlevel.update(G[v]) # add neighbors of v - if (cutoff is not None and cutoff <= level): break - level=level+1 - return seen # return all path lengths as dictionary - - -def all_pairs_shortest_path_length(G,cutoff=None): - """ Compute the shortest path lengths between all nodes in G. - - Parameters - ---------- - G : NetworkX graph - - cutoff : integer, optional - depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - lengths : dictionary - Dictionary of shortest path lengths keyed by source and target. - - Notes - ----- - The dictionary returned only has keys for reachable node pairs. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> length=nx.all_pairs_shortest_path_length(G) - >>> print(length[1][4]) - 3 - >>> length[1] - {0: 1, 1: 0, 2: 1, 3: 2, 4: 3} - - """ - paths={} - for n in G: - paths[n]=single_source_shortest_path_length(G,n,cutoff=cutoff) - return paths - - - - -def bidirectional_shortest_path(G,source,target): - """Return a list of nodes in a shortest path between source and target. - - Parameters - ---------- - G : NetworkX graph - - source : node label - starting node for path - - target : node label - ending node for path - - Returns - ------- - path: list - List of nodes in a path from source to target. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - See Also - -------- - shortest_path - - Notes - ----- - This algorithm is used by shortest_path(G,source,target). - """ - # call helper to do the real work - results=_bidirectional_pred_succ(G,source,target) - pred,succ,w=results - - # build path from pred+w+succ - path=[] - # from w to target - while w is not None: - path.append(w) - w=succ[w] - # from source to w - w=pred[path[0]] - while w is not None: - path.insert(0,w) - w=pred[w] - - return path - -def _bidirectional_pred_succ(G, source, target): - """Bidirectional shortest path helper. - - Returns (pred,succ,w) where - pred is a dictionary of predecessors from w to the source, and - succ is a dictionary of successors from w to the target. - """ - # does BFS from both source and target and meets in the middle - if target == source: - return ({target:None},{source:None},source) - - # handle either directed or undirected - if G.is_directed(): - Gpred=G.predecessors_iter - Gsucc=G.successors_iter - else: - Gpred=G.neighbors_iter - Gsucc=G.neighbors_iter - - # predecesssor and successors in search - pred={source:None} - succ={target:None} - - # initialize fringes, start with forward - forward_fringe=[source] - reverse_fringe=[target] - - while forward_fringe and reverse_fringe: - if len(forward_fringe) <= len(reverse_fringe): - this_level=forward_fringe - forward_fringe=[] - for v in this_level: - for w in Gsucc(v): - if w not in pred: - forward_fringe.append(w) - pred[w]=v - if w in succ: return pred,succ,w # found path - else: - this_level=reverse_fringe - reverse_fringe=[] - for v in this_level: - for w in Gpred(v): - if w not in succ: - succ[w]=v - reverse_fringe.append(w) - if w in pred: return pred,succ,w # found path - - raise nx.NetworkXNoPath("No path between %s and %s." % (source, target)) - - -def single_source_shortest_path(G,source,cutoff=None): - """Compute shortest path between source - and all other nodes reachable from source. - - Parameters - ---------- - G : NetworkX graph - - source : node label - Starting node for path - - cutoff : integer, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - lengths : dictionary - Dictionary, keyed by target, of shortest paths. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> path=nx.single_source_shortest_path(G,0) - >>> path[4] - [0, 1, 2, 3, 4] - - Notes - ----- - The shortest path is not necessarily unique. So there can be multiple - paths between the source and each target node, all of which have the - same 'shortest' length. For each target node, this function returns - only one of those paths. - - See Also - -------- - shortest_path - """ - level=0 # the current level - nextlevel={source:1} # list of nodes to check at next level - paths={source:[source]} # paths dictionary (paths to key from source) - if cutoff==0: - return paths - while nextlevel: - thislevel=nextlevel - nextlevel={} - for v in thislevel: - for w in G[v]: - if w not in paths: - paths[w]=paths[v]+[w] - nextlevel[w]=1 - level=level+1 - if (cutoff is not None and cutoff <= level): break - return paths - - -def all_pairs_shortest_path(G,cutoff=None): - """ Compute shortest paths between all nodes. - - Parameters - ---------- - G : NetworkX graph - - cutoff : integer, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - lengths : dictionary - Dictionary, keyed by source and target, of shortest paths. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> path=nx.all_pairs_shortest_path(G) - >>> print(path[0][4]) - [0, 1, 2, 3, 4] - - See Also - -------- - floyd_warshall() - - """ - paths={} - for n in G: - paths[n]=single_source_shortest_path(G,n,cutoff=cutoff) - return paths - - - - -def predecessor(G,source,target=None,cutoff=None,return_seen=None): - """ Returns dictionary of predecessors for the path from source to all nodes in G. - - - Parameters - ---------- - G : NetworkX graph - - source : node label - Starting node for path - - target : node label, optional - Ending node for path. If provided only predecessors between - source and target are returned - - cutoff : integer, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - - Returns - ------- - pred : dictionary - Dictionary, keyed by node, of predecessors in the shortest path. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> print(G.nodes()) - [0, 1, 2, 3] - >>> nx.predecessor(G,0) - {0: [], 1: [0], 2: [1], 3: [2]} - - """ - level=0 # the current level - nextlevel=[source] # list of nodes to check at next level - seen={source:level} # level (number of hops) when seen in BFS - pred={source:[]} # predecessor dictionary - while nextlevel: - level=level+1 - thislevel=nextlevel - nextlevel=[] - for v in thislevel: - for w in G[v]: - if w not in seen: - pred[w]=[v] - seen[w]=level - nextlevel.append(w) - elif (seen[w]==level):# add v to predecessor list if it - pred[w].append(v) # is at the correct level - if (cutoff and cutoff <= level): - break - - if target is not None: - if return_seen: - if not target in pred: return ([],-1) # No predecessor - return (pred[target],seen[target]) - else: - if not target in pred: return [] # No predecessor - return pred[target] - else: - if return_seen: - return (pred,seen) - else: - return pred - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/weighted.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/weighted.py deleted file mode 100644 index 41757f9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/shortest_paths/weighted.py +++ /dev/null @@ -1,765 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Shortest path algorithms for weighed graphs. -""" -__author__ = """\n""".join(['Aric Hagberg <hagberg@lanl.gov>', - 'Loïc Séguin-C. <loicseguin@gmail.com>', - 'Dan Schult <dschult@colgate.edu>']) -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['dijkstra_path', - 'dijkstra_path_length', - 'bidirectional_dijkstra', - 'single_source_dijkstra', - 'single_source_dijkstra_path', - 'single_source_dijkstra_path_length', - 'all_pairs_dijkstra_path', - 'all_pairs_dijkstra_path_length', - 'dijkstra_predecessor_and_distance', - 'bellman_ford','negative_edge_cycle'] - -import heapq -import networkx as nx -from networkx.utils import generate_unique_node - -def dijkstra_path(G, source, target, weight='weight'): - """Returns the shortest path from source to target in a weighted graph G. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node - - target : node - Ending node - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - Returns - ------- - path : list - List of nodes in a shortest path. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> print(nx.dijkstra_path(G,0,4)) - [0, 1, 2, 3, 4] - - Notes - ------ - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - See Also - -------- - bidirectional_dijkstra() - """ - (length,path)=single_source_dijkstra(G, source, target=target, - weight=weight) - try: - return path[target] - except KeyError: - raise nx.NetworkXNoPath("node %s not reachable from %s"%(source,target)) - - -def dijkstra_path_length(G, source, target, weight='weight'): - """Returns the shortest path length from source to target - in a weighted graph. - - Parameters - ---------- - G : NetworkX graph - - source : node label - starting node for path - - target : node label - ending node for path - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - Returns - ------- - length : number - Shortest path length. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> print(nx.dijkstra_path_length(G,0,4)) - 4 - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - See Also - -------- - bidirectional_dijkstra() - """ - length=single_source_dijkstra_path_length(G, source, weight=weight) - try: - return length[target] - except KeyError: - raise nx.NetworkXNoPath("node %s not reachable from %s"%(source,target)) - - -def single_source_dijkstra_path(G,source, cutoff=None, weight='weight'): - """Compute shortest path between source and all other reachable - nodes for a weighted graph. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path. - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - cutoff : integer or float, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - paths : dictionary - Dictionary of shortest path lengths keyed by target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> path=nx.single_source_dijkstra_path(G,0) - >>> path[4] - [0, 1, 2, 3, 4] - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - See Also - -------- - single_source_dijkstra() - - """ - (length,path)=single_source_dijkstra(G,source, cutoff = cutoff, weight = weight) - return path - - -def single_source_dijkstra_path_length(G, source, cutoff= None, - weight= 'weight'): - """Compute the shortest path length between source and all other - reachable nodes for a weighted graph. - - Parameters - ---------- - G : NetworkX graph - - source : node label - Starting node for path - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight. - - cutoff : integer or float, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - length : dictionary - Dictionary of shortest lengths keyed by target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> length=nx.single_source_dijkstra_path_length(G,0) - >>> length[4] - 4 - >>> print(length) - {0: 0, 1: 1, 2: 2, 3: 3, 4: 4} - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - See Also - -------- - single_source_dijkstra() - - """ - dist = {} # dictionary of final distances - seen = {source:0} - fringe=[] # use heapq with (distance,label) tuples - heapq.heappush(fringe,(0,source)) - while fringe: - (d,v)=heapq.heappop(fringe) - if v in dist: - continue # already searched this node. - dist[v] = d - #for ignore,w,edgedata in G.edges_iter(v,data=True): - #is about 30% slower than the following - if G.is_multigraph(): - edata=[] - for w,keydata in G[v].items(): - minweight=min((dd.get(weight,1) - for k,dd in keydata.items())) - edata.append((w,{weight:minweight})) - else: - edata=iter(G[v].items()) - - for w,edgedata in edata: - vw_dist = dist[v] + edgedata.get(weight,1) - if cutoff is not None: - if vw_dist>cutoff: - continue - if w in dist: - if vw_dist < dist[w]: - raise ValueError('Contradictory paths found:', - 'negative weights?') - elif w not in seen or vw_dist < seen[w]: - seen[w] = vw_dist - heapq.heappush(fringe,(vw_dist,w)) - return dist - - -def single_source_dijkstra(G,source,target=None,cutoff=None,weight='weight'): - """Compute shortest paths and lengths in a weighted graph G. - - Uses Dijkstra's algorithm for shortest paths. - - Parameters - ---------- - G : NetworkX graph - - source : node label - Starting node for path - - target : node label, optional - Ending node for path - - cutoff : integer or float, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - distance,path : dictionaries - Returns a tuple of two dictionaries keyed by node. - The first dictionary stores distance from the source. - The second stores the path from the source to that node. - - - Examples - -------- - >>> G=nx.path_graph(5) - >>> length,path=nx.single_source_dijkstra(G,0) - >>> print(length[4]) - 4 - >>> print(length) - {0: 0, 1: 1, 2: 2, 3: 3, 4: 4} - >>> path[4] - [0, 1, 2, 3, 4] - - Notes - --------- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - Based on the Python cookbook recipe (119466) at - http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/119466 - - This algorithm is not guaranteed to work if edge weights - are negative or are floating point numbers - (overflows and roundoff errors can cause problems). - - See Also - -------- - single_source_dijkstra_path() - single_source_dijkstra_path_length() - """ - if source==target: - return ({source:0}, {source:[source]}) - dist = {} # dictionary of final distances - paths = {source:[source]} # dictionary of paths - seen = {source:0} - fringe=[] # use heapq with (distance,label) tuples - heapq.heappush(fringe,(0,source)) - while fringe: - (d,v)=heapq.heappop(fringe) - if v in dist: - continue # already searched this node. - dist[v] = d - if v == target: - break - #for ignore,w,edgedata in G.edges_iter(v,data=True): - #is about 30% slower than the following - if G.is_multigraph(): - edata=[] - for w,keydata in G[v].items(): - minweight=min((dd.get(weight,1) - for k,dd in keydata.items())) - edata.append((w,{weight:minweight})) - else: - edata=iter(G[v].items()) - - for w,edgedata in edata: - vw_dist = dist[v] + edgedata.get(weight,1) - if cutoff is not None: - if vw_dist>cutoff: - continue - if w in dist: - if vw_dist < dist[w]: - raise ValueError('Contradictory paths found:', - 'negative weights?') - elif w not in seen or vw_dist < seen[w]: - seen[w] = vw_dist - heapq.heappush(fringe,(vw_dist,w)) - paths[w] = paths[v]+[w] - return (dist,paths) - - -def dijkstra_predecessor_and_distance(G,source, cutoff=None, weight='weight'): - """Compute shortest path length and predecessors on shortest paths - in weighted graphs. - - Parameters - ---------- - G : NetworkX graph - - source : node label - Starting node for path - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - cutoff : integer or float, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - pred,distance : dictionaries - Returns two dictionaries representing a list of predecessors - of a node and the distance to each node. - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - The list of predecessors contains more than one element only when - there are more than one shortest paths to the key node. - """ - push=heapq.heappush - pop=heapq.heappop - dist = {} # dictionary of final distances - pred = {source:[]} # dictionary of predecessors - seen = {source:0} - fringe=[] # use heapq with (distance,label) tuples - push(fringe,(0,source)) - while fringe: - (d,v)=pop(fringe) - if v in dist: continue # already searched this node. - dist[v] = d - if G.is_multigraph(): - edata=[] - for w,keydata in G[v].items(): - minweight=min((dd.get(weight,1) - for k,dd in keydata.items())) - edata.append((w,{weight:minweight})) - else: - edata=iter(G[v].items()) - for w,edgedata in edata: - vw_dist = dist[v] + edgedata.get(weight,1) - if cutoff is not None: - if vw_dist>cutoff: - continue - if w in dist: - if vw_dist < dist[w]: - raise ValueError('Contradictory paths found:', - 'negative weights?') - elif w not in seen or vw_dist < seen[w]: - seen[w] = vw_dist - push(fringe,(vw_dist,w)) - pred[w] = [v] - elif vw_dist==seen[w]: - pred[w].append(v) - return (pred,dist) - - -def all_pairs_dijkstra_path_length(G, cutoff=None, weight='weight'): - """ Compute shortest path lengths between all nodes in a weighted graph. - - Parameters - ---------- - G : NetworkX graph - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - cutoff : integer or float, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - distance : dictionary - Dictionary, keyed by source and target, of shortest path lengths. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> length=nx.all_pairs_dijkstra_path_length(G) - >>> print(length[1][4]) - 3 - >>> length[1] - {0: 1, 1: 0, 2: 1, 3: 2, 4: 3} - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - The dictionary returned only has keys for reachable node pairs. - """ - paths={} - for n in G: - paths[n]=single_source_dijkstra_path_length(G,n, cutoff=cutoff, - weight=weight) - return paths - -def all_pairs_dijkstra_path(G, cutoff=None, weight='weight'): - """ Compute shortest paths between all nodes in a weighted graph. - - Parameters - ---------- - G : NetworkX graph - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - cutoff : integer or float, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - distance : dictionary - Dictionary, keyed by source and target, of shortest paths. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> path=nx.all_pairs_dijkstra_path(G) - >>> print(path[0][4]) - [0, 1, 2, 3, 4] - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - See Also - -------- - floyd_warshall() - - """ - paths={} - for n in G: - paths[n]=single_source_dijkstra_path(G, n, cutoff=cutoff, - weight=weight) - return paths - -def bellman_ford(G, source, weight = 'weight'): - """Compute shortest path lengths and predecessors on shortest paths - in weighted graphs. - - The algorithm has a running time of O(mn) where n is the number of - nodes and m is the number of edges. It is slower than Dijkstra but - can handle negative edge weights. - - Parameters - ---------- - G : NetworkX graph - The algorithm works for all types of graphs, including directed - graphs and multigraphs. - - source: node label - Starting node for path - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - Returns - ------- - pred, dist : dictionaries - Returns two dictionaries keyed by node to predecessor in the - path and to the distance from the source respectively. - - Raises - ------ - NetworkXUnbounded - If the (di)graph contains a negative cost (di)cycle, the - algorithm raises an exception to indicate the presence of the - negative cost (di)cycle. Note: any negative weight edge in an - undirected graph is a negative cost cycle. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.path_graph(5, create_using = nx.DiGraph()) - >>> pred, dist = nx.bellman_ford(G, 0) - >>> pred - {0: None, 1: 0, 2: 1, 3: 2, 4: 3} - >>> dist - {0: 0, 1: 1, 2: 2, 3: 3, 4: 4} - - >>> from nose.tools import assert_raises - >>> G = nx.cycle_graph(5, create_using = nx.DiGraph()) - >>> G[1][2]['weight'] = -7 - >>> assert_raises(nx.NetworkXUnbounded, nx.bellman_ford, G, 0) - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - The dictionaries returned only have keys for nodes reachable from - the source. - - In the case where the (di)graph is not connected, if a component - not containing the source contains a negative cost (di)cycle, it - will not be detected. - - """ - if source not in G: - raise KeyError("Node %s is not found in the graph"%source) - numb_nodes = len(G) - - dist = {source: 0} - pred = {source: None} - - if numb_nodes == 1: - return pred, dist - - if G.is_multigraph(): - def get_weight(edge_dict): - return min([eattr.get(weight,1) for eattr in edge_dict.values()]) - else: - def get_weight(edge_dict): - return edge_dict.get(weight,1) - - for i in range(numb_nodes): - no_changes=True - # Only need edges from nodes in dist b/c all others have dist==inf - for u, dist_u in list(dist.items()): # get all edges from nodes in dist - for v, edict in G[u].items(): # double loop handles undirected too - dist_v = dist_u + get_weight(edict) - if v not in dist or dist[v] > dist_v: - dist[v] = dist_v - pred[v] = u - no_changes = False - if no_changes: - break - else: - raise nx.NetworkXUnbounded("Negative cost cycle detected.") - return pred, dist - -def negative_edge_cycle(G, weight = 'weight'): - """Return True if there exists a negative edge cycle anywhere in G. - - Parameters - ---------- - G : NetworkX graph - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - Returns - ------- - negative_cycle : bool - True if a negative edge cycle exists, otherwise False. - - Examples - -------- - >>> import networkx as nx - >>> G = nx.cycle_graph(5, create_using = nx.DiGraph()) - >>> print(nx.negative_edge_cycle(G)) - False - >>> G[1][2]['weight'] = -7 - >>> print(nx.negative_edge_cycle(G)) - True - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - This algorithm uses bellman_ford() but finds negative cycles - on any component by first adding a new node connected to - every node, and starting bellman_ford on that node. It then - removes that extra node. - """ - newnode = generate_unique_node() - G.add_edges_from([ (newnode,n) for n in G]) - - try: - bellman_ford(G, newnode, weight) - except nx.NetworkXUnbounded: - G.remove_node(newnode) - return True - G.remove_node(newnode) - return False - - -def bidirectional_dijkstra(G, source, target, weight = 'weight'): - """Dijkstra's algorithm for shortest paths using bidirectional search. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node. - - target : node - Ending node. - - weight: string, optional (default='weight') - Edge data key corresponding to the edge weight - - Returns - ------- - length : number - Shortest path length. - - Returns a tuple of two dictionaries keyed by node. - The first dictionary stores distance from the source. - The second stores the path from the source to that node. - - Raises - ------ - NetworkXNoPath - If no path exists between source and target. - - Examples - -------- - >>> G=nx.path_graph(5) - >>> length,path=nx.bidirectional_dijkstra(G,0,4) - >>> print(length) - 4 - >>> print(path) - [0, 1, 2, 3, 4] - - Notes - ----- - Edge weight attributes must be numerical. - Distances are calculated as sums of weighted edges traversed. - - In practice bidirectional Dijkstra is much more than twice as fast as - ordinary Dijkstra. - - Ordinary Dijkstra expands nodes in a sphere-like manner from the - source. The radius of this sphere will eventually be the length - of the shortest path. Bidirectional Dijkstra will expand nodes - from both the source and the target, making two spheres of half - this radius. Volume of the first sphere is pi*r*r while the - others are 2*pi*r/2*r/2, making up half the volume. - - This algorithm is not guaranteed to work if edge weights - are negative or are floating point numbers - (overflows and roundoff errors can cause problems). - - See Also - -------- - shortest_path - shortest_path_length - """ - if source == target: return (0, [source]) - #Init: Forward Backward - dists = [{}, {}]# dictionary of final distances - paths = [{source:[source]}, {target:[target]}] # dictionary of paths - fringe = [[], []] #heap of (distance, node) tuples for extracting next node to expand - seen = [{source:0}, {target:0} ]#dictionary of distances to nodes seen - #initialize fringe heap - heapq.heappush(fringe[0], (0, source)) - heapq.heappush(fringe[1], (0, target)) - #neighs for extracting correct neighbor information - if G.is_directed(): - neighs = [G.successors_iter, G.predecessors_iter] - else: - neighs = [G.neighbors_iter, G.neighbors_iter] - #variables to hold shortest discovered path - #finaldist = 1e30000 - finalpath = [] - dir = 1 - while fringe[0] and fringe[1]: - # choose direction - # dir == 0 is forward direction and dir == 1 is back - dir = 1-dir - # extract closest to expand - (dist, v )= heapq.heappop(fringe[dir]) - if v in dists[dir]: - # Shortest path to v has already been found - continue - # update distance - dists[dir][v] = dist #equal to seen[dir][v] - if v in dists[1-dir]: - # if we have scanned v in both directions we are done - # we have now discovered the shortest path - return (finaldist,finalpath) - - for w in neighs[dir](v): - if(dir==0): #forward - if G.is_multigraph(): - minweight=min((dd.get(weight,1) - for k,dd in G[v][w].items())) - else: - minweight=G[v][w].get(weight,1) - vwLength = dists[dir][v] + minweight #G[v][w].get(weight,1) - else: #back, must remember to change v,w->w,v - if G.is_multigraph(): - minweight=min((dd.get(weight,1) - for k,dd in G[w][v].items())) - else: - minweight=G[w][v].get(weight,1) - vwLength = dists[dir][v] + minweight #G[w][v].get(weight,1) - - if w in dists[dir]: - if vwLength < dists[dir][w]: - raise ValueError("Contradictory paths found: negative weights?") - elif w not in seen[dir] or vwLength < seen[dir][w]: - # relaxing - seen[dir][w] = vwLength - heapq.heappush(fringe[dir], (vwLength,w)) - paths[dir][w] = paths[dir][v]+[w] - if w in seen[0] and w in seen[1]: - #see if this path is better than than the already - #discovered shortest path - totaldist = seen[0][w] + seen[1][w] - if finalpath == [] or finaldist > totaldist: - finaldist = totaldist - revpath = paths[1][w][:] - revpath.reverse() - finalpath = paths[0][w] + revpath[1:] - raise nx.NetworkXNoPath("No path between %s and %s." % (source, target)) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/simple_paths.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/simple_paths.py deleted file mode 100644 index f72d4d2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/simple_paths.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 2012 by -# Sergio Nery Simoes <sergionery@gmail.com> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Sérgio Nery Simões <sergionery@gmail.com>', - 'Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['all_simple_paths'] - -def all_simple_paths(G, source, target, cutoff=None): - """Generate all simple paths in the graph G from source to target. - - A simple path is a path with no repeated nodes. - - Parameters - ---------- - G : NetworkX graph - - source : node - Starting node for path - - target : node - Ending node for path - - cutoff : integer, optional - Depth to stop the search. Only paths of length <= cutoff are returned. - - Returns - ------- - path_generator: generator - A generator that produces lists of simple paths. If there are no paths - between the source and target within the given cutoff the generator - produces no output. - - Examples - -------- - >>> G = nx.complete_graph(4) - >>> for path in nx.all_simple_paths(G, source=0, target=3): - ... print(path) - ... - [0, 1, 2, 3] - [0, 1, 3] - [0, 2, 1, 3] - [0, 2, 3] - [0, 3] - >>> paths = nx.all_simple_paths(G, source=0, target=3, cutoff=2) - >>> print(list(paths)) - [[0, 1, 3], [0, 2, 3], [0, 3]] - - Notes - ----- - This algorithm uses a modified depth-first search to generate the - paths [1]_. A single path can be found in `O(V+E)` time but the - number of simple paths in a graph can be very large, e.g. `O(n!)` in - the complete graph of order n. - - References - ---------- - .. [1] R. Sedgewick, "Algorithms in C, Part 5: Graph Algorithms", - Addison Wesley Professional, 3rd ed., 2001. - - See Also - -------- - all_shortest_paths, shortest_path - """ - if source not in G: - raise nx.NetworkXError('source node %s not in graph'%source) - if target not in G: - raise nx.NetworkXError('target node %s not in graph'%target) - if cutoff is None: - cutoff = len(G)-1 - if G.is_multigraph(): - return _all_simple_paths_multigraph(G, source, target, cutoff=cutoff) - else: - return _all_simple_paths_graph(G, source, target, cutoff=cutoff) - -def _all_simple_paths_graph(G, source, target, cutoff=None): - if cutoff < 1: - return - visited = [source] - stack = [iter(G[source])] - while stack: - children = stack[-1] - child = next(children, None) - if child is None: - stack.pop() - visited.pop() - elif len(visited) < cutoff: - if child == target: - yield visited + [target] - elif child not in visited: - visited.append(child) - stack.append(iter(G[child])) - else: #len(visited) == cutoff: - if child == target or target in children: - yield visited + [target] - stack.pop() - visited.pop() - - -def _all_simple_paths_multigraph(G, source, target, cutoff=None): - if cutoff < 1: - return - visited = [source] - stack = [(v for u,v in G.edges(source))] - while stack: - children = stack[-1] - child = next(children, None) - if child is None: - stack.pop() - visited.pop() - elif len(visited) < cutoff: - if child == target: - yield visited + [target] - elif child not in visited: - visited.append(child) - stack.append((v for u,v in G.edges(child))) - else: #len(visited) == cutoff: - count = ([child]+list(children)).count(target) - for i in range(count): - yield visited + [target] - stack.pop() - visited.pop() diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/smetric.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/smetric.py deleted file mode 100644 index 0e801bf..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/smetric.py +++ /dev/null @@ -1,37 +0,0 @@ -import networkx as nx -#from networkx.generators.smax import li_smax_graph - -def s_metric(G, normalized=True): - """Return the s-metric of graph. - - The s-metric is defined as the sum of the products deg(u)*deg(v) - for every edge (u,v) in G. If norm is provided construct the - s-max graph and compute it's s_metric, and return the normalized - s value - - Parameters - ---------- - G : graph - The graph used to compute the s-metric. - normalized : bool (optional) - Normalize the value. - - Returns - ------- - s : float - The s-metric of the graph. - - References - ---------- - .. [1] Lun Li, David Alderson, John C. Doyle, and Walter Willinger, - Towards a Theory of Scale-Free Graphs: - Definition, Properties, and Implications (Extended Version), 2005. - http://arxiv.org/abs/cond-mat/0501169 - """ - if normalized: - raise nx.NetworkXError("Normalization not implemented") -# Gmax = li_smax_graph(list(G.degree().values())) -# return s_metric(G,normalized=False)/s_metric(Gmax,normalized=False) -# else: - return float(sum([G.degree(u)*G.degree(v) for (u,v) in G.edges_iter()])) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/swap.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/swap.py deleted file mode 100644 index 33d882d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/swap.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -"""Swap edges in a graph. -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import math -import random -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult (dschult@colgate.edu)' - 'Joel Miller (joel.c.miller.research@gmail.com)' - 'Ben Edwards']) - -__all__ = ['double_edge_swap', - 'connected_double_edge_swap'] - - -def double_edge_swap(G, nswap=1, max_tries=100): - """Swap two edges in the graph while keeping the node degrees fixed. - - A double-edge swap removes two randomly chosen edges u-v and x-y - and creates the new edges u-x and v-y:: - - u--v u v - becomes | | - x--y x y - - If either the edge u-x or v-y already exist no swap is performed - and another attempt is made to find a suitable edge pair. - - Parameters - ---------- - G : graph - An undirected graph - - nswap : integer (optional, default=1) - Number of double-edge swaps to perform - - max_tries : integer (optional) - Maximum number of attempts to swap edges - - Returns - ------- - G : graph - The graph after double edge swaps. - - Notes - ----- - Does not enforce any connectivity constraints. - - The graph G is modified in place. - """ - if G.is_directed(): - raise nx.NetworkXError(\ - "double_edge_swap() not defined for directed graphs.") - if nswap>max_tries: - raise nx.NetworkXError("Number of swaps > number of tries allowed.") - if len(G) < 4: - raise nx.NetworkXError("Graph has less than four nodes.") - # Instead of choosing uniformly at random from a generated edge list, - # this algorithm chooses nonuniformly from the set of nodes with - # probability weighted by degree. - n=0 - swapcount=0 - keys,degrees=zip(*G.degree().items()) # keys, degree - cdf=nx.utils.cumulative_distribution(degrees) # cdf of degree - while swapcount < nswap: -# if random.random() < 0.5: continue # trick to avoid periodicities? - # pick two random edges without creating edge list - # choose source node indices from discrete distribution - (ui,xi)=nx.utils.discrete_sequence(2,cdistribution=cdf) - if ui==xi: - continue # same source, skip - u=keys[ui] # convert index to label - x=keys[xi] - # choose target uniformly from neighbors - v=random.choice(list(G[u])) - y=random.choice(list(G[x])) - if v==y: - continue # same target, skip - if (x not in G[u]) and (y not in G[v]): # don't create parallel edges - G.add_edge(u,x) - G.add_edge(v,y) - G.remove_edge(u,v) - G.remove_edge(x,y) - swapcount+=1 - if n >= max_tries: - e=('Maximum number of swap attempts (%s) exceeded '%n + - 'before desired swaps achieved (%s).'%nswap) - raise nx.NetworkXAlgorithmError(e) - n+=1 - return G - -def connected_double_edge_swap(G, nswap=1): - """Attempt nswap double-edge swaps in the graph G. - - A double-edge swap removes two randomly chosen edges u-v and x-y - and creates the new edges u-x and v-y:: - - u--v u v - becomes | | - x--y x y - - If either the edge u-x or v-y already exist no swap is performed so - the actual count of swapped edges is always <= nswap - - Parameters - ---------- - G : graph - An undirected graph - - nswap : integer (optional, default=1) - Number of double-edge swaps to perform - - Returns - ------- - G : int - The number of successful swaps - - Notes - ----- - The initial graph G must be connected, and the resulting graph is connected. - The graph G is modified in place. - - References - ---------- - .. [1] C. Gkantsidis and M. Mihail and E. Zegura, - The Markov chain simulation method for generating connected - power law random graphs, 2003. - http://citeseer.ist.psu.edu/gkantsidis03markov.html - """ - import math - if not nx.is_connected(G): - raise nx.NetworkXError("Graph not connected") - if len(G) < 4: - raise nx.NetworkXError("Graph has less than four nodes.") - n=0 - swapcount=0 - deg=G.degree() - dk=list(deg.keys()) # Label key for nodes - cdf=nx.utils.cumulative_distribution(list(G.degree().values())) - window=1 - while n < nswap: - wcount=0 - swapped=[] - while wcount < window and n < nswap: - # Pick two random edges without creating edge list - # Choose source nodes from discrete degree distribution - (ui,xi)=nx.utils.discrete_sequence(2,cdistribution=cdf) - if ui==xi: - continue # same source, skip - u=dk[ui] # convert index to label - x=dk[xi] - # Choose targets uniformly from neighbors - v=random.choice(G.neighbors(u)) - y=random.choice(G.neighbors(x)) # - if v==y: continue # same target, skip - if (not G.has_edge(u,x)) and (not G.has_edge(v,y)): - G.remove_edge(u,v) - G.remove_edge(x,y) - G.add_edge(u,x) - G.add_edge(v,y) - swapped.append((u,v,x,y)) - swapcount+=1 - n+=1 - wcount+=1 - if nx.is_connected(G): - window+=1 - else: - # not connected, undo changes from previous window, decrease window - while swapped: - (u,v,x,y)=swapped.pop() - G.add_edge(u,v) - G.add_edge(x,y) - G.remove_edge(u,x) - G.remove_edge(v,y) - swapcount-=1 - window = int(math.ceil(float(window)/2)) - return swapcount - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_block.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_block.py deleted file mode 100644 index 281e385..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_block.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx - -class TestBlock: - - def test_path(self): - G=networkx.path_graph(6) - partition=[[0,1],[2,3],[4,5]] - M=networkx.blockmodel(G,partition) - assert_equal(sorted(M.nodes()),[0,1,2]) - assert_equal(sorted(M.edges()),[(0,1),(1,2)]) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],1) - assert_equal(M.node[n]['nnodes'],2) - assert_equal(M.node[n]['density'],1.0) - - def test_multigraph_path(self): - G=networkx.MultiGraph(networkx.path_graph(6)) - partition=[[0,1],[2,3],[4,5]] - M=networkx.blockmodel(G,partition,multigraph=True) - assert_equal(sorted(M.nodes()),[0,1,2]) - assert_equal(sorted(M.edges()),[(0,1),(1,2)]) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],1) - assert_equal(M.node[n]['nnodes'],2) - assert_equal(M.node[n]['density'],1.0) - - def test_directed_path(self): - G = networkx.DiGraph() - G.add_path(list(range(6))) - partition=[[0,1],[2,3],[4,5]] - M=networkx.blockmodel(G,partition) - assert_equal(sorted(M.nodes()),[0,1,2]) - assert_equal(sorted(M.edges()),[(0,1),(1,2)]) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],1) - assert_equal(M.node[n]['nnodes'],2) - assert_equal(M.node[n]['density'],0.5) - - def test_directed_multigraph_path(self): - G = networkx.MultiDiGraph() - G.add_path(list(range(6))) - partition=[[0,1],[2,3],[4,5]] - M=networkx.blockmodel(G,partition,multigraph=True) - assert_equal(sorted(M.nodes()),[0,1,2]) - assert_equal(sorted(M.edges()),[(0,1),(1,2)]) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],1) - assert_equal(M.node[n]['nnodes'],2) - assert_equal(M.node[n]['density'],0.5) - - @raises(networkx.NetworkXException) - def test_overlapping(self): - G=networkx.path_graph(6) - partition=[[0,1,2],[2,3],[4,5]] - M=networkx.blockmodel(G,partition) - - def test_weighted_path(self): - G=networkx.path_graph(6) - G[0][1]['weight']=1 - G[1][2]['weight']=2 - G[2][3]['weight']=3 - G[3][4]['weight']=4 - G[4][5]['weight']=5 - partition=[[0,1],[2,3],[4,5]] - M=networkx.blockmodel(G,partition) - assert_equal(sorted(M.nodes()),[0,1,2]) - assert_equal(sorted(M.edges()),[(0,1),(1,2)]) - assert_equal(M[0][1]['weight'],2) - assert_equal(M[1][2]['weight'],4) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],1) - assert_equal(M.node[n]['nnodes'],2) - assert_equal(M.node[n]['density'],1.0) - - - def test_barbell(self): - G=networkx.barbell_graph(3,0) - partition=[[0,1,2],[3,4,5]] - M=networkx.blockmodel(G,partition) - assert_equal(sorted(M.nodes()),[0,1]) - assert_equal(sorted(M.edges()),[(0,1)]) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],3) - assert_equal(M.node[n]['nnodes'],3) - assert_equal(M.node[n]['density'],1.0) - - def test_barbell_plus(self): - G=networkx.barbell_graph(3,0) - G.add_edge(0,5) # add extra edge between bells - partition=[[0,1,2],[3,4,5]] - M=networkx.blockmodel(G,partition) - assert_equal(sorted(M.nodes()),[0,1]) - assert_equal(sorted(M.edges()),[(0,1)]) - assert_equal(M[0][1]['weight'],2) - for n in M.nodes(): - assert_equal(M.node[n]['nedges'],3) - assert_equal(M.node[n]['nnodes'],3) - assert_equal(M.node[n]['density'],1.0) - - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_boundary.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_boundary.py deleted file mode 100644 index 2b9e714..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_boundary.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx import convert_node_labels_to_integers as cnlti - -class TestBoundary: - - def setUp(self): - self.null=nx.null_graph() - self.P10=cnlti(nx.path_graph(10),first_label=1) - self.K10=cnlti(nx.complete_graph(10),first_label=1) - - def test_null_node_boundary(self): - """null graph has empty node boundaries""" - null=self.null - assert_equal(nx.node_boundary(null,[]),[]) - assert_equal(nx.node_boundary(null,[],[]),[]) - assert_equal(nx.node_boundary(null,[1,2,3]),[]) - assert_equal(nx.node_boundary(null,[1,2,3],[4,5,6]),[]) - assert_equal(nx.node_boundary(null,[1,2,3],[3,4,5]),[]) - - def test_null_edge_boundary(self): - """null graph has empty edge boundaries""" - null=self.null - assert_equal(nx.edge_boundary(null,[]),[]) - assert_equal(nx.edge_boundary(null,[],[]),[]) - assert_equal(nx.edge_boundary(null,[1,2,3]),[]) - assert_equal(nx.edge_boundary(null,[1,2,3],[4,5,6]),[]) - assert_equal(nx.edge_boundary(null,[1,2,3],[3,4,5]),[]) - - def test_path_node_boundary(self): - """Check node boundaries in path graph.""" - P10=self.P10 - assert_equal(nx.node_boundary(P10,[]),[]) - assert_equal(nx.node_boundary(P10,[],[]),[]) - assert_equal(nx.node_boundary(P10,[1,2,3]),[4]) - assert_equal(sorted(nx.node_boundary(P10,[4,5,6])),[3, 7]) - assert_equal(sorted(nx.node_boundary(P10,[3,4,5,6,7])),[2, 8]) - assert_equal(nx.node_boundary(P10,[8,9,10]),[7]) - assert_equal(sorted(nx.node_boundary(P10,[4,5,6],[9,10])),[]) - - def test_path_edge_boundary(self): - """Check edge boundaries in path graph.""" - P10=self.P10 - - assert_equal(nx.edge_boundary(P10,[]),[]) - assert_equal(nx.edge_boundary(P10,[],[]),[]) - assert_equal(nx.edge_boundary(P10,[1,2,3]),[(3, 4)]) - assert_equal(sorted(nx.edge_boundary(P10,[4,5,6])),[(4, 3), (6, 7)]) - assert_equal(sorted(nx.edge_boundary(P10,[3,4,5,6,7])),[(3, 2), (7, 8)]) - assert_equal(nx.edge_boundary(P10,[8,9,10]),[(8, 7)]) - assert_equal(sorted(nx.edge_boundary(P10,[4,5,6],[9,10])),[]) - assert_equal(nx.edge_boundary(P10,[1,2,3],[3,4,5]) ,[(2, 3), (3, 4)]) - - - def test_k10_node_boundary(self): - """Check node boundaries in K10""" - K10=self.K10 - - assert_equal(nx.node_boundary(K10,[]),[]) - assert_equal(nx.node_boundary(K10,[],[]),[]) - assert_equal(sorted(nx.node_boundary(K10,[1,2,3])), - [4, 5, 6, 7, 8, 9, 10]) - assert_equal(sorted(nx.node_boundary(K10,[4,5,6])), - [1, 2, 3, 7, 8, 9, 10]) - assert_equal(sorted(nx.node_boundary(K10,[3,4,5,6,7])), - [1, 2, 8, 9, 10]) - assert_equal(nx.node_boundary(K10,[4,5,6],[]),[]) - assert_equal(nx.node_boundary(K10,K10),[]) - assert_equal(nx.node_boundary(K10,[1,2,3],[3,4,5]),[4, 5]) - - def test_k10_edge_boundary(self): - """Check edge boundaries in K10""" - K10=self.K10 - - assert_equal(nx.edge_boundary(K10,[]),[]) - assert_equal(nx.edge_boundary(K10,[],[]),[]) - assert_equal(len(nx.edge_boundary(K10,[1,2,3])),21) - assert_equal(len(nx.edge_boundary(K10,[4,5,6,7])),24) - assert_equal(len(nx.edge_boundary(K10,[3,4,5,6,7])),25) - assert_equal(len(nx.edge_boundary(K10,[8,9,10])),21) - assert_equal(sorted(nx.edge_boundary(K10,[4,5,6],[9,10])), - [(4, 9), (4, 10), (5, 9), (5, 10), (6, 9), (6, 10)]) - assert_equal(nx.edge_boundary(K10,[1,2,3],[3,4,5]), - [(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), - (2, 5), (3, 4), (3, 5)]) - - - def test_petersen(self): - """Check boundaries in the petersen graph - - cheeger(G,k)=min(|bdy(S)|/|S| for |S|=k, 0<k<=|V(G)|/2) - """ - from random import sample - P=nx.petersen_graph() - def cheeger(G,k): - return min([float(len(nx.node_boundary(G,sample(G.nodes(),k))))/k - for n in range(100)]) - - assert_almost_equals(cheeger(P,1),3.00,places=2) - assert_almost_equals(cheeger(P,2),2.00,places=2) - assert_almost_equals(cheeger(P,3),1.67,places=2) - assert_almost_equals(cheeger(P,4),1.00,places=2) - assert_almost_equals(cheeger(P,5),0.80,places=2) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_clique.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_clique.py deleted file mode 100644 index 892a67d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_clique.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -from networkx import convert_node_labels_to_integers as cnlti - -class TestCliques: - - def setUp(self): - z=[3,4,3,4,2,4,2,1,1,1,1] - self.G=cnlti(nx.generators.havel_hakimi_graph(z),first_label=1) - self.cl=list(nx.find_cliques(self.G)) - H=nx.complete_graph(6) - H=nx.relabel_nodes(H,dict( [(i,i+1) for i in range(6)])) - H.remove_edges_from([(2,6),(2,5),(2,4),(1,3),(5,3)]) - self.H=H - - def test_find_cliques1(self): - cl=list(nx.find_cliques(self.G)) - rcl=nx.find_cliques_recursive(self.G) - assert_equal(sorted(map(sorted,cl)), sorted(map(sorted,rcl))) - assert_equal(cl, - [[2, 6, 1, 3], [2, 6, 4], [5, 4, 7], [8, 9], [10, 11]]) - - def test_selfloops(self): - self.G.add_edge(1,1) - cl=list(nx.find_cliques(self.G)) - rcl=nx.find_cliques_recursive(self.G) - assert_equal(sorted(map(sorted,cl)), sorted(map(sorted,rcl))) - assert_equal(cl, - [[2, 6, 1, 3], [2, 6, 4], [5, 4, 7], [8, 9], [10, 11]]) - - def test_find_cliques2(self): - hcl=list(nx.find_cliques(self.H)) - assert_equal(sorted(map(sorted,hcl)), - [[1, 2], [1, 4, 5, 6], [2, 3], [3, 4, 6]]) - - def test_clique_number(self): - G=self.G - assert_equal(nx.graph_clique_number(G),4) - assert_equal(nx.graph_clique_number(G,cliques=self.cl),4) - - def test_number_of_cliques(self): - G=self.G - assert_equal(nx.graph_number_of_cliques(G),5) - assert_equal(nx.graph_number_of_cliques(G,cliques=self.cl),5) - assert_equal(nx.number_of_cliques(G,1),1) - assert_equal(list(nx.number_of_cliques(G,[1]).values()),[1]) - assert_equal(list(nx.number_of_cliques(G,[1,2]).values()),[1, 2]) - assert_equal(nx.number_of_cliques(G,[1,2]),{1: 1, 2: 2}) - assert_equal(nx.number_of_cliques(G,2),2) - assert_equal(nx.number_of_cliques(G), - {1: 1, 2: 2, 3: 1, 4: 2, 5: 1, - 6: 2, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1}) - assert_equal(nx.number_of_cliques(G,nodes=G.nodes()), - {1: 1, 2: 2, 3: 1, 4: 2, 5: 1, - 6: 2, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1}) - assert_equal(nx.number_of_cliques(G,nodes=[2,3,4]), - {2: 2, 3: 1, 4: 2}) - assert_equal(nx.number_of_cliques(G,cliques=self.cl), - {1: 1, 2: 2, 3: 1, 4: 2, 5: 1, - 6: 2, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1}) - assert_equal(nx.number_of_cliques(G,G.nodes(),cliques=self.cl), - {1: 1, 2: 2, 3: 1, 4: 2, 5: 1, - 6: 2, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1}) - - - - def test_node_clique_number(self): - G=self.G - assert_equal(nx.node_clique_number(G,1),4) - assert_equal(list(nx.node_clique_number(G,[1]).values()),[4]) - assert_equal(list(nx.node_clique_number(G,[1,2]).values()),[4, 4]) - assert_equal(nx.node_clique_number(G,[1,2]),{1: 4, 2: 4}) - assert_equal(nx.node_clique_number(G,1),4) - assert_equal(nx.node_clique_number(G), - {1: 4, 2: 4, 3: 4, 4: 3, 5: 3, 6: 4, - 7: 3, 8: 2, 9: 2, 10: 2, 11: 2}) - assert_equal(nx.node_clique_number(G,cliques=self.cl), - {1: 4, 2: 4, 3: 4, 4: 3, 5: 3, 6: 4, - 7: 3, 8: 2, 9: 2, 10: 2, 11: 2}) - - def test_cliques_containing_node(self): - G=self.G - assert_equal(nx.cliques_containing_node(G,1), - [[2, 6, 1, 3]]) - assert_equal(list(nx.cliques_containing_node(G,[1]).values()), - [[[2, 6, 1, 3]]]) - assert_equal(list(nx.cliques_containing_node(G,[1,2]).values()), - [[[2, 6, 1, 3]], [[2, 6, 1, 3], [2, 6, 4]]]) - assert_equal(nx.cliques_containing_node(G,[1,2]), - {1: [[2, 6, 1, 3]], 2: [[2, 6, 1, 3], [2, 6, 4]]}) - assert_equal(nx.cliques_containing_node(G,1), - [[2, 6, 1, 3]]) - assert_equal(nx.cliques_containing_node(G,2), - [[2, 6, 1, 3], [2, 6, 4]]) - assert_equal(nx.cliques_containing_node(G,2,cliques=self.cl), - [[2, 6, 1, 3], [2, 6, 4]]) - assert_equal(len(nx.cliques_containing_node(G)),11) - - def test_make_clique_bipartite(self): - G=self.G - B=nx.make_clique_bipartite(G) - assert_equal(sorted(B.nodes()), - [-5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) - H=nx.project_down(B) - assert_equal(H.adj,G.adj) - H1=nx.project_up(B) - assert_equal(H1.nodes(),[1, 2, 3, 4, 5]) - H2=nx.make_max_clique_graph(G) - assert_equal(H1.adj,H2.adj) - - @raises(nx.NetworkXNotImplemented) - def test_directed(self): - cliques=nx.find_cliques(nx.DiGraph()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_cluster.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_cluster.py deleted file mode 100644 index 19c00ae..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_cluster.py +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestTriangles: - - def test_empty(self): - G = nx.Graph() - assert_equal(list(nx.triangles(G).values()),[]) - - def test_path(self): - G = nx.path_graph(10) - assert_equal(list(nx.triangles(G).values()), - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) - assert_equal(nx.triangles(G), - {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, - 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}) - - def test_cubical(self): - G = nx.cubical_graph() - assert_equal(list(nx.triangles(G).values()), - [0, 0, 0, 0, 0, 0, 0, 0]) - assert_equal(nx.triangles(G,1),0) - assert_equal(list(nx.triangles(G,[1,2]).values()),[0, 0]) - assert_equal(nx.triangles(G,1),0) - assert_equal(nx.triangles(G,[1,2]),{1: 0, 2: 0}) - - def test_k5(self): - G = nx.complete_graph(5) - assert_equal(list(nx.triangles(G).values()),[6, 6, 6, 6, 6]) - assert_equal(sum(nx.triangles(G).values())/3.0,10) - assert_equal(nx.triangles(G,1),6) - G.remove_edge(1,2) - assert_equal(list(nx.triangles(G).values()),[5, 3, 3, 5, 5]) - assert_equal(nx.triangles(G,1),3) - - -class TestWeightedClustering: - - def test_clustering(self): - G = nx.Graph() - assert_equal(list(nx.clustering(G,weight='weight').values()),[]) - assert_equal(nx.clustering(G),{}) - - def test_path(self): - G = nx.path_graph(10) - assert_equal(list(nx.clustering(G,weight='weight').values()), - [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) - assert_equal(nx.clustering(G,weight='weight'), - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, - 5: 0.0, 6: 0.0, 7: 0.0, 8: 0.0, 9: 0.0}) - - def test_cubical(self): - G = nx.cubical_graph() - assert_equal(list(nx.clustering(G,weight='weight').values()), - [0, 0, 0, 0, 0, 0, 0, 0]) - assert_equal(nx.clustering(G,1),0) - assert_equal(list(nx.clustering(G,[1,2],weight='weight').values()),[0, 0]) - assert_equal(nx.clustering(G,1,weight='weight'),0) - assert_equal(nx.clustering(G,[1,2],weight='weight'),{1: 0, 2: 0}) - - def test_k5(self): - G = nx.complete_graph(5) - assert_equal(list(nx.clustering(G,weight='weight').values()),[1, 1, 1, 1, 1]) - assert_equal(nx.average_clustering(G,weight='weight'),1) - G.remove_edge(1,2) - assert_equal(list(nx.clustering(G,weight='weight').values()), - [5./6., 1.0, 1.0, 5./6., 5./6.]) - assert_equal(nx.clustering(G,[1,4],weight='weight'),{1: 1.0, 4: 0.83333333333333337}) - - - def test_triangle_and_edge(self): - G=nx.Graph() - G.add_cycle([0,1,2]) - G.add_edge(0,4,weight=2) - assert_equal(nx.clustering(G)[0],1.0/3.0) - assert_equal(nx.clustering(G,weight='weight')[0],1.0/6.0) - -class TestClustering: - - def test_clustering(self): - G = nx.Graph() - assert_equal(list(nx.clustering(G).values()),[]) - assert_equal(nx.clustering(G),{}) - - def test_path(self): - G = nx.path_graph(10) - assert_equal(list(nx.clustering(G).values()), - [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) - assert_equal(nx.clustering(G), - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, - 5: 0.0, 6: 0.0, 7: 0.0, 8: 0.0, 9: 0.0}) - - def test_cubical(self): - G = nx.cubical_graph() - assert_equal(list(nx.clustering(G).values()), - [0, 0, 0, 0, 0, 0, 0, 0]) - assert_equal(nx.clustering(G,1),0) - assert_equal(list(nx.clustering(G,[1,2]).values()),[0, 0]) - assert_equal(nx.clustering(G,1),0) - assert_equal(nx.clustering(G,[1,2]),{1: 0, 2: 0}) - - def test_k5(self): - G = nx.complete_graph(5) - assert_equal(list(nx.clustering(G).values()),[1, 1, 1, 1, 1]) - assert_equal(nx.average_clustering(G),1) - G.remove_edge(1,2) - assert_equal(list(nx.clustering(G).values()), - [5./6., 1.0, 1.0, 5./6., 5./6.]) - assert_equal(nx.clustering(G,[1,4]),{1: 1.0, 4: 0.83333333333333337}) - - - -class TestTransitivity: - - def test_transitivity(self): - G = nx.Graph() - assert_equal(nx.transitivity(G),0.0) - - def test_path(self): - G = nx.path_graph(10) - assert_equal(nx.transitivity(G),0.0) - - def test_cubical(self): - G = nx.cubical_graph() - assert_equal(nx.transitivity(G),0.0) - - def test_k5(self): - G = nx.complete_graph(5) - assert_equal(nx.transitivity(G),1.0) - G.remove_edge(1,2) - assert_equal(nx.transitivity(G),0.875) - - # def test_clustering_transitivity(self): - # # check that weighted average of clustering is transitivity - # G = nx.complete_graph(5) - # G.remove_edge(1,2) - # t1=nx.transitivity(G) - # (cluster_d2,weights)=nx.clustering(G,weights=True) - # trans=[] - # for v in G.nodes(): - # trans.append(cluster_d2[v]*weights[v]) - # t2=sum(trans) - # assert_almost_equal(abs(t1-t2),0) - -class TestSquareClustering: - - def test_clustering(self): - G = nx.Graph() - assert_equal(list(nx.square_clustering(G).values()),[]) - assert_equal(nx.square_clustering(G),{}) - - def test_path(self): - G = nx.path_graph(10) - assert_equal(list(nx.square_clustering(G).values()), - [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) - assert_equal(nx.square_clustering(G), - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, - 5: 0.0, 6: 0.0, 7: 0.0, 8: 0.0, 9: 0.0}) - - def test_cubical(self): - G = nx.cubical_graph() - assert_equal(list(nx.square_clustering(G).values()), - [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]) - assert_equal(list(nx.square_clustering(G,[1,2]).values()),[0.5, 0.5]) - assert_equal(nx.square_clustering(G,[1])[1],0.5) - assert_equal(nx.square_clustering(G,[1,2]),{1: 0.5, 2: 0.5}) - - def test_k5(self): - G = nx.complete_graph(5) - assert_equal(list(nx.square_clustering(G).values()),[1, 1, 1, 1, 1]) - - def test_bipartite_k5(self): - G = nx.complete_bipartite_graph(5,5) - assert_equal(list(nx.square_clustering(G).values()), - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) - - def test_lind_square_clustering(self): - """Test C4 for figure 1 Lind et al (2005)""" - G = nx.Graph([(1,2),(1,3),(1,6),(1,7),(2,4),(2,5), - (3,4),(3,5),(6,7),(7,8),(6,8),(7,9), - (7,10),(6,11),(6,12),(2,13),(2,14),(3,15),(3,16)]) - G1 = G.subgraph([1,2,3,4,5,13,14,15,16]) - G2 = G.subgraph([1,6,7,8,9,10,11,12]) - assert_equal(nx.square_clustering(G, [1])[1], 3/75.0) - assert_equal(nx.square_clustering(G1, [1])[1], 2/6.0) - assert_equal(nx.square_clustering(G2, [1])[1], 1/5.0) - - -def test_average_clustering(): - G=nx.cycle_graph(3) - G.add_edge(2,3) - assert_equal(nx.average_clustering(G),(1+1+1/3.0)/4.0) - assert_equal(nx.average_clustering(G,count_zeros=True),(1+1+1/3.0)/4.0) - assert_equal(nx.average_clustering(G,count_zeros=False),(1+1+1/3.0)/3.0) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_core.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_core.py deleted file mode 100644 index 48399ae..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_core.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestCore: - - def setUp(self): - # G is the example graph in Figure 1 from Batagelj and - # Zaversnik's paper titled An O(m) Algorithm for Cores - # Decomposition of Networks, 2003, - # http://arXiv.org/abs/cs/0310049. With nodes labeled as - # shown, the 3-core is given by nodes 1-8, the 2-core by nodes - # 9-16, the 1-core by nodes 17-20 and node 21 is in the - # 0-core. - t1=nx.convert_node_labels_to_integers(nx.tetrahedral_graph(),1) - t2=nx.convert_node_labels_to_integers(t1,5) - G=nx.union(t1,t2) - G.add_edges_from( [(3,7), (2,11), (11,5), (11,12), (5,12), (12,19), - (12,18), (3,9), (7,9), (7,10), (9,10), (9,20), - (17,13), (13,14), (14,15), (15,16), (16,13)]) - G.add_node(21) - self.G=G - - # Create the graph H resulting from the degree sequence - # [0,1,2,2,2,2,3] when using the Havel-Hakimi algorithm. - - degseq=[0,1,2,2,2,2,3] - H = nx.havel_hakimi_graph(degseq) - mapping = {6:0, 0:1, 4:3, 5:6, 3:4, 1:2, 2:5 } - self.H = nx.relabel_nodes(H, mapping) - - def test_trivial(self): - """Empty graph""" - G = nx.Graph() - assert_equal(nx.find_cores(G),{}) - - def test_find_cores(self): - cores=nx.find_cores(self.G) - nodes_by_core=[] - for val in [0,1,2,3]: - nodes_by_core.append( sorted([k for k in cores if cores[k]==val])) - assert_equal(nodes_by_core[0],[21]) - assert_equal(nodes_by_core[1],[17, 18, 19, 20]) - assert_equal(nodes_by_core[2],[9, 10, 11, 12, 13, 14, 15, 16]) - assert_equal(nodes_by_core[3], [1, 2, 3, 4, 5, 6, 7, 8]) - - def test_core_number(self): - # smoke test real name - cores=nx.core_number(self.G) - - def test_find_cores2(self): - cores=nx.find_cores(self.H) - nodes_by_core=[] - for val in [0,1,2]: - nodes_by_core.append( sorted([k for k in cores if cores[k]==val])) - assert_equal(nodes_by_core[0],[0]) - assert_equal(nodes_by_core[1],[1, 3]) - assert_equal(nodes_by_core[2],[2, 4, 5, 6]) - - def test_main_core(self): - main_core_subgraph=nx.k_core(self.H) - assert_equal(sorted(main_core_subgraph.nodes()),[2,4,5,6]) - - def test_k_core(self): - # k=0 - k_core_subgraph=nx.k_core(self.H,k=0) - assert_equal(sorted(k_core_subgraph.nodes()),sorted(self.H.nodes())) - # k=1 - k_core_subgraph=nx.k_core(self.H,k=1) - assert_equal(sorted(k_core_subgraph.nodes()),[1,2,3,4,5,6]) - # k=2 - k_core_subgraph=nx.k_core(self.H,k=2) - assert_equal(sorted(k_core_subgraph.nodes()),[2,4,5,6]) - - def test_main_crust(self): - main_crust_subgraph=nx.k_crust(self.H) - assert_equal(sorted(main_crust_subgraph.nodes()),[0,1,3]) - - def test_k_crust(self): - # k=0 - k_crust_subgraph=nx.k_crust(self.H,k=2) - assert_equal(sorted(k_crust_subgraph.nodes()),sorted(self.H.nodes())) - # k=1 - k_crust_subgraph=nx.k_crust(self.H,k=1) - assert_equal(sorted(k_crust_subgraph.nodes()),[0,1,3]) - # k=2 - k_crust_subgraph=nx.k_crust(self.H,k=0) - assert_equal(sorted(k_crust_subgraph.nodes()),[0]) - - def test_main_shell(self): - main_shell_subgraph=nx.k_shell(self.H) - assert_equal(sorted(main_shell_subgraph.nodes()),[2,4,5,6]) - - def test_k_shell(self): - # k=0 - k_shell_subgraph=nx.k_shell(self.H,k=2) - assert_equal(sorted(k_shell_subgraph.nodes()),[2,4,5,6]) - # k=1 - k_shell_subgraph=nx.k_shell(self.H,k=1) - assert_equal(sorted(k_shell_subgraph.nodes()),[1,3]) - # k=2 - k_shell_subgraph=nx.k_shell(self.H,k=0) - assert_equal(sorted(k_shell_subgraph.nodes()),[0]) - - def test_k_corona(self): - # k=0 - k_corona_subgraph=nx.k_corona(self.H,k=2) - assert_equal(sorted(k_corona_subgraph.nodes()),[2,4,5,6]) - # k=1 - k_corona_subgraph=nx.k_corona(self.H,k=1) - assert_equal(sorted(k_corona_subgraph.nodes()),[1]) - # k=2 - k_corona_subgraph=nx.k_corona(self.H,k=0) - assert_equal(sorted(k_corona_subgraph.nodes()),[0]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_cycles.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_cycles.py deleted file mode 100644 index e39bb87..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_cycles.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx -import networkx as nx - -class TestCycles: - def setUp(self): - G=networkx.Graph() - G.add_cycle([0,1,2,3]) - G.add_cycle([0,3,4,5]) - G.add_cycle([0,1,6,7,8]) - G.add_edge(8,9) - self.G=G - - def is_cyclic_permutation(self,a,b): - n=len(a) - if len(b)!=n: - return False - l=a+a - return any(l[i:i+n]==b for i in range(2*n-n+1)) - - def test_cycle_basis(self): - G=self.G - cy=networkx.cycle_basis(G,0) - sort_cy= sorted( sorted(c) for c in cy ) - assert_equal(sort_cy, [[0,1,2,3],[0,1,6,7,8],[0,3,4,5]]) - cy=networkx.cycle_basis(G,1) - sort_cy= sorted( sorted(c) for c in cy ) - assert_equal(sort_cy, [[0,1,2,3],[0,1,6,7,8],[0,3,4,5]]) - cy=networkx.cycle_basis(G,9) - sort_cy= sorted( sorted(c) for c in cy ) - assert_equal(sort_cy, [[0,1,2,3],[0,1,6,7,8],[0,3,4,5]]) - # test disconnected graphs - G.add_cycle(list("ABC")) - cy=networkx.cycle_basis(G,9) - sort_cy= sorted(sorted(c) for c in cy[:-1]) + [sorted(cy[-1])] - assert_equal(sort_cy, [[0,1,2,3],[0,1,6,7,8],[0,3,4,5],['A','B','C']]) - - @raises(nx.NetworkXNotImplemented) - def test_cycle_basis(self): - G=nx.DiGraph() - cy=networkx.cycle_basis(G,0) - - @raises(nx.NetworkXNotImplemented) - def test_cycle_basis(self): - G=nx.MultiGraph() - cy=networkx.cycle_basis(G,0) - - def test_simple_cycles(self): - G = nx.DiGraph([(0, 0), (0, 1), (0, 2), (1, 2), (2, 0), (2, 1), (2, 2)]) - cc=sorted(nx.simple_cycles(G)) - ca=[[0], [0, 1, 2], [0, 2], [1, 2], [2]] - for c in cc: - assert_true(any(self.is_cyclic_permutation(c,rc) for rc in ca)) - - @raises(nx.NetworkXNotImplemented) - def test_simple_cycles_graph(self): - G = nx.Graph() - c = sorted(nx.simple_cycles(G)) - - def test_unsortable(self): - # TODO What does this test do? das 6/2013 - G=nx.DiGraph() - G.add_cycle(['a',1]) - c=list(nx.simple_cycles(G)) - - def test_simple_cycles_small(self): - G = nx.DiGraph() - G.add_cycle([1,2,3]) - c=sorted(nx.simple_cycles(G)) - assert_equal(len(c),1) - assert_true(self.is_cyclic_permutation(c[0],[1,2,3])) - G.add_cycle([10,20,30]) - cc=sorted(nx.simple_cycles(G)) - ca=[[1,2,3],[10,20,30]] - for c in cc: - assert_true(any(self.is_cyclic_permutation(c,rc) for rc in ca)) - - def test_simple_cycles_empty(self): - G = nx.DiGraph() - assert_equal(list(nx.simple_cycles(G)),[]) - - def test_complete_directed_graph(self): - # see table 2 in Johnson's paper - ncircuits=[1,5,20,84,409,2365,16064] - for n,c in zip(range(2,9),ncircuits): - G=nx.DiGraph(nx.complete_graph(n)) - assert_equal(len(list(nx.simple_cycles(G))),c) - - def worst_case_graph(self,k): - # see figure 1 in Johnson's paper - # this graph has excactly 3k simple cycles - G=nx.DiGraph() - for n in range(2,k+2): - G.add_edge(1,n) - G.add_edge(n,k+2) - G.add_edge(2*k+1,1) - for n in range(k+2,2*k+2): - G.add_edge(n,2*k+2) - G.add_edge(n,n+1) - G.add_edge(2*k+3,k+2) - for n in range(2*k+3,3*k+3): - G.add_edge(2*k+2,n) - G.add_edge(n,3*k+3) - G.add_edge(3*k+3,2*k+2) - return G - - def test_worst_case_graph(self): - # see figure 1 in Johnson's paper - for k in range(3,10): - G=self.worst_case_graph(k) - l=len(list(nx.simple_cycles(G))) - assert_equal(l,3*k) - - def test_recursive_simple_and_not(self): - for k in range(2,10): - G=self.worst_case_graph(k) - cc=sorted(nx.simple_cycles(G)) - rcc=sorted(nx.recursive_simple_cycles(G)) - assert_equal(len(cc),len(rcc)) - for c in cc: - assert_true(any(self.is_cyclic_permutation(c,rc) for rc in rcc)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_dag.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_dag.py deleted file mode 100644 index eb368af..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_dag.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestDAG: - - def setUp(self): - pass - - def test_topological_sort1(self): - DG=nx.DiGraph() - DG.add_edges_from([(1,2),(1,3),(2,3)]) - assert_equal(nx.topological_sort(DG),[1, 2, 3]) - assert_equal(nx.topological_sort_recursive(DG),[1, 2, 3]) - - DG.add_edge(3,2) - assert_raises(nx.NetworkXUnfeasible, nx.topological_sort, DG) - assert_raises(nx.NetworkXUnfeasible, nx.topological_sort_recursive, DG) - - DG.remove_edge(2,3) - assert_equal(nx.topological_sort(DG),[1, 3, 2]) - assert_equal(nx.topological_sort_recursive(DG),[1, 3, 2]) - - def test_is_directed_acyclic_graph(self): - G = nx.generators.complete_graph(2) - assert_false(nx.is_directed_acyclic_graph(G)) - assert_false(nx.is_directed_acyclic_graph(G.to_directed())) - assert_false(nx.is_directed_acyclic_graph(nx.Graph([(3, 4), (4, 5)]))) - assert_true(nx.is_directed_acyclic_graph(nx.DiGraph([(3, 4), (4, 5)]))) - - def test_topological_sort2(self): - DG=nx.DiGraph({1:[2],2:[3],3:[4], - 4:[5],5:[1],11:[12], - 12:[13],13:[14],14:[15]}) - assert_raises(nx.NetworkXUnfeasible, nx.topological_sort, DG) - assert_raises(nx.NetworkXUnfeasible, nx.topological_sort_recursive, DG) - - assert_false(nx.is_directed_acyclic_graph(DG)) - - DG.remove_edge(1,2) - assert_equal(nx.topological_sort_recursive(DG), - [11, 12, 13, 14, 15, 2, 3, 4, 5, 1]) - assert_equal(nx.topological_sort(DG), - [11, 12, 13, 14, 15, 2, 3, 4, 5, 1]) - assert_true(nx.is_directed_acyclic_graph(DG)) - - def test_topological_sort3(self): - DG=nx.DiGraph() - DG.add_edges_from([(1,i) for i in range(2,5)]) - DG.add_edges_from([(2,i) for i in range(5,9)]) - DG.add_edges_from([(6,i) for i in range(9,12)]) - DG.add_edges_from([(4,i) for i in range(12,15)]) - assert_equal(nx.topological_sort_recursive(DG), - [1, 4, 14, 13, 12, 3, 2, 7, 6, 11, 10, 9, 5, 8]) - assert_equal(nx.topological_sort(DG), - [1, 2, 8, 5, 6, 9, 10, 11, 7, 3, 4, 12, 13, 14]) - - DG.add_edge(14,1) - assert_raises(nx.NetworkXUnfeasible, nx.topological_sort, DG) - assert_raises(nx.NetworkXUnfeasible, nx.topological_sort_recursive, DG) - - def test_topological_sort4(self): - G=nx.Graph() - G.add_edge(1,2) - assert_raises(nx.NetworkXError, nx.topological_sort, G) - assert_raises(nx.NetworkXError, nx.topological_sort_recursive, G) - - def test_topological_sort5(self): - G=nx.DiGraph() - G.add_edge(0,1) - assert_equal(nx.topological_sort_recursive(G), [0,1]) - assert_equal(nx.topological_sort(G), [0,1]) - - def test_nbunch_argument(self): - G=nx.DiGraph() - G.add_edges_from([(1,2), (2,3), (1,4), (1,5), (2,6)]) - assert_equal(nx.topological_sort(G), [1, 2, 3, 6, 4, 5]) - assert_equal(nx.topological_sort_recursive(G), [1, 5, 4, 2, 6, 3]) - assert_equal(nx.topological_sort(G,[1]), [1, 2, 3, 6, 4, 5]) - assert_equal(nx.topological_sort_recursive(G,[1]), [1, 5, 4, 2, 6, 3]) - assert_equal(nx.topological_sort(G,[5]), [5]) - assert_equal(nx.topological_sort_recursive(G,[5]), [5]) - - def test_ancestors(self): - G=nx.DiGraph() - ancestors = nx.algorithms.dag.ancestors - G.add_edges_from([ - (1, 2), (1, 3), (4, 2), (4, 3), (4, 5), (2, 6), (5, 6)]) - assert_equal(ancestors(G, 6), set([1, 2, 4, 5])) - assert_equal(ancestors(G, 3), set([1, 4])) - assert_equal(ancestors(G, 1), set()) - assert_raises(nx.NetworkXError, ancestors, G, 8) - - def test_descendants(self): - G=nx.DiGraph() - descendants = nx.algorithms.dag.descendants - G.add_edges_from([ - (1, 2), (1, 3), (4, 2), (4, 3), (4, 5), (2, 6), (5, 6)]) - assert_equal(descendants(G, 1), set([2, 3, 6])) - assert_equal(descendants(G, 4), set([2, 3, 5, 6])) - assert_equal(descendants(G, 3), set()) - assert_raises(nx.NetworkXError, descendants, G, 8) - - -def test_is_aperiodic_cycle(): - G=nx.DiGraph() - G.add_cycle([1,2,3,4]) - assert_false(nx.is_aperiodic(G)) - -def test_is_aperiodic_cycle2(): - G=nx.DiGraph() - G.add_cycle([1,2,3,4]) - G.add_cycle([3,4,5,6,7]) - assert_true(nx.is_aperiodic(G)) - -def test_is_aperiodic_cycle3(): - G=nx.DiGraph() - G.add_cycle([1,2,3,4]) - G.add_cycle([3,4,5,6]) - assert_false(nx.is_aperiodic(G)) - -def test_is_aperiodic_cycle4(): - G = nx.DiGraph() - G.add_cycle([1,2,3,4]) - G.add_edge(1,3) - assert_true(nx.is_aperiodic(G)) - -def test_is_aperiodic_selfloop(): - G = nx.DiGraph() - G.add_cycle([1,2,3,4]) - G.add_edge(1,1) - assert_true(nx.is_aperiodic(G)) - -def test_is_aperiodic_raise(): - G = nx.Graph() - assert_raises(nx.NetworkXError, - nx.is_aperiodic, - G) - -def test_is_aperiodic_bipartite(): - #Bipartite graph - G = nx.DiGraph(nx.davis_southern_women_graph()) - assert_false(nx.is_aperiodic(G)) - -def test_is_aperiodic_rary_tree(): - G = nx.full_rary_tree(3,27,create_using=nx.DiGraph()) - assert_false(nx.is_aperiodic(G)) - -def test_is_aperiodic_disconnected(): - #disconnected graph - G = nx.DiGraph() - G.add_cycle([1,2,3,4]) - G.add_cycle([5,6,7,8]) - assert_false(nx.is_aperiodic(G)) - G.add_edge(1,3) - G.add_edge(5,7) - assert_true(nx.is_aperiodic(G)) - -def test_is_aperiodic_disconnected2(): - G = nx.DiGraph() - G.add_cycle([0,1,2]) - G.add_edge(3,3) - assert_false(nx.is_aperiodic(G)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_distance_measures.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_distance_measures.py deleted file mode 100644 index ff3530c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_distance_measures.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx - -class TestDistance: - - def setUp(self): - G=networkx.Graph() - from networkx import convert_node_labels_to_integers as cnlti - G=cnlti(networkx.grid_2d_graph(4,4),first_label=1,ordering="sorted") - self.G=G - - def test_eccentricity(self): - assert_equal(networkx.eccentricity(self.G,1),6) - e=networkx.eccentricity(self.G) - assert_equal(e[1],6) - sp=networkx.shortest_path_length(self.G) - e=networkx.eccentricity(self.G,sp=sp) - assert_equal(e[1],6) - e=networkx.eccentricity(self.G,v=1) - assert_equal(e,6) - e=networkx.eccentricity(self.G,v=[1,1]) #This behavior changed in version 1.8 (ticket #739) - assert_equal(e[1],6) - e=networkx.eccentricity(self.G,v=[1,2]) - assert_equal(e[1],6) - # test against graph with one node - G=networkx.path_graph(1) - e=networkx.eccentricity(G) - assert_equal(e[0],0) - e=networkx.eccentricity(G,v=0) - assert_equal(e,0) - assert_raises(networkx.NetworkXError, networkx.eccentricity, G, 1) - # test against empty graph - G=networkx.empty_graph() - e=networkx.eccentricity(G) - assert_equal(e,{}) - - - - - def test_diameter(self): - assert_equal(networkx.diameter(self.G),6) - - def test_radius(self): - assert_equal(networkx.radius(self.G),4) - - def test_periphery(self): - assert_equal(set(networkx.periphery(self.G)),set([1, 4, 13, 16])) - - def test_center(self): - assert_equal(set(networkx.center(self.G)),set([6, 7, 10, 11])) - - def test_radius_exception(self): - G=networkx.Graph() - G.add_edge(1,2) - G.add_edge(3,4) - assert_raises(networkx.NetworkXError, networkx.diameter, G) - - @raises(networkx.NetworkXError) - def test_eccentricity_infinite(self): - G=networkx.Graph([(1,2),(3,4)]) - e = networkx.eccentricity(G) - - @raises(networkx.NetworkXError) - def test_eccentricity_invalid(self): - G=networkx.Graph([(1,2),(3,4)]) - e = networkx.eccentricity(G,sp=1) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_distance_regular.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_distance_regular.py deleted file mode 100644 index 068a81f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_distance_regular.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestDistanceRegular: - - def test_is_distance_regular(self): - assert_true(nx.is_distance_regular(nx.icosahedral_graph())) - assert_true(nx.is_distance_regular(nx.petersen_graph())) - assert_true(nx.is_distance_regular(nx.cubical_graph())) - assert_true(nx.is_distance_regular(nx.complete_bipartite_graph(3,3))) - assert_true(nx.is_distance_regular(nx.tetrahedral_graph())) - assert_true(nx.is_distance_regular(nx.dodecahedral_graph())) - assert_true(nx.is_distance_regular(nx.pappus_graph())) - assert_true(nx.is_distance_regular(nx.heawood_graph())) - assert_true(nx.is_distance_regular(nx.cycle_graph(3))) - # no distance regular - assert_false(nx.is_distance_regular(nx.path_graph(4))) - - def test_not_connected(self): - G=nx.cycle_graph(4) - G.add_cycle([5,6,7]) - assert_false(nx.is_distance_regular(G)) - - - def test_global_parameters(self): - b,c=nx.intersection_array(nx.cycle_graph(5)) - g=nx.global_parameters(b,c) - assert_equal(list(g),[(0, 0, 2), (1, 0, 1), (1, 1, 0)]) - b,c=nx.intersection_array(nx.cycle_graph(3)) - g=nx.global_parameters(b,c) - assert_equal(list(g),[(0, 0, 2), (1, 1, 0)]) - - - def test_intersection_array(self): - b,c=nx.intersection_array(nx.cycle_graph(5)) - assert_equal(b,[2, 1]) - assert_equal(c,[1, 1]) - b,c=nx.intersection_array(nx.dodecahedral_graph()) - assert_equal(b,[3, 2, 1, 1, 1]) - assert_equal(c,[1, 1, 1, 2, 3]) - b,c=nx.intersection_array(nx.icosahedral_graph()) - assert_equal(b,[5, 2, 1]) - assert_equal(c,[1, 2, 5]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_euler.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_euler.py deleted file mode 100644 index 0b55f1f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_euler.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python -# run with nose: nosetests -v test_euler.py - -from nose.tools import * -import networkx as nx -from networkx import is_eulerian,eulerian_circuit - -class TestEuler: - - def test_is_eulerian(self): - assert_true(is_eulerian(nx.complete_graph(5))) - assert_true(is_eulerian(nx.complete_graph(7))) - assert_true(is_eulerian(nx.hypercube_graph(4))) - assert_true(is_eulerian(nx.hypercube_graph(6))) - - assert_false(is_eulerian(nx.complete_graph(4))) - assert_false(is_eulerian(nx.complete_graph(6))) - assert_false(is_eulerian(nx.hypercube_graph(3))) - assert_false(is_eulerian(nx.hypercube_graph(5))) - - assert_false(is_eulerian(nx.petersen_graph())) - assert_false(is_eulerian(nx.path_graph(4))) - - def test_is_eulerian2(self): - # not connected - G = nx.Graph() - G.add_nodes_from([1,2,3]) - assert_false(is_eulerian(G)) - # not strongly connected - G = nx.DiGraph() - G.add_nodes_from([1,2,3]) - assert_false(is_eulerian(G)) - G = nx.MultiDiGraph() - G.add_edge(1,2) - G.add_edge(2,3) - G.add_edge(2,3) - G.add_edge(3,1) - assert_false(is_eulerian(G)) - - - - def test_eulerian_circuit_cycle(self): - G=nx.cycle_graph(4) - - edges=list(eulerian_circuit(G,source=0)) - nodes=[u for u,v in edges] - assert_equal(nodes,[0,1,2,3]) - assert_equal(edges,[(0,1),(1,2),(2,3),(3,0)]) - - edges=list(eulerian_circuit(G,source=1)) - nodes=[u for u,v in edges] - assert_equal(nodes,[1,0,3,2]) - assert_equal(edges,[(1,0),(0,3),(3,2),(2,1)]) - - - def test_eulerian_circuit_digraph(self): - G=nx.DiGraph() - G.add_cycle([0,1,2,3]) - - edges=list(eulerian_circuit(G,source=0)) - nodes=[u for u,v in edges] - assert_equal(nodes,[0,1,2,3]) - assert_equal(edges,[(0,1),(1,2),(2,3),(3,0)]) - - edges=list(eulerian_circuit(G,source=1)) - nodes=[u for u,v in edges] - assert_equal(nodes,[1,2,3,0]) - assert_equal(edges,[(1,2),(2,3),(3,0),(0,1)]) - - - def test_eulerian_circuit_multigraph(self): - G=nx.MultiGraph() - G.add_cycle([0,1,2,3]) - G.add_edge(1,2) - G.add_edge(1,2) - edges=list(eulerian_circuit(G,source=0)) - nodes=[u for u,v in edges] - assert_equal(nodes,[0,1,2,1,2,3]) - assert_equal(edges,[(0,1),(1,2),(2,1),(1,2),(2,3),(3,0)]) - - - @raises(nx.NetworkXError) - def test_not_eulerian(self): - f=list(eulerian_circuit(nx.complete_graph(4))) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_graphical.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_graphical.py deleted file mode 100644 index 9609d25..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_graphical.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -def test_valid_degree_sequence1(): - n = 100 - p = .3 - for i in range(10): - G = nx.erdos_renyi_graph(n,p) - deg = list(G.degree().values()) - assert_true( nx.is_valid_degree_sequence(deg, method='eg') ) - assert_true( nx.is_valid_degree_sequence(deg, method='hh') ) - -def test_valid_degree_sequence2(): - n = 100 - for i in range(10): - G = nx.barabasi_albert_graph(n,1) - deg = list(G.degree().values()) - assert_true( nx.is_valid_degree_sequence(deg, method='eg') ) - assert_true( nx.is_valid_degree_sequence(deg, method='hh') ) - -@raises(nx.NetworkXException) -def test_string_input(): - a = nx.is_valid_degree_sequence([],'foo') - -def test_negative_input(): - assert_false(nx.is_valid_degree_sequence([-1],'hh')) - assert_false(nx.is_valid_degree_sequence([-1],'eg')) - assert_false(nx.is_valid_degree_sequence([72.5],'eg')) - - -def test_atlas(): - for graph in nx.graph_atlas_g(): - deg = list(graph.degree().values()) - assert_true( nx.is_valid_degree_sequence(deg, method='eg') ) - assert_true( nx.is_valid_degree_sequence(deg, method='hh') ) - -def test_small_graph_true(): - z=[5,3,3,3,3,2,2,2,1,1,1] - assert_true(nx.is_valid_degree_sequence(z, method='hh')) - assert_true(nx.is_valid_degree_sequence(z, method='eg')) - z=[10,3,3,3,3,2,2,2,2,2,2] - assert_true(nx.is_valid_degree_sequence(z, method='hh')) - assert_true(nx.is_valid_degree_sequence(z, method='eg')) - z=[1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - assert_true(nx.is_valid_degree_sequence(z, method='hh')) - assert_true(nx.is_valid_degree_sequence(z, method='eg')) - - - -def test_small_graph_false(): - z=[1000,3,3,3,3,2,2,2,1,1,1] - assert_false(nx.is_valid_degree_sequence(z, method='hh')) - assert_false(nx.is_valid_degree_sequence(z, method='eg')) - z=[6,5,4,4,2,1,1,1] - assert_false(nx.is_valid_degree_sequence(z, method='hh')) - assert_false(nx.is_valid_degree_sequence(z, method='eg')) - z=[1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - assert_false(nx.is_valid_degree_sequence(z, method='hh')) - assert_false(nx.is_valid_degree_sequence(z, method='eg')) - -def test_directed_degree_sequence(): - # Test a range of valid directed degree sequences - n, r = 100, 10 - p = 1.0 / r - for i in range(r): - G = nx.erdos_renyi_graph(n,p*(i+1),None,True) - din = list(G.in_degree().values()) - dout = list(G.out_degree().values()) - assert_true(nx.is_digraphical(din, dout)) - -def test_small_directed_sequences(): - dout=[5,3,3,3,3,2,2,2,1,1,1] - din=[3,3,3,3,3,2,2,2,2,2,1] - assert_true(nx.is_digraphical(din, dout)) - # Test nongraphical directed sequence - dout = [1000,3,3,3,3,2,2,2,1,1,1] - din=[103,102,102,102,102,102,102,102,102,102] - assert_false(nx.is_digraphical(din, dout)) - # Test digraphical small sequence - dout=[1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - din=[2, 2, 2, 2, 2, 2, 2, 2, 1, 1] - assert_true(nx.is_digraphical(din, dout)) - # Test nonmatching sum - din=[2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1] - assert_false(nx.is_digraphical(din, dout)) - # Test for negative integer in sequence - din=[2, 2, 2, -2, 2, 2, 2, 2, 1, 1, 4] - assert_false(nx.is_digraphical(din, dout)) - -def test_multi_sequence(): - # Test nongraphical multi sequence - seq=[1000,3,3,3,3,2,2,2,1,1] - assert_false(nx.is_multigraphical(seq)) - # Test small graphical multi sequence - seq=[6,5,4,4,2,1,1,1] - assert_true(nx.is_multigraphical(seq)) - # Test for negative integer in sequence - seq=[6,5,4,-4,2,1,1,1] - assert_false(nx.is_multigraphical(seq)) - # Test for sequence with odd sum - seq=[1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - assert_false(nx.is_multigraphical(seq)) - -def test_pseudo_sequence(): - # Test small valid pseudo sequence - seq=[1000,3,3,3,3,2,2,2,1,1] - assert_true(nx.is_pseudographical(seq)) - # Test for sequence with odd sum - seq=[1000,3,3,3,3,2,2,2,1,1,1] - assert_false(nx.is_pseudographical(seq)) - # Test for negative integer in sequence - seq=[1000,3,3,3,3,2,2,-2,1,1] - assert_false(nx.is_pseudographical(seq)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_hierarchy.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_hierarchy.py deleted file mode 100644 index 6f2907e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_hierarchy.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -def test_hierarchy_exception(): - G = nx.cycle_graph(5) - assert_raises(nx.NetworkXError,nx.flow_hierarchy,G) - -def test_hierarchy_cycle(): - G = nx.cycle_graph(5,create_using=nx.DiGraph()) - assert_equal(nx.flow_hierarchy(G),0.0) - -def test_hierarchy_tree(): - G = nx.full_rary_tree(2,16,create_using=nx.DiGraph()) - assert_equal(nx.flow_hierarchy(G),1.0) - -def test_hierarchy_1(): - G = nx.DiGraph() - G.add_edges_from([(0,1),(1,2),(2,3),(3,1),(3,4),(0,4)]) - assert_equal(nx.flow_hierarchy(G),0.5) - -def test_hierarchy_weight(): - G = nx.DiGraph() - G.add_edges_from([(0,1,{'weight':.3}), - (1,2,{'weight':.1}), - (2,3,{'weight':.1}), - (3,1,{'weight':.1}), - (3,4,{'weight':.3}), - (0,4,{'weight':.3})]) - assert_equal(nx.flow_hierarchy(G,weight='weight'),.75)
\ No newline at end of file diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_matching.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_matching.py deleted file mode 100644 index 5509e2d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_matching.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env python -import math -from nose.tools import * -import networkx as nx - -class TestMatching: - - def setUp(self): - pass - - def test_trivial1(self): - """Empty graph""" - G = nx.Graph() - assert_equal(nx.max_weight_matching(G),{}) - - def test_trivial2(self): - """Self loop""" - G = nx.Graph() - G.add_edge(0, 0, weight=100) - assert_equal(nx.max_weight_matching(G),{}) - - def test_trivial3(self): - """Single edge""" - G = nx.Graph() - G.add_edge(0, 1) - assert_equal(nx.max_weight_matching(G), - {0: 1, 1: 0}) - - def test_trivial4(self): - """Small graph""" - G = nx.Graph() - G.add_edge('one', 'two', weight=10) - G.add_edge('two', 'three', weight=11) - assert_equal(nx.max_weight_matching(G), - {'three': 'two', 'two': 'three'}) - - def test_trivial5(self): - """Path""" - G = nx.Graph() - G.add_edge(1, 2, weight=5) - G.add_edge(2, 3, weight=11) - G.add_edge(3, 4, weight=5) - assert_equal(nx.max_weight_matching(G), - {2: 3, 3: 2}) - assert_equal(nx.max_weight_matching(G, 1), - {1: 2, 2: 1, 3: 4, 4: 3}) - - - def test_floating_point_weights(self): - """Floating point weights""" - G = nx.Graph() - G.add_edge(1, 2, weight=math.pi) - G.add_edge(2, 3, weight=math.exp(1)) - G.add_edge(1, 3, weight=3.0) - G.add_edge(1, 4, weight=math.sqrt(2.0)) - assert_equal(nx.max_weight_matching(G), - {1: 4, 2: 3, 3: 2, 4: 1}) - - def test_negative_weights(self): - """Negative weights""" - G = nx.Graph() - G.add_edge(1, 2, weight=2) - G.add_edge(1, 3, weight=-2) - G.add_edge(2, 3, weight=1) - G.add_edge(2, 4, weight=-1) - G.add_edge(3, 4, weight=-6) - assert_equal(nx.max_weight_matching(G), - {1: 2, 2: 1}) - assert_equal(nx.max_weight_matching(G, 1), - {1: 3, 2: 4, 3: 1, 4: 2}) - - def test_s_blossom(self): - """Create S-blossom and use it for augmentation:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 8), (1, 3, 9), - (2, 3, 10), (3, 4, 7) ]) - assert_equal(nx.max_weight_matching(G), - {1: 2, 2: 1, 3: 4, 4: 3}) - - G.add_weighted_edges_from([ (1, 6, 5), (4, 5, 6) ]) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 5, 5: 4, 6: 1}) - - def test_s_t_blossom(self): - """Create S-blossom, relabel as T-blossom, use for augmentation:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 9), (1, 3, 8), (2, 3, 10), - (1, 4, 5), (4, 5, 4), (1, 6, 3) ]) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 5, 5: 4, 6: 1}) - G.add_edge(4, 5, weight=3) - G.add_edge(1, 6, weight=4) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 5, 5: 4, 6: 1}) - G.remove_edge(1, 6) - G.add_edge(3, 6, weight=4) - assert_equal(nx.max_weight_matching(G), - {1: 2, 2: 1, 3: 6, 4: 5, 5: 4, 6: 3}) - - def test_nested_s_blossom(self): - """Create nested S-blossom, use for augmentation:""" - - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 9), (1, 3, 9), (2, 3, 10), - (2, 4, 8), (3, 5, 8), (4, 5, 10), - (5, 6, 6) ]) - assert_equal(nx.max_weight_matching(G), - {1: 3, 2: 4, 3: 1, 4: 2, 5: 6, 6: 5}) - - def test_nested_s_blossom_relabel(self): - """Create S-blossom, relabel as S, include in nested S-blossom:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 10), (1, 7, 10), (2, 3, 12), - (3, 4, 20), (3, 5, 20), (4, 5, 25), - (5, 6, 10), (6, 7, 10), (7, 8, 8) ]) - assert_equal(nx.max_weight_matching(G), - {1: 2, 2: 1, 3: 4, 4: 3, 5: 6, 6: 5, 7: 8, 8: 7}) - - def test_nested_s_blossom_expand(self): - """Create nested S-blossom, augment, expand recursively:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 8), (1, 3, 8), (2, 3, 10), - (2, 4, 12),(3, 5, 12), (4, 5, 14), - (4, 6, 12), (5, 7, 12), (6, 7, 14), - (7, 8, 12) ]) - assert_equal(nx.max_weight_matching(G), - {1: 2, 2: 1, 3: 5, 4: 6, 5: 3, 6: 4, 7: 8, 8: 7}) - - - def test_s_blossom_relabel_expand(self): - """Create S-blossom, relabel as T, expand:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 23), (1, 5, 22), (1, 6, 15), - (2, 3, 25), (3, 4, 22), (4, 5, 25), - (4, 8, 14), (5, 7, 13) ]) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 8, 5: 7, 6: 1, 7: 5, 8: 4}) - - def test_nested_s_blossom_relabel_expand(self): - """Create nested S-blossom, relabel as T, expand:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 19), (1, 3, 20), (1, 8, 8), - (2, 3, 25), (2, 4, 18), (3, 5, 18), - (4, 5, 13), (4, 7, 7), (5, 6, 7) ]) - assert_equal(nx.max_weight_matching(G), - {1: 8, 2: 3, 3: 2, 4: 7, 5: 6, 6: 5, 7: 4, 8: 1}) - - - def test_nasty_blossom1(self): - """Create blossom, relabel as T in more than one way, expand, - augment: - """ - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 45), (1, 5, 45), (2, 3, 50), - (3, 4, 45), (4, 5, 50), (1, 6, 30), - (3, 9, 35), (4, 8, 35), (5, 7, 26), - (9, 10, 5) ]) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 8, 5: 7, - 6: 1, 7: 5, 8: 4, 9: 10, 10: 9}) - - def test_nasty_blossom2(self): - """Again but slightly different:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 45), (1, 5, 45), (2, 3, 50), - (3, 4, 45), (4, 5, 50), (1, 6, 30), - (3, 9, 35), (4, 8, 26), (5, 7, 40), - (9, 10, 5) ]) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 8, 5: 7, - 6: 1, 7: 5, 8: 4, 9: 10, 10: 9}) - - def test_nasty_blossom_least_slack(self): - """Create blossom, relabel as T, expand such that a new - least-slack S-to-free dge is produced, augment: - """ - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 45), (1, 5, 45), (2, 3, 50), - (3, 4, 45), (4, 5, 50), (1, 6, 30), - (3, 9, 35), (4, 8, 28), (5, 7, 26), - (9, 10, 5) ]) - assert_equal(nx.max_weight_matching(G), - {1: 6, 2: 3, 3: 2, 4: 8, 5: 7, - 6: 1, 7: 5, 8: 4, 9: 10, 10: 9}) - - def test_nasty_blossom_augmenting(self): - """Create nested blossom, relabel as T in more than one way""" - # expand outer blossom such that inner blossom ends up on an - # augmenting path: - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 45), (1, 7, 45), (2, 3, 50), - (3, 4, 45), (4, 5, 95), (4, 6, 94), - (5, 6, 94), (6, 7, 50), (1, 8, 30), - (3, 11, 35), (5, 9, 36), (7, 10, 26), - (11, 12, 5) ]) - assert_equal(nx.max_weight_matching(G), - {1: 8, 2: 3, 3: 2, 4: 6, 5: 9, 6: 4, - 7: 10, 8: 1, 9: 5, 10: 7, 11: 12, 12: 11}) - - def test_nasty_blossom_expand_recursively(self): - """Create nested S-blossom, relabel as S, expand recursively:""" - G = nx.Graph() - G.add_weighted_edges_from([ (1, 2, 40), (1, 3, 40), (2, 3, 60), - (2, 4, 55), (3, 5, 55), (4, 5, 50), - (1, 8, 15), (5, 7, 30), (7, 6, 10), - (8, 10, 10), (4, 9, 30) ]) - assert_equal(nx.max_weight_matching(G), - {1: 2, 2: 1, 3: 5, 4: 9, 5: 3, - 6: 7, 7: 6, 8: 10, 9: 4, 10: 8}) - -def test_maximal_matching(): - graph = nx.Graph() - graph.add_edge(0, 1) - graph.add_edge(0, 2) - graph.add_edge(0, 3) - graph.add_edge(0, 4) - graph.add_edge(0, 5) - graph.add_edge(1, 2) - matching = nx.maximal_matching(graph) - - vset = set(u for u, v in matching) - vset = vset | set(v for u, v in matching) - - for edge in graph.edges_iter(): - u, v = edge - ok_(len(set([v]) & vset) > 0 or len(set([u]) & vset) > 0, \ - "not a proper matching!") - - eq_(1, len(matching), "matching not length 1!") - graph = nx.Graph() - graph.add_edge(1, 2) - graph.add_edge(1, 5) - graph.add_edge(2, 3) - graph.add_edge(2, 5) - graph.add_edge(3, 4) - graph.add_edge(3, 6) - graph.add_edge(5, 6) - - matching = nx.maximal_matching(graph) - vset = set(u for u, v in matching) - vset = vset | set(v for u, v in matching) - - for edge in graph.edges_iter(): - u, v = edge - ok_(len(set([v]) & vset) > 0 or len(set([u]) & vset) > 0, \ - "not a proper matching!") - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_mis.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_mis.py deleted file mode 100644 index 01092ef..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_mis.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# $Id: test_maximal_independent_set.py 577 2011-03-01 06:07:53Z lleeoo $ -""" -Tests for maximal (not maximum) independent sets. - -""" -# Copyright (C) 2004-2010 by -# Leo Lopes <leo.lopes@monash.edu> -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__author__ = """Leo Lopes (leo.lopes@monash.edu)""" - -from nose.tools import * -import networkx as nx -import random - -class TestMaximalIndependantSet(object): - def setup(self): - self.florentine = nx.Graph() - self.florentine.add_edge('Acciaiuoli','Medici') - self.florentine.add_edge('Castellani','Peruzzi') - self.florentine.add_edge('Castellani','Strozzi') - self.florentine.add_edge('Castellani','Barbadori') - self.florentine.add_edge('Medici','Barbadori') - self.florentine.add_edge('Medici','Ridolfi') - self.florentine.add_edge('Medici','Tornabuoni') - self.florentine.add_edge('Medici','Albizzi') - self.florentine.add_edge('Medici','Salviati') - self.florentine.add_edge('Salviati','Pazzi') - self.florentine.add_edge('Peruzzi','Strozzi') - self.florentine.add_edge('Peruzzi','Bischeri') - self.florentine.add_edge('Strozzi','Ridolfi') - self.florentine.add_edge('Strozzi','Bischeri') - self.florentine.add_edge('Ridolfi','Tornabuoni') - self.florentine.add_edge('Tornabuoni','Guadagni') - self.florentine.add_edge('Albizzi','Ginori') - self.florentine.add_edge('Albizzi','Guadagni') - self.florentine.add_edge('Bischeri','Guadagni') - self.florentine.add_edge('Guadagni','Lamberteschi') - - def test_K5(self): - """Maximal independent set: K5""" - G = nx.complete_graph(5) - for node in G: - assert_equal(nx.maximal_independent_set(G, [node]), [node]) - - def test_K55(self): - """Maximal independent set: K55""" - G = nx.complete_graph(55) - for node in G: - assert_equal(nx.maximal_independent_set(G, [node]), [node]) - - def test_exception(self): - """Bad input should raise exception.""" - G = self.florentine - assert_raises(nx.NetworkXUnfeasible, - nx.maximal_independent_set, G, ["Smith"]) - assert_raises(nx.NetworkXUnfeasible, - nx.maximal_independent_set, G, ["Salviati", "Pazzi"]) - - def test_florentine_family(self): - G = self.florentine - indep = nx.maximal_independent_set(G, ["Medici", "Bischeri"]) - assert_equal(sorted(indep), - sorted(["Medici", "Bischeri", "Castellani", "Pazzi", - "Ginori", "Lamberteschi"])) - - def test_bipartite(self): - G = nx.complete_bipartite_graph(12, 34) - indep = nx.maximal_independent_set(G, [4, 5, 9, 10]) - assert_equal(sorted(indep), list(range(12))) - - - def test_random_graphs(self): - """Generate 50 random graphs of different types and sizes and - make sure that all sets are independent and maximal.""" - for i in range(0, 50, 10): - G = nx.random_graphs.erdos_renyi_graph(i*10+1, random.random()) - IS = nx.maximal_independent_set(G) - assert_false(G.subgraph(IS).edges()) - neighbors_of_MIS = set.union(*(set(G.neighbors(v)) for v in IS)) - for v in set(G.nodes()).difference(IS): - assert_true(v in neighbors_of_MIS) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_mst.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_mst.py deleted file mode 100644 index 5716506..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_mst.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestMST: - - def setUp(self): - # example from Wikipedia: http://en.wikipedia.org/wiki/Kruskal's_algorithm - G=nx.Graph() - edgelist = [(0,3,[('weight',5)]), - (0,1,[('weight',7)]), - (1,3,[('weight',9)]), - (1,2,[('weight',8)]), - (1,4,[('weight',7)]), - (3,4,[('weight',15)]), - (3,5,[('weight',6)]), - (2,4,[('weight',5)]), - (4,5,[('weight',8)]), - (4,6,[('weight',9)]), - (5,6,[('weight',11)])] - - - G.add_edges_from(edgelist) - self.G=G - tree_edgelist = [(0,1,{'weight':7}), - (0,3,{'weight':5}), - (3,5,{'weight':6}), - (1,4,{'weight':7}), - (4,2,{'weight':5}), - (4,6,{'weight':9})] - self.tree_edgelist=sorted((sorted((u, v))[0], sorted((u, v))[1], d) - for u,v,d in tree_edgelist) - - def test_mst(self): - T=nx.minimum_spanning_tree(self.G) - assert_equal(T.edges(data=True),self.tree_edgelist) - - def test_mst_edges(self): - edgelist=sorted(nx.minimum_spanning_edges(self.G)) - assert_equal(edgelist,self.tree_edgelist) - - def test_mst_disconnected(self): - G=nx.Graph() - G.add_path([1,2]) - G.add_path([10,20]) - T=nx.minimum_spanning_tree(G) - assert_equal(sorted(T.edges()),[(1, 2), (20, 10)]) - assert_equal(sorted(T.nodes()),[1, 2, 10, 20]) - - def test_mst_isolate(self): - G=nx.Graph() - G.add_nodes_from([1,2]) - T=nx.minimum_spanning_tree(G) - assert_equal(sorted(T.nodes()),[1, 2]) - assert_equal(sorted(T.edges()),[]) - - def test_mst_attributes(self): - G=nx.Graph() - G.add_edge(1,2,weight=1,color='red',distance=7) - G.add_edge(2,3,weight=1,color='green',distance=2) - G.add_edge(1,3,weight=10,color='blue',distance=1) - G.add_node(13,color='purple') - G.graph['foo']='bar' - T=nx.minimum_spanning_tree(G) - assert_equal(T.graph,G.graph) - assert_equal(T.node[13],G.node[13]) - assert_equal(T.edge[1][2],G.edge[1][2]) - - def test_mst_edges_specify_weight(self): - G=nx.Graph() - G.add_edge(1,2,weight=1,color='red',distance=7) - G.add_edge(1,3,weight=30,color='blue',distance=1) - G.add_edge(2,3,weight=1,color='green',distance=1) - G.add_node(13,color='purple') - G.graph['foo']='bar' - T=nx.minimum_spanning_tree(G) - assert_equal(sorted(T.nodes()),[1,2,3,13]) - assert_equal(sorted(T.edges()),[(1,2),(2,3)]) - T=nx.minimum_spanning_tree(G,weight='distance') - assert_equal(sorted(T.edges()),[(1,3),(2,3)]) - assert_equal(sorted(T.nodes()),[1,2,3,13]) - - def test_prim_mst(self): - T=nx.prim_mst(self.G) - assert_equal(T.edges(data=True),self.tree_edgelist) - - def test_prim_mst_edges(self): - edgelist=sorted(nx.prim_mst_edges(self.G)) - edgelist=sorted((sorted((u, v))[0], sorted((u, v))[1], d) - for u,v,d in edgelist) - assert_equal(edgelist,self.tree_edgelist) - - def test_prim_mst_disconnected(self): - G=nx.Graph() - G.add_path([1,2]) - G.add_path([10,20]) - T=nx.prim_mst(G) - assert_equal(sorted(T.edges()),[(1, 2), (20, 10)]) - assert_equal(sorted(T.nodes()),[1, 2, 10, 20]) - - def test_prim_mst_isolate(self): - G=nx.Graph() - G.add_nodes_from([1,2]) - T=nx.prim_mst(G) - assert_equal(sorted(T.nodes()),[1, 2]) - assert_equal(sorted(T.edges()),[]) - - def test_prim_mst_attributes(self): - G=nx.Graph() - G.add_edge(1,2,weight=1,color='red',distance=7) - G.add_edge(2,3,weight=1,color='green',distance=2) - G.add_edge(1,3,weight=10,color='blue',distance=1) - G.add_node(13,color='purple') - G.graph['foo']='bar' - T=nx.prim_mst(G) - assert_equal(T.graph,G.graph) - assert_equal(T.node[13],G.node[13]) - assert_equal(T.edge[1][2],G.edge[1][2]) - - def test_prim_mst_edges_specify_weight(self): - G=nx.Graph() - G.add_edge(1,2,weight=1,color='red',distance=7) - G.add_edge(1,3,weight=30,color='blue',distance=1) - G.add_edge(2,3,weight=1,color='green',distance=1) - G.add_node(13,color='purple') - G.graph['foo']='bar' - T=nx.prim_mst(G) - assert_equal(sorted(T.nodes()),[1,2,3,13]) - assert_equal(sorted(T.edges()),[(1,2),(2,3)]) - T=nx.prim_mst(G,weight='distance') - assert_equal(sorted(T.edges()),[(1,3),(2,3)]) - assert_equal(sorted(T.nodes()),[1,2,3,13]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_richclub.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_richclub.py deleted file mode 100644 index 8114d91..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_richclub.py +++ /dev/null @@ -1,30 +0,0 @@ -import networkx as nx -from nose.tools import * - - -def test_richclub(): - G = nx.Graph([(0,1),(0,2),(1,2),(1,3),(1,4),(4,5)]) - rc = nx.richclub.rich_club_coefficient(G,normalized=False) - assert_equal(rc,{0: 12.0/30,1:8.0/12}) - - # test single value - rc0 = nx.richclub.rich_club_coefficient(G,normalized=False)[0] - assert_equal(rc0,12.0/30.0) - -def test_richclub_normalized(): - G = nx.Graph([(0,1),(0,2),(1,2),(1,3),(1,4),(4,5)]) - rcNorm = nx.richclub.rich_club_coefficient(G,Q=2) - assert_equal(rcNorm,{0:1.0,1:1.0}) - - -def test_richclub2(): - T = nx.balanced_tree(2,10) - rc = nx.richclub.rich_club_coefficient(T,normalized=False) - assert_equal(rc,{0:4092/(2047*2046.0), - 1:(2044.0/(1023*1022)), - 2:(2040.0/(1022*1021))}) - -#def test_richclub2_normalized(): -# T = nx.balanced_tree(2,10) -# rcNorm = nx.richclub.rich_club_coefficient(T,Q=2) -# assert_true(rcNorm[0] ==1.0 and rcNorm[1] < 0.9 and rcNorm[2] < 0.9) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_simple_paths.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_simple_paths.py deleted file mode 100644 index 268a890..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_simple_paths.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -def test_all_simple_paths(): - G = nx.path_graph(4) - paths = nx.all_simple_paths(G,0,3) - assert_equal(list(list(p) for p in paths),[[0,1,2,3]]) - -def test_all_simple_paths_cutoff(): - G = nx.complete_graph(4) - paths = nx.all_simple_paths(G,0,1,cutoff=1) - assert_equal(list(list(p) for p in paths),[[0,1]]) - paths = nx.all_simple_paths(G,0,1,cutoff=2) - assert_equal(list(list(p) for p in paths),[[0,1],[0,2,1],[0,3,1]]) - -def test_all_simple_paths_multigraph(): - G = nx.MultiGraph([(1,2),(1,2)]) - paths = nx.all_simple_paths(G,1,2) - assert_equal(list(list(p) for p in paths),[[1,2],[1,2]]) - -def test_all_simple_paths_multigraph_with_cutoff(): - G = nx.MultiGraph([(1,2),(1,2),(1,10),(10,2)]) - paths = nx.all_simple_paths(G,1,2, cutoff=1) - assert_equal(list(list(p) for p in paths),[[1,2],[1,2]]) - - -def test_all_simple_paths_directed(): - G = nx.DiGraph() - G.add_path([1,2,3]) - G.add_path([3,2,1]) - paths = nx.all_simple_paths(G,1,3) - assert_equal(list(list(p) for p in paths),[[1,2,3]]) - -def test_all_simple_paths_empty(): - G = nx.path_graph(4) - paths = nx.all_simple_paths(G,0,3,cutoff=2) - assert_equal(list(list(p) for p in paths),[]) - -def hamiltonian_path(G,source): - source = next(G.nodes_iter()) - neighbors = set(G[source])-set([source]) - n = len(G) - for target in neighbors: - for path in nx.all_simple_paths(G,source,target): - if len(path) == n: - yield path - -def test_hamiltonian_path(): - from itertools import permutations - G=nx.complete_graph(4) - paths = [list(p) for p in hamiltonian_path(G,0)] - exact = [[0]+list(p) for p in permutations([1,2,3],3) ] - assert_equal(sorted(paths),sorted(exact)) - -def test_cutoff_zero(): - G = nx.complete_graph(4) - paths = nx.all_simple_paths(G,0,3,cutoff=0) - assert_equal(list(list(p) for p in paths),[]) - paths = nx.all_simple_paths(nx.MultiGraph(G),0,3,cutoff=0) - assert_equal(list(list(p) for p in paths),[]) - -@raises(nx.NetworkXError) -def test_source_missing(): - G = nx.Graph() - G.add_path([1,2,3]) - paths = list(nx.all_simple_paths(nx.MultiGraph(G),0,3)) - -@raises(nx.NetworkXError) -def test_target_missing(): - G = nx.Graph() - G.add_path([1,2,3]) - paths = list(nx.all_simple_paths(nx.MultiGraph(G),1,4)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_smetric.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_smetric.py deleted file mode 100644 index 3fb288b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_smetric.py +++ /dev/null @@ -1,19 +0,0 @@ - -from nose.tools import assert_equal,raises - -import networkx as nx - -def test_smetric(): - g = nx.Graph() - g.add_edge(1,2) - g.add_edge(2,3) - g.add_edge(2,4) - g.add_edge(1,4) - sm = nx.s_metric(g,normalized=False) - assert_equal(sm, 19.0) -# smNorm = nx.s_metric(g,normalized=True) -# assert_equal(smNorm, 0.95) - -@raises(nx.NetworkXError) -def test_normalized(): - sm = nx.s_metric(nx.Graph(),normalized=True) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_swap.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_swap.py deleted file mode 100644 index afa2355..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_swap.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from networkx import * - -def test_double_edge_swap(): - graph = barabasi_albert_graph(200,1) - degrees = sorted(graph.degree().values()) - G = double_edge_swap(graph, 40) - assert_equal(degrees, sorted(graph.degree().values())) - -def test_connected_double_edge_swap(): - graph = barabasi_albert_graph(200,1) - degrees = sorted(graph.degree().values()) - G = connected_double_edge_swap(graph, 40) - assert_true(is_connected(graph)) - assert_equal(degrees, sorted(graph.degree().values())) - -@raises(NetworkXError) -def test_double_edge_swap_small(): - G = nx.double_edge_swap(nx.path_graph(3)) - -@raises(NetworkXError) -def test_double_edge_swap_tries(): - G = nx.double_edge_swap(nx.path_graph(10),nswap=1,max_tries=0) - -@raises(NetworkXError) -def test_connected_double_edge_swap_small(): - G = nx.connected_double_edge_swap(nx.path_graph(3)) - -@raises(NetworkXError) -def test_connected_double_edge_swap_not_connected(): - G = nx.path_graph(3) - G.add_path([10,11,12]) - G = nx.connected_double_edge_swap(G) - - -def test_degree_seq_c4(): - G = cycle_graph(4) - degrees = sorted(G.degree().values()) - G = double_edge_swap(G,1,100) - assert_equal(degrees, sorted(G.degree().values())) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_vitality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_vitality.py deleted file mode 100644 index 06f09fe..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/tests/test_vitality.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestVitality: - - def test_closeness_vitality_unweighted(self): - G=nx.cycle_graph(3) - v=nx.closeness_vitality(G) - assert_equal(v,{0:4.0, 1:4.0, 2:4.0}) - assert_equal(v[0],4.0) - - def test_closeness_vitality_weighted(self): - G=nx.Graph() - G.add_cycle([0,1,2],weight=2) - v=nx.closeness_vitality(G,weight='weight') - assert_equal(v,{0:8.0, 1:8.0, 2:8.0}) - - def test_closeness_vitality_unweighted_digraph(self): - G=nx.DiGraph() - G.add_cycle([0,1,2]) - v=nx.closeness_vitality(G) - assert_equal(v,{0:8.0, 1:8.0, 2:8.0}) - - def test_closeness_vitality_weighted_digraph(self): - G=nx.DiGraph() - G.add_cycle([0,1,2],weight=2) - v=nx.closeness_vitality(G,weight='weight') - assert_equal(v,{0:16.0, 1:16.0, 2:16.0}) - - def test_closeness_vitality_weighted_multidigraph(self): - G=nx.MultiDiGraph() - G.add_cycle([0,1,2],weight=2) - v=nx.closeness_vitality(G,weight='weight') - assert_equal(v,{0:16.0, 1:16.0, 2:16.0}) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/__init__.py deleted file mode 100644 index de558ba..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -import networkx.algorithms.traversal.depth_first_search -from networkx.algorithms.traversal.depth_first_search import * -import networkx.algorithms.traversal.breadth_first_search -from networkx.algorithms.traversal.breadth_first_search import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/breadth_first_search.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/breadth_first_search.py deleted file mode 100644 index 6ef2985..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/breadth_first_search.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -==================== -Breadth-first search -==================== - -Basic algorithms for breadth-first searching. -""" -__author__ = """\n""".join(['Aric Hagberg <hagberg@lanl.gov>']) - -__all__ = ['bfs_edges', 'bfs_tree', - 'bfs_predecessors', 'bfs_successors'] - -import networkx as nx -from collections import defaultdict, deque - -def bfs_edges(G, source, reverse=False): - """Produce edges in a breadth-first-search starting at source.""" - # Based on http://www.ics.uci.edu/~eppstein/PADS/BFS.py - # by D. Eppstein, July 2004. - if reverse and isinstance(G, nx.DiGraph): - neighbors = G.predecessors_iter - else: - neighbors = G.neighbors_iter - visited=set([source]) - queue = deque([(source, neighbors(source))]) - while queue: - parent, children = queue[0] - try: - child = next(children) - if child not in visited: - yield parent, child - visited.add(child) - queue.append((child, neighbors(child))) - except StopIteration: - queue.popleft() - -def bfs_tree(G, source, reverse=False): - """Return directed tree of breadth-first-search from source.""" - T = nx.DiGraph() - T.add_node(source) - T.add_edges_from(bfs_edges(G,source,reverse=reverse)) - return T - -def bfs_predecessors(G, source): - """Return dictionary of predecessors in breadth-first-search from source.""" - return dict((t,s) for s,t in bfs_edges(G,source)) - -def bfs_successors(G, source): - """Return dictionary of successors in breadth-first-search from source.""" - d=defaultdict(list) - for s,t in bfs_edges(G,source): - d[s].append(t) - return dict(d) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/depth_first_search.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/depth_first_search.py deleted file mode 100644 index feb6713..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/depth_first_search.py +++ /dev/null @@ -1,124 +0,0 @@ -""" -================== -Depth-first search -================== - -Basic algorithms for depth-first searching. - -Based on http://www.ics.uci.edu/~eppstein/PADS/DFS.py -by D. Eppstein, July 2004. -""" -__author__ = """\n""".join(['Aric Hagberg <hagberg@lanl.gov>']) - -__all__ = ['dfs_edges', 'dfs_tree', - 'dfs_predecessors', 'dfs_successors', - 'dfs_preorder_nodes','dfs_postorder_nodes', - 'dfs_labeled_edges'] - -import networkx as nx -from collections import defaultdict - -def dfs_edges(G,source=None): - """Produce edges in a depth-first-search starting at source.""" - # Based on http://www.ics.uci.edu/~eppstein/PADS/DFS.py - # by D. Eppstein, July 2004. - if source is None: - # produce edges for all components - nodes=G - else: - # produce edges for components with source - nodes=[source] - visited=set() - for start in nodes: - if start in visited: - continue - visited.add(start) - stack = [(start,iter(G[start]))] - while stack: - parent,children = stack[-1] - try: - child = next(children) - if child not in visited: - yield parent,child - visited.add(child) - stack.append((child,iter(G[child]))) - except StopIteration: - stack.pop() - -def dfs_tree(G, source): - """Return directed tree of depth-first-search from source.""" - T = nx.DiGraph() - if source is None: - T.add_nodes_from(G) - else: - T.add_node(source) - T.add_edges_from(dfs_edges(G,source)) - return T - -def dfs_predecessors(G, source=None): - """Return dictionary of predecessors in depth-first-search from source.""" - return dict((t,s) for s,t in dfs_edges(G,source=source)) - - -def dfs_successors(G, source=None): - """Return dictionary of successors in depth-first-search from source.""" - d=defaultdict(list) - for s,t in dfs_edges(G,source=source): - d[s].append(t) - return dict(d) - - -def dfs_postorder_nodes(G,source=None): - """Produce nodes in a depth-first-search post-ordering starting - from source. - """ - post=(v for u,v,d in nx.dfs_labeled_edges(G,source=source) - if d['dir']=='reverse') - # chain source to end of pre-ordering -# return chain(post,[source]) - return post - - -def dfs_preorder_nodes(G,source=None): - """Produce nodes in a depth-first-search pre-ordering starting at source.""" - pre=(v for u,v,d in nx.dfs_labeled_edges(G,source=source) - if d['dir']=='forward') - # chain source to beginning of pre-ordering -# return chain([source],pre) - return pre - - -def dfs_labeled_edges(G,source=None): - """Produce edges in a depth-first-search starting at source and - labeled by direction type (forward, reverse, nontree). - """ - # Based on http://www.ics.uci.edu/~eppstein/PADS/DFS.py - # by D. Eppstein, July 2004. - if source is None: - # produce edges for all components - nodes=G - else: - # produce edges for components with source - nodes=[source] - visited=set() - for start in nodes: - if start in visited: - continue - yield start,start,{'dir':'forward'} - visited.add(start) - stack = [(start,iter(G[start]))] - while stack: - parent,children = stack[-1] - try: - child = next(children) - if child in visited: - yield parent,child,{'dir':'nontree'} - else: - yield parent,child,{'dir':'forward'} - visited.add(child) - stack.append((child,iter(G[child]))) - except StopIteration: - stack.pop() - if stack: - yield stack[-1][0],parent,{'dir':'reverse'} - yield start,start,{'dir':'reverse'} diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/tests/test_bfs.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/tests/test_bfs.py deleted file mode 100644 index bae2fac..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/tests/test_bfs.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestBFS: - - def setUp(self): - # simple graph - G=nx.Graph() - G.add_edges_from([(0,1),(1,2),(1,3),(2,4),(3,4)]) - self.G=G - - def test_successor(self): - assert_equal(nx.bfs_successors(self.G,source=0), - {0: [1], 1: [2,3], 2:[4]}) - - def test_predecessor(self): - assert_equal(nx.bfs_predecessors(self.G,source=0), - {1: 0, 2: 1, 3: 1, 4: 2}) - - def test_bfs_tree(self): - T=nx.bfs_tree(self.G,source=0) - assert_equal(sorted(T.nodes()),sorted(self.G.nodes())) - assert_equal(sorted(T.edges()),[(0, 1), (1, 2), (1, 3), (2, 4)]) - - def test_bfs_edges(self): - edges=nx.bfs_edges(self.G,source=0) - assert_equal(list(edges),[(0, 1), (1, 2), (1, 3), (2, 4)]) - - def test_bfs_tree_isolates(self): - G = nx.Graph() - G.add_node(1) - G.add_node(2) - T=nx.bfs_tree(G,source=1) - assert_equal(sorted(T.nodes()),[1]) - assert_equal(sorted(T.edges()),[]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/tests/test_dfs.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/tests/test_dfs.py deleted file mode 100644 index 9fad985..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/traversal/tests/test_dfs.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestDFS: - - def setUp(self): - # simple graph - G=nx.Graph() - G.add_edges_from([(0,1),(1,2),(1,3),(2,4),(3,4)]) - self.G=G - # simple graph, disconnected - D=nx.Graph() - D.add_edges_from([(0,1),(2,3)]) - self.D=D - - - def test_preorder_nodes(self): - assert_equal(list(nx.dfs_preorder_nodes(self.G,source=0)), - [0, 1, 2, 4, 3]) - assert_equal(list(nx.dfs_preorder_nodes(self.D)),[0, 1, 2, 3]) - - def test_postorder_nodes(self): - assert_equal(list(nx.dfs_postorder_nodes(self.G,source=0)), - [3, 4, 2, 1, 0]) - assert_equal(list(nx.dfs_postorder_nodes(self.D)),[1, 0, 3, 2]) - - def test_successor(self): - assert_equal(nx.dfs_successors(self.G,source=0), - {0: [1], 1: [2], 2: [4], 4: [3]}) - assert_equal(nx.dfs_successors(self.D), {0: [1], 2: [3]}) - - def test_predecessor(self): - assert_equal(nx.dfs_predecessors(self.G,source=0), - {1: 0, 2: 1, 3: 4, 4: 2}) - assert_equal(nx.dfs_predecessors(self.D), {1: 0, 3: 2}) - - def test_dfs_tree(self): - T=nx.dfs_tree(self.G,source=0) - assert_equal(sorted(T.nodes()),sorted(self.G.nodes())) - assert_equal(sorted(T.edges()),[(0, 1), (1, 2), (2, 4), (4, 3)]) - - def test_dfs_edges(self): - edges=nx.dfs_edges(self.G,source=0) - assert_equal(list(edges),[(0, 1), (1, 2), (2, 4), (4, 3)]) - edges=nx.dfs_edges(self.D) - assert_equal(list(edges),[(0, 1), (2, 3)]) - - def test_dfs_labeled_edges(self): - edges=list(nx.dfs_labeled_edges(self.G,source=0)) - forward=[(u,v) for (u,v,d) in edges if d['dir']=='forward'] - assert_equal(forward,[(0,0), (0, 1), (1, 2), (2, 4), (4, 3)]) - - def test_dfs_labeled_disconnected_edges(self): - edges=list(nx.dfs_labeled_edges(self.D)) - forward=[(u,v) for (u,v,d) in edges if d['dir']=='forward'] - assert_equal(forward,[(0, 0), (0, 1), (2, 2), (2, 3)]) - - def test_dfs_tree_isolates(self): - G = nx.Graph() - G.add_node(1) - G.add_node(2) - T=nx.dfs_tree(G,source=1) - assert_equal(sorted(T.nodes()),[1]) - assert_equal(sorted(T.edges()),[]) - T=nx.dfs_tree(G,source=None) - assert_equal(sorted(T.nodes()),[1, 2]) - assert_equal(sorted(T.edges()),[]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/vitality.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/vitality.py deleted file mode 100644 index c4db32e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/vitality.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Vitality measures. -""" -# Copyright (C) 2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Renato Fabbri']) -__all__ = ['closeness_vitality'] - -def weiner_index(G, weight=None): - # compute sum of distances between all node pairs - # (with optional weights) - weiner=0.0 - if weight is None: - for n in G: - path_length=nx.single_source_shortest_path_length(G,n) - weiner+=sum(path_length.values()) - else: - for n in G: - path_length=nx.single_source_dijkstra_path_length(G, - n,weight=weight) - weiner+=sum(path_length.values()) - return weiner - - -def closeness_vitality(G, weight=None): - """Compute closeness vitality for nodes. - - Closeness vitality of a node is the change in the sum of distances - between all node pairs when excluding that node. - - Parameters - ---------- - G : graph - - weight : None or string (optional) - The name of the edge attribute used as weight. If None the edge - weights are ignored. - - Returns - ------- - nodes : dictionary - Dictionary with nodes as keys and closeness vitality as the value. - - Examples - -------- - >>> G=nx.cycle_graph(3) - >>> nx.closeness_vitality(G) - {0: 4.0, 1: 4.0, 2: 4.0} - - See Also - -------- - closeness_centrality() - - References - ---------- - .. [1] Ulrik Brandes, Sec. 3.6.2 in - Network Analysis: Methodological Foundations, Springer, 2005. - http://books.google.com/books?id=TTNhSm7HYrIC - """ - multigraph = G.is_multigraph() - wig = weiner_index(G,weight) - closeness_vitality = {} - for n in G: - # remove edges connected to node n and keep list of edges with data - # could remove node n but it doesn't count anyway - if multigraph: - edges = G.edges(n,data=True,keys=True) - if G.is_directed(): - edges += G.in_edges(n,data=True,keys=True) - else: - edges = G.edges(n,data=True) - if G.is_directed(): - edges += G.in_edges(n,data=True) - G.remove_edges_from(edges) - closeness_vitality[n] = wig - weiner_index(G,weight) - # add edges and data back to graph - G.add_edges_from(edges) - return closeness_vitality diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/__init__.py deleted file mode 100644 index fa97851..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from networkx.classes.graph import Graph -from networkx.classes.digraph import DiGraph -from networkx.classes.multigraph import MultiGraph -from networkx.classes.multidigraph import MultiDiGraph -from networkx.classes.function import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/digraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/digraph.py deleted file mode 100644 index 37b9f9d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/digraph.py +++ /dev/null @@ -1,1236 +0,0 @@ -"""Base class for directed graphs.""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from copy import deepcopy -import networkx as nx -from networkx.classes.graph import Graph -from networkx.exception import NetworkXError -import networkx.convert as convert -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) - -class DiGraph(Graph): - """ - Base class for directed graphs. - - A DiGraph stores nodes and edges with optional data, or attributes. - - DiGraphs hold directed edges. Self loops are allowed but multiple - (parallel) edges are not. - - Nodes can be arbitrary (hashable) Python objects with optional - key/value attributes. - - Edges are represented as links between nodes with optional - key/value attributes. - - Parameters - ---------- - data : input graph - Data to initialize graph. If data=None (default) an empty - graph is created. The data can be an edge list, or any - NetworkX graph object. If the corresponding optional Python - packages are installed the data can also be a NumPy matrix - or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - - See Also - -------- - Graph - MultiGraph - MultiDiGraph - - Examples - -------- - Create an empty graph structure (a "null graph") with no nodes and - no edges. - - >>> G = nx.DiGraph() - - G can be grown in several ways. - - **Nodes:** - - Add one node at a time: - - >>> G.add_node(1) - - Add the nodes from any container (a list, dict, set or - even the lines from a file or the nodes from another graph). - - >>> G.add_nodes_from([2,3]) - >>> G.add_nodes_from(range(100,110)) - >>> H=nx.Graph() - >>> H.add_path([0,1,2,3,4,5,6,7,8,9]) - >>> G.add_nodes_from(H) - - In addition to strings and integers any hashable Python object - (except None) can represent a node, e.g. a customized node object, - or even another Graph. - - >>> G.add_node(H) - - **Edges:** - - G can also be grown by adding edges. - - Add one edge, - - >>> G.add_edge(1, 2) - - a list of edges, - - >>> G.add_edges_from([(1,2),(1,3)]) - - or a collection of edges, - - >>> G.add_edges_from(H.edges()) - - If some edges connect nodes not yet in the graph, the nodes - are added automatically. There are no errors when adding - nodes or edges that already exist. - - **Attributes:** - - Each graph, node, and edge can hold key/value attribute pairs - in an associated attribute dictionary (the keys must be hashable). - By default these are empty, but can be added or changed using - add_edge, add_node or direct manipulation of the attribute - dictionaries named graph, node and edge respectively. - - >>> G = nx.DiGraph(day="Friday") - >>> G.graph - {'day': 'Friday'} - - Add node attributes using add_node(), add_nodes_from() or G.node - - >>> G.add_node(1, time='5pm') - >>> G.add_nodes_from([3], time='2pm') - >>> G.node[1] - {'time': '5pm'} - >>> G.node[1]['room'] = 714 - >>> del G.node[1]['room'] # remove attribute - >>> G.nodes(data=True) - [(1, {'time': '5pm'}), (3, {'time': '2pm'})] - - Warning: adding a node to G.node does not add it to the graph. - - Add edge attributes using add_edge(), add_edges_from(), subscript - notation, or G.edge. - - >>> G.add_edge(1, 2, weight=4.7 ) - >>> G.add_edges_from([(3,4),(4,5)], color='red') - >>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})]) - >>> G[1][2]['weight'] = 4.7 - >>> G.edge[1][2]['weight'] = 4 - - **Shortcuts:** - - Many common graph features allow python syntax to speed reporting. - - >>> 1 in G # check if node in graph - True - >>> [n for n in G if n<3] # iterate through nodes - [1, 2] - >>> len(G) # number of nodes in graph - 5 - - The fastest way to traverse all edges of a graph is via - adjacency_iter(), but the edges() method is often more convenient. - - >>> for n,nbrsdict in G.adjacency_iter(): - ... for nbr,eattr in nbrsdict.items(): - ... if 'weight' in eattr: - ... (n,nbr,eattr['weight']) - (1, 2, 4) - (2, 3, 8) - >>> [ (u,v,edata['weight']) for u,v,edata in G.edges(data=True) if 'weight' in edata ] - [(1, 2, 4), (2, 3, 8)] - - **Reporting:** - - Simple graph information is obtained using methods. - Iterator versions of many reporting methods exist for efficiency. - Methods exist for reporting nodes(), edges(), neighbors() and degree() - as well as the number of nodes and edges. - - For details on these and other miscellaneous methods, see below. - """ - def __init__(self, data=None, **attr): - """Initialize a graph with edges, name, graph attributes. - - Parameters - ---------- - data : input graph - Data to initialize graph. If data=None (default) an empty - graph is created. The data can be an edge list, or any - NetworkX graph object. If the corresponding optional Python - packages are installed the data can also be a NumPy matrix - or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph. - name : string, optional (default='') - An optional name for the graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - - See Also - -------- - convert - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G = nx.Graph(name='my graph') - >>> e = [(1,2),(2,3),(3,4)] # list of edges - >>> G = nx.Graph(e) - - Arbitrary graph attribute pairs (key=value) may be assigned - - >>> G=nx.Graph(e, day="Friday") - >>> G.graph - {'day': 'Friday'} - - """ - self.graph = {} # dictionary for graph attributes - self.node = {} # dictionary for node attributes - # We store two adjacency lists: - # the predecessors of node n are stored in the dict self.pred - # the successors of node n are stored in the dict self.succ=self.adj - self.adj = {} # empty adjacency dictionary - self.pred = {} # predecessor - self.succ = self.adj # successor - - # attempt to load graph with data - if data is not None: - convert.to_networkx_graph(data,create_using=self) - # load graph attributes (must be after convert) - self.graph.update(attr) - self.edge=self.adj - - - def add_node(self, n, attr_dict=None, **attr): - """Add a single node n and update node attributes. - - Parameters - ---------- - n : node - A node can be any hashable Python object except None. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of node attributes. Key/value pairs will - update existing data associated with the node. - attr : keyword arguments, optional - Set or change attributes using key=value. - - See Also - -------- - add_nodes_from - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_node(1) - >>> G.add_node('Hello') - >>> K3 = nx.Graph([(0,1),(1,2),(2,0)]) - >>> G.add_node(K3) - >>> G.number_of_nodes() - 3 - - Use keywords set/change node attributes: - - >>> G.add_node(1,size=10) - >>> G.add_node(3,weight=0.4,UTM=('13S',382871,3972649)) - - Notes - ----- - A hashable object is one that can be used as a key in a Python - dictionary. This includes strings, numbers, tuples of strings - and numbers, etc. - - On many platforms hashable items also include mutables such as - NetworkX Graphs, though one should be careful that the hash - doesn't change on mutables. - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - if n not in self.succ: - self.succ[n] = {} - self.pred[n] = {} - self.node[n] = attr_dict - else: # update attr even if node already exists - self.node[n].update(attr_dict) - - - def add_nodes_from(self, nodes, **attr): - """Add multiple nodes. - - Parameters - ---------- - nodes : iterable container - A container of nodes (list, dict, set, etc.). - OR - A container of (node, attribute dict) tuples. - Node attributes are updated using the attribute dict. - attr : keyword arguments, optional (default= no attributes) - Update attributes for all nodes in nodes. - Node attributes specified in nodes as a tuple - take precedence over attributes specified generally. - - See Also - -------- - add_node - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_nodes_from('Hello') - >>> K3 = nx.Graph([(0,1),(1,2),(2,0)]) - >>> G.add_nodes_from(K3) - >>> sorted(G.nodes(),key=str) - [0, 1, 2, 'H', 'e', 'l', 'o'] - - Use keywords to update specific node attributes for every node. - - >>> G.add_nodes_from([1,2], size=10) - >>> G.add_nodes_from([3,4], weight=0.4) - - Use (node, attrdict) tuples to update attributes for specific - nodes. - - >>> G.add_nodes_from([(1,dict(size=11)), (2,{'color':'blue'})]) - >>> G.node[1]['size'] - 11 - >>> H = nx.Graph() - >>> H.add_nodes_from(G.nodes(data=True)) - >>> H.node[1]['size'] - 11 - - """ - for n in nodes: - try: - newnode=n not in self.succ - except TypeError: - nn,ndict = n - if nn not in self.succ: - self.succ[nn] = {} - self.pred[nn] = {} - newdict = attr.copy() - newdict.update(ndict) - self.node[nn] = newdict - else: - olddict = self.node[nn] - olddict.update(attr) - olddict.update(ndict) - continue - if newnode: - self.succ[n] = {} - self.pred[n] = {} - self.node[n] = attr.copy() - else: - self.node[n].update(attr) - - def remove_node(self, n): - """Remove node n. - - Removes the node n and all adjacent edges. - Attempting to remove a non-existent node will raise an exception. - - Parameters - ---------- - n : node - A node in the graph - - Raises - ------- - NetworkXError - If n is not in the graph. - - See Also - -------- - remove_nodes_from - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> G.edges() - [(0, 1), (1, 2)] - >>> G.remove_node(1) - >>> G.edges() - [] - - """ - try: - nbrs=self.succ[n] - del self.node[n] - except KeyError: # NetworkXError if n not in self - raise NetworkXError("The node %s is not in the digraph."%(n,)) - for u in nbrs: - del self.pred[u][n] # remove all edges n-u in digraph - del self.succ[n] # remove node from succ - for u in self.pred[n]: - del self.succ[u][n] # remove all edges n-u in digraph - del self.pred[n] # remove node from pred - - - def remove_nodes_from(self, nbunch): - """Remove multiple nodes. - - Parameters - ---------- - nodes : iterable container - A container of nodes (list, dict, set, etc.). If a node - in the container is not in the graph it is silently - ignored. - - See Also - -------- - remove_node - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> e = G.nodes() - >>> e - [0, 1, 2] - >>> G.remove_nodes_from(e) - >>> G.nodes() - [] - - """ - for n in nbunch: - try: - succs=self.succ[n] - del self.node[n] - for u in succs: - del self.pred[u][n] # remove all edges n-u in digraph - del self.succ[n] # now remove node - for u in self.pred[n]: - del self.succ[u][n] # remove all edges n-u in digraph - del self.pred[n] # now remove node - except KeyError: - pass # silent failure on remove - - - def add_edge(self, u, v, attr_dict=None, **attr): - """Add an edge between u and v. - - The nodes u and v will be automatically added if they are - not already in the graph. - - Edge attributes can be specified with keywords or by providing - a dictionary with key/value pairs. See examples below. - - Parameters - ---------- - u,v : nodes - Nodes can be, for example, strings or numbers. - Nodes must be hashable (and not None) Python objects. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with the edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - See Also - -------- - add_edges_from : add a collection of edges - - Notes - ----- - Adding an edge that already exists updates the edge data. - - Many NetworkX algorithms designed for weighted graphs use as - the edge weight a numerical value assigned to a keyword - which by default is 'weight'. - - Examples - -------- - The following all add the edge e=(1,2) to graph G: - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> e = (1,2) - >>> G.add_edge(1, 2) # explicit two-node form - >>> G.add_edge(*e) # single edge as tuple of two nodes - >>> G.add_edges_from( [(1,2)] ) # add edges from iterable container - - Associate data to edges using keywords: - - >>> G.add_edge(1, 2, weight=3) - >>> G.add_edge(1, 3, weight=7, capacity=15, length=342.7) - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - # add nodes - if u not in self.succ: - self.succ[u]={} - self.pred[u]={} - self.node[u] = {} - if v not in self.succ: - self.succ[v]={} - self.pred[v]={} - self.node[v] = {} - # add the edge - datadict=self.adj[u].get(v,{}) - datadict.update(attr_dict) - self.succ[u][v]=datadict - self.pred[v][u]=datadict - - def add_edges_from(self, ebunch, attr_dict=None, **attr): - """Add all the edges in ebunch. - - Parameters - ---------- - ebunch : container of edges - Each edge given in the container will be added to the - graph. The edges must be given as as 2-tuples (u,v) or - 3-tuples (u,v,d) where d is a dictionary containing edge - data. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with each edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - - See Also - -------- - add_edge : add a single edge - add_weighted_edges_from : convenient way to add weighted edges - - Notes - ----- - Adding the same edge twice has no effect but any edge data - will be updated when each duplicate edge is added. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edges_from([(0,1),(1,2)]) # using a list of edge tuples - >>> e = zip(range(0,3),range(1,4)) - >>> G.add_edges_from(e) # Add the path graph 0-1-2-3 - - Associate data to edges - - >>> G.add_edges_from([(1,2),(2,3)], weight=3) - >>> G.add_edges_from([(3,4),(1,4)], label='WN2898') - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dict.") - # process ebunch - for e in ebunch: - ne = len(e) - if ne==3: - u,v,dd = e - assert hasattr(dd,"update") - elif ne==2: - u,v = e - dd = {} - else: - raise NetworkXError(\ - "Edge tuple %s must be a 2-tuple or 3-tuple."%(e,)) - if u not in self.succ: - self.succ[u] = {} - self.pred[u] = {} - self.node[u] = {} - if v not in self.succ: - self.succ[v] = {} - self.pred[v] = {} - self.node[v] = {} - datadict=self.adj[u].get(v,{}) - datadict.update(attr_dict) - datadict.update(dd) - self.succ[u][v] = datadict - self.pred[v][u] = datadict - - - def remove_edge(self, u, v): - """Remove the edge between u and v. - - Parameters - ---------- - u,v: nodes - Remove the edge between nodes u and v. - - Raises - ------ - NetworkXError - If there is not an edge between u and v. - - See Also - -------- - remove_edges_from : remove a collection of edges - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.remove_edge(0,1) - >>> e = (1,2) - >>> G.remove_edge(*e) # unpacks e from an edge tuple - >>> e = (2,3,{'weight':7}) # an edge with attribute data - >>> G.remove_edge(*e[:2]) # select first part of edge tuple - """ - try: - del self.succ[u][v] - del self.pred[v][u] - except KeyError: - raise NetworkXError("The edge %s-%s not in graph."%(u,v)) - - - def remove_edges_from(self, ebunch): - """Remove all edges specified in ebunch. - - Parameters - ---------- - ebunch: list or container of edge tuples - Each edge given in the list or container will be removed - from the graph. The edges can be: - - - 2-tuples (u,v) edge between u and v. - - 3-tuples (u,v,k) where k is ignored. - - See Also - -------- - remove_edge : remove a single edge - - Notes - ----- - Will fail silently if an edge in ebunch is not in the graph. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> ebunch=[(1,2),(2,3)] - >>> G.remove_edges_from(ebunch) - """ - for e in ebunch: - (u,v)=e[:2] # ignore edge data - if u in self.succ and v in self.succ[u]: - del self.succ[u][v] - del self.pred[v][u] - - - def has_successor(self, u, v): - """Return True if node u has successor v. - - This is true if graph has the edge u->v. - """ - return (u in self.succ and v in self.succ[u]) - - def has_predecessor(self, u, v): - """Return True if node u has predecessor v. - - This is true if graph has the edge u<-v. - """ - return (u in self.pred and v in self.pred[u]) - - def successors_iter(self,n): - """Return an iterator over successor nodes of n. - - neighbors_iter() and successors_iter() are the same. - """ - try: - return iter(self.succ[n]) - except KeyError: - raise NetworkXError("The node %s is not in the digraph."%(n,)) - - def predecessors_iter(self,n): - """Return an iterator over predecessor nodes of n.""" - try: - return iter(self.pred[n]) - except KeyError: - raise NetworkXError("The node %s is not in the digraph."%(n,)) - - def successors(self, n): - """Return a list of successor nodes of n. - - neighbors() and successors() are the same function. - """ - return list(self.successors_iter(n)) - - def predecessors(self, n): - """Return a list of predecessor nodes of n.""" - return list(self.predecessors_iter(n)) - - - # digraph definitions - neighbors = successors - neighbors_iter = successors_iter - - def edges_iter(self, nbunch=None, data=False): - """Return an iterator over the edges. - - Edges are returned as tuples with optional data - in the order (node, neighbor, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict in 3-tuple (u,v,data). - - Returns - ------- - edge_iter : iterator - An iterator of (u,v) or (u,v,d) tuples of edges. - - See Also - -------- - edges : return a list of edges - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs this returns the out-edges. - - Examples - -------- - >>> G = nx.DiGraph() # or MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> [e for e in G.edges_iter()] - [(0, 1), (1, 2), (2, 3)] - >>> list(G.edges_iter(data=True)) # default data is {} (empty dict) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - >>> list(G.edges_iter([0,2])) - [(0, 1), (2, 3)] - >>> list(G.edges_iter(0)) - [(0, 1)] - - """ - if nbunch is None: - nodes_nbrs=self.adj.items() - else: - nodes_nbrs=((n,self.adj[n]) for n in self.nbunch_iter(nbunch)) - if data: - for n,nbrs in nodes_nbrs: - for nbr,data in nbrs.items(): - yield (n,nbr,data) - else: - for n,nbrs in nodes_nbrs: - for nbr in nbrs: - yield (n,nbr) - - # alias out_edges to edges - out_edges_iter=edges_iter - out_edges=Graph.edges - - def in_edges_iter(self, nbunch=None, data=False): - """Return an iterator over the incoming edges. - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict in 3-tuple (u,v,data). - - Returns - ------- - in_edge_iter : iterator - An iterator of (u,v) or (u,v,d) tuples of incoming edges. - - See Also - -------- - edges_iter : return an iterator of edges - """ - if nbunch is None: - nodes_nbrs=self.pred.items() - else: - nodes_nbrs=((n,self.pred[n]) for n in self.nbunch_iter(nbunch)) - if data: - for n,nbrs in nodes_nbrs: - for nbr,data in nbrs.items(): - yield (nbr,n,data) - else: - for n,nbrs in nodes_nbrs: - for nbr in nbrs: - yield (nbr,n) - - def in_edges(self, nbunch=None, data=False): - """Return a list of the incoming edges. - - See Also - -------- - edges : return a list of edges - """ - return list(self.in_edges_iter(nbunch, data)) - - def degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, degree). - - The node degree is the number of edges adjacent to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, degree). - - See Also - -------- - degree, in_degree, out_degree, in_degree_iter, out_degree_iter - - Examples - -------- - >>> G = nx.DiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> list(G.degree_iter(0)) # node 0 with degree 1 - [(0, 1)] - >>> list(G.degree_iter([0,1])) - [(0, 1), (1, 2)] - - """ - if nbunch is None: - nodes_nbrs=zip(iter(self.succ.items()),iter(self.pred.items())) - else: - nodes_nbrs=zip( - ((n,self.succ[n]) for n in self.nbunch_iter(nbunch)), - ((n,self.pred[n]) for n in self.nbunch_iter(nbunch))) - - if weight is None: - for (n,succ),(n2,pred) in nodes_nbrs: - yield (n,len(succ)+len(pred)) - else: - # edge weighted graph - degree is sum of edge weights - for (n,succ),(n2,pred) in nodes_nbrs: - yield (n, - sum((succ[nbr].get(weight,1) for nbr in succ))+ - sum((pred[nbr].get(weight,1) for nbr in pred))) - - - def in_degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, in-degree). - - The node in-degree is the number of edges pointing in to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, in-degree). - - See Also - -------- - degree, in_degree, out_degree, out_degree_iter - - Examples - -------- - >>> G = nx.DiGraph() - >>> G.add_path([0,1,2,3]) - >>> list(G.in_degree_iter(0)) # node 0 with degree 0 - [(0, 0)] - >>> list(G.in_degree_iter([0,1])) - [(0, 0), (1, 1)] - - """ - if nbunch is None: - nodes_nbrs=self.pred.items() - else: - nodes_nbrs=((n,self.pred[n]) for n in self.nbunch_iter(nbunch)) - - if weight is None: - for n,nbrs in nodes_nbrs: - yield (n,len(nbrs)) - else: - # edge weighted graph - degree is sum of edge weights - for n,nbrs in nodes_nbrs: - yield (n, sum(data.get(weight,1) for data in nbrs.values())) - - - def out_degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, out-degree). - - The node out-degree is the number of edges pointing out of the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, out-degree). - - See Also - -------- - degree, in_degree, out_degree, in_degree_iter - - Examples - -------- - >>> G = nx.DiGraph() - >>> G.add_path([0,1,2,3]) - >>> list(G.out_degree_iter(0)) # node 0 with degree 1 - [(0, 1)] - >>> list(G.out_degree_iter([0,1])) - [(0, 1), (1, 1)] - - """ - if nbunch is None: - nodes_nbrs=self.succ.items() - else: - nodes_nbrs=((n,self.succ[n]) for n in self.nbunch_iter(nbunch)) - - if weight is None: - for n,nbrs in nodes_nbrs: - yield (n,len(nbrs)) - else: - # edge weighted graph - degree is sum of edge weights - for n,nbrs in nodes_nbrs: - yield (n, sum(data.get(weight,1) for data in nbrs.values())) - - - def in_degree(self, nbunch=None, weight=None): - """Return the in-degree of a node or nodes. - - The node in-degree is the number of edges pointing in to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd : dictionary, or number - A dictionary with nodes as keys and in-degree as values or - a number if a single node is specified. - - See Also - -------- - degree, out_degree, in_degree_iter - - Examples - -------- - >>> G = nx.DiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> G.in_degree(0) - 0 - >>> G.in_degree([0,1]) - {0: 0, 1: 1} - >>> list(G.in_degree([0,1]).values()) - [0, 1] - """ - if nbunch in self: # return a single node - return next(self.in_degree_iter(nbunch,weight))[1] - else: # return a dict - return dict(self.in_degree_iter(nbunch,weight)) - - def out_degree(self, nbunch=None, weight=None): - """Return the out-degree of a node or nodes. - - The node out-degree is the number of edges pointing out of the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd : dictionary, or number - A dictionary with nodes as keys and out-degree as values or - a number if a single node is specified. - - Examples - -------- - >>> G = nx.DiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> G.out_degree(0) - 1 - >>> G.out_degree([0,1]) - {0: 1, 1: 1} - >>> list(G.out_degree([0,1]).values()) - [1, 1] - - - """ - if nbunch in self: # return a single node - return next(self.out_degree_iter(nbunch,weight))[1] - else: # return a dict - return dict(self.out_degree_iter(nbunch,weight)) - - def clear(self): - """Remove all nodes and edges from the graph. - - This also removes the name, and all graph, node, and edge attributes. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.clear() - >>> G.nodes() - [] - >>> G.edges() - [] - - """ - self.succ.clear() - self.pred.clear() - self.node.clear() - self.graph.clear() - - - def is_multigraph(self): - """Return True if graph is a multigraph, False otherwise.""" - return False - - - def is_directed(self): - """Return True if graph is directed, False otherwise.""" - return True - - def to_directed(self): - """Return a directed copy of the graph. - - Returns - ------- - G : DiGraph - A deepcopy of the graph. - - Notes - ----- - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar D=DiGraph(G) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - - Examples - -------- - >>> G = nx.Graph() # or MultiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1), (1, 0)] - - If already directed, return a (deep) copy - - >>> G = nx.DiGraph() # or MultiDiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1)] - """ - return deepcopy(self) - - def to_undirected(self, reciprocal=False): - """Return an undirected representation of the digraph. - - Parameters - ---------- - reciprocal : bool (optional) - If True only keep edges that appear in both directions - in the original digraph. - - Returns - ------- - G : Graph - An undirected graph with the same name and nodes and - with edge (u,v,data) if either (u,v,data) or (v,u,data) - is in the digraph. If both edges exist in digraph and - their edge data is different, only one edge is created - with an arbitrary choice of which edge data to use. - You must check and correct for this manually if desired. - - Notes - ----- - If edges in both directions (u,v) and (v,u) exist in the - graph, attributes for the new undirected edge will be a combination of - the attributes of the directed edges. The edge data is updated - in the (arbitrary) order that the edges are encountered. For - more customized control of the edge attributes use add_edge(). - - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar G=DiGraph(D) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - """ - H=Graph() - H.name=self.name - H.add_nodes_from(self) - if reciprocal is True: - H.add_edges_from( (u,v,deepcopy(d)) - for u,nbrs in self.adjacency_iter() - for v,d in nbrs.items() - if v in self.pred[u]) - else: - H.add_edges_from( (u,v,deepcopy(d)) - for u,nbrs in self.adjacency_iter() - for v,d in nbrs.items() ) - H.graph=deepcopy(self.graph) - H.node=deepcopy(self.node) - return H - - - def reverse(self, copy=True): - """Return the reverse of the graph. - - The reverse is a graph with the same nodes and edges - but with the directions of the edges reversed. - - Parameters - ---------- - copy : bool optional (default=True) - If True, return a new DiGraph holding the reversed edges. - If False, reverse the reverse graph is created using - the original graph (this changes the original graph). - """ - if copy: - H = self.__class__(name="Reverse of (%s)"%self.name) - H.add_nodes_from(self) - H.add_edges_from( (v,u,deepcopy(d)) for u,v,d - in self.edges(data=True) ) - H.graph=deepcopy(self.graph) - H.node=deepcopy(self.node) - else: - self.pred,self.succ=self.succ,self.pred - self.adj=self.succ - H=self - return H - - - def subgraph(self, nbunch): - """Return the subgraph induced on nodes in nbunch. - - The induced subgraph of the graph contains the nodes in nbunch - and the edges between those nodes. - - Parameters - ---------- - nbunch : list, iterable - A container of nodes which will be iterated through once. - - Returns - ------- - G : Graph - A subgraph of the graph with the same edge attributes. - - Notes - ----- - The graph, edge or node attributes just point to the original graph. - So changes to the node or edge structure will not be reflected in - the original graph while changes to the attributes will. - - To create a subgraph with its own copy of the edge/node attributes use: - nx.Graph(G.subgraph(nbunch)) - - If edge attributes are containers, a deep copy can be obtained using: - G.subgraph(nbunch).copy() - - For an inplace reduction of a graph to a subgraph you can remove nodes: - G.remove_nodes_from([ n in G if n not in set(nbunch)]) - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> H = G.subgraph([0,1,2]) - >>> H.edges() - [(0, 1), (1, 2)] - """ - bunch = self.nbunch_iter(nbunch) - # create new graph and copy subgraph into it - H = self.__class__() - # copy node and attribute dictionaries - for n in bunch: - H.node[n]=self.node[n] - # namespace shortcuts for speed - H_succ=H.succ - H_pred=H.pred - self_succ=self.succ - # add nodes - for n in H: - H_succ[n]={} - H_pred[n]={} - # add edges - for u in H_succ: - Hnbrs=H_succ[u] - for v,datadict in self_succ[u].items(): - if v in H_succ: - # add both representations of edge: u-v and v-u - Hnbrs[v]=datadict - H_pred[v][u]=datadict - H.graph=self.graph - return H diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/function.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/function.py deleted file mode 100644 index 0c5e208..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/function.py +++ /dev/null @@ -1,423 +0,0 @@ -"""Functional interface to graph methods and assorted utilities. -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# -import networkx as nx -import itertools -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) -__all__ = ['nodes', 'edges', 'degree', 'degree_histogram', 'neighbors', - 'number_of_nodes', 'number_of_edges', 'density', - 'nodes_iter', 'edges_iter', 'is_directed','info', - 'freeze','is_frozen','subgraph','create_empty_copy', - 'set_node_attributes','get_node_attributes', - 'set_edge_attributes','get_edge_attributes', - 'all_neighbors','non_neighbors'] - -def nodes(G): - """Return a copy of the graph nodes in a list.""" - return G.nodes() - -def nodes_iter(G): - """Return an iterator over the graph nodes.""" - return G.nodes_iter() - -def edges(G,nbunch=None): - """Return list of edges adjacent to nodes in nbunch. - - Return all edges if nbunch is unspecified or nbunch=None. - - For digraphs, edges=out_edges - """ - return G.edges(nbunch) - -def edges_iter(G,nbunch=None): - """Return iterator over edges adjacent to nodes in nbunch. - - Return all edges if nbunch is unspecified or nbunch=None. - - For digraphs, edges=out_edges - """ - return G.edges_iter(nbunch) - -def degree(G,nbunch=None,weight=None): - """Return degree of single node or of nbunch of nodes. - If nbunch is ommitted, then return degrees of *all* nodes. - """ - return G.degree(nbunch,weight) - -def neighbors(G,n): - """Return a list of nodes connected to node n. """ - return G.neighbors(n) - -def number_of_nodes(G): - """Return the number of nodes in the graph.""" - return G.number_of_nodes() - -def number_of_edges(G): - """Return the number of edges in the graph. """ - return G.number_of_edges() - -def density(G): - r"""Return the density of a graph. - - The density for undirected graphs is - - .. math:: - - d = \frac{2m}{n(n-1)}, - - and for directed graphs is - - .. math:: - - d = \frac{m}{n(n-1)}, - - where `n` is the number of nodes and `m` is the number of edges in `G`. - - Notes - ----- - The density is 0 for a graph without edges and 1 for a complete graph. - The density of multigraphs can be higher than 1. - - Self loops are counted in the total number of edges so graphs with self - loops can have density higher than 1. - """ - n=number_of_nodes(G) - m=number_of_edges(G) - if m==0 or n <= 1: - d=0.0 - else: - if G.is_directed(): - d=m/float(n*(n-1)) - else: - d= m*2.0/float(n*(n-1)) - return d - -def degree_histogram(G): - """Return a list of the frequency of each degree value. - - Parameters - ---------- - G : Networkx graph - A graph - - Returns - ------- - hist : list - A list of frequencies of degrees. - The degree values are the index in the list. - - Notes - ----- - Note: the bins are width one, hence len(list) can be large - (Order(number_of_edges)) - """ - degseq=list(G.degree().values()) - dmax=max(degseq)+1 - freq= [ 0 for d in range(dmax) ] - for d in degseq: - freq[d] += 1 - return freq - -def is_directed(G): - """ Return True if graph is directed.""" - return G.is_directed() - - -def freeze(G): - """Modify graph to prevent further change by adding or removing - nodes or edges. - - Node and edge data can still be modified. - - Parameters - ----------- - G : graph - A NetworkX graph - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_path([0,1,2,3]) - >>> G=nx.freeze(G) - >>> try: - ... G.add_edge(4,5) - ... except nx.NetworkXError as e: - ... print(str(e)) - Frozen graph can't be modified - - Notes - ----- - To "unfreeze" a graph you must make a copy by creating a new graph object: - - >>> graph = nx.path_graph(4) - >>> frozen_graph = nx.freeze(graph) - >>> unfrozen_graph = nx.Graph(frozen_graph) - >>> nx.is_frozen(unfrozen_graph) - False - - See Also - -------- - is_frozen - """ - def frozen(*args): - raise nx.NetworkXError("Frozen graph can't be modified") - G.add_node=frozen - G.add_nodes_from=frozen - G.remove_node=frozen - G.remove_nodes_from=frozen - G.add_edge=frozen - G.add_edges_from=frozen - G.remove_edge=frozen - G.remove_edges_from=frozen - G.clear=frozen - G.frozen=True - return G - -def is_frozen(G): - """Return True if graph is frozen. - - Parameters - ----------- - G : graph - A NetworkX graph - - See Also - -------- - freeze - """ - try: - return G.frozen - except AttributeError: - return False - -def subgraph(G, nbunch): - """Return the subgraph induced on nodes in nbunch. - - Parameters - ---------- - G : graph - A NetworkX graph - - nbunch : list, iterable - A container of nodes that will be iterated through once (thus - it should be an iterator or be iterable). Each element of the - container should be a valid node type: any hashable type except - None. If nbunch is None, return all edges data in the graph. - Nodes in nbunch that are not in the graph will be (quietly) - ignored. - - Notes - ----- - subgraph(G) calls G.subgraph() - """ - return G.subgraph(nbunch) - -def create_empty_copy(G,with_nodes=True): - """Return a copy of the graph G with all of the edges removed. - - Parameters - ---------- - G : graph - A NetworkX graph - - with_nodes : bool (default=True) - Include nodes. - - Notes - ----- - Graph, node, and edge data is not propagated to the new graph. - """ - H=G.__class__() - if with_nodes: - H.add_nodes_from(G) - return H - - -def info(G, n=None): - """Print short summary of information for the graph G or the node n. - - Parameters - ---------- - G : Networkx graph - A graph - n : node (any hashable) - A node in the graph G - """ - info='' # append this all to a string - if n is None: - info+="Name: %s\n"%G.name - type_name = [type(G).__name__] - info+="Type: %s\n"%",".join(type_name) - info+="Number of nodes: %d\n"%G.number_of_nodes() - info+="Number of edges: %d\n"%G.number_of_edges() - nnodes=G.number_of_nodes() - if len(G) > 0: - if G.is_directed(): - info+="Average in degree: %8.4f\n"%\ - (sum(G.in_degree().values())/float(nnodes)) - info+="Average out degree: %8.4f"%\ - (sum(G.out_degree().values())/float(nnodes)) - else: - s=sum(G.degree().values()) - info+="Average degree: %8.4f"%\ - (float(s)/float(nnodes)) - - else: - if n not in G: - raise nx.NetworkXError("node %s not in graph"%(n,)) - info+="Node % s has the following properties:\n"%n - info+="Degree: %d\n"%G.degree(n) - info+="Neighbors: " - info+=' '.join(str(nbr) for nbr in G.neighbors(n)) - return info - -def set_node_attributes(G,name,attributes): - """Set node attributes from dictionary of nodes and values - - Parameters - ---------- - G : NetworkX Graph - - name : string - Attribute name - - attributes: dict - Dictionary of attributes keyed by node. - - Examples - -------- - >>> G=nx.path_graph(3) - >>> bb=nx.betweenness_centrality(G) - >>> nx.set_node_attributes(G,'betweenness',bb) - >>> G.node[1]['betweenness'] - 1.0 - """ - for node,value in attributes.items(): - G.node[node][name]=value - -def get_node_attributes(G,name): - """Get node attributes from graph - - Parameters - ---------- - G : NetworkX Graph - - name : string - Attribute name - - Returns - ------- - Dictionary of attributes keyed by node. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_nodes_from([1,2,3],color='red') - >>> color=nx.get_node_attributes(G,'color') - >>> color[1] - 'red' - """ - return dict( (n,d[name]) for n,d in G.node.items() if name in d) - - -def set_edge_attributes(G,name,attributes): - """Set edge attributes from dictionary of edge tuples and values - - Parameters - ---------- - G : NetworkX Graph - - name : string - Attribute name - - attributes: dict - Dictionary of attributes keyed by edge (tuple). - - Examples - -------- - >>> G=nx.path_graph(3) - >>> bb=nx.edge_betweenness_centrality(G, normalized=False) - >>> nx.set_edge_attributes(G,'betweenness',bb) - >>> G[1][2]['betweenness'] - 2.0 - """ - for (u,v),value in attributes.items(): - G[u][v][name]=value - -def get_edge_attributes(G,name): - """Get edge attributes from graph - - Parameters - ---------- - G : NetworkX Graph - - name : string - Attribute name - - Returns - ------- - Dictionary of attributes keyed by node. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_path([1,2,3],color='red') - >>> color=nx.get_edge_attributes(G,'color') - >>> color[(1,2)] - 'red' - """ - return dict( ((u,v),d[name]) for u,v,d in G.edges(data=True) if name in d) - - -def all_neighbors(graph, node): - """ Returns all of the neighbors of a node in the graph. - - If the graph is directed returns predecessors as well as successors. - - Parameters - ---------- - graph : NetworkX graph - Graph to find neighbors. - - node : node - The node whose neighbors will be returned. - - Returns - ------- - neighbors : iterator - Iterator of neighbors - """ - if graph.is_directed(): - values = itertools.chain.from_iterable([graph.predecessors_iter(node), - graph.successors_iter(node)]) - else: - values = graph.neighbors_iter(node) - - return values - -def non_neighbors(graph, node): - """Returns the non-neighbors of the node in the graph. - - Parameters - ---------- - graph : NetworkX graph - Graph to find neighbors. - - node : node - The node whose neighbors will be returned. - - Returns - ------- - non_neighbors : iterator - Iterator of nodes in the graph that are not neighbors of the node. - """ - nbors = set(neighbors(graph, node)) | set([node]) - return (nnode for nnode in graph if nnode not in nbors) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/graph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/graph.py deleted file mode 100644 index 9ef7c23..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/graph.py +++ /dev/null @@ -1,1816 +0,0 @@ -"""Base class for undirected graphs. - -The Graph class allows any hashable object as a node -and can associate key/value attribute pairs with each undirected edge. - -Self-loops are allowed but multiple edges are not (see MultiGraph). - -For directed graphs see DiGraph and MultiDiGraph. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from copy import deepcopy -import networkx as nx -from networkx.exception import NetworkXError -import networkx.convert as convert - -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) - -class Graph(object): - """ - Base class for undirected graphs. - - A Graph stores nodes and edges with optional data, or attributes. - - Graphs hold undirected edges. Self loops are allowed but multiple - (parallel) edges are not. - - Nodes can be arbitrary (hashable) Python objects with optional - key/value attributes. - - Edges are represented as links between nodes with optional - key/value attributes. - - Parameters - ---------- - data : input graph - Data to initialize graph. If data=None (default) an empty - graph is created. The data can be an edge list, or any - NetworkX graph object. If the corresponding optional Python - packages are installed the data can also be a NumPy matrix - or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - - See Also - -------- - DiGraph - MultiGraph - MultiDiGraph - - Examples - -------- - Create an empty graph structure (a "null graph") with no nodes and - no edges. - - >>> G = nx.Graph() - - G can be grown in several ways. - - **Nodes:** - - Add one node at a time: - - >>> G.add_node(1) - - Add the nodes from any container (a list, dict, set or - even the lines from a file or the nodes from another graph). - - >>> G.add_nodes_from([2,3]) - >>> G.add_nodes_from(range(100,110)) - >>> H=nx.Graph() - >>> H.add_path([0,1,2,3,4,5,6,7,8,9]) - >>> G.add_nodes_from(H) - - In addition to strings and integers any hashable Python object - (except None) can represent a node, e.g. a customized node object, - or even another Graph. - - >>> G.add_node(H) - - **Edges:** - - G can also be grown by adding edges. - - Add one edge, - - >>> G.add_edge(1, 2) - - a list of edges, - - >>> G.add_edges_from([(1,2),(1,3)]) - - or a collection of edges, - - >>> G.add_edges_from(H.edges()) - - If some edges connect nodes not yet in the graph, the nodes - are added automatically. There are no errors when adding - nodes or edges that already exist. - - **Attributes:** - - Each graph, node, and edge can hold key/value attribute pairs - in an associated attribute dictionary (the keys must be hashable). - By default these are empty, but can be added or changed using - add_edge, add_node or direct manipulation of the attribute - dictionaries named graph, node and edge respectively. - - >>> G = nx.Graph(day="Friday") - >>> G.graph - {'day': 'Friday'} - - Add node attributes using add_node(), add_nodes_from() or G.node - - >>> G.add_node(1, time='5pm') - >>> G.add_nodes_from([3], time='2pm') - >>> G.node[1] - {'time': '5pm'} - >>> G.node[1]['room'] = 714 - >>> del G.node[1]['room'] # remove attribute - >>> G.nodes(data=True) - [(1, {'time': '5pm'}), (3, {'time': '2pm'})] - - Warning: adding a node to G.node does not add it to the graph. - - Add edge attributes using add_edge(), add_edges_from(), subscript - notation, or G.edge. - - >>> G.add_edge(1, 2, weight=4.7 ) - >>> G.add_edges_from([(3,4),(4,5)], color='red') - >>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})]) - >>> G[1][2]['weight'] = 4.7 - >>> G.edge[1][2]['weight'] = 4 - - **Shortcuts:** - - Many common graph features allow python syntax to speed reporting. - - >>> 1 in G # check if node in graph - True - >>> [n for n in G if n<3] # iterate through nodes - [1, 2] - >>> len(G) # number of nodes in graph - 5 - - The fastest way to traverse all edges of a graph is via - adjacency_iter(), but the edges() method is often more convenient. - - >>> for n,nbrsdict in G.adjacency_iter(): - ... for nbr,eattr in nbrsdict.items(): - ... if 'weight' in eattr: - ... (n,nbr,eattr['weight']) - (1, 2, 4) - (2, 1, 4) - (2, 3, 8) - (3, 2, 8) - >>> [ (u,v,edata['weight']) for u,v,edata in G.edges(data=True) if 'weight' in edata ] - [(1, 2, 4), (2, 3, 8)] - - **Reporting:** - - Simple graph information is obtained using methods. - Iterator versions of many reporting methods exist for efficiency. - Methods exist for reporting nodes(), edges(), neighbors() and degree() - as well as the number of nodes and edges. - - For details on these and other miscellaneous methods, see below. - """ - def __init__(self, data=None, **attr): - """Initialize a graph with edges, name, graph attributes. - - Parameters - ---------- - data : input graph - Data to initialize graph. If data=None (default) an empty - graph is created. The data can be an edge list, or any - NetworkX graph object. If the corresponding optional Python - packages are installed the data can also be a NumPy matrix - or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph. - name : string, optional (default='') - An optional name for the graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - - See Also - -------- - convert - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G = nx.Graph(name='my graph') - >>> e = [(1,2),(2,3),(3,4)] # list of edges - >>> G = nx.Graph(e) - - Arbitrary graph attribute pairs (key=value) may be assigned - - >>> G=nx.Graph(e, day="Friday") - >>> G.graph - {'day': 'Friday'} - - """ - self.graph = {} # dictionary for graph attributes - self.node = {} # empty node dict (created before convert) - self.adj = {} # empty adjacency dict - # attempt to load graph with data - if data is not None: - convert.to_networkx_graph(data,create_using=self) - # load graph attributes (must be after convert) - self.graph.update(attr) - self.edge = self.adj - - @property - def name(self): - return self.graph.get('name','') - @name.setter - def name(self, s): - self.graph['name']=s - - def __str__(self): - """Return the graph name. - - Returns - ------- - name : string - The name of the graph. - - Examples - -------- - >>> G = nx.Graph(name='foo') - >>> str(G) - 'foo' - """ - return self.name - - def __iter__(self): - """Iterate over the nodes. Use the expression 'for n in G'. - - Returns - ------- - niter : iterator - An iterator over all nodes in the graph. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - """ - return iter(self.node) - - def __contains__(self,n): - """Return True if n is a node, False otherwise. Use the expression - 'n in G'. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> 1 in G - True - """ - try: - return n in self.node - except TypeError: - return False - - def __len__(self): - """Return the number of nodes. Use the expression 'len(G)'. - - Returns - ------- - nnodes : int - The number of nodes in the graph. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> len(G) - 4 - - """ - return len(self.node) - - def __getitem__(self, n): - """Return a dict of neighbors of node n. Use the expression 'G[n]'. - - Parameters - ---------- - n : node - A node in the graph. - - Returns - ------- - adj_dict : dictionary - The adjacency dictionary for nodes connected to n. - - Notes - ----- - G[n] is similar to G.neighbors(n) but the internal data dictionary - is returned instead of a list. - - Assigning G[n] will corrupt the internal graph data structure. - Use G[n] for reading data only. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G[0] - {1: {}} - """ - return self.adj[n] - - - def add_node(self, n, attr_dict=None, **attr): - """Add a single node n and update node attributes. - - Parameters - ---------- - n : node - A node can be any hashable Python object except None. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of node attributes. Key/value pairs will - update existing data associated with the node. - attr : keyword arguments, optional - Set or change attributes using key=value. - - See Also - -------- - add_nodes_from - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_node(1) - >>> G.add_node('Hello') - >>> K3 = nx.Graph([(0,1),(1,2),(2,0)]) - >>> G.add_node(K3) - >>> G.number_of_nodes() - 3 - - Use keywords set/change node attributes: - - >>> G.add_node(1,size=10) - >>> G.add_node(3,weight=0.4,UTM=('13S',382871,3972649)) - - Notes - ----- - A hashable object is one that can be used as a key in a Python - dictionary. This includes strings, numbers, tuples of strings - and numbers, etc. - - On many platforms hashable items also include mutables such as - NetworkX Graphs, though one should be careful that the hash - doesn't change on mutables. - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - if n not in self.node: - self.adj[n] = {} - self.node[n] = attr_dict - else: # update attr even if node already exists - self.node[n].update(attr_dict) - - - def add_nodes_from(self, nodes, **attr): - """Add multiple nodes. - - Parameters - ---------- - nodes : iterable container - A container of nodes (list, dict, set, etc.). - OR - A container of (node, attribute dict) tuples. - Node attributes are updated using the attribute dict. - attr : keyword arguments, optional (default= no attributes) - Update attributes for all nodes in nodes. - Node attributes specified in nodes as a tuple - take precedence over attributes specified generally. - - See Also - -------- - add_node - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_nodes_from('Hello') - >>> K3 = nx.Graph([(0,1),(1,2),(2,0)]) - >>> G.add_nodes_from(K3) - >>> sorted(G.nodes(),key=str) - [0, 1, 2, 'H', 'e', 'l', 'o'] - - Use keywords to update specific node attributes for every node. - - >>> G.add_nodes_from([1,2], size=10) - >>> G.add_nodes_from([3,4], weight=0.4) - - Use (node, attrdict) tuples to update attributes for specific - nodes. - - >>> G.add_nodes_from([(1,dict(size=11)), (2,{'color':'blue'})]) - >>> G.node[1]['size'] - 11 - >>> H = nx.Graph() - >>> H.add_nodes_from(G.nodes(data=True)) - >>> H.node[1]['size'] - 11 - - """ - for n in nodes: - try: - newnode=n not in self.node - except TypeError: - nn,ndict = n - if nn not in self.node: - self.adj[nn] = {} - newdict = attr.copy() - newdict.update(ndict) - self.node[nn] = newdict - else: - olddict = self.node[nn] - olddict.update(attr) - olddict.update(ndict) - continue - if newnode: - self.adj[n] = {} - self.node[n] = attr.copy() - else: - self.node[n].update(attr) - - def remove_node(self,n): - """Remove node n. - - Removes the node n and all adjacent edges. - Attempting to remove a non-existent node will raise an exception. - - Parameters - ---------- - n : node - A node in the graph - - Raises - ------- - NetworkXError - If n is not in the graph. - - See Also - -------- - remove_nodes_from - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> G.edges() - [(0, 1), (1, 2)] - >>> G.remove_node(1) - >>> G.edges() - [] - - """ - adj = self.adj - try: - nbrs = list(adj[n].keys()) # keys handles self-loops (allow mutation later) - del self.node[n] - except KeyError: # NetworkXError if n not in self - raise NetworkXError("The node %s is not in the graph."%(n,)) - for u in nbrs: - del adj[u][n] # remove all edges n-u in graph - del adj[n] # now remove node - - - def remove_nodes_from(self, nodes): - """Remove multiple nodes. - - Parameters - ---------- - nodes : iterable container - A container of nodes (list, dict, set, etc.). If a node - in the container is not in the graph it is silently - ignored. - - See Also - -------- - remove_node - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> e = G.nodes() - >>> e - [0, 1, 2] - >>> G.remove_nodes_from(e) - >>> G.nodes() - [] - - """ - adj = self.adj - for n in nodes: - try: - del self.node[n] - for u in list(adj[n].keys()): # keys() handles self-loops - del adj[u][n] #(allows mutation of dict in loop) - del adj[n] - except KeyError: - pass - - - def nodes_iter(self, data=False): - """Return an iterator over the nodes. - - Parameters - ---------- - data : boolean, optional (default=False) - If False the iterator returns nodes. If True - return a two-tuple of node and node data dictionary - - Returns - ------- - niter : iterator - An iterator over nodes. If data=True the iterator gives - two-tuples containing (node, node data, dictionary) - - Notes - ----- - If the node data is not required it is simpler and equivalent - to use the expression 'for n in G'. - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - - >>> [d for n,d in G.nodes_iter(data=True)] - [{}, {}, {}] - """ - if data: - return iter(self.node.items()) - return iter(self.node) - - def nodes(self, data=False): - """Return a list of the nodes in the graph. - - Parameters - ---------- - data : boolean, optional (default=False) - If False return a list of nodes. If True return a - two-tuple of node and node data dictionary - - Returns - ------- - nlist : list - A list of nodes. If data=True a list of two-tuples containing - (node, node data dictionary). - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> G.nodes() - [0, 1, 2] - >>> G.add_node(1, time='5pm') - >>> G.nodes(data=True) - [(0, {}), (1, {'time': '5pm'}), (2, {})] - """ - return list(self.nodes_iter(data=data)) - - def number_of_nodes(self): - """Return the number of nodes in the graph. - - Returns - ------- - nnodes : int - The number of nodes in the graph. - - See Also - -------- - order, __len__ which are identical - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> len(G) - 3 - """ - return len(self.node) - - def order(self): - """Return the number of nodes in the graph. - - Returns - ------- - nnodes : int - The number of nodes in the graph. - - See Also - -------- - number_of_nodes, __len__ which are identical - - """ - return len(self.node) - - def has_node(self, n): - """Return True if the graph contains the node n. - - Parameters - ---------- - n : node - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2]) - >>> G.has_node(0) - True - - It is more readable and simpler to use - - >>> 0 in G - True - - """ - try: - return n in self.node - except TypeError: - return False - - def add_edge(self, u, v, attr_dict=None, **attr): - """Add an edge between u and v. - - The nodes u and v will be automatically added if they are - not already in the graph. - - Edge attributes can be specified with keywords or by providing - a dictionary with key/value pairs. See examples below. - - Parameters - ---------- - u,v : nodes - Nodes can be, for example, strings or numbers. - Nodes must be hashable (and not None) Python objects. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with the edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - See Also - -------- - add_edges_from : add a collection of edges - - Notes - ----- - Adding an edge that already exists updates the edge data. - - Many NetworkX algorithms designed for weighted graphs use as - the edge weight a numerical value assigned to a keyword - which by default is 'weight'. - - Examples - -------- - The following all add the edge e=(1,2) to graph G: - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> e = (1,2) - >>> G.add_edge(1, 2) # explicit two-node form - >>> G.add_edge(*e) # single edge as tuple of two nodes - >>> G.add_edges_from( [(1,2)] ) # add edges from iterable container - - Associate data to edges using keywords: - - >>> G.add_edge(1, 2, weight=3) - >>> G.add_edge(1, 3, weight=7, capacity=15, length=342.7) - """ - # set up attribute dictionary - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - # add nodes - if u not in self.node: - self.adj[u] = {} - self.node[u] = {} - if v not in self.node: - self.adj[v] = {} - self.node[v] = {} - # add the edge - datadict=self.adj[u].get(v,{}) - datadict.update(attr_dict) - self.adj[u][v] = datadict - self.adj[v][u] = datadict - - - def add_edges_from(self, ebunch, attr_dict=None, **attr): - """Add all the edges in ebunch. - - Parameters - ---------- - ebunch : container of edges - Each edge given in the container will be added to the - graph. The edges must be given as as 2-tuples (u,v) or - 3-tuples (u,v,d) where d is a dictionary containing edge - data. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with each edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - - See Also - -------- - add_edge : add a single edge - add_weighted_edges_from : convenient way to add weighted edges - - Notes - ----- - Adding the same edge twice has no effect but any edge data - will be updated when each duplicate edge is added. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edges_from([(0,1),(1,2)]) # using a list of edge tuples - >>> e = zip(range(0,3),range(1,4)) - >>> G.add_edges_from(e) # Add the path graph 0-1-2-3 - - Associate data to edges - - >>> G.add_edges_from([(1,2),(2,3)], weight=3) - >>> G.add_edges_from([(3,4),(1,4)], label='WN2898') - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - # process ebunch - for e in ebunch: - ne=len(e) - if ne==3: - u,v,dd = e - elif ne==2: - u,v = e - dd = {} - else: - raise NetworkXError(\ - "Edge tuple %s must be a 2-tuple or 3-tuple."%(e,)) - if u not in self.node: - self.adj[u] = {} - self.node[u] = {} - if v not in self.node: - self.adj[v] = {} - self.node[v] = {} - datadict=self.adj[u].get(v,{}) - datadict.update(attr_dict) - datadict.update(dd) - self.adj[u][v] = datadict - self.adj[v][u] = datadict - - - def add_weighted_edges_from(self, ebunch, weight='weight', **attr): - """Add all the edges in ebunch as weighted edges with specified - weights. - - Parameters - ---------- - ebunch : container of edges - Each edge given in the list or container will be added - to the graph. The edges must be given as 3-tuples (u,v,w) - where w is a number. - weight : string, optional (default= 'weight') - The attribute name for the edge weights to be added. - attr : keyword arguments, optional (default= no attributes) - Edge attributes to add/update for all edges. - - See Also - -------- - add_edge : add a single edge - add_edges_from : add multiple edges - - Notes - ----- - Adding the same edge twice for Graph/DiGraph simply updates - the edge data. For MultiGraph/MultiDiGraph, duplicate edges - are stored. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_weighted_edges_from([(0,1,3.0),(1,2,7.5)]) - """ - self.add_edges_from(((u,v,{weight:d}) for u,v,d in ebunch),**attr) - - def remove_edge(self, u, v): - """Remove the edge between u and v. - - Parameters - ---------- - u,v: nodes - Remove the edge between nodes u and v. - - Raises - ------ - NetworkXError - If there is not an edge between u and v. - - See Also - -------- - remove_edges_from : remove a collection of edges - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.remove_edge(0,1) - >>> e = (1,2) - >>> G.remove_edge(*e) # unpacks e from an edge tuple - >>> e = (2,3,{'weight':7}) # an edge with attribute data - >>> G.remove_edge(*e[:2]) # select first part of edge tuple - """ - try: - del self.adj[u][v] - if u != v: # self-loop needs only one entry removed - del self.adj[v][u] - except KeyError: - raise NetworkXError("The edge %s-%s is not in the graph"%(u,v)) - - - - def remove_edges_from(self, ebunch): - """Remove all edges specified in ebunch. - - Parameters - ---------- - ebunch: list or container of edge tuples - Each edge given in the list or container will be removed - from the graph. The edges can be: - - - 2-tuples (u,v) edge between u and v. - - 3-tuples (u,v,k) where k is ignored. - - See Also - -------- - remove_edge : remove a single edge - - Notes - ----- - Will fail silently if an edge in ebunch is not in the graph. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> ebunch=[(1,2),(2,3)] - >>> G.remove_edges_from(ebunch) - """ - adj=self.adj - for e in ebunch: - u,v = e[:2] # ignore edge data if present - if u in adj and v in adj[u]: - del adj[u][v] - if u != v: # self loop needs only one entry removed - del adj[v][u] - - - def has_edge(self, u, v): - """Return True if the edge (u,v) is in the graph. - - Parameters - ---------- - u,v : nodes - Nodes can be, for example, strings or numbers. - Nodes must be hashable (and not None) Python objects. - - Returns - ------- - edge_ind : bool - True if edge is in the graph, False otherwise. - - Examples - -------- - Can be called either using two nodes u,v or edge tuple (u,v) - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.has_edge(0,1) # using two nodes - True - >>> e = (0,1) - >>> G.has_edge(*e) # e is a 2-tuple (u,v) - True - >>> e = (0,1,{'weight':7}) - >>> G.has_edge(*e[:2]) # e is a 3-tuple (u,v,data_dictionary) - True - - The following syntax are all equivalent: - - >>> G.has_edge(0,1) - True - >>> 1 in G[0] # though this gives KeyError if 0 not in G - True - - """ - try: - return v in self.adj[u] - except KeyError: - return False - - - def neighbors(self, n): - """Return a list of the nodes connected to the node n. - - Parameters - ---------- - n : node - A node in the graph - - Returns - ------- - nlist : list - A list of nodes that are adjacent to n. - - Raises - ------ - NetworkXError - If the node n is not in the graph. - - Notes - ----- - It is usually more convenient (and faster) to access the - adjacency dictionary as G[n]: - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edge('a','b',weight=7) - >>> G['a'] - {'b': {'weight': 7}} - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.neighbors(0) - [1] - - """ - try: - return list(self.adj[n]) - except KeyError: - raise NetworkXError("The node %s is not in the graph."%(n,)) - - def neighbors_iter(self, n): - """Return an iterator over all neighbors of node n. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> [n for n in G.neighbors_iter(0)] - [1] - - Notes - ----- - It is faster to use the idiom "in G[0]", e.g. - - >>> G = nx.path_graph(4) - >>> [n for n in G[0]] - [1] - """ - try: - return iter(self.adj[n]) - except KeyError: - raise NetworkXError("The node %s is not in the graph."%(n,)) - - def edges(self, nbunch=None, data=False): - """Return a list of edges. - - Edges are returned as tuples with optional data - in the order (node, neighbor, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - Return two tuples (u,v) (False) or three-tuples (u,v,data) (True). - - Returns - -------- - edge_list: list of edge tuples - Edges that are adjacent to any node in nbunch, or a list - of all edges if nbunch is not specified. - - See Also - -------- - edges_iter : return an iterator over the edges - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs this returns the out-edges. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.edges() - [(0, 1), (1, 2), (2, 3)] - >>> G.edges(data=True) # default edge data is {} (empty dictionary) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - >>> G.edges([0,3]) - [(0, 1), (3, 2)] - >>> G.edges(0) - [(0, 1)] - - """ - return list(self.edges_iter(nbunch, data)) - - def edges_iter(self, nbunch=None, data=False): - """Return an iterator over the edges. - - Edges are returned as tuples with optional data - in the order (node, neighbor, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict in 3-tuple (u,v,data). - - Returns - ------- - edge_iter : iterator - An iterator of (u,v) or (u,v,d) tuples of edges. - - See Also - -------- - edges : return a list of edges - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs this returns the out-edges. - - Examples - -------- - >>> G = nx.Graph() # or MultiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> [e for e in G.edges_iter()] - [(0, 1), (1, 2), (2, 3)] - >>> list(G.edges_iter(data=True)) # default data is {} (empty dict) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - >>> list(G.edges_iter([0,3])) - [(0, 1), (3, 2)] - >>> list(G.edges_iter(0)) - [(0, 1)] - - """ - seen={} # helper dict to keep track of multiply stored edges - if nbunch is None: - nodes_nbrs = self.adj.items() - else: - nodes_nbrs=((n,self.adj[n]) for n in self.nbunch_iter(nbunch)) - if data: - for n,nbrs in nodes_nbrs: - for nbr,data in nbrs.items(): - if nbr not in seen: - yield (n,nbr,data) - seen[n]=1 - else: - for n,nbrs in nodes_nbrs: - for nbr in nbrs: - if nbr not in seen: - yield (n,nbr) - seen[n] = 1 - del seen - - - def get_edge_data(self, u, v, default=None): - """Return the attribute dictionary associated with edge (u,v). - - Parameters - ---------- - u,v : nodes - default: any Python object (default=None) - Value to return if the edge (u,v) is not found. - - Returns - ------- - edge_dict : dictionary - The edge attribute dictionary. - - Notes - ----- - It is faster to use G[u][v]. - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G[0][1] - {} - - Warning: Assigning G[u][v] corrupts the graph data structure. - But it is safe to assign attributes to that dictionary, - - >>> G[0][1]['weight'] = 7 - >>> G[0][1]['weight'] - 7 - >>> G[1][0]['weight'] - 7 - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.get_edge_data(0,1) # default edge data is {} - {} - >>> e = (0,1) - >>> G.get_edge_data(*e) # tuple form - {} - >>> G.get_edge_data('a','b',default=0) # edge not in graph, return 0 - 0 - """ - try: - return self.adj[u][v] - except KeyError: - return default - - def adjacency_list(self): - """Return an adjacency list representation of the graph. - - The output adjacency list is in the order of G.nodes(). - For directed graphs, only outgoing adjacencies are included. - - Returns - ------- - adj_list : lists of lists - The adjacency structure of the graph as a list of lists. - - See Also - -------- - adjacency_iter - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.adjacency_list() # in order given by G.nodes() - [[1], [0, 2], [1, 3], [2]] - - """ - return list(map(list,iter(self.adj.values()))) - - def adjacency_iter(self): - """Return an iterator of (node, adjacency dict) tuples for all nodes. - - This is the fastest way to look at every edge. - For directed graphs, only outgoing adjacencies are included. - - Returns - ------- - adj_iter : iterator - An iterator of (node, adjacency dictionary) for all nodes in - the graph. - - See Also - -------- - adjacency_list - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> [(n,nbrdict) for n,nbrdict in G.adjacency_iter()] - [(0, {1: {}}), (1, {0: {}, 2: {}}), (2, {1: {}, 3: {}}), (3, {2: {}})] - - """ - return iter(self.adj.items()) - - def degree(self, nbunch=None, weight=None): - """Return the degree of a node or nodes. - - The node degree is the number of edges adjacent to that node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd : dictionary, or number - A dictionary with nodes as keys and degree as values or - a number if a single node is specified. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.degree(0) - 1 - >>> G.degree([0,1]) - {0: 1, 1: 2} - >>> list(G.degree([0,1]).values()) - [1, 2] - - """ - if nbunch in self: # return a single node - return next(self.degree_iter(nbunch,weight))[1] - else: # return a dict - return dict(self.degree_iter(nbunch,weight)) - - def degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, degree). - - The node degree is the number of edges adjacent to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, degree). - - See Also - -------- - degree - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> list(G.degree_iter(0)) # node 0 with degree 1 - [(0, 1)] - >>> list(G.degree_iter([0,1])) - [(0, 1), (1, 2)] - - """ - if nbunch is None: - nodes_nbrs = self.adj.items() - else: - nodes_nbrs=((n,self.adj[n]) for n in self.nbunch_iter(nbunch)) - - if weight is None: - for n,nbrs in nodes_nbrs: - yield (n,len(nbrs)+(n in nbrs)) # return tuple (n,degree) - else: - # edge weighted graph - degree is sum of nbr edge weights - for n,nbrs in nodes_nbrs: - yield (n, sum((nbrs[nbr].get(weight,1) for nbr in nbrs)) + - (n in nbrs and nbrs[n].get(weight,1))) - - - def clear(self): - """Remove all nodes and edges from the graph. - - This also removes the name, and all graph, node, and edge attributes. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.clear() - >>> G.nodes() - [] - >>> G.edges() - [] - - """ - self.name = '' - self.adj.clear() - self.node.clear() - self.graph.clear() - - def copy(self): - """Return a copy of the graph. - - Returns - ------- - G : Graph - A copy of the graph. - - See Also - -------- - to_directed: return a directed copy of the graph. - - Notes - ----- - This makes a complete copy of the graph including all of the - node or edge attributes. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> H = G.copy() - - """ - return deepcopy(self) - - def is_multigraph(self): - """Return True if graph is a multigraph, False otherwise.""" - return False - - - def is_directed(self): - """Return True if graph is directed, False otherwise.""" - return False - - def to_directed(self): - """Return a directed representation of the graph. - - Returns - ------- - G : DiGraph - A directed graph with the same name, same nodes, and with - each edge (u,v,data) replaced by two directed edges - (u,v,data) and (v,u,data). - - Notes - ----- - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar D=DiGraph(G) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - - Examples - -------- - >>> G = nx.Graph() # or MultiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1), (1, 0)] - - If already directed, return a (deep) copy - - >>> G = nx.DiGraph() # or MultiDiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1)] - """ - from networkx import DiGraph - G=DiGraph() - G.name=self.name - G.add_nodes_from(self) - G.add_edges_from( ((u,v,deepcopy(data)) - for u,nbrs in self.adjacency_iter() - for v,data in nbrs.items()) ) - G.graph=deepcopy(self.graph) - G.node=deepcopy(self.node) - return G - - def to_undirected(self): - """Return an undirected copy of the graph. - - Returns - ------- - G : Graph/MultiGraph - A deepcopy of the graph. - - See Also - -------- - copy, add_edge, add_edges_from - - Notes - ----- - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar G=DiGraph(D) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - - Examples - -------- - >>> G = nx.Graph() # or MultiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1), (1, 0)] - >>> G2 = H.to_undirected() - >>> G2.edges() - [(0, 1)] - """ - return deepcopy(self) - - def subgraph(self, nbunch): - """Return the subgraph induced on nodes in nbunch. - - The induced subgraph of the graph contains the nodes in nbunch - and the edges between those nodes. - - Parameters - ---------- - nbunch : list, iterable - A container of nodes which will be iterated through once. - - Returns - ------- - G : Graph - A subgraph of the graph with the same edge attributes. - - Notes - ----- - The graph, edge or node attributes just point to the original graph. - So changes to the node or edge structure will not be reflected in - the original graph while changes to the attributes will. - - To create a subgraph with its own copy of the edge/node attributes use: - nx.Graph(G.subgraph(nbunch)) - - If edge attributes are containers, a deep copy can be obtained using: - G.subgraph(nbunch).copy() - - For an inplace reduction of a graph to a subgraph you can remove nodes: - G.remove_nodes_from([ n in G if n not in set(nbunch)]) - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> H = G.subgraph([0,1,2]) - >>> H.edges() - [(0, 1), (1, 2)] - """ - bunch =self.nbunch_iter(nbunch) - # create new graph and copy subgraph into it - H = self.__class__() - # copy node and attribute dictionaries - for n in bunch: - H.node[n]=self.node[n] - # namespace shortcuts for speed - H_adj=H.adj - self_adj=self.adj - # add nodes and edges (undirected method) - for n in H.node: - Hnbrs={} - H_adj[n]=Hnbrs - for nbr,d in self_adj[n].items(): - if nbr in H_adj: - # add both representations of edge: n-nbr and nbr-n - Hnbrs[nbr]=d - H_adj[nbr][n]=d - H.graph=self.graph - return H - - - def nodes_with_selfloops(self): - """Return a list of nodes with self loops. - - A node with a self loop has an edge with both ends adjacent - to that node. - - Returns - ------- - nodelist : list - A list of nodes with self loops. - - See Also - -------- - selfloop_edges, number_of_selfloops - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edge(1,1) - >>> G.add_edge(1,2) - >>> G.nodes_with_selfloops() - [1] - """ - return [ n for n,nbrs in self.adj.items() if n in nbrs ] - - def selfloop_edges(self, data=False): - """Return a list of selfloop edges. - - A selfloop edge has the same node at both ends. - - Parameters - ----------- - data : bool, optional (default=False) - Return selfloop edges as two tuples (u,v) (data=False) - or three-tuples (u,v,data) (data=True) - - Returns - ------- - edgelist : list of edge tuples - A list of all selfloop edges. - - See Also - -------- - nodes_with_selfloops, number_of_selfloops - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edge(1,1) - >>> G.add_edge(1,2) - >>> G.selfloop_edges() - [(1, 1)] - >>> G.selfloop_edges(data=True) - [(1, 1, {})] - """ - if data: - return [ (n,n,nbrs[n]) - for n,nbrs in self.adj.items() if n in nbrs ] - else: - return [ (n,n) - for n,nbrs in self.adj.items() if n in nbrs ] - - - def number_of_selfloops(self): - """Return the number of selfloop edges. - - A selfloop edge has the same node at both ends. - - Returns - ------- - nloops : int - The number of selfloops. - - See Also - -------- - nodes_with_selfloops, selfloop_edges - - Examples - -------- - >>> G=nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edge(1,1) - >>> G.add_edge(1,2) - >>> G.number_of_selfloops() - 1 - """ - return len(self.selfloop_edges()) - - - def size(self, weight=None): - """Return the number of edges. - - Parameters - ---------- - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - - Returns - ------- - nedges : int - The number of edges of sum of edge weights in the graph. - - See Also - -------- - number_of_edges - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.size() - 3 - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edge('a','b',weight=2) - >>> G.add_edge('b','c',weight=4) - >>> G.size() - 2 - >>> G.size(weight='weight') - 6.0 - """ - s=sum(self.degree(weight=weight).values())/2 - if weight is None: - return int(s) - else: - return float(s) - - def number_of_edges(self, u=None, v=None): - """Return the number of edges between two nodes. - - Parameters - ---------- - u,v : nodes, optional (default=all edges) - If u and v are specified, return the number of edges between - u and v. Otherwise return the total number of all edges. - - Returns - ------- - nedges : int - The number of edges in the graph. If nodes u and v are specified - return the number of edges between those nodes. - - See Also - -------- - size - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.number_of_edges() - 3 - >>> G.number_of_edges(0,1) - 1 - >>> e = (0,1) - >>> G.number_of_edges(*e) - 1 - """ - if u is None: return int(self.size()) - if v in self.adj[u]: - return 1 - else: - return 0 - - - def add_star(self, nodes, **attr): - """Add a star. - - The first node in nodes is the middle of the star. It is connected - to all other nodes. - - Parameters - ---------- - nodes : iterable container - A container of nodes. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to every edge in star. - - See Also - -------- - add_path, add_cycle - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_star([0,1,2,3]) - >>> G.add_star([10,11,12],weight=2) - - """ - nlist = list(nodes) - v=nlist[0] - edges=((v,n) for n in nlist[1:]) - self.add_edges_from(edges, **attr) - - def add_path(self, nodes, **attr): - """Add a path. - - Parameters - ---------- - nodes : iterable container - A container of nodes. A path will be constructed from - the nodes (in order) and added to the graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to every edge in path. - - See Also - -------- - add_star, add_cycle - - Examples - -------- - >>> G=nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.add_path([10,11,12],weight=7) - - """ - nlist = list(nodes) - edges=zip(nlist[:-1],nlist[1:]) - self.add_edges_from(edges, **attr) - - def add_cycle(self, nodes, **attr): - """Add a cycle. - - Parameters - ---------- - nodes: iterable container - A container of nodes. A cycle will be constructed from - the nodes (in order) and added to the graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to every edge in cycle. - - See Also - -------- - add_path, add_star - - Examples - -------- - >>> G=nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_cycle([0,1,2,3]) - >>> G.add_cycle([10,11,12],weight=7) - - """ - nlist = list(nodes) - edges=zip(nlist,nlist[1:]+[nlist[0]]) - self.add_edges_from(edges, **attr) - - - def nbunch_iter(self, nbunch=None): - """Return an iterator of nodes contained in nbunch that are - also in the graph. - - The nodes in nbunch are checked for membership in the graph - and if not are silently ignored. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - Returns - ------- - niter : iterator - An iterator over nodes in nbunch that are also in the graph. - If nbunch is None, iterate over all nodes in the graph. - - Raises - ------ - NetworkXError - If nbunch is not a node or or sequence of nodes. - If a node in nbunch is not hashable. - - See Also - -------- - Graph.__iter__ - - Notes - ----- - When nbunch is an iterator, the returned iterator yields values - directly from nbunch, becoming exhausted when nbunch is exhausted. - - To test whether nbunch is a single node, one can use - "if nbunch in self:", even after processing with this routine. - - If nbunch is not a node or a (possibly empty) sequence/iterator - or None, a NetworkXError is raised. Also, if any object in - nbunch is not hashable, a NetworkXError is raised. - """ - if nbunch is None: # include all nodes via iterator - bunch=iter(self.adj.keys()) - elif nbunch in self: # if nbunch is a single node - bunch=iter([nbunch]) - else: # if nbunch is a sequence of nodes - def bunch_iter(nlist,adj): - try: - for n in nlist: - if n in adj: - yield n - except TypeError as e: - message=e.args[0] - import sys - sys.stdout.write(message) - # capture error for non-sequence/iterator nbunch. - if 'iter' in message: - raise NetworkXError(\ - "nbunch is not a node or a sequence of nodes.") - # capture error for unhashable node. - elif 'hashable' in message: - raise NetworkXError(\ - "Node %s in the sequence nbunch is not a valid node."%n) - else: - raise - bunch=bunch_iter(nbunch,self.adj) - return bunch diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/multidigraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/multidigraph.py deleted file mode 100644 index 392db89..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/multidigraph.py +++ /dev/null @@ -1,851 +0,0 @@ -"""Base class for MultiDiGraph.""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from copy import deepcopy -import networkx as nx -from networkx.classes.graph import Graph # for doctests -from networkx.classes.digraph import DiGraph -from networkx.classes.multigraph import MultiGraph -from networkx.exception import NetworkXError -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) - -class MultiDiGraph(MultiGraph,DiGraph): - """A directed graph class that can store multiedges. - - Multiedges are multiple edges between two nodes. Each edge - can hold optional data or attributes. - - A MultiDiGraph holds directed edges. Self loops are allowed. - - Nodes can be arbitrary (hashable) Python objects with optional - key/value attributes. - - Edges are represented as links between nodes with optional - key/value attributes. - - Parameters - ---------- - data : input graph - Data to initialize graph. If data=None (default) an empty - graph is created. The data can be an edge list, or any - NetworkX graph object. If the corresponding optional Python - packages are installed the data can also be a NumPy matrix - or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - - See Also - -------- - Graph - DiGraph - MultiGraph - - Examples - -------- - Create an empty graph structure (a "null graph") with no nodes and - no edges. - - >>> G = nx.MultiDiGraph() - - G can be grown in several ways. - - **Nodes:** - - Add one node at a time: - - >>> G.add_node(1) - - Add the nodes from any container (a list, dict, set or - even the lines from a file or the nodes from another graph). - - >>> G.add_nodes_from([2,3]) - >>> G.add_nodes_from(range(100,110)) - >>> H=nx.Graph() - >>> H.add_path([0,1,2,3,4,5,6,7,8,9]) - >>> G.add_nodes_from(H) - - In addition to strings and integers any hashable Python object - (except None) can represent a node, e.g. a customized node object, - or even another Graph. - - >>> G.add_node(H) - - **Edges:** - - G can also be grown by adding edges. - - Add one edge, - - >>> G.add_edge(1, 2) - - a list of edges, - - >>> G.add_edges_from([(1,2),(1,3)]) - - or a collection of edges, - - >>> G.add_edges_from(H.edges()) - - If some edges connect nodes not yet in the graph, the nodes - are added automatically. If an edge already exists, an additional - edge is created and stored using a key to identify the edge. - By default the key is the lowest unused integer. - - >>> G.add_edges_from([(4,5,dict(route=282)), (4,5,dict(route=37))]) - >>> G[4] - {5: {0: {}, 1: {'route': 282}, 2: {'route': 37}}} - - **Attributes:** - - Each graph, node, and edge can hold key/value attribute pairs - in an associated attribute dictionary (the keys must be hashable). - By default these are empty, but can be added or changed using - add_edge, add_node or direct manipulation of the attribute - dictionaries named graph, node and edge respectively. - - >>> G = nx.MultiDiGraph(day="Friday") - >>> G.graph - {'day': 'Friday'} - - Add node attributes using add_node(), add_nodes_from() or G.node - - >>> G.add_node(1, time='5pm') - >>> G.add_nodes_from([3], time='2pm') - >>> G.node[1] - {'time': '5pm'} - >>> G.node[1]['room'] = 714 - >>> del G.node[1]['room'] # remove attribute - >>> G.nodes(data=True) - [(1, {'time': '5pm'}), (3, {'time': '2pm'})] - - Warning: adding a node to G.node does not add it to the graph. - - Add edge attributes using add_edge(), add_edges_from(), subscript - notation, or G.edge. - - >>> G.add_edge(1, 2, weight=4.7 ) - >>> G.add_edges_from([(3,4),(4,5)], color='red') - >>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})]) - >>> G[1][2][0]['weight'] = 4.7 - >>> G.edge[1][2][0]['weight'] = 4 - - **Shortcuts:** - - Many common graph features allow python syntax to speed reporting. - - >>> 1 in G # check if node in graph - True - >>> [n for n in G if n<3] # iterate through nodes - [1, 2] - >>> len(G) # number of nodes in graph - 5 - >>> G[1] # adjacency dict keyed by neighbor to edge attributes - ... # Note: you should not change this dict manually! - {2: {0: {'weight': 4}, 1: {'color': 'blue'}}} - - The fastest way to traverse all edges of a graph is via - adjacency_iter(), but the edges() method is often more convenient. - - >>> for n,nbrsdict in G.adjacency_iter(): - ... for nbr,keydict in nbrsdict.items(): - ... for key,eattr in keydict.items(): - ... if 'weight' in eattr: - ... (n,nbr,eattr['weight']) - (1, 2, 4) - (2, 3, 8) - >>> [ (u,v,edata['weight']) for u,v,edata in G.edges(data=True) if 'weight' in edata ] - [(1, 2, 4), (2, 3, 8)] - - **Reporting:** - - Simple graph information is obtained using methods. - Iterator versions of many reporting methods exist for efficiency. - Methods exist for reporting nodes(), edges(), neighbors() and degree() - as well as the number of nodes and edges. - - For details on these and other miscellaneous methods, see below. - """ - def add_edge(self, u, v, key=None, attr_dict=None, **attr): - """Add an edge between u and v. - - The nodes u and v will be automatically added if they are - not already in the graph. - - Edge attributes can be specified with keywords or by providing - a dictionary with key/value pairs. See examples below. - - Parameters - ---------- - u,v : nodes - Nodes can be, for example, strings or numbers. - Nodes must be hashable (and not None) Python objects. - key : hashable identifier, optional (default=lowest unused integer) - Used to distinguish multiedges between a pair of nodes. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with the edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - See Also - -------- - add_edges_from : add a collection of edges - - Notes - ----- - To replace/update edge data, use the optional key argument - to identify a unique edge. Otherwise a new edge will be created. - - NetworkX algorithms designed for weighted graphs cannot use - multigraphs directly because it is not clear how to handle - multiedge weights. Convert to Graph using edge attribute - 'weight' to enable weighted graph algorithms. - - Examples - -------- - The following all add the edge e=(1,2) to graph G: - - >>> G = nx.MultiDiGraph() - >>> e = (1,2) - >>> G.add_edge(1, 2) # explicit two-node form - >>> G.add_edge(*e) # single edge as tuple of two nodes - >>> G.add_edges_from( [(1,2)] ) # add edges from iterable container - - Associate data to edges using keywords: - - >>> G.add_edge(1, 2, weight=3) - >>> G.add_edge(1, 2, key=0, weight=4) # update data for key=0 - >>> G.add_edge(1, 3, weight=7, capacity=15, length=342.7) - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - # add nodes - if u not in self.succ: - self.succ[u] = {} - self.pred[u] = {} - self.node[u] = {} - if v not in self.succ: - self.succ[v] = {} - self.pred[v] = {} - self.node[v] = {} - if v in self.succ[u]: - keydict=self.adj[u][v] - if key is None: - # find a unique integer key - # other methods might be better here? - key=len(keydict) - while key in keydict: - key+=1 - datadict=keydict.get(key,{}) - datadict.update(attr_dict) - keydict[key]=datadict - else: - # selfloops work this way without special treatment - if key is None: - key=0 - datadict={} - datadict.update(attr_dict) - keydict={key:datadict} - self.succ[u][v] = keydict - self.pred[v][u] = keydict - - def remove_edge(self, u, v, key=None): - """Remove an edge between u and v. - - Parameters - ---------- - u,v: nodes - Remove an edge between nodes u and v. - key : hashable identifier, optional (default=None) - Used to distinguish multiple edges between a pair of nodes. - If None remove a single (abritrary) edge between u and v. - - Raises - ------ - NetworkXError - If there is not an edge between u and v, or - if there is no edge with the specified key. - - See Also - -------- - remove_edges_from : remove a collection of edges - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_path([0,1,2,3]) - >>> G.remove_edge(0,1) - >>> e = (1,2) - >>> G.remove_edge(*e) # unpacks e from an edge tuple - - For multiple edges - - >>> G = nx.MultiDiGraph() - >>> G.add_edges_from([(1,2),(1,2),(1,2)]) - >>> G.remove_edge(1,2) # remove a single (arbitrary) edge - - For edges with keys - - >>> G = nx.MultiDiGraph() - >>> G.add_edge(1,2,key='first') - >>> G.add_edge(1,2,key='second') - >>> G.remove_edge(1,2,key='second') - - """ - try: - d=self.adj[u][v] - except (KeyError): - raise NetworkXError( - "The edge %s-%s is not in the graph."%(u,v)) - # remove the edge with specified data - if key is None: - d.popitem() - else: - try: - del d[key] - except (KeyError): - raise NetworkXError( - "The edge %s-%s with key %s is not in the graph."%(u,v,key)) - if len(d)==0: - # remove the key entries if last edge - del self.succ[u][v] - del self.pred[v][u] - - - def edges_iter(self, nbunch=None, data=False, keys=False): - """Return an iterator over the edges. - - Edges are returned as tuples with optional data and keys - in the order (node, neighbor, key, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict with each edge. - keys : bool, optional (default=False) - If True, return edge keys with each edge. - - Returns - ------- - edge_iter : iterator - An iterator of (u,v), (u,v,d) or (u,v,key,d) tuples of edges. - - See Also - -------- - edges : return a list of edges - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs this returns the out-edges. - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_path([0,1,2,3]) - >>> [e for e in G.edges_iter()] - [(0, 1), (1, 2), (2, 3)] - >>> list(G.edges_iter(data=True)) # default data is {} (empty dict) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - >>> list(G.edges_iter([0,2])) - [(0, 1), (2, 3)] - >>> list(G.edges_iter(0)) - [(0, 1)] - - """ - if nbunch is None: - nodes_nbrs = self.adj.items() - else: - nodes_nbrs=((n,self.adj[n]) for n in self.nbunch_iter(nbunch)) - if data: - for n,nbrs in nodes_nbrs: - for nbr,keydict in nbrs.items(): - for key,data in keydict.items(): - if keys: - yield (n,nbr,key,data) - else: - yield (n,nbr,data) - else: - for n,nbrs in nodes_nbrs: - for nbr,keydict in nbrs.items(): - for key,data in keydict.items(): - if keys: - yield (n,nbr,key) - else: - yield (n,nbr) - - # alias out_edges to edges - out_edges_iter=edges_iter - - def out_edges(self, nbunch=None, keys=False, data=False): - """Return a list of the outgoing edges. - - Edges are returned as tuples with optional data and keys - in the order (node, neighbor, key, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict with each edge. - keys : bool, optional (default=False) - If True, return edge keys with each edge. - - Returns - ------- - out_edges : list - An listr of (u,v), (u,v,d) or (u,v,key,d) tuples of edges. - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs edges() is the same as out_edges(). - - See Also - -------- - in_edges: return a list of incoming edges - """ - return list(self.out_edges_iter(nbunch, keys=keys, data=data)) - - - def in_edges_iter(self, nbunch=None, data=False, keys=False): - """Return an iterator over the incoming edges. - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict with each edge. - keys : bool, optional (default=False) - If True, return edge keys with each edge. - - Returns - ------- - in_edge_iter : iterator - An iterator of (u,v), (u,v,d) or (u,v,key,d) tuples of edges. - - See Also - -------- - edges_iter : return an iterator of edges - """ - if nbunch is None: - nodes_nbrs=self.pred.items() - else: - nodes_nbrs=((n,self.pred[n]) for n in self.nbunch_iter(nbunch)) - if data: - for n,nbrs in nodes_nbrs: - for nbr,keydict in nbrs.items(): - for key,data in keydict.items(): - if keys: - yield (nbr,n,key,data) - else: - yield (nbr,n,data) - else: - for n,nbrs in nodes_nbrs: - for nbr,keydict in nbrs.items(): - for key,data in keydict.items(): - if keys: - yield (nbr,n,key) - else: - yield (nbr,n) - - def in_edges(self, nbunch=None, keys=False, data=False): - """Return a list of the incoming edges. - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict with each edge. - keys : bool, optional (default=False) - If True, return edge keys with each edge. - - Returns - ------- - in_edges : list - A list of (u,v), (u,v,d) or (u,v,key,d) tuples of edges. - - See Also - -------- - out_edges: return a list of outgoing edges - """ - return list(self.in_edges_iter(nbunch, keys=keys, data=data)) - - - def degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, degree). - - The node degree is the number of edges adjacent to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, degree). - - See Also - -------- - degree - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_path([0,1,2,3]) - >>> list(G.degree_iter(0)) # node 0 with degree 1 - [(0, 1)] - >>> list(G.degree_iter([0,1])) - [(0, 1), (1, 2)] - - """ - if nbunch is None: - nodes_nbrs=zip(iter(self.succ.items()),iter(self.pred.items())) - else: - nodes_nbrs=zip( - ((n,self.succ[n]) for n in self.nbunch_iter(nbunch)), - ((n,self.pred[n]) for n in self.nbunch_iter(nbunch))) - - if weight is None: - for (n,succ),(n2,pred) in nodes_nbrs: - indeg = sum([len(data) for data in pred.values()]) - outdeg = sum([len(data) for data in succ.values()]) - yield (n, indeg + outdeg) - else: - # edge weighted graph - degree is sum of nbr edge weights - for (n,succ),(n2,pred) in nodes_nbrs: - deg = sum([d.get(weight,1) - for data in pred.values() - for d in data.values()]) - deg += sum([d.get(weight,1) - for data in succ.values() - for d in data.values()]) - yield (n, deg) - - - def in_degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, in-degree). - - The node in-degree is the number of edges pointing in to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, in-degree). - - See Also - -------- - degree, in_degree, out_degree, out_degree_iter - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_path([0,1,2,3]) - >>> list(G.in_degree_iter(0)) # node 0 with degree 0 - [(0, 0)] - >>> list(G.in_degree_iter([0,1])) - [(0, 0), (1, 1)] - - """ - if nbunch is None: - nodes_nbrs=self.pred.items() - else: - nodes_nbrs=((n,self.pred[n]) for n in self.nbunch_iter(nbunch)) - - if weight is None: - for n,nbrs in nodes_nbrs: - yield (n, sum([len(data) for data in nbrs.values()]) ) - else: - # edge weighted graph - degree is sum of nbr edge weights - for n,pred in nodes_nbrs: - deg = sum([d.get(weight,1) - for data in pred.values() - for d in data.values()]) - yield (n, deg) - - - def out_degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, out-degree). - - The node out-degree is the number of edges pointing out of the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, out-degree). - - See Also - -------- - degree, in_degree, out_degree, in_degree_iter - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_path([0,1,2,3]) - >>> list(G.out_degree_iter(0)) # node 0 with degree 1 - [(0, 1)] - >>> list(G.out_degree_iter([0,1])) - [(0, 1), (1, 1)] - - """ - if nbunch is None: - nodes_nbrs=self.succ.items() - else: - nodes_nbrs=((n,self.succ[n]) for n in self.nbunch_iter(nbunch)) - - if weight is None: - for n,nbrs in nodes_nbrs: - yield (n, sum([len(data) for data in nbrs.values()]) ) - else: - for n,succ in nodes_nbrs: - deg = sum([d.get(weight,1) - for data in succ.values() - for d in data.values()]) - yield (n, deg) - - def is_multigraph(self): - """Return True if graph is a multigraph, False otherwise.""" - return True - - def is_directed(self): - """Return True if graph is directed, False otherwise.""" - return True - - def to_directed(self): - """Return a directed copy of the graph. - - Returns - ------- - G : MultiDiGraph - A deepcopy of the graph. - - Notes - ----- - If edges in both directions (u,v) and (v,u) exist in the - graph, attributes for the new undirected edge will be a combination of - the attributes of the directed edges. The edge data is updated - in the (arbitrary) order that the edges are encountered. For - more customized control of the edge attributes use add_edge(). - - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar G=DiGraph(D) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - - Examples - -------- - >>> G = nx.Graph() # or MultiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1), (1, 0)] - - If already directed, return a (deep) copy - - >>> G = nx.MultiDiGraph() - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1)] - """ - return deepcopy(self) - - def to_undirected(self, reciprocal=False): - """Return an undirected representation of the digraph. - - Parameters - ---------- - reciprocal : bool (optional) - If True only keep edges that appear in both directions - in the original digraph. - - Returns - ------- - G : MultiGraph - An undirected graph with the same name and nodes and - with edge (u,v,data) if either (u,v,data) or (v,u,data) - is in the digraph. If both edges exist in digraph and - their edge data is different, only one edge is created - with an arbitrary choice of which edge data to use. - You must check and correct for this manually if desired. - - Notes - ----- - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar D=DiGraph(G) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - """ - H=MultiGraph() - H.name=self.name - H.add_nodes_from(self) - if reciprocal is True: - H.add_edges_from( (u,v,key,deepcopy(data)) - for u,nbrs in self.adjacency_iter() - for v,keydict in nbrs.items() - for key,data in keydict.items() - if self.has_edge(v,u,key)) - else: - H.add_edges_from( (u,v,key,deepcopy(data)) - for u,nbrs in self.adjacency_iter() - for v,keydict in nbrs.items() - for key,data in keydict.items()) - H.graph=deepcopy(self.graph) - H.node=deepcopy(self.node) - return H - - def subgraph(self, nbunch): - """Return the subgraph induced on nodes in nbunch. - - The induced subgraph of the graph contains the nodes in nbunch - and the edges between those nodes. - - Parameters - ---------- - nbunch : list, iterable - A container of nodes which will be iterated through once. - - Returns - ------- - G : Graph - A subgraph of the graph with the same edge attributes. - - Notes - ----- - The graph, edge or node attributes just point to the original graph. - So changes to the node or edge structure will not be reflected in - the original graph while changes to the attributes will. - - To create a subgraph with its own copy of the edge/node attributes use: - nx.Graph(G.subgraph(nbunch)) - - If edge attributes are containers, a deep copy can be obtained using: - G.subgraph(nbunch).copy() - - For an inplace reduction of a graph to a subgraph you can remove nodes: - G.remove_nodes_from([ n in G if n not in set(nbunch)]) - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> H = G.subgraph([0,1,2]) - >>> H.edges() - [(0, 1), (1, 2)] - """ - bunch = self.nbunch_iter(nbunch) - # create new graph and copy subgraph into it - H = self.__class__() - # copy node and attribute dictionaries - for n in bunch: - H.node[n]=self.node[n] - # namespace shortcuts for speed - H_succ=H.succ - H_pred=H.pred - self_succ=self.succ - self_pred=self.pred - # add nodes - for n in H: - H_succ[n]={} - H_pred[n]={} - # add edges - for u in H_succ: - Hnbrs=H_succ[u] - for v,edgedict in self_succ[u].items(): - if v in H_succ: - # add both representations of edge: u-v and v-u - # they share the same edgedict - ed=edgedict.copy() - Hnbrs[v]=ed - H_pred[v][u]=ed - H.graph=self.graph - return H - - def reverse(self, copy=True): - """Return the reverse of the graph. - - The reverse is a graph with the same nodes and edges - but with the directions of the edges reversed. - - Parameters - ---------- - copy : bool optional (default=True) - If True, return a new DiGraph holding the reversed edges. - If False, reverse the reverse graph is created using - the original graph (this changes the original graph). - """ - if copy: - H = self.__class__(name="Reverse of (%s)"%self.name) - H.add_nodes_from(self) - H.add_edges_from( (v,u,k,deepcopy(d)) for u,v,k,d - in self.edges(keys=True, data=True) ) - H.graph=deepcopy(self.graph) - H.node=deepcopy(self.node) - else: - self.pred,self.succ=self.succ,self.pred - self.adj=self.succ - H=self - return H diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/multigraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/multigraph.py deleted file mode 100644 index 63bdf0f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/multigraph.py +++ /dev/null @@ -1,966 +0,0 @@ -"""Base class for MultiGraph.""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from copy import deepcopy -import networkx as nx -from networkx.classes.graph import Graph -from networkx import NetworkXError -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) - -class MultiGraph(Graph): - """ - An undirected graph class that can store multiedges. - - Multiedges are multiple edges between two nodes. Each edge - can hold optional data or attributes. - - A MultiGraph holds undirected edges. Self loops are allowed. - - Nodes can be arbitrary (hashable) Python objects with optional - key/value attributes. - - Edges are represented as links between nodes with optional - key/value attributes. - - Parameters - ---------- - data : input graph - Data to initialize graph. If data=None (default) an empty - graph is created. The data can be an edge list, or any - NetworkX graph object. If the corresponding optional Python - packages are installed the data can also be a NumPy matrix - or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph. - attr : keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - - See Also - -------- - Graph - DiGraph - MultiDiGraph - - Examples - -------- - Create an empty graph structure (a "null graph") with no nodes and - no edges. - - >>> G = nx.MultiGraph() - - G can be grown in several ways. - - **Nodes:** - - Add one node at a time: - - >>> G.add_node(1) - - Add the nodes from any container (a list, dict, set or - even the lines from a file or the nodes from another graph). - - >>> G.add_nodes_from([2,3]) - >>> G.add_nodes_from(range(100,110)) - >>> H=nx.Graph() - >>> H.add_path([0,1,2,3,4,5,6,7,8,9]) - >>> G.add_nodes_from(H) - - In addition to strings and integers any hashable Python object - (except None) can represent a node, e.g. a customized node object, - or even another Graph. - - >>> G.add_node(H) - - **Edges:** - - G can also be grown by adding edges. - - Add one edge, - - >>> G.add_edge(1, 2) - - a list of edges, - - >>> G.add_edges_from([(1,2),(1,3)]) - - or a collection of edges, - - >>> G.add_edges_from(H.edges()) - - If some edges connect nodes not yet in the graph, the nodes - are added automatically. If an edge already exists, an additional - edge is created and stored using a key to identify the edge. - By default the key is the lowest unused integer. - - >>> G.add_edges_from([(4,5,dict(route=282)), (4,5,dict(route=37))]) - >>> G[4] - {3: {0: {}}, 5: {0: {}, 1: {'route': 282}, 2: {'route': 37}}} - - **Attributes:** - - Each graph, node, and edge can hold key/value attribute pairs - in an associated attribute dictionary (the keys must be hashable). - By default these are empty, but can be added or changed using - add_edge, add_node or direct manipulation of the attribute - dictionaries named graph, node and edge respectively. - - >>> G = nx.MultiGraph(day="Friday") - >>> G.graph - {'day': 'Friday'} - - Add node attributes using add_node(), add_nodes_from() or G.node - - >>> G.add_node(1, time='5pm') - >>> G.add_nodes_from([3], time='2pm') - >>> G.node[1] - {'time': '5pm'} - >>> G.node[1]['room'] = 714 - >>> del G.node[1]['room'] # remove attribute - >>> G.nodes(data=True) - [(1, {'time': '5pm'}), (3, {'time': '2pm'})] - - Warning: adding a node to G.node does not add it to the graph. - - Add edge attributes using add_edge(), add_edges_from(), subscript - notation, or G.edge. - - >>> G.add_edge(1, 2, weight=4.7 ) - >>> G.add_edges_from([(3,4),(4,5)], color='red') - >>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})]) - >>> G[1][2][0]['weight'] = 4.7 - >>> G.edge[1][2][0]['weight'] = 4 - - **Shortcuts:** - - Many common graph features allow python syntax to speed reporting. - - >>> 1 in G # check if node in graph - True - >>> [n for n in G if n<3] # iterate through nodes - [1, 2] - >>> len(G) # number of nodes in graph - 5 - >>> G[1] # adjacency dict keyed by neighbor to edge attributes - ... # Note: you should not change this dict manually! - {2: {0: {'weight': 4}, 1: {'color': 'blue'}}} - - The fastest way to traverse all edges of a graph is via - adjacency_iter(), but the edges() method is often more convenient. - - >>> for n,nbrsdict in G.adjacency_iter(): - ... for nbr,keydict in nbrsdict.items(): - ... for key,eattr in keydict.items(): - ... if 'weight' in eattr: - ... (n,nbr,eattr['weight']) - (1, 2, 4) - (2, 1, 4) - (2, 3, 8) - (3, 2, 8) - >>> [ (u,v,edata['weight']) for u,v,edata in G.edges(data=True) if 'weight' in edata ] - [(1, 2, 4), (2, 3, 8)] - - **Reporting:** - - Simple graph information is obtained using methods. - Iterator versions of many reporting methods exist for efficiency. - Methods exist for reporting nodes(), edges(), neighbors() and degree() - as well as the number of nodes and edges. - - For details on these and other miscellaneous methods, see below. - """ - def add_edge(self, u, v, key=None, attr_dict=None, **attr): - """Add an edge between u and v. - - The nodes u and v will be automatically added if they are - not already in the graph. - - Edge attributes can be specified with keywords or by providing - a dictionary with key/value pairs. See examples below. - - Parameters - ---------- - u,v : nodes - Nodes can be, for example, strings or numbers. - Nodes must be hashable (and not None) Python objects. - key : hashable identifier, optional (default=lowest unused integer) - Used to distinguish multiedges between a pair of nodes. - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with the edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - See Also - -------- - add_edges_from : add a collection of edges - - Notes - ----- - To replace/update edge data, use the optional key argument - to identify a unique edge. Otherwise a new edge will be created. - - NetworkX algorithms designed for weighted graphs cannot use - multigraphs directly because it is not clear how to handle - multiedge weights. Convert to Graph using edge attribute - 'weight' to enable weighted graph algorithms. - - Examples - -------- - The following all add the edge e=(1,2) to graph G: - - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> e = (1,2) - >>> G.add_edge(1, 2) # explicit two-node form - >>> G.add_edge(*e) # single edge as tuple of two nodes - >>> G.add_edges_from( [(1,2)] ) # add edges from iterable container - - Associate data to edges using keywords: - - >>> G.add_edge(1, 2, weight=3) - >>> G.add_edge(1, 2, key=0, weight=4) # update data for key=0 - >>> G.add_edge(1, 3, weight=7, capacity=15, length=342.7) - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - # add nodes - if u not in self.adj: - self.adj[u] = {} - self.node[u] = {} - if v not in self.adj: - self.adj[v] = {} - self.node[v] = {} - if v in self.adj[u]: - keydict=self.adj[u][v] - if key is None: - # find a unique integer key - # other methods might be better here? - key=len(keydict) - while key in keydict: - key+=1 - datadict=keydict.get(key,{}) - datadict.update(attr_dict) - keydict[key]=datadict - else: - # selfloops work this way without special treatment - if key is None: - key=0 - datadict={} - datadict.update(attr_dict) - keydict={key:datadict} - self.adj[u][v] = keydict - self.adj[v][u] = keydict - - - def add_edges_from(self, ebunch, attr_dict=None, **attr): - """Add all the edges in ebunch. - - Parameters - ---------- - ebunch : container of edges - Each edge given in the container will be added to the - graph. The edges can be: - - - 2-tuples (u,v) or - - 3-tuples (u,v,d) for an edge attribute dict d, or - - 4-tuples (u,v,k,d) for an edge identified by key k - - attr_dict : dictionary, optional (default= no attributes) - Dictionary of edge attributes. Key/value pairs will - update existing data associated with each edge. - attr : keyword arguments, optional - Edge data (or labels or objects) can be assigned using - keyword arguments. - - - See Also - -------- - add_edge : add a single edge - add_weighted_edges_from : convenient way to add weighted edges - - Notes - ----- - Adding the same edge twice has no effect but any edge data - will be updated when each duplicate edge is added. - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_edges_from([(0,1),(1,2)]) # using a list of edge tuples - >>> e = zip(range(0,3),range(1,4)) - >>> G.add_edges_from(e) # Add the path graph 0-1-2-3 - - Associate data to edges - - >>> G.add_edges_from([(1,2),(2,3)], weight=3) - >>> G.add_edges_from([(3,4),(1,4)], label='WN2898') - """ - # set up attribute dict - if attr_dict is None: - attr_dict=attr - else: - try: - attr_dict.update(attr) - except AttributeError: - raise NetworkXError(\ - "The attr_dict argument must be a dictionary.") - # process ebunch - for e in ebunch: - ne=len(e) - if ne==4: - u,v,key,dd = e - elif ne==3: - u,v,dd = e - key=None - elif ne==2: - u,v = e - dd = {} - key=None - else: - raise NetworkXError(\ - "Edge tuple %s must be a 2-tuple, 3-tuple or 4-tuple."%(e,)) - if u in self.adj: - keydict=self.adj[u].get(v,{}) - else: - keydict={} - if key is None: - # find a unique integer key - # other methods might be better here? - key=len(keydict) - while key in keydict: - key+=1 - datadict=keydict.get(key,{}) - datadict.update(attr_dict) - datadict.update(dd) - self.add_edge(u,v,key=key,attr_dict=datadict) - - - def remove_edge(self, u, v, key=None): - """Remove an edge between u and v. - - Parameters - ---------- - u,v: nodes - Remove an edge between nodes u and v. - key : hashable identifier, optional (default=None) - Used to distinguish multiple edges between a pair of nodes. - If None remove a single (abritrary) edge between u and v. - - Raises - ------ - NetworkXError - If there is not an edge between u and v, or - if there is no edge with the specified key. - - See Also - -------- - remove_edges_from : remove a collection of edges - - Examples - -------- - >>> G = nx.MultiGraph() - >>> G.add_path([0,1,2,3]) - >>> G.remove_edge(0,1) - >>> e = (1,2) - >>> G.remove_edge(*e) # unpacks e from an edge tuple - - For multiple edges - - >>> G = nx.MultiGraph() # or MultiDiGraph, etc - >>> G.add_edges_from([(1,2),(1,2),(1,2)]) - >>> G.remove_edge(1,2) # remove a single (arbitrary) edge - - For edges with keys - - >>> G = nx.MultiGraph() # or MultiDiGraph, etc - >>> G.add_edge(1,2,key='first') - >>> G.add_edge(1,2,key='second') - >>> G.remove_edge(1,2,key='second') - - """ - try: - d=self.adj[u][v] - except (KeyError): - raise NetworkXError( - "The edge %s-%s is not in the graph."%(u,v)) - # remove the edge with specified data - if key is None: - d.popitem() - else: - try: - del d[key] - except (KeyError): - raise NetworkXError( - "The edge %s-%s with key %s is not in the graph."%(u,v,key)) - if len(d)==0: - # remove the key entries if last edge - del self.adj[u][v] - if u!=v: # check for selfloop - del self.adj[v][u] - - - def remove_edges_from(self, ebunch): - """Remove all edges specified in ebunch. - - Parameters - ---------- - ebunch: list or container of edge tuples - Each edge given in the list or container will be removed - from the graph. The edges can be: - - - 2-tuples (u,v) All edges between u and v are removed. - - 3-tuples (u,v,key) The edge identified by key is removed. - - 4-tuples (u,v,key,data) where data is ignored. - - See Also - -------- - remove_edge : remove a single edge - - Notes - ----- - Will fail silently if an edge in ebunch is not in the graph. - - Examples - -------- - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> ebunch=[(1,2),(2,3)] - >>> G.remove_edges_from(ebunch) - - Removing multiple copies of edges - - >>> G = nx.MultiGraph() - >>> G.add_edges_from([(1,2),(1,2),(1,2)]) - >>> G.remove_edges_from([(1,2),(1,2)]) - >>> G.edges() - [(1, 2)] - >>> G.remove_edges_from([(1,2),(1,2)]) # silently ignore extra copy - >>> G.edges() # now empty graph - [] - """ - for e in ebunch: - try: - self.remove_edge(*e[:3]) - except NetworkXError: - pass - - - def has_edge(self, u, v, key=None): - """Return True if the graph has an edge between nodes u and v. - - Parameters - ---------- - u,v : nodes - Nodes can be, for example, strings or numbers. - - key : hashable identifier, optional (default=None) - If specified return True only if the edge with - key is found. - - Returns - ------- - edge_ind : bool - True if edge is in the graph, False otherwise. - - Examples - -------- - Can be called either using two nodes u,v, an edge tuple (u,v), - or an edge tuple (u,v,key). - - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> G.has_edge(0,1) # using two nodes - True - >>> e = (0,1) - >>> G.has_edge(*e) # e is a 2-tuple (u,v) - True - >>> G.add_edge(0,1,key='a') - >>> G.has_edge(0,1,key='a') # specify key - True - >>> e=(0,1,'a') - >>> G.has_edge(*e) # e is a 3-tuple (u,v,'a') - True - - The following syntax are equivalent: - - >>> G.has_edge(0,1) - True - >>> 1 in G[0] # though this gives KeyError if 0 not in G - True - - - - """ - try: - if key is None: - return v in self.adj[u] - else: - return key in self.adj[u][v] - except KeyError: - return False - - def edges(self, nbunch=None, data=False, keys=False): - """Return a list of edges. - - Edges are returned as tuples with optional data and keys - in the order (node, neighbor, key, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - Return two tuples (u,v) (False) or three-tuples (u,v,data) (True). - keys : bool, optional (default=False) - Return two tuples (u,v) (False) or three-tuples (u,v,key) (True). - - Returns - -------- - edge_list: list of edge tuples - Edges that are adjacent to any node in nbunch, or a list - of all edges if nbunch is not specified. - - See Also - -------- - edges_iter : return an iterator over the edges - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs this returns the out-edges. - - Examples - -------- - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> G.edges() - [(0, 1), (1, 2), (2, 3)] - >>> G.edges(data=True) # default edge data is {} (empty dictionary) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - >>> G.edges(keys=True) # default keys are integers - [(0, 1, 0), (1, 2, 0), (2, 3, 0)] - >>> G.edges(data=True,keys=True) # default keys are integers - [(0, 1, 0, {}), (1, 2, 0, {}), (2, 3, 0, {})] - >>> G.edges([0,3]) - [(0, 1), (3, 2)] - >>> G.edges(0) - [(0, 1)] - - """ - return list(self.edges_iter(nbunch, data=data,keys=keys)) - - def edges_iter(self, nbunch=None, data=False, keys=False): - """Return an iterator over the edges. - - Edges are returned as tuples with optional data and keys - in the order (node, neighbor, key, data). - - Parameters - ---------- - nbunch : iterable container, optional (default= all nodes) - A container of nodes. The container will be iterated - through once. - data : bool, optional (default=False) - If True, return edge attribute dict with each edge. - keys : bool, optional (default=False) - If True, return edge keys with each edge. - - Returns - ------- - edge_iter : iterator - An iterator of (u,v), (u,v,d) or (u,v,key,d) tuples of edges. - - See Also - -------- - edges : return a list of edges - - Notes - ----- - Nodes in nbunch that are not in the graph will be (quietly) ignored. - For directed graphs this returns the out-edges. - - Examples - -------- - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> [e for e in G.edges_iter()] - [(0, 1), (1, 2), (2, 3)] - >>> list(G.edges_iter(data=True)) # default data is {} (empty dict) - [(0, 1, {}), (1, 2, {}), (2, 3, {})] - >>> list(G.edges(keys=True)) # default keys are integers - [(0, 1, 0), (1, 2, 0), (2, 3, 0)] - >>> list(G.edges(data=True,keys=True)) # default keys are integers - [(0, 1, 0, {}), (1, 2, 0, {}), (2, 3, 0, {})] - >>> list(G.edges_iter([0,3])) - [(0, 1), (3, 2)] - >>> list(G.edges_iter(0)) - [(0, 1)] - - """ - seen={} # helper dict to keep track of multiply stored edges - if nbunch is None: - nodes_nbrs = self.adj.items() - else: - nodes_nbrs=((n,self.adj[n]) for n in self.nbunch_iter(nbunch)) - if data: - for n,nbrs in nodes_nbrs: - for nbr,keydict in nbrs.items(): - if nbr not in seen: - for key,data in keydict.items(): - if keys: - yield (n,nbr,key,data) - else: - yield (n,nbr,data) - seen[n]=1 - else: - for n,nbrs in nodes_nbrs: - for nbr,keydict in nbrs.items(): - if nbr not in seen: - for key,data in keydict.items(): - if keys: - yield (n,nbr,key) - else: - yield (n,nbr) - - seen[n] = 1 - del seen - - - def get_edge_data(self, u, v, key=None, default=None): - """Return the attribute dictionary associated with edge (u,v). - - Parameters - ---------- - u,v : nodes - default: any Python object (default=None) - Value to return if the edge (u,v) is not found. - key : hashable identifier, optional (default=None) - Return data only for the edge with specified key. - - Returns - ------- - edge_dict : dictionary - The edge attribute dictionary. - - Notes - ----- - It is faster to use G[u][v][key]. - - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_edge(0,1,key='a',weight=7) - >>> G[0][1]['a'] # key='a' - {'weight': 7} - - Warning: Assigning G[u][v][key] corrupts the graph data structure. - But it is safe to assign attributes to that dictionary, - - >>> G[0][1]['a']['weight'] = 10 - >>> G[0][1]['a']['weight'] - 10 - >>> G[1][0]['a']['weight'] - 10 - - Examples - -------- - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_path([0,1,2,3]) - >>> G.get_edge_data(0,1) - {0: {}} - >>> e = (0,1) - >>> G.get_edge_data(*e) # tuple form - {0: {}} - >>> G.get_edge_data('a','b',default=0) # edge not in graph, return 0 - 0 - """ - try: - if key is None: - return self.adj[u][v] - else: - return self.adj[u][v][key] - except KeyError: - return default - - def degree_iter(self, nbunch=None, weight=None): - """Return an iterator for (node, degree). - - The node degree is the number of edges adjacent to the node. - - Parameters - ---------- - nbunch : iterable container, optional (default=all nodes) - A container of nodes. The container will be iterated - through once. - - weight : string or None, optional (default=None) - The edge attribute that holds the numerical value used - as a weight. If None, then each edge has weight 1. - The degree is the sum of the edge weights adjacent to the node. - - Returns - ------- - nd_iter : an iterator - The iterator returns two-tuples of (node, degree). - - See Also - -------- - degree - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> list(G.degree_iter(0)) # node 0 with degree 1 - [(0, 1)] - >>> list(G.degree_iter([0,1])) - [(0, 1), (1, 2)] - - """ - if nbunch is None: - nodes_nbrs = self.adj.items() - else: - nodes_nbrs=((n,self.adj[n]) for n in self.nbunch_iter(nbunch)) - - if weight is None: - for n,nbrs in nodes_nbrs: - deg = sum([len(data) for data in nbrs.values()]) - yield (n, deg+(n in nbrs and len(nbrs[n]))) - else: - # edge weighted graph - degree is sum of nbr edge weights - for n,nbrs in nodes_nbrs: - deg = sum([d.get(weight,1) - for data in nbrs.values() - for d in data.values()]) - if n in nbrs: - deg += sum([d.get(weight,1) - for key,d in nbrs[n].items()]) - yield (n, deg) - - - def is_multigraph(self): - """Return True if graph is a multigraph, False otherwise.""" - return True - - def is_directed(self): - """Return True if graph is directed, False otherwise.""" - return False - - def to_directed(self): - """Return a directed representation of the graph. - - Returns - ------- - G : MultiDiGraph - A directed graph with the same name, same nodes, and with - each edge (u,v,data) replaced by two directed edges - (u,v,data) and (v,u,data). - - Notes - ----- - This returns a "deepcopy" of the edge, node, and - graph attributes which attempts to completely copy - all of the data and references. - - This is in contrast to the similar D=DiGraph(G) which returns a - shallow copy of the data. - - See the Python copy module for more information on shallow - and deep copies, http://docs.python.org/library/copy.html. - - - Examples - -------- - >>> G = nx.Graph() # or MultiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1), (1, 0)] - - If already directed, return a (deep) copy - - >>> G = nx.DiGraph() # or MultiDiGraph, etc - >>> G.add_path([0,1]) - >>> H = G.to_directed() - >>> H.edges() - [(0, 1)] - """ - from networkx.classes.multidigraph import MultiDiGraph - G=MultiDiGraph() - G.add_nodes_from(self) - G.add_edges_from( (u,v,key,deepcopy(datadict)) - for u,nbrs in self.adjacency_iter() - for v,keydict in nbrs.items() - for key,datadict in keydict.items() ) - G.graph=deepcopy(self.graph) - G.node=deepcopy(self.node) - return G - - - def selfloop_edges(self, data=False, keys=False): - """Return a list of selfloop edges. - - A selfloop edge has the same node at both ends. - - Parameters - ----------- - data : bool, optional (default=False) - Return selfloop edges as two tuples (u,v) (data=False) - or three-tuples (u,v,data) (data=True) - keys : bool, optional (default=False) - If True, return edge keys with each edge. - - Returns - ------- - edgelist : list of edge tuples - A list of all selfloop edges. - - See Also - -------- - nodes_with_selfloops, number_of_selfloops - - Examples - -------- - >>> G = nx.MultiGraph() # or MultiDiGraph - >>> G.add_edge(1,1) - >>> G.add_edge(1,2) - >>> G.selfloop_edges() - [(1, 1)] - >>> G.selfloop_edges(data=True) - [(1, 1, {})] - >>> G.selfloop_edges(keys=True) - [(1, 1, 0)] - >>> G.selfloop_edges(keys=True, data=True) - [(1, 1, 0, {})] - """ - if data: - if keys: - return [ (n,n,k,d) - for n,nbrs in self.adj.items() - if n in nbrs for k,d in nbrs[n].items()] - else: - return [ (n,n,d) - for n,nbrs in self.adj.items() - if n in nbrs for d in nbrs[n].values()] - else: - if keys: - return [ (n,n,k) - for n,nbrs in self.adj.items() - if n in nbrs for k in nbrs[n].keys()] - - else: - return [ (n,n) - for n,nbrs in self.adj.items() - if n in nbrs for d in nbrs[n].values()] - - - def number_of_edges(self, u=None, v=None): - """Return the number of edges between two nodes. - - Parameters - ---------- - u,v : nodes, optional (default=all edges) - If u and v are specified, return the number of edges between - u and v. Otherwise return the total number of all edges. - - Returns - ------- - nedges : int - The number of edges in the graph. If nodes u and v are specified - return the number of edges between those nodes. - - See Also - -------- - size - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> G.number_of_edges() - 3 - >>> G.number_of_edges(0,1) - 1 - >>> e = (0,1) - >>> G.number_of_edges(*e) - 1 - """ - if u is None: return self.size() - try: - edgedata=self.adj[u][v] - except KeyError: - return 0 # no such edge - return len(edgedata) - - - def subgraph(self, nbunch): - """Return the subgraph induced on nodes in nbunch. - - The induced subgraph of the graph contains the nodes in nbunch - and the edges between those nodes. - - Parameters - ---------- - nbunch : list, iterable - A container of nodes which will be iterated through once. - - Returns - ------- - G : Graph - A subgraph of the graph with the same edge attributes. - - Notes - ----- - The graph, edge or node attributes just point to the original graph. - So changes to the node or edge structure will not be reflected in - the original graph while changes to the attributes will. - - To create a subgraph with its own copy of the edge/node attributes use: - nx.Graph(G.subgraph(nbunch)) - - If edge attributes are containers, a deep copy can be obtained using: - G.subgraph(nbunch).copy() - - For an inplace reduction of a graph to a subgraph you can remove nodes: - G.remove_nodes_from([ n in G if n not in set(nbunch)]) - - Examples - -------- - >>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc - >>> G.add_path([0,1,2,3]) - >>> H = G.subgraph([0,1,2]) - >>> H.edges() - [(0, 1), (1, 2)] - """ - bunch =self.nbunch_iter(nbunch) - # create new graph and copy subgraph into it - H = self.__class__() - # copy node and attribute dictionaries - for n in bunch: - H.node[n]=self.node[n] - # namespace shortcuts for speed - H_adj=H.adj - self_adj=self.adj - # add nodes and edges (undirected method) - for n in H: - Hnbrs={} - H_adj[n]=Hnbrs - for nbr,edgedict in self_adj[n].items(): - if nbr in H_adj: - # add both representations of edge: n-nbr and nbr-n - # they share the same edgedict - ed=edgedict.copy() - Hnbrs[nbr]=ed - H_adj[nbr][n]=ed - H.graph=self.graph - return H diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/historical_tests.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/historical_tests.py deleted file mode 100644 index 5dd398c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/historical_tests.py +++ /dev/null @@ -1,477 +0,0 @@ -#!/usr/bin/env python -"""Original NetworkX graph tests""" -from nose.tools import * -import networkx -import networkx as nx -from networkx import convert_node_labels_to_integers as cnlti -from networkx.testing import * - -class HistoricalTests(object): - - def setUp(self): - self.null=nx.null_graph() - self.P1=cnlti(nx.path_graph(1),first_label=1) - self.P3=cnlti(nx.path_graph(3),first_label=1) - self.P10=cnlti(nx.path_graph(10),first_label=1) - self.K1=cnlti(nx.complete_graph(1),first_label=1) - self.K3=cnlti(nx.complete_graph(3),first_label=1) - self.K4=cnlti(nx.complete_graph(4),first_label=1) - self.K5=cnlti(nx.complete_graph(5),first_label=1) - self.K10=cnlti(nx.complete_graph(10),first_label=1) - self.G=nx.Graph - - def test_name(self): - G=self.G(name="test") - assert_equal(str(G),'test') - assert_equal(G.name,'test') - H=self.G() - assert_equal(H.name,'') - - # Nodes - - def test_add_remove_node(self): - G=self.G() - G.add_node('A') - assert_true(G.has_node('A')) - G.remove_node('A') - assert_false(G.has_node('A')) - - def test_nonhashable_node(self): - # Test if a non-hashable object is in the Graph. A python dict will - # raise a TypeError, but for a Graph class a simple False should be - # returned (see Graph __contains__). If it cannot be a node then it is - # not a node. - G=self.G() - assert_false(G.has_node(['A'])) - assert_false(G.has_node({'A':1})) - - def test_add_nodes_from(self): - G=self.G() - G.add_nodes_from(list("ABCDEFGHIJKL")) - assert_true(G.has_node("L")) - G.remove_nodes_from(['H','I','J','K','L']) - G.add_nodes_from([1,2,3,4]) - assert_equal(sorted(G.nodes(),key=str), - [1, 2, 3, 4, 'A', 'B', 'C', 'D', 'E', 'F', 'G']) - # test __iter__ - assert_equal(sorted(G,key=str), - [1, 2, 3, 4, 'A', 'B', 'C', 'D', 'E', 'F', 'G']) - - - def test_contains(self): - G=self.G() - G.add_node('A') - assert_true('A' in G) - assert_false([] in G) # never raise a Key or TypeError in this test - assert_false({1:1} in G) - - def test_add_remove(self): - # Test add_node and remove_node acting for various nbunch - G=self.G() - G.add_node('m') - assert_true(G.has_node('m')) - G.add_node('m') # no complaints - assert_raises(nx.NetworkXError,G.remove_node,'j') - G.remove_node('m') - assert_equal(G.nodes(),[]) - - def test_nbunch_is_list(self): - G=self.G() - G.add_nodes_from(list("ABCD")) - G.add_nodes_from(self.P3) # add nbunch of nodes (nbunch=Graph) - assert_equal(sorted(G.nodes(),key=str), - [1, 2, 3, 'A', 'B', 'C', 'D']) - G.remove_nodes_from(self.P3) # remove nbunch of nodes (nbunch=Graph) - assert_equal(sorted(G.nodes(),key=str), - ['A', 'B', 'C', 'D']) - - def test_nbunch_is_set(self): - G=self.G() - nbunch=set("ABCDEFGHIJKL") - G.add_nodes_from(nbunch) - assert_true(G.has_node("L")) - - def test_nbunch_dict(self): - # nbunch is a dict with nodes as keys - G=self.G() - nbunch=set("ABCDEFGHIJKL") - G.add_nodes_from(nbunch) - nbunch={'I':"foo",'J':2,'K':True,'L':"spam"} - G.remove_nodes_from(nbunch) - assert_true(sorted(G.nodes(),key=str), - ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - - def test_nbunch_iterator(self): - G=self.G() - G.add_nodes_from(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - n_iter=self.P3.nodes_iter() - G.add_nodes_from(n_iter) - assert_equal(sorted(G.nodes(),key=str), - [1, 2, 3, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - n_iter=self.P3.nodes_iter() # rebuild same iterator - G.remove_nodes_from(n_iter) # remove nbunch of nodes (nbunch=iterator) - assert_equal(sorted(G.nodes(),key=str), - ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - - def test_nbunch_graph(self): - G=self.G() - G.add_nodes_from(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - nbunch=self.K3 - G.add_nodes_from(nbunch) - assert_true(sorted(G.nodes(),key=str), - [1, 2, 3, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - - - - # Edges - - def test_add_edge(self): - G=self.G() - assert_raises(TypeError,G.add_edge,'A') - - G.add_edge('A','B') # testing add_edge() - G.add_edge('A','B') # should fail silently - assert_true(G.has_edge('A','B')) - assert_false(G.has_edge('A','C')) - assert_true(G.has_edge( *('A','B') )) - if G.is_directed(): - assert_false(G.has_edge('B','A')) - else: - # G is undirected, so B->A is an edge - assert_true(G.has_edge('B','A')) - - - G.add_edge('A','C') # test directedness - G.add_edge('C','A') - G.remove_edge('C','A') - if G.is_directed(): - assert_true(G.has_edge('A','C')) - else: - assert_false(G.has_edge('A','C')) - assert_false(G.has_edge('C','A')) - - - def test_self_loop(self): - G=self.G() - G.add_edge('A','A') # test self loops - assert_true(G.has_edge('A','A')) - G.remove_edge('A','A') - G.add_edge('X','X') - assert_true(G.has_node('X')) - G.remove_node('X') - G.add_edge('A','Z') # should add the node silently - assert_true(G.has_node('Z')) - - def test_add_edges_from(self): - G=self.G() - G.add_edges_from([('B','C')]) # test add_edges_from() - assert_true(G.has_edge('B','C')) - if G.is_directed(): - assert_false(G.has_edge('C','B')) - else: - assert_true(G.has_edge('C','B')) # undirected - - G.add_edges_from([('D','F'),('B','D')]) - assert_true(G.has_edge('D','F')) - assert_true(G.has_edge('B','D')) - - if G.is_directed(): - assert_false(G.has_edge('D','B')) - else: - assert_true(G.has_edge('D','B')) # undirected - - def test_add_edges_from2(self): - G=self.G() - # after failing silently, should add 2nd edge - G.add_edges_from([tuple('IJ'),list('KK'),tuple('JK')]) - assert_true(G.has_edge(*('I','J'))) - assert_true(G.has_edge(*('K','K'))) - assert_true(G.has_edge(*('J','K'))) - if G.is_directed(): - assert_false(G.has_edge(*('K','J'))) - else: - assert_true(G.has_edge(*('K','J'))) - - def test_add_edges_from3(self): - G=self.G() - G.add_edges_from(zip(list('ACD'),list('CDE'))) - assert_true(G.has_edge('D','E')) - assert_false(G.has_edge('E','C')) - - def test_remove_edge(self): - G=self.G() - G.add_nodes_from([1, 2, 3, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) - - G.add_edges_from(zip(list('MNOP'),list('NOPM'))) - assert_true(G.has_edge('O','P')) - assert_true( G.has_edge('P','M')) - G.remove_node('P') # tests remove_node()'s handling of edges. - assert_false(G.has_edge('P','M')) - assert_raises(TypeError,G.remove_edge,'M') - - G.add_edge('N','M') - assert_true(G.has_edge('M','N')) - G.remove_edge('M','N') - assert_false(G.has_edge('M','N')) - - # self loop fails silently - G.remove_edges_from([list('HI'),list('DF'), - tuple('KK'),tuple('JK')]) - assert_false(G.has_edge('H','I')) - assert_false(G.has_edge('J','K')) - G.remove_edges_from([list('IJ'),list('KK'),list('JK')]) - assert_false(G.has_edge('I','J')) - G.remove_nodes_from(set('ZEFHIMNO')) - G.add_edge('J','K') - - - def test_edges_nbunch(self): - # Test G.edges(nbunch) with various forms of nbunch - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - # node not in nbunch should be quietly ignored - assert_raises(nx.NetworkXError,G.edges,6) - assert_equals(G.edges('Z'),[]) # iterable non-node - # nbunch can be an empty list - assert_equals(G.edges([]),[]) - if G.is_directed(): - elist=[('A', 'B'), ('A', 'C'), ('B', 'D')] - else: - elist=[('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D')] - # nbunch can be a list - assert_edges_equal(G.edges(['A','B']),elist) - # nbunch can be a set - assert_edges_equal(G.edges(set(['A','B'])),elist) - # nbunch can be a graph - G1=self.G() - G1.add_nodes_from('AB') - assert_edges_equal(G.edges(G1),elist) - # nbunch can be a dict with nodes as keys - ndict={'A': "thing1", 'B': "thing2"} - assert_edges_equal(G.edges(ndict),elist) - # nbunch can be a single node - assert_edges_equal(G.edges('A'), [('A', 'B'), ('A', 'C')]) - - assert_edges_equal(G.nodes_iter(), ['A', 'B', 'C', 'D']) - - def test_edges_iter_nbunch(self): - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - # Test G.edges_iter(nbunch) with various forms of nbunch - # node not in nbunch should be quietly ignored - assert_equals(list(G.edges_iter('Z')),[]) - # nbunch can be an empty list - assert_equals(sorted(G.edges_iter([])),[]) - if G.is_directed(): - elist=[('A', 'B'), ('A', 'C'), ('B', 'D')] - else: - elist=[('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D')] - # nbunch can be a list - assert_edges_equal(G.edges_iter(['A','B']),elist) - # nbunch can be a set - assert_edges_equal(G.edges_iter(set(['A','B'])),elist) - # nbunch can be a graph - G1=self.G() - G1.add_nodes_from(['A','B']) - assert_edges_equal(G.edges_iter(G1),elist) - # nbunch can be a dict with nodes as keys - ndict={'A': "thing1", 'B': "thing2"} - assert_edges_equal(G.edges_iter(ndict),elist) - # nbunch can be a single node - assert_edges_equal(G.edges_iter('A'), [('A', 'B'), ('A', 'C')]) - - # nbunch can be nothing (whole graph) - assert_edges_equal(G.edges_iter(), [('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - - - def test_degree(self): - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - assert_equal(G.degree('A'),2) - - # degree of single node in iterable container must return dict - assert_equal(list(G.degree(['A']).values()),[2]) - assert_equal(G.degree(['A']),{'A': 2}) - assert_equal(sorted(G.degree(['A','B']).values()),[2, 3]) - assert_equal(G.degree(['A','B']),{'A': 2, 'B': 3}) - assert_equal(sorted(G.degree().values()),[2, 2, 3, 3]) - assert_equal(sorted([v for k,v in G.degree_iter()]), - [2, 2, 3, 3]) - - def test_degree2(self): - H=self.G() - H.add_edges_from([(1,24),(1,2)]) - assert_equal(sorted(H.degree([1,24]).values()),[1, 2]) - - def test_degree_graph(self): - P3=nx.path_graph(3) - P5=nx.path_graph(5) - # silently ignore nodes not in P3 - assert_equal(P3.degree(['A','B']),{}) - # nbunch can be a graph - assert_equal(sorted(P5.degree(P3).values()),[1, 2, 2]) - # nbunch can be a graph thats way to big - assert_equal(sorted(P3.degree(P5).values()),[1, 1, 2]) - assert_equal(P5.degree([]),{}) - assert_equal(list(P5.degree_iter([])),[]) - assert_equal(dict(P5.degree_iter([])),{}) - - def test_null(self): - null=nx.null_graph() - assert_equal(null.degree(),{}) - assert_equal(list(null.degree_iter()),[]) - assert_equal(dict(null.degree_iter()),{}) - - def test_order_size(self): - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - assert_equal(G.order(),4) - assert_equal(G.size(),5) - assert_equal(G.number_of_edges(),5) - assert_equal(G.number_of_edges('A','B'),1) - assert_equal(G.number_of_edges('A','D'),0) - - def test_copy(self): - G=self.G() - H=G.copy() # copy - assert_equal(H.adj,G.adj) - assert_equal(H.name,G.name) - assert_not_equal(H,G) - - def test_subgraph(self): - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - SG=G.subgraph(['A','B','D']) - assert_nodes_equal(SG.nodes(),['A', 'B', 'D']) - assert_edges_equal(SG.edges(),[('A', 'B'), ('B', 'D')]) - - def test_to_directed(self): - G=self.G() - if not G.is_directed(): - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - - DG=G.to_directed() - assert_not_equal(DG,G) # directed copy or copy - - assert_true(DG.is_directed()) - assert_equal(DG.name,G.name) - assert_equal(DG.adj,G.adj) - assert_equal(sorted(DG.out_edges(list('AB'))), - [('A', 'B'), ('A', 'C'), ('B', 'A'), - ('B', 'C'), ('B', 'D')]) - DG.remove_edge('A','B') - assert_true(DG.has_edge('B','A')) # this removes B-A but not A-B - assert_false(DG.has_edge('A','B')) - - def test_to_undirected(self): - G=self.G() - if G.is_directed(): - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - UG=G.to_undirected() # to_undirected - assert_not_equal(UG,G) - assert_false(UG.is_directed()) - assert_true(G.is_directed()) - assert_equal(UG.name,G.name) - assert_not_equal(UG.adj,G.adj) - assert_equal(sorted(UG.edges(list('AB'))), - [('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D')]) - assert_equal(sorted(UG.edges(['A','B'])), - [('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D')]) - UG.remove_edge('A','B') - assert_false(UG.has_edge('B','A')) - assert_false( UG.has_edge('A','B')) - - - - def test_neighbors(self): - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - G.add_nodes_from('GJK') - assert_equal(sorted(G['A']),['B', 'C']) - assert_equal(sorted(G.neighbors('A')),['B', 'C']) - assert_equal(sorted(G.neighbors_iter('A')),['B', 'C']) - assert_equal(sorted(G.neighbors('G')),[]) - assert_raises(nx.NetworkXError,G.neighbors,'j') - - def test_iterators(self): - G=self.G() - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('C', 'B'), ('C', 'D')]) - G.add_nodes_from('GJK') - assert_equal(sorted(G.nodes_iter()), - ['A', 'B', 'C', 'D', 'G', 'J', 'K']) - assert_edges_equal(G.edges_iter(), - [('A', 'B'), ('A', 'C'), ('B', 'D'), ('C', 'B'), ('C', 'D')]) - - assert_equal(sorted([v for k,v in G.degree_iter()]), - [0, 0, 0, 2, 2, 3, 3]) - assert_equal(sorted(G.degree_iter(),key=str), - [('A', 2), ('B', 3), ('C', 3), ('D', 2), - ('G', 0), ('J', 0), ('K', 0)]) - assert_equal(sorted(G.neighbors_iter('A')),['B', 'C']) - assert_raises(nx.NetworkXError,G.neighbors_iter,'X') - G.clear() - assert_equal(nx.number_of_nodes(G),0) - assert_equal(nx.number_of_edges(G),0) - - - def test_null_subgraph(self): - # Subgraph of a null graph is a null graph - nullgraph=nx.null_graph() - G=nx.null_graph() - H=G.subgraph([]) - assert_true(nx.is_isomorphic(H,nullgraph)) - - def test_empty_subgraph(self): - # Subgraph of an empty graph is an empty graph. test 1 - nullgraph=nx.null_graph() - E5=nx.empty_graph(5) - E10=nx.empty_graph(10) - H=E10.subgraph([]) - assert_true(nx.is_isomorphic(H,nullgraph)) - H=E10.subgraph([1,2,3,4,5]) - assert_true(nx.is_isomorphic(H,E5)) - - def test_complete_subgraph(self): - # Subgraph of a complete graph is a complete graph - K1=nx.complete_graph(1) - K3=nx.complete_graph(3) - K5=nx.complete_graph(5) - H=K5.subgraph([1,2,3]) - assert_true(nx.is_isomorphic(H,K3)) - - def test_subgraph_nbunch(self): - nullgraph=nx.null_graph() - K1=nx.complete_graph(1) - K3=nx.complete_graph(3) - K5=nx.complete_graph(5) - # Test G.subgraph(nbunch), where nbunch is a single node - H=K5.subgraph(1) - assert_true(nx.is_isomorphic(H,K1)) - # Test G.subgraph(nbunch), where nbunch is a set - H=K5.subgraph(set([1])) - assert_true(nx.is_isomorphic(H,K1)) - # Test G.subgraph(nbunch), where nbunch is an iterator - H=K5.subgraph(iter(K3)) - assert_true(nx.is_isomorphic(H,K3)) - # Test G.subgraph(nbunch), where nbunch is another graph - H=K5.subgraph(K3) - assert_true(nx.is_isomorphic(H,K3)) - H=K5.subgraph([9]) - assert_true(nx.is_isomorphic(H,nullgraph)) - - def test_node_tuple_error(self): - H=self.G() - # Test error handling of tuple as a node - assert_raises(nx.NetworkXError,H.remove_node,(1,2)) - H.remove_nodes_from([(1,2)]) # no error - assert_raises(nx.NetworkXError,H.neighbors,(1,2)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_digraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_digraph.py deleted file mode 100644 index 9ac3d3e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_digraph.py +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx -from test_graph import BaseGraphTester, BaseAttrGraphTester, TestGraph - -class BaseDiGraphTester(BaseGraphTester): - def test_has_successor(self): - G=self.K3 - assert_equal(G.has_successor(0,1),True) - assert_equal(G.has_successor(0,-1),False) - - def test_successors(self): - G=self.K3 - assert_equal(sorted(G.successors(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.successors,-1) - - def test_successors_iter(self): - G=self.K3 - assert_equal(sorted(G.successors_iter(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.successors_iter,-1) - - def test_has_predecessor(self): - G=self.K3 - assert_equal(G.has_predecessor(0,1),True) - assert_equal(G.has_predecessor(0,-1),False) - - def test_predecessors(self): - G=self.K3 - assert_equal(sorted(G.predecessors(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.predecessors,-1) - - def test_predecessors_iter(self): - G=self.K3 - assert_equal(sorted(G.predecessors_iter(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.predecessors_iter,-1) - - def test_edges(self): - G=self.K3 - assert_equal(sorted(G.edges()),[(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.edges(0)),[(0,1),(0,2)]) - assert_raises((KeyError,networkx.NetworkXError), G.edges,-1) - - def test_edges_iter(self): - G=self.K3 - assert_equal(sorted(G.edges_iter()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.edges_iter(0)),[(0,1),(0,2)]) - - def test_edges_data(self): - G=self.K3 - assert_equal(sorted(G.edges(data=True)), - [(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}),(2,0,{}),(2,1,{})]) - assert_equal(sorted(G.edges(0,data=True)),[(0,1,{}),(0,2,{})]) - assert_raises((KeyError,networkx.NetworkXError), G.edges,-1) - - def test_out_edges(self): - G=self.K3 - assert_equal(sorted(G.out_edges()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.out_edges(0)),[(0,1),(0,2)]) - assert_raises((KeyError,networkx.NetworkXError), G.out_edges,-1) - - def test_out_edges_iter(self): - G=self.K3 - assert_equal(sorted(G.out_edges_iter()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.edges_iter(0)),[(0,1),(0,2)]) - - def test_out_edges_dir(self): - G=self.P3 - assert_equal(sorted(G.out_edges()),[(0, 1), (1, 2)]) - assert_equal(sorted(G.out_edges(0)),[(0, 1)]) - assert_equal(sorted(G.out_edges(2)),[]) - - def test_out_edges_iter_dir(self): - G=self.P3 - assert_equal(sorted(G.out_edges_iter()),[(0, 1), (1, 2)]) - assert_equal(sorted(G.out_edges_iter(0)),[(0, 1)]) - assert_equal(sorted(G.out_edges_iter(2)),[]) - - def test_in_edges_dir(self): - G=self.P3 - assert_equal(sorted(G.in_edges()),[(0, 1), (1, 2)]) - assert_equal(sorted(G.in_edges(0)),[]) - assert_equal(sorted(G.in_edges(2)),[(1,2)]) - - def test_in_edges_iter_dir(self): - G=self.P3 - assert_equal(sorted(G.in_edges_iter()),[(0, 1), (1, 2)]) - assert_equal(sorted(G.in_edges_iter(0)),[]) - assert_equal(sorted(G.in_edges_iter(2)),[(1,2)]) - - def test_degree(self): - G=self.K3 - assert_equal(list(G.degree().values()),[4,4,4]) - assert_equal(G.degree(),{0:4,1:4,2:4}) - assert_equal(G.degree(0),4) - assert_equal(G.degree([0]),{0:4}) - assert_raises((KeyError,networkx.NetworkXError), G.degree,-1) - - def test_degree_iter(self): - G=self.K3 - assert_equal(list(G.degree_iter()),[(0,4),(1,4),(2,4)]) - assert_equal(dict(G.degree_iter()),{0:4,1:4,2:4}) - assert_equal(list(G.degree_iter(0)),[(0,4)]) - - def test_in_degree(self): - G=self.K3 - assert_equal(list(G.in_degree().values()),[2,2,2]) - assert_equal(G.in_degree(),{0:2,1:2,2:2}) - assert_equal(G.in_degree(0),2) - assert_equal(G.in_degree([0]),{0:2}) - assert_raises((KeyError,networkx.NetworkXError), G.in_degree,-1) - - def test_in_degree_iter(self): - G=self.K3 - assert_equal(list(G.in_degree_iter()),[(0,2),(1,2),(2,2)]) - assert_equal(dict(G.in_degree_iter()),{0:2,1:2,2:2}) - assert_equal(list(G.in_degree_iter(0)),[(0,2)]) - - def test_in_degree_iter_weighted(self): - G=self.K3 - G.add_edge(0,1,weight=0.3,other=1.2) - assert_equal(list(G.in_degree_iter(weight='weight')),[(0,2),(1,1.3),(2,2)]) - assert_equal(dict(G.in_degree_iter(weight='weight')),{0:2,1:1.3,2:2}) - assert_equal(list(G.in_degree_iter(1,weight='weight')),[(1,1.3)]) - assert_equal(list(G.in_degree_iter(weight='other')),[(0,2),(1,2.2),(2,2)]) - assert_equal(dict(G.in_degree_iter(weight='other')),{0:2,1:2.2,2:2}) - assert_equal(list(G.in_degree_iter(1,weight='other')),[(1,2.2)]) - - def test_out_degree(self): - G=self.K3 - assert_equal(list(G.out_degree().values()),[2,2,2]) - assert_equal(G.out_degree(),{0:2,1:2,2:2}) - assert_equal(G.out_degree(0),2) - assert_equal(G.out_degree([0]),{0:2}) - assert_raises((KeyError,networkx.NetworkXError), G.out_degree,-1) - - def test_out_degree_iter_weighted(self): - G=self.K3 - G.add_edge(0,1,weight=0.3,other=1.2) - assert_equal(list(G.out_degree_iter(weight='weight')),[(0,1.3),(1,2),(2,2)]) - assert_equal(dict(G.out_degree_iter(weight='weight')),{0:1.3,1:2,2:2}) - assert_equal(list(G.out_degree_iter(0,weight='weight')),[(0,1.3)]) - assert_equal(list(G.out_degree_iter(weight='other')),[(0,2.2),(1,2),(2,2)]) - assert_equal(dict(G.out_degree_iter(weight='other')),{0:2.2,1:2,2:2}) - assert_equal(list(G.out_degree_iter(0,weight='other')),[(0,2.2)]) - - def test_out_degree_iter(self): - G=self.K3 - assert_equal(list(G.out_degree_iter()),[(0,2),(1,2),(2,2)]) - assert_equal(dict(G.out_degree_iter()),{0:2,1:2,2:2}) - assert_equal(list(G.out_degree_iter(0)),[(0,2)]) - - def test_size(self): - G=self.K3 - assert_equal(G.size(),6) - assert_equal(G.number_of_edges(),6) - - def test_to_undirected_reciprocal(self): - G=self.Graph() - G.add_edge(1,2) - assert_true(G.to_undirected().has_edge(1,2)) - assert_false(G.to_undirected(reciprocal=True).has_edge(1,2)) - G.add_edge(2,1) - assert_true(G.to_undirected(reciprocal=True).has_edge(1,2)) - - def test_reverse_copy(self): - G=networkx.DiGraph([(0,1),(1,2)]) - R=G.reverse() - assert_equal(sorted(R.edges()),[(1,0),(2,1)]) - R.remove_edge(1,0) - assert_equal(sorted(R.edges()),[(2,1)]) - assert_equal(sorted(G.edges()),[(0,1),(1,2)]) - - def test_reverse_nocopy(self): - G=networkx.DiGraph([(0,1),(1,2)]) - R=G.reverse(copy=False) - assert_equal(sorted(R.edges()),[(1,0),(2,1)]) - R.remove_edge(1,0) - assert_equal(sorted(R.edges()),[(2,1)]) - assert_equal(sorted(G.edges()),[(2,1)]) - -class BaseAttrDiGraphTester(BaseDiGraphTester,BaseAttrGraphTester): - pass - - -class TestDiGraph(BaseAttrDiGraphTester,TestGraph): - """Tests specific to dict-of-dict-of-dict digraph data structure""" - def setUp(self): - self.Graph=networkx.DiGraph - # build dict-of-dict-of-dict K3 - ed1,ed2,ed3,ed4,ed5,ed6 = ({},{},{},{},{},{}) - self.k3adj={0: {1: ed1, 2: ed2}, 1: {0: ed3, 2: ed4}, 2: {0: ed5, 1:ed6}} - self.k3edges=[(0, 1), (0, 2), (1, 2)] - self.k3nodes=[0, 1, 2] - self.K3=self.Graph() - self.K3.adj = self.K3.succ = self.K3.edge = self.k3adj - self.K3.pred={0: {1: ed3, 2: ed5}, 1: {0: ed1, 2: ed6}, 2: {0: ed2, 1:ed4}} - - ed1,ed2 = ({},{}) - self.P3=self.Graph() - self.P3.adj={0: {1: ed1}, 1: {2: ed2}, 2: {}} - self.P3.succ=self.P3.adj - self.P3.pred={0: {}, 1: {0: ed1}, 2: {1: ed2}} - self.K3.node={} - self.K3.node[0]={} - self.K3.node[1]={} - self.K3.node[2]={} - self.P3.node={} - self.P3.node[0]={} - self.P3.node[1]={} - self.P3.node[2]={} - - def test_data_input(self): - G=self.Graph(data={1:[2],2:[1]}, name="test") - assert_equal(G.name,"test") - assert_equal(sorted(G.adj.items()),[(1, {2: {}}), (2, {1: {}})]) - assert_equal(sorted(G.succ.items()),[(1, {2: {}}), (2, {1: {}})]) - assert_equal(sorted(G.pred.items()),[(1, {2: {}}), (2, {1: {}})]) - - def test_add_edge(self): - G=self.Graph() - G.add_edge(0,1) - assert_equal(G.adj,{0: {1: {}}, 1: {}}) - assert_equal(G.succ,{0: {1: {}}, 1: {}}) - assert_equal(G.pred,{0: {}, 1: {0:{}}}) - G=self.Graph() - G.add_edge(*(0,1)) - assert_equal(G.adj,{0: {1: {}}, 1: {}}) - assert_equal(G.succ,{0: {1: {}}, 1: {}}) - assert_equal(G.pred,{0: {}, 1: {0:{}}}) - - def test_add_edges_from(self): - G=self.Graph() - G.add_edges_from([(0,1),(0,2,{'data':3})],data=2) - assert_equal(G.adj,{0: {1: {'data':2}, 2: {'data':3}}, 1: {}, 2: {}}) - assert_equal(G.succ,{0: {1: {'data':2}, 2: {'data':3}}, 1: {}, 2: {}}) - assert_equal(G.pred,{0: {}, 1: {0: {'data':2}}, 2: {0: {'data':3}}}) - - assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,)]) # too few in tuple - assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,1,2,3)]) # too many in tuple - assert_raises(TypeError, G.add_edges_from,[0]) # not a tuple - - def test_remove_edge(self): - G=self.K3 - G.remove_edge(0,1) - assert_equal(G.succ,{0:{2:{}},1:{0:{},2:{}},2:{0:{},1:{}}}) - assert_equal(G.pred,{0:{1:{}, 2:{}}, 1:{2:{}}, 2:{0:{},1:{}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) - - def test_remove_edges_from(self): - G=self.K3 - G.remove_edges_from([(0,1)]) - assert_equal(G.succ,{0:{2:{}},1:{0:{},2:{}},2:{0:{},1:{}}}) - assert_equal(G.pred,{0:{1:{}, 2:{}}, 1:{2:{}}, 2:{0:{},1: {}}}) - G.remove_edges_from([(0,0)]) # silent fail diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_digraph_historical.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_digraph_historical.py deleted file mode 100644 index 6bf295c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_digraph_historical.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python -"""Original NetworkX graph tests""" -from nose.tools import * -import networkx -import networkx as nx - -from historical_tests import HistoricalTests - -class TestDiGraphHistorical(HistoricalTests): - - def setUp(self): - HistoricalTests.setUp(self) - self.G=nx.DiGraph - - - def test_in_degree(self): - G=self.G() - G.add_nodes_from('GJK') - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('B', 'C'), ('C', 'D')]) - - assert_equal(sorted(G.in_degree().values()),[0, 0, 0, 0, 1, 2, 2]) - assert_equal(G.in_degree(), - {'A': 0, 'C': 2, 'B': 1, 'D': 2, 'G': 0, 'K': 0, 'J': 0}) - assert_equal(sorted([v for k,v in G.in_degree_iter()]), - [0, 0, 0, 0, 1, 2, 2]) - assert_equal(dict(G.in_degree_iter()), - {'A': 0, 'C': 2, 'B': 1, 'D': 2, 'G': 0, 'K': 0, 'J': 0}) - - - def test_out_degree(self): - G=self.G() - G.add_nodes_from('GJK') - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('B', 'C'), ('C', 'D')]) - assert_equal(sorted(G.out_degree().values()),[0, 0, 0, 0, 1, 2, 2]) - assert_equal(G.out_degree(), - {'A': 2, 'C': 1, 'B': 2, 'D': 0, 'G': 0, 'K': 0, 'J': 0}) - assert_equal(sorted([v for k,v in G.in_degree_iter()]), - [0, 0, 0, 0, 1, 2, 2]) - assert_equal(dict(G.out_degree_iter()), - {'A': 2, 'C': 1, 'B': 2, 'D': 0, 'G': 0, 'K': 0, 'J': 0}) - - - def test_degree_digraph(self): - H=nx.DiGraph() - H.add_edges_from([(1,24),(1,2)]) - assert_equal(sorted(H.in_degree([1,24]).values()),[0, 1]) - assert_equal(sorted(H.out_degree([1,24]).values()),[0, 2]) - assert_equal(sorted(H.degree([1,24]).values()),[1, 2]) - - - def test_neighbors(self): - G=self.G() - G.add_nodes_from('GJK') - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('B', 'C'), ('C', 'D')]) - - assert_equal(sorted(G.neighbors('C')),['D']) - assert_equal(sorted(G['C']),['D']) - assert_equal(sorted(G.neighbors('A')),['B', 'C']) - assert_equal(sorted(G.neighbors_iter('A')),['B', 'C']) - assert_equal(sorted(G.neighbors_iter('C')),['D']) - assert_equal(sorted(G.neighbors('A')),['B', 'C']) - assert_raises(nx.NetworkXError,G.neighbors,'j') - assert_raises(nx.NetworkXError,G.neighbors_iter,'j') - - def test_successors(self): - G=self.G() - G.add_nodes_from('GJK') - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('B', 'C'), ('C', 'D')]) - assert_equal(sorted(G.successors('A')),['B', 'C']) - assert_equal(sorted(G.successors_iter('A')),['B', 'C']) - assert_equal(sorted(G.successors('G')),[]) - assert_equal(sorted(G.successors('D')),[]) - assert_equal(sorted(G.successors_iter('G')),[]) - assert_raises(nx.NetworkXError,G.successors,'j') - assert_raises(nx.NetworkXError,G.successors_iter,'j') - - - def test_predecessors(self): - G=self.G() - G.add_nodes_from('GJK') - G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), - ('B', 'C'), ('C', 'D')]) - assert_equal(sorted(G.predecessors('C')),['A', 'B']) - assert_equal(sorted(G.predecessors_iter('C')),['A', 'B']) - assert_equal(sorted(G.predecessors('G')),[]) - assert_equal(sorted(G.predecessors('A')),[]) - assert_equal(sorted(G.predecessors_iter('G')),[]) - assert_equal(sorted(G.predecessors_iter('A')),[]) - assert_equal(sorted(G.successors_iter('D')),[]) - - assert_raises(nx.NetworkXError,G.predecessors,'j') - assert_raises(nx.NetworkXError,G.predecessors,'j') - - - - def test_reverse(self): - G=nx.complete_graph(10) - H=G.to_directed() - HR=H.reverse() - assert_true(nx.is_isomorphic(H,HR)) - assert_equal(sorted(H.edges()),sorted(HR.edges())) - - def test_reverse2(self): - H=nx.DiGraph() - foo=[H.add_edge(u,u+1) for u in range(0,5)] - HR=H.reverse() - for u in range(0,5): - assert_true(HR.has_edge(u+1,u)) - - def test_reverse3(self): - H=nx.DiGraph() - H.add_nodes_from([1,2,3,4]) - HR=H.reverse() - assert_equal(sorted(HR.nodes()),[1, 2, 3, 4]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_function.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_function.py deleted file mode 100644 index 2c12178..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_function.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python -import random -from nose.tools import * -import networkx -import networkx as nx - -class TestFunction(object): - def setUp(self): - self.G=networkx.Graph({0:[1,2,3], 1:[1,2,0], 4:[]}, name='Test') - self.Gdegree={0:3, 1:2, 2:2, 3:1, 4:0} - self.Gnodes=list(range(5)) - self.Gedges=[(0,1),(0,2),(0,3),(1,0),(1,1),(1,2)] - self.DG=networkx.DiGraph({0:[1,2,3], 1:[1,2,0], 4:[]}) - self.DGin_degree={0:1, 1:2, 2:2, 3:1, 4:0} - self.DGout_degree={0:3, 1:3, 2:0, 3:0, 4:0} - self.DGnodes=list(range(5)) - self.DGedges=[(0,1),(0,2),(0,3),(1,0),(1,1),(1,2)] - - def test_nodes(self): - assert_equal(self.G.nodes(),networkx.nodes(self.G)) - assert_equal(self.DG.nodes(),networkx.nodes(self.DG)) - def test_edges(self): - assert_equal(self.G.edges(),networkx.edges(self.G)) - assert_equal(self.DG.edges(),networkx.edges(self.DG)) - assert_equal(self.G.edges(nbunch=[0,1,3]),networkx.edges(self.G,nbunch=[0,1,3])) - assert_equal(self.DG.edges(nbunch=[0,1,3]),networkx.edges(self.DG,nbunch=[0,1,3])) - def test_nodes_iter(self): - assert_equal(list(self.G.nodes_iter()),list(networkx.nodes_iter(self.G))) - assert_equal(list(self.DG.nodes_iter()),list(networkx.nodes_iter(self.DG))) - def test_edges_iter(self): - assert_equal(list(self.G.edges_iter()),list(networkx.edges_iter(self.G))) - assert_equal(list(self.DG.edges_iter()),list(networkx.edges_iter(self.DG))) - assert_equal(list(self.G.edges_iter(nbunch=[0,1,3])),list(networkx.edges_iter(self.G,nbunch=[0,1,3]))) - assert_equal(list(self.DG.edges_iter(nbunch=[0,1,3])),list(networkx.edges_iter(self.DG,nbunch=[0,1,3]))) - def test_degree(self): - assert_equal(self.G.degree(),networkx.degree(self.G)) - assert_equal(self.DG.degree(),networkx.degree(self.DG)) - assert_equal(self.G.degree(nbunch=[0,1]),networkx.degree(self.G,nbunch=[0,1])) - assert_equal(self.DG.degree(nbunch=[0,1]),networkx.degree(self.DG,nbunch=[0,1])) - assert_equal(self.G.degree(weight='weight'),networkx.degree(self.G,weight='weight')) - assert_equal(self.DG.degree(weight='weight'),networkx.degree(self.DG,weight='weight')) - def test_neighbors(self): - assert_equal(self.G.neighbors(1),networkx.neighbors(self.G,1)) - assert_equal(self.DG.neighbors(1),networkx.neighbors(self.DG,1)) - def test_number_of_nodes(self): - assert_equal(self.G.number_of_nodes(),networkx.number_of_nodes(self.G)) - assert_equal(self.DG.number_of_nodes(),networkx.number_of_nodes(self.DG)) - def test_number_of_edges(self): - assert_equal(self.G.number_of_edges(),networkx.number_of_edges(self.G)) - assert_equal(self.DG.number_of_edges(),networkx.number_of_edges(self.DG)) - def test_is_directed(self): - assert_equal(self.G.is_directed(),networkx.is_directed(self.G)) - assert_equal(self.DG.is_directed(),networkx.is_directed(self.DG)) - def test_subgraph(self): - assert_equal(self.G.subgraph([0,1,2,4]).adj,networkx.subgraph(self.G,[0,1,2,4]).adj) - assert_equal(self.DG.subgraph([0,1,2,4]).adj,networkx.subgraph(self.DG,[0,1,2,4]).adj) - - def test_create_empty_copy(self): - G=networkx.create_empty_copy(self.G, with_nodes=False) - assert_equal(G.nodes(),[]) - assert_equal(G.graph,{}) - assert_equal(G.node,{}) - assert_equal(G.edge,{}) - G=networkx.create_empty_copy(self.G) - assert_equal(G.nodes(),self.G.nodes()) - assert_equal(G.graph,{}) - assert_equal(G.node,{}.fromkeys(self.G.nodes(),{})) - assert_equal(G.edge,{}.fromkeys(self.G.nodes(),{})) - - def test_degree_histogram(self): - assert_equal(networkx.degree_histogram(self.G), [1,1,1,1,1]) - - def test_density(self): - assert_equal(networkx.density(self.G), 0.5) - assert_equal(networkx.density(self.DG), 0.3) - G=networkx.Graph() - G.add_node(1) - assert_equal(networkx.density(G), 0.0) - - def test_density_selfloop(self): - G = nx.Graph() - G.add_edge(1,1) - assert_equal(networkx.density(G), 0.0) - G.add_edge(1,2) - assert_equal(networkx.density(G), 2.0) - - def test_freeze(self): - G=networkx.freeze(self.G) - assert_equal(G.frozen,True) - assert_raises(networkx.NetworkXError, G.add_node, 1) - assert_raises(networkx.NetworkXError, G.add_nodes_from, [1]) - assert_raises(networkx.NetworkXError, G.remove_node, 1) - assert_raises(networkx.NetworkXError, G.remove_nodes_from, [1]) - assert_raises(networkx.NetworkXError, G.add_edge, 1,2) - assert_raises(networkx.NetworkXError, G.add_edges_from, [(1,2)]) - assert_raises(networkx.NetworkXError, G.remove_edge, 1,2) - assert_raises(networkx.NetworkXError, G.remove_edges_from, [(1,2)]) - assert_raises(networkx.NetworkXError, G.clear) - - def test_is_frozen(self): - assert_equal(networkx.is_frozen(self.G), False) - G=networkx.freeze(self.G) - assert_equal(G.frozen, networkx.is_frozen(self.G)) - assert_equal(G.frozen,True) - - def test_info(self): - G=networkx.path_graph(5) - info=networkx.info(G) - expected_graph_info='\n'.join(['Name: path_graph(5)', - 'Type: Graph', - 'Number of nodes: 5', - 'Number of edges: 4', - 'Average degree: 1.6000']) - assert_equal(info,expected_graph_info) - - info=networkx.info(G,n=1) - expected_node_info='\n'.join( - ['Node 1 has the following properties:', - 'Degree: 2', - 'Neighbors: 0 2']) - assert_equal(info,expected_node_info) - - def test_info_digraph(self): - G=networkx.DiGraph(name='path_graph(5)') - G.add_path([0,1,2,3,4]) - info=networkx.info(G) - expected_graph_info='\n'.join(['Name: path_graph(5)', - 'Type: DiGraph', - 'Number of nodes: 5', - 'Number of edges: 4', - 'Average in degree: 0.8000', - 'Average out degree: 0.8000']) - assert_equal(info,expected_graph_info) - - info=networkx.info(G,n=1) - expected_node_info='\n'.join( - ['Node 1 has the following properties:', - 'Degree: 2', - 'Neighbors: 2']) - assert_equal(info,expected_node_info) - - assert_raises(networkx.NetworkXError,networkx.info,G,n=-1) - - def test_neighbors(self): - graph = nx.complete_graph(100) - pop = random.sample(graph.nodes(), 1) - nbors = list(nx.neighbors(graph, pop[0])) - # should be all the other vertices in the graph - assert_equal(len(nbors), len(graph) - 1) - - graph = nx.path_graph(100) - node = random.sample(graph.nodes(), 1)[0] - nbors = list(nx.neighbors(graph, node)) - # should be all the other vertices in the graph - if node != 0 and node != 99: - assert_equal(len(nbors), 2) - else: - assert_equal(len(nbors), 1) - - # create a star graph with 99 outer nodes - graph = nx.star_graph(99) - nbors = list(nx.neighbors(graph, 0)) - assert_equal(len(nbors), 99) - - def test_non_neighbors(self): - graph = nx.complete_graph(100) - pop = random.sample(graph.nodes(), 1) - nbors = list(nx.non_neighbors(graph, pop[0])) - # should be all the other vertices in the graph - assert_equal(len(nbors), 0) - - graph = nx.path_graph(100) - node = random.sample(graph.nodes(), 1)[0] - nbors = list(nx.non_neighbors(graph, node)) - # should be all the other vertices in the graph - if node != 0 and node != 99: - assert_equal(len(nbors), 97) - else: - assert_equal(len(nbors), 98) - - # create a star graph with 99 outer nodes - graph = nx.star_graph(99) - nbors = list(nx.non_neighbors(graph, 0)) - assert_equal(len(nbors), 0) - - # disconnected graph - graph = nx.Graph() - graph.add_nodes_from(range(10)) - nbors = list(nx.non_neighbors(graph, 0)) - assert_equal(len(nbors), 9) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_graph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_graph.py deleted file mode 100644 index 077dead..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_graph.py +++ /dev/null @@ -1,602 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx - -class BaseGraphTester(object): - """ Tests for data-structure independent graph class features.""" - def test_contains(self): - G=self.K3 - assert(1 in G ) - assert(4 not in G ) - assert('b' not in G ) - assert([] not in G ) # no exception for nonhashable - assert({1:1} not in G) # no exception for nonhashable - - def test_order(self): - G=self.K3 - assert_equal(len(G),3) - assert_equal(G.order(),3) - assert_equal(G.number_of_nodes(),3) - - def test_nodes_iter(self): - G=self.K3 - assert_equal(sorted(G.nodes_iter()),self.k3nodes) - assert_equal(sorted(G.nodes_iter(data=True)),[(0,{}),(1,{}),(2,{})]) - - def test_nodes(self): - G=self.K3 - assert_equal(sorted(G.nodes()),self.k3nodes) - assert_equal(sorted(G.nodes(data=True)),[(0,{}),(1,{}),(2,{})]) - - def test_has_node(self): - G=self.K3 - assert(G.has_node(1)) - assert(not G.has_node(4)) - assert(not G.has_node([])) # no exception for nonhashable - assert(not G.has_node({1:1})) # no exception for nonhashable - - def test_has_edge(self): - G=self.K3 - assert_equal(G.has_edge(0,1),True) - assert_equal(G.has_edge(0,-1),False) - - def test_neighbors(self): - G=self.K3 - assert_equal(sorted(G.neighbors(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.neighbors,-1) - - def test_neighbors_iter(self): - G=self.K3 - assert_equal(sorted(G.neighbors_iter(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.neighbors_iter,-1) - - def test_edges(self): - G=self.K3 - assert_equal(sorted(G.edges()),[(0,1),(0,2),(1,2)]) - assert_equal(sorted(G.edges(0)),[(0,1),(0,2)]) - assert_raises((KeyError,networkx.NetworkXError), G.edges,-1) - - def test_edges_iter(self): - G=self.K3 - assert_equal(sorted(G.edges_iter()),[(0,1),(0,2),(1,2)]) - assert_equal(sorted(G.edges_iter(0)),[(0,1),(0,2)]) - f=lambda x:list(G.edges_iter(x)) - assert_raises((KeyError,networkx.NetworkXError), f, -1) - - def test_adjacency_list(self): - G=self.K3 - assert_equal(G.adjacency_list(),[[1,2],[0,2],[0,1]]) - - def test_degree(self): - G=self.K3 - assert_equal(list(G.degree().values()),[2,2,2]) - assert_equal(G.degree(),{0:2,1:2,2:2}) - assert_equal(G.degree(0),2) - assert_equal(G.degree([0]),{0:2}) - assert_raises((KeyError,networkx.NetworkXError), G.degree,-1) - - def test_weighted_degree(self): - G=self.Graph() - G.add_edge(1,2,weight=2) - G.add_edge(2,3,weight=3) - assert_equal(list(G.degree(weight='weight').values()),[2,5,3]) - assert_equal(G.degree(weight='weight'),{1:2,2:5,3:3}) - assert_equal(G.degree(1,weight='weight'),2) - assert_equal(G.degree([1],weight='weight'),{1:2}) - - def test_degree_iter(self): - G=self.K3 - assert_equal(list(G.degree_iter()),[(0,2),(1,2),(2,2)]) - assert_equal(dict(G.degree_iter()),{0:2,1:2,2:2}) - assert_equal(list(G.degree_iter(0)),[(0,2)]) - - def test_size(self): - G=self.K3 - assert_equal(G.size(),3) - assert_equal(G.number_of_edges(),3) - - def test_add_star(self): - G=self.K3.copy() - nlist=[12,13,14,15] - G.add_star(nlist) - assert_equal(sorted(G.edges(nlist)),[(12,13),(12,14),(12,15)]) - G=self.K3.copy() - G.add_star(nlist,weight=2.0) - assert_equal(sorted(G.edges(nlist,data=True)),\ - [(12,13,{'weight':2.}), - (12,14,{'weight':2.}), - (12,15,{'weight':2.})]) - - def test_add_path(self): - G=self.K3.copy() - nlist=[12,13,14,15] - G.add_path(nlist) - assert_equal(sorted(G.edges(nlist)),[(12,13),(13,14),(14,15)]) - G=self.K3.copy() - G.add_path(nlist,weight=2.0) - assert_equal(sorted(G.edges(nlist,data=True)),\ - [(12,13,{'weight':2.}), - (13,14,{'weight':2.}), - (14,15,{'weight':2.})]) - - def test_add_cycle(self): - G=self.K3.copy() - nlist=[12,13,14,15] - oklists=[ [(12,13),(12,15),(13,14),(14,15)], \ - [(12,13),(13,14),(14,15),(15,12)] ] - G.add_cycle(nlist) - assert_true(sorted(G.edges(nlist)) in oklists) - G=self.K3.copy() - oklists=[ [(12,13,{'weight':1.}),\ - (12,15,{'weight':1.}),\ - (13,14,{'weight':1.}),\ - (14,15,{'weight':1.})], \ - \ - [(12,13,{'weight':1.}),\ - (13,14,{'weight':1.}),\ - (14,15,{'weight':1.}),\ - (15,12,{'weight':1.})] \ - ] - - G.add_cycle(nlist,weight=1.0) - assert_true(sorted(G.edges(nlist,data=True)) in oklists) - - def test_nbunch_iter(self): - G=self.K3 - assert_equal(list(G.nbunch_iter()),self.k3nodes) # all nodes - assert_equal(list(G.nbunch_iter(0)),[0]) # single node - assert_equal(list(G.nbunch_iter([0,1])),[0,1]) # sequence - # sequence with none in graph - assert_equal(list(G.nbunch_iter([-1])),[]) - # string sequence with none in graph - assert_equal(list(G.nbunch_iter("foo")),[]) - # node not in graph doesn't get caught upon creation of iterator - bunch=G.nbunch_iter(-1) - # but gets caught when iterator used - assert_raises(networkx.NetworkXError,list,bunch) - # unhashable doesn't get caught upon creation of iterator - bunch=G.nbunch_iter([0,1,2,{}]) - # but gets caught when iterator hits the unhashable - assert_raises(networkx.NetworkXError,list,bunch) - - def test_selfloop_degree(self): - G=self.Graph() - G.add_edge(1,1) - assert_equal(list(G.degree().values()),[2]) - assert_equal(G.degree(),{1:2}) - assert_equal(G.degree(1),2) - assert_equal(G.degree([1]),{1:2}) - assert_equal(G.degree([1],weight='weight'),{1:2}) - - def test_selfloops(self): - G=self.K3.copy() - G.add_edge(0,0) - assert_equal(G.nodes_with_selfloops(),[0]) - assert_equal(G.selfloop_edges(),[(0,0)]) - assert_equal(G.number_of_selfloops(),1) - G.remove_edge(0,0) - G.add_edge(0,0) - G.remove_edges_from([(0,0)]) - G.add_edge(1,1) - G.remove_node(1) - G.add_edge(0,0) - G.add_edge(1,1) - G.remove_nodes_from([0,1]) - - -class BaseAttrGraphTester(BaseGraphTester): - """ Tests of graph class attribute features.""" - def test_weighted_degree(self): - G=self.Graph() - G.add_edge(1,2,weight=2,other=3) - G.add_edge(2,3,weight=3,other=4) - assert_equal(list(G.degree(weight='weight').values()),[2,5,3]) - assert_equal(G.degree(weight='weight'),{1:2,2:5,3:3}) - assert_equal(G.degree(1,weight='weight'),2) - assert_equal(G.degree([1],weight='weight'),{1:2}) - - assert_equal(list(G.degree(weight='other').values()),[3,7,4]) - assert_equal(G.degree(weight='other'),{1:3,2:7,3:4}) - assert_equal(G.degree(1,weight='other'),3) - assert_equal(G.degree([1],weight='other'),{1:3}) - - def add_attributes(self,G): - G.graph['foo']=[] - G.node[0]['foo']=[] - G.remove_edge(1,2) - ll=[] - G.add_edge(1,2,foo=ll) - G.add_edge(2,1,foo=ll) - # attr_dict must be dict - assert_raises(networkx.NetworkXError,G.add_edge,0,1,attr_dict=[]) - - def test_name(self): - G=self.Graph(name='') - assert_equal(G.name,"") - G=self.Graph(name='test') - assert_equal(G.__str__(),"test") - assert_equal(G.name,"test") - - def test_copy(self): - G=self.K3 - self.add_attributes(G) - H=G.copy() - self.is_deepcopy(H,G) - H=G.__class__(G) - self.is_shallow_copy(H,G) - - def test_copy_attr(self): - G=self.Graph(foo=[]) - G.add_node(0,foo=[]) - G.add_edge(1,2,foo=[]) - H=G.copy() - self.is_deepcopy(H,G) - H=G.__class__(G) # just copy - self.is_shallow_copy(H,G) - - def is_deepcopy(self,H,G): - self.graphs_equal(H,G) - self.different_attrdict(H,G) - self.deep_copy_attrdict(H,G) - - def deep_copy_attrdict(self,H,G): - self.deepcopy_graph_attr(H,G) - self.deepcopy_node_attr(H,G) - self.deepcopy_edge_attr(H,G) - - def deepcopy_graph_attr(self,H,G): - assert_equal(G.graph['foo'],H.graph['foo']) - G.graph['foo'].append(1) - assert_not_equal(G.graph['foo'],H.graph['foo']) - - def deepcopy_node_attr(self,H,G): - assert_equal(G.node[0]['foo'],H.node[0]['foo']) - G.node[0]['foo'].append(1) - assert_not_equal(G.node[0]['foo'],H.node[0]['foo']) - - def deepcopy_edge_attr(self,H,G): - assert_equal(G[1][2]['foo'],H[1][2]['foo']) - G[1][2]['foo'].append(1) - assert_not_equal(G[1][2]['foo'],H[1][2]['foo']) - - def is_shallow_copy(self,H,G): - self.graphs_equal(H,G) - self.different_attrdict(H,G) - self.shallow_copy_attrdict(H,G) - - def shallow_copy_attrdict(self,H,G): - self.shallow_copy_graph_attr(H,G) - self.shallow_copy_node_attr(H,G) - self.shallow_copy_edge_attr(H,G) - - def shallow_copy_graph_attr(self,H,G): - assert_equal(G.graph['foo'],H.graph['foo']) - G.graph['foo'].append(1) - assert_equal(G.graph['foo'],H.graph['foo']) - - def shallow_copy_node_attr(self,H,G): - assert_equal(G.node[0]['foo'],H.node[0]['foo']) - G.node[0]['foo'].append(1) - assert_equal(G.node[0]['foo'],H.node[0]['foo']) - - def shallow_copy_edge_attr(self,H,G): - assert_equal(G[1][2]['foo'],H[1][2]['foo']) - G[1][2]['foo'].append(1) - assert_equal(G[1][2]['foo'],H[1][2]['foo']) - - def same_attrdict(self, H, G): - old_foo=H[1][2]['foo'] - H.add_edge(1,2,foo='baz') - assert_equal(G.edge,H.edge) - H.add_edge(1,2,foo=old_foo) - assert_equal(G.edge,H.edge) - old_foo=H.node[0]['foo'] - H.node[0]['foo']='baz' - assert_equal(G.node,H.node) - H.node[0]['foo']=old_foo - assert_equal(G.node,H.node) - - def different_attrdict(self, H, G): - old_foo=H[1][2]['foo'] - H.add_edge(1,2,foo='baz') - assert_not_equal(G.edge,H.edge) - H.add_edge(1,2,foo=old_foo) - assert_equal(G.edge,H.edge) - old_foo=H.node[0]['foo'] - H.node[0]['foo']='baz' - assert_not_equal(G.node,H.node) - H.node[0]['foo']=old_foo - assert_equal(G.node,H.node) - - def graphs_equal(self,H,G): - assert_equal(G.adj,H.adj) - assert_equal(G.edge,H.edge) - assert_equal(G.node,H.node) - assert_equal(G.graph,H.graph) - assert_equal(G.name,H.name) - if not G.is_directed() and not H.is_directed(): - assert_true(H.adj[1][2] is H.adj[2][1]) - assert_true(G.adj[1][2] is G.adj[2][1]) - else: # at least one is directed - if not G.is_directed(): - G.pred=G.adj - G.succ=G.adj - if not H.is_directed(): - H.pred=H.adj - H.succ=H.adj - assert_equal(G.pred,H.pred) - assert_equal(G.succ,H.succ) - assert_true(H.succ[1][2] is H.pred[2][1]) - assert_true(G.succ[1][2] is G.pred[2][1]) - - def test_graph_attr(self): - G=self.K3 - G.graph['foo']='bar' - assert_equal(G.graph['foo'], 'bar') - del G.graph['foo'] - assert_equal(G.graph, {}) - H=self.Graph(foo='bar') - assert_equal(H.graph['foo'], 'bar') - - def test_node_attr(self): - G=self.K3 - G.add_node(1,foo='bar') - assert_equal(G.nodes(), [0,1,2]) - assert_equal(G.nodes(data=True), [(0,{}),(1,{'foo':'bar'}),(2,{})]) - G.node[1]['foo']='baz' - assert_equal(G.nodes(data=True), [(0,{}),(1,{'foo':'baz'}),(2,{})]) - - def test_node_attr2(self): - G=self.K3 - a={'foo':'bar'} - G.add_node(3,attr_dict=a) - assert_equal(G.nodes(), [0,1,2,3]) - assert_equal(G.nodes(data=True), - [(0,{}),(1,{}),(2,{}),(3,{'foo':'bar'})]) - - def test_edge_attr(self): - G=self.Graph() - G.add_edge(1,2,foo='bar') - assert_equal(G.edges(data=True), [(1,2,{'foo':'bar'})]) - - def test_edge_attr2(self): - G=self.Graph() - G.add_edges_from([(1,2),(3,4)],foo='foo') - assert_equal(sorted(G.edges(data=True)), - [(1,2,{'foo':'foo'}),(3,4,{'foo':'foo'})]) - - def test_edge_attr3(self): - G=self.Graph() - G.add_edges_from([(1,2,{'weight':32}),(3,4,{'weight':64})],foo='foo') - assert_equal(G.edges(data=True), - [(1,2,{'foo':'foo','weight':32}),\ - (3,4,{'foo':'foo','weight':64})]) - - G.remove_edges_from([(1,2),(3,4)]) - G.add_edge(1,2,data=7,spam='bar',bar='foo') - assert_equal(G.edges(data=True), - [(1,2,{'data':7,'spam':'bar','bar':'foo'})]) - - def test_edge_attr4(self): - G=self.Graph() - G.add_edge(1,2,data=7,spam='bar',bar='foo') - assert_equal(G.edges(data=True), - [(1,2,{'data':7,'spam':'bar','bar':'foo'})]) - G[1][2]['data']=10 # OK to set data like this - assert_equal(G.edges(data=True), - [(1,2,{'data':10,'spam':'bar','bar':'foo'})]) - - G.edge[1][2]['data']=20 # another spelling, "edge" - assert_equal(G.edges(data=True), - [(1,2,{'data':20,'spam':'bar','bar':'foo'})]) - G.edge[1][2]['listdata']=[20,200] - G.edge[1][2]['weight']=20 - assert_equal(G.edges(data=True), - [(1,2,{'data':20,'spam':'bar', - 'bar':'foo','listdata':[20,200],'weight':20})]) - - def test_attr_dict_not_dict(self): - # attr_dict must be dict - G=self.Graph() - edges=[(1,2)] - assert_raises(networkx.NetworkXError,G.add_edges_from,edges, - attr_dict=[]) - - def test_to_undirected(self): - G=self.K3 - self.add_attributes(G) - H=networkx.Graph(G) - self.is_shallow_copy(H,G) - H=G.to_undirected() - self.is_deepcopy(H,G) - - def test_to_directed(self): - G=self.K3 - self.add_attributes(G) - H=networkx.DiGraph(G) - self.is_shallow_copy(H,G) - H=G.to_directed() - self.is_deepcopy(H,G) - - def test_subgraph(self): - G=self.K3 - self.add_attributes(G) - H=G.subgraph([0,1,2,5]) -# assert_equal(H.name, 'Subgraph of ('+G.name+')') - H.name=G.name - self.graphs_equal(H,G) - self.same_attrdict(H,G) - self.shallow_copy_attrdict(H,G) - - H=G.subgraph(0) - assert_equal(H.adj,{0:{}}) - H=G.subgraph([]) - assert_equal(H.adj,{}) - assert_not_equal(G.adj,{}) - - def test_selfloops_attr(self): - G=self.K3.copy() - G.add_edge(0,0) - G.add_edge(1,1,weight=2) - assert_equal(G.selfloop_edges(data=True), - [(0,0,{}),(1,1,{'weight':2})]) - - -class TestGraph(BaseAttrGraphTester): - """Tests specific to dict-of-dict-of-dict graph data structure""" - def setUp(self): - self.Graph=networkx.Graph - # build dict-of-dict-of-dict K3 - ed1,ed2,ed3 = ({},{},{}) - self.k3adj={0: {1: ed1, 2: ed2}, - 1: {0: ed1, 2: ed3}, - 2: {0: ed2, 1: ed3}} - self.k3edges=[(0, 1), (0, 2), (1, 2)] - self.k3nodes=[0, 1, 2] - self.K3=self.Graph() - self.K3.adj=self.K3.edge=self.k3adj - self.K3.node={} - self.K3.node[0]={} - self.K3.node[1]={} - self.K3.node[2]={} - - def test_data_input(self): - G=self.Graph(data={1:[2],2:[1]}, name="test") - assert_equal(G.name,"test") - assert_equal(sorted(G.adj.items()),[(1, {2: {}}), (2, {1: {}})]) - G=self.Graph({1:[2],2:[1]}, name="test") - assert_equal(G.name,"test") - assert_equal(sorted(G.adj.items()),[(1, {2: {}}), (2, {1: {}})]) - - def test_adjacency_iter(self): - G=self.K3 - assert_equal(dict(G.adjacency_iter()), - {0: {1: {}, 2: {}}, 1: {0: {}, 2: {}}, 2: {0: {}, 1: {}}}) - - def test_getitem(self): - G=self.K3 - assert_equal(G[0],{1: {}, 2: {}}) - assert_raises(KeyError, G.__getitem__, 'j') - assert_raises((TypeError,networkx.NetworkXError), G.__getitem__, ['A']) - - def test_add_node(self): - G=self.Graph() - G.add_node(0) - assert_equal(G.adj,{0:{}}) - # test add attributes - G.add_node(1,c='red') - G.add_node(2,{'c':'blue'}) - G.add_node(3,{'c':'blue'},c='red') - assert_raises(networkx.NetworkXError, G.add_node, 4, []) - assert_raises(networkx.NetworkXError, G.add_node, 4, 4) - assert_equal(G.node[1]['c'],'red') - assert_equal(G.node[2]['c'],'blue') - assert_equal(G.node[3]['c'],'red') - # test updating attributes - G.add_node(1,c='blue') - G.add_node(2,{'c':'red'}) - G.add_node(3,{'c':'red'},c='blue') - assert_equal(G.node[1]['c'],'blue') - assert_equal(G.node[2]['c'],'red') - assert_equal(G.node[3]['c'],'blue') - - def test_add_nodes_from(self): - G=self.Graph() - G.add_nodes_from([0,1,2]) - assert_equal(G.adj,{0:{},1:{},2:{}}) - # test add attributes - G.add_nodes_from([0,1,2],c='red') - assert_equal(G.node[0]['c'],'red') - assert_equal(G.node[2]['c'],'red') - # test that attribute dicts are not the same - assert(G.node[0] is not G.node[1]) - # test updating attributes - G.add_nodes_from([0,1,2],c='blue') - assert_equal(G.node[0]['c'],'blue') - assert_equal(G.node[2]['c'],'blue') - assert(G.node[0] is not G.node[1]) - # test tuple input - H=self.Graph() - H.add_nodes_from(G.nodes(data=True)) - assert_equal(H.node[0]['c'],'blue') - assert_equal(H.node[2]['c'],'blue') - assert(H.node[0] is not H.node[1]) - # specific overrides general - H.add_nodes_from([0,(1,{'c':'green'}),(3,{'c':'cyan'})],c='red') - assert_equal(H.node[0]['c'],'red') - assert_equal(H.node[1]['c'],'green') - assert_equal(H.node[2]['c'],'blue') - assert_equal(H.node[3]['c'],'cyan') - - def test_remove_node(self): - G=self.K3 - G.remove_node(0) - assert_equal(G.adj,{1:{2:{}},2:{1:{}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_node,-1) - - # generator here to implement list,set,string... - def test_remove_nodes_from(self): - G=self.K3 - G.remove_nodes_from([0,1]) - assert_equal(G.adj,{2:{}}) - G.remove_nodes_from([-1]) # silent fail - - def test_add_edge(self): - G=self.Graph() - G.add_edge(0,1) - assert_equal(G.adj,{0: {1: {}}, 1: {0: {}}}) - G=self.Graph() - G.add_edge(*(0,1)) - assert_equal(G.adj,{0: {1: {}}, 1: {0: {}}}) - - def test_add_edges_from(self): - G=self.Graph() - G.add_edges_from([(0,1),(0,2,{'weight':3})]) - assert_equal(G.adj,{0: {1:{}, 2:{'weight':3}}, 1: {0:{}}, \ - 2:{0:{'weight':3}}}) - G=self.Graph() - G.add_edges_from([(0,1),(0,2,{'weight':3}),(1,2,{'data':4})],data=2) - assert_equal(G.adj,{\ - 0: {1:{'data':2}, 2:{'weight':3,'data':2}}, \ - 1: {0:{'data':2}, 2:{'data':4}}, \ - 2: {0:{'weight':3,'data':2}, 1:{'data':4}} \ - }) - - assert_raises(networkx.NetworkXError, - G.add_edges_from,[(0,)]) # too few in tuple - assert_raises(networkx.NetworkXError, - G.add_edges_from,[(0,1,2,3)]) # too many in tuple - assert_raises(TypeError, G.add_edges_from,[0]) # not a tuple - - - def test_remove_edge(self): - G=self.K3 - G.remove_edge(0,1) - assert_equal(G.adj,{0:{2:{}},1:{2:{}},2:{0:{},1:{}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) - - def test_remove_edges_from(self): - G=self.K3 - G.remove_edges_from([(0,1)]) - assert_equal(G.adj,{0:{2:{}},1:{2:{}},2:{0:{},1:{}}}) - G.remove_edges_from([(0,0)]) # silent fail - - def test_clear(self): - G=self.K3 - G.clear() - assert_equal(G.adj,{}) - - def test_edges_data(self): - G=self.K3 - assert_equal(sorted(G.edges(data=True)),[(0,1,{}),(0,2,{}),(1,2,{})]) - assert_equal(sorted(G.edges(0,data=True)),[(0,1,{}),(0,2,{})]) - assert_raises((KeyError,networkx.NetworkXError), G.edges,-1) - - - def test_get_edge_data(self): - G=self.K3 - assert_equal(G.get_edge_data(0,1),{}) - assert_equal(G[0][1],{}) - assert_equal(G.get_edge_data(10,20),None) - assert_equal(G.get_edge_data(-1,0),None) - assert_equal(G.get_edge_data(-1,0,default=1),1) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_graph_historical.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_graph_historical.py deleted file mode 100644 index 0ade19a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_graph_historical.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -"""Original NetworkX graph tests""" -from nose.tools import * -import networkx -import networkx as nx - -from historical_tests import HistoricalTests - -class TestGraphHistorical(HistoricalTests): - - def setUp(self): - HistoricalTests.setUp(self) - self.G=nx.Graph - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_multidigraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_multidigraph.py deleted file mode 100644 index e8c2543..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_multidigraph.py +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx -from test_multigraph import BaseMultiGraphTester, TestMultiGraph - -class BaseMultiDiGraphTester(BaseMultiGraphTester): - def test_edges(self): - G=self.K3 - assert_equal(sorted(G.edges()),[(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.edges(0)),[(0,1),(0,2)]) - assert_raises((KeyError,networkx.NetworkXError), G.edges,-1) - - def test_edges_data(self): - G=self.K3 - assert_equal(sorted(G.edges(data=True)), - [(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}),(2,0,{}),(2,1,{})]) - assert_equal(sorted(G.edges(0,data=True)),[(0,1,{}),(0,2,{})]) - assert_raises((KeyError,networkx.NetworkXError), G.neighbors,-1) - - - def test_edges_iter(self): - G=self.K3 - assert_equal(sorted(G.edges_iter()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.edges_iter(0)),[(0,1),(0,2)]) - G.add_edge(0,1) - assert_equal(sorted(G.edges_iter()), - [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - - def test_out_edges(self): - G=self.K3 - assert_equal(sorted(G.out_edges()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.out_edges(0)),[(0,1),(0,2)]) - assert_raises((KeyError,networkx.NetworkXError), G.out_edges,-1) - assert_equal(sorted(G.out_edges(0,keys=True)),[(0,1,0),(0,2,0)]) - - def test_out_edges_iter(self): - G=self.K3 - assert_equal(sorted(G.out_edges_iter()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.out_edges_iter(0)),[(0,1),(0,2)]) - G.add_edge(0,1,2) - assert_equal(sorted(G.out_edges_iter()), - [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - - def test_in_edges(self): - G=self.K3 - assert_equal(sorted(G.in_edges()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.in_edges(0)),[(1,0),(2,0)]) - assert_raises((KeyError,networkx.NetworkXError), G.in_edges,-1) - G.add_edge(0,1,2) - assert_equal(sorted(G.in_edges()), - [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.in_edges(0,keys=True)),[(1,0,0),(2,0,0)]) - - def test_in_edges_iter(self): - G=self.K3 - assert_equal(sorted(G.in_edges_iter()), - [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - assert_equal(sorted(G.in_edges_iter(0)),[(1,0),(2,0)]) - G.add_edge(0,1,2) - assert_equal(sorted(G.in_edges_iter()), - [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) - - assert_equal(sorted(G.in_edges_iter(data=True,keys=False)), - [(0,1,{}),(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}), - (2,0,{}),(2,1,{})]) - - - def is_shallow(self,H,G): - # graph - assert_equal(G.graph['foo'],H.graph['foo']) - G.graph['foo'].append(1) - assert_equal(G.graph['foo'],H.graph['foo']) - # node - assert_equal(G.node[0]['foo'],H.node[0]['foo']) - G.node[0]['foo'].append(1) - assert_equal(G.node[0]['foo'],H.node[0]['foo']) - # edge - assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - G[1][2][0]['foo'].append(1) - assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - - def is_deep(self,H,G): - # graph - assert_equal(G.graph['foo'],H.graph['foo']) - G.graph['foo'].append(1) - assert_not_equal(G.graph['foo'],H.graph['foo']) - # node - assert_equal(G.node[0]['foo'],H.node[0]['foo']) - G.node[0]['foo'].append(1) - assert_not_equal(G.node[0]['foo'],H.node[0]['foo']) - # edge - assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - G[1][2][0]['foo'].append(1) - assert_not_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - - def test_to_undirected(self): - # MultiDiGraph -> MultiGraph changes number of edges so it is - # not a copy operation... use is_shallow, not is_shallow_copy - G=self.K3 - self.add_attributes(G) - H=networkx.MultiGraph(G) - self.is_shallow(H,G) - H=G.to_undirected() - self.is_deep(H,G) - - def test_has_successor(self): - G=self.K3 - assert_equal(G.has_successor(0,1),True) - assert_equal(G.has_successor(0,-1),False) - - def test_successors(self): - G=self.K3 - assert_equal(sorted(G.successors(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.successors,-1) - - def test_successors_iter(self): - G=self.K3 - assert_equal(sorted(G.successors_iter(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.successors_iter,-1) - - def test_has_predecessor(self): - G=self.K3 - assert_equal(G.has_predecessor(0,1),True) - assert_equal(G.has_predecessor(0,-1),False) - - def test_predecessors(self): - G=self.K3 - assert_equal(sorted(G.predecessors(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.predecessors,-1) - - def test_predecessors_iter(self): - G=self.K3 - assert_equal(sorted(G.predecessors_iter(0)),[1,2]) - assert_raises((KeyError,networkx.NetworkXError), G.predecessors_iter,-1) - - - def test_degree(self): - G=self.K3 - assert_equal(list(G.degree().values()),[4,4,4]) - assert_equal(G.degree(),{0:4,1:4,2:4}) - assert_equal(G.degree(0),4) - assert_equal(G.degree([0]),{0:4}) - assert_raises((KeyError,networkx.NetworkXError), G.degree,-1) - - def test_degree_iter(self): - G=self.K3 - assert_equal(list(G.degree_iter()),[(0,4),(1,4),(2,4)]) - assert_equal(dict(G.degree_iter()),{0:4,1:4,2:4}) - assert_equal(list(G.degree_iter(0)),[(0,4)]) - G.add_edge(0,1,weight=0.3,other=1.2) - assert_equal(list(G.degree_iter(weight='weight')),[(0,4.3),(1,4.3),(2,4)]) - assert_equal(list(G.degree_iter(weight='other')),[(0,5.2),(1,5.2),(2,4)]) - - - def test_in_degree(self): - G=self.K3 - assert_equal(list(G.in_degree().values()),[2,2,2]) - assert_equal(G.in_degree(),{0:2,1:2,2:2}) - assert_equal(G.in_degree(0),2) - assert_equal(G.in_degree([0]),{0:2}) - assert_raises((KeyError,networkx.NetworkXError), G.in_degree,-1) - - def test_in_degree_iter(self): - G=self.K3 - assert_equal(list(G.in_degree_iter()),[(0,2),(1,2),(2,2)]) - assert_equal(dict(G.in_degree_iter()),{0:2,1:2,2:2}) - assert_equal(list(G.in_degree_iter(0)),[(0,2)]) - assert_equal(list(G.in_degree_iter(0,weight='weight')),[(0,2)]) - - def test_out_degree(self): - G=self.K3 - assert_equal(list(G.out_degree().values()),[2,2,2]) - assert_equal(G.out_degree(),{0:2,1:2,2:2}) - assert_equal(G.out_degree(0),2) - assert_equal(G.out_degree([0]),{0:2}) - assert_raises((KeyError,networkx.NetworkXError), G.out_degree,-1) - - def test_out_degree_iter(self): - G=self.K3 - assert_equal(list(G.out_degree_iter()),[(0,2),(1,2),(2,2)]) - assert_equal(dict(G.out_degree_iter()),{0:2,1:2,2:2}) - assert_equal(list(G.out_degree_iter(0)),[(0,2)]) - assert_equal(list(G.out_degree_iter(0,weight='weight')),[(0,2)]) - - - def test_size(self): - G=self.K3 - assert_equal(G.size(),6) - assert_equal(G.number_of_edges(),6) - G.add_edge(0,1,weight=0.3,other=1.2) - assert_equal(G.size(weight='weight'),6.3) - assert_equal(G.size(weight='other'),7.2) - - def test_to_undirected_reciprocal(self): - G=self.Graph() - G.add_edge(1,2) - assert_true(G.to_undirected().has_edge(1,2)) - assert_false(G.to_undirected(reciprocal=True).has_edge(1,2)) - G.add_edge(2,1) - assert_true(G.to_undirected(reciprocal=True).has_edge(1,2)) - - def test_reverse_copy(self): - G=networkx.MultiDiGraph([(0,1),(0,1)]) - R=G.reverse() - assert_equal(sorted(R.edges()),[(1,0),(1,0)]) - R.remove_edge(1,0) - assert_equal(sorted(R.edges()),[(1,0)]) - assert_equal(sorted(G.edges()),[(0,1),(0,1)]) - - def test_reverse_nocopy(self): - G=networkx.MultiDiGraph([(0,1),(0,1)]) - R=G.reverse(copy=False) - assert_equal(sorted(R.edges()),[(1,0),(1,0)]) - R.remove_edge(1,0) - assert_equal(sorted(R.edges()),[(1,0)]) - assert_equal(sorted(G.edges()),[(1,0)]) - - -class TestMultiDiGraph(BaseMultiDiGraphTester,TestMultiGraph): - def setUp(self): - self.Graph=networkx.MultiDiGraph - # build K3 - self.k3edges=[(0, 1), (0, 2), (1, 2)] - self.k3nodes=[0, 1, 2] - self.K3=self.Graph() - self.K3.adj={0:{},1:{},2:{}} - self.K3.succ=self.K3.adj - self.K3.pred={0:{},1:{},2:{}} - for u in self.k3nodes: - for v in self.k3nodes: - if u==v: continue - d={0:{}} - self.K3.succ[u][v]=d - self.K3.pred[v][u]=d - self.K3.adj=self.K3.succ - self.K3.edge=self.K3.adj - self.K3.node={} - self.K3.node[0]={} - self.K3.node[1]={} - self.K3.node[2]={} - - - def test_add_edge(self): - G=self.Graph() - G.add_edge(0,1) - assert_equal(G.adj,{0: {1: {0:{}}}, 1: {}}) - assert_equal(G.succ,{0: {1: {0:{}}}, 1: {}}) - assert_equal(G.pred,{0: {}, 1: {0:{0:{}}}}) - G=self.Graph() - G.add_edge(*(0,1)) - assert_equal(G.adj,{0: {1: {0:{}}}, 1: {}}) - assert_equal(G.succ,{0: {1: {0:{}}}, 1: {}}) - assert_equal(G.pred,{0: {}, 1: {0:{0:{}}}}) - - def test_add_edges_from(self): - G=self.Graph() - G.add_edges_from([(0,1),(0,1,{'weight':3})]) - assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3}}}, 1: {}}) - assert_equal(G.succ,{0: {1: {0:{},1:{'weight':3}}}, 1: {}}) - assert_equal(G.pred,{0: {}, 1: {0:{0:{},1:{'weight':3}}}}) - - G.add_edges_from([(0,1),(0,1,{'weight':3})],weight=2) - assert_equal(G.succ,{0: {1: {0:{}, - 1:{'weight':3}, - 2:{'weight':2}, - 3:{'weight':3}}}, - 1: {}}) - assert_equal(G.pred,{0: {}, 1: {0:{0:{},1:{'weight':3}, - 2:{'weight':2}, - 3:{'weight':3}}}}) - - assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,)]) # too few in tuple - assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,1,2,3,4)]) # too many in tuple - assert_raises(TypeError, G.add_edges_from,[0]) # not a tuple - - def test_remove_edge(self): - G=self.K3 - G.remove_edge(0,1) - assert_equal(G.succ,{0:{2:{0:{}}}, - 1:{0:{0:{}},2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}}, - 1:{2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,0,2, - key=1) - - - def test_remove_multiedge(self): - G=self.K3 - G.add_edge(0,1,key='parallel edge') - G.remove_edge(0,1,key='parallel edge') - assert_equal(G.adj,{0: {1: {0:{}}, 2: {0:{}}}, - 1: {0: {0:{}}, 2: {0:{}}}, - 2: {0: {0:{}}, 1: {0:{}}}}) - - assert_equal(G.succ,{0: {1: {0:{}}, 2: {0:{}}}, - 1: {0: {0:{}}, 2: {0:{}}}, - 2: {0: {0:{}}, 1: {0:{}}}}) - - assert_equal(G.pred,{0:{1: {0:{}},2:{0:{}}}, - 1:{0:{0:{}},2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - G.remove_edge(0,1) - assert_equal(G.succ,{0:{2:{0:{}}}, - 1:{0:{0:{}},2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}}, - 1:{2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) - - def test_remove_edges_from(self): - G=self.K3 - G.remove_edges_from([(0,1)]) - assert_equal(G.succ,{0:{2:{0:{}}}, - 1:{0:{0:{}},2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}}, - 1:{2:{0:{}}}, - 2:{0:{0:{}},1:{0:{}}}}) - G.remove_edges_from([(0,0)]) # silent fail diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_multigraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_multigraph.py deleted file mode 100644 index 6c9adbc..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/classes/tests/test_multigraph.py +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx -from test_graph import BaseAttrGraphTester, TestGraph - -class BaseMultiGraphTester(BaseAttrGraphTester): - def test_has_edge(self): - G=self.K3 - assert_equal(G.has_edge(0,1),True) - assert_equal(G.has_edge(0,-1),False) - assert_equal(G.has_edge(0,1,0),True) - assert_equal(G.has_edge(0,1,1),False) - - def test_get_edge_data(self): - G=self.K3 - assert_equal(G.get_edge_data(0,1),{0:{}}) - assert_equal(G[0][1],{0:{}}) - assert_equal(G[0][1][0],{}) - assert_equal(G.get_edge_data(10,20),None) - assert_equal(G.get_edge_data(0,1,0),{}) - - - def test_adjacency_iter(self): - G=self.K3 - assert_equal(dict(G.adjacency_iter()), - {0: {1: {0:{}}, 2: {0:{}}}, - 1: {0: {0:{}}, 2: {0:{}}}, - 2: {0: {0:{}}, 1: {0:{}}}}) - - def deepcopy_edge_attr(self,H,G): - assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - G[1][2][0]['foo'].append(1) - assert_not_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - - def shallow_copy_edge_attr(self,H,G): - assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - G[1][2][0]['foo'].append(1) - assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) - - def same_attrdict(self, H, G): - # same attrdict in the edgedata - old_foo=H[1][2][0]['foo'] - H.add_edge(1,2,0,foo='baz') - assert_equal(G.edge,H.edge) - H.add_edge(1,2,0,foo=old_foo) - assert_equal(G.edge,H.edge) - # but not same edgedata dict - H.add_edge(1,2,foo='baz') - assert_not_equal(G.edge,H.edge) - - old_foo=H.node[0]['foo'] - H.node[0]['foo']='baz' - assert_equal(G.node,H.node) - H.node[0]['foo']=old_foo - assert_equal(G.node,H.node) - - def different_attrdict(self, H, G): - # used by graph_equal_but_different - old_foo=H[1][2][0]['foo'] - H.add_edge(1,2,0,foo='baz') - assert_not_equal(G.edge,H.edge) - H.add_edge(1,2,0,foo=old_foo) - assert_equal(G.edge,H.edge) - HH=H.copy() - H.add_edge(1,2,foo='baz') - assert_not_equal(G.edge,H.edge) - H=HH - old_foo=H.node[0]['foo'] - H.node[0]['foo']='baz' - assert_not_equal(G.node,H.node) - H.node[0]['foo']=old_foo - assert_equal(G.node,H.node) - - def test_to_undirected(self): - G=self.K3 - self.add_attributes(G) - H=networkx.MultiGraph(G) - self.is_shallow_copy(H,G) - H=G.to_undirected() - self.is_deepcopy(H,G) - - def test_to_directed(self): - G=self.K3 - self.add_attributes(G) - H=networkx.MultiDiGraph(G) - self.is_shallow_copy(H,G) - H=G.to_directed() - self.is_deepcopy(H,G) - - def test_selfloops(self): - G=self.K3 - G.add_edge(0,0) - assert_equal(G.nodes_with_selfloops(),[0]) - assert_equal(G.selfloop_edges(),[(0,0)]) - assert_equal(G.selfloop_edges(data=True),[(0,0,{})]) - assert_equal(G.number_of_selfloops(),1) - - def test_selfloops2(self): - G=self.K3 - G.add_edge(0,0) - G.add_edge(0,0) - G.add_edge(0,0,key='parallel edge') - G.remove_edge(0,0,key='parallel edge') - assert_equal(G.number_of_edges(0,0),2) - G.remove_edge(0,0) - assert_equal(G.number_of_edges(0,0),1) - - def test_edge_attr4(self): - G=self.Graph() - G.add_edge(1,2,key=0,data=7,spam='bar',bar='foo') - assert_equal(G.edges(data=True), - [(1,2,{'data':7,'spam':'bar','bar':'foo'})]) - G[1][2][0]['data']=10 # OK to set data like this - assert_equal(G.edges(data=True), - [(1,2,{'data':10,'spam':'bar','bar':'foo'})]) - - G.edge[1][2][0]['data']=20 # another spelling, "edge" - assert_equal(G.edges(data=True), - [(1,2,{'data':20,'spam':'bar','bar':'foo'})]) - G.edge[1][2][0]['listdata']=[20,200] - G.edge[1][2][0]['weight']=20 - assert_equal(G.edges(data=True), - [(1,2,{'data':20,'spam':'bar', - 'bar':'foo','listdata':[20,200],'weight':20})]) - - -class TestMultiGraph(BaseMultiGraphTester,TestGraph): - def setUp(self): - self.Graph=networkx.MultiGraph - # build K3 - ed1,ed2,ed3 = ({0:{}},{0:{}},{0:{}}) - self.k3adj={0: {1: ed1, 2: ed2}, - 1: {0: ed1, 2: ed3}, - 2: {0: ed2, 1: ed3}} - self.k3edges=[(0, 1), (0, 2), (1, 2)] - self.k3nodes=[0, 1, 2] - self.K3=self.Graph() - self.K3.adj = self.K3.edge = self.k3adj - self.K3.node={} - self.K3.node[0]={} - self.K3.node[1]={} - self.K3.node[2]={} - - def test_data_input(self): - G=self.Graph(data={1:[2],2:[1]}, name="test") - assert_equal(G.name,"test") - assert_equal(sorted(G.adj.items()),[(1, {2: {0:{}}}), (2, {1: {0:{}}})]) - - def test_getitem(self): - G=self.K3 - assert_equal(G[0],{1: {0:{}}, 2: {0:{}}}) - assert_raises(KeyError, G.__getitem__, 'j') - assert_raises((TypeError,networkx.NetworkXError), G.__getitem__, ['A']) - - def test_remove_node(self): - G=self.K3 - G.remove_node(0) - assert_equal(G.adj,{1:{2:{0:{}}},2:{1:{0:{}}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_node,-1) - - def test_add_edge(self): - G=self.Graph() - G.add_edge(0,1) - assert_equal(G.adj,{0: {1: {0:{}}}, 1: {0: {0:{}}}}) - G=self.Graph() - G.add_edge(*(0,1)) - assert_equal(G.adj,{0: {1: {0:{}}}, 1: {0: {0:{}}}}) - - def test_add_edge_conflicting_key(self): - G=self.Graph() - G.add_edge(0,1,key=1) - G.add_edge(0,1) - assert_equal(G.number_of_edges(),2) - G=self.Graph() - G.add_edges_from([(0,1,1,{})]) - G.add_edges_from([(0,1)]) - assert_equal(G.number_of_edges(),2) - - - - def test_add_edges_from(self): - G=self.Graph() - G.add_edges_from([(0,1),(0,1,{'weight':3})]) - assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3}}}, - 1: {0: {0:{},1:{'weight':3}}}}) - G.add_edges_from([(0,1),(0,1,{'weight':3})],weight=2) - assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3}, - 2:{'weight':2},3:{'weight':3}}}, - 1: {0: {0:{},1:{'weight':3}, - 2:{'weight':2},3:{'weight':3}}}}) - - # too few in tuple - assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,)]) - # too many in tuple - assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,1,2,3,4)]) - assert_raises(TypeError, G.add_edges_from,[0]) # not a tuple - - - def test_remove_edge(self): - G=self.K3 - G.remove_edge(0,1) - assert_equal(G.adj,{0: {2: {0: {}}}, - 1: {2: {0: {}}}, - 2: {0: {0: {}}, - 1: {0: {}}}}) - - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,0,2, - key=1) - - - - def test_remove_edges_from(self): - G=self.K3.copy() - G.remove_edges_from([(0,1)]) - assert_equal(G.adj,{0:{2:{0:{}}},1:{2:{0:{}}},2:{0:{0:{}},1:{0:{}}}}) - G.remove_edges_from([(0,0)]) # silent fail - self.K3.add_edge(0,1) - G=self.K3.copy() - G.remove_edges_from(G.edges(data=True,keys=True)) - assert_equal(G.adj,{0:{},1:{},2:{}}) - G=self.K3.copy() - G.remove_edges_from(G.edges(data=False,keys=True)) - assert_equal(G.adj,{0:{},1:{},2:{}}) - G=self.K3.copy() - G.remove_edges_from(G.edges(data=False,keys=False)) - assert_equal(G.adj,{0:{},1:{},2:{}}) - G=self.K3.copy() - G.remove_edges_from([(0,1,0),(0,2,0,{}),(1,2)]) - assert_equal(G.adj,{0:{1:{1:{}}},1:{0:{1:{}}},2:{}}) - - - - def test_remove_multiedge(self): - G=self.K3 - G.add_edge(0,1,key='parallel edge') - G.remove_edge(0,1,key='parallel edge') - assert_equal(G.adj,{0: {1: {0:{}}, 2: {0:{}}}, - 1: {0: {0:{}}, 2: {0:{}}}, - 2: {0: {0:{}}, 1: {0:{}}}}) - G.remove_edge(0,1) - assert_equal(G.adj,{0:{2:{0:{}}},1:{2:{0:{}}},2:{0:{0:{}},1:{0:{}}}}) - assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/convert.py b/lib/python2.7/site-packages/setoolsgui/networkx/convert.py deleted file mode 100644 index 6333b9f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/convert.py +++ /dev/null @@ -1,847 +0,0 @@ -""" -This module provides functions to convert -NetworkX graphs to and from other formats. - -The preferred way of converting data to a NetworkX graph -is through the graph constuctor. The constructor calls -the to_networkx_graph() function which attempts to guess the -input type and convert it automatically. - -Examples --------- - -Create a 10 node random graph from a numpy matrix - ->>> import numpy ->>> a=numpy.reshape(numpy.random.random_integers(0,1,size=100),(10,10)) ->>> D=nx.DiGraph(a) - -or equivalently - ->>> D=nx.to_networkx_graph(a,create_using=nx.DiGraph()) - -Create a graph with a single edge from a dictionary of dictionaries - ->>> d={0: {1: 1}} # dict-of-dicts single edge (0,1) ->>> G=nx.Graph(d) - - -See Also --------- -nx_pygraphviz, nx_pydot - -""" -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) -# Copyright (C) 2006-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -import warnings -import networkx as nx - -__all__ = ['to_networkx_graph', - 'from_dict_of_dicts', 'to_dict_of_dicts', - 'from_dict_of_lists', 'to_dict_of_lists', - 'from_edgelist', 'to_edgelist', - 'from_numpy_matrix', 'to_numpy_matrix', - 'to_numpy_recarray', - 'from_scipy_sparse_matrix', 'to_scipy_sparse_matrix'] - -def _prep_create_using(create_using): - """Return a graph object ready to be populated. - - If create_using is None return the default (just networkx.Graph()) - If create_using.clear() works, assume it returns a graph object. - Otherwise raise an exception because create_using is not a networkx graph. - - """ - if create_using is None: - G=nx.Graph() - else: - G=create_using - try: - G.clear() - except: - raise TypeError("Input graph is not a networkx graph type") - return G - -def to_networkx_graph(data,create_using=None,multigraph_input=False): - """Make a NetworkX graph from a known data structure. - - The preferred way to call this is automatically - from the class constructor - - >>> d={0: {1: {'weight':1}}} # dict-of-dicts single edge (0,1) - >>> G=nx.Graph(d) - - instead of the equivalent - - >>> G=nx.from_dict_of_dicts(d) - - Parameters - ---------- - data : a object to be converted - Current known types are: - any NetworkX graph - dict-of-dicts - dist-of-lists - list of edges - numpy matrix - numpy ndarray - scipy sparse matrix - pygraphviz agraph - - create_using : NetworkX graph - Use specified graph for result. Otherwise a new graph is created. - - multigraph_input : bool (default False) - If True and data is a dict_of_dicts, - try to create a multigraph assuming dict_of_dict_of_lists. - If data and create_using are both multigraphs then create - a multigraph from a multigraph. - - """ - # NX graph - if hasattr(data,"adj"): - try: - result= from_dict_of_dicts(data.adj,\ - create_using=create_using,\ - multigraph_input=data.is_multigraph()) - if hasattr(data,'graph') and isinstance(data.graph,dict): - result.graph=data.graph.copy() - if hasattr(data,'node') and isinstance(data.node,dict): - result.node=dict( (n,dd.copy()) for n,dd in data.node.items() ) - return result - except: - raise nx.NetworkXError("Input is not a correct NetworkX graph.") - - # pygraphviz agraph - if hasattr(data,"is_strict"): - try: - return nx.from_agraph(data,create_using=create_using) - except: - raise nx.NetworkXError("Input is not a correct pygraphviz graph.") - - # dict of dicts/lists - if isinstance(data,dict): - try: - return from_dict_of_dicts(data,create_using=create_using,\ - multigraph_input=multigraph_input) - except: - try: - return from_dict_of_lists(data,create_using=create_using) - except: - raise TypeError("Input is not known type.") - - # list or generator of edges - if (isinstance(data,list) - or hasattr(data,'next') - or hasattr(data, '__next__')): - try: - return from_edgelist(data,create_using=create_using) - except: - raise nx.NetworkXError("Input is not a valid edge list") - - # numpy matrix or ndarray - try: - import numpy - if isinstance(data,numpy.matrix) or \ - isinstance(data,numpy.ndarray): - try: - return from_numpy_matrix(data,create_using=create_using) - except: - raise nx.NetworkXError(\ - "Input is not a correct numpy matrix or array.") - except ImportError: - warnings.warn('numpy not found, skipping conversion test.', - ImportWarning) - - # scipy sparse matrix - any format - try: - import scipy - if hasattr(data,"format"): - try: - return from_scipy_sparse_matrix(data,create_using=create_using) - except: - raise nx.NetworkXError(\ - "Input is not a correct scipy sparse matrix type.") - except ImportError: - warnings.warn('scipy not found, skipping conversion test.', - ImportWarning) - - - raise nx.NetworkXError(\ - "Input is not a known data type for conversion.") - - return - - -def convert_to_undirected(G): - """Return a new undirected representation of the graph G.""" - return G.to_undirected() - - -def convert_to_directed(G): - """Return a new directed representation of the graph G.""" - return G.to_directed() - - -def to_dict_of_lists(G,nodelist=None): - """Return adjacency representation of graph as a dictionary of lists. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list - Use only nodes specified in nodelist - - Notes - ----- - Completely ignores edge data for MultiGraph and MultiDiGraph. - - """ - if nodelist is None: - nodelist=G - - d = {} - for n in nodelist: - d[n]=[nbr for nbr in G.neighbors(n) if nbr in nodelist] - return d - -def from_dict_of_lists(d,create_using=None): - """Return a graph from a dictionary of lists. - - Parameters - ---------- - d : dictionary of lists - A dictionary of lists adjacency representation. - - create_using : NetworkX graph - Use specified graph for result. Otherwise a new graph is created. - - Examples - -------- - >>> dol= {0:[1]} # single edge (0,1) - >>> G=nx.from_dict_of_lists(dol) - - or - >>> G=nx.Graph(dol) # use Graph constructor - - """ - G=_prep_create_using(create_using) - G.add_nodes_from(d) - if G.is_multigraph() and not G.is_directed(): - # a dict_of_lists can't show multiedges. BUT for undirected graphs, - # each edge shows up twice in the dict_of_lists. - # So we need to treat this case separately. - seen={} - for node,nbrlist in d.items(): - for nbr in nbrlist: - if nbr not in seen: - G.add_edge(node,nbr) - seen[node]=1 # don't allow reverse edge to show up - else: - G.add_edges_from( ((node,nbr) for node,nbrlist in d.items() - for nbr in nbrlist) ) - return G - - -def to_dict_of_dicts(G,nodelist=None,edge_data=None): - """Return adjacency representation of graph as a dictionary of dictionaries. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list - Use only nodes specified in nodelist - - edge_data : list, optional - If provided, the value of the dictionary will be - set to edge_data for all edges. This is useful to make - an adjacency matrix type representation with 1 as the edge data. - If edgedata is None, the edgedata in G is used to fill the values. - If G is a multigraph, the edgedata is a dict for each pair (u,v). - """ - dod={} - if nodelist is None: - if edge_data is None: - for u,nbrdict in G.adjacency_iter(): - dod[u]=nbrdict.copy() - else: # edge_data is not None - for u,nbrdict in G.adjacency_iter(): - dod[u]=dod.fromkeys(nbrdict, edge_data) - else: # nodelist is not None - if edge_data is None: - for u in nodelist: - dod[u]={} - for v,data in ((v,data) for v,data in G[u].items() if v in nodelist): - dod[u][v]=data - else: # nodelist and edge_data are not None - for u in nodelist: - dod[u]={} - for v in ( v for v in G[u] if v in nodelist): - dod[u][v]=edge_data - return dod - -def from_dict_of_dicts(d,create_using=None,multigraph_input=False): - """Return a graph from a dictionary of dictionaries. - - Parameters - ---------- - d : dictionary of dictionaries - A dictionary of dictionaries adjacency representation. - - create_using : NetworkX graph - Use specified graph for result. Otherwise a new graph is created. - - multigraph_input : bool (default False) - When True, the values of the inner dict are assumed - to be containers of edge data for multiple edges. - Otherwise this routine assumes the edge data are singletons. - - Examples - -------- - >>> dod= {0: {1:{'weight':1}}} # single edge (0,1) - >>> G=nx.from_dict_of_dicts(dod) - - or - >>> G=nx.Graph(dod) # use Graph constructor - - """ - G=_prep_create_using(create_using) - G.add_nodes_from(d) - # is dict a MultiGraph or MultiDiGraph? - if multigraph_input: - # make a copy of the list of edge data (but not the edge data) - if G.is_directed(): - if G.is_multigraph(): - G.add_edges_from( (u,v,key,data) - for u,nbrs in d.items() - for v,datadict in nbrs.items() - for key,data in datadict.items() - ) - else: - G.add_edges_from( (u,v,data) - for u,nbrs in d.items() - for v,datadict in nbrs.items() - for key,data in datadict.items() - ) - else: # Undirected - if G.is_multigraph(): - seen=set() # don't add both directions of undirected graph - for u,nbrs in d.items(): - for v,datadict in nbrs.items(): - if (u,v) not in seen: - G.add_edges_from( (u,v,key,data) - for key,data in datadict.items() - ) - seen.add((v,u)) - else: - seen=set() # don't add both directions of undirected graph - for u,nbrs in d.items(): - for v,datadict in nbrs.items(): - if (u,v) not in seen: - G.add_edges_from( (u,v,data) - for key,data in datadict.items() ) - seen.add((v,u)) - - else: # not a multigraph to multigraph transfer - if G.is_multigraph() and not G.is_directed(): - # d can have both representations u-v, v-u in dict. Only add one. - # We don't need this check for digraphs since we add both directions, - # or for Graph() since it is done implicitly (parallel edges not allowed) - seen=set() - for u,nbrs in d.items(): - for v,data in nbrs.items(): - if (u,v) not in seen: - G.add_edge(u,v,attr_dict=data) - seen.add((v,u)) - else: - G.add_edges_from( ( (u,v,data) - for u,nbrs in d.items() - for v,data in nbrs.items()) ) - return G - -def to_edgelist(G,nodelist=None): - """Return a list of edges in the graph. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list - Use only nodes specified in nodelist - - """ - if nodelist is None: - return G.edges(data=True) - else: - return G.edges(nodelist,data=True) - -def from_edgelist(edgelist,create_using=None): - """Return a graph from a list of edges. - - Parameters - ---------- - edgelist : list or iterator - Edge tuples - - create_using : NetworkX graph - Use specified graph for result. Otherwise a new graph is created. - - Examples - -------- - >>> edgelist= [(0,1)] # single edge (0,1) - >>> G=nx.from_edgelist(edgelist) - - or - >>> G=nx.Graph(edgelist) # use Graph constructor - - """ - G=_prep_create_using(create_using) - G.add_edges_from(edgelist) - return G - -def to_numpy_matrix(G, nodelist=None, dtype=None, order=None, - multigraph_weight=sum, weight='weight'): - """Return the graph adjacency matrix as a NumPy matrix. - - Parameters - ---------- - G : graph - The NetworkX graph used to construct the NumPy matrix. - - nodelist : list, optional - The rows and columns are ordered according to the nodes in `nodelist`. - If `nodelist` is None, then the ordering is produced by G.nodes(). - - dtype : NumPy data type, optional - A valid single NumPy data type used to initialize the array. - This must be a simple type such as int or numpy.float64 and - not a compound data type (see to_numpy_recarray) - If None, then the NumPy default is used. - - order : {'C', 'F'}, optional - Whether to store multidimensional data in C- or Fortran-contiguous - (row- or column-wise) order in memory. If None, then the NumPy default - is used. - - multigraph_weight : {sum, min, max}, optional - An operator that determines how weights in multigraphs are handled. - The default is to sum the weights of the multiple edges. - - weight : string or None optional (default='weight') - The edge attribute that holds the numerical value used for - the edge weight. If None then all edge weights are 1. - - - Returns - ------- - M : NumPy matrix - Graph adjacency matrix. - - See Also - -------- - to_numpy_recarray, from_numpy_matrix - - Notes - ----- - The matrix entries are assigned with weight edge attribute. When - an edge does not have the weight attribute, the value of the entry is 1. - For multiple edges, the values of the entries are the sums of the edge - attributes for each edge. - - When `nodelist` does not contain every node in `G`, the matrix is built - from the subgraph of `G` that is induced by the nodes in `nodelist`. - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_edge(0,1,weight=2) - >>> G.add_edge(1,0) - >>> G.add_edge(2,2,weight=3) - >>> G.add_edge(2,2) - >>> nx.to_numpy_matrix(G, nodelist=[0,1,2]) - matrix([[ 0., 2., 0.], - [ 1., 0., 0.], - [ 0., 0., 4.]]) - """ - try: - import numpy as np - except ImportError: - raise ImportError(\ - "to_numpy_matrix() requires numpy: http://scipy.org/ ") - - if nodelist is None: - nodelist = G.nodes() - - nodeset = set(nodelist) - if len(nodelist) != len(nodeset): - msg = "Ambiguous ordering: `nodelist` contained duplicates." - raise nx.NetworkXError(msg) - - nlen=len(nodelist) - undirected = not G.is_directed() - index=dict(zip(nodelist,range(nlen))) - - if G.is_multigraph(): - # Handle MultiGraphs and MultiDiGraphs - # array of nan' to start with, any leftover nans will be converted to 0 - # nans are used so we can use sum, min, max for multigraphs - M = np.zeros((nlen,nlen), dtype=dtype, order=order)+np.nan - # use numpy nan-aware operations - operator={sum:np.nansum, min:np.nanmin, max:np.nanmax} - try: - op=operator[multigraph_weight] - except: - raise ValueError('multigraph_weight must be sum, min, or max') - - for u,v,attrs in G.edges_iter(data=True): - if (u in nodeset) and (v in nodeset): - i,j = index[u],index[v] - e_weight = attrs.get(weight, 1) - M[i,j] = op([e_weight,M[i,j]]) - if undirected: - M[j,i] = M[i,j] - # convert any nans to zeros - M = np.asmatrix(np.nan_to_num(M)) - else: - # Graph or DiGraph, this is much faster than above - M = np.zeros((nlen,nlen), dtype=dtype, order=order) - for u,nbrdict in G.adjacency_iter(): - for v,d in nbrdict.items(): - try: - M[index[u],index[v]]=d.get(weight,1) - except KeyError: - pass - M = np.asmatrix(M) - return M - - -def from_numpy_matrix(A,create_using=None): - """Return a graph from numpy matrix. - - The numpy matrix is interpreted as an adjacency matrix for the graph. - - Parameters - ---------- - A : numpy matrix - An adjacency matrix representation of a graph - - create_using : NetworkX graph - Use specified graph for result. The default is Graph() - - Notes - ----- - If the numpy matrix has a single data type for each matrix entry it - will be converted to an appropriate Python data type. - - If the numpy matrix has a user-specified compound data type the names - of the data fields will be used as attribute keys in the resulting - NetworkX graph. - - See Also - -------- - to_numpy_matrix, to_numpy_recarray - - Examples - -------- - Simple integer weights on edges: - - >>> import numpy - >>> A=numpy.matrix([[1,1],[2,1]]) - >>> G=nx.from_numpy_matrix(A) - - User defined compound data type on edges: - - >>> import numpy - >>> dt=[('weight',float),('cost',int)] - >>> A=numpy.matrix([[(1.0,2)]],dtype=dt) - >>> G=nx.from_numpy_matrix(A) - >>> G.edges(data=True) - [(0, 0, {'cost': 2, 'weight': 1.0})] - """ - kind_to_python_type={'f':float, - 'i':int, - 'u':int, - 'b':bool, - 'c':complex, - 'S':str, - 'V':'void'} - - try: # Python 3.x - blurb = chr(1245) # just to trigger the exception - kind_to_python_type['U']=str - except ValueError: # Python 2.6+ - kind_to_python_type['U']=unicode - - # This should never fail if you have created a numpy matrix with numpy... - try: - import numpy as np - except ImportError: - raise ImportError(\ - "from_numpy_matrix() requires numpy: http://scipy.org/ ") - - G=_prep_create_using(create_using) - n,m=A.shape - if n!=m: - raise nx.NetworkXError("Adjacency matrix is not square.", - "nx,ny=%s"%(A.shape,)) - dt=A.dtype - try: - python_type=kind_to_python_type[dt.kind] - except: - raise TypeError("Unknown numpy data type: %s"%dt) - - # make sure we get isolated nodes - G.add_nodes_from(range(n)) - # get a list of edges - x,y=np.asarray(A).nonzero() - - # handle numpy constructed data type - if python_type is 'void': - fields=sorted([(offset,dtype,name) for name,(dtype,offset) in - A.dtype.fields.items()]) - for (u,v) in zip(x,y): - attr={} - for (offset,dtype,name),val in zip(fields,A[u,v]): - attr[name]=kind_to_python_type[dtype.kind](val) - G.add_edge(u,v,attr) - else: # basic data type - G.add_edges_from( ((u,v,{'weight':python_type(A[u,v])}) - for (u,v) in zip(x,y)) ) - return G - - -def to_numpy_recarray(G,nodelist=None, - dtype=[('weight',float)], - order=None): - """Return the graph adjacency matrix as a NumPy recarray. - - Parameters - ---------- - G : graph - The NetworkX graph used to construct the NumPy matrix. - - nodelist : list, optional - The rows and columns are ordered according to the nodes in `nodelist`. - If `nodelist` is None, then the ordering is produced by G.nodes(). - - dtype : NumPy data-type, optional - A valid NumPy named dtype used to initialize the NumPy recarray. - The data type names are assumed to be keys in the graph edge attribute - dictionary. - - order : {'C', 'F'}, optional - Whether to store multidimensional data in C- or Fortran-contiguous - (row- or column-wise) order in memory. If None, then the NumPy default - is used. - - Returns - ------- - M : NumPy recarray - The graph with specified edge data as a Numpy recarray - - Notes - ----- - When `nodelist` does not contain every node in `G`, the matrix is built - from the subgraph of `G` that is induced by the nodes in `nodelist`. - - Examples - -------- - >>> G = nx.Graph() - >>> G.add_edge(1,2,weight=7.0,cost=5) - >>> A=nx.to_numpy_recarray(G,dtype=[('weight',float),('cost',int)]) - >>> print(A.weight) - [[ 0. 7.] - [ 7. 0.]] - >>> print(A.cost) - [[0 5] - [5 0]] - """ - try: - import numpy as np - except ImportError: - raise ImportError(\ - "to_numpy_matrix() requires numpy: http://scipy.org/ ") - - if G.is_multigraph(): - raise nx.NetworkXError("Not implemented for multigraphs.") - - if nodelist is None: - nodelist = G.nodes() - - nodeset = set(nodelist) - if len(nodelist) != len(nodeset): - msg = "Ambiguous ordering: `nodelist` contained duplicates." - raise nx.NetworkXError(msg) - - nlen=len(nodelist) - undirected = not G.is_directed() - index=dict(zip(nodelist,range(nlen))) - M = np.zeros((nlen,nlen), dtype=dtype, order=order) - - names=M.dtype.names - for u,v,attrs in G.edges_iter(data=True): - if (u in nodeset) and (v in nodeset): - i,j = index[u],index[v] - values=tuple([attrs[n] for n in names]) - M[i,j] = values - if undirected: - M[j,i] = M[i,j] - - return M.view(np.recarray) - - -def to_scipy_sparse_matrix(G, nodelist=None, dtype=None, - weight='weight', format='csr'): - """Return the graph adjacency matrix as a SciPy sparse matrix. - - Parameters - ---------- - G : graph - The NetworkX graph used to construct the NumPy matrix. - - nodelist : list, optional - The rows and columns are ordered according to the nodes in `nodelist`. - If `nodelist` is None, then the ordering is produced by G.nodes(). - - dtype : NumPy data-type, optional - A valid NumPy dtype used to initialize the array. If None, then the - NumPy default is used. - - weight : string or None optional (default='weight') - The edge attribute that holds the numerical value used for - the edge weight. If None then all edge weights are 1. - - format : str in {'bsr', 'csr', 'csc', 'coo', 'lil', 'dia', 'dok'} - The type of the matrix to be returned (default 'csr'). For - some algorithms different implementations of sparse matrices - can perform better. See [1]_ for details. - - Returns - ------- - M : SciPy sparse matrix - Graph adjacency matrix. - - Notes - ----- - The matrix entries are populated using the edge attribute held in - parameter weight. When an edge does not have that attribute, the - value of the entry is 1. - - For multiple edges the matrix values are the sums of the edge weights. - - When `nodelist` does not contain every node in `G`, the matrix is built - from the subgraph of `G` that is induced by the nodes in `nodelist`. - - Uses coo_matrix format. To convert to other formats specify the - format= keyword. - - Examples - -------- - >>> G = nx.MultiDiGraph() - >>> G.add_edge(0,1,weight=2) - >>> G.add_edge(1,0) - >>> G.add_edge(2,2,weight=3) - >>> G.add_edge(2,2) - >>> S = nx.to_scipy_sparse_matrix(G, nodelist=[0,1,2]) - >>> print(S.todense()) - [[0 2 0] - [1 0 0] - [0 0 4]] - - References - ---------- - .. [1] Scipy Dev. References, "Sparse Matrices", - http://docs.scipy.org/doc/scipy/reference/sparse.html - """ - try: - from scipy import sparse - except ImportError: - raise ImportError(\ - "to_scipy_sparse_matrix() requires scipy: http://scipy.org/ ") - - if nodelist is None: - nodelist = G - nlen = len(nodelist) - if nlen == 0: - raise nx.NetworkXError("Graph has no nodes or edges") - - if len(nodelist) != len(set(nodelist)): - msg = "Ambiguous ordering: `nodelist` contained duplicates." - raise nx.NetworkXError(msg) - - index = dict(zip(nodelist,range(nlen))) - if G.number_of_edges() == 0: - row,col,data=[],[],[] - else: - row,col,data=zip(*((index[u],index[v],d.get(weight,1)) - for u,v,d in G.edges_iter(nodelist, data=True) - if u in index and v in index)) - if G.is_directed(): - M = sparse.coo_matrix((data,(row,col)),shape=(nlen,nlen), dtype=dtype) - else: - # symmetrize matrix - M = sparse.coo_matrix((data+data,(row+col,col+row)),shape=(nlen,nlen), - dtype=dtype) - try: - return M.asformat(format) - except AttributeError: - raise nx.NetworkXError("Unknown sparse matrix format: %s"%format) - -def from_scipy_sparse_matrix(A,create_using=None): - """Return a graph from scipy sparse matrix adjacency list. - - Parameters - ---------- - A : scipy sparse matrix - An adjacency matrix representation of a graph - - create_using : NetworkX graph - Use specified graph for result. The default is Graph() - - Examples - -------- - >>> import scipy.sparse - >>> A=scipy.sparse.eye(2,2,1) - >>> G=nx.from_scipy_sparse_matrix(A) - - """ - G=_prep_create_using(create_using) - - # convert all formats to lil - not the most efficient way - AA=A.tolil() - n,m=AA.shape - - if n!=m: - raise nx.NetworkXError(\ - "Adjacency matrix is not square. nx,ny=%s"%(A.shape,)) - G.add_nodes_from(range(n)) # make sure we get isolated nodes - - for i,row in enumerate(AA.rows): - for pos,j in enumerate(row): - G.add_edge(i,j,**{'weight':AA.data[i][pos]}) - return G - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/__init__.py deleted file mode 100644 index 211457e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# graph drawing and interface to graphviz -import sys -from networkx.drawing.layout import * -from networkx.drawing.nx_pylab import * - -# graphviz interface -# prefer pygraphviz/agraph (it's faster) -from networkx.drawing.nx_agraph import * -try: - import pydot - import networkx.drawing.nx_pydot - from networkx.drawing.nx_pydot import * -except ImportError: - pass -try: - import pygraphviz - from networkx.drawing.nx_agraph import * -except ImportError: - pass - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/layout.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/layout.py deleted file mode 100644 index 671d3b6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/layout.py +++ /dev/null @@ -1,540 +0,0 @@ -""" -****** -Layout -****** - -Node positioning algorithms for graph drawing. -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nDan Schult(dschult@colgate.edu)""" -__all__ = ['circular_layout', - 'random_layout', - 'shell_layout', - 'spring_layout', - 'spectral_layout', - 'fruchterman_reingold_layout'] - -def random_layout(G,dim=2): - """Position nodes uniformly at random in the unit square. - - For every node, a position is generated by choosing each of dim - coordinates uniformly at random on the interval [0.0, 1.0). - - NumPy (http://scipy.org) is required for this function. - - Parameters - ---------- - G : NetworkX graph - A position will be assigned to every node in G. - - dim : int - Dimension of layout. - - Returns - ------- - dict : - A dictionary of positions keyed by node - - Examples - -------- - >>> G = nx.lollipop_graph(4, 3) - >>> pos = nx.random_layout(G) - - """ - try: - import numpy as np - except ImportError: - raise ImportError("random_layout() requires numpy: http://scipy.org/ ") - n=len(G) - pos=np.asarray(np.random.random((n,dim)),dtype=np.float32) - return dict(zip(G,pos)) - - -def circular_layout(G, dim=2, scale=1): - # dim=2 only - """Position nodes on a circle. - - Parameters - ---------- - G : NetworkX graph - - dim : int - Dimension of layout, currently only dim=2 is supported - - scale : float - Scale factor for positions - - Returns - ------- - dict : - A dictionary of positions keyed by node - - Examples - -------- - >>> G=nx.path_graph(4) - >>> pos=nx.circular_layout(G) - - Notes - ------ - This algorithm currently only works in two dimensions and does not - try to minimize edge crossings. - - """ - try: - import numpy as np - except ImportError: - raise ImportError("circular_layout() requires numpy: http://scipy.org/ ") - if len(G)==0: - return {} - if len(G)==1: - return {G.nodes()[0]:(1,)*dim} - t=np.arange(0,2.0*np.pi,2.0*np.pi/len(G),dtype=np.float32) - pos=np.transpose(np.array([np.cos(t),np.sin(t)])) - pos=_rescale_layout(pos,scale=scale) - return dict(zip(G,pos)) - -def shell_layout(G,nlist=None,dim=2,scale=1): - """Position nodes in concentric circles. - - Parameters - ---------- - G : NetworkX graph - - nlist : list of lists - List of node lists for each shell. - - dim : int - Dimension of layout, currently only dim=2 is supported - - scale : float - Scale factor for positions - - Returns - ------- - dict : - A dictionary of positions keyed by node - - Examples - -------- - >>> G=nx.path_graph(4) - >>> shells=[[0],[1,2,3]] - >>> pos=nx.shell_layout(G,shells) - - Notes - ------ - This algorithm currently only works in two dimensions and does not - try to minimize edge crossings. - - """ - try: - import numpy as np - except ImportError: - raise ImportError("shell_layout() requires numpy: http://scipy.org/ ") - if len(G)==0: - return {} - if len(G)==1: - return {G.nodes()[0]:(1,)*dim} - if nlist==None: - nlist=[G.nodes()] # draw the whole graph in one shell - - if len(nlist[0])==1: - radius=0.0 # single node at center - else: - radius=1.0 # else start at r=1 - - npos={} - for nodes in nlist: - t=np.arange(0,2.0*np.pi,2.0*np.pi/len(nodes),dtype=np.float32) - pos=np.transpose(np.array([radius*np.cos(t),radius*np.sin(t)])) - npos.update(zip(nodes,pos)) - radius+=1.0 - - # FIXME: rescale - return npos - - -def fruchterman_reingold_layout(G,dim=2,k=None, - pos=None, - fixed=None, - iterations=50, - weight='weight', - scale=1.0): - """Position nodes using Fruchterman-Reingold force-directed algorithm. - - Parameters - ---------- - G : NetworkX graph - - dim : int - Dimension of layout - - k : float (default=None) - Optimal distance between nodes. If None the distance is set to - 1/sqrt(n) where n is the number of nodes. Increase this value - to move nodes farther apart. - - - pos : dict or None optional (default=None) - Initial positions for nodes as a dictionary with node as keys - and values as a list or tuple. If None, then nuse random initial - positions. - - fixed : list or None optional (default=None) - Nodes to keep fixed at initial position. - - iterations : int optional (default=50) - Number of iterations of spring-force relaxation - - weight : string or None optional (default='weight') - The edge attribute that holds the numerical value used for - the edge weight. If None, then all edge weights are 1. - - scale : float (default=1.0) - Scale factor for positions. The nodes are positioned - in a box of size [0,scale] x [0,scale]. - - - Returns - ------- - dict : - A dictionary of positions keyed by node - - Examples - -------- - >>> G=nx.path_graph(4) - >>> pos=nx.spring_layout(G) - - # The same using longer function name - >>> pos=nx.fruchterman_reingold_layout(G) - """ - try: - import numpy as np - except ImportError: - raise ImportError("fruchterman_reingold_layout() requires numpy: http://scipy.org/ ") - if fixed is not None: - nfixed=dict(zip(G,range(len(G)))) - fixed=np.asarray([nfixed[v] for v in fixed]) - - if pos is not None: - pos_arr=np.asarray(np.random.random((len(G),dim))) - for i,n in enumerate(G): - if n in pos: - pos_arr[i]=np.asarray(pos[n]) - else: - pos_arr=None - - if len(G)==0: - return {} - if len(G)==1: - return {G.nodes()[0]:(1,)*dim} - - try: - # Sparse matrix - if len(G) < 500: # sparse solver for large graphs - raise ValueError - A=nx.to_scipy_sparse_matrix(G,weight=weight,dtype='f') - pos=_sparse_fruchterman_reingold(A,dim,k,pos_arr,fixed,iterations) - except: - A=nx.to_numpy_matrix(G,weight=weight) - pos=_fruchterman_reingold(A,dim,k,pos_arr,fixed,iterations) - if fixed is None: - pos=_rescale_layout(pos,scale=scale) - return dict(zip(G,pos)) - -spring_layout=fruchterman_reingold_layout - -def _fruchterman_reingold(A, dim=2, k=None, pos=None, fixed=None, - iterations=50): - # Position nodes in adjacency matrix A using Fruchterman-Reingold - # Entry point for NetworkX graph is fruchterman_reingold_layout() - try: - import numpy as np - except ImportError: - raise ImportError("_fruchterman_reingold() requires numpy: http://scipy.org/ ") - - try: - nnodes,_=A.shape - except AttributeError: - raise nx.NetworkXError( - "fruchterman_reingold() takes an adjacency matrix as input") - - A=np.asarray(A) # make sure we have an array instead of a matrix - - if pos==None: - # random initial positions - pos=np.asarray(np.random.random((nnodes,dim)),dtype=A.dtype) - else: - # make sure positions are of same type as matrix - pos=pos.astype(A.dtype) - - # optimal distance between nodes - if k is None: - k=np.sqrt(1.0/nnodes) - # the initial "temperature" is about .1 of domain area (=1x1) - # this is the largest step allowed in the dynamics. - t=0.1 - # simple cooling scheme. - # linearly step down by dt on each iteration so last iteration is size dt. - dt=t/float(iterations+1) - delta = np.zeros((pos.shape[0],pos.shape[0],pos.shape[1]),dtype=A.dtype) - # the inscrutable (but fast) version - # this is still O(V^2) - # could use multilevel methods to speed this up significantly - for iteration in range(iterations): - # matrix of difference between points - for i in range(pos.shape[1]): - delta[:,:,i]= pos[:,i,None]-pos[:,i] - # distance between points - distance=np.sqrt((delta**2).sum(axis=-1)) - # enforce minimum distance of 0.01 - distance=np.where(distance<0.01,0.01,distance) - # displacement "force" - displacement=np.transpose(np.transpose(delta)*\ - (k*k/distance**2-A*distance/k))\ - .sum(axis=1) - # update positions - length=np.sqrt((displacement**2).sum(axis=1)) - length=np.where(length<0.01,0.1,length) - delta_pos=np.transpose(np.transpose(displacement)*t/length) - if fixed is not None: - # don't change positions of fixed nodes - delta_pos[fixed]=0.0 - pos+=delta_pos - # cool temperature - t-=dt - pos=_rescale_layout(pos) - return pos - - -def _sparse_fruchterman_reingold(A, dim=2, k=None, pos=None, fixed=None, - iterations=50): - # Position nodes in adjacency matrix A using Fruchterman-Reingold - # Entry point for NetworkX graph is fruchterman_reingold_layout() - # Sparse version - try: - import numpy as np - except ImportError: - raise ImportError("_sparse_fruchterman_reingold() requires numpy: http://scipy.org/ ") - try: - nnodes,_=A.shape - except AttributeError: - raise nx.NetworkXError( - "fruchterman_reingold() takes an adjacency matrix as input") - try: - from scipy.sparse import spdiags,coo_matrix - except ImportError: - raise ImportError("_sparse_fruchterman_reingold() scipy numpy: http://scipy.org/ ") - # make sure we have a LIst of Lists representation - try: - A=A.tolil() - except: - A=(coo_matrix(A)).tolil() - - if pos==None: - # random initial positions - pos=np.asarray(np.random.random((nnodes,dim)),dtype=A.dtype) - else: - # make sure positions are of same type as matrix - pos=pos.astype(A.dtype) - - # no fixed nodes - if fixed==None: - fixed=[] - - # optimal distance between nodes - if k is None: - k=np.sqrt(1.0/nnodes) - # the initial "temperature" is about .1 of domain area (=1x1) - # this is the largest step allowed in the dynamics. - t=0.1 - # simple cooling scheme. - # linearly step down by dt on each iteration so last iteration is size dt. - dt=t/float(iterations+1) - - displacement=np.zeros((dim,nnodes)) - for iteration in range(iterations): - displacement*=0 - # loop over rows - for i in range(A.shape[0]): - if i in fixed: - continue - # difference between this row's node position and all others - delta=(pos[i]-pos).T - # distance between points - distance=np.sqrt((delta**2).sum(axis=0)) - # enforce minimum distance of 0.01 - distance=np.where(distance<0.01,0.01,distance) - # the adjacency matrix row - Ai=np.asarray(A.getrowview(i).toarray()) - # displacement "force" - displacement[:,i]+=\ - (delta*(k*k/distance**2-Ai*distance/k)).sum(axis=1) - # update positions - length=np.sqrt((displacement**2).sum(axis=0)) - length=np.where(length<0.01,0.1,length) - pos+=(displacement*t/length).T - # cool temperature - t-=dt - pos=_rescale_layout(pos) - return pos - - -def spectral_layout(G, dim=2, weight='weight', scale=1): - """Position nodes using the eigenvectors of the graph Laplacian. - - Parameters - ---------- - G : NetworkX graph - - dim : int - Dimension of layout - - weight : string or None optional (default='weight') - The edge attribute that holds the numerical value used for - the edge weight. If None, then all edge weights are 1. - - scale : float - Scale factor for positions - - Returns - ------- - dict : - A dictionary of positions keyed by node - - Examples - -------- - >>> G=nx.path_graph(4) - >>> pos=nx.spectral_layout(G) - - Notes - ----- - Directed graphs will be considered as unidrected graphs when - positioning the nodes. - - For larger graphs (>500 nodes) this will use the SciPy sparse - eigenvalue solver (ARPACK). - """ - # handle some special cases that break the eigensolvers - try: - import numpy as np - except ImportError: - raise ImportError("spectral_layout() requires numpy: http://scipy.org/ ") - if len(G)<=2: - if len(G)==0: - pos=np.array([]) - elif len(G)==1: - pos=np.array([[1,1]]) - else: - pos=np.array([[0,0.5],[1,0.5]]) - return dict(zip(G,pos)) - try: - # Sparse matrix - if len(G)< 500: # dense solver is faster for small graphs - raise ValueError - A=nx.to_scipy_sparse_matrix(G, weight=weight,dtype='f') - # Symmetrize directed graphs - if G.is_directed(): - A=A+np.transpose(A) - pos=_sparse_spectral(A,dim) - except (ImportError,ValueError): - # Dense matrix - A=nx.to_numpy_matrix(G, weight=weight) - # Symmetrize directed graphs - if G.is_directed(): - A=A+np.transpose(A) - pos=_spectral(A,dim) - - pos=_rescale_layout(pos,scale) - return dict(zip(G,pos)) - - -def _spectral(A, dim=2): - # Input adjacency matrix A - # Uses dense eigenvalue solver from numpy - try: - import numpy as np - except ImportError: - raise ImportError("spectral_layout() requires numpy: http://scipy.org/ ") - try: - nnodes,_=A.shape - except AttributeError: - raise nx.NetworkXError(\ - "spectral() takes an adjacency matrix as input") - - # form Laplacian matrix - # make sure we have an array instead of a matrix - A=np.asarray(A) - I=np.identity(nnodes,dtype=A.dtype) - D=I*np.sum(A,axis=1) # diagonal of degrees - L=D-A - - eigenvalues,eigenvectors=np.linalg.eig(L) - # sort and keep smallest nonzero - index=np.argsort(eigenvalues)[1:dim+1] # 0 index is zero eigenvalue - return np.real(eigenvectors[:,index]) - -def _sparse_spectral(A,dim=2): - # Input adjacency matrix A - # Uses sparse eigenvalue solver from scipy - # Could use multilevel methods here, see Koren "On spectral graph drawing" - try: - import numpy as np - from scipy.sparse import spdiags - except ImportError: - raise ImportError("_sparse_spectral() requires scipy & numpy: http://scipy.org/ ") - try: - from scipy.sparse.linalg.eigen import eigsh - except ImportError: - # scipy <0.9.0 names eigsh differently - from scipy.sparse.linalg import eigen_symmetric as eigsh - try: - nnodes,_=A.shape - except AttributeError: - raise nx.NetworkXError(\ - "sparse_spectral() takes an adjacency matrix as input") - - # form Laplacian matrix - data=np.asarray(A.sum(axis=1).T) - D=spdiags(data,0,nnodes,nnodes) - L=D-A - - k=dim+1 - # number of Lanczos vectors for ARPACK solver.What is the right scaling? - ncv=max(2*k+1,int(np.sqrt(nnodes))) - # return smallest k eigenvalues and eigenvectors - eigenvalues,eigenvectors=eigsh(L,k,which='SM',ncv=ncv) - index=np.argsort(eigenvalues)[1:k] # 0 index is zero eigenvalue - return np.real(eigenvectors[:,index]) - - -def _rescale_layout(pos,scale=1): - # rescale to (0,pscale) in all axes - - # shift origin to (0,0) - lim=0 # max coordinate for all axes - for i in range(pos.shape[1]): - pos[:,i]-=pos[:,i].min() - lim=max(pos[:,i].max(),lim) - # rescale to (0,scale) in all directions, preserves aspect - for i in range(pos.shape[1]): - pos[:,i]*=scale/lim - return pos - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_agraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_agraph.py deleted file mode 100644 index ff61253..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_agraph.py +++ /dev/null @@ -1,447 +0,0 @@ -""" -*************** -Graphviz AGraph -*************** - -Interface to pygraphviz AGraph class. - -Examples --------- ->>> G=nx.complete_graph(5) ->>> A=nx.to_agraph(G) ->>> H=nx.from_agraph(A) - -See Also --------- -Pygraphviz: http://networkx.lanl.gov/pygraphviz -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import os -import sys -import tempfile -import networkx as nx -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -__all__ = ['from_agraph', 'to_agraph', - 'write_dot', 'read_dot', - 'graphviz_layout', - 'pygraphviz_layout', - 'view_pygraphviz'] - -def from_agraph(A,create_using=None): - """Return a NetworkX Graph or DiGraph from a PyGraphviz graph. - - Parameters - ---------- - A : PyGraphviz AGraph - A graph created with PyGraphviz - - create_using : NetworkX graph class instance - The output is created using the given graph class instance - - Examples - -------- - >>> K5=nx.complete_graph(5) - >>> A=nx.to_agraph(K5) - >>> G=nx.from_agraph(A) - >>> G=nx.from_agraph(A) - - - Notes - ----- - The Graph G will have a dictionary G.graph_attr containing - the default graphviz attributes for graphs, nodes and edges. - - Default node attributes will be in the dictionary G.node_attr - which is keyed by node. - - Edge attributes will be returned as edge data in G. With - edge_attr=False the edge data will be the Graphviz edge weight - attribute or the value 1 if no edge weight attribute is found. - - """ - if create_using is None: - if A.is_directed(): - if A.is_strict(): - create_using=nx.DiGraph() - else: - create_using=nx.MultiDiGraph() - else: - if A.is_strict(): - create_using=nx.Graph() - else: - create_using=nx.MultiGraph() - - # assign defaults - N=nx.empty_graph(0,create_using) - N.name='' - if A.name is not None: - N.name=A.name - - # add nodes, attributes to N.node_attr - for n in A.nodes(): - str_attr=dict((str(k),v) for k,v in n.attr.items()) - N.add_node(str(n),**str_attr) - - # add edges, assign edge data as dictionary of attributes - for e in A.edges(): - u,v=str(e[0]),str(e[1]) - attr=dict(e.attr) - str_attr=dict((str(k),v) for k,v in attr.items()) - if not N.is_multigraph(): - if e.name is not None: - str_attr['key']=e.name - N.add_edge(u,v,**str_attr) - else: - N.add_edge(u,v,key=e.name,**str_attr) - - # add default attributes for graph, nodes, and edges - # hang them on N.graph_attr - N.graph['graph']=dict(A.graph_attr) - N.graph['node']=dict(A.node_attr) - N.graph['edge']=dict(A.edge_attr) - return N - -def to_agraph(N): - """Return a pygraphviz graph from a NetworkX graph N. - - Parameters - ---------- - N : NetworkX graph - A graph created with NetworkX - - Examples - -------- - >>> K5=nx.complete_graph(5) - >>> A=nx.to_agraph(K5) - - Notes - ----- - If N has an dict N.graph_attr an attempt will be made first - to copy properties attached to the graph (see from_agraph) - and then updated with the calling arguments if any. - - """ - try: - import pygraphviz - except ImportError: - raise ImportError('requires pygraphviz ', - 'http://networkx.lanl.gov/pygraphviz ', - '(not available for Python3)') - directed=N.is_directed() - strict=N.number_of_selfloops()==0 and not N.is_multigraph() - A=pygraphviz.AGraph(name=N.name,strict=strict,directed=directed) - - # default graph attributes - A.graph_attr.update(N.graph.get('graph',{})) - A.node_attr.update(N.graph.get('node',{})) - A.edge_attr.update(N.graph.get('edge',{})) - - # add nodes - for n,nodedata in N.nodes(data=True): - A.add_node(n,**nodedata) - - # loop over edges - - if N.is_multigraph(): - for u,v,key,edgedata in N.edges_iter(data=True,keys=True): - str_edgedata=dict((k,str(v)) for k,v in edgedata.items()) - A.add_edge(u,v,key=str(key),**str_edgedata) - else: - for u,v,edgedata in N.edges_iter(data=True): - str_edgedata=dict((k,str(v)) for k,v in edgedata.items()) - A.add_edge(u,v,**str_edgedata) - - - return A - -def write_dot(G,path): - """Write NetworkX graph G to Graphviz dot format on path. - - Parameters - ---------- - G : graph - A networkx graph - path : filename - Filename or file handle to write - """ - try: - import pygraphviz - except ImportError: - raise ImportError('requires pygraphviz ', - 'http://networkx.lanl.gov/pygraphviz ', - '(not available for Python3)') - A=to_agraph(G) - A.write(path) - A.clear() - return - -def read_dot(path): - """Return a NetworkX graph from a dot file on path. - - Parameters - ---------- - path : file or string - File name or file handle to read. - """ - try: - import pygraphviz - except ImportError: - raise ImportError('read_dot() requires pygraphviz ', - 'http://networkx.lanl.gov/pygraphviz ', - '(not available for Python3)') - A=pygraphviz.AGraph(file=path) - return from_agraph(A) - - -def graphviz_layout(G,prog='neato',root=None, args=''): - """Create node positions for G using Graphviz. - - Parameters - ---------- - G : NetworkX graph - A graph created with NetworkX - prog : string - Name of Graphviz layout program - root : string, optional - Root node for twopi layout - args : string, optional - Extra arguments to Graphviz layout program - - Returns : dictionary - Dictionary of x,y, positions keyed by node. - - Examples - -------- - >>> G=nx.petersen_graph() - >>> pos=nx.graphviz_layout(G) - >>> pos=nx.graphviz_layout(G,prog='dot') - - Notes - ----- - This is a wrapper for pygraphviz_layout. - - """ - return pygraphviz_layout(G,prog=prog,root=root,args=args) - -def pygraphviz_layout(G,prog='neato',root=None, args=''): - """Create node positions for G using Graphviz. - - Parameters - ---------- - G : NetworkX graph - A graph created with NetworkX - prog : string - Name of Graphviz layout program - root : string, optional - Root node for twopi layout - args : string, optional - Extra arguments to Graphviz layout program - - Returns : dictionary - Dictionary of x,y, positions keyed by node. - - Examples - -------- - >>> G=nx.petersen_graph() - >>> pos=nx.graphviz_layout(G) - >>> pos=nx.graphviz_layout(G,prog='dot') - - """ - try: - import pygraphviz - except ImportError: - raise ImportError('requires pygraphviz ', - 'http://networkx.lanl.gov/pygraphviz ', - '(not available for Python3)') - if root is not None: - args+="-Groot=%s"%root - A=to_agraph(G) - A.layout(prog=prog,args=args) - node_pos={} - for n in G: - node=pygraphviz.Node(A,n) - try: - xx,yy=node.attr["pos"].split(',') - node_pos[n]=(float(xx),float(yy)) - except: - print("no position for node",n) - node_pos[n]=(0.0,0.0) - return node_pos - -@nx.utils.open_file(5, 'w') -def view_pygraphviz(G, edgelabel=None, prog='dot', args='', - suffix='', path=None): - """Views the graph G using the specified layout algorithm. - - Parameters - ---------- - G : NetworkX graph - The machine to draw. - edgelabel : str, callable, None - If a string, then it specifes the edge attribute to be displayed - on the edge labels. If a callable, then it is called for each - edge and it should return the string to be displayed on the edges. - The function signature of `edgelabel` should be edgelabel(data), - where `data` is the edge attribute dictionary. - prog : string - Name of Graphviz layout program. - args : str - Additional arguments to pass to the Graphviz layout program. - suffix : str - If `filename` is None, we save to a temporary file. The value of - `suffix` will appear at the tail end of the temporary filename. - path : str, None - The filename used to save the image. If None, save to a temporary - file. File formats are the same as those from pygraphviz.agraph.draw. - - Returns - ------- - path : str - The filename of the generated image. - A : PyGraphviz graph - The PyGraphviz graph instance used to generate the image. - - Notes - ----- - If this function is called in succession too quickly, sometimes the - image is not displayed. So you might consider time.sleep(.5) between - calls if you experience problems. - - """ - if not len(G): - raise nx.NetworkXException("An empty graph cannot be drawn.") - - import pygraphviz - - # If we are providing default values for graphviz, these must be set - # before any nodes or edges are added to the PyGraphviz graph object. - # The reason for this is that default values only affect incoming objects. - # If you change the default values after the objects have been added, - # then they inherit no value and are set only if explicitly set. - - # to_agraph() uses these values. - attrs = ['edge', 'node', 'graph'] - for attr in attrs: - if attr not in G.graph: - G.graph[attr] = {} - - # These are the default values. - edge_attrs = {'fontsize': '10'} - node_attrs = {'style': 'filled', - 'fillcolor': '#0000FF40', - 'height': '0.75', - 'width': '0.75', - 'shape': 'circle'} - graph_attrs = {} - - def update_attrs(which, attrs): - # Update graph attributes. Return list of those which were added. - added = [] - for k,v in attrs.items(): - if k not in G.graph[which]: - G.graph[which][k] = v - added.append(k) - - def clean_attrs(which, added): - # Remove added attributes - for attr in added: - del G.graph[which][attr] - if not G.graph[which]: - del G.graph[which] - - # Update all default values - update_attrs('edge', edge_attrs) - update_attrs('node', node_attrs) - update_attrs('graph', graph_attrs) - - # Convert to agraph, so we inherit default values - A = to_agraph(G) - - # Remove the default values we added to the original graph. - clean_attrs('edge', edge_attrs) - clean_attrs('node', node_attrs) - clean_attrs('graph', graph_attrs) - - # If the user passed in an edgelabel, we update the labels for all edges. - if edgelabel is not None: - if not hasattr(edgelabel, '__call__'): - def func(data): - return ''.join([" ", str(data[edgelabel]), " "]) - else: - func = edgelabel - - # update all the edge labels - if G.is_multigraph(): - for u,v,key,data in G.edges_iter(keys=True, data=True): - # PyGraphviz doesn't convert the key to a string. See #339 - edge = A.get_edge(u,v,str(key)) - edge.attr['label'] = str(func(data)) - else: - for u,v,data in G.edges_iter(data=True): - edge = A.get_edge(u,v) - edge.attr['label'] = str(func(data)) - - if path is None: - ext = 'png' - if suffix: - suffix = '_%s.%s' % (suffix, ext) - else: - suffix = '.%s' % (ext,) - path = tempfile.NamedTemporaryFile(suffix=suffix, delete=False) - else: - # Assume the decorator worked and it is a file-object. - pass - - display_pygraphviz(A, path=path, prog=prog, args=args) - - return path.name, A - -def display_pygraphviz(graph, path, format=None, prog=None, args=''): - """Internal function to display a graph in OS dependent manner. - - Parameters - ---------- - graph : PyGraphviz graph - A PyGraphviz AGraph instance. - path : file object - An already opened file object that will be closed. - format : str, None - An attempt is made to guess the output format based on the extension - of the filename. If that fails, the value of `format` is used. - prog : string - Name of Graphviz layout program. - args : str - Additional arguments to pass to the Graphviz layout program. - - Notes - ----- - If this function is called in succession too quickly, sometimes the - image is not displayed. So you might consider time.sleep(.5) between - calls if you experience problems. - - """ - if format is None: - filename = path.name - format = os.path.splitext(filename)[1].lower()[1:] - if not format: - # Let the draw() function use its default - format = None - - # Save to a file and display in the default viewer. - # We must close the file before viewing it. - graph.draw(path, format, prog, args) - path.close() - nx.utils.default_opener(filename) - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import pygraphviz - except: - raise SkipTest("pygraphviz not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_pydot.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_pydot.py deleted file mode 100644 index 183f6ab..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_pydot.py +++ /dev/null @@ -1,287 +0,0 @@ -""" -***** -Pydot -***** - -Import and export NetworkX graphs in Graphviz dot format using pydot. - -Either this module or nx_pygraphviz can be used to interface with graphviz. - -See Also --------- -Pydot: http://code.google.com/p/pydot/ -Graphviz: http://www.research.att.com/sw/tools/graphviz/ -DOT Language: http://www.graphviz.org/doc/info/lang.html -""" -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from networkx.utils import open_file, make_str -import networkx as nx -__author__ = """Aric Hagberg (aric.hagberg@gmail.com)""" -__all__ = ['write_dot', 'read_dot', 'graphviz_layout', 'pydot_layout', - 'to_pydot', 'from_pydot'] - -@open_file(1,mode='w') -def write_dot(G,path): - """Write NetworkX graph G to Graphviz dot format on path. - - Path can be a string or a file handle. - """ - try: - import pydot - except ImportError: - raise ImportError("write_dot() requires pydot", - "http://code.google.com/p/pydot/") - P=to_pydot(G) - path.write(P.to_string()) - return - -@open_file(0,mode='r') -def read_dot(path): - """Return a NetworkX MultiGraph or MultiDiGraph from a dot file on path. - - Parameters - ---------- - path : filename or file handle - - Returns - ------- - G : NetworkX multigraph - A MultiGraph or MultiDiGraph. - - Notes - ----- - Use G=nx.Graph(nx.read_dot(path)) to return a Graph instead of a MultiGraph. - """ - try: - import pydot - except ImportError: - raise ImportError("read_dot() requires pydot", - "http://code.google.com/p/pydot/") - - data=path.read() - P=pydot.graph_from_dot_data(data) - return from_pydot(P) - -def from_pydot(P): - """Return a NetworkX graph from a Pydot graph. - - Parameters - ---------- - P : Pydot graph - A graph created with Pydot - - Returns - ------- - G : NetworkX multigraph - A MultiGraph or MultiDiGraph. - - Examples - -------- - >>> K5=nx.complete_graph(5) - >>> A=nx.to_pydot(K5) - >>> G=nx.from_pydot(A) # return MultiGraph - >>> G=nx.Graph(nx.from_pydot(A)) # make a Graph instead of MultiGraph - - """ - if P.get_strict(None): # pydot bug: get_strict() shouldn't take argument - multiedges=False - else: - multiedges=True - - if P.get_type()=='graph': # undirected - if multiedges: - create_using=nx.MultiGraph() - else: - create_using=nx.Graph() - else: - if multiedges: - create_using=nx.MultiDiGraph() - else: - create_using=nx.DiGraph() - - # assign defaults - N=nx.empty_graph(0,create_using) - N.name=P.get_name() - - # add nodes, attributes to N.node_attr - for p in P.get_node_list(): - n=p.get_name().strip('"') - if n in ('node','graph','edge'): - continue - N.add_node(n,**p.get_attributes()) - - # add edges - for e in P.get_edge_list(): - u=e.get_source().strip('"') - v=e.get_destination().strip('"') - attr=e.get_attributes() - N.add_edge(u,v,**attr) - - # add default attributes for graph, nodes, edges - N.graph['graph']=P.get_attributes() - try: - N.graph['node']=P.get_node_defaults()[0] - except:# IndexError,TypeError: - N.graph['node']={} - try: - N.graph['edge']=P.get_edge_defaults()[0] - except:# IndexError,TypeError: - N.graph['edge']={} - return N - -def to_pydot(N, strict=True): - """Return a pydot graph from a NetworkX graph N. - - Parameters - ---------- - N : NetworkX graph - A graph created with NetworkX - - Examples - -------- - >>> K5=nx.complete_graph(5) - >>> P=nx.to_pydot(K5) - - Notes - ----- - - """ - try: - import pydot - except ImportError: - raise ImportError('to_pydot() requires pydot: ' - 'http://code.google.com/p/pydot/') - - # set Graphviz graph type - if N.is_directed(): - graph_type='digraph' - else: - graph_type='graph' - strict=N.number_of_selfloops()==0 and not N.is_multigraph() - - name = N.graph.get('name') - graph_defaults=N.graph.get('graph',{}) - if name is None: - P = pydot.Dot(graph_type=graph_type,strict=strict,**graph_defaults) - else: - P = pydot.Dot('"%s"'%name,graph_type=graph_type,strict=strict, - **graph_defaults) - try: - P.set_node_defaults(**N.graph['node']) - except KeyError: - pass - try: - P.set_edge_defaults(**N.graph['edge']) - except KeyError: - pass - - for n,nodedata in N.nodes_iter(data=True): - str_nodedata=dict((k,make_str(v)) for k,v in nodedata.items()) - p=pydot.Node(make_str(n),**str_nodedata) - P.add_node(p) - - if N.is_multigraph(): - for u,v,key,edgedata in N.edges_iter(data=True,keys=True): - str_edgedata=dict((k,make_str(v)) for k,v in edgedata.items()) - edge=pydot.Edge(make_str(u),make_str(v),key=make_str(key),**str_edgedata) - P.add_edge(edge) - - else: - for u,v,edgedata in N.edges_iter(data=True): - str_edgedata=dict((k,make_str(v)) for k,v in edgedata.items()) - edge=pydot.Edge(make_str(u),make_str(v),**str_edgedata) - P.add_edge(edge) - return P - - -def pydot_from_networkx(N): - """Create a Pydot graph from a NetworkX graph.""" - from warnings import warn - warn('pydot_from_networkx is replaced by to_pydot', DeprecationWarning) - return to_pydot(N) - -def networkx_from_pydot(D, create_using=None): - """Create a NetworkX graph from a Pydot graph.""" - from warnings import warn - warn('networkx_from_pydot is replaced by from_pydot', - DeprecationWarning) - return from_pydot(D) - -def graphviz_layout(G,prog='neato',root=None, **kwds): - """Create node positions using Pydot and Graphviz. - - Returns a dictionary of positions keyed by node. - - Examples - -------- - >>> G=nx.complete_graph(4) - >>> pos=nx.graphviz_layout(G) - >>> pos=nx.graphviz_layout(G,prog='dot') - - Notes - ----- - This is a wrapper for pydot_layout. - """ - return pydot_layout(G=G,prog=prog,root=root,**kwds) - - -def pydot_layout(G,prog='neato',root=None, **kwds): - """Create node positions using Pydot and Graphviz. - - Returns a dictionary of positions keyed by node. - - Examples - -------- - >>> G=nx.complete_graph(4) - >>> pos=nx.pydot_layout(G) - >>> pos=nx.pydot_layout(G,prog='dot') - """ - try: - import pydot - except ImportError: - raise ImportError('pydot_layout() requires pydot ', - 'http://code.google.com/p/pydot/') - - P=to_pydot(G) - if root is not None : - P.set("root",make_str(root)) - - D=P.create_dot(prog=prog) - - if D=="": # no data returned - print("Graphviz layout with %s failed"%(prog)) - print() - print("To debug what happened try:") - print("P=pydot_from_networkx(G)") - print("P.write_dot(\"file.dot\")") - print("And then run %s on file.dot"%(prog)) - return - - Q=pydot.graph_from_dot_data(D) - - node_pos={} - for n in G.nodes(): - pydot_node = pydot.Node(make_str(n)).get_name().encode('utf-8') - node=Q.get_node(pydot_node) - - if isinstance(node,list): - node=node[0] - pos=node.get_pos()[1:-1] # strip leading and trailing double quotes - if pos != None: - xx,yy=pos.split(",") - node_pos[n]=(float(xx),float(yy)) - return node_pos - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import pydot - import dot_parser - except: - raise SkipTest("pydot not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_pylab.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_pylab.py deleted file mode 100644 index c7d0cf6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/nx_pylab.py +++ /dev/null @@ -1,896 +0,0 @@ -""" -********** -Matplotlib -********** - -Draw networks with matplotlib. - -See Also --------- - -matplotlib: http://matplotlib.sourceforge.net/ - -pygraphviz: http://networkx.lanl.gov/pygraphviz/ - -""" -# Copyright (C) 2004-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.drawing.layout import shell_layout,\ - circular_layout,spectral_layout,spring_layout,random_layout -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -__all__ = ['draw', - 'draw_networkx', - 'draw_networkx_nodes', - 'draw_networkx_edges', - 'draw_networkx_labels', - 'draw_networkx_edge_labels', - 'draw_circular', - 'draw_random', - 'draw_spectral', - 'draw_spring', - 'draw_shell', - 'draw_graphviz'] - -def draw(G, pos=None, ax=None, hold=None, **kwds): - """Draw the graph G with Matplotlib. - - Draw the graph as a simple representation with no node - labels or edge labels and using the full Matplotlib figure area - and no axis labels by default. See draw_networkx() for more - full-featured drawing that allows title, axis labels etc. - - Parameters - ---------- - G : graph - A networkx graph - - pos : dictionary, optional - A dictionary with nodes as keys and positions as values. - If not specified a spring layout positioning will be computed. - See networkx.layout for functions that compute node positions. - - ax : Matplotlib Axes object, optional - Draw the graph in specified Matplotlib axes. - - hold : bool, optional - Set the Matplotlib hold state. If True subsequent draw - commands will be added to the current axes. - - **kwds : optional keywords - See networkx.draw_networkx() for a description of optional keywords. - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> nx.draw(G) - >>> nx.draw(G,pos=nx.spring_layout(G)) # use spring layout - - See Also - -------- - draw_networkx() - draw_networkx_nodes() - draw_networkx_edges() - draw_networkx_labels() - draw_networkx_edge_labels() - - Notes - ----- - This function has the same name as pylab.draw and pyplot.draw - so beware when using - - >>> from networkx import * - - since you might overwrite the pylab.draw function. - - With pyplot use - - >>> import matplotlib.pyplot as plt - >>> import networkx as nx - >>> G=nx.dodecahedral_graph() - >>> nx.draw(G) # networkx draw() - >>> plt.draw() # pyplot draw() - - Also see the NetworkX drawing examples at - http://networkx.lanl.gov/gallery.html - """ - try: - import matplotlib.pyplot as plt - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - - if ax is None: - cf = plt.gcf() - else: - cf = ax.get_figure() - cf.set_facecolor('w') - if ax is None: - if cf._axstack() is None: - ax=cf.add_axes((0,0,1,1)) - else: - ax=cf.gca() - - # allow callers to override the hold state by passing hold=True|False - b = plt.ishold() - h = kwds.pop('hold', None) - if h is not None: - plt.hold(h) - try: - draw_networkx(G,pos=pos,ax=ax,**kwds) - ax.set_axis_off() - plt.draw_if_interactive() - except: - plt.hold(b) - raise - plt.hold(b) - return - - -def draw_networkx(G, pos=None, with_labels=True, **kwds): - """Draw the graph G using Matplotlib. - - Draw the graph with Matplotlib with options for node positions, - labeling, titles, and many other drawing features. - See draw() for simple drawing without labels or axes. - - Parameters - ---------- - G : graph - A networkx graph - - pos : dictionary, optional - A dictionary with nodes as keys and positions as values. - If not specified a spring layout positioning will be computed. - See networkx.layout for functions that compute node positions. - - with_labels : bool, optional (default=True) - Set to True to draw labels on the nodes. - - ax : Matplotlib Axes object, optional - Draw the graph in the specified Matplotlib axes. - - nodelist : list, optional (default G.nodes()) - Draw only specified nodes - - edgelist : list, optional (default=G.edges()) - Draw only specified edges - - node_size : scalar or array, optional (default=300) - Size of nodes. If an array is specified it must be the - same length as nodelist. - - node_color : color string, or array of floats, (default='r') - Node color. Can be a single color format string, - or a sequence of colors with the same length as nodelist. - If numeric values are specified they will be mapped to - colors using the cmap and vmin,vmax parameters. See - matplotlib.scatter for more details. - - node_shape : string, optional (default='o') - The shape of the node. Specification is as matplotlib.scatter - marker, one of 'so^>v<dph8'. - - alpha : float, optional (default=1.0) - The node transparency - - cmap : Matplotlib colormap, optional (default=None) - Colormap for mapping intensities of nodes - - vmin,vmax : float, optional (default=None) - Minimum and maximum for node colormap scaling - - linewidths : [None | scalar | sequence] - Line width of symbol border (default =1.0) - - width : float, optional (default=1.0) - Line width of edges - - edge_color : color string, or array of floats (default='r') - Edge color. Can be a single color format string, - or a sequence of colors with the same length as edgelist. - If numeric values are specified they will be mapped to - colors using the edge_cmap and edge_vmin,edge_vmax parameters. - - edge_ cmap : Matplotlib colormap, optional (default=None) - Colormap for mapping intensities of edges - - edge_vmin,edge_vmax : floats, optional (default=None) - Minimum and maximum for edge colormap scaling - - style : string, optional (default='solid') - Edge line style (solid|dashed|dotted,dashdot) - - labels : dictionary, optional (default=None) - Node labels in a dictionary keyed by node of text labels - - font_size : int, optional (default=12) - Font size for text labels - - font_color : string, optional (default='k' black) - Font color string - - font_weight : string, optional (default='normal') - Font weight - - font_family : string, optional (default='sans-serif') - Font family - - label : string, optional - Label for graph legend - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> nx.draw(G) - >>> nx.draw(G,pos=nx.spring_layout(G)) # use spring layout - - >>> import matplotlib.pyplot as plt - >>> limits=plt.axis('off') # turn of axis - - Also see the NetworkX drawing examples at - http://networkx.lanl.gov/gallery.html - - See Also - -------- - draw() - draw_networkx_nodes() - draw_networkx_edges() - draw_networkx_labels() - draw_networkx_edge_labels() - """ - try: - import matplotlib.pyplot as plt - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - - if pos is None: - pos=nx.drawing.spring_layout(G) # default to spring layout - - node_collection=draw_networkx_nodes(G, pos, **kwds) - edge_collection=draw_networkx_edges(G, pos, **kwds) - if with_labels: - draw_networkx_labels(G, pos, **kwds) - plt.draw_if_interactive() - -def draw_networkx_nodes(G, pos, - nodelist=None, - node_size=300, - node_color='r', - node_shape='o', - alpha=1.0, - cmap=None, - vmin=None, - vmax=None, - ax=None, - linewidths=None, - label = None, - **kwds): - """Draw the nodes of the graph G. - - This draws only the nodes of the graph G. - - Parameters - ---------- - G : graph - A networkx graph - - pos : dictionary - A dictionary with nodes as keys and positions as values. - If not specified a spring layout positioning will be computed. - See networkx.layout for functions that compute node positions. - - ax : Matplotlib Axes object, optional - Draw the graph in the specified Matplotlib axes. - - nodelist : list, optional - Draw only specified nodes (default G.nodes()) - - node_size : scalar or array - Size of nodes (default=300). If an array is specified it must be the - same length as nodelist. - - node_color : color string, or array of floats - Node color. Can be a single color format string (default='r'), - or a sequence of colors with the same length as nodelist. - If numeric values are specified they will be mapped to - colors using the cmap and vmin,vmax parameters. See - matplotlib.scatter for more details. - - node_shape : string - The shape of the node. Specification is as matplotlib.scatter - marker, one of 'so^>v<dph8' (default='o'). - - alpha : float - The node transparency (default=1.0) - - cmap : Matplotlib colormap - Colormap for mapping intensities of nodes (default=None) - - vmin,vmax : floats - Minimum and maximum for node colormap scaling (default=None) - - linewidths : [None | scalar | sequence] - Line width of symbol border (default =1.0) - - label : [None| string] - Label for legend - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> nodes=nx.draw_networkx_nodes(G,pos=nx.spring_layout(G)) - - Also see the NetworkX drawing examples at - http://networkx.lanl.gov/gallery.html - - See Also - -------- - draw() - draw_networkx() - draw_networkx_edges() - draw_networkx_labels() - draw_networkx_edge_labels() - """ - try: - import matplotlib.pyplot as plt - import numpy - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - - - if ax is None: - ax=plt.gca() - - if nodelist is None: - nodelist=G.nodes() - - if not nodelist or len(nodelist)==0: # empty nodelist, no drawing - return None - - try: - xy=numpy.asarray([pos[v] for v in nodelist]) - except KeyError as e: - raise nx.NetworkXError('Node %s has no position.'%e) - except ValueError: - raise nx.NetworkXError('Bad value in node positions.') - - - - node_collection=ax.scatter(xy[:,0], xy[:,1], - s=node_size, - c=node_color, - marker=node_shape, - cmap=cmap, - vmin=vmin, - vmax=vmax, - alpha=alpha, - linewidths=linewidths, - label=label) - - node_collection.set_zorder(2) - return node_collection - - -def draw_networkx_edges(G, pos, - edgelist=None, - width=1.0, - edge_color='k', - style='solid', - alpha=None, - edge_cmap=None, - edge_vmin=None, - edge_vmax=None, - ax=None, - arrows=True, - label=None, - **kwds): - """Draw the edges of the graph G. - - This draws only the edges of the graph G. - - Parameters - ---------- - G : graph - A networkx graph - - pos : dictionary - A dictionary with nodes as keys and positions as values. - If not specified a spring layout positioning will be computed. - See networkx.layout for functions that compute node positions. - - edgelist : collection of edge tuples - Draw only specified edges(default=G.edges()) - - width : float - Line width of edges (default =1.0) - - edge_color : color string, or array of floats - Edge color. Can be a single color format string (default='r'), - or a sequence of colors with the same length as edgelist. - If numeric values are specified they will be mapped to - colors using the edge_cmap and edge_vmin,edge_vmax parameters. - - style : string - Edge line style (default='solid') (solid|dashed|dotted,dashdot) - - alpha : float - The edge transparency (default=1.0) - - edge_ cmap : Matplotlib colormap - Colormap for mapping intensities of edges (default=None) - - edge_vmin,edge_vmax : floats - Minimum and maximum for edge colormap scaling (default=None) - - ax : Matplotlib Axes object, optional - Draw the graph in the specified Matplotlib axes. - - arrows : bool, optional (default=True) - For directed graphs, if True draw arrowheads. - - label : [None| string] - Label for legend - - Notes - ----- - For directed graphs, "arrows" (actually just thicker stubs) are drawn - at the head end. Arrows can be turned off with keyword arrows=False. - Yes, it is ugly but drawing proper arrows with Matplotlib this - way is tricky. - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> edges=nx.draw_networkx_edges(G,pos=nx.spring_layout(G)) - - Also see the NetworkX drawing examples at - http://networkx.lanl.gov/gallery.html - - See Also - -------- - draw() - draw_networkx() - draw_networkx_nodes() - draw_networkx_labels() - draw_networkx_edge_labels() - """ - try: - import matplotlib - import matplotlib.pyplot as plt - import matplotlib.cbook as cb - from matplotlib.colors import colorConverter,Colormap - from matplotlib.collections import LineCollection - import numpy - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - - if ax is None: - ax=plt.gca() - - if edgelist is None: - edgelist=G.edges() - - if not edgelist or len(edgelist)==0: # no edges! - return None - - # set edge positions - edge_pos=numpy.asarray([(pos[e[0]],pos[e[1]]) for e in edgelist]) - - if not cb.iterable(width): - lw = (width,) - else: - lw = width - - if not cb.is_string_like(edge_color) \ - and cb.iterable(edge_color) \ - and len(edge_color)==len(edge_pos): - if numpy.alltrue([cb.is_string_like(c) - for c in edge_color]): - # (should check ALL elements) - # list of color letters such as ['k','r','k',...] - edge_colors = tuple([colorConverter.to_rgba(c,alpha) - for c in edge_color]) - elif numpy.alltrue([not cb.is_string_like(c) - for c in edge_color]): - # If color specs are given as (rgb) or (rgba) tuples, we're OK - if numpy.alltrue([cb.iterable(c) and len(c) in (3,4) - for c in edge_color]): - edge_colors = tuple(edge_color) - else: - # numbers (which are going to be mapped with a colormap) - edge_colors = None - else: - raise ValueError('edge_color must consist of either color names or numbers') - else: - if cb.is_string_like(edge_color) or len(edge_color)==1: - edge_colors = ( colorConverter.to_rgba(edge_color, alpha), ) - else: - raise ValueError('edge_color must be a single color or list of exactly m colors where m is the number or edges') - - edge_collection = LineCollection(edge_pos, - colors = edge_colors, - linewidths = lw, - antialiaseds = (1,), - linestyle = style, - transOffset = ax.transData, - ) - - - edge_collection.set_zorder(1) # edges go behind nodes - edge_collection.set_label(label) - ax.add_collection(edge_collection) - - # Note: there was a bug in mpl regarding the handling of alpha values for - # each line in a LineCollection. It was fixed in matplotlib in r7184 and - # r7189 (June 6 2009). We should then not set the alpha value globally, - # since the user can instead provide per-edge alphas now. Only set it - # globally if provided as a scalar. - if cb.is_numlike(alpha): - edge_collection.set_alpha(alpha) - - if edge_colors is None: - if edge_cmap is not None: - assert(isinstance(edge_cmap, Colormap)) - edge_collection.set_array(numpy.asarray(edge_color)) - edge_collection.set_cmap(edge_cmap) - if edge_vmin is not None or edge_vmax is not None: - edge_collection.set_clim(edge_vmin, edge_vmax) - else: - edge_collection.autoscale() - - arrow_collection=None - - if G.is_directed() and arrows: - - # a directed graph hack - # draw thick line segments at head end of edge - # waiting for someone else to implement arrows that will work - arrow_colors = edge_colors - a_pos=[] - p=1.0-0.25 # make head segment 25 percent of edge length - for src,dst in edge_pos: - x1,y1=src - x2,y2=dst - dx=x2-x1 # x offset - dy=y2-y1 # y offset - d=numpy.sqrt(float(dx**2+dy**2)) # length of edge - if d==0: # source and target at same position - continue - if dx==0: # vertical edge - xa=x2 - ya=dy*p+y1 - if dy==0: # horizontal edge - ya=y2 - xa=dx*p+x1 - else: - theta=numpy.arctan2(dy,dx) - xa=p*d*numpy.cos(theta)+x1 - ya=p*d*numpy.sin(theta)+y1 - - a_pos.append(((xa,ya),(x2,y2))) - - arrow_collection = LineCollection(a_pos, - colors = arrow_colors, - linewidths = [4*ww for ww in lw], - antialiaseds = (1,), - transOffset = ax.transData, - ) - - arrow_collection.set_zorder(1) # edges go behind nodes - arrow_collection.set_label(label) - ax.add_collection(arrow_collection) - - - # update view - minx = numpy.amin(numpy.ravel(edge_pos[:,:,0])) - maxx = numpy.amax(numpy.ravel(edge_pos[:,:,0])) - miny = numpy.amin(numpy.ravel(edge_pos[:,:,1])) - maxy = numpy.amax(numpy.ravel(edge_pos[:,:,1])) - - w = maxx-minx - h = maxy-miny - padx, pady = 0.05*w, 0.05*h - corners = (minx-padx, miny-pady), (maxx+padx, maxy+pady) - ax.update_datalim( corners) - ax.autoscale_view() - -# if arrow_collection: - - return edge_collection - - -def draw_networkx_labels(G, pos, - labels=None, - font_size=12, - font_color='k', - font_family='sans-serif', - font_weight='normal', - alpha=1.0, - ax=None, - **kwds): - """Draw node labels on the graph G. - - Parameters - ---------- - G : graph - A networkx graph - - pos : dictionary, optional - A dictionary with nodes as keys and positions as values. - If not specified a spring layout positioning will be computed. - See networkx.layout for functions that compute node positions. - - labels : dictionary, optional (default=None) - Node labels in a dictionary keyed by node of text labels - - font_size : int - Font size for text labels (default=12) - - font_color : string - Font color string (default='k' black) - - font_family : string - Font family (default='sans-serif') - - font_weight : string - Font weight (default='normal') - - alpha : float - The text transparency (default=1.0) - - ax : Matplotlib Axes object, optional - Draw the graph in the specified Matplotlib axes. - - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> labels=nx.draw_networkx_labels(G,pos=nx.spring_layout(G)) - - Also see the NetworkX drawing examples at - http://networkx.lanl.gov/gallery.html - - - See Also - -------- - draw() - draw_networkx() - draw_networkx_nodes() - draw_networkx_edges() - draw_networkx_edge_labels() - """ - try: - import matplotlib.pyplot as plt - import matplotlib.cbook as cb - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - - if ax is None: - ax=plt.gca() - - if labels is None: - labels=dict( (n,n) for n in G.nodes()) - - # set optional alignment - horizontalalignment=kwds.get('horizontalalignment','center') - verticalalignment=kwds.get('verticalalignment','center') - - text_items={} # there is no text collection so we'll fake one - for n, label in labels.items(): - (x,y)=pos[n] - if not cb.is_string_like(label): - label=str(label) # this will cause "1" and 1 to be labeled the same - t=ax.text(x, y, - label, - size=font_size, - color=font_color, - family=font_family, - weight=font_weight, - horizontalalignment=horizontalalignment, - verticalalignment=verticalalignment, - transform = ax.transData, - clip_on=True, - ) - text_items[n]=t - - return text_items - -def draw_networkx_edge_labels(G, pos, - edge_labels=None, - label_pos=0.5, - font_size=10, - font_color='k', - font_family='sans-serif', - font_weight='normal', - alpha=1.0, - bbox=None, - ax=None, - rotate=True, - **kwds): - """Draw edge labels. - - Parameters - ---------- - G : graph - A networkx graph - - pos : dictionary, optional - A dictionary with nodes as keys and positions as values. - If not specified a spring layout positioning will be computed. - See networkx.layout for functions that compute node positions. - - ax : Matplotlib Axes object, optional - Draw the graph in the specified Matplotlib axes. - - alpha : float - The text transparency (default=1.0) - - edge_labels : dictionary - Edge labels in a dictionary keyed by edge two-tuple of text - labels (default=None). Only labels for the keys in the dictionary - are drawn. - - label_pos : float - Position of edge label along edge (0=head, 0.5=center, 1=tail) - - font_size : int - Font size for text labels (default=12) - - font_color : string - Font color string (default='k' black) - - font_weight : string - Font weight (default='normal') - - font_family : string - Font family (default='sans-serif') - - bbox : Matplotlib bbox - Specify text box shape and colors. - - clip_on : bool - Turn on clipping at axis boundaries (default=True) - - Examples - -------- - >>> G=nx.dodecahedral_graph() - >>> edge_labels=nx.draw_networkx_edge_labels(G,pos=nx.spring_layout(G)) - - Also see the NetworkX drawing examples at - http://networkx.lanl.gov/gallery.html - - See Also - -------- - draw() - draw_networkx() - draw_networkx_nodes() - draw_networkx_edges() - draw_networkx_labels() - """ - try: - import matplotlib.pyplot as plt - import matplotlib.cbook as cb - import numpy - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - - if ax is None: - ax=plt.gca() - if edge_labels is None: - labels=dict( ((u,v), d) for u,v,d in G.edges(data=True) ) - else: - labels = edge_labels - text_items={} - for (n1,n2), label in labels.items(): - (x1,y1)=pos[n1] - (x2,y2)=pos[n2] - (x,y) = (x1 * label_pos + x2 * (1.0 - label_pos), - y1 * label_pos + y2 * (1.0 - label_pos)) - - if rotate: - angle=numpy.arctan2(y2-y1,x2-x1)/(2.0*numpy.pi)*360 # degrees - # make label orientation "right-side-up" - if angle > 90: - angle-=180 - if angle < - 90: - angle+=180 - # transform data coordinate angle to screen coordinate angle - xy=numpy.array((x,y)) - trans_angle=ax.transData.transform_angles(numpy.array((angle,)), - xy.reshape((1,2)))[0] - else: - trans_angle=0.0 - # use default box of white with white border - if bbox is None: - bbox = dict(boxstyle='round', - ec=(1.0, 1.0, 1.0), - fc=(1.0, 1.0, 1.0), - ) - if not cb.is_string_like(label): - label=str(label) # this will cause "1" and 1 to be labeled the same - - # set optional alignment - horizontalalignment=kwds.get('horizontalalignment','center') - verticalalignment=kwds.get('verticalalignment','center') - - t=ax.text(x, y, - label, - size=font_size, - color=font_color, - family=font_family, - weight=font_weight, - horizontalalignment=horizontalalignment, - verticalalignment=verticalalignment, - rotation=trans_angle, - transform = ax.transData, - bbox = bbox, - zorder = 1, - clip_on=True, - ) - text_items[(n1,n2)]=t - - return text_items - -def draw_circular(G, **kwargs): - """Draw the graph G with a circular layout.""" - draw(G,circular_layout(G),**kwargs) - -def draw_random(G, **kwargs): - """Draw the graph G with a random layout.""" - draw(G,random_layout(G),**kwargs) - -def draw_spectral(G, **kwargs): - """Draw the graph G with a spectral layout.""" - draw(G,spectral_layout(G),**kwargs) - -def draw_spring(G, **kwargs): - """Draw the graph G with a spring layout.""" - draw(G,spring_layout(G),**kwargs) - -def draw_shell(G, **kwargs): - """Draw networkx graph with shell layout.""" - nlist = kwargs.get('nlist', None) - if nlist != None: - del(kwargs['nlist']) - draw(G,shell_layout(G,nlist=nlist),**kwargs) - -def draw_graphviz(G, prog="neato", **kwargs): - """Draw networkx graph with graphviz layout.""" - pos=nx.drawing.graphviz_layout(G,prog) - draw(G,pos,**kwargs) - -def draw_nx(G,pos,**kwds): - """For backward compatibility; use draw or draw_networkx.""" - draw(G,pos,**kwds) - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import matplotlib as mpl - mpl.use('PS',warn=False) - import matplotlib.pyplot as plt - except: - raise SkipTest("matplotlib not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_agraph.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_agraph.py deleted file mode 100644 index b2f28a3..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_agraph.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Unit tests for PyGraphviz intefaace. -""" -import os -import tempfile - -from nose import SkipTest -from nose.tools import assert_true,assert_equal - -import networkx as nx - -class TestAGraph(object): - @classmethod - def setupClass(cls): - global pygraphviz - try: - import pygraphviz - except ImportError: - raise SkipTest('PyGraphviz not available.') - - def build_graph(self, G): - G.add_edge('A','B') - G.add_edge('A','C') - G.add_edge('A','C') - G.add_edge('B','C') - G.add_edge('A','D') - G.add_node('E') - return G - - def assert_equal(self, G1, G2): - assert_true( sorted(G1.nodes())==sorted(G2.nodes()) ) - assert_true( sorted(G1.edges())==sorted(G2.edges()) ) - - - def agraph_checks(self, G): - G = self.build_graph(G) - A=nx.to_agraph(G) - H=nx.from_agraph(A) - self.assert_equal(G, H) - - fname=tempfile.mktemp() - nx.drawing.nx_agraph.write_dot(H,fname) - Hin=nx.drawing.nx_agraph.read_dot(fname) - os.unlink(fname) - self.assert_equal(H,Hin) - - - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - nx.drawing.nx_agraph.write_dot(H,fh) - fh.close() - - fh=open(fname,'r') - Hin=nx.drawing.nx_agraph.read_dot(fh) - fh.close() - os.unlink(fname) - self.assert_equal(H,Hin) - - def test_from_agraph_name(self): - G=nx.Graph(name='test') - A=nx.to_agraph(G) - H=nx.from_agraph(A) - assert_equal(G.name,'test') - - - def testUndirected(self): - self.agraph_checks(nx.Graph()) - - def testDirected(self): - self.agraph_checks(nx.DiGraph()) - - def testMultiUndirected(self): - self.agraph_checks(nx.MultiGraph()) - - def testMultiDirected(self): - self.agraph_checks(nx.MultiDiGraph()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_layout.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_layout.py deleted file mode 100644 index 0327782..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_layout.py +++ /dev/null @@ -1,61 +0,0 @@ -"""Unit tests for layout functions.""" -import sys -from nose import SkipTest -from nose.tools import assert_equal -import networkx as nx - -class TestLayout(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global numpy - try: - import numpy - except ImportError: - raise SkipTest('numpy not available.') - - - def setUp(self): - self.Gi=nx.grid_2d_graph(5,5) - self.Gs=nx.Graph() - self.Gs.add_path('abcdef') - self.bigG=nx.grid_2d_graph(25,25) #bigger than 500 nodes for sparse - - def test_smoke_int(self): - G=self.Gi - vpos=nx.random_layout(G) - vpos=nx.circular_layout(G) - vpos=nx.spring_layout(G) - vpos=nx.fruchterman_reingold_layout(G) - vpos=nx.spectral_layout(G) - vpos=nx.spectral_layout(self.bigG) - vpos=nx.shell_layout(G) - - def test_smoke_string(self): - G=self.Gs - vpos=nx.random_layout(G) - vpos=nx.circular_layout(G) - vpos=nx.spring_layout(G) - vpos=nx.fruchterman_reingold_layout(G) - vpos=nx.spectral_layout(G) - vpos=nx.shell_layout(G) - - - def test_adjacency_interface_numpy(self): - A=nx.to_numpy_matrix(self.Gs) - pos=nx.drawing.layout._fruchterman_reingold(A) - pos=nx.drawing.layout._fruchterman_reingold(A,dim=3) - assert_equal(pos.shape,(6,3)) - - def test_adjacency_interface_scipy(self): - try: - import scipy - except ImportError: - raise SkipTest('scipy not available.') - - A=nx.to_scipy_sparse_matrix(self.Gs,dtype='f') - pos=nx.drawing.layout._sparse_fruchterman_reingold(A) - pos=nx.drawing.layout._sparse_spectral(A) - - pos=nx.drawing.layout._sparse_fruchterman_reingold(A,dim=3) - assert_equal(pos.shape,(6,3)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_pydot.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_pydot.py deleted file mode 100644 index 9cdffee..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_pydot.py +++ /dev/null @@ -1,62 +0,0 @@ -""" - Unit tests for pydot drawing functions. -""" -import os -import tempfile - -from nose import SkipTest -from nose.tools import assert_true - -import networkx as nx - -class TestPydot(object): - @classmethod - def setupClass(cls): - global pydot - try: - import pydot - import dot_parser - except ImportError: - raise SkipTest('pydot not available.') - - def build_graph(self, G): - G.add_edge('A','B') - G.add_edge('A','C') - G.add_edge('B','C') - G.add_edge('A','D') - G.add_node('E') - return G, nx.to_pydot(G) - - def assert_equal(self, G1, G2): - assert_true( sorted(G1.nodes())==sorted(G2.nodes()) ) - assert_true( sorted(G1.edges())==sorted(G2.edges()) ) - - def pydot_checks(self, G): - H, P = self.build_graph(G) - G2 = H.__class__(nx.from_pydot(P)) - self.assert_equal(H, G2) - - fname = tempfile.mktemp() - assert_true( P.write_raw(fname) ) - - Pin = pydot.graph_from_dot_file(fname) - - n1 = sorted([p.get_name() for p in P.get_node_list()]) - n2 = sorted([p.get_name() for p in Pin.get_node_list()]) - assert_true( n1 == n2 ) - - e1=[(e.get_source(),e.get_destination()) for e in P.get_edge_list()] - e2=[(e.get_source(),e.get_destination()) for e in Pin.get_edge_list()] - assert_true( sorted(e1)==sorted(e2) ) - - Hin = nx.drawing.nx_pydot.read_dot(fname) - Hin = H.__class__(Hin) - self.assert_equal(H, Hin) -# os.unlink(fname) - - - def testUndirected(self): - self.pydot_checks(nx.Graph()) - - def testDirected(self): - self.pydot_checks(nx.DiGraph()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_pylab.py b/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_pylab.py deleted file mode 100644 index 9c55590..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/drawing/tests/test_pylab.py +++ /dev/null @@ -1,40 +0,0 @@ -""" - Unit tests for matplotlib drawing functions. -""" - -import os - -from nose import SkipTest - -import networkx as nx - -class TestPylab(object): - @classmethod - def setupClass(cls): - global plt - try: - import matplotlib as mpl - mpl.use('PS',warn=False) - import matplotlib.pyplot as plt - except ImportError: - raise SkipTest('matplotlib not available.') - except RuntimeError: - raise SkipTest('matplotlib not available.') - - def setUp(self): - self.G=nx.barbell_graph(5,10) - - - def test_draw(self): - N=self.G - nx.draw_spring(N) - plt.savefig("test.ps") - nx.draw_random(N) - plt.savefig("test.ps") - nx.draw_circular(N) - plt.savefig("test.ps") - nx.draw_spectral(N) - plt.savefig("test.ps") - nx.draw_spring(N.to_directed()) - plt.savefig("test.ps") - os.unlink('test.ps') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/exception.py b/lib/python2.7/site-packages/setoolsgui/networkx/exception.py deleted file mode 100644 index 0267038..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/exception.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -""" -********** -Exceptions -********** - -Base exceptions and errors for NetworkX. - -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)\nDan Schult(dschult@colgate.edu)\nLoïc Séguin-C. <loicseguin@gmail.com>""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# - -# Exception handling - -# the root of all Exceptions -class NetworkXException(Exception): - """Base class for exceptions in NetworkX.""" - -class NetworkXError(NetworkXException): - """Exception for a serious error in NetworkX""" - -class NetworkXPointlessConcept(NetworkXException): - """Harary, F. and Read, R. "Is the Null Graph a Pointless Concept?" -In Graphs and Combinatorics Conference, George Washington University. -New York: Springer-Verlag, 1973. -""" - -class NetworkXAlgorithmError(NetworkXException): - """Exception for unexpected termination of algorithms.""" - -class NetworkXUnfeasible(NetworkXAlgorithmError): - """Exception raised by algorithms trying to solve a problem - instance that has no feasible solution.""" - -class NetworkXNoPath(NetworkXUnfeasible): - """Exception for algorithms that should return a path when running - on graphs where such a path does not exist.""" - -class NetworkXUnbounded(NetworkXAlgorithmError): - """Exception raised by algorithms trying to solve a maximization - or a minimization problem instance that is unbounded.""" - -class NetworkXNotImplemented(NetworkXException): - """Exception raised by algorithms not implemented for a type of graph.""" diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/external/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/external/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/external/__init__.py +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/__init__.py deleted file mode 100644 index 154bfd6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -""" - Hack for including decorator-3.3.1 in NetworkX. -""" -import sys -if sys.version >= '3': - from .decorator3._decorator3 import * -else: - from .decorator2._decorator2 import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/decorator2/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/decorator2/__init__.py deleted file mode 100644 index 792d600..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/decorator2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/decorator2/_decorator2.py b/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/decorator2/_decorator2.py deleted file mode 100644 index 2e8c123..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/external/decorator/decorator2/_decorator2.py +++ /dev/null @@ -1,210 +0,0 @@ -########################## LICENCE ############################### -## -## Copyright (c) 2005-2011, Michele Simionato -## All rights reserved. -## -## Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## Redistributions in bytecode form must reproduce the above copyright -## notice, this list of conditions and the following disclaimer in -## the documentation and/or other materials provided with the -## distribution. - -## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -## HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -## INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -## BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -## OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -## TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -## USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -## DAMAGE. - -""" -Decorator module, see http://pypi.python.org/pypi/decorator -for the documentation. -""" - -__version__ = '3.3.2' - -__all__ = ["decorator", "FunctionMaker", "partial"] - -import sys, re, inspect - -try: - from functools import partial -except ImportError: # for Python version < 2.5 - class partial(object): - "A simple replacement of functools.partial" - def __init__(self, func, *args, **kw): - self.func = func - self.args = args - self.keywords = kw - def __call__(self, *otherargs, **otherkw): - kw = self.keywords.copy() - kw.update(otherkw) - return self.func(*(self.args + otherargs), **kw) - -if sys.version >= '3': - from inspect import getfullargspec -else: - class getfullargspec(object): - "A quick and dirty replacement for getfullargspec for Python 2.X" - def __init__(self, f): - self.args, self.varargs, self.varkw, self.defaults = \ - inspect.getargspec(f) - self.kwonlyargs = [] - self.kwonlydefaults = None - self.annotations = getattr(f, '__annotations__', {}) - def __iter__(self): - yield self.args - yield self.varargs - yield self.varkw - yield self.defaults - -DEF = re.compile('\s*def\s*([_\w][_\w\d]*)\s*\(') - -# basic functionality -class FunctionMaker(object): - """ - An object with the ability to create functions with a given signature. - It has attributes name, doc, module, signature, defaults, dict and - methods update and make. - """ - def __init__(self, func=None, name=None, signature=None, - defaults=None, doc=None, module=None, funcdict=None): - self.shortsignature = signature - if func: - # func can be a class or a callable, but not an instance method - self.name = func.__name__ - if self.name == '<lambda>': # small hack for lambda functions - self.name = '_lambda_' - self.doc = func.__doc__ - self.module = func.__module__ - if inspect.isfunction(func): - argspec = getfullargspec(func) - for a in ('args', 'varargs', 'varkw', 'defaults', 'kwonlyargs', - 'kwonlydefaults', 'annotations'): - setattr(self, a, getattr(argspec, a)) - for i, arg in enumerate(self.args): - setattr(self, 'arg%d' % i, arg) - self.signature = inspect.formatargspec( - formatvalue=lambda val: "", *argspec)[1:-1] - allargs = list(self.args) - if self.varargs: - allargs.append('*' + self.varargs) - if self.varkw: - allargs.append('**' + self.varkw) - try: - self.shortsignature = ', '.join(allargs) - except TypeError: # exotic signature, valid only in Python 2.X - self.shortsignature = self.signature - self.dict = func.__dict__.copy() - # func=None happens when decorating a caller - if name: - self.name = name - if signature is not None: - self.signature = signature - if defaults: - self.defaults = defaults - if doc: - self.doc = doc - if module: - self.module = module - if funcdict: - self.dict = funcdict - # check existence required attributes - assert hasattr(self, 'name') - if not hasattr(self, 'signature'): - raise TypeError('You are decorating a non function: %s' % func) - - def update(self, func, **kw): - "Update the signature of func with the data in self" - func.__name__ = self.name - func.__doc__ = getattr(self, 'doc', None) - func.__dict__ = getattr(self, 'dict', {}) - func.func_defaults = getattr(self, 'defaults', ()) - func.__kwdefaults__ = getattr(self, 'kwonlydefaults', None) - callermodule = sys._getframe(3).f_globals.get('__name__', '?') - func.__module__ = getattr(self, 'module', callermodule) - func.__dict__.update(kw) - - def make(self, src_templ, evaldict=None, addsource=False, **attrs): - "Make a new function from a given template and update the signature" - src = src_templ % vars(self) # expand name and signature - evaldict = evaldict or {} - mo = DEF.match(src) - if mo is None: - raise SyntaxError('not a valid function template\n%s' % src) - name = mo.group(1) # extract the function name - names = set([name] + [arg.strip(' *') for arg in - self.shortsignature.split(',')]) - for n in names: - if n in ('_func_', '_call_'): - raise NameError('%s is overridden in\n%s' % (n, src)) - if not src.endswith('\n'): # add a newline just for safety - src += '\n' # this is needed in old versions of Python - try: - code = compile(src, '<string>', 'single') - # print >> sys.stderr, 'Compiling %s' % src - exec code in evaldict - except: - print >> sys.stderr, 'Error in generated code:' - print >> sys.stderr, src - raise - func = evaldict[name] - if addsource: - attrs['__source__'] = src - self.update(func, **attrs) - return func - - @classmethod - def create(cls, obj, body, evaldict, defaults=None, - doc=None, module=None, addsource=True, **attrs): - """ - Create a function from the strings name, signature and body. - evaldict is the evaluation dictionary. If addsource is true an attribute - __source__ is added to the result. The attributes attrs are added, - if any. - """ - if isinstance(obj, str): # "name(signature)" - name, rest = obj.strip().split('(', 1) - signature = rest[:-1] #strip a right parens - func = None - else: # a function - name = None - signature = None - func = obj - self = cls(func, name, signature, defaults, doc, module) - ibody = '\n'.join(' ' + line for line in body.splitlines()) - return self.make('def %(name)s(%(signature)s):\n' + ibody, - evaldict, addsource, **attrs) - -def decorator(caller, func=None): - """ - decorator(caller) converts a caller function into a decorator; - decorator(caller, func) decorates a function using a caller. - """ - if func is not None: # returns a decorated function - evaldict = func.func_globals.copy() - evaldict['_call_'] = caller - evaldict['_func_'] = func - return FunctionMaker.create( - func, "return _call_(_func_, %(shortsignature)s)", - evaldict, undecorated=func, __wrapped__=func) - else: # returns a decorator - if isinstance(caller, partial): - return partial(decorator, caller) - # otherwise assume caller is a function - first = inspect.getargspec(caller)[0][0] # first arg - evaldict = caller.func_globals.copy() - evaldict['_call_'] = caller - evaldict['decorator'] = decorator - return FunctionMaker.create( - '%s(%s)' % (caller.__name__, first), - 'return decorator(_call_, %s)' % first, - evaldict, undecorated=caller, __wrapped__=caller, - doc=caller.__doc__, module=caller.__module__) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/__init__.py deleted file mode 100644 index 92edd41..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -A package for generating various graphs in networkx. - -""" -from networkx.generators.atlas import * -from networkx.generators.bipartite import * -from networkx.generators.classic import * -from networkx.generators.degree_seq import * -from networkx.generators.directed import * -from networkx.generators.ego import * -from networkx.generators.geometric import * -from networkx.generators.hybrid import * -from networkx.generators.line import * -from networkx.generators.random_graphs import * -from networkx.generators.small import * -from networkx.generators.stochastic import * -from networkx.generators.social import * -from networkx.generators.threshold import * -from networkx.generators.intersection import * -from networkx.generators.random_clustered import * - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/atlas.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/atlas.py deleted file mode 100644 index f3d9c57..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/atlas.py +++ /dev/null @@ -1,12336 +0,0 @@ -""" -Generators for the small graph atlas. - - -See -"An Atlas of Graphs" by Ronald C. Read and Robin J. Wilson, -Oxford University Press, 1998. - -Because of its size, this module is not imported by default. - -""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """Pieter Swart (swart@lanl.gov)""" - -__all__ = ['graph_atlas_g'] - -from networkx.generators.small import make_small_graph - -def graph_atlas_g(): - """ - Return the list [G0,G1,...,G1252] of graphs as named in the Graph Atlas. - G0,G1,...,G1252 are all graphs with up to 7 nodes. - - The graphs are listed: - 1. in increasing order of number of nodes; - 2. for a fixed number of nodes, - in increasing order of the number of edges; - 3. for fixed numbers of nodes and edges, - in increasing order of the degree sequence, - for example 111223 < 112222; - 4. for fixed degree sequence, in increasing number of automorphisms. - - Note that indexing is set up so that for - GAG=graph_atlas_g(), then - G123=GAG[123] and G[0]=empty_graph(0) - - """ - - descr_list=[ - ['edgelist', 'G0', 0, []], - ['edgelist', 'G1', 1, []], - ['edgelist', 'G2', 2, []], - ['edgelist', 'G3', 2, [[1, 2]]], - ['edgelist', 'G4', 3, []], - ['edgelist', 'G5', 3, [[2, 3]]], - ['edgelist', 'G6', 3, [[1, 2], [1, 3]]], - ['edgelist', 'G7', 3, [[1, 2], [1, 3], [2, 3]]], - ['edgelist', 'G8', 4, []], - ['edgelist', 'G9', 4, [[4, 3]]], - ['edgelist', 'G10', 4, [[4, 3], [4, 2]]], - ['edgelist', 'G11', 4, [[1, 2], [4, 3]]], - ['edgelist', 'G12', 4, [[4, 3], [2, 3], [4, 2]]], - ['edgelist', 'G13', 4, [[4, 1], [4, 2], [4, 3]]], - ['edgelist', 'G14', 4, [[1, 2], [2, 3], [1, 4]]], - ['edgelist', 'G15', 4, [[4, 3], [2, 3], [4, 2], [4, 1]]], - ['edgelist', 'G16', 4, [[1, 2], [2, 3], [3, 4], [1, 4]]], - ['edgelist', 'G17', 4, [[1, 2], [1, 3], [1, 4], [2, 3], [3, 4]]], - ['edgelist', 'G18', 4, [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3]]], - ['edgelist', 'G19', 5, []], - ['edgelist', 'G20', 5, [[5, 4]]], - ['edgelist', 'G21', 5, [[2, 3], [1, 2]]], - ['edgelist', 'G22', 5, [[1, 3], [5, 4]]], - ['edgelist', 'G23', 5, [[2, 3], [1, 2], [3, 1]]], - ['edgelist', 'G24', 5, [[5, 4], [4, 3], [4, 2]]], - ['edgelist', 'G25', 5, [[4, 3], [5, 4], [1, 5]]], - ['edgelist', 'G26', 5, [[2, 3], [1, 2], [5, 4]]], - ['edgelist', 'G27', 5, [[5, 4], [2, 3], [4, 2], [4, 3]]], - ['edgelist', 'G28', 5, [[1, 4], [2, 1], [3, 2], [4, 3]]], - ['edgelist', 'G29', 5, [[5, 4], [5, 1], [5, 2], [5, 3]]], - ['edgelist', 'G30', 5, [[5, 1], [4, 2], [5, 4], [4, 3]]], - ['edgelist', 'G31', 5, [[3, 4], [2, 3], [1, 2], [5, 1]]], - ['edgelist', 'G32', 5, [[2, 3], [1, 2], [3, 1], [5, 4]]], - ['edgelist', 'G33', 5, [[1, 4], [3, 1], [4, 3], [2, 1], [3, 2]]], - ['edgelist', 'G34', 5, [[5, 3], [5, 4], [3, 4], [5, 2], [5, 1]]], - ['edgelist', 'G35', 5, [[1, 2], [2, 3], [3, 4], [1, 5], [1, 3]]], - ['edgelist', 'G36', 5, [[5, 1], [2, 3], [5, 4], [4, 3], [4, 2]]], - ['edgelist', 'G37', 5, [[2, 1], [5, 2], [3, 5], [4, 3], [2, 4]]], - ['edgelist', 'G38', 5, [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5]]], - ['edgelist', 'G39', 5, [[2, 1], [5, 2], [5, 1], [1, 4], [2, 4], [4, 5]]], - ['edgelist', 'G40', 5, [[2, 1], [5, 2], [3, 5], [4, 3], [2, 4], [3, 2]]], - ['edgelist', 'G41', 5, [[2, 1], [5, 2], [3, 5], [4, 3], [2, 4], [4, 5]]], - ['edgelist', 'G42', 5, [[1, 2], [5, 4], [3, 4], [5, 3], [5, 1], [5, 2]]], - ['edgelist', 'G43', 5, [[1, 5], [4, 1], [5, 4], [3, 4], [2, 3], [1, 2]]], - ['edgelist', 'G44', 5, [[3, 2], [1, 3], [4, 1], [2, 4], [5, 2], [1, 5]]], - ['edgelist', - 'G45', - 5, - [[5, 1], [2, 3], [5, 4], [4, 3], [4, 2], [5, 2], [3, 5]]], - ['edgelist', - 'G46', - 5, - [[5, 2], [3, 5], [4, 3], [2, 4], [4, 5], [1, 4], [5, 1]]], - ['edgelist', - 'G47', - 5, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2]]], - ['edgelist', - 'G48', - 5, - [[3, 2], [1, 3], [4, 1], [2, 4], [5, 2], [1, 5], [3, 5]]], - ['edgelist', - 'G49', - 5, - [[2, 1], [5, 2], [3, 5], [4, 3], [2, 4], [5, 1], [4, 5], [1, 4]]], - ['edgelist', - 'G50', - 5, - [[1, 2], [2, 3], [3, 4], [1, 4], [5, 1], [5, 2], [5, 3], [5, 4]]], - ['edgelist', - 'G51', - 5, - [[1, 2], [4, 5], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 4], [3, 5]]], - ['edgelist', - 'G52', - 5, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5]]], - ['edgelist', 'G53', 6, []], - ['edgelist', 'G54', 6, [[6, 5]]], - ['edgelist', 'G55', 6, [[1, 4], [6, 5]]], - ['edgelist', 'G56', 6, [[2, 4], [2, 3]]], - ['edgelist', 'G57', 6, [[2, 4], [3, 2], [4, 3]]], - ['edgelist', 'G58', 6, [[1, 4], [6, 1], [5, 1]]], - ['edgelist', 'G59', 6, [[5, 4], [6, 5], [1, 6]]], - ['edgelist', 'G60', 6, [[5, 4], [6, 2], [6, 3]]], - ['edgelist', 'G61', 6, [[2, 3], [4, 1], [6, 5]]], - ['edgelist', 'G62', 6, [[1, 4], [5, 1], [6, 5], [1, 6]]], - ['edgelist', 'G63', 6, [[4, 1], [6, 4], [5, 6], [1, 5]]], - ['edgelist', 'G64', 6, [[6, 2], [6, 4], [6, 3], [1, 6]]], - ['edgelist', 'G65', 6, [[5, 4], [4, 2], [5, 1], [4, 3]]], - ['edgelist', 'G66', 6, [[1, 3], [2, 4], [3, 2], [6, 4]]], - ['edgelist', 'G67', 6, [[2, 4], [3, 2], [4, 3], [1, 6]]], - ['edgelist', 'G68', 6, [[2, 3], [1, 4], [6, 1], [5, 1]]], - ['edgelist', 'G69', 6, [[5, 6], [2, 3], [1, 6], [4, 5]]], - ['edgelist', 'G70', 6, [[1, 3], [5, 1], [4, 2], [6, 4]]], - ['edgelist', 'G71', 6, [[4, 1], [6, 4], [5, 6], [1, 5], [6, 1]]], - ['edgelist', 'G72', 6, [[6, 4], [4, 2], [4, 3], [5, 4], [5, 6]]], - ['edgelist', 'G73', 6, [[6, 4], [6, 5], [3, 4], [4, 5], [1, 5]]], - ['edgelist', 'G74', 6, [[5, 4], [2, 3], [5, 1], [4, 3], [4, 2]]], - ['edgelist', 'G75', 6, [[2, 5], [4, 5], [5, 1], [3, 2], [4, 3]]], - ['edgelist', 'G76', 6, [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5]]], - ['edgelist', 'G77', 6, [[6, 4], [6, 5], [6, 1], [6, 2], [6, 3]]], - ['edgelist', 'G78', 6, [[2, 5], [6, 2], [2, 1], [3, 2], [3, 4]]], - ['edgelist', 'G79', 6, [[1, 2], [4, 5], [1, 3], [4, 1], [6, 4]]], - ['edgelist', 'G80', 6, [[2, 1], [3, 2], [3, 5], [2, 4], [6, 4]]], - ['edgelist', 'G81', 6, [[5, 4], [1, 6], [5, 1], [4, 3], [4, 2]]], - ['edgelist', 'G82', 6, [[2, 3], [1, 2], [5, 6], [2, 4], [3, 4]]], - ['edgelist', 'G83', 6, [[1, 2], [1, 6], [3, 4], [4, 5], [5, 6]]], - ['edgelist', 'G84', 6, [[5, 4], [6, 2], [6, 3], [1, 4], [5, 1]]], - ['edgelist', 'G85', 6, [[2, 3], [4, 1], [6, 4], [5, 6], [1, 5]]], - ['edgelist', 'G86', 6, [[1, 4], [6, 1], [5, 6], [4, 5], [6, 4], [5, 1]]], - ['edgelist', 'G87', 6, [[2, 5], [3, 5], [5, 1], [3, 4], [4, 2], [4, 5]]], - ['edgelist', 'G88', 6, [[2, 5], [3, 5], [5, 1], [3, 2], [4, 2], [3, 4]]], - ['edgelist', 'G89', 6, [[3, 1], [6, 5], [5, 4], [6, 4], [5, 1], [3, 5]]], - ['edgelist', 'G90', 6, [[4, 3], [5, 4], [1, 5], [2, 1], [3, 2], [1, 4]]], - ['edgelist', 'G91', 6, [[5, 2], [4, 2], [5, 3], [4, 3], [3, 1], [2, 1]]], - ['edgelist', 'G92', 6, [[6, 3], [6, 4], [6, 5], [4, 5], [6, 2], [6, 1]]], - ['edgelist', 'G93', 6, [[5, 4], [5, 3], [5, 1], [2, 5], [4, 1], [6, 4]]], - ['edgelist', 'G94', 6, [[5, 4], [4, 6], [6, 5], [6, 2], [4, 3], [5, 1]]], - ['edgelist', 'G95', 6, [[5, 3], [2, 3], [5, 4], [5, 2], [5, 1], [1, 6]]], - ['edgelist', 'G96', 6, [[2, 3], [4, 2], [1, 4], [3, 1], [5, 1], [6, 1]]], - ['edgelist', 'G97', 6, [[3, 1], [5, 3], [2, 5], [3, 2], [4, 2], [6, 4]]], - ['edgelist', 'G98', 6, [[2, 3], [4, 2], [1, 4], [3, 1], [5, 1], [6, 4]]], - ['edgelist', 'G99', 6, [[6, 4], [3, 6], [3, 1], [5, 3], [5, 4], [4, 2]]], - ['edgelist', 'G100', 6, [[1, 3], [4, 5], [2, 1], [6, 4], [5, 6], [4, 1]]], - ['edgelist', 'G101', 6, [[2, 3], [4, 1], [6, 4], [5, 6], [1, 5], [6, 1]]], - ['edgelist', 'G102', 6, [[5, 4], [2, 3], [5, 1], [4, 3], [4, 2], [6, 1]]], - ['edgelist', 'G103', 6, [[2, 5], [3, 5], [5, 1], [1, 6], [4, 2], [3, 4]]], - ['edgelist', 'G104', 6, [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 6]]], - ['edgelist', 'G105', 6, [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6]]], - ['edgelist', 'G106', 6, [[2, 4], [3, 2], [4, 3], [1, 5], [6, 1], [5, 6]]], - ['edgelist', - 'G107', - 6, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [1, 6]]], - ['edgelist', - 'G108', - 6, - [[2, 5], [3, 5], [3, 2], [4, 2], [3, 4], [3, 1], [1, 2]]], - ['edgelist', - 'G109', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2]]], - ['edgelist', - 'G110', - 6, - [[1, 2], [4, 3], [1, 3], [4, 1], [4, 2], [6, 2], [6, 3]]], - ['edgelist', - 'G111', - 6, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [4, 5]]], - ['edgelist', - 'G112', - 6, - [[2, 1], [5, 2], [3, 5], [4, 3], [6, 2], [3, 6], [2, 3]]], - ['edgelist', - 'G113', - 6, - [[1, 5], [3, 1], [2, 3], [4, 2], [6, 4], [4, 1], [3, 4]]], - ['edgelist', - 'G114', - 6, - [[2, 5], [3, 5], [3, 4], [3, 2], [4, 2], [5, 6], [1, 5]]], - ['edgelist', - 'G115', - 6, - [[2, 1], [5, 2], [3, 5], [4, 3], [6, 2], [3, 6], [5, 6]]], - ['edgelist', - 'G116', - 6, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 5]]], - ['edgelist', - 'G117', - 6, - [[1, 6], [5, 1], [6, 5], [1, 3], [4, 1], [4, 3], [1, 2]]], - ['edgelist', - 'G118', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 6], [5, 2]]], - ['edgelist', - 'G119', - 6, - [[1, 2], [5, 1], [2, 5], [1, 3], [4, 1], [4, 3], [4, 6]]], - ['edgelist', - 'G120', - 6, - [[2, 5], [3, 5], [5, 1], [1, 6], [4, 2], [3, 4], [4, 5]]], - ['edgelist', - 'G121', - 6, - [[3, 1], [4, 3], [5, 4], [6, 5], [3, 6], [2, 3], [5, 2]]], - ['edgelist', - 'G122', - 6, - [[2, 6], [1, 2], [5, 1], [4, 5], [3, 4], [2, 3], [1, 4]]], - ['edgelist', - 'G123', - 6, - [[2, 5], [3, 5], [5, 1], [1, 6], [4, 2], [3, 4], [3, 2]]], - ['edgelist', - 'G124', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [1, 3], [6, 2]]], - ['edgelist', - 'G125', - 6, - [[3, 1], [5, 2], [2, 3], [6, 5], [3, 6], [4, 2], [6, 4]]], - ['edgelist', - 'G126', - 6, - [[6, 1], [4, 6], [3, 4], [1, 3], [2, 4], [5, 2], [4, 5]]], - ['edgelist', - 'G127', - 6, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [3, 4]]], - ['edgelist', - 'G128', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 4]]], - ['edgelist', - 'G129', - 6, - [[5, 4], [1, 5], [2, 1], [3, 2], [4, 3], [1, 6], [6, 4]]], - ['edgelist', - 'G130', - 6, - [[2, 3], [1, 2], [3, 1], [4, 1], [5, 4], [6, 5], [4, 6]]], - ['edgelist', - 'G131', - 6, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2]]], - ['edgelist', - 'G132', - 6, - [[1, 2], [2, 3], [3, 4], [1, 4], [5, 1], [5, 2], [5, 3], [5, 4]]], - ['edgelist', - 'G133', - 6, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 1], [1, 5]]], - ['edgelist', - 'G134', - 6, - [[2, 3], [4, 2], [1, 4], [2, 1], [3, 1], [4, 3], [6, 4], [5, 1]]], - ['edgelist', - 'G135', - 6, - [[1, 2], [3, 5], [1, 3], [6, 3], [4, 2], [4, 3], [3, 2], [5, 2]]], - ['edgelist', - 'G136', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [2, 6]]], - ['edgelist', - 'G137', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 5]]], - ['edgelist', - 'G138', - 6, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [3, 2], [6, 2]]], - ['edgelist', - 'G139', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 1]]], - ['edgelist', - 'G140', - 6, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [4, 1], [6, 2]]], - ['edgelist', - 'G141', - 6, - [[3, 1], [4, 3], [5, 4], [6, 5], [3, 6], [2, 3], [5, 2], [6, 4]]], - ['edgelist', - 'G142', - 6, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [1, 6], [6, 5]]], - ['edgelist', - 'G143', - 6, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [6, 2], [6, 4]]], - ['edgelist', - 'G144', - 6, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [4, 5]]], - ['edgelist', - 'G145', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 1], [6, 3], [1, 3]]], - ['edgelist', - 'G146', - 6, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4]]], - ['edgelist', - 'G147', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3]]], - ['edgelist', - 'G148', - 6, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [2, 5], [1, 2]]], - ['edgelist', - 'G149', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1]]], - ['edgelist', - 'G150', - 6, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [3, 2]]], - ['edgelist', - 'G151', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [5, 6], [6, 4], [2, 6]]], - ['edgelist', - 'G152', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 2]]], - ['edgelist', - 'G153', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 6], [6, 3], [6, 1]]], - ['edgelist', - 'G154', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [5, 2], [6, 3]]], - ['edgelist', - 'G155', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [3, 5], [1, 4]]], - ['edgelist', - 'G156', - 6, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [5, 3]]], - ['edgelist', - 'G157', - 6, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [1, 5]]], - ['edgelist', - 'G158', - 6, - [[1, 2], [2, 3], [3, 4], [1, 4], [5, 1], [5, 2], [5, 3], [5, 4], [5, 6]]], - ['edgelist', - 'G159', - 6, - [[3, 1], [5, 2], [2, 3], [6, 5], [3, 6], [4, 2], [6, 4], [4, 3], [5, 4]]], - ['edgelist', - 'G160', - 6, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [5, 6]]], - ['edgelist', - 'G161', - 6, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4], [5, 6]]], - ['edgelist', - 'G162', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [3, 6], [1, 6], [3, 1], [4, 1]]], - ['edgelist', - 'G163', - 6, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [1, 5], [2, 1], [5, 2]]], - ['edgelist', - 'G164', - 6, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [5, 2], [2, 1], [6, 2]]], - ['edgelist', - 'G165', - 6, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 5], [5, 1], [6, 1]]], - ['edgelist', - 'G166', - 6, - [[5, 4], [1, 5], [2, 1], [3, 2], [4, 3], [1, 6], [6, 4], [1, 4], [2, 6]]], - ['edgelist', - 'G167', - 6, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [4, 3], [1, 4], [5, 1]]], - ['edgelist', - 'G168', - 6, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [4, 3], [1, 4], [3, 5]]], - ['edgelist', - 'G169', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [3, 6], [1, 6], [3, 1], [6, 2]]], - ['edgelist', - 'G170', - 6, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4], [3, 1]]], - ['edgelist', - 'G171', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 1], [6, 5], [6, 3], [6, 4]]], - ['edgelist', - 'G172', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [6, 2]]], - ['edgelist', - 'G173', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 4], [5, 3], [6, 3]]], - ['edgelist', - 'G174', - 6, - [[3, 4], [1, 3], [4, 1], [5, 4], [2, 5], [6, 2], [5, 6], [2, 1], [6, 3]]], - ['edgelist', - 'G175', - 6, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 4], [6, 3], [5, 2]]], - ['edgelist', - 'G176', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3]]], - ['edgelist', - 'G177', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [5, 6]]], - ['edgelist', - 'G178', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 6]]], - ['edgelist', - 'G179', - 6, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [2, 1]]], - ['edgelist', - 'G180', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [6, 5], - [4, 6], - [2, 6]]], - ['edgelist', - 'G181', - 6, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [3, 5]]], - ['edgelist', - 'G182', - 6, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3]]], - ['edgelist', - 'G183', - 6, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3]]], - ['edgelist', - 'G184', - 6, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [6, 3]]], - ['edgelist', - 'G185', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2]]], - ['edgelist', - 'G186', - 6, - [[1, 2], - [3, 5], - [1, 3], - [5, 6], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4]]], - ['edgelist', - 'G187', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5]]], - ['edgelist', - 'G188', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [1, 3], - [2, 4], - [6, 2]]], - ['edgelist', - 'G189', - 6, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [4, 3], - [1, 4]]], - ['edgelist', - 'G190', - 6, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [6, 4], - [3, 6], - [2, 1]]], - ['edgelist', - 'G191', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3], - [2, 6]]], - ['edgelist', - 'G192', - 6, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4]]], - ['edgelist', - 'G193', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6]]], - ['edgelist', - 'G194', - 6, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [1, 3]]], - ['edgelist', - 'G195', - 6, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [6, 4], - [3, 6], - [2, 1], - [6, 2]]], - ['edgelist', - 'G196', - 6, - [[2, 4], - [5, 2], - [4, 5], - [3, 4], - [1, 3], - [5, 1], - [6, 5], - [3, 6], - [5, 3], - [1, 6], - [2, 6]]], - ['edgelist', - 'G197', - 6, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2]]], - ['edgelist', - 'G198', - 6, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3]]], - ['edgelist', - 'G199', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [1, 4]]], - ['edgelist', - 'G200', - 6, - [[1, 2], - [2, 3], - [1, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [5, 4]]], - ['edgelist', - 'G201', - 6, - [[4, 3], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [3, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [1, 5]]], - ['edgelist', - 'G202', - 6, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3], - [5, 6]]], - ['edgelist', - 'G203', - 6, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [3, 4]]], - ['edgelist', - 'G204', - 6, - [[1, 2], - [2, 3], - [1, 3], - [4, 3], - [4, 2], - [5, 1], - [3, 5], - [6, 2], - [1, 6], - [5, 6], - [4, 5], - [6, 4]]], - ['edgelist', - 'G205', - 6, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [3, 4], - [1, 5]]], - ['edgelist', - 'G206', - 6, - [[1, 2], - [2, 3], - [1, 3], - [4, 3], - [4, 2], - [5, 1], - [3, 5], - [6, 2], - [1, 6], - [5, 6], - [4, 5], - [6, 4], - [4, 1]]], - ['edgelist', - 'G207', - 6, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [2, 4], - [3, 1], - [5, 1], - [6, 4]]], - ['edgelist', - 'G208', - 6, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [5, 6]]], - ['edgelist', 'G209', 7, []], - ['edgelist', 'G210', 7, [[7, 6]]], - ['edgelist', 'G211', 7, [[3, 4], [2, 3]]], - ['edgelist', 'G212', 7, [[6, 5], [7, 1]]], - ['edgelist', 'G213', 7, [[1, 5], [5, 3], [3, 1]]], - ['edgelist', 'G214', 7, [[1, 2], [1, 7], [1, 6]]], - ['edgelist', 'G215', 7, [[6, 5], [7, 1], [6, 7]]], - ['edgelist', 'G216', 7, [[4, 3], [2, 3], [6, 7]]], - ['edgelist', 'G217', 7, [[4, 2], [6, 7], [1, 5]]], - ['edgelist', 'G218', 7, [[3, 6], [7, 3], [6, 7], [2, 3]]], - ['edgelist', 'G219', 7, [[2, 3], [5, 2], [6, 5], [3, 6]]], - ['edgelist', 'G220', 7, [[2, 1], [6, 2], [2, 3], [5, 2]]], - ['edgelist', 'G221', 7, [[2, 1], [3, 2], [6, 3], [7, 3]]], - ['edgelist', 'G222', 7, [[4, 5], [3, 4], [2, 3], [1, 2]]], - ['edgelist', 'G223', 7, [[5, 3], [1, 5], [3, 1], [6, 7]]], - ['edgelist', 'G224', 7, [[1, 2], [7, 1], [1, 6], [5, 3]]], - ['edgelist', 'G225', 7, [[4, 2], [6, 5], [7, 6], [1, 7]]], - ['edgelist', 'G226', 7, [[1, 5], [4, 1], [3, 6], [7, 3]]], - ['edgelist', 'G227', 7, [[3, 4], [2, 3], [7, 1], [6, 5]]], - ['edgelist', 'G228', 7, [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1]]], - ['edgelist', 'G229', 7, [[3, 6], [7, 3], [6, 7], [5, 3], [4, 3]]], - ['edgelist', 'G230', 7, [[5, 3], [5, 1], [3, 1], [6, 5], [7, 1]]], - ['edgelist', 'G231', 7, [[3, 6], [7, 3], [6, 7], [2, 3], [1, 2]]], - ['edgelist', 'G232', 7, [[5, 2], [1, 5], [4, 1], [2, 4], [3, 2]]], - ['edgelist', 'G233', 7, [[2, 3], [1, 2], [5, 1], [4, 5], [3, 4]]], - ['edgelist', 'G234', 7, [[6, 2], [6, 1], [3, 6], [4, 6], [5, 6]]], - ['edgelist', 'G235', 7, [[2, 6], [7, 2], [2, 1], [3, 2], [4, 3]]], - ['edgelist', 'G236', 7, [[2, 6], [5, 2], [3, 4], [7, 3], [3, 2]]], - ['edgelist', 'G237', 7, [[2, 6], [7, 2], [2, 3], [3, 4], [5, 4]]], - ['edgelist', 'G238', 7, [[3, 2], [4, 3], [5, 4], [6, 5], [4, 7]]], - ['edgelist', 'G239', 7, [[7, 6], [3, 7], [2, 3], [6, 3], [4, 5]]], - ['edgelist', 'G240', 7, [[5, 4], [6, 5], [7, 6], [1, 7], [2, 1]]], - ['edgelist', 'G241', 7, [[1, 5], [4, 1], [3, 6], [7, 3], [6, 7]]], - ['edgelist', 'G242', 7, [[5, 2], [6, 3], [7, 6], [4, 7], [3, 4]]], - ['edgelist', 'G243', 7, [[2, 5], [4, 2], [2, 1], [3, 2], [7, 6]]], - ['edgelist', 'G244', 7, [[1, 5], [4, 1], [2, 1], [3, 2], [7, 6]]], - ['edgelist', 'G245', 7, [[1, 5], [4, 1], [3, 2], [6, 3], [7, 3]]], - ['edgelist', 'G246', 7, [[7, 6], [4, 5], [3, 4], [2, 3], [1, 2]]], - ['edgelist', 'G247', 7, [[3, 4], [2, 3], [7, 1], [6, 7], [6, 5]]], - ['edgelist', 'G248', 7, [[1, 2], [5, 7], [6, 5], [4, 3], [7, 6]]], - ['edgelist', 'G249', 7, [[2, 6], [7, 2], [6, 7], [3, 6], [2, 3], [7, 3]]], - ['edgelist', 'G250', 7, [[2, 5], [4, 2], [3, 4], [5, 3], [2, 1], [3, 2]]], - ['edgelist', 'G251', 7, [[1, 5], [4, 1], [2, 4], [3, 2], [2, 5], [4, 5]]], - ['edgelist', 'G252', 7, [[6, 3], [5, 6], [3, 5], [4, 3], [7, 4], [3, 7]]], - ['edgelist', 'G253', 7, [[2, 3], [5, 2], [6, 5], [3, 6], [1, 2], [5, 1]]], - ['edgelist', 'G254', 7, [[2, 3], [6, 2], [5, 6], [3, 5], [1, 3], [6, 1]]], - ['edgelist', 'G255', 7, [[3, 6], [7, 3], [6, 7], [3, 5], [2, 3], [4, 3]]], - ['edgelist', 'G256', 7, [[2, 5], [4, 2], [3, 4], [2, 3], [3, 6], [7, 3]]], - ['edgelist', 'G257', 7, [[6, 5], [7, 6], [2, 7], [6, 2], [4, 7], [1, 2]]], - ['edgelist', 'G258', 7, [[7, 6], [2, 7], [6, 2], [4, 2], [1, 4], [2, 5]]], - ['edgelist', 'G259', 7, [[1, 5], [4, 1], [3, 4], [5, 3], [3, 6], [7, 3]]], - ['edgelist', 'G260', 7, [[2, 5], [4, 2], [3, 4], [2, 3], [3, 6], [7, 6]]], - ['edgelist', 'G261', 7, [[3, 4], [2, 3], [4, 7], [6, 5], [7, 6], [6, 3]]], - ['edgelist', 'G262', 7, [[3, 6], [7, 3], [6, 7], [2, 5], [4, 2], [3, 2]]], - ['edgelist', 'G263', 7, [[5, 6], [1, 5], [4, 1], [3, 4], [5, 3], [7, 4]]], - ['edgelist', 'G264', 7, [[1, 5], [4, 1], [2, 4], [7, 6], [2, 5], [2, 1]]], - ['edgelist', 'G265', 7, [[2, 5], [4, 2], [3, 4], [6, 3], [7, 6], [3, 7]]], - ['edgelist', 'G266', 7, [[7, 4], [6, 7], [5, 6], [2, 5], [3, 2], [6, 3]]], - ['edgelist', 'G267', 7, [[2, 1], [4, 2], [7, 4], [6, 7], [5, 6], [2, 5]]], - ['edgelist', 'G268', 7, [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6]]], - ['edgelist', 'G269', 7, [[1, 5], [4, 1], [5, 4], [3, 6], [7, 3], [6, 7]]], - ['edgelist', 'G270', 7, [[7, 4], [1, 7], [7, 3], [6, 7], [7, 2], [5, 7]]], - ['edgelist', 'G271', 7, [[3, 5], [6, 3], [3, 4], [7, 3], [2, 3], [2, 1]]], - ['edgelist', 'G272', 7, [[2, 1], [3, 2], [6, 3], [2, 5], [4, 2], [7, 3]]], - ['edgelist', 'G273', 7, [[2, 1], [3, 2], [4, 7], [2, 4], [5, 2], [6, 5]]], - ['edgelist', 'G274', 7, [[2, 1], [3, 2], [6, 3], [7, 6], [2, 5], [4, 2]]], - ['edgelist', 'G275', 7, [[2, 1], [3, 5], [6, 3], [7, 6], [3, 7], [4, 3]]], - ['edgelist', 'G276', 7, [[5, 1], [2, 5], [4, 2], [3, 2], [6, 3], [7, 3]]], - ['edgelist', 'G277', 7, [[7, 6], [2, 3], [1, 2], [3, 1], [4, 3], [1, 5]]], - ['edgelist', 'G278', 7, [[1, 5], [4, 1], [2, 1], [3, 2], [6, 3], [7, 3]]], - ['edgelist', 'G279', 7, [[2, 1], [4, 2], [7, 4], [3, 7], [5, 2], [6, 5]]], - ['edgelist', 'G280', 7, [[3, 6], [7, 3], [5, 3], [2, 5], [4, 2], [1, 4]]], - ['edgelist', 'G281', 7, [[1, 5], [4, 1], [3, 4], [5, 3], [2, 3], [7, 6]]], - ['edgelist', 'G282', 7, [[1, 5], [4, 1], [3, 2], [6, 3], [7, 6], [3, 7]]], - ['edgelist', 'G283', 7, [[4, 5], [2, 1], [3, 2], [6, 3], [7, 6], [3, 7]]], - ['edgelist', 'G284', 7, [[5, 6], [1, 5], [4, 1], [7, 4], [2, 1], [3, 2]]], - ['edgelist', 'G285', 7, [[3, 6], [7, 3], [6, 7], [2, 5], [4, 2], [2, 1]]], - ['edgelist', 'G286', 7, [[5, 6], [4, 5], [3, 4], [2, 3], [1, 2], [7, 1]]], - ['edgelist', 'G287', 7, [[7, 5], [6, 7], [5, 6], [3, 4], [2, 3], [1, 2]]], - ['edgelist', 'G288', 7, [[1, 2], [5, 1], [3, 4], [6, 3], [7, 6], [4, 7]]], - ['edgelist', 'G289', 7, [[2, 3], [1, 2], [5, 1], [4, 5], [3, 4], [7, 6]]], - ['edgelist', - 'G290', - 7, - [[2, 5], [4, 2], [3, 4], [5, 3], [2, 1], [3, 2], [4, 5]]], - ['edgelist', - 'G291', - 7, - [[2, 3], [6, 2], [5, 6], [3, 5], [1, 3], [6, 1], [6, 3]]], - ['edgelist', - 'G292', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2]]], - ['edgelist', - 'G293', - 7, - [[2, 3], [6, 2], [5, 6], [3, 5], [1, 3], [6, 1], [2, 1]]], - ['edgelist', - 'G294', - 7, - [[1, 5], [4, 1], [3, 4], [5, 3], [3, 6], [7, 3], [3, 1]]], - ['edgelist', - 'G295', - 7, - [[2, 5], [4, 2], [3, 4], [5, 3], [2, 1], [3, 2], [3, 7]]], - ['edgelist', - 'G296', - 7, - [[2, 5], [4, 2], [3, 4], [5, 3], [2, 1], [4, 5], [7, 4]]], - ['edgelist', - 'G297', - 7, - [[1, 5], [4, 1], [3, 4], [5, 3], [3, 6], [7, 3], [4, 5]]], - ['edgelist', - 'G298', - 7, - [[1, 5], [4, 1], [2, 4], [4, 7], [2, 5], [2, 1], [6, 5]]], - ['edgelist', - 'G299', - 7, - [[1, 5], [4, 1], [2, 4], [7, 6], [2, 5], [2, 1], [4, 5]]], - ['edgelist', - 'G300', - 7, - [[6, 3], [5, 6], [3, 5], [4, 3], [7, 4], [3, 7], [3, 2]]], - ['edgelist', - 'G301', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [1, 3], [3, 6]]], - ['edgelist', - 'G302', - 7, - [[6, 3], [5, 6], [3, 5], [4, 3], [7, 4], [3, 7], [4, 2]]], - ['edgelist', - 'G303', - 7, - [[2, 5], [4, 2], [3, 4], [5, 3], [3, 1], [3, 2], [7, 1]]], - ['edgelist', - 'G304', - 7, - [[2, 3], [6, 2], [5, 6], [3, 5], [1, 3], [6, 1], [4, 6]]], - ['edgelist', - 'G305', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [1, 3], [4, 6]]], - ['edgelist', - 'G306', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [1, 3], [2, 6]]], - ['edgelist', - 'G307', - 7, - [[4, 3], [5, 4], [4, 6], [3, 5], [6, 3], [7, 2], [7, 5]]], - ['edgelist', - 'G308', - 7, - [[2, 3], [6, 2], [5, 6], [3, 5], [1, 3], [6, 1], [1, 4]]], - ['edgelist', - 'G309', - 7, - [[4, 5], [2, 4], [3, 2], [7, 3], [6, 7], [2, 6], [5, 2]]], - ['edgelist', - 'G310', - 7, - [[1, 2], [5, 1], [2, 5], [3, 2], [4, 3], [6, 4], [5, 6]]], - ['edgelist', - 'G311', - 7, - [[7, 4], [6, 7], [2, 6], [3, 2], [4, 3], [5, 3], [6, 5]]], - ['edgelist', - 'G312', - 7, - [[2, 3], [5, 2], [6, 5], [7, 6], [4, 7], [3, 4], [6, 3]]], - ['edgelist', - 'G313', - 7, - [[5, 2], [4, 5], [2, 4], [3, 2], [7, 3], [6, 7], [3, 6]]], - ['edgelist', - 'G314', - 7, - [[4, 1], [7, 4], [1, 7], [2, 1], [1, 3], [6, 1], [1, 5]]], - ['edgelist', - 'G315', - 7, - [[2, 6], [7, 2], [2, 3], [4, 2], [5, 4], [2, 5], [5, 1]]], - ['edgelist', - 'G316', - 7, - [[6, 1], [7, 6], [1, 7], [6, 3], [2, 6], [7, 4], [5, 7]]], - ['edgelist', - 'G317', - 7, - [[5, 2], [1, 5], [2, 1], [3, 2], [1, 4], [7, 1], [5, 6]]], - ['edgelist', - 'G318', - 7, - [[6, 3], [7, 6], [3, 7], [3, 5], [4, 3], [2, 1], [3, 2]]], - ['edgelist', - 'G319', - 7, - [[5, 2], [1, 5], [4, 1], [2, 4], [3, 2], [2, 6], [7, 2]]], - ['edgelist', - 'G320', - 7, - [[2, 1], [5, 2], [1, 5], [6, 5], [3, 2], [4, 3], [7, 2]]], - ['edgelist', - 'G321', - 7, - [[1, 2], [5, 1], [2, 5], [3, 2], [4, 3], [6, 5], [7, 5]]], - ['edgelist', - 'G322', - 7, - [[3, 4], [6, 3], [7, 6], [4, 7], [2, 3], [5, 6], [1, 6]]], - ['edgelist', - 'G323', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [3, 2], [7, 6]]], - ['edgelist', - 'G324', - 7, - [[3, 6], [7, 3], [6, 7], [5, 3], [2, 3], [1, 2], [4, 2]]], - ['edgelist', - 'G325', - 7, - [[3, 6], [7, 3], [5, 3], [2, 5], [4, 2], [3, 4], [1, 2]]], - ['edgelist', - 'G326', - 7, - [[7, 3], [6, 7], [3, 6], [2, 3], [1, 2], [5, 2], [4, 2]]], - ['edgelist', - 'G327', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [6, 5], [3, 2], [7, 4]]], - ['edgelist', - 'G328', - 7, - [[3, 6], [7, 3], [6, 7], [5, 6], [4, 7], [2, 3], [1, 2]]], - ['edgelist', - 'G329', - 7, - [[3, 6], [7, 3], [2, 5], [2, 3], [1, 2], [5, 1], [1, 4]]], - ['edgelist', - 'G330', - 7, - [[7, 6], [2, 3], [5, 2], [1, 5], [4, 1], [2, 4], [4, 5]]], - ['edgelist', - 'G331', - 7, - [[5, 2], [1, 5], [2, 1], [4, 7], [3, 4], [1, 3], [6, 1]]], - ['edgelist', - 'G332', - 7, - [[5, 2], [1, 5], [4, 1], [2, 4], [3, 2], [6, 3], [7, 2]]], - ['edgelist', - 'G333', - 7, - [[5, 2], [1, 5], [2, 1], [3, 4], [1, 3], [6, 1], [7, 6]]], - ['edgelist', - 'G334', - 7, - [[1, 2], [6, 1], [7, 6], [4, 7], [3, 4], [1, 3], [5, 1]]], - ['edgelist', - 'G335', - 7, - [[2, 1], [5, 2], [3, 5], [4, 3], [5, 4], [1, 5], [7, 6]]], - ['edgelist', - 'G336', - 7, - [[4, 7], [3, 4], [2, 3], [1, 2], [5, 1], [2, 5], [6, 5]]], - ['edgelist', - 'G337', - 7, - [[2, 1], [6, 2], [7, 6], [3, 7], [2, 3], [4, 3], [5, 4]]], - ['edgelist', - 'G338', - 7, - [[3, 4], [2, 3], [1, 2], [5, 1], [6, 5], [7, 6], [5, 2]]], - ['edgelist', - 'G339', - 7, - [[6, 3], [7, 6], [3, 7], [2, 3], [5, 2], [1, 5], [4, 2]]], - ['edgelist', - 'G340', - 7, - [[3, 4], [2, 3], [1, 2], [5, 1], [6, 5], [7, 6], [6, 3]]], - ['edgelist', - 'G341', - 7, - [[2, 5], [1, 2], [3, 1], [4, 3], [6, 4], [1, 6], [7, 4]]], - ['edgelist', - 'G342', - 7, - [[3, 2], [4, 3], [7, 4], [6, 7], [1, 6], [3, 1], [6, 5]]], - ['edgelist', - 'G343', - 7, - [[6, 3], [7, 6], [3, 7], [2, 3], [1, 2], [5, 1], [4, 1]]], - ['edgelist', - 'G344', - 7, - [[5, 2], [1, 5], [4, 1], [2, 4], [3, 2], [6, 3], [7, 3]]], - ['edgelist', - 'G345', - 7, - [[2, 1], [3, 2], [6, 3], [5, 6], [1, 5], [5, 2], [7, 4]]], - ['edgelist', - 'G346', - 7, - [[3, 6], [7, 3], [1, 5], [4, 1], [2, 4], [5, 2], [2, 1]]], - ['edgelist', - 'G347', - 7, - [[7, 6], [1, 5], [4, 1], [2, 4], [5, 2], [3, 5], [4, 3]]], - ['edgelist', - 'G348', - 7, - [[3, 2], [6, 3], [5, 6], [1, 5], [4, 1], [7, 4], [3, 7]]], - ['edgelist', - 'G349', - 7, - [[5, 1], [4, 5], [2, 4], [3, 2], [6, 3], [7, 6], [3, 7]]], - ['edgelist', - 'G350', - 7, - [[7, 6], [3, 7], [2, 3], [5, 2], [1, 5], [4, 1], [2, 4]]], - ['edgelist', - 'G351', - 7, - [[5, 2], [1, 5], [3, 1], [4, 3], [7, 4], [6, 7], [1, 6]]], - ['edgelist', - 'G352', - 7, - [[1, 5], [4, 1], [5, 4], [3, 2], [6, 3], [7, 6], [3, 7]]], - ['edgelist', - 'G353', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [1, 7]]], - ['edgelist', - 'G354', - 7, - [[2, 1], [5, 2], [1, 5], [6, 3], [7, 6], [4, 7], [3, 4]]], - ['edgelist', - 'G355', - 7, - [[1, 2], [5, 1], [6, 5], [3, 6], [2, 3], [6, 2], [5, 2], [3, 5]]], - ['edgelist', - 'G356', - 7, - [[5, 2], [6, 5], [3, 6], [2, 3], [1, 2], [6, 1], [1, 5], [3, 1]]], - ['edgelist', - 'G357', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [4, 5], [6, 2], [7, 2]]], - ['edgelist', - 'G358', - 7, - [[5, 2], [6, 5], [3, 6], [2, 3], [6, 2], [7, 6], [3, 5], [4, 3]]], - ['edgelist', - 'G359', - 7, - [[2, 4], [1, 2], [5, 1], [3, 5], [2, 3], [5, 2], [6, 5], [2, 6]]], - ['edgelist', - 'G360', - 7, - [[3, 1], [4, 3], [7, 4], [6, 7], [1, 6], [4, 1], [1, 7], [5, 1]]], - ['edgelist', - 'G361', - 7, - [[2, 1], [3, 2], [6, 3], [5, 6], [1, 5], [3, 1], [6, 1], [7, 6]]], - ['edgelist', - 'G362', - 7, - [[2, 1], [3, 2], [4, 3], [2, 4], [5, 4], [3, 5], [6, 3], [4, 6]]], - ['edgelist', - 'G363', - 7, - [[3, 1], [4, 3], [7, 4], [6, 7], [1, 6], [4, 1], [7, 1], [5, 6]]], - ['edgelist', - 'G364', - 7, - [[2, 1], [3, 2], [5, 4], [2, 6], [5, 2], [3, 5], [6, 3], [4, 6]]], - ['edgelist', - 'G365', - 7, - [[4, 6], [3, 2], [5, 4], [2, 6], [5, 2], [3, 5], [6, 3], [5, 7]]], - ['edgelist', - 'G366', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [4, 5], [3, 2], [6, 3]]], - ['edgelist', - 'G367', - 7, - [[4, 6], [3, 2], [5, 4], [2, 6], [5, 2], [3, 5], [6, 3], [1, 4]]], - ['edgelist', - 'G368', - 7, - [[5, 1], [3, 5], [1, 3], [4, 1], [3, 4], [6, 3], [7, 6], [3, 7]]], - ['edgelist', - 'G369', - 7, - [[4, 3], [7, 4], [6, 7], [3, 6], [1, 3], [6, 1], [5, 6], [3, 5]]], - ['edgelist', - 'G370', - 7, - [[1, 6], [5, 1], [3, 5], [6, 3], [2, 6], [5, 2], [4, 5], [6, 4]]], - ['edgelist', - 'G371', - 7, - [[3, 4], [2, 3], [5, 2], [6, 5], [2, 6], [6, 3], [7, 6], [4, 7]]], - ['edgelist', - 'G372', - 7, - [[6, 3], [5, 6], [1, 5], [4, 1], [7, 4], [3, 7], [5, 3], [4, 3]]], - ['edgelist', - 'G373', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [3, 5], [4, 3], [6, 5], [3, 6]]], - ['edgelist', - 'G374', - 7, - [[6, 7], [3, 6], [7, 3], [4, 3], [5, 4], [1, 5], [4, 1], [3, 5]]], - ['edgelist', - 'G375', - 7, - [[2, 1], [6, 1], [4, 3], [2, 4], [6, 3], [7, 2], [7, 3], [7, 6]]], - ['edgelist', - 'G376', - 7, - [[6, 5], [7, 6], [4, 7], [1, 4], [5, 1], [3, 5], [4, 3], [1, 3]]], - ['edgelist', - 'G377', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [5, 3], [2, 6]]], - ['edgelist', - 'G378', - 7, - [[6, 1], [7, 3], [1, 7], [2, 1], [3, 2], [6, 3], [5, 6], [5, 7]]], - ['edgelist', - 'G379', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [3, 2], [2, 6], [7, 2]]], - ['edgelist', - 'G380', - 7, - [[1, 3], [5, 1], [2, 5], [1, 2], [4, 1], [2, 4], [6, 2], [7, 2]]], - ['edgelist', - 'G381', - 7, - [[5, 3], [1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [2, 6], [7, 2]]], - ['edgelist', - 'G382', - 7, - [[1, 5], [4, 1], [5, 4], [2, 5], [4, 2], [2, 6], [3, 2], [7, 2]]], - ['edgelist', - 'G383', - 7, - [[3, 2], [1, 3], [4, 1], [6, 4], [3, 6], [4, 3], [5, 4], [7, 6]]], - ['edgelist', - 'G384', - 7, - [[5, 3], [1, 5], [4, 1], [2, 4], [5, 2], [4, 5], [2, 6], [7, 2]]], - ['edgelist', - 'G385', - 7, - [[3, 2], [1, 3], [4, 1], [6, 4], [3, 6], [7, 6], [5, 4], [6, 1]]], - ['edgelist', - 'G386', - 7, - [[2, 1], [3, 2], [4, 3], [2, 4], [5, 3], [4, 5], [5, 6], [7, 5]]], - ['edgelist', - 'G387', - 7, - [[7, 6], [2, 3], [5, 2], [1, 5], [4, 1], [2, 4], [1, 2], [4, 5]]], - ['edgelist', - 'G388', - 7, - [[1, 2], [7, 6], [3, 4], [7, 5], [7, 4], [7, 3], [7, 1], [7, 2]]], - ['edgelist', - 'G389', - 7, - [[7, 5], [2, 3], [3, 4], [7, 6], [5, 6], [7, 3], [7, 1], [7, 2]]], - ['edgelist', - 'G390', - 7, - [[1, 2], [2, 3], [3, 4], [7, 6], [7, 5], [7, 4], [7, 1], [7, 3]]], - ['edgelist', - 'G391', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [7, 2], [6, 2], [3, 6]]], - ['edgelist', - 'G392', - 7, - [[4, 1], [3, 4], [5, 3], [1, 5], [2, 1], [3, 2], [6, 3], [7, 3]]], - ['edgelist', - 'G393', - 7, - [[3, 2], [4, 3], [7, 4], [6, 7], [1, 6], [3, 1], [6, 3], [5, 6]]], - ['edgelist', - 'G394', - 7, - [[2, 1], [3, 2], [4, 3], [5, 4], [6, 3], [2, 6], [7, 2], [3, 7]]], - ['edgelist', - 'G395', - 7, - [[3, 6], [5, 3], [2, 5], [4, 2], [1, 4], [2, 1], [3, 2], [7, 3]]], - ['edgelist', - 'G396', - 7, - [[5, 6], [1, 5], [4, 1], [3, 4], [5, 3], [2, 5], [4, 2], [7, 4]]], - ['edgelist', - 'G397', - 7, - [[1, 2], [5, 1], [2, 5], [3, 2], [5, 3], [6, 5], [2, 6], [7, 4]]], - ['edgelist', - 'G398', - 7, - [[1, 2], [3, 1], [4, 3], [5, 4], [2, 5], [3, 2], [2, 7], [6, 1]]], - ['edgelist', - 'G399', - 7, - [[5, 6], [1, 5], [2, 1], [5, 2], [4, 1], [2, 4], [7, 2], [3, 7]]], - ['edgelist', - 'G400', - 7, - [[3, 6], [5, 3], [1, 5], [2, 1], [5, 2], [4, 1], [2, 4], [7, 2]]], - ['edgelist', - 'G401', - 7, - [[2, 7], [3, 2], [1, 3], [2, 1], [5, 2], [4, 5], [3, 4], [5, 6]]], - ['edgelist', - 'G402', - 7, - [[1, 2], [3, 1], [4, 3], [5, 4], [2, 5], [3, 2], [2, 7], [6, 4]]], - ['edgelist', - 'G403', - 7, - [[1, 5], [4, 1], [5, 4], [2, 5], [4, 2], [6, 2], [7, 3], [2, 7]]], - ['edgelist', - 'G404', - 7, - [[3, 4], [2, 3], [1, 2], [6, 1], [5, 6], [1, 5], [3, 1], [7, 6]]], - ['edgelist', - 'G405', - 7, - [[5, 6], [1, 5], [4, 1], [2, 4], [5, 2], [3, 5], [4, 3], [7, 3]]], - ['edgelist', - 'G406', - 7, - [[3, 4], [2, 3], [1, 2], [5, 1], [6, 5], [5, 2], [3, 7], [6, 3]]], - ['edgelist', - 'G407', - 7, - [[1, 2], [2, 3], [3, 4], [7, 4], [5, 6], [7, 3], [7, 1], [7, 2]]], - ['edgelist', - 'G408', - 7, - [[5, 2], [1, 5], [4, 1], [2, 4], [1, 2], [3, 2], [6, 3], [7, 3]]], - ['edgelist', - 'G409', - 7, - [[1, 2], [2, 3], [3, 4], [7, 6], [5, 6], [7, 3], [7, 5], [7, 2]]], - ['edgelist', - 'G410', - 7, - [[1, 2], [5, 1], [1, 3], [6, 1], [7, 6], [4, 7], [3, 4], [6, 3]]], - ['edgelist', - 'G411', - 7, - [[1, 5], [4, 1], [3, 4], [5, 3], [2, 5], [4, 2], [3, 6], [7, 3]]], - ['edgelist', - 'G412', - 7, - [[5, 6], [4, 5], [2, 4], [3, 2], [7, 3], [5, 7], [4, 3], [1, 2]]], - ['edgelist', - 'G413', - 7, - [[2, 1], [3, 7], [4, 3], [5, 4], [6, 3], [2, 6], [7, 2], [7, 6]]], - ['edgelist', - 'G414', - 7, - [[3, 4], [2, 3], [1, 2], [5, 1], [6, 5], [7, 6], [6, 3], [5, 2]]], - ['edgelist', - 'G415', - 7, - [[5, 2], [1, 5], [4, 1], [2, 4], [4, 5], [3, 2], [3, 6], [7, 3]]], - ['edgelist', - 'G416', - 7, - [[1, 7], [5, 1], [2, 5], [4, 2], [1, 4], [3, 5], [4, 3], [6, 3]]], - ['edgelist', - 'G417', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [3, 5], [4, 3], [2, 1], [7, 6]]], - ['edgelist', - 'G418', - 7, - [[1, 2], [5, 1], [4, 3], [7, 4], [6, 7], [3, 6], [7, 3], [4, 6]]], - ['edgelist', - 'G419', - 7, - [[6, 3], [7, 6], [3, 7], [5, 3], [1, 5], [4, 1], [3, 4], [2, 3]]], - ['edgelist', - 'G420', - 7, - [[3, 1], [2, 3], [1, 2], [6, 1], [5, 6], [1, 5], [7, 1], [4, 7]]], - ['edgelist', - 'G421', - 7, - [[1, 2], [3, 1], [4, 3], [3, 2], [2, 5], [6, 5], [6, 4], [2, 7]]], - ['edgelist', - 'G422', - 7, - [[2, 7], [3, 2], [1, 3], [2, 1], [5, 2], [4, 5], [3, 4], [6, 7]]], - ['edgelist', - 'G423', - 7, - [[7, 2], [1, 7], [2, 1], [6, 2], [1, 6], [3, 2], [4, 3], [5, 4]]], - ['edgelist', - 'G424', - 7, - [[7, 6], [3, 7], [2, 3], [5, 2], [4, 5], [1, 4], [5, 1], [3, 5]]], - ['edgelist', - 'G425', - 7, - [[2, 7], [1, 2], [6, 1], [2, 6], [4, 1], [5, 4], [3, 5], [1, 3]]], - ['edgelist', - 'G426', - 7, - [[3, 7], [5, 3], [1, 5], [2, 1], [5, 2], [4, 5], [6, 4], [3, 6]]], - ['edgelist', - 'G427', - 7, - [[2, 1], [3, 2], [7, 3], [6, 7], [2, 6], [5, 2], [4, 5], [3, 4]]], - ['edgelist', - 'G428', - 7, - [[7, 2], [5, 4], [2, 1], [6, 2], [4, 3], [3, 2], [5, 7], [6, 5]]], - ['edgelist', - 'G429', - 7, - [[5, 3], [1, 5], [2, 1], [5, 2], [4, 5], [7, 4], [6, 7], [4, 6]]], - ['edgelist', - 'G430', - 7, - [[5, 2], [3, 5], [1, 3], [7, 1], [4, 7], [1, 4], [6, 1], [5, 6]]], - ['edgelist', - 'G431', - 7, - [[6, 7], [5, 6], [1, 5], [4, 1], [3, 4], [5, 3], [2, 5], [4, 2]]], - ['edgelist', - 'G432', - 7, - [[7, 4], [6, 7], [5, 6], [1, 5], [2, 1], [3, 2], [6, 3], [5, 2]]], - ['edgelist', - 'G433', - 7, - [[1, 2], [3, 1], [4, 3], [3, 2], [2, 5], [6, 5], [6, 4], [5, 7]]], - ['edgelist', - 'G434', - 7, - [[5, 1], [4, 5], [3, 4], [7, 3], [6, 7], [2, 6], [5, 2], [3, 2]]], - ['edgelist', - 'G435', - 7, - [[7, 2], [1, 7], [5, 4], [6, 2], [1, 6], [3, 2], [4, 3], [6, 7]]], - ['edgelist', - 'G436', - 7, - [[7, 3], [6, 7], [4, 6], [7, 4], [5, 4], [1, 5], [2, 1], [5, 2]]], - ['edgelist', - 'G437', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 7], [6, 2]]], - ['edgelist', - 'G438', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 7], [5, 3]]], - ['edgelist', - 'G439', - 7, - [[1, 2], [3, 1], [4, 3], [5, 4], [2, 5], [3, 2], [6, 7], [1, 6]]], - ['edgelist', - 'G440', - 7, - [[5, 1], [3, 5], [4, 3], [7, 4], [6, 7], [5, 6], [2, 3], [6, 2]]], - ['edgelist', - 'G441', - 7, - [[6, 2], [3, 5], [4, 3], [1, 4], [6, 1], [5, 6], [2, 3], [1, 7]]], - ['edgelist', - 'G442', - 7, - [[6, 7], [3, 6], [5, 3], [1, 5], [4, 1], [3, 4], [2, 5], [4, 2]]], - ['edgelist', - 'G443', - 7, - [[1, 5], [2, 1], [5, 2], [4, 5], [6, 4], [7, 6], [3, 7], [5, 3]]], - ['edgelist', - 'G444', - 7, - [[1, 2], [7, 6], [3, 4], [4, 5], [7, 5], [1, 6], [7, 3], [7, 2]]], - ['edgelist', - 'G445', - 7, - [[2, 3], [1, 2], [5, 1], [6, 5], [3, 6], [4, 3], [7, 4], [6, 7]]], - ['edgelist', - 'G446', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 7], [2, 7]]], - ['edgelist', - 'G447', - 7, - [[7, 3], [6, 7], [3, 6], [2, 3], [5, 2], [1, 5], [4, 1], [2, 4]]], - ['edgelist', - 'G448', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [7, 6], [7, 2]]], - ['edgelist', - 'G449', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [7, 1], [7, 4]]], - ['edgelist', - 'G450', - 7, - [[1, 5], [2, 1], [4, 3], [2, 5], [3, 6], [6, 4], [7, 5], [7, 4]]], - ['edgelist', - 'G451', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [2, 1], [7, 3], [6, 7], [3, 6]]], - ['edgelist', - 'G452', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [3, 5], [1, 4]]], - ['edgelist', - 'G453', - 7, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [5, 3]]], - ['edgelist', - 'G454', - 7, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [1, 5]]], - ['edgelist', - 'G455', - 7, - [[1, 2], [2, 3], [3, 4], [1, 4], [5, 1], [5, 2], [5, 3], [5, 4], [5, 6]]], - ['edgelist', - 'G456', - 7, - [[3, 1], [5, 2], [2, 3], [6, 5], [3, 6], [4, 2], [6, 4], [4, 3], [5, 4]]], - ['edgelist', - 'G457', - 7, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [5, 6]]], - ['edgelist', - 'G458', - 7, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4], [5, 6]]], - ['edgelist', - 'G459', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [3, 6], [1, 6], [3, 1], [4, 1]]], - ['edgelist', - 'G460', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [1, 5], [2, 1], [5, 2]]], - ['edgelist', - 'G461', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [5, 2], [2, 1], [6, 2]]], - ['edgelist', - 'G462', - 7, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 5], [5, 1], [6, 1]]], - ['edgelist', - 'G463', - 7, - [[5, 4], [1, 5], [2, 1], [3, 2], [4, 3], [1, 6], [6, 4], [1, 4], [2, 6]]], - ['edgelist', - 'G464', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [4, 3], [1, 4], [5, 1]]], - ['edgelist', - 'G465', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [5, 6], [4, 5], [4, 3], [1, 4], [3, 5]]], - ['edgelist', - 'G466', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [3, 6], [1, 6], [3, 1], [6, 2]]], - ['edgelist', - 'G467', - 7, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4], [3, 1]]], - ['edgelist', - 'G468', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 1], [6, 5], [6, 3], [6, 4]]], - ['edgelist', - 'G469', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [6, 2]]], - ['edgelist', - 'G470', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 4], [5, 3], [6, 3]]], - ['edgelist', - 'G471', - 7, - [[3, 4], [1, 3], [4, 1], [5, 4], [2, 5], [6, 2], [5, 6], [2, 1], [6, 3]]], - ['edgelist', - 'G472', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [1, 4], [6, 3], [5, 2]]], - ['edgelist', - 'G473', - 7, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 1], [1, 5], [1, 7]]], - ['edgelist', - 'G474', - 7, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 1], [1, 5], [3, 7]]], - ['edgelist', - 'G475', - 7, - [[2, 3], [4, 2], [1, 4], [2, 1], [3, 1], [4, 3], [6, 4], [5, 1], [2, 7]]], - ['edgelist', - 'G476', - 7, - [[1, 2], [3, 5], [1, 3], [4, 2], [4, 3], [3, 2], [5, 2], [6, 3], [3, 7]]], - ['edgelist', - 'G477', - 7, - [[1, 2], [3, 5], [1, 3], [6, 3], [4, 2], [4, 3], [3, 2], [5, 2], [2, 7]]], - ['edgelist', - 'G478', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [2, 6], [2, 7]]], - ['edgelist', - 'G479', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [2, 6], [5, 7]]], - ['edgelist', - 'G480', - 7, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [3, 2], [6, 2], [2, 7]]], - ['edgelist', - 'G481', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 5], [5, 7]]], - ['edgelist', - 'G482', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 5], [4, 7]]], - ['edgelist', - 'G483', - 7, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [3, 2], [6, 2], [1, 7]]], - ['edgelist', - 'G484', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 1], [2, 7]]], - ['edgelist', - 'G485', - 7, - [[3, 1], [4, 3], [5, 4], [6, 5], [3, 6], [2, 3], [5, 2], [6, 4], [3, 7]]], - ['edgelist', - 'G486', - 7, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [4, 1], [6, 2], [1, 7]]], - ['edgelist', - 'G487', - 7, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [6, 1], [1, 5], [6, 7]]], - ['edgelist', - 'G488', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 1], [5, 7]]], - ['edgelist', - 'G489', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 5], [3, 7]]], - ['edgelist', - 'G490', - 7, - [[3, 1], [4, 3], [5, 4], [6, 5], [3, 6], [2, 3], [5, 2], [6, 4], [6, 7]]], - ['edgelist', - 'G491', - 7, - [[2, 3], [4, 2], [1, 4], [2, 1], [3, 1], [4, 3], [5, 1], [7, 6], [7, 4]]], - ['edgelist', - 'G492', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 1], [1, 7]]], - ['edgelist', - 'G493', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 7], [6, 5], [1, 4], [3, 5]]], - ['edgelist', - 'G494', - 7, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [3, 2], [6, 2], [6, 7]]], - ['edgelist', - 'G495', - 7, - [[3, 1], [4, 3], [5, 4], [6, 5], [3, 6], [2, 3], [5, 2], [6, 4], [5, 7]]], - ['edgelist', - 'G496', - 7, - [[1, 2], [3, 6], [1, 3], [4, 1], [4, 2], [4, 3], [3, 2], [6, 2], [5, 7]]], - ['edgelist', - 'G497', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 1], [3, 7]]], - ['edgelist', - 'G498', - 7, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [4, 1], [6, 2], [6, 7]]], - ['edgelist', - 'G499', - 7, - [[1, 2], [3, 6], [1, 3], [6, 5], [4, 2], [4, 3], [4, 1], [6, 2], [3, 7]]], - ['edgelist', - 'G500', - 7, - [[1, 2], [3, 6], [1, 3], [5, 1], [4, 2], [4, 3], [6, 2], [6, 4], [1, 7]]], - ['edgelist', - 'G501', - 7, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [1, 6], [6, 5], [6, 7]]], - ['edgelist', - 'G502', - 7, - [[1, 2], [2, 3], [3, 4], [1, 4], [5, 1], [5, 2], [5, 3], [5, 4], [6, 7]]], - ['edgelist', - 'G503', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [4, 5], [5, 7]]], - ['edgelist', - 'G504', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 1], [6, 3], [1, 3], [1, 7]]], - ['edgelist', - 'G505', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [4, 5], [4, 7]]], - ['edgelist', - 'G506', - 7, - [[1, 2], [3, 5], [1, 3], [6, 3], [4, 2], [4, 3], [3, 2], [5, 2], [6, 7]]], - ['edgelist', - 'G507', - 7, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4], [5, 7]]], - ['edgelist', - 'G508', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3], [3, 7]]], - ['edgelist', - 'G509', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [7, 6], [7, 2]]], - ['edgelist', - 'G510', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [4, 5], [3, 7]]], - ['edgelist', - 'G511', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [4, 5], [1, 7]]], - ['edgelist', - 'G512', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [7, 6], [4, 7], [2, 7], [1, 2], [2, 5]]], - ['edgelist', - 'G513', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [1, 7]]], - ['edgelist', - 'G514', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [3, 2], [5, 7]]], - ['edgelist', - 'G515', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 5], [6, 7]]], - ['edgelist', - 'G516', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3], [5, 7]]], - ['edgelist', - 'G517', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3], [6, 7]]], - ['edgelist', - 'G518', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [7, 6], [4, 7], [2, 7], [1, 2], [1, 5]]], - ['edgelist', - 'G519', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 1], [6, 3], [1, 3], [2, 7]]], - ['edgelist', - 'G520', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 1], [6, 3], [1, 3], [5, 7]]], - ['edgelist', - 'G521', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [3, 2], [3, 7]]], - ['edgelist', - 'G522', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [4, 7]]], - ['edgelist', - 'G523', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [3, 7]]], - ['edgelist', - 'G524', - 7, - [[1, 2], [3, 6], [1, 3], [6, 2], [4, 2], [4, 3], [3, 2], [7, 1], [7, 5]]], - ['edgelist', - 'G525', - 7, - [[2, 6], [5, 2], [1, 5], [6, 1], [3, 6], [5, 3], [4, 5], [6, 4], [2, 7]]], - ['edgelist', - 'G526', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 4], [5, 2], [6, 1], [6, 7]]], - ['edgelist', - 'G527', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3], [2, 7]]], - ['edgelist', - 'G528', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3], [1, 7]]], - ['edgelist', - 'G529', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 3], [4, 7]]], - ['edgelist', - 'G530', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [7, 6], [4, 7], [2, 7], [1, 2], [3, 5]]], - ['edgelist', - 'G531', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [5, 6], [6, 4], [2, 6], [4, 7]]], - ['edgelist', - 'G532', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [2, 7]]], - ['edgelist', - 'G533', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 2], [5, 7]]], - ['edgelist', - 'G534', - 7, - [[1, 2], [3, 6], [1, 3], [6, 2], [4, 2], [4, 3], [4, 1], [7, 5], [7, 1]]], - ['edgelist', - 'G535', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 6], [6, 3], [6, 1], [2, 7]]], - ['edgelist', - 'G536', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [3, 2], [7, 1]]], - ['edgelist', - 'G537', - 7, - [[6, 4], [4, 3], [5, 4], [6, 5], [3, 6], [2, 3], [5, 2], [7, 1], [7, 3]]], - ['edgelist', - 'G538', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 6], [6, 3], [6, 1], [1, 7]]], - ['edgelist', - 'G539', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [5, 6], [6, 4], [2, 6], [6, 7]]], - ['edgelist', - 'G540', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [4, 1], [6, 3], [6, 1], [5, 7]]], - ['edgelist', - 'G541', - 7, - [[2, 4], [3, 2], [1, 3], [6, 1], [7, 6], [4, 7], [2, 7], [1, 2], [6, 5]]], - ['edgelist', - 'G542', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [5, 2], [6, 3], [6, 7]]], - ['edgelist', - 'G543', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [5, 6], [6, 4], [2, 6], [2, 7]]], - ['edgelist', - 'G544', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [3, 2], [4, 7]]], - ['edgelist', - 'G545', - 7, - [[1, 2], [2, 3], [1, 3], [4, 1], [4, 2], [4, 3], [1, 6], [6, 5], [5, 7]]], - ['edgelist', - 'G546', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [5, 6], [6, 4], [2, 6], [1, 7]]], - ['edgelist', - 'G547', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [2, 6], [6, 3], [6, 1], [5, 7]]], - ['edgelist', - 'G548', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [3, 5], [6, 2], [1, 7]]], - ['edgelist', - 'G549', - 7, - [[1, 2], [3, 6], [1, 3], [6, 4], [4, 2], [4, 3], [6, 2], [7, 5], [7, 1]]], - ['edgelist', - 'G550', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [5, 2], [6, 3], [1, 7]]], - ['edgelist', - 'G551', - 7, - [[7, 4], [2, 3], [7, 6], [4, 5], [7, 5], [1, 6], [7, 1], [7, 2], [7, 3]]], - ['edgelist', - 'G552', - 7, - [[1, 2], [3, 1], [4, 3], [5, 4], [2, 5], [3, 2], [7, 3], [6, 7], [3, 6]]], - ['edgelist', - 'G553', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [4, 5], [7, 6], [7, 1]]], - ['edgelist', - 'G554', - 7, - [[2, 5], [3, 5], [3, 4], [1, 5], [4, 2], [5, 6], [1, 6], [7, 5], [7, 4]]], - ['edgelist', - 'G555', - 7, - [[5, 2], [6, 5], [7, 6], [4, 7], [3, 4], [2, 3], [6, 3], [1, 6], [3, 1]]], - ['edgelist', - 'G556', - 7, - [[5, 2], [4, 2], [3, 4], [5, 1], [6, 1], [6, 3], [6, 5], [7, 5], [6, 7]]], - ['edgelist', - 'G557', - 7, - [[2, 1], [3, 2], [7, 3], [4, 7], [6, 4], [5, 6], [4, 5], [3, 4], [1, 3]]], - ['edgelist', - 'G558', - 7, - [[1, 3], [6, 1], [2, 6], [3, 2], [5, 3], [6, 5], [7, 6], [4, 7], [3, 4]]], - ['edgelist', - 'G559', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [1, 7], [2, 4], [5, 2]]], - ['edgelist', - 'G560', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 5], [6, 2], [7, 2], [1, 7]]], - ['edgelist', - 'G561', - 7, - [[1, 5], [2, 1], [5, 2], [4, 5], [3, 4], [7, 3], [6, 7], [2, 6], [3, 2]]], - ['edgelist', - 'G562', - 7, - [[1, 2], [3, 1], [4, 3], [5, 4], [2, 5], [3, 2], [6, 4], [7, 6], [4, 7]]], - ['edgelist', - 'G563', - 7, - [[7, 6], [4, 7], [3, 4], [1, 5], [1, 6], [2, 1], [3, 1], [2, 3], [6, 5]]], - ['edgelist', - 'G564', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 4], [6, 2], [7, 2], [1, 7]]], - ['edgelist', - 'G565', - 7, - [[6, 3], [7, 6], [4, 7], [3, 4], [1, 3], [5, 1], [6, 5], [2, 6], [1, 2]]], - ['edgelist', - 'G566', - 7, - [[3, 5], [2, 3], [5, 2], [6, 5], [1, 6], [2, 1], [7, 5], [4, 7], [3, 4]]], - ['edgelist', - 'G567', - 7, - [[7, 3], [6, 7], [3, 6], [2, 3], [1, 2], [5, 1], [2, 5], [4, 2], [1, 4]]], - ['edgelist', - 'G568', - 7, - [[1, 6], [7, 1], [2, 7], [5, 2], [3, 5], [4, 3], [2, 4], [6, 2], [7, 6]]], - ['edgelist', - 'G569', - 7, - [[7, 6], [4, 7], [3, 4], [6, 3], [1, 6], [2, 1], [5, 2], [1, 5], [3, 1]]], - ['edgelist', - 'G570', - 7, - [[1, 5], [4, 1], [2, 4], [5, 2], [3, 5], [7, 3], [6, 7], [3, 6], [4, 3]]], - ['edgelist', - 'G571', - 7, - [[2, 1], [5, 2], [6, 5], [1, 6], [7, 1], [4, 7], [3, 4], [1, 3], [4, 5]]], - ['edgelist', - 'G572', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [7, 1], [7, 2], [7, 4]]], - ['edgelist', - 'G573', - 7, - [[1, 2], [2, 3], [3, 4], [1, 4], [5, 2], [6, 5], [6, 4], [7, 1], [7, 5]]], - ['edgelist', - 'G574', - 7, - [[1, 2], [5, 1], [2, 5], [3, 2], [6, 3], [5, 6], [7, 6], [4, 7], [3, 4]]], - ['edgelist', - 'G575', - 7, - [[2, 1], [7, 4], [1, 5], [6, 1], [4, 6], [6, 7], [2, 3], [2, 5], [7, 3]]], - ['edgelist', - 'G576', - 7, - [[7, 3], [6, 7], [3, 6], [2, 3], [1, 4], [5, 1], [2, 5], [4, 2], [4, 5]]], - ['edgelist', - 'G577', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [7, 2], [6, 7], [7, 1]]], - ['edgelist', - 'G578', - 7, - [[1, 5], [2, 1], [3, 2], [4, 3], [1, 4], [3, 5], [6, 5], [7, 6], [4, 7]]], - ['edgelist', - 'G579', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [5, 3], [7, 2], [6, 7]]], - ['edgelist', - 'G580', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [1, 5], [6, 4], [6, 5], [7, 2], [7, 6]]], - ['edgelist', - 'G581', - 7, - [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [1, 6], [7, 1], [7, 5], [7, 3]]], - ['edgelist', - 'G582', - 7, - [[1, 5], [4, 1], [5, 4], [7, 2], [6, 7], [2, 6], [3, 2], [6, 3], [7, 3]]], - ['edgelist', - 'G583', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3]]], - ['edgelist', - 'G584', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 5]]], - ['edgelist', - 'G585', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1]]], - ['edgelist', - 'G586', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [2, 1]]], - ['edgelist', - 'G587', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [6, 5], - [4, 6], - [2, 6]]], - ['edgelist', - 'G588', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [3, 5]]], - ['edgelist', - 'G589', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3]]], - ['edgelist', - 'G590', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3]]], - ['edgelist', - 'G591', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2]]], - ['edgelist', - 'G592', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [6, 3]]], - ['edgelist', - 'G593', - 7, - [[1, 2], - [3, 5], - [1, 3], - [5, 6], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4]]], - ['edgelist', - 'G594', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5]]], - ['edgelist', - 'G595', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [1, 3], - [2, 4], - [6, 2]]], - ['edgelist', - 'G596', - 7, - [[1, 2], - [2, 3], - [4, 5], - [1, 3], - [4, 1], - [3, 5], - [6, 3], - [2, 6], - [5, 2], - [4, 6]]], - ['edgelist', - 'G597', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [6, 4], - [3, 6], - [2, 1]]], - ['edgelist', - 'G598', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [5, 3], - [3, 7]]], - ['edgelist', - 'G599', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [5, 3], - [2, 7]]], - ['edgelist', - 'G600', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [1, 5], - [2, 7]]], - ['edgelist', - 'G601', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [1, 5], - [1, 7]]], - ['edgelist', - 'G602', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [1, 5], - [4, 7]]], - ['edgelist', - 'G603', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [5, 6], - [5, 7]]], - ['edgelist', - 'G604', - 7, - [[3, 1], - [5, 2], - [2, 3], - [6, 5], - [3, 6], - [4, 2], - [6, 4], - [4, 3], - [5, 4], - [4, 7]]], - ['edgelist', - 'G605', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [5, 6], - [3, 7]]], - ['edgelist', - 'G606', - 7, - [[3, 1], - [5, 2], - [2, 3], - [6, 5], - [3, 6], - [4, 2], - [6, 4], - [4, 3], - [5, 4], - [3, 7]]], - ['edgelist', - 'G607', - 7, - [[3, 4], - [2, 3], - [5, 2], - [6, 5], - [3, 6], - [1, 3], - [5, 1], - [1, 2], - [6, 1], - [7, 6]]], - ['edgelist', - 'G608', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [1, 5], - [6, 7]]], - ['edgelist', - 'G609', - 7, - [[3, 1], - [5, 2], - [2, 3], - [6, 5], - [3, 6], - [4, 2], - [6, 4], - [4, 3], - [5, 4], - [5, 7]]], - ['edgelist', - 'G610', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [5, 6], - [7, 6]]], - ['edgelist', - 'G611', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 7]]], - ['edgelist', - 'G612', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [7, 6]]], - ['edgelist', - 'G613', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [4, 1], - [1, 7]]], - ['edgelist', - 'G614', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [4, 1], - [3, 7]]], - ['edgelist', - 'G615', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [2, 7]]], - ['edgelist', - 'G616', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [4, 1], - [4, 7]]], - ['edgelist', - 'G617', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [1, 5], - [2, 1], - [5, 2], - [1, 7]]], - ['edgelist', - 'G618', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [2, 1], - [6, 2], - [2, 7]]], - ['edgelist', - 'G619', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [6, 5], - [5, 1], - [6, 1], - [1, 7]]], - ['edgelist', - 'G620', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [4, 7]]], - ['edgelist', - 'G621', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [4, 1], - [6, 7]]], - ['edgelist', - 'G622', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [4, 7]]], - ['edgelist', - 'G623', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [2, 1], - [6, 2], - [1, 7]]], - ['edgelist', - 'G624', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [3, 1], - [6, 4], - [3, 4], - [7, 3]]], - ['edgelist', - 'G625', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [7, 5], - [7, 3]]], - ['edgelist', - 'G626', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [3, 7]]], - ['edgelist', - 'G627', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [2, 1], - [6, 2], - [6, 7]]], - ['edgelist', - 'G628', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [4, 1], - [5, 7]]], - ['edgelist', - 'G629', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [4, 7]]], - ['edgelist', - 'G630', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [6, 5], - [5, 1], - [6, 1], - [3, 7]]], - ['edgelist', - 'G631', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [3, 1], - [6, 7]]], - ['edgelist', - 'G632', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [3, 7]]], - ['edgelist', - 'G633', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [3, 1], - [6, 4], - [3, 4], - [1, 7]]], - ['edgelist', - 'G634', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [2, 7]]], - ['edgelist', - 'G635', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [5, 7]]], - ['edgelist', - 'G636', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [7, 5], - [7, 1]]], - ['edgelist', - 'G637', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [6, 7]]], - ['edgelist', - 'G638', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [1, 5], - [2, 1], - [5, 2], - [6, 7]]], - ['edgelist', - 'G639', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [3, 1], - [1, 7]]], - ['edgelist', - 'G640', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [2, 1], - [6, 2], - [3, 7]]], - ['edgelist', - 'G641', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 4], - [5, 3], - [6, 3], - [3, 7]]], - ['edgelist', - 'G642', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 5], - [6, 3], - [6, 4], - [6, 7]]], - ['edgelist', - 'G643', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [4, 1], - [6, 3], - [6, 1], - [6, 2], - [1, 7]]], - ['edgelist', - 'G644', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [6, 5], - [5, 1], - [6, 1], - [6, 7]]], - ['edgelist', - 'G645', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [7, 6], - [7, 5]]], - ['edgelist', - 'G646', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [2, 7]]], - ['edgelist', - 'G647', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [5, 7]]], - ['edgelist', - 'G648', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 5], - [6, 3], - [6, 4], - [5, 7]]], - ['edgelist', - 'G649', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [3, 7]]], - ['edgelist', - 'G650', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 5], - [6, 3], - [6, 4], - [1, 7]]], - ['edgelist', - 'G651', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 4], - [5, 3], - [6, 3], - [6, 7]]], - ['edgelist', - 'G652', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [4, 1], - [6, 3], - [6, 1], - [6, 2], - [2, 7]]], - ['edgelist', - 'G653', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [4, 7]]], - ['edgelist', - 'G654', - 7, - [[5, 4], - [5, 2], - [2, 3], - [6, 5], - [3, 6], - [4, 2], - [6, 4], - [4, 3], - [7, 1], - [7, 3]]], - ['edgelist', - 'G655', - 7, - [[2, 1], - [3, 2], - [4, 3], - [5, 4], - [6, 5], - [2, 6], - [7, 2], - [5, 7], - [3, 7], - [6, 3]]], - ['edgelist', - 'G656', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 4], - [5, 3], - [6, 3], - [1, 7]]], - ['edgelist', - 'G657', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [4, 1], - [6, 3], - [6, 1], - [6, 2], - [4, 7]]], - ['edgelist', - 'G658', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [4, 1], - [6, 3], - [6, 1], - [6, 2], - [3, 7]]], - ['edgelist', - 'G659', - 7, - [[1, 2], - [3, 6], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [3, 2], - [6, 2], - [7, 6], - [7, 5]]], - ['edgelist', - 'G660', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [2, 7]]], - ['edgelist', - 'G661', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 7]]], - ['edgelist', - 'G662', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [3, 1], - [2, 7]]], - ['edgelist', - 'G663', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 5], - [6, 3], - [6, 4], - [2, 7]]], - ['edgelist', - 'G664', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 4], - [5, 3], - [6, 3], - [2, 7]]], - ['edgelist', - 'G665', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [4, 1], - [6, 3], - [6, 1], - [6, 2], - [5, 7]]], - ['edgelist', - 'G666', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [2, 1], - [6, 3], - [5, 7]]], - ['edgelist', - 'G667', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 4], - [6, 3], - [5, 2], - [1, 7]]], - ['edgelist', - 'G668', - 7, - [[5, 1], - [2, 5], - [4, 2], - [3, 4], - [2, 3], - [7, 2], - [1, 7], - [6, 1], - [2, 6], - [1, 2]]], - ['edgelist', - 'G669', - 7, - [[4, 3], - [7, 4], - [6, 7], - [1, 6], - [3, 1], - [6, 3], - [2, 6], - [3, 2], - [5, 3], - [6, 5]]], - ['edgelist', - 'G670', - 7, - [[3, 1], - [2, 3], - [4, 2], - [1, 4], - [7, 1], - [2, 7], - [6, 2], - [1, 6], - [5, 1], - [2, 5]]], - ['edgelist', - 'G671', - 7, - [[7, 5], - [2, 3], - [7, 6], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [7, 4]]], - ['edgelist', - 'G672', - 7, - [[1, 2], - [7, 6], - [3, 4], - [4, 5], - [7, 5], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [7, 4]]], - ['edgelist', - 'G673', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [3, 2], - [1, 6], - [6, 3], - [7, 2], - [3, 7]]], - ['edgelist', - 'G674', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [3, 2], - [6, 1], - [6, 3], - [7, 3], - [1, 7]]], - ['edgelist', - 'G675', - 7, - [[7, 5], - [2, 3], - [7, 6], - [4, 5], - [5, 6], - [1, 6], - [7, 4], - [7, 2], - [7, 3], - [1, 5]]], - ['edgelist', - 'G676', - 7, - [[2, 1], - [3, 2], - [1, 3], - [4, 3], - [5, 4], - [3, 5], - [6, 3], - [5, 6], - [7, 5], - [2, 7]]], - ['edgelist', - 'G677', - 7, - [[1, 2], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 6], - [3, 7]]], - ['edgelist', - 'G678', - 7, - [[1, 3], - [6, 1], - [5, 6], - [3, 5], - [2, 3], - [6, 2], - [7, 6], - [4, 7], - [3, 4], - [3, 7]]], - ['edgelist', - 'G679', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [3, 2], - [6, 2], - [1, 6], - [7, 1], - [3, 7]]], - ['edgelist', - 'G680', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 3], - [7, 5], - [1, 3], - [5, 1]]], - ['edgelist', - 'G681', - 7, - [[1, 5], - [4, 1], - [3, 4], - [6, 3], - [7, 6], - [3, 7], - [5, 3], - [2, 5], - [4, 2], - [5, 4]]], - ['edgelist', - 'G682', - 7, - [[2, 7], - [3, 2], - [1, 3], - [2, 1], - [5, 2], - [4, 5], - [3, 4], - [6, 7], - [5, 6], - [4, 2]]], - ['edgelist', - 'G683', - 7, - [[7, 6], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [7, 5]]], - ['edgelist', - 'G684', - 7, - [[1, 2], - [7, 6], - [3, 4], - [4, 5], - [7, 5], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [6, 4]]], - ['edgelist', - 'G685', - 7, - [[1, 2], - [2, 3], - [3, 4], - [6, 5], - [1, 5], - [6, 1], - [6, 4], - [6, 3], - [7, 6], - [7, 2]]], - ['edgelist', - 'G686', - 7, - [[1, 4], - [3, 1], - [2, 3], - [4, 2], - [5, 4], - [3, 5], - [1, 5], - [7, 1], - [6, 7], - [1, 6]]], - ['edgelist', - 'G687', - 7, - [[1, 4], - [3, 1], - [2, 3], - [4, 2], - [5, 4], - [1, 6], - [1, 5], - [7, 1], - [6, 7], - [2, 5]]], - ['edgelist', - 'G688', - 7, - [[1, 2], - [7, 6], - [3, 4], - [4, 5], - [7, 5], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [5, 3]]], - ['edgelist', - 'G689', - 7, - [[2, 3], - [6, 2], - [7, 6], - [3, 7], - [2, 7], - [6, 3], - [5, 2], - [1, 5], - [4, 1], - [2, 4]]], - ['edgelist', - 'G690', - 7, - [[5, 3], - [7, 3], - [6, 4], - [5, 2], - [3, 1], - [7, 4], - [6, 3], - [1, 2], - [1, 5], - [7, 1]]], - ['edgelist', - 'G691', - 7, - [[5, 3], - [4, 7], - [6, 4], - [6, 2], - [3, 1], - [7, 1], - [6, 3], - [2, 5], - [1, 5], - [6, 5]]], - ['edgelist', - 'G692', - 7, - [[5, 1], - [6, 5], - [5, 2], - [3, 2], - [4, 3], - [1, 4], - [4, 5], - [6, 4], - [7, 2], - [7, 6]]], - ['edgelist', - 'G693', - 7, - [[1, 5], - [2, 1], - [3, 2], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [6, 3], - [7, 4], - [3, 7]]], - ['edgelist', - 'G694', - 7, - [[2, 7], - [3, 2], - [1, 3], - [2, 1], - [5, 2], - [4, 5], - [3, 4], - [6, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G695', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 4], - [7, 2], - [7, 6], - [6, 2]]], - ['edgelist', - 'G696', - 7, - [[2, 1], - [5, 2], - [1, 5], - [3, 1], - [4, 3], - [7, 4], - [6, 7], - [1, 6], - [6, 3], - [7, 3]]], - ['edgelist', - 'G697', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 4], - [6, 2], - [6, 5], - [7, 2], - [6, 7]]], - ['edgelist', - 'G698', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [5, 2], - [7, 2], - [7, 6]]], - ['edgelist', - 'G699', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [3, 2], - [6, 4], - [3, 6], - [7, 2], - [5, 7]]], - ['edgelist', - 'G700', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 3], - [6, 5], - [7, 6], - [7, 1], - [1, 3]]], - ['edgelist', - 'G701', - 7, - [[3, 1], - [6, 3], - [2, 6], - [1, 2], - [4, 1], - [6, 4], - [7, 6], - [5, 7], - [1, 5], - [5, 4]]], - ['edgelist', - 'G702', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [5, 3], - [2, 6], - [7, 3], - [7, 6]]], - ['edgelist', - 'G703', - 7, - [[6, 1], - [7, 6], - [3, 7], - [4, 3], - [1, 4], - [5, 1], - [3, 5], - [5, 4], - [2, 5], - [4, 2]]], - ['edgelist', - 'G704', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [7, 4], - [6, 7], - [4, 6], - [5, 6], - [5, 7]]], - ['edgelist', - 'G705', - 7, - [[6, 3], - [3, 2], - [4, 3], - [5, 4], - [2, 5], - [6, 1], - [7, 2], - [7, 1], - [2, 6], - [3, 7]]], - ['edgelist', - 'G706', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 3], - [7, 5], - [5, 3], - [6, 2]]], - ['edgelist', - 'G707', - 7, - [[5, 3], - [3, 4], - [5, 2], - [1, 2], - [4, 1], - [7, 5], - [1, 7], - [6, 1], - [5, 6], - [2, 6]]], - ['edgelist', - 'G708', - 7, - [[3, 2], - [6, 3], - [4, 6], - [1, 4], - [5, 1], - [7, 5], - [4, 7], - [2, 4], - [5, 2], - [6, 5]]], - ['edgelist', - 'G709', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [7, 6], - [7, 4]]], - ['edgelist', - 'G710', - 7, - [[1, 2], - [5, 1], - [2, 5], - [3, 2], - [6, 3], - [5, 6], - [7, 6], - [4, 7], - [3, 4], - [6, 4]]], - ['edgelist', - 'G711', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 6], - [7, 2], - [7, 3], - [5, 3]]], - ['edgelist', - 'G712', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 4], - [6, 3], - [7, 6], - [7, 5]]], - ['edgelist', - 'G713', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 4], - [7, 3], - [5, 1]]], - ['edgelist', - 'G714', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 5], - [7, 6], - [7, 4]]], - ['edgelist', - 'G715', - 7, - [[1, 6], - [7, 1], - [2, 7], - [1, 2], - [2, 6], - [3, 2], - [4, 3], - [5, 4], - [7, 5], - [5, 6]]], - ['edgelist', - 'G716', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 6], - [7, 5], - [3, 1]]], - ['edgelist', - 'G717', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 6], - [7, 4]]], - ['edgelist', - 'G718', - 7, - [[3, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [6, 2], - [6, 1], - [7, 1], - [2, 7], - [7, 6]]], - ['edgelist', - 'G719', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 4], - [6, 2], - [7, 2], - [7, 5], - [7, 6]]], - ['edgelist', - 'G720', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 3], - [5, 2], - [7, 1], - [6, 7]]], - ['edgelist', - 'G721', - 7, - [[4, 2], - [1, 4], - [6, 1], - [2, 6], - [3, 2], - [7, 3], - [1, 7], - [1, 5], - [5, 3], - [5, 7]]], - ['edgelist', - 'G722', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 5], - [7, 2], - [7, 3], - [7, 6]]], - ['edgelist', - 'G723', - 7, - [[1, 4], - [3, 1], - [2, 3], - [4, 2], - [5, 4], - [3, 5], - [6, 5], - [6, 1], - [7, 5], - [7, 2]]], - ['edgelist', - 'G724', - 7, - [[1, 2], - [7, 6], - [3, 4], - [4, 5], - [7, 5], - [1, 6], - [7, 3], - [7, 2], - [5, 3], - [6, 2]]], - ['edgelist', - 'G725', - 7, - [[6, 3], - [7, 6], - [3, 7], - [5, 3], - [1, 5], - [4, 1], - [3, 4], - [2, 1], - [2, 4], - [5, 2]]], - ['edgelist', - 'G726', - 7, - [[4, 5], - [2, 4], - [5, 2], - [1, 5], - [4, 1], - [2, 1], - [3, 2], - [6, 3], - [7, 6], - [3, 7]]], - ['edgelist', - 'G727', - 7, - [[6, 7], - [3, 6], - [7, 3], - [4, 7], - [1, 4], - [5, 1], - [6, 5], - [2, 5], - [4, 2], - [3, 2]]], - ['edgelist', - 'G728', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 6], - [5, 3]]], - ['edgelist', - 'G729', - 7, - [[2, 1], - [3, 2], - [4, 3], - [1, 4], - [6, 1], - [2, 6], - [5, 6], - [7, 5], - [4, 7], - [3, 7]]], - ['edgelist', - 'G730', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [5, 2], - [3, 6], - [7, 1], - [4, 7]]], - ['edgelist', - 'G731', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3], - [2, 6]]], - ['edgelist', - 'G732', - 7, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4]]], - ['edgelist', - 'G733', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6]]], - ['edgelist', - 'G734', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [1, 3]]], - ['edgelist', - 'G735', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [6, 2]]], - ['edgelist', - 'G736', - 7, - [[2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G737', - 7, - [[4, 7], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [7, 6], - [3, 7], - [6, 2], - [1, 4], - [2, 7], - [1, 2]]], - ['edgelist', - 'G738', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3]]], - ['edgelist', - 'G739', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [1, 4]]], - ['edgelist', - 'G740', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 5], - [7, 5]]], - ['edgelist', - 'G741', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [7, 5]]], - ['edgelist', - 'G742', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 3], - [5, 7]]], - ['edgelist', - 'G743', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [3, 6], - [7, 3]]], - ['edgelist', - 'G744', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 3], - [1, 7]]], - ['edgelist', - 'G745', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [7, 6]]], - ['edgelist', - 'G746', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [2, 1], - [5, 7]]], - ['edgelist', - 'G747', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [6, 5], - [4, 6], - [2, 6], - [2, 7]]], - ['edgelist', - 'G748', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [6, 5], - [4, 6], - [2, 6], - [7, 5]]], - ['edgelist', - 'G749', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [5, 6], - [2, 1], - [2, 7]]], - ['edgelist', - 'G750', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [3, 5], - [3, 7]]], - ['edgelist', - 'G751', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [6, 5], - [4, 6], - [2, 6], - [6, 7]]], - ['edgelist', - 'G752', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3], - [3, 7]]], - ['edgelist', - 'G753', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3], - [7, 2]]], - ['edgelist', - 'G754', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3], - [4, 7]]], - ['edgelist', - 'G755', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3], - [7, 5]]], - ['edgelist', - 'G756', - 7, - [[1, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G757', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [6, 3], - [1, 7]]], - ['edgelist', - 'G758', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3], - [1, 7]]], - ['edgelist', - 'G759', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2], - [2, 7]]], - ['edgelist', - 'G760', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3], - [6, 7]]], - ['edgelist', - 'G761', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [6, 5], - [4, 6], - [2, 6], - [1, 7]]], - ['edgelist', - 'G762', - 7, - [[1, 2], - [3, 5], - [1, 3], - [5, 6], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [3, 7]]], - ['edgelist', - 'G763', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3], - [4, 7]]], - ['edgelist', - 'G764', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2], - [3, 7]]], - ['edgelist', - 'G765', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3], - [6, 7]]], - ['edgelist', - 'G766', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [6, 3], - [6, 7]]], - ['edgelist', - 'G767', - 7, - [[1, 2], - [3, 5], - [1, 3], - [5, 6], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [6, 7]]], - ['edgelist', - 'G768', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 5], - [6, 7]]], - ['edgelist', - 'G769', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [6, 3], - [2, 7]]], - ['edgelist', - 'G770', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2], - [5, 7]]], - ['edgelist', - 'G771', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2], - [6, 7]]], - ['edgelist', - 'G772', - 7, - [[1, 2], - [3, 5], - [1, 3], - [5, 6], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [5, 7]]], - ['edgelist', - 'G773', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [5, 1], - [3, 5], - [2, 7]]], - ['edgelist', - 'G774', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [7, 6], - [7, 3]]], - ['edgelist', - 'G775', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5], - [6, 7]]], - ['edgelist', - 'G776', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [1, 3], - [2, 4], - [6, 2], - [2, 7]]], - ['edgelist', - 'G777', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5], - [2, 7]]], - ['edgelist', - 'G778', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [5, 6], - [4, 5], - [2, 4], - [6, 2], - [3, 4], - [2, 3], - [3, 7]]], - ['edgelist', - 'G779', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [4, 3], - [1, 4], - [3, 5], - [6, 3], - [2, 7]]], - ['edgelist', - 'G780', - 7, - [[1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [6, 7]]], - ['edgelist', - 'G781', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [6, 4], - [3, 6], - [2, 1], - [2, 7]]], - ['edgelist', - 'G782', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [1, 3], - [2, 4], - [6, 2], - [6, 7]]], - ['edgelist', - 'G783', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [1, 3], - [2, 4], - [6, 2], - [7, 4]]], - ['edgelist', - 'G784', - 7, - [[5, 4], - [1, 5], - [2, 1], - [3, 2], - [4, 3], - [1, 6], - [6, 4], - [1, 4], - [2, 6], - [6, 3], - [5, 7]]], - ['edgelist', - 'G785', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 6], - [1, 6], - [3, 1], - [6, 2], - [5, 2], - [7, 4]]], - ['edgelist', - 'G786', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [4, 3], - [1, 4], - [2, 7]]], - ['edgelist', - 'G787', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [6, 4], - [3, 6], - [2, 1], - [7, 3]]], - ['edgelist', - 'G788', - 7, - [[1, 2], - [3, 5], - [1, 3], - [5, 6], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 7]]], - ['edgelist', - 'G789', - 7, - [[1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6]]], - ['edgelist', - 'G790', - 7, - [[7, 6], - [1, 7], - [6, 1], - [2, 6], - [7, 2], - [3, 7], - [6, 3], - [4, 6], - [7, 4], - [5, 7], - [6, 5]]], - ['edgelist', - 'G791', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [3, 2], - [6, 2], - [3, 6], - [7, 3], - [2, 7], - [4, 2]]], - ['edgelist', - 'G792', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 2], - [4, 6], - [7, 2], - [5, 7], - [2, 5], - [4, 2]]], - ['edgelist', - 'G793', - 7, - [[2, 5], - [3, 4], - [5, 3], - [1, 7], - [5, 6], - [7, 6], - [4, 2], - [7, 5], - [4, 1], - [4, 7], - [5, 4]]], - ['edgelist', - 'G794', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [5, 3], - [7, 5], - [3, 7], - [6, 3], - [1, 3]]], - ['edgelist', - 'G795', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [5, 1], - [4, 1], - [3, 1], - [7, 1], - [4, 7]]], - ['edgelist', - 'G796', - 7, - [[1, 2], - [3, 1], - [6, 3], - [7, 6], - [3, 7], - [2, 3], - [5, 2], - [3, 5], - [4, 3], - [5, 4], - [4, 2]]], - ['edgelist', - 'G797', - 7, - [[5, 6], - [2, 5], - [3, 2], - [4, 3], - [7, 4], - [6, 7], - [3, 6], - [5, 3], - [4, 6], - [1, 6], - [3, 1]]], - ['edgelist', - 'G798', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [5, 3], - [6, 3], - [6, 1], - [7, 3], - [5, 7], - [6, 5]]], - ['edgelist', - 'G799', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [7, 2], - [3, 7], - [1, 3], - [7, 1], - [6, 3], - [1, 6]]], - ['edgelist', - 'G800', - 7, - [[1, 6], - [7, 1], - [2, 7], - [6, 2], - [3, 6], - [7, 3], - [5, 4], - [4, 3], - [5, 6], - [7, 5], - [7, 6]]], - ['edgelist', - 'G801', - 7, - [[1, 6], - [7, 1], - [2, 7], - [6, 2], - [3, 6], - [7, 3], - [4, 7], - [6, 4], - [5, 6], - [7, 5], - [5, 4]]], - ['edgelist', - 'G802', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 7], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G803', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [1, 3], - [3, 5], - [6, 3], - [5, 6], - [7, 6], - [7, 1]]], - ['edgelist', - 'G804', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [6, 7], - [1, 7], - [5, 3], - [1, 5], - [3, 1], - [7, 5]]], - ['edgelist', - 'G805', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [6, 2], - [6, 3], - [7, 2], - [3, 7], - [5, 3], - [6, 5]]], - ['edgelist', - 'G806', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 2], - [3, 6], - [5, 3], - [7, 3], - [5, 7]]], - ['edgelist', - 'G807', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 5], - [7, 3], - [1, 3], - [5, 1]]], - ['edgelist', - 'G808', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [4, 2], - [6, 4], - [5, 6], - [2, 5], - [7, 6], - [7, 2]]], - ['edgelist', - 'G809', - 7, - [[1, 5], - [4, 1], - [5, 4], - [3, 5], - [4, 3], - [2, 4], - [3, 2], - [5, 2], - [6, 3], - [7, 6], - [3, 7]]], - ['edgelist', - 'G810', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 7], - [3, 4], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G811', - 7, - [[1, 2], - [5, 1], - [6, 5], - [7, 6], - [4, 7], - [3, 4], - [2, 3], - [5, 2], - [3, 5], - [6, 3], - [2, 6]]], - ['edgelist', - 'G812', - 7, - [[1, 5], - [4, 1], - [5, 4], - [3, 5], - [7, 3], - [2, 7], - [6, 2], - [3, 6], - [4, 3], - [2, 4], - [5, 2]]], - ['edgelist', - 'G813', - 7, - [[1, 2], - [7, 6], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [7, 4], - [7, 5]]], - ['edgelist', - 'G814', - 7, - [[5, 2], - [1, 5], - [2, 1], - [4, 2], - [1, 4], - [6, 2], - [7, 6], - [2, 7], - [3, 2], - [6, 3], - [7, 3]]], - ['edgelist', - 'G815', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 5], - [7, 6], - [5, 7]]], - ['edgelist', - 'G816', - 7, - [[2, 1], - [3, 2], - [4, 3], - [5, 4], - [1, 5], - [3, 1], - [6, 3], - [7, 6], - [4, 7], - [7, 1], - [1, 6]]], - ['edgelist', - 'G817', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 3], - [5, 1], - [7, 5], - [1, 7], - [4, 7]]], - ['edgelist', - 'G818', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [3, 1], - [6, 3], - [7, 6], - [5, 7], - [1, 6], - [7, 1]]], - ['edgelist', - 'G819', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [3, 7], - [4, 7], - [1, 4], - [5, 1]]], - ['edgelist', - 'G820', - 7, - [[5, 7], - [6, 5], - [7, 6], - [4, 7], - [6, 4], - [3, 6], - [4, 3], - [6, 1], - [7, 1], - [2, 1], - [3, 2]]], - ['edgelist', - 'G821', - 7, - [[3, 1], - [5, 3], - [6, 5], - [4, 6], - [2, 4], - [1, 2], - [3, 2], - [4, 3], - [7, 4], - [6, 7], - [5, 4]]], - ['edgelist', - 'G822', - 7, - [[5, 4], - [5, 3], - [2, 5], - [4, 2], - [1, 4], - [2, 1], - [4, 3], - [4, 6], - [3, 6], - [7, 1], - [5, 7]]], - ['edgelist', - 'G823', - 7, - [[1, 2], - [1, 3], - [3, 4], - [6, 2], - [2, 4], - [6, 3], - [7, 4], - [7, 1], - [6, 4], - [5, 6], - [4, 5]]], - ['edgelist', - 'G824', - 7, - [[5, 1], - [2, 5], - [7, 2], - [1, 7], - [4, 1], - [2, 4], - [6, 2], - [1, 6], - [7, 6], - [3, 4], - [1, 3]]], - ['edgelist', - 'G825', - 7, - [[1, 2], - [6, 1], - [5, 6], - [2, 5], - [3, 2], - [4, 3], - [5, 4], - [5, 3], - [7, 5], - [3, 7], - [4, 7]]], - ['edgelist', - 'G826', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 2], - [4, 6], - [7, 4], - [5, 7], - [6, 7]]], - ['edgelist', - 'G827', - 7, - [[7, 4], - [6, 7], - [3, 6], - [4, 3], - [6, 4], - [5, 6], - [3, 5], - [2, 3], - [6, 2], - [1, 2], - [5, 1]]], - ['edgelist', - 'G828', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 2], - [7, 6], - [5, 7]]], - ['edgelist', - 'G829', - 7, - [[1, 5], - [4, 1], - [3, 4], - [6, 3], - [7, 6], - [3, 7], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2]]], - ['edgelist', - 'G830', - 7, - [[6, 1], - [1, 2], - [4, 1], - [6, 4], - [3, 6], - [7, 3], - [5, 7], - [6, 5], - [2, 6], - [7, 2], - [4, 7]]], - ['edgelist', - 'G831', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [3, 2], - [6, 2], - [3, 6], - [7, 5], - [7, 3], - [4, 7]]], - ['edgelist', - 'G832', - 7, - [[4, 3], - [7, 4], - [6, 7], - [1, 6], - [3, 1], - [2, 3], - [1, 2], - [6, 2], - [3, 6], - [5, 3], - [7, 5]]], - ['edgelist', - 'G833', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [5, 2], - [6, 4], - [6, 2], - [7, 5], - [7, 6], - [4, 7]]], - ['edgelist', - 'G834', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 4], - [7, 1], - [7, 3], - [7, 4], - [6, 7]]], - ['edgelist', - 'G835', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 2], - [7, 6], - [5, 7], - [4, 7], - [2, 7]]], - ['edgelist', - 'G836', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 2], - [7, 6], - [2, 7], - [3, 7], - [5, 3]]], - ['edgelist', - 'G837', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 4], - [5, 3], - [7, 2], - [7, 5], - [6, 3], - [4, 6]]], - ['edgelist', - 'G838', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 2], - [7, 2], - [5, 7], - [7, 6], - [3, 7]]], - ['edgelist', - 'G839', - 7, - [[1, 4], - [1, 7], - [2, 3], - [2, 6], - [3, 5], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G840', - 7, - [[6, 2], - [7, 6], - [5, 7], - [4, 5], - [3, 4], - [1, 3], - [2, 1], - [6, 1], - [7, 1], - [3, 7], - [5, 3]]], - ['edgelist', - 'G841', - 7, - [[2, 1], - [3, 2], - [4, 3], - [5, 4], - [1, 5], - [6, 3], - [4, 6], - [7, 1], - [7, 6], - [7, 3], - [4, 7]]], - ['edgelist', - 'G842', - 7, - [[1, 4], - [5, 1], - [3, 5], - [4, 3], - [2, 4], - [5, 2], - [6, 2], - [7, 1], - [7, 2], - [6, 4], - [5, 6]]], - ['edgelist', - 'G843', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G844', - 7, - [[1, 3], - [2, 1], - [3, 2], - [1, 4], - [4, 2], - [6, 5], - [6, 4], - [7, 5], - [7, 3], - [7, 1], - [2, 7]]], - ['edgelist', - 'G845', - 7, - [[5, 2], - [6, 5], - [3, 6], - [2, 3], - [1, 2], - [6, 1], - [7, 6], - [4, 7], - [3, 4], - [1, 3], - [5, 1]]], - ['edgelist', - 'G846', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [7, 2], - [7, 3], - [6, 2], - [4, 6], - [6, 3], - [5, 6]]], - ['edgelist', - 'G847', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6]]], - ['edgelist', - 'G848', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 4], - [7, 5], - [7, 3], - [3, 1], - [5, 1]]], - ['edgelist', - 'G849', - 7, - [[1, 3], - [2, 1], - [3, 2], - [1, 4], - [4, 2], - [6, 5], - [6, 4], - [7, 5], - [7, 3], - [5, 1], - [2, 5]]], - ['edgelist', - 'G850', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [7, 3], - [1, 7], - [2, 7]]], - ['edgelist', - 'G851', - 7, - [[1, 4], - [5, 1], - [2, 5], - [4, 2], - [5, 4], - [1, 2], - [3, 5], - [7, 3], - [6, 7], - [3, 6], - [2, 3]]], - ['edgelist', - 'G852', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 5], - [6, 3], - [6, 4], - [7, 2], - [7, 6]]], - ['edgelist', - 'G853', - 7, - [[5, 2], - [6, 5], - [3, 6], - [2, 3], - [1, 2], - [5, 1], - [6, 1], - [7, 6], - [4, 7], - [3, 4], - [6, 4]]], - ['edgelist', - 'G854', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 4], - [5, 3], - [6, 2], - [6, 5], - [7, 6], - [5, 7]]], - ['edgelist', - 'G855', - 7, - [[1, 2], - [2, 3], - [3, 4], - [6, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [7, 4], - [7, 5]]], - ['edgelist', - 'G856', - 7, - [[1, 5], - [4, 1], - [2, 4], - [5, 2], - [4, 5], - [6, 2], - [7, 6], - [2, 7], - [3, 2], - [6, 3], - [7, 3]]], - ['edgelist', - 'G857', - 7, - [[5, 2], - [1, 5], - [4, 1], - [3, 6], - [6, 5], - [7, 6], - [3, 7], - [2, 3], - [4, 2], - [7, 4], - [3, 4]]], - ['edgelist', - 'G858', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 3], - [6, 5], - [6, 4], - [7, 1], - [7, 6], - [4, 7]]], - ['edgelist', - 'G859', - 7, - [[6, 3], - [3, 5], - [6, 4], - [5, 2], - [6, 5], - [1, 2], - [4, 1], - [1, 3], - [7, 3], - [7, 4], - [1, 7]]], - ['edgelist', - 'G860', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 5], - [6, 3], - [6, 4], - [7, 2], - [1, 7]]], - ['edgelist', - 'G861', - 7, - [[1, 4], - [1, 5], - [2, 3], - [2, 6], - [2, 7], - [3, 5], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G862', - 7, - [[5, 1], - [4, 5], - [6, 4], - [1, 6], - [2, 1], - [3, 2], - [4, 3], - [5, 2], - [6, 3], - [7, 5], - [6, 7]]], - ['edgelist', - 'G863', - 7, - [[3, 4], - [5, 3], - [1, 5], - [6, 1], - [2, 6], - [5, 2], - [4, 5], - [6, 4], - [2, 1], - [7, 6], - [7, 3]]], - ['edgelist', - 'G864', - 7, - [[5, 2], - [1, 5], - [4, 1], - [5, 4], - [6, 5], - [7, 6], - [3, 7], - [2, 3], - [4, 2], - [7, 4], - [3, 6]]], - ['edgelist', - 'G865', - 7, - [[1, 4], - [5, 1], - [3, 5], - [4, 3], - [2, 4], - [1, 2], - [7, 1], - [6, 7], - [3, 6], - [2, 6], - [5, 2]]], - ['edgelist', - 'G866', - 7, - [[1, 4], - [1, 5], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G867', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 4], - [5, 3], - [6, 2], - [6, 5], - [7, 2], - [6, 7]]], - ['edgelist', - 'G868', - 7, - [[5, 2], - [6, 5], - [7, 6], - [4, 7], - [3, 4], - [2, 3], - [1, 2], - [6, 1], - [5, 1], - [6, 3], - [7, 3]]], - ['edgelist', - 'G869', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [5, 3], - [4, 6], - [5, 6], - [4, 1], - [7, 6], - [7, 2]]], - ['edgelist', - 'G870', - 7, - [[1, 5], - [2, 1], - [5, 2], - [4, 5], - [3, 4], - [2, 3], - [7, 2], - [6, 7], - [4, 6], - [6, 5], - [3, 7]]], - ['edgelist', - 'G871', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [6, 2], - [5, 3], - [7, 3], - [4, 7], - [5, 7]]], - ['edgelist', - 'G872', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 3], - [2, 7], - [6, 3], - [5, 2], - [1, 4]]], - ['edgelist', - 'G873', - 7, - [[1, 4], - [1, 5], - [2, 3], - [2, 6], - [2, 7], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G874', - 7, - [[1, 2], - [2, 3], - [3, 4], - [6, 5], - [1, 5], - [6, 4], - [6, 2], - [7, 4], - [7, 5], - [5, 3], - [1, 4]]], - ['edgelist', - 'G875', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 7], - [4, 7], - [5, 6]]], - ['edgelist', - 'G876', - 7, - [[5, 4], - [3, 5], - [4, 3], - [1, 4], - [3, 2], - [6, 5], - [6, 1], - [7, 5], - [7, 2], - [2, 6], - [1, 7]]], - ['edgelist', - 'G877', - 7, - [[7, 5], - [4, 7], - [2, 4], - [5, 2], - [1, 5], - [3, 1], - [4, 3], - [1, 2], - [6, 1], - [7, 6], - [6, 3]]], - ['edgelist', - 'G878', - 7, - [[7, 2], - [3, 7], - [2, 3], - [1, 2], - [4, 1], - [5, 4], - [6, 5], - [4, 6], - [3, 1], - [5, 1], - [6, 7]]], - ['edgelist', - 'G879', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [5, 4], - [1, 3]]], - ['edgelist', - 'G880', - 7, - [[4, 7], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [7, 6], - [3, 7], - [6, 2], - [1, 4], - [2, 7], - [1, 2], - [1, 7]]], - ['edgelist', - 'G881', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [6, 2], - [3, 5]]], - ['edgelist', - 'G882', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [3, 4]]], - ['edgelist', - 'G883', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 3], - [4, 2], - [5, 1], - [3, 5], - [6, 2], - [1, 6], - [5, 6], - [4, 5], - [6, 4]]], - ['edgelist', - 'G884', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3], - [2, 6], - [7, 2]]], - ['edgelist', - 'G885', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3], - [5, 7], - [6, 4]]], - ['edgelist', - 'G886', - 7, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4], - [2, 7]]], - ['edgelist', - 'G887', - 7, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4], - [4, 7]]], - ['edgelist', - 'G888', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6], - [5, 7]]], - ['edgelist', - 'G889', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6], - [7, 2]]], - ['edgelist', - 'G890', - 7, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4], - [1, 7]]], - ['edgelist', - 'G891', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6], - [1, 7]]], - ['edgelist', - 'G892', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6], - [3, 7]]], - ['edgelist', - 'G893', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [1, 3], - [2, 7]]], - ['edgelist', - 'G894', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [1, 3], - [5, 7]]], - ['edgelist', - 'G895', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [1, 3], - [7, 2], - [7, 6]]], - ['edgelist', - 'G896', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 2], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [2, 7]]], - ['edgelist', - 'G897', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [4, 6], - [1, 4], - [6, 7]]], - ['edgelist', - 'G898', - 7, - [[4, 7], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [7, 6], - [3, 7], - [6, 2], - [1, 4], - [2, 7], - [1, 2], - [2, 5]]], - ['edgelist', - 'G899', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [4, 6], - [1, 4], - [4, 7]]], - ['edgelist', - 'G900', - 7, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4], - [5, 7]]], - ['edgelist', - 'G901', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 2], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [3, 7]]], - ['edgelist', - 'G902', - 7, - [[4, 7], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [7, 6], - [3, 7], - [6, 2], - [1, 4], - [2, 7], - [1, 2], - [1, 5]]], - ['edgelist', - 'G903', - 7, - [[2, 4], - [5, 2], - [4, 5], - [3, 4], - [1, 3], - [5, 1], - [6, 5], - [3, 6], - [5, 3], - [1, 6], - [2, 6], - [4, 7]]], - ['edgelist', - 'G904', - 7, - [[2, 4], - [5, 2], - [4, 5], - [3, 4], - [1, 3], - [5, 1], - [6, 5], - [3, 6], - [5, 3], - [1, 6], - [2, 6], - [1, 7]]], - ['edgelist', - 'G905', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 1], - [5, 6], - [6, 7]]], - ['edgelist', - 'G906', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [1, 4], - [6, 7]]], - ['edgelist', - 'G907', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3], - [5, 7]]], - ['edgelist', - 'G908', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3], - [1, 7]]], - ['edgelist', - 'G909', - 7, - [[4, 7], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [7, 6], - [3, 7], - [6, 2], - [1, 4], - [2, 7], - [1, 2], - [5, 6]]], - ['edgelist', - 'G910', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3], - [4, 7]]], - ['edgelist', - 'G911', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [1, 4], - [1, 7]]], - ['edgelist', - 'G912', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [1, 3], - [6, 7]]], - ['edgelist', - 'G913', - 7, - [[1, 4], - [7, 1], - [6, 7], - [4, 6], - [2, 4], - [7, 2], - [5, 7], - [4, 5], - [3, 4], - [7, 3], - [4, 7], - [6, 5]]], - ['edgelist', - 'G914', - 7, - [[1, 2], - [5, 1], - [6, 5], - [2, 6], - [5, 2], - [3, 5], - [2, 3], - [7, 2], - [5, 7], - [3, 7], - [4, 3], - [5, 4]]], - ['edgelist', - 'G915', - 7, - [[5, 2], - [4, 3], - [4, 1], - [5, 3], - [6, 2], - [6, 1], - [4, 6], - [5, 4], - [6, 5], - [7, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G916', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [5, 3], - [4, 5], - [6, 4], - [1, 6], - [7, 4], - [2, 7]]], - ['edgelist', - 'G917', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [7, 4], - [1, 7], - [6, 1], - [2, 6], - [5, 2], - [3, 5]]], - ['edgelist', - 'G918', - 7, - [[7, 3], - [6, 7], - [4, 6], - [3, 4], - [2, 3], - [5, 2], - [6, 5], - [3, 6], - [5, 3], - [1, 5], - [2, 1], - [6, 2]]], - ['edgelist', - 'G919', - 7, - [[6, 5], - [7, 6], - [4, 7], - [5, 4], - [1, 5], - [4, 1], - [2, 4], - [1, 2], - [5, 2], - [4, 6], - [3, 4], - [5, 3]]], - ['edgelist', - 'G920', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [6, 1], - [2, 6], - [7, 2], - [1, 7]]], - ['edgelist', - 'G921', - 7, - [[2, 3], - [1, 2], - [3, 1], - [4, 3], - [1, 4], - [2, 4], - [5, 3], - [1, 5], - [6, 5], - [3, 6], - [7, 3], - [2, 7]]], - ['edgelist', - 'G922', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 3], - [5, 6], - [7, 5], - [4, 7]]], - ['edgelist', - 'G923', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [6, 1], - [2, 6], - [7, 2], - [3, 7]]], - ['edgelist', - 'G924', - 7, - [[2, 3], - [1, 2], - [3, 1], - [4, 3], - [1, 4], - [2, 4], - [5, 3], - [1, 5], - [7, 5], - [3, 7], - [6, 3], - [5, 6]]], - ['edgelist', - 'G925', - 7, - [[2, 1], - [3, 2], - [1, 3], - [4, 1], - [5, 4], - [1, 5], - [6, 1], - [4, 6], - [5, 6], - [7, 5], - [4, 7], - [7, 1]]], - ['edgelist', - 'G926', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [7, 6], - [3, 7]]], - ['edgelist', - 'G927', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [7, 5], - [1, 7], - [6, 1], - [4, 6]]], - ['edgelist', - 'G928', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [2, 6], - [7, 2], - [1, 7], - [6, 1], - [5, 6]]], - ['edgelist', - 'G929', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [7, 2], - [1, 7], - [6, 1], - [3, 6]]], - ['edgelist', - 'G930', - 7, - [[6, 5], - [4, 6], - [5, 4], - [7, 5], - [4, 7], - [3, 4], - [5, 3], - [1, 5], - [4, 1], - [2, 1], - [3, 2], - [7, 3]]], - ['edgelist', - 'G931', - 7, - [[5, 2], - [4, 3], - [4, 1], - [5, 3], - [6, 2], - [6, 1], - [4, 6], - [5, 4], - [6, 5], - [7, 6], - [1, 7], - [4, 7]]], - ['edgelist', - 'G932', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [7, 2], - [1, 7], - [6, 1], - [2, 6]]], - ['edgelist', - 'G933', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [4, 2], - [6, 2], - [7, 6], - [5, 7]]], - ['edgelist', - 'G934', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [6, 5], - [4, 6], - [7, 4], - [5, 7]]], - ['edgelist', - 'G935', - 7, - [[2, 1], - [3, 2], - [4, 3], - [1, 4], - [5, 4], - [2, 5], - [5, 1], - [6, 5], - [1, 6], - [4, 6], - [7, 1], - [2, 7]]], - ['edgelist', - 'G936', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [7, 3], - [5, 7], - [6, 1], - [2, 6]]], - ['edgelist', - 'G937', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [6, 5], - [3, 6], - [2, 6], - [7, 2], - [6, 7]]], - ['edgelist', - 'G938', - 7, - [[1, 3], - [2, 1], - [3, 2], - [1, 4], - [4, 2], - [5, 3], - [6, 4], - [7, 2], - [7, 5], - [5, 1], - [4, 5], - [2, 6]]], - ['edgelist', - 'G939', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 3], - [5, 4], - [5, 2], - [1, 5], - [6, 3], - [6, 5], - [7, 1], - [4, 7]]], - ['edgelist', - 'G940', - 7, - [[6, 1], - [3, 6], - [7, 3], - [4, 7], - [3, 4], - [2, 3], - [1, 2], - [5, 1], - [2, 5], - [6, 2], - [7, 6], - [1, 3]]], - ['edgelist', - 'G941', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [7, 5], - [3, 7], - [6, 3], - [4, 6]]], - ['edgelist', - 'G942', - 7, - [[1, 3], - [2, 1], - [6, 2], - [4, 6], - [7, 4], - [3, 7], - [5, 3], - [4, 5], - [6, 5], - [3, 6], - [2, 3], - [5, 2]]], - ['edgelist', - 'G943', - 7, - [[1, 3], - [2, 1], - [3, 2], - [1, 4], - [4, 2], - [5, 1], - [2, 5], - [5, 3], - [4, 5], - [6, 5], - [7, 6], - [4, 7]]], - ['edgelist', - 'G944', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [4, 2], - [4, 3], - [7, 2], - [3, 7], - [5, 7], - [4, 5], - [6, 4], - [7, 6]]], - ['edgelist', - 'G945', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [6, 1], - [7, 6], - [1, 7], - [4, 5]]], - ['edgelist', - 'G946', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 2], - [3, 6], - [7, 1], - [4, 7]]], - ['edgelist', - 'G947', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 4], - [6, 2], - [6, 5], - [7, 4], - [5, 7], - [2, 7], - [7, 6]]], - ['edgelist', - 'G948', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G949', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 3], - [7, 6], - [1, 7], - [7, 3], - [1, 6], - [2, 6], - [7, 2]]], - ['edgelist', - 'G950', - 7, - [[1, 2], - [7, 6], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [7, 4], - [7, 5], - [6, 2]]], - ['edgelist', - 'G951', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5], - [7, 2], - [6, 7]]], - ['edgelist', - 'G952', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 2], - [5, 6], - [7, 5], - [6, 7]]], - ['edgelist', - 'G953', - 7, - [[3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 2], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [7, 4], - [7, 2]]], - ['edgelist', - 'G954', - 7, - [[1, 5], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G955', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G956', - 7, - [[1, 2], - [3, 5], - [1, 3], - [3, 2], - [5, 7], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4], - [7, 2], - [3, 7]]], - ['edgelist', - 'G957', - 7, - [[1, 2], - [2, 3], - [3, 4], - [6, 5], - [1, 5], - [6, 4], - [6, 2], - [7, 4], - [7, 5], - [5, 3], - [1, 4], - [5, 4]]], - ['edgelist', - 'G958', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [7, 2], - [7, 6]]], - ['edgelist', - 'G959', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 2], - [7, 6], - [1, 7], - [2, 7]]], - ['edgelist', - 'G960', - 7, - [[1, 4], - [5, 1], - [3, 5], - [4, 3], - [2, 4], - [5, 2], - [2, 1], - [6, 2], - [6, 3], - [7, 2], - [3, 7], - [5, 7]]], - ['edgelist', - 'G961', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [6, 5], - [5, 2], - [2, 7], - [6, 4], - [2, 6], - [7, 3]]], - ['edgelist', - 'G962', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [6, 5], - [5, 2], - [2, 6], - [6, 4], - [7, 2], - [5, 7]]], - ['edgelist', - 'G963', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [6, 5], - [5, 2], - [2, 6], - [6, 4], - [7, 2], - [1, 7]]], - ['edgelist', - 'G964', - 7, - [[5, 4], - [2, 3], - [1, 2], - [1, 4], - [5, 1], - [7, 5], - [5, 3], - [6, 5], - [7, 3], - [7, 4], - [4, 3], - [6, 2]]], - ['edgelist', - 'G965', - 7, - [[3, 4], - [5, 3], - [1, 5], - [7, 1], - [7, 6], - [5, 6], - [2, 4], - [6, 2], - [1, 6], - [7, 2], - [4, 7], - [6, 4]]], - ['edgelist', - 'G966', - 7, - [[1, 4], - [1, 6], - [2, 3], - [2, 6], - [2, 7], - [3, 5], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G967', - 7, - [[1, 4], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G968', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [5, 4], - [6, 4], - [7, 2], - [4, 7], - [7, 3], - [1, 7], - [5, 7]]], - ['edgelist', - 'G969', - 7, - [[1, 2], - [3, 5], - [1, 3], - [7, 2], - [4, 2], - [4, 3], - [5, 2], - [6, 2], - [6, 3], - [6, 4], - [1, 4], - [5, 7]]], - ['edgelist', - 'G970', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [7, 4], - [2, 7]]], - ['edgelist', - 'G971', - 7, - [[5, 4], - [2, 3], - [6, 1], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [6, 2], - [7, 3], - [7, 4], - [4, 3], - [7, 5]]], - ['edgelist', - 'G972', - 7, - [[3, 4], - [5, 3], - [6, 5], - [1, 6], - [7, 1], - [2, 7], - [4, 2], - [7, 4], - [6, 4], - [2, 6], - [5, 1], - [4, 1]]], - ['edgelist', - 'G973', - 7, - [[1, 4], - [1, 6], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G974', - 7, - [[4, 3], - [2, 3], - [6, 1], - [1, 4], - [5, 1], - [5, 2], - [7, 5], - [6, 2], - [7, 3], - [7, 4], - [7, 2], - [1, 7]]], - ['edgelist', - 'G975', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 7], - [3, 4], - [3, 5], - [3, 7], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G976', - 7, - [[1, 4], - [1, 6], - [2, 3], - [2, 5], - [2, 7], - [3, 5], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G977', - 7, - [[1, 4], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G978', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G979', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [6, 5], - [5, 2], - [4, 5], - [6, 4], - [3, 7], - [7, 2]]], - ['edgelist', - 'G980', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [6, 5], - [5, 2], - [4, 5], - [6, 4], - [7, 2], - [7, 6]]], - ['edgelist', - 'G981', - 7, - [[1, 3], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G982', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G983', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 2], - [3, 5], - [6, 3], - [1, 6], - [5, 4], - [7, 6], - [7, 5], - [4, 6]]], - ['edgelist', - 'G984', - 7, - [[1, 3], - [1, 7], - [2, 3], - [2, 5], - [2, 6], - [3, 4], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G985', - 7, - [[1, 3], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G986', - 7, - [[1, 3], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G987', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 7], - [3, 4], - [3, 5], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [6, 7]]], - ['edgelist', - 'G988', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G989', - 7, - [[4, 1], - [3, 4], - [5, 3], - [1, 5], - [6, 2], - [6, 3], - [7, 2], - [7, 1], - [4, 7], - [6, 4], - [5, 6], - [7, 5]]], - ['edgelist', - 'G990', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G991', - 7, - [[1, 2], - [1, 3], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G992', - 7, - [[4, 1], - [3, 4], - [5, 3], - [1, 5], - [6, 2], - [6, 3], - [7, 2], - [7, 1], - [4, 7], - [6, 4], - [7, 5], - [2, 4]]], - ['edgelist', - 'G993', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G994', - 7, - [[3, 4], - [5, 3], - [6, 3], - [5, 2], - [7, 1], - [4, 1], - [4, 2], - [7, 4], - [6, 7], - [2, 6], - [5, 1], - [4, 5]]], - ['edgelist', - 'G995', - 7, - [[3, 4], - [5, 3], - [5, 2], - [3, 6], - [7, 1], - [7, 5], - [4, 2], - [7, 4], - [1, 4], - [2, 6], - [5, 1], - [6, 4]]], - ['edgelist', - 'G996', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 7], - [3, 4], - [3, 7], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G997', - 7, - [[4, 1], - [3, 4], - [5, 3], - [1, 5], - [6, 2], - [6, 3], - [7, 2], - [7, 1], - [4, 7], - [2, 4], - [7, 5], - [6, 5]]], - ['edgelist', - 'G998', - 7, - [[7, 4], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [1, 7], - [5, 2], - [4, 5], - [7, 6], - [6, 2], - [1, 5]]], - ['edgelist', - 'G999', - 7, - [[1, 4], - [1, 6], - [1, 7], - [2, 3], - [2, 6], - [2, 7], - [3, 5], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1000', - 7, - [[1, 4], - [1, 6], - [1, 7], - [2, 3], - [2, 5], - [2, 7], - [3, 4], - [3, 6], - [4, 5], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1001', - 7, - [[1, 4], - [1, 6], - [1, 7], - [2, 3], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1002', - 7, - [[1, 5], - [4, 1], - [2, 4], - [5, 2], - [2, 1], - [5, 6], - [3, 5], - [7, 3], - [6, 7], - [3, 6], - [4, 3], - [7, 4]]], - ['edgelist', - 'G1003', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [6, 3], - [6, 5], - [7, 5], - [7, 4], - [7, 3], - [6, 4]]], - ['edgelist', - 'G1004', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1005', - 7, - [[4, 1], - [5, 3], - [4, 2], - [5, 1], - [6, 3], - [6, 2], - [5, 4], - [6, 5], - [4, 6], - [7, 2], - [1, 7], - [3, 7]]], - ['edgelist', - 'G1006', - 7, - [[2, 1], - [5, 2], - [1, 5], - [6, 1], - [7, 6], - [2, 7], - [4, 5], - [6, 4], - [3, 4], - [6, 3], - [7, 4], - [3, 7]]], - ['edgelist', - 'G1007', - 7, - [[1, 2], - [3, 1], - [3, 4], - [4, 5], - [1, 5], - [1, 6], - [7, 2], - [5, 7], - [7, 6], - [3, 7], - [4, 2], - [6, 4]]], - ['edgelist', - 'G1008', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [7, 1], - [7, 2], - [7, 3], - [7, 4], - [7, 5], - [7, 6]]], - ['edgelist', - 'G1009', - 7, - [[4, 7], - [2, 3], - [1, 7], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 2], - [3, 6], - [5, 6], - [7, 5]]], - ['edgelist', - 'G1010', - 7, - [[2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1011', - 7, - [[2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1012', - 7, - [[1, 7], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1013', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [5, 4], - [1, 3], - [7, 5]]], - ['edgelist', - 'G1014', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [1, 5], - [2, 7]]], - ['edgelist', - 'G1015', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1016', - 7, - [[1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1017', - 7, - [[1, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1018', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1019', - 7, - [[1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1020', - 7, - [[1, 7], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1021', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3], - [5, 6], - [2, 7]]], - ['edgelist', - 'G1022', - 7, - [[1, 2], - [2, 3], - [3, 4], - [5, 6], - [1, 5], - [2, 4], - [5, 2], - [3, 5], - [1, 4], - [6, 4], - [5, 4], - [1, 3], - [6, 7]]], - ['edgelist', - 'G1023', - 7, - [[1, 6], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1024', - 7, - [[1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1025', - 7, - [[6, 7], - [1, 6], - [7, 1], - [5, 7], - [6, 5], - [2, 6], - [7, 2], - [4, 7], - [6, 4], - [3, 6], - [7, 3], - [2, 1], - [3, 2]]], - ['edgelist', - 'G1026', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 7]]], - ['edgelist', - 'G1027', - 7, - [[4, 5], - [1, 4], - [5, 1], - [2, 5], - [4, 2], - [3, 4], - [5, 3], - [2, 1], - [3, 2], - [7, 1], - [4, 7], - [6, 4], - [5, 6]]], - ['edgelist', - 'G1028', - 7, - [[4, 5], - [1, 4], - [5, 1], - [2, 5], - [4, 2], - [3, 4], - [5, 3], - [2, 1], - [3, 2], - [7, 1], - [4, 7], - [6, 4], - [1, 6]]], - ['edgelist', - 'G1029', - 7, - [[4, 5], - [1, 4], - [5, 1], - [2, 5], - [4, 2], - [3, 4], - [5, 3], - [2, 1], - [3, 2], - [7, 5], - [1, 7], - [6, 1], - [4, 6]]], - ['edgelist', - 'G1030', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1031', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 6], - [5, 7]]], - ['edgelist', - 'G1032', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [6, 2], - [7, 6], - [2, 7]]], - ['edgelist', - 'G1033', - 7, - [[1, 5], - [1, 7], - [2, 4], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1034', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1035', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1036', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [6, 4], - [7, 6], - [5, 7]]], - ['edgelist', - 'G1037', - 7, - [[1, 6], - [1, 7], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1038', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [7, 2], - [7, 6], - [6, 2]]], - ['edgelist', - 'G1039', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 5], - [1, 6], - [7, 1], - [4, 7], - [7, 5]]], - ['edgelist', - 'G1040', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [7, 2], - [6, 2], - [3, 7]]], - ['edgelist', - 'G1041', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [6, 7]]], - ['edgelist', - 'G1042', - 7, - [[2, 1], - [3, 2], - [5, 3], - [2, 5], - [4, 2], - [1, 4], - [3, 4], - [6, 3], - [2, 6], - [1, 6], - [7, 1], - [2, 7], - [3, 7]]], - ['edgelist', - 'G1043', - 7, - [[3, 6], - [7, 3], - [6, 7], - [5, 6], - [4, 5], - [1, 4], - [5, 1], - [2, 5], - [4, 2], - [7, 4], - [3, 2], - [5, 3], - [4, 3]]], - ['edgelist', - 'G1044', - 7, - [[1, 4], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1045', - 7, - [[3, 5], - [4, 3], - [2, 4], - [5, 2], - [1, 5], - [4, 1], - [7, 4], - [2, 7], - [6, 2], - [5, 6], - [7, 5], - [4, 6], - [2, 3]]], - ['edgelist', - 'G1046', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 5], - [3, 6], - [4, 6], - [4, 7]]], - ['edgelist', - 'G1047', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 6], - [6, 7]]], - ['edgelist', - 'G1048', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 6], - [4, 7], - [5, 6]]], - ['edgelist', - 'G1049', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 7], - [3, 5], - [3, 6], - [4, 5], - [4, 6]]], - ['edgelist', - 'G1050', - 7, - [[1, 3], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1051', - 7, - [[3, 6], - [2, 3], - [6, 2], - [5, 6], - [4, 5], - [1, 4], - [5, 1], - [4, 3], - [5, 3], - [2, 4], - [7, 4], - [3, 7], - [2, 7]]], - ['edgelist', - 'G1052', - 7, - [[1, 5], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1053', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [1, 5], - [7, 2], - [5, 7]]], - ['edgelist', - 'G1054', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [2, 1], - [6, 3], - [6, 1], - [7, 6], - [2, 7], - [5, 1]]], - ['edgelist', - 'G1055', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [2, 4], - [4, 3], - [5, 1], - [3, 6], - [4, 5], - [6, 4], - [1, 6], - [7, 5], - [7, 2]]], - ['edgelist', - 'G1056', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [2, 1], - [6, 3], - [7, 3], - [6, 7], - [1, 6], - [2, 3]]], - ['edgelist', - 'G1057', - 7, - [[6, 5], - [7, 3], - [7, 5], - [5, 4], - [6, 1], - [4, 2], - [4, 3], - [7, 4], - [6, 7], - [5, 1], - [2, 5], - [6, 2], - [1, 4]]], - ['edgelist', - 'G1058', - 7, - [[1, 3], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1059', - 7, - [[2, 6], - [5, 2], - [1, 5], - [6, 1], - [3, 6], - [5, 3], - [4, 5], - [6, 4], - [1, 2], - [3, 1], - [4, 3], - [7, 6], - [7, 5]]], - ['edgelist', - 'G1060', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [1, 5], - [1, 7], - [5, 7]]], - ['edgelist', - 'G1061', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [6, 1], - [5, 6], - [2, 6], - [7, 2], - [1, 7], - [4, 7]]], - ['edgelist', - 'G1062', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1063', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [5, 2], - [6, 4], - [3, 6], - [2, 1], - [7, 4], - [5, 7], - [6, 2]]], - ['edgelist', - 'G1064', - 7, - [[6, 3], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [2, 1], - [7, 3], - [7, 4], - [2, 3], - [4, 2], - [5, 1]]], - ['edgelist', - 'G1065', - 7, - [[2, 1], - [3, 2], - [1, 3], - [1, 4], - [4, 3], - [7, 3], - [2, 7], - [6, 2], - [7, 6], - [5, 7], - [6, 5], - [1, 6], - [5, 1]]], - ['edgelist', - 'G1066', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G1067', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1068', - 7, - [[1, 2], - [2, 3], - [5, 2], - [4, 2], - [1, 5], - [3, 4], - [1, 4], - [3, 1], - [6, 1], - [7, 6], - [5, 7], - [4, 6], - [5, 3]]], - ['edgelist', - 'G1069', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1070', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [1, 5], - [3, 4], - [7, 6], - [1, 7]]], - ['edgelist', - 'G1071', - 7, - [[6, 3], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [2, 1], - [7, 3], - [7, 4], - [3, 4], - [6, 1], - [5, 1]]], - ['edgelist', - 'G1072', - 7, - [[1, 2], - [2, 3], - [3, 4], - [6, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [7, 4], - [7, 5], - [5, 3], - [1, 4]]], - ['edgelist', - 'G1073', - 7, - [[1, 2], - [1, 7], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1074', - 7, - [[1, 2], - [1, 7], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1075', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [7, 3], - [1, 7], - [6, 1], - [3, 6], - [6, 4], - [5, 6], - [7, 5], - [4, 7]]], - ['edgelist', - 'G1076', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [7, 6], - [1, 7], - [1, 3], - [3, 6], - [6, 4], - [5, 6], - [7, 5], - [4, 7]]], - ['edgelist', - 'G1077', - 7, - [[4, 5], - [1, 4], - [5, 1], - [4, 7], - [4, 2], - [3, 4], - [5, 3], - [2, 1], - [3, 2], - [6, 3], - [4, 6], - [7, 3], - [6, 7]]], - ['edgelist', - 'G1078', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5], - [7, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G1079', - 7, - [[2, 1], - [3, 2], - [7, 1], - [2, 5], - [4, 2], - [1, 4], - [3, 4], - [2, 7], - [2, 6], - [3, 7], - [5, 4], - [6, 5], - [7, 6]]], - ['edgelist', - 'G1080', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 6], - [3, 7], - [4, 6], - [5, 7]]], - ['edgelist', - 'G1081', - 7, - [[1, 7], - [2, 3], - [3, 4], - [1, 4], - [5, 3], - [6, 1], - [7, 4], - [5, 2], - [4, 5], - [7, 6], - [2, 6], - [4, 6], - [2, 4]]], - ['edgelist', - 'G1082', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [7, 5], - [5, 4], - [6, 5], - [6, 3], - [7, 1], - [4, 7], - [4, 6]]], - ['edgelist', - 'G1083', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 7], - [1, 5], - [7, 6], - [1, 7], - [7, 5], - [3, 6], - [6, 4], - [5, 6], - [2, 6], - [7, 2]]], - ['edgelist', - 'G1084', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1085', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1086', - 7, - [[3, 4], - [6, 3], - [7, 6], - [4, 7], - [5, 4], - [6, 5], - [1, 6], - [3, 1], - [2, 3], - [1, 2], - [6, 2], - [5, 3], - [7, 5]]], - ['edgelist', - 'G1087', - 7, - [[3, 2], - [1, 6], - [7, 1], - [5, 7], - [6, 5], - [2, 6], - [7, 2], - [4, 7], - [6, 4], - [3, 6], - [7, 3], - [2, 1], - [4, 5]]], - ['edgelist', - 'G1088', - 7, - [[1, 2], - [3, 1], - [3, 4], - [4, 5], - [1, 5], - [1, 6], - [7, 2], - [5, 7], - [7, 6], - [3, 7], - [4, 2], - [6, 4], - [7, 1]]], - ['edgelist', - 'G1089', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 6], - [2, 7], - [3, 4], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1090', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [5, 7], - [6, 2], - [5, 6], - [4, 2], - [6, 3], - [7, 1], - [7, 2], - [3, 2], - [5, 2]]], - ['edgelist', - 'G1091', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 4], - [6, 5], - [6, 3], - [6, 2], - [7, 6], - [2, 7], - [3, 7]]], - ['edgelist', - 'G1092', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G1093', - 7, - [[4, 1], - [3, 4], - [5, 3], - [1, 5], - [6, 2], - [6, 3], - [7, 2], - [7, 1], - [4, 7], - [2, 4], - [7, 5], - [6, 5], - [6, 4]]], - ['edgelist', - 'G1094', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 5], - [2, 6], - [3, 4], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1095', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1096', - 7, - [[1, 3], - [1, 6], - [1, 7], - [2, 3], - [2, 5], - [2, 7], - [3, 4], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1097', - 7, - [[4, 5], - [6, 1], - [4, 6], - [1, 7], - [7, 5], - [3, 4], - [5, 3], - [2, 1], - [3, 2], - [2, 7], - [6, 2], - [3, 6], - [7, 3]]], - ['edgelist', - 'G1098', - 7, - [[1, 3], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1099', - 7, - [[4, 1], - [3, 4], - [5, 3], - [1, 5], - [6, 4], - [6, 3], - [6, 5], - [2, 4], - [2, 1], - [5, 2], - [7, 1], - [4, 7], - [2, 7]]], - ['edgelist', - 'G1100', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [7, 1], - [2, 7], - [7, 4], - [5, 7], - [2, 3], - [6, 1]]], - ['edgelist', - 'G1101', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1102', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6]]], - ['edgelist', - 'G1103', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [6, 4], - [6, 5], - [7, 5], - [7, 3], - [7, 6], - [6, 3], - [4, 7]]], - ['edgelist', - 'G1104', - 7, - [[1, 2], - [1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1105', - 7, - [[1, 2], - [1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1106', - 7, - [[1, 2], - [3, 1], - [3, 4], - [4, 5], - [1, 5], - [1, 6], - [7, 2], - [5, 7], - [7, 6], - [3, 7], - [4, 2], - [6, 4], - [3, 2]]], - ['edgelist', - 'G1107', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [2, 4], - [3, 1], - [5, 1], - [6, 4]]], - ['edgelist', - 'G1108', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [3, 4], - [1, 5], - [2, 7]]], - ['edgelist', - 'G1109', - 7, - [[1, 7], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1110', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1111', - 7, - [[1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1112', - 7, - [[1, 4], - [2, 3], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1113', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [4, 7], - [6, 4], - [5, 6], - [7, 5]]], - ['edgelist', - 'G1114', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [7, 3], - [2, 7], - [6, 2], - [1, 6]]], - ['edgelist', - 'G1115', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [6, 3], - [4, 6], - [7, 5], - [1, 7]]], - ['edgelist', - 'G1116', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [3, 5], - [6, 2], - [1, 4], - [2, 5], - [1, 2], - [1, 5], - [7, 5], - [1, 7]]], - ['edgelist', - 'G1117', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [4, 5], - [4, 6], - [5, 7]]], - ['edgelist', - 'G1118', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 7], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1119', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1120', - 7, - [[4, 5], - [2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [1, 2], - [6, 2], - [1, 5], - [2, 5], - [6, 4], - [3, 6], - [7, 5], - [1, 7]]], - ['edgelist', - 'G1121', - 7, - [[2, 4], - [3, 2], - [1, 3], - [6, 1], - [5, 6], - [4, 5], - [6, 4], - [3, 6], - [2, 1], - [5, 2], - [7, 2], - [6, 2], - [3, 7], - [1, 5]]], - ['edgelist', - 'G1122', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 7], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1123', - 7, - [[3, 4], - [5, 3], - [7, 4], - [5, 1], - [7, 1], - [4, 5], - [4, 2], - [6, 5], - [6, 1], - [1, 4], - [2, 6], - [6, 4], - [7, 5], - [7, 2]]], - ['edgelist', - 'G1124', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [6, 4], - [7, 6], - [5, 7], - [6, 5]]], - ['edgelist', - 'G1125', - 7, - [[4, 2], - [2, 5], - [3, 4], - [4, 5], - [1, 5], - [2, 6], - [1, 2], - [1, 3], - [3, 6], - [6, 4], - [5, 6], - [2, 3], - [7, 3], - [6, 7]]], - ['edgelist', - 'G1126', - 7, - [[1, 4], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1127', - 7, - [[1, 4], - [1, 7], - [2, 3], - [2, 5], - [2, 6], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1128', - 7, - [[1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1129', - 7, - [[1, 2], - [1, 7], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1130', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1131', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [5, 7], - [6, 3], - [2, 6], - [1, 6], - [7, 4]]], - ['edgelist', - 'G1132', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [6, 1], - [6, 2], - [6, 3], - [6, 4], - [6, 5], - [5, 3], - [4, 1], - [7, 2], - [6, 7]]], - ['edgelist', - 'G1133', - 7, - [[1, 5], - [1, 7], - [2, 3], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1134', - 7, - [[1, 5], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1135', - 7, - [[1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1136', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [2, 3], - [6, 3], - [5, 1], - [4, 2], - [6, 1], - [7, 6], - [7, 5], - [1, 2]]], - ['edgelist', - 'G1137', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [6, 3], - [7, 1], - [7, 2], - [6, 1], - [2, 3], - [4, 2], - [5, 1]]], - ['edgelist', - 'G1138', - 7, - [[6, 7], - [1, 6], - [7, 1], - [5, 7], - [6, 5], - [2, 6], - [7, 2], - [4, 7], - [6, 4], - [3, 6], - [7, 3], - [2, 1], - [3, 2], - [4, 5]]], - ['edgelist', - 'G1139', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 6], - [2, 7], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1140', - 7, - [[1, 2], - [3, 1], - [3, 4], - [4, 5], - [1, 5], - [1, 6], - [7, 2], - [5, 7], - [7, 6], - [3, 7], - [4, 2], - [6, 4], - [7, 1], - [4, 7]]], - ['edgelist', - 'G1141', - 7, - [[4, 2], - [5, 3], - [5, 6], - [5, 1], - [2, 5], - [1, 4], - [6, 1], - [6, 3], - [7, 2], - [4, 7], - [7, 1], - [6, 7], - [7, 3], - [5, 7]]], - ['edgelist', - 'G1142', - 7, - [[1, 5], - [4, 1], - [3, 4], - [5, 3], - [2, 5], - [4, 2], - [2, 1], - [3, 2], - [6, 5], - [2, 6], - [7, 2], - [4, 7], - [1, 6], - [7, 1]]], - ['edgelist', - 'G1143', - 7, - [[4, 5], - [5, 3], - [2, 6], - [5, 1], - [2, 5], - [6, 4], - [4, 1], - [6, 3], - [7, 5], - [1, 7], - [4, 7], - [3, 7], - [6, 7], - [2, 7]]], - ['edgelist', - 'G1144', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 5], - [2, 6], - [3, 4], - [3, 7], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1145', - 7, - [[3, 4], - [5, 3], - [7, 4], - [5, 1], - [5, 6], - [4, 5], - [4, 2], - [6, 3], - [2, 7], - [6, 7], - [7, 1], - [6, 4], - [7, 5], - [1, 2]]], - ['edgelist', - 'G1146', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1147', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1148', - 7, - [[3, 4], - [5, 3], - [7, 4], - [5, 1], - [2, 5], - [7, 1], - [4, 2], - [6, 3], - [5, 6], - [6, 7], - [2, 6], - [6, 4], - [7, 5], - [4, 1]]], - ['edgelist', - 'G1149', - 7, - [[4, 2], - [5, 3], - [1, 4], - [5, 1], - [2, 5], - [6, 4], - [6, 1], - [6, 3], - [7, 5], - [2, 7], - [7, 4], - [1, 7], - [7, 6], - [3, 7]]], - ['edgelist', - 'G1150', - 7, - [[1, 2], - [5, 3], - [4, 1], - [5, 1], - [5, 6], - [6, 4], - [2, 4], - [6, 3], - [7, 5], - [3, 7], - [7, 6], - [4, 7], - [7, 2], - [1, 7]]], - ['edgelist', - 'G1151', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 7], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1152', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1153', - 7, - [[3, 4], - [5, 3], - [7, 4], - [5, 1], - [2, 5], - [7, 2], - [4, 2], - [6, 3], - [6, 1], - [6, 7], - [5, 6], - [6, 4], - [7, 1], - [4, 1]]], - ['edgelist', - 'G1154', - 7, - [[3, 4], - [5, 3], - [4, 1], - [5, 1], - [5, 6], - [4, 5], - [4, 2], - [6, 3], - [1, 2], - [6, 7], - [7, 1], - [6, 4], - [7, 5], - [2, 7]]], - ['edgelist', - 'G1155', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1156', - 7, - [[1, 4], - [1, 5], - [1, 7], - [2, 3], - [2, 5], - [2, 6], - [3, 4], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1157', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1158', - 7, - [[1, 2], - [1, 6], - [1, 7], - [2, 5], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1159', - 7, - [[1, 2], - [1, 5], - [1, 7], - [2, 4], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1160', - 7, - [[3, 4], - [5, 3], - [7, 4], - [5, 1], - [2, 5], - [5, 6], - [4, 2], - [6, 3], - [6, 1], - [7, 2], - [1, 7], - [6, 4], - [7, 5], - [4, 1]]], - ['edgelist', - 'G1161', - 7, - [[1, 2], - [1, 6], - [1, 7], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1162', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1163', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [6, 7]]], - ['edgelist', - 'G1164', - 7, - [[3, 4], - [5, 3], - [7, 4], - [5, 1], - [5, 6], - [4, 6], - [4, 2], - [6, 3], - [4, 1], - [2, 5], - [7, 1], - [2, 7], - [7, 5], - [1, 2]]], - ['edgelist', - 'G1165', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G1166', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1167', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 7], - [4, 5], - [4, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1168', - 7, - [[1, 4], - [1, 5], - [1, 6], - [2, 3], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1169', - 7, - [[1, 4], - [1, 5], - [1, 6], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 7], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1170', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [6, 7], - [1, 7], - [1, 3], - [6, 1], - [4, 6], - [2, 4], - [7, 2], - [5, 7], - [3, 5]]], - ['edgelist', - 'G1171', - 7, - [[1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 7], - [5, 6]]], - ['edgelist', - 'G1172', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [5, 6]]], - ['edgelist', - 'G1173', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [2, 4], - [3, 1], - [5, 1], - [6, 4], - [2, 7]]], - ['edgelist', - 'G1174', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [3, 5], - [6, 3], - [2, 6], - [2, 5], - [2, 4], - [3, 1], - [5, 1], - [6, 4], - [1, 7]]], - ['edgelist', - 'G1175', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [4, 5], - [4, 6], - [4, 7], - [6, 7]]], - ['edgelist', - 'G1176', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 6], - [2, 7], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1177', - 7, - [[4, 5], - [5, 6], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [4, 7], - [5, 7], - [6, 7], - [2, 6], - [4, 6], - [3, 4], - [3, 5], - [2, 7], - [1, 2]]], - ['edgelist', - 'G1178', - 7, - [[4, 5], - [5, 6], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [4, 7], - [2, 4], - [2, 5], - [2, 6], - [4, 6], - [3, 4], - [3, 5], - [7, 2], - [5, 7]]], - ['edgelist', - 'G1179', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 2], - [5, 3], - [5, 4], - [6, 2], - [1, 6], - [6, 3], - [4, 6], - [5, 6], - [7, 2], - [6, 7]]], - ['edgelist', - 'G1180', - 7, - [[5, 4], - [5, 6], - [6, 4], - [1, 2], - [1, 6], - [1, 4], - [3, 5], - [2, 6], - [2, 4], - [7, 6], - [4, 7], - [7, 1], - [2, 7], - [7, 3], - [5, 7]]], - ['edgelist', - 'G1181', - 7, - [[4, 5], - [5, 6], - [6, 7], - [1, 5], - [1, 6], - [1, 7], - [4, 7], - [2, 4], - [5, 7], - [2, 6], - [4, 6], - [3, 4], - [3, 5], - [2, 7], - [1, 2]]], - ['edgelist', - 'G1182', - 7, - [[1, 3], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1183', - 7, - [[7, 2], - [5, 6], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [4, 7], - [2, 4], - [2, 5], - [2, 6], - [4, 6], - [3, 4], - [3, 5], - [6, 7], - [5, 7]]], - ['edgelist', - 'G1184', - 7, - [[4, 5], - [5, 6], - [1, 4], - [1, 5], - [1, 6], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [2, 6], - [4, 6], - [3, 4], - [3, 5], - [6, 7], - [6, 3]]], - ['edgelist', - 'G1185', - 7, - [[4, 5], - [5, 6], - [1, 4], - [1, 5], - [7, 1], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [2, 6], - [4, 6], - [3, 4], - [3, 5], - [6, 7], - [6, 3]]], - ['edgelist', - 'G1186', - 7, - [[1, 2], - [2, 3], - [1, 3], - [4, 1], - [2, 4], - [3, 4], - [6, 2], - [4, 6], - [5, 4], - [3, 5], - [7, 3], - [4, 7], - [7, 2], - [1, 6], - [5, 1]]], - ['edgelist', - 'G1187', - 7, - [[1, 2], - [3, 1], - [4, 3], - [5, 4], - [2, 5], - [4, 2], - [5, 3], - [1, 5], - [4, 1], - [7, 4], - [5, 7], - [6, 5], - [4, 6], - [7, 3], - [6, 2]]], - ['edgelist', - 'G1188', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [2, 3], - [2, 4], - [2, 5], - [3, 4], - [3, 5], - [4, 5], - [6, 4], - [5, 6], - [7, 5], - [6, 7], - [7, 4]]], - ['edgelist', - 'G1189', - 7, - [[1, 2], - [2, 3], - [3, 4], - [1, 4], - [5, 1], - [5, 4], - [5, 3], - [7, 2], - [3, 7], - [6, 3], - [5, 6], - [7, 5], - [1, 7], - [7, 6], - [4, 7]]], - ['edgelist', - 'G1190', - 7, - [[1, 2], - [6, 4], - [2, 4], - [1, 5], - [4, 1], - [5, 4], - [3, 5], - [6, 3], - [5, 6], - [7, 5], - [3, 7], - [7, 6], - [4, 7], - [7, 2], - [1, 7]]], - ['edgelist', - 'G1191', - 7, - [[6, 3], - [5, 6], - [4, 2], - [1, 5], - [1, 6], - [1, 4], - [3, 5], - [2, 6], - [2, 5], - [7, 4], - [2, 7], - [7, 1], - [6, 7], - [7, 3], - [5, 7]]], - ['edgelist', - 'G1192', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [5, 6], - [1, 6], - [1, 4], - [3, 1], - [4, 2], - [7, 5], - [6, 7], - [7, 4], - [1, 7], - [7, 3], - [2, 7]]], - ['edgelist', - 'G1193', - 7, - [[6, 3], - [4, 1], - [6, 4], - [1, 5], - [1, 6], - [5, 4], - [3, 5], - [2, 6], - [2, 5], - [7, 5], - [3, 7], - [7, 1], - [6, 7], - [7, 4], - [2, 7]]], - ['edgelist', - 'G1194', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1195', - 7, - [[7, 2], - [5, 6], - [1, 4], - [1, 5], - [1, 6], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [1, 7], - [4, 6], - [3, 4], - [3, 5], - [6, 7], - [6, 3]]], - ['edgelist', - 'G1196', - 7, - [[4, 5], - [1, 2], - [1, 4], - [1, 5], - [1, 6], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [2, 7], - [3, 4], - [3, 5], - [6, 7], - [6, 3]]], - ['edgelist', - 'G1197', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 7]]], - ['edgelist', - 'G1198', - 7, - [[6, 3], - [5, 6], - [6, 4], - [1, 5], - [1, 2], - [2, 4], - [3, 5], - [4, 1], - [2, 5], - [7, 5], - [2, 7], - [7, 1], - [4, 7], - [7, 3], - [6, 7]]], - ['edgelist', - 'G1199', - 7, - [[6, 1], - [5, 4], - [6, 4], - [6, 3], - [1, 2], - [2, 4], - [3, 5], - [4, 1], - [2, 5], - [7, 3], - [6, 7], - [7, 5], - [4, 7], - [7, 1], - [2, 7]]], - ['edgelist', - 'G1200', - 7, - [[4, 5], - [5, 6], - [1, 4], - [5, 7], - [1, 2], - [2, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [1, 6], - [3, 4], - [3, 5], - [6, 7], - [6, 3]]], - ['edgelist', - 'G1201', - 7, - [[1, 3], - [1, 4], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1202', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1203', - 7, - [[4, 5], - [6, 1], - [1, 4], - [1, 5], - [5, 7], - [2, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [2, 6], - [3, 4], - [3, 5], - [6, 7], - [6, 3]]], - ['edgelist', - 'G1204', - 7, - [[7, 5], - [6, 3], - [1, 4], - [1, 5], - [3, 5], - [2, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [4, 6], - [3, 4], - [1, 2], - [6, 7], - [5, 6]]], - ['edgelist', - 'G1205', - 7, - [[1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1206', - 7, - [[1, 2], - [1, 3], - [1, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1207', - 7, - [[3, 4], - [1, 3], - [4, 1], - [5, 4], - [2, 5], - [6, 2], - [5, 6], - [2, 1], - [6, 3], - [7, 3], - [6, 7], - [7, 2], - [1, 7], - [7, 5], - [4, 7]]], - ['edgelist', - 'G1208', - 7, - [[4, 1], - [4, 6], - [4, 5], - [3, 1], - [3, 6], - [3, 5], - [2, 5], - [2, 6], - [2, 1], - [7, 1], - [2, 7], - [7, 6], - [4, 7], - [7, 5], - [3, 7]]], - ['edgelist', - 'G1209', - 7, - [[1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1210', - 7, - [[4, 5], - [7, 3], - [1, 4], - [1, 5], - [6, 1], - [2, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [5, 6], - [3, 4], - [3, 5], - [6, 2], - [6, 3]]], - ['edgelist', - 'G1211', - 7, - [[4, 5], - [7, 3], - [1, 4], - [1, 5], - [6, 1], - [6, 7], - [4, 7], - [2, 4], - [2, 5], - [1, 2], - [5, 7], - [3, 4], - [3, 5], - [6, 2], - [6, 3]]], - ['edgelist', - 'G1212', - 7, - [[1, 2], - [2, 3], - [3, 4], - [4, 5], - [1, 5], - [7, 3], - [2, 7], - [7, 1], - [5, 7], - [6, 5], - [1, 6], - [4, 6], - [7, 4], - [6, 3], - [2, 6]]], - ['edgelist', - 'G1213', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [5, 6], - [3, 7]]], - ['edgelist', - 'G1214', - 7, - [[4, 1], - [5, 2], - [5, 4], - [2, 4], - [5, 1], - [3, 6], - [7, 3], - [6, 7], - [2, 6], - [5, 6], - [4, 6], - [1, 6], - [1, 7], - [4, 7], - [5, 7], - [7, 2]]], - ['edgelist', - 'G1215', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1216', - 7, - [[1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1217', - 7, - [[4, 5], - [6, 2], - [1, 4], - [1, 5], - [6, 1], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [4, 6], - [3, 4], - [3, 5], - [6, 7], - [5, 6], - [3, 6]]], - ['edgelist', - 'G1218', - 7, - [[3, 5], - [4, 2], - [4, 1], - [5, 4], - [5, 1], - [6, 3], - [5, 6], - [6, 1], - [4, 6], - [6, 2], - [7, 6], - [2, 7], - [4, 7], - [7, 1], - [5, 7], - [7, 3]]], - ['edgelist', - 'G1219', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1220', - 7, - [[3, 5], - [5, 2], - [4, 1], - [4, 2], - [5, 1], - [6, 3], - [5, 6], - [6, 1], - [4, 6], - [7, 6], - [2, 6], - [7, 2], - [4, 7], - [5, 7], - [7, 3], - [7, 1]]], - ['edgelist', - 'G1221', - 7, - [[1, 2], - [1, 4], - [1, 6], - [1, 7], - [2, 4], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1222', - 7, - [[3, 6], - [1, 2], - [5, 6], - [2, 4], - [6, 1], - [5, 4], - [6, 4], - [3, 5], - [2, 5], - [4, 1], - [7, 4], - [3, 7], - [7, 5], - [6, 7], - [7, 2], - [1, 7]]], - ['edgelist', - 'G1223', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 4], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1224', - 7, - [[3, 6], - [6, 2], - [4, 2], - [1, 5], - [6, 1], - [5, 4], - [6, 4], - [3, 5], - [2, 5], - [4, 1], - [7, 3], - [5, 7], - [6, 7], - [7, 2], - [1, 7], - [4, 7]]], - ['edgelist', - 'G1225', - 7, - [[2, 7], - [1, 2], - [1, 4], - [1, 5], - [6, 1], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [4, 6], - [3, 4], - [3, 5], - [6, 7], - [5, 6], - [3, 6]]], - ['edgelist', - 'G1226', - 7, - [[4, 5], - [6, 2], - [1, 4], - [1, 5], - [6, 1], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [2, 7], - [3, 4], - [3, 5], - [6, 7], - [1, 2], - [3, 6]]], - ['edgelist', - 'G1227', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6]]], - ['edgelist', - 'G1228', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [6, 7]]], - ['edgelist', - 'G1229', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 5], - [2, 6], - [2, 7], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [6, 7]]], - ['edgelist', - 'G1230', - 7, - [[3, 6], - [6, 2], - [4, 6], - [1, 5], - [1, 2], - [5, 4], - [4, 3], - [3, 5], - [2, 5], - [1, 6], - [7, 5], - [3, 7], - [7, 4], - [6, 7], - [7, 2], - [1, 7]]], - ['edgelist', - 'G1231', - 7, - [[6, 7], - [6, 2], - [1, 4], - [1, 5], - [1, 2], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [4, 6], - [3, 4], - [3, 5], - [7, 3], - [5, 6], - [3, 6]]], - ['edgelist', - 'G1232', - 7, - [[4, 5], - [6, 2], - [1, 4], - [1, 5], - [1, 2], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [6, 1], - [3, 4], - [3, 5], - [7, 3], - [7, 6], - [3, 6]]], - ['edgelist', - 'G1233', - 7, - [[6, 1], - [6, 2], - [1, 4], - [1, 5], - [7, 2], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [7, 1], - [4, 6], - [3, 4], - [3, 5], - [7, 3], - [5, 6], - [3, 6]]], - ['edgelist', - 'G1234', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [5, 6], - [7, 3], - [2, 7]]], - ['edgelist', - 'G1235', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1236', - 7, - [[5, 1], - [5, 4], - [1, 2], - [4, 1], - [3, 5], - [4, 2], - [6, 4], - [5, 6], - [6, 3], - [7, 6], - [6, 1], - [2, 6], - [7, 2], - [1, 7], - [7, 5], - [3, 7], - [4, 7]]], - ['edgelist', - 'G1237', - 7, - [[1, 2], - [6, 2], - [6, 4], - [1, 5], - [6, 1], - [5, 4], - [4, 2], - [3, 6], - [2, 5], - [4, 1], - [3, 5], - [7, 3], - [6, 7], - [7, 4], - [2, 7], - [7, 1], - [5, 7]]], - ['edgelist', - 'G1238', - 7, - [[4, 5], - [6, 2], - [1, 4], - [1, 5], - [5, 6], - [5, 7], - [4, 7], - [2, 4], - [2, 5], - [1, 2], - [4, 6], - [3, 4], - [3, 5], - [3, 6], - [6, 1], - [6, 7], - [7, 3]]], - ['edgelist', - 'G1239', - 7, - [[4, 3], - [5, 2], - [1, 2], - [4, 1], - [3, 5], - [5, 4], - [6, 2], - [5, 6], - [6, 3], - [1, 6], - [6, 4], - [7, 6], - [3, 7], - [7, 4], - [1, 7], - [2, 7], - [5, 7]]], - ['edgelist', - 'G1240', - 7, - [[4, 3], - [5, 2], - [5, 1], - [4, 1], - [3, 5], - [4, 2], - [6, 3], - [5, 6], - [6, 1], - [4, 6], - [6, 2], - [7, 6], - [3, 7], - [7, 1], - [4, 7], - [7, 5], - [2, 7]]], - ['edgelist', - 'G1241', - 7, - [[4, 3], - [6, 2], - [6, 1], - [1, 5], - [1, 2], - [5, 4], - [6, 4], - [3, 6], - [2, 5], - [4, 1], - [3, 5], - [7, 5], - [6, 7], - [7, 3], - [4, 7], - [7, 1], - [2, 7]]], - ['edgelist', - 'G1242', - 7, - [[4, 3], - [6, 2], - [6, 1], - [1, 5], - [5, 6], - [1, 2], - [4, 2], - [3, 6], - [2, 5], - [4, 1], - [3, 5], - [7, 1], - [4, 7], - [7, 2], - [6, 7], - [7, 3], - [5, 7]]], - ['edgelist', - 'G1243', - 7, - [[1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 6], - [4, 7], - [5, 6], - [5, 7]]], - ['edgelist', - 'G1244', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [4, 5], - [4, 6], - [5, 6], - [7, 2], - [1, 7], - [6, 7]]], - ['edgelist', - 'G1245', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7]]], - ['edgelist', - 'G1246', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 5], - [2, 6], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1247', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1248', - 7, - [[5, 1], - [5, 6], - [4, 1], - [4, 6], - [3, 1], - [3, 6], - [2, 4], - [2, 5], - [2, 6], - [2, 1], - [3, 4], - [3, 5], - [7, 1], - [6, 7], - [7, 2], - [3, 7], - [7, 5], - [4, 7]]], - ['edgelist', - 'G1249', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1250', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1251', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]], - ['edgelist', - 'G1252', - 7, - [[1, 2], - [1, 3], - [1, 4], - [1, 5], - [1, 6], - [1, 7], - [2, 3], - [2, 4], - [2, 5], - [2, 6], - [2, 7], - [3, 4], - [3, 5], - [3, 6], - [3, 7], - [4, 5], - [4, 6], - [4, 7], - [5, 6], - [5, 7], - [6, 7]]]] - - GAG=[] - - for i in range(1253): - g=make_small_graph(descr_list[i]) - GAG.append(g) - - return GAG - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/bipartite.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/bipartite.py deleted file mode 100644 index 435ed0d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/bipartite.py +++ /dev/null @@ -1,529 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Generators and functions for bipartite graphs. - -""" -# Copyright (C) 2006-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import math -import random -import networkx -from functools import reduce -import networkx as nx -__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) -__all__=['bipartite_configuration_model', - 'bipartite_havel_hakimi_graph', - 'bipartite_reverse_havel_hakimi_graph', - 'bipartite_alternating_havel_hakimi_graph', - 'bipartite_preferential_attachment_graph', - 'bipartite_random_graph', - 'bipartite_gnmk_random_graph', - ] - - -def bipartite_configuration_model(aseq, bseq, create_using=None, seed=None): - """Return a random bipartite graph from two given degree sequences. - - Parameters - ---------- - aseq : list or iterator - Degree sequence for node set A. - bseq : list or iterator - Degree sequence for node set B. - create_using : NetworkX graph instance, optional - Return graph of this type. - seed : integer, optional - Seed for random number generator. - - Nodes from the set A are connected to nodes in the set B by - choosing randomly from the possible free stubs, one in A and - one in B. - - Notes - ----- - The sum of the two sequences must be equal: sum(aseq)=sum(bseq) - If no graph type is specified use MultiGraph with parallel edges. - If you want a graph with no parallel edges use create_using=Graph() - but then the resulting degree sequences might not be exact. - - The nodes are assigned the attribute 'bipartite' with the value 0 or 1 - to indicate which bipartite set the node belongs to. - """ - if create_using is None: - create_using=networkx.MultiGraph() - elif create_using.is_directed(): - raise networkx.NetworkXError(\ - "Directed Graph not supported") - - - G=networkx.empty_graph(0,create_using) - - if not seed is None: - random.seed(seed) - - # length and sum of each sequence - lena=len(aseq) - lenb=len(bseq) - suma=sum(aseq) - sumb=sum(bseq) - - if not suma==sumb: - raise networkx.NetworkXError(\ - 'invalid degree sequences, sum(aseq)!=sum(bseq),%s,%s'\ - %(suma,sumb)) - - G=_add_nodes_with_bipartite_label(G,lena,lenb) - - if max(aseq)==0: return G # done if no edges - - # build lists of degree-repeated vertex numbers - stubs=[] - stubs.extend([[v]*aseq[v] for v in range(0,lena)]) - astubs=[] - astubs=[x for subseq in stubs for x in subseq] - - stubs=[] - stubs.extend([[v]*bseq[v-lena] for v in range(lena,lena+lenb)]) - bstubs=[] - bstubs=[x for subseq in stubs for x in subseq] - - # shuffle lists - random.shuffle(astubs) - random.shuffle(bstubs) - - G.add_edges_from([[astubs[i],bstubs[i]] for i in range(suma)]) - - G.name="bipartite_configuration_model" - return G - - -def bipartite_havel_hakimi_graph(aseq, bseq, create_using=None): - """Return a bipartite graph from two given degree sequences using a - Havel-Hakimi style construction. - - Nodes from the set A are connected to nodes in the set B by - connecting the highest degree nodes in set A to the highest degree - nodes in set B until all stubs are connected. - - Parameters - ---------- - aseq : list or iterator - Degree sequence for node set A. - bseq : list or iterator - Degree sequence for node set B. - create_using : NetworkX graph instance, optional - Return graph of this type. - - Notes - ----- - The sum of the two sequences must be equal: sum(aseq)=sum(bseq) - If no graph type is specified use MultiGraph with parallel edges. - If you want a graph with no parallel edges use create_using=Graph() - but then the resulting degree sequences might not be exact. - - The nodes are assigned the attribute 'bipartite' with the value 0 or 1 - to indicate which bipartite set the node belongs to. - """ - if create_using is None: - create_using=networkx.MultiGraph() - elif create_using.is_directed(): - raise networkx.NetworkXError(\ - "Directed Graph not supported") - - G=networkx.empty_graph(0,create_using) - - # length of the each sequence - naseq=len(aseq) - nbseq=len(bseq) - - suma=sum(aseq) - sumb=sum(bseq) - - if not suma==sumb: - raise networkx.NetworkXError(\ - 'invalid degree sequences, sum(aseq)!=sum(bseq),%s,%s'\ - %(suma,sumb)) - - G=_add_nodes_with_bipartite_label(G,naseq,nbseq) - - if max(aseq)==0: return G # done if no edges - - # build list of degree-repeated vertex numbers - astubs=[[aseq[v],v] for v in range(0,naseq)] - bstubs=[[bseq[v-naseq],v] for v in range(naseq,naseq+nbseq)] - astubs.sort() - while astubs: - (degree,u)=astubs.pop() # take of largest degree node in the a set - if degree==0: break # done, all are zero - # connect the source to largest degree nodes in the b set - bstubs.sort() - for target in bstubs[-degree:]: - v=target[1] - G.add_edge(u,v) - target[0] -= 1 # note this updates bstubs too. - if target[0]==0: - bstubs.remove(target) - - G.name="bipartite_havel_hakimi_graph" - return G - -def bipartite_reverse_havel_hakimi_graph(aseq, bseq, create_using=None): - """Return a bipartite graph from two given degree sequences using a - Havel-Hakimi style construction. - - Nodes from set A are connected to nodes in the set B by connecting - the highest degree nodes in set A to the lowest degree nodes in - set B until all stubs are connected. - - Parameters - ---------- - aseq : list or iterator - Degree sequence for node set A. - bseq : list or iterator - Degree sequence for node set B. - create_using : NetworkX graph instance, optional - Return graph of this type. - - - Notes - ----- - The sum of the two sequences must be equal: sum(aseq)=sum(bseq) - If no graph type is specified use MultiGraph with parallel edges. - If you want a graph with no parallel edges use create_using=Graph() - but then the resulting degree sequences might not be exact. - - The nodes are assigned the attribute 'bipartite' with the value 0 or 1 - to indicate which bipartite set the node belongs to. - """ - if create_using is None: - create_using=networkx.MultiGraph() - elif create_using.is_directed(): - raise networkx.NetworkXError(\ - "Directed Graph not supported") - - G=networkx.empty_graph(0,create_using) - - - # length of the each sequence - lena=len(aseq) - lenb=len(bseq) - suma=sum(aseq) - sumb=sum(bseq) - - if not suma==sumb: - raise networkx.NetworkXError(\ - 'invalid degree sequences, sum(aseq)!=sum(bseq),%s,%s'\ - %(suma,sumb)) - - G=_add_nodes_with_bipartite_label(G,lena,lenb) - - if max(aseq)==0: return G # done if no edges - - # build list of degree-repeated vertex numbers - astubs=[[aseq[v],v] for v in range(0,lena)] - bstubs=[[bseq[v-lena],v] for v in range(lena,lena+lenb)] - astubs.sort() - bstubs.sort() - while astubs: - (degree,u)=astubs.pop() # take of largest degree node in the a set - if degree==0: break # done, all are zero - # connect the source to the smallest degree nodes in the b set - for target in bstubs[0:degree]: - v=target[1] - G.add_edge(u,v) - target[0] -= 1 # note this updates bstubs too. - if target[0]==0: - bstubs.remove(target) - - G.name="bipartite_reverse_havel_hakimi_graph" - return G - - -def bipartite_alternating_havel_hakimi_graph(aseq, bseq,create_using=None): - """Return a bipartite graph from two given degree sequences using - an alternating Havel-Hakimi style construction. - - Nodes from the set A are connected to nodes in the set B by - connecting the highest degree nodes in set A to alternatively the - highest and the lowest degree nodes in set B until all stubs are - connected. - - Parameters - ---------- - aseq : list or iterator - Degree sequence for node set A. - bseq : list or iterator - Degree sequence for node set B. - create_using : NetworkX graph instance, optional - Return graph of this type. - - - Notes - ----- - The sum of the two sequences must be equal: sum(aseq)=sum(bseq) - If no graph type is specified use MultiGraph with parallel edges. - If you want a graph with no parallel edges use create_using=Graph() - but then the resulting degree sequences might not be exact. - - The nodes are assigned the attribute 'bipartite' with the value 0 or 1 - to indicate which bipartite set the node belongs to. - """ - if create_using is None: - create_using=networkx.MultiGraph() - elif create_using.is_directed(): - raise networkx.NetworkXError(\ - "Directed Graph not supported") - - G=networkx.empty_graph(0,create_using) - - # length of the each sequence - naseq=len(aseq) - nbseq=len(bseq) - suma=sum(aseq) - sumb=sum(bseq) - - if not suma==sumb: - raise networkx.NetworkXError(\ - 'invalid degree sequences, sum(aseq)!=sum(bseq),%s,%s'\ - %(suma,sumb)) - - G=_add_nodes_with_bipartite_label(G,naseq,nbseq) - - if max(aseq)==0: return G # done if no edges - # build list of degree-repeated vertex numbers - astubs=[[aseq[v],v] for v in range(0,naseq)] - bstubs=[[bseq[v-naseq],v] for v in range(naseq,naseq+nbseq)] - while astubs: - astubs.sort() - (degree,u)=astubs.pop() # take of largest degree node in the a set - if degree==0: break # done, all are zero - bstubs.sort() - small=bstubs[0:degree // 2] # add these low degree targets - large=bstubs[(-degree+degree // 2):] # and these high degree targets - stubs=[x for z in zip(large,small) for x in z] # combine, sorry - if len(stubs)<len(small)+len(large): # check for zip truncation - stubs.append(large.pop()) - for target in stubs: - v=target[1] - G.add_edge(u,v) - target[0] -= 1 # note this updates bstubs too. - if target[0]==0: - bstubs.remove(target) - - G.name="bipartite_alternating_havel_hakimi_graph" - return G - -def bipartite_preferential_attachment_graph(aseq,p,create_using=None,seed=None): - """Create a bipartite graph with a preferential attachment model from - a given single degree sequence. - - Parameters - ---------- - aseq : list or iterator - Degree sequence for node set A. - p : float - Probability that a new bottom node is added. - create_using : NetworkX graph instance, optional - Return graph of this type. - seed : integer, optional - Seed for random number generator. - - References - ---------- - .. [1] Jean-Loup Guillaume and Matthieu Latapy, - Bipartite structure of all complex networks, - Inf. Process. Lett. 90, 2004, pg. 215-221 - http://dx.doi.org/10.1016/j.ipl.2004.03.007 - """ - if create_using is None: - create_using=networkx.MultiGraph() - elif create_using.is_directed(): - raise networkx.NetworkXError(\ - "Directed Graph not supported") - - if p > 1: - raise networkx.NetworkXError("probability %s > 1"%(p)) - - G=networkx.empty_graph(0,create_using) - - if not seed is None: - random.seed(seed) - - naseq=len(aseq) - G=_add_nodes_with_bipartite_label(G,naseq,0) - vv=[ [v]*aseq[v] for v in range(0,naseq)] - while vv: - while vv[0]: - source=vv[0][0] - vv[0].remove(source) - if random.random() < p or G.number_of_nodes() == naseq: - target=G.number_of_nodes() - G.add_node(target,bipartite=1) - G.add_edge(source,target) - else: - bb=[ [b]*G.degree(b) for b in range(naseq,G.number_of_nodes())] - # flatten the list of lists into a list. - bbstubs=reduce(lambda x,y: x+y, bb) - # choose preferentially a bottom node. - target=random.choice(bbstubs) - G.add_node(target,bipartite=1) - G.add_edge(source,target) - vv.remove(vv[0]) - G.name="bipartite_preferential_attachment_model" - return G - - - -def bipartite_random_graph(n, m, p, seed=None, directed=False): - """Return a bipartite random graph. - - This is a bipartite version of the binomial (Erdős-Rényi) graph. - - Parameters - ---------- - n : int - The number of nodes in the first bipartite set. - m : int - The number of nodes in the second bipartite set. - p : float - Probability for edge creation. - seed : int, optional - Seed for random number generator (default=None). - directed : bool, optional (default=False) - If True return a directed graph - - Notes - ----- - The bipartite random graph algorithm chooses each of the n*m (undirected) - or 2*nm (directed) possible edges with probability p. - - This algorithm is O(n+m) where m is the expected number of edges. - - The nodes are assigned the attribute 'bipartite' with the value 0 or 1 - to indicate which bipartite set the node belongs to. - - See Also - -------- - gnp_random_graph, bipartite_configuration_model - - References - ---------- - .. [1] Vladimir Batagelj and Ulrik Brandes, - "Efficient generation of large random networks", - Phys. Rev. E, 71, 036113, 2005. - """ - G=nx.Graph() - G=_add_nodes_with_bipartite_label(G,n,m) - if directed: - G=nx.DiGraph(G) - G.name="fast_gnp_random_graph(%s,%s,%s)"%(n,m,p) - - if not seed is None: - random.seed(seed) - - if p <= 0: - return G - if p >= 1: - return nx.complete_bipartite_graph(n,m) - - lp = math.log(1.0 - p) - - v = 0 - w = -1 - while v < n: - lr = math.log(1.0 - random.random()) - w = w + 1 + int(lr/lp) - while w >= m and v < n: - w = w - m - v = v + 1 - if v < n: - G.add_edge(v, n+w) - - if directed: - # use the same algorithm to - # add edges from the "m" to "n" set - v = 0 - w = -1 - while v < n: - lr = math.log(1.0 - random.random()) - w = w + 1 + int(lr/lp) - while w>= m and v < n: - w = w - m - v = v + 1 - if v < n: - G.add_edge(n+w, v) - - return G - -def bipartite_gnmk_random_graph(n, m, k, seed=None, directed=False): - """Return a random bipartite graph G_{n,m,k}. - - Produces a bipartite graph chosen randomly out of the set of all graphs - with n top nodes, m bottom nodes, and k edges. - - Parameters - ---------- - n : int - The number of nodes in the first bipartite set. - m : int - The number of nodes in the second bipartite set. - k : int - The number of edges - seed : int, optional - Seed for random number generator (default=None). - directed : bool, optional (default=False) - If True return a directed graph - - Examples - -------- - G = nx.bipartite_gnmk_random_graph(10,20,50) - - See Also - -------- - gnm_random_graph - - Notes - ----- - If k > m * n then a complete bipartite graph is returned. - - This graph is a bipartite version of the `G_{nm}` random graph model. - """ - G = networkx.Graph() - G=_add_nodes_with_bipartite_label(G,n,m) - if directed: - G=nx.DiGraph(G) - G.name="bipartite_gnm_random_graph(%s,%s,%s)"%(n,m,k) - if seed is not None: - random.seed(seed) - if n == 1 or m == 1: - return G - max_edges = n*m # max_edges for bipartite networks - if k >= max_edges: # Maybe we should raise an exception here - return networkx.complete_bipartite_graph(n, m, create_using=G) - - top = [n for n,d in G.nodes(data=True) if d['bipartite']==0] - bottom = list(set(G) - set(top)) - edge_count = 0 - while edge_count < k: - # generate random edge,u,v - u = random.choice(top) - v = random.choice(bottom) - if v in G[u]: - continue - else: - G.add_edge(u,v) - edge_count += 1 - return G - -def _add_nodes_with_bipartite_label(G, lena, lenb): - G.add_nodes_from(range(0,lena+lenb)) - b=dict(zip(range(0,lena),[0]*lena)) - b.update(dict(zip(range(lena,lena+lenb),[1]*lenb))) - nx.set_node_attributes(G,'bipartite',b) - return G diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/classic.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/classic.py deleted file mode 100644 index f8ca43b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/classic.py +++ /dev/null @@ -1,508 +0,0 @@ -""" -Generators for some classic graphs. - -The typical graph generator is called as follows: - ->>> G=nx.complete_graph(100) - -returning the complete graph on n nodes labeled 0,..,99 -as a simple graph. Except for empty_graph, all the generators -in this module return a Graph class (i.e. a simple, undirected graph). - -""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import itertools -__author__ ="""Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)""" - -__all__ = [ 'balanced_tree', - 'barbell_graph', - 'complete_graph', - 'complete_bipartite_graph', - 'circular_ladder_graph', - 'cycle_graph', - 'dorogovtsev_goltsev_mendes_graph', - 'empty_graph', - 'full_rary_tree', - 'grid_graph', - 'grid_2d_graph', - 'hypercube_graph', - 'ladder_graph', - 'lollipop_graph', - 'null_graph', - 'path_graph', - 'star_graph', - 'trivial_graph', - 'wheel_graph'] - - -#------------------------------------------------------------------- -# Some Classic Graphs -#------------------------------------------------------------------- -import networkx as nx -from networkx.utils import is_list_of_ints, flatten - -def _tree_edges(n,r): - # helper function for trees - # yields edges in rooted tree at 0 with n nodes and branching ratio r - nodes=iter(range(n)) - parents=[next(nodes)] # stack of max length r - while parents: - source=parents.pop(0) - for i in range(r): - try: - target=next(nodes) - parents.append(target) - yield source,target - except StopIteration: - break - -def full_rary_tree(r, n, create_using=None): - """Creates a full r-ary tree of n vertices. - - Sometimes called a k-ary, n-ary, or m-ary tree. "... all non-leaf - vertices have exactly r children and all levels are full except - for some rightmost position of the bottom level (if a leaf at the - bottom level is missing, then so are all of the leaves to its - right." [1]_ - - Parameters - ---------- - r : int - branching factor of the tree - n : int - Number of nodes in the tree - create_using : NetworkX graph type, optional - Use specified type to construct graph (default = networkx.Graph) - - Returns - ------- - G : networkx Graph - An r-ary tree with n nodes - - References - ---------- - .. [1] An introduction to data structures and algorithms, - James Andrew Storer, Birkhauser Boston 2001, (page 225). - """ - G=nx.empty_graph(n,create_using) - G.add_edges_from(_tree_edges(n,r)) - return G - -def balanced_tree(r, h, create_using=None): - """Return the perfectly balanced r-tree of height h. - - Parameters - ---------- - r : int - Branching factor of the tree - h : int - Height of the tree - create_using : NetworkX graph type, optional - Use specified type to construct graph (default = networkx.Graph) - - Returns - ------- - G : networkx Graph - A tree with n nodes - - Notes - ----- - This is the rooted tree where all leaves are at distance h from - the root. The root has degree r and all other internal nodes have - degree r+1. - - Node labels are the integers 0 (the root) up to number_of_nodes - 1. - - Also refered to as a complete r-ary tree. - """ - # number of nodes is n=1+r+..+r^h - if r==1: - n=2 - else: - n = int((1-r**(h+1))/(1-r)) # sum of geometric series r!=1 - G=nx.empty_graph(n,create_using) - G.add_edges_from(_tree_edges(n,r)) - return G - - return nx.full_rary_tree(r,n,create_using) - -def barbell_graph(m1,m2,create_using=None): - """Return the Barbell Graph: two complete graphs connected by a path. - - For m1 > 1 and m2 >= 0. - - Two identical complete graphs K_{m1} form the left and right bells, - and are connected by a path P_{m2}. - - The 2*m1+m2 nodes are numbered - 0,...,m1-1 for the left barbell, - m1,...,m1+m2-1 for the path, - and m1+m2,...,2*m1+m2-1 for the right barbell. - - The 3 subgraphs are joined via the edges (m1-1,m1) and (m1+m2-1,m1+m2). - If m2=0, this is merely two complete graphs joined together. - - This graph is an extremal example in David Aldous - and Jim Fill's etext on Random Walks on Graphs. - - """ - if create_using is not None and create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - if m1<2: - raise nx.NetworkXError(\ - "Invalid graph description, m1 should be >=2") - if m2<0: - raise nx.NetworkXError(\ - "Invalid graph description, m2 should be >=0") - - # left barbell - G=complete_graph(m1,create_using) - G.name="barbell_graph(%d,%d)"%(m1,m2) - - # connecting path - G.add_nodes_from([v for v in range(m1,m1+m2-1)]) - if m2>1: - G.add_edges_from([(v,v+1) for v in range(m1,m1+m2-1)]) - # right barbell - G.add_edges_from( (u,v) for u in range(m1+m2,2*m1+m2) for v in range(u+1,2*m1+m2)) - # connect it up - G.add_edge(m1-1,m1) - if m2>0: - G.add_edge(m1+m2-1,m1+m2) - return G - -def complete_graph(n,create_using=None): - """ Return the complete graph K_n with n nodes. - - Node labels are the integers 0 to n-1. - """ - G=empty_graph(n,create_using) - G.name="complete_graph(%d)"%(n) - if n>1: - if G.is_directed(): - edges=itertools.permutations(range(n),2) - else: - edges=itertools.combinations(range(n),2) - G.add_edges_from(edges) - return G - - -def complete_bipartite_graph(n1,n2,create_using=None): - """Return the complete bipartite graph K_{n1_n2}. - - Composed of two partitions with n1 nodes in the first - and n2 nodes in the second. Each node in the first is - connected to each node in the second. - - Node labels are the integers 0 to n1+n2-1 - - """ - if create_using is not None and create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - G=empty_graph(n1+n2,create_using) - G.name="complete_bipartite_graph(%d,%d)"%(n1,n2) - for v1 in range(n1): - for v2 in range(n2): - G.add_edge(v1,n1+v2) - return G - -def circular_ladder_graph(n,create_using=None): - """Return the circular ladder graph CL_n of length n. - - CL_n consists of two concentric n-cycles in which - each of the n pairs of concentric nodes are joined by an edge. - - Node labels are the integers 0 to n-1 - - """ - G=ladder_graph(n,create_using) - G.name="circular_ladder_graph(%d)"%n - G.add_edge(0,n-1) - G.add_edge(n,2*n-1) - return G - -def cycle_graph(n,create_using=None): - """Return the cycle graph C_n over n nodes. - - C_n is the n-path with two end-nodes connected. - - Node labels are the integers 0 to n-1 - If create_using is a DiGraph, the direction is in increasing order. - - """ - G=path_graph(n,create_using) - G.name="cycle_graph(%d)"%n - if n>1: G.add_edge(n-1,0) - return G - -def dorogovtsev_goltsev_mendes_graph(n,create_using=None): - """Return the hierarchically constructed Dorogovtsev-Goltsev-Mendes graph. - - n is the generation. - See: arXiv:/cond-mat/0112143 by Dorogovtsev, Goltsev and Mendes. - - """ - if create_using is not None: - if create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - if create_using.is_multigraph(): - raise nx.NetworkXError("Multigraph not supported") - G=empty_graph(0,create_using) - G.name="Dorogovtsev-Goltsev-Mendes Graph" - G.add_edge(0,1) - if n==0: - return G - new_node = 2 # next node to be added - for i in range(1,n+1): #iterate over number of generations. - last_generation_edges = G.edges() - number_of_edges_in_last_generation = len(last_generation_edges) - for j in range(0,number_of_edges_in_last_generation): - G.add_edge(new_node,last_generation_edges[j][0]) - G.add_edge(new_node,last_generation_edges[j][1]) - new_node += 1 - return G - -def empty_graph(n=0,create_using=None): - """Return the empty graph with n nodes and zero edges. - - Node labels are the integers 0 to n-1 - - For example: - >>> G=nx.empty_graph(10) - >>> G.number_of_nodes() - 10 - >>> G.number_of_edges() - 0 - - The variable create_using should point to a "graph"-like object that - will be cleaned (nodes and edges will be removed) and refitted as - an empty "graph" with n nodes with integer labels. This capability - is useful for specifying the class-nature of the resulting empty - "graph" (i.e. Graph, DiGraph, MyWeirdGraphClass, etc.). - - The variable create_using has two main uses: - Firstly, the variable create_using can be used to create an - empty digraph, network,etc. For example, - - >>> n=10 - >>> G=nx.empty_graph(n,create_using=nx.DiGraph()) - - will create an empty digraph on n nodes. - - Secondly, one can pass an existing graph (digraph, pseudograph, - etc.) via create_using. For example, if G is an existing graph - (resp. digraph, pseudograph, etc.), then empty_graph(n,create_using=G) - will empty G (i.e. delete all nodes and edges using G.clear() in - base) and then add n nodes and zero edges, and return the modified - graph (resp. digraph, pseudograph, etc.). - - See also create_empty_copy(G). - - """ - if create_using is None: - # default empty graph is a simple graph - G=nx.Graph() - else: - G=create_using - G.clear() - - G.add_nodes_from(range(n)) - G.name="empty_graph(%d)"%n - return G - -def grid_2d_graph(m,n,periodic=False,create_using=None): - """ Return the 2d grid graph of mxn nodes, - each connected to its nearest neighbors. - Optional argument periodic=True will connect - boundary nodes via periodic boundary conditions. - """ - G=empty_graph(0,create_using) - G.name="grid_2d_graph" - rows=range(m) - columns=range(n) - G.add_nodes_from( (i,j) for i in rows for j in columns ) - G.add_edges_from( ((i,j),(i-1,j)) for i in rows for j in columns if i>0 ) - G.add_edges_from( ((i,j),(i,j-1)) for i in rows for j in columns if j>0 ) - if G.is_directed(): - G.add_edges_from( ((i,j),(i+1,j)) for i in rows for j in columns if i<m-1 ) - G.add_edges_from( ((i,j),(i,j+1)) for i in rows for j in columns if j<n-1 ) - if periodic: - if n>2: - G.add_edges_from( ((i,0),(i,n-1)) for i in rows ) - if G.is_directed(): - G.add_edges_from( ((i,n-1),(i,0)) for i in rows ) - if m>2: - G.add_edges_from( ((0,j),(m-1,j)) for j in columns ) - if G.is_directed(): - G.add_edges_from( ((m-1,j),(0,j)) for j in columns ) - G.name="periodic_grid_2d_graph(%d,%d)"%(m,n) - return G - - -def grid_graph(dim,periodic=False): - """ Return the n-dimensional grid graph. - - The dimension is the length of the list 'dim' and the - size in each dimension is the value of the list element. - - E.g. G=grid_graph(dim=[2,3]) produces a 2x3 grid graph. - - If periodic=True then join grid edges with periodic boundary conditions. - - """ - dlabel="%s"%dim - if dim==[]: - G=empty_graph(0) - G.name="grid_graph(%s)"%dim - return G - if not is_list_of_ints(dim): - raise nx.NetworkXError("dim is not a list of integers") - if min(dim)<=0: - raise nx.NetworkXError(\ - "dim is not a list of strictly positive integers") - if periodic: - func=cycle_graph - else: - func=path_graph - - dim=list(dim) - current_dim=dim.pop() - G=func(current_dim) - while len(dim)>0: - current_dim=dim.pop() - # order matters: copy before it is cleared during the creation of Gnew - Gold=G.copy() - Gnew=func(current_dim) - # explicit: create_using=None - # This is so that we get a new graph of Gnew's class. - G=nx.cartesian_product(Gnew,Gold) - # graph G is done but has labels of the form (1,(2,(3,1))) - # so relabel - H=nx.relabel_nodes(G, flatten) - H.name="grid_graph(%s)"%dlabel - return H - -def hypercube_graph(n): - """Return the n-dimensional hypercube. - - Node labels are the integers 0 to 2**n - 1. - - """ - dim=n*[2] - G=grid_graph(dim) - G.name="hypercube_graph_(%d)"%n - return G - -def ladder_graph(n,create_using=None): - """Return the Ladder graph of length n. - - This is two rows of n nodes, with - each pair connected by a single edge. - - Node labels are the integers 0 to 2*n - 1. - - """ - if create_using is not None and create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - G=empty_graph(2*n,create_using) - G.name="ladder_graph_(%d)"%n - G.add_edges_from([(v,v+1) for v in range(n-1)]) - G.add_edges_from([(v,v+1) for v in range(n,2*n-1)]) - G.add_edges_from([(v,v+n) for v in range(n)]) - return G - -def lollipop_graph(m,n,create_using=None): - """Return the Lollipop Graph; K_m connected to P_n. - - This is the Barbell Graph without the right barbell. - - For m>1 and n>=0, the complete graph K_m is connected to the - path P_n. The resulting m+n nodes are labelled 0,...,m-1 for the - complete graph and m,...,m+n-1 for the path. The 2 subgraphs - are joined via the edge (m-1,m). If n=0, this is merely a complete - graph. - - Node labels are the integers 0 to number_of_nodes - 1. - - (This graph is an extremal example in David Aldous and Jim - Fill's etext on Random Walks on Graphs.) - - """ - if create_using is not None and create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - if m<2: - raise nx.NetworkXError(\ - "Invalid graph description, m should be >=2") - if n<0: - raise nx.NetworkXError(\ - "Invalid graph description, n should be >=0") - # the ball - G=complete_graph(m,create_using) - # the stick - G.add_nodes_from([v for v in range(m,m+n)]) - if n>1: - G.add_edges_from([(v,v+1) for v in range(m,m+n-1)]) - # connect ball to stick - if m>0: G.add_edge(m-1,m) - G.name="lollipop_graph(%d,%d)"%(m,n) - return G - -def null_graph(create_using=None): - """ Return the Null graph with no nodes or edges. - - See empty_graph for the use of create_using. - - """ - G=empty_graph(0,create_using) - G.name="null_graph()" - return G - -def path_graph(n,create_using=None): - """Return the Path graph P_n of n nodes linearly connected by n-1 edges. - - Node labels are the integers 0 to n - 1. - If create_using is a DiGraph then the edges are directed in - increasing order. - - """ - G=empty_graph(n,create_using) - G.name="path_graph(%d)"%n - G.add_edges_from([(v,v+1) for v in range(n-1)]) - return G - -def star_graph(n,create_using=None): - """ Return the Star graph with n+1 nodes: one center node, connected to n outer nodes. - - Node labels are the integers 0 to n. - - """ - G=complete_bipartite_graph(1,n,create_using) - G.name="star_graph(%d)"%n - return G - -def trivial_graph(create_using=None): - """ Return the Trivial graph with one node (with integer label 0) and no edges. - - """ - G=empty_graph(1,create_using) - G.name="trivial_graph()" - return G - -def wheel_graph(n,create_using=None): - """ Return the wheel graph: a single hub node connected to each node of the (n-1)-node cycle graph. - - Node labels are the integers 0 to n - 1. - - """ - G=star_graph(n-1,create_using) - G.name="wheel_graph(%d)"%n - G.add_edges_from([(v,v+1) for v in range(1,n-1)]) - if n>2: - G.add_edge(1,n-1) - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/degree_seq.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/degree_seq.py deleted file mode 100644 index c5b8f95..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/degree_seq.py +++ /dev/null @@ -1,793 +0,0 @@ -# -*- coding: utf-8 -*- -"""Generate graphs with a given degree sequence or expected degree sequence. -""" -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import heapq -from itertools import combinations, permutations -import math -from operator import itemgetter -import random -import networkx as nx -from networkx.utils import random_weighted_sample - -__author__ = "\n".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Pieter Swart <swart@lanl.gov>', - 'Dan Schult <dschult@colgate.edu>' - 'Joel Miller <joel.c.miller.research@gmail.com>', - 'Nathan Lemons <nlemons@gmail.com>' - 'Brian Cloteaux <brian.cloteaux@nist.gov>']) - -__all__ = ['configuration_model', - 'directed_configuration_model', - 'expected_degree_graph', - 'havel_hakimi_graph', - 'directed_havel_hakimi_graph', - 'degree_sequence_tree', - 'random_degree_sequence_graph'] - - -def configuration_model(deg_sequence,create_using=None,seed=None): - """Return a random graph with the given degree sequence. - - The configuration model generates a random pseudograph (graph with - parallel edges and self loops) by randomly assigning edges to - match the given degree sequence. - - Parameters - ---------- - deg_sequence : list of integers - Each list entry corresponds to the degree of a node. - create_using : graph, optional (default MultiGraph) - Return graph of this type. The instance will be cleared. - seed : hashable object, optional - Seed for random number generator. - - Returns - ------- - G : MultiGraph - A graph with the specified degree sequence. - Nodes are labeled starting at 0 with an index - corresponding to the position in deg_sequence. - - Raises - ------ - NetworkXError - If the degree sequence does not have an even sum. - - See Also - -------- - is_valid_degree_sequence - - Notes - ----- - As described by Newman [1]_. - - A non-graphical degree sequence (not realizable by some simple - graph) is allowed since this function returns graphs with self - loops and parallel edges. An exception is raised if the degree - sequence does not have an even sum. - - This configuration model construction process can lead to - duplicate edges and loops. You can remove the self-loops and - parallel edges (see below) which will likely result in a graph - that doesn't have the exact degree sequence specified. This - "finite-size effect" decreases as the size of the graph increases. - - References - ---------- - .. [1] M.E.J. Newman, "The structure and function of complex networks", - SIAM REVIEW 45-2, pp 167-256, 2003. - - Examples - -------- - >>> from networkx.utils import powerlaw_sequence - >>> z=nx.utils.create_degree_sequence(100,powerlaw_sequence) - >>> G=nx.configuration_model(z) - - To remove parallel edges: - - >>> G=nx.Graph(G) - - To remove self loops: - - >>> G.remove_edges_from(G.selfloop_edges()) - """ - if not sum(deg_sequence)%2 ==0: - raise nx.NetworkXError('Invalid degree sequence') - - if create_using is None: - create_using = nx.MultiGraph() - elif create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - - if not seed is None: - random.seed(seed) - - # start with empty N-node graph - N=len(deg_sequence) - - # allow multiedges and selfloops - G=nx.empty_graph(N,create_using) - - if N==0 or max(deg_sequence)==0: # done if no edges - return G - - # build stublist, a list of available degree-repeated stubs - # e.g. for deg_sequence=[3,2,1,1,1] - # initially, stublist=[1,1,1,2,2,3,4,5] - # i.e., node 1 has degree=3 and is repeated 3 times, etc. - stublist=[] - for n in G: - for i in range(deg_sequence[n]): - stublist.append(n) - - # shuffle stublist and assign pairs by removing 2 elements at a time - random.shuffle(stublist) - while stublist: - n1 = stublist.pop() - n2 = stublist.pop() - G.add_edge(n1,n2) - - G.name="configuration_model %d nodes %d edges"%(G.order(),G.size()) - return G - - -def directed_configuration_model(in_degree_sequence, - out_degree_sequence, - create_using=None,seed=None): - """Return a directed_random graph with the given degree sequences. - - The configuration model generates a random directed pseudograph - (graph with parallel edges and self loops) by randomly assigning - edges to match the given degree sequences. - - Parameters - ---------- - in_degree_sequence : list of integers - Each list entry corresponds to the in-degree of a node. - out_degree_sequence : list of integers - Each list entry corresponds to the out-degree of a node. - create_using : graph, optional (default MultiDiGraph) - Return graph of this type. The instance will be cleared. - seed : hashable object, optional - Seed for random number generator. - - Returns - ------- - G : MultiDiGraph - A graph with the specified degree sequences. - Nodes are labeled starting at 0 with an index - corresponding to the position in deg_sequence. - - Raises - ------ - NetworkXError - If the degree sequences do not have the same sum. - - See Also - -------- - configuration_model - - Notes - ----- - Algorithm as described by Newman [1]_. - - A non-graphical degree sequence (not realizable by some simple - graph) is allowed since this function returns graphs with self - loops and parallel edges. An exception is raised if the degree - sequences does not have the same sum. - - This configuration model construction process can lead to - duplicate edges and loops. You can remove the self-loops and - parallel edges (see below) which will likely result in a graph - that doesn't have the exact degree sequence specified. This - "finite-size effect" decreases as the size of the graph increases. - - References - ---------- - .. [1] Newman, M. E. J. and Strogatz, S. H. and Watts, D. J. - Random graphs with arbitrary degree distributions and their applications - Phys. Rev. E, 64, 026118 (2001) - - Examples - -------- - >>> D=nx.DiGraph([(0,1),(1,2),(2,3)]) # directed path graph - >>> din=list(D.in_degree().values()) - >>> dout=list(D.out_degree().values()) - >>> din.append(1) - >>> dout[0]=2 - >>> D=nx.directed_configuration_model(din,dout) - - To remove parallel edges: - - >>> D=nx.DiGraph(D) - - To remove self loops: - - >>> D.remove_edges_from(D.selfloop_edges()) - """ - if not sum(in_degree_sequence) == sum(out_degree_sequence): - raise nx.NetworkXError('Invalid degree sequences. ' - 'Sequences must have equal sums.') - - if create_using is None: - create_using = nx.MultiDiGraph() - - if not seed is None: - random.seed(seed) - - nin=len(in_degree_sequence) - nout=len(out_degree_sequence) - - # pad in- or out-degree sequence with zeros to match lengths - if nin>nout: - out_degree_sequence.extend((nin-nout)*[0]) - else: - in_degree_sequence.extend((nout-nin)*[0]) - - # start with empty N-node graph - N=len(in_degree_sequence) - - # allow multiedges and selfloops - G=nx.empty_graph(N,create_using) - - if N==0 or max(in_degree_sequence)==0: # done if no edges - return G - - # build stublists of available degree-repeated stubs - # e.g. for degree_sequence=[3,2,1,1,1] - # initially, stublist=[1,1,1,2,2,3,4,5] - # i.e., node 1 has degree=3 and is repeated 3 times, etc. - in_stublist=[] - for n in G: - for i in range(in_degree_sequence[n]): - in_stublist.append(n) - - out_stublist=[] - for n in G: - for i in range(out_degree_sequence[n]): - out_stublist.append(n) - - # shuffle stublists and assign pairs by removing 2 elements at a time - random.shuffle(in_stublist) - random.shuffle(out_stublist) - while in_stublist and out_stublist: - source = out_stublist.pop() - target = in_stublist.pop() - G.add_edge(source,target) - - G.name="directed configuration_model %d nodes %d edges"%(G.order(),G.size()) - return G - - -def expected_degree_graph(w, seed=None, selfloops=True): - r"""Return a random graph with given expected degrees. - - Given a sequence of expected degrees `W=(w_0,w_1,\ldots,w_{n-1}`) - of length `n` this algorithm assigns an edge between node `u` and - node `v` with probability - - .. math:: - - p_{uv} = \frac{w_u w_v}{\sum_k w_k} . - - Parameters - ---------- - w : list - The list of expected degrees. - selfloops: bool (default=True) - Set to False to remove the possibility of self-loop edges. - seed : hashable object, optional - The seed for the random number generator. - - Returns - ------- - Graph - - Examples - -------- - >>> z=[10 for i in range(100)] - >>> G=nx.expected_degree_graph(z) - - Notes - ----- - The nodes have integer labels corresponding to index of expected degrees - input sequence. - - The complexity of this algorithm is `\mathcal{O}(n+m)` where `n` is the - number of nodes and `m` is the expected number of edges. - - The model in [1]_ includes the possibility of self-loop edges. - Set selfloops=False to produce a graph without self loops. - - For finite graphs this model doesn't produce exactly the given - expected degree sequence. Instead the expected degrees are as - follows. - - For the case without self loops (selfloops=False), - - .. math:: - - E[deg(u)] = \sum_{v \ne u} p_{uv} - = w_u \left( 1 - \frac{w_u}{\sum_k w_k} \right) . - - - NetworkX uses the standard convention that a self-loop edge counts 2 - in the degree of a node, so with self loops (selfloops=True), - - .. math:: - - E[deg(u)] = \sum_{v \ne u} p_{uv} + 2 p_{uu} - = w_u \left( 1 + \frac{w_u}{\sum_k w_k} \right) . - - References - ---------- - .. [1] Fan Chung and L. Lu, Connected components in random graphs with - given expected degree sequences, Ann. Combinatorics, 6, - pp. 125-145, 2002. - .. [2] Joel Miller and Aric Hagberg, - Efficient generation of networks with given expected degrees, - in Algorithms and Models for the Web-Graph (WAW 2011), - Alan Frieze, Paul Horn, and Paweł Prałat (Eds), LNCS 6732, - pp. 115-126, 2011. - """ - n = len(w) - G=nx.empty_graph(n) - if n==0 or max(w)==0: # done if no edges - return G - if seed is not None: - random.seed(seed) - rho = 1/float(sum(w)) - # sort weights, largest first - # preserve order of weights for integer node label mapping - order = sorted(enumerate(w),key=itemgetter(1),reverse=True) - mapping = dict((c,uv[0]) for c,uv in enumerate(order)) - seq = [v for u,v in order] - last=n - if not selfloops: - last-=1 - for u in range(last): - v = u - if not selfloops: - v += 1 - factor = seq[u] * rho - p = seq[v]*factor - if p>1: - p = 1 - while v<n and p>0: - if p != 1: - r = random.random() - v += int(math.floor(math.log(r)/math.log(1-p))) - if v < n: - q = seq[v]*factor - if q>1: - q = 1 - if random.random() < q/p: - G.add_edge(mapping[u],mapping[v]) - v += 1 - p = q - return G - -def havel_hakimi_graph(deg_sequence,create_using=None): - """Return a simple graph with given degree sequence constructed - using the Havel-Hakimi algorithm. - - Parameters - ---------- - deg_sequence: list of integers - Each integer corresponds to the degree of a node (need not be sorted). - create_using : graph, optional (default Graph) - Return graph of this type. The instance will be cleared. - Directed graphs are not allowed. - - Raises - ------ - NetworkXException - For a non-graphical degree sequence (i.e. one - not realizable by some simple graph). - - Notes - ----- - The Havel-Hakimi algorithm constructs a simple graph by - successively connecting the node of highest degree to other nodes - of highest degree, resorting remaining nodes by degree, and - repeating the process. The resulting graph has a high - degree-associativity. Nodes are labeled 1,.., len(deg_sequence), - corresponding to their position in deg_sequence. - - The basic algorithm is from Hakimi [1]_ and was generalized by - Kleitman and Wang [2]_. - - References - ---------- - .. [1] Hakimi S., On Realizability of a Set of Integers as - Degrees of the Vertices of a Linear Graph. I, - Journal of SIAM, 10(3), pp. 496-506 (1962) - .. [2] Kleitman D.J. and Wang D.L. - Algorithms for Constructing Graphs and Digraphs with Given Valences - and Factors Discrete Mathematics, 6(1), pp. 79-88 (1973) - """ - if not nx.is_valid_degree_sequence(deg_sequence): - raise nx.NetworkXError('Invalid degree sequence') - if create_using is not None: - if create_using.is_directed(): - raise nx.NetworkXError("Directed graphs are not supported") - - p = len(deg_sequence) - G=nx.empty_graph(p,create_using) - num_degs = [] - for i in range(p): - num_degs.append([]) - dmax, dsum, n = 0, 0, 0 - for d in deg_sequence: - # Process only the non-zero integers - if d>0: - num_degs[d].append(n) - dmax, dsum, n = max(dmax,d), dsum+d, n+1 - # Return graph if no edges - if n==0: - return G - - modstubs = [(0,0)]*(dmax+1) - # Successively reduce degree sequence by removing the maximum degree - while n > 0: - # Retrieve the maximum degree in the sequence - while len(num_degs[dmax]) == 0: - dmax -= 1; - # If there are not enough stubs to connect to, then the sequence is - # not graphical - if dmax > n-1: - raise nx.NetworkXError('Non-graphical integer sequence') - - # Remove largest stub in list - source = num_degs[dmax].pop() - n -= 1 - # Reduce the next dmax largest stubs - mslen = 0 - k = dmax - for i in range(dmax): - while len(num_degs[k]) == 0: - k -= 1 - target = num_degs[k].pop() - G.add_edge(source, target) - n -= 1 - if k > 1: - modstubs[mslen] = (k-1,target) - mslen += 1 - # Add back to the list any nonzero stubs that were removed - for i in range(mslen): - (stubval, stubtarget) = modstubs[i] - num_degs[stubval].append(stubtarget) - n += 1 - - G.name="havel_hakimi_graph %d nodes %d edges"%(G.order(),G.size()) - return G - -def directed_havel_hakimi_graph(in_deg_sequence, - out_deg_sequence, - create_using=None): - """Return a directed graph with the given degree sequences. - - Parameters - ---------- - in_deg_sequence : list of integers - Each list entry corresponds to the in-degree of a node. - out_deg_sequence : list of integers - Each list entry corresponds to the out-degree of a node. - create_using : graph, optional (default DiGraph) - Return graph of this type. The instance will be cleared. - - Returns - ------- - G : DiGraph - A graph with the specified degree sequences. - Nodes are labeled starting at 0 with an index - corresponding to the position in deg_sequence - - Raises - ------ - NetworkXError - If the degree sequences are not digraphical. - - See Also - -------- - configuration_model - - Notes - ----- - Algorithm as described by Kleitman and Wang [1]_. - - References - ---------- - .. [1] D.J. Kleitman and D.L. Wang - Algorithms for Constructing Graphs and Digraphs with Given Valences - and Factors Discrete Mathematics, 6(1), pp. 79-88 (1973) - """ - assert(nx.utils.is_list_of_ints(in_deg_sequence)) - assert(nx.utils.is_list_of_ints(out_deg_sequence)) - - if create_using is None: - create_using = nx.DiGraph() - - # Process the sequences and form two heaps to store degree pairs with - # either zero or nonzero out degrees - sumin, sumout, nin, nout = 0, 0, len(in_deg_sequence), len(out_deg_sequence) - maxn = max(nin, nout) - G = nx.empty_graph(maxn,create_using) - if maxn==0: - return G - maxin = 0 - stubheap, zeroheap = [ ], [ ] - for n in range(maxn): - in_deg, out_deg = 0, 0 - if n<nout: - out_deg = out_deg_sequence[n] - if n<nin: - in_deg = in_deg_sequence[n] - if in_deg<0 or out_deg<0: - raise nx.NetworkXError( - 'Invalid degree sequences. Sequence values must be positive.') - sumin, sumout, maxin = sumin+in_deg, sumout+out_deg, max(maxin, in_deg) - if in_deg > 0: - stubheap.append((-1*out_deg, -1*in_deg,n)) - elif out_deg > 0: - zeroheap.append((-1*out_deg,n)) - if sumin != sumout: - raise nx.NetworkXError( - 'Invalid degree sequences. Sequences must have equal sums.') - heapq.heapify(stubheap) - heapq.heapify(zeroheap) - - modstubs = [(0,0,0)]*(maxin+1) - # Successively reduce degree sequence by removing the maximum - while stubheap: - # Remove first value in the sequence with a non-zero in degree - (freeout, freein, target) = heapq.heappop(stubheap) - freein *= -1 - if freein > len(stubheap)+len(zeroheap): - raise nx.NetworkXError('Non-digraphical integer sequence') - - # Attach arcs from the nodes with the most stubs - mslen = 0 - for i in range(freein): - if zeroheap and (not stubheap or stubheap[0][0] > zeroheap[0][0]): - (stubout, stubsource) = heapq.heappop(zeroheap) - stubin = 0 - else: - (stubout, stubin, stubsource) = heapq.heappop(stubheap) - if stubout == 0: - raise nx.NetworkXError('Non-digraphical integer sequence') - G.add_edge(stubsource, target) - # Check if source is now totally connected - if stubout+1<0 or stubin<0: - modstubs[mslen] = (stubout+1, stubin, stubsource) - mslen += 1 - - # Add the nodes back to the heaps that still have available stubs - for i in range(mslen): - stub = modstubs[i] - if stub[1] < 0: - heapq.heappush(stubheap, stub) - else: - heapq.heappush(zeroheap, (stub[0], stub[2])) - if freeout<0: - heapq.heappush(zeroheap, (freeout, target)) - - G.name="directed_havel_hakimi_graph %d nodes %d edges"%(G.order(),G.size()) - return G - -def degree_sequence_tree(deg_sequence,create_using=None): - """Make a tree for the given degree sequence. - - A tree has #nodes-#edges=1 so - the degree sequence must have - len(deg_sequence)-sum(deg_sequence)/2=1 - """ - - if not len(deg_sequence)-sum(deg_sequence)/2.0 == 1.0: - raise nx.NetworkXError("Degree sequence invalid") - if create_using is not None and create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - - # single node tree - if len(deg_sequence)==1: - G=nx.empty_graph(0,create_using) - return G - - # all degrees greater than 1 - deg=[s for s in deg_sequence if s>1] - deg.sort(reverse=True) - - # make path graph as backbone - n=len(deg)+2 - G=nx.path_graph(n,create_using) - last=n - - # add the leaves - for source in range(1,n-1): - nedges=deg.pop()-2 - for target in range(last,last+nedges): - G.add_edge(source, target) - last+=nedges - - # in case we added one too many - if len(G.degree())>len(deg_sequence): - G.remove_node(0) - return G - -def random_degree_sequence_graph(sequence, seed=None, tries=10): - r"""Return a simple random graph with the given degree sequence. - - If the maximum degree `d_m` in the sequence is `O(m^{1/4})` then the - algorithm produces almost uniform random graphs in `O(m d_m)` time - where `m` is the number of edges. - - Parameters - ---------- - sequence : list of integers - Sequence of degrees - seed : hashable object, optional - Seed for random number generator - tries : int, optional - Maximum number of tries to create a graph - - Returns - ------- - G : Graph - A graph with the specified degree sequence. - Nodes are labeled starting at 0 with an index - corresponding to the position in the sequence. - - Raises - ------ - NetworkXUnfeasible - If the degree sequence is not graphical. - NetworkXError - If a graph is not produced in specified number of tries - - See Also - -------- - is_valid_degree_sequence, configuration_model - - Notes - ----- - The generator algorithm [1]_ is not guaranteed to produce a graph. - - References - ---------- - .. [1] Moshen Bayati, Jeong Han Kim, and Amin Saberi, - A sequential algorithm for generating random graphs. - Algorithmica, Volume 58, Number 4, 860-910, - DOI: 10.1007/s00453-009-9340-1 - - Examples - -------- - >>> sequence = [1, 2, 2, 3] - >>> G = nx.random_degree_sequence_graph(sequence) - >>> sorted(G.degree().values()) - [1, 2, 2, 3] - """ - DSRG = DegreeSequenceRandomGraph(sequence, seed=seed) - for try_n in range(tries): - try: - return DSRG.generate() - except nx.NetworkXUnfeasible: - pass - raise nx.NetworkXError('failed to generate graph in %d tries'%tries) - -class DegreeSequenceRandomGraph(object): - # class to generate random graphs with a given degree sequence - # use random_degree_sequence_graph() - def __init__(self, degree, seed=None): - if not nx.is_valid_degree_sequence(degree): - raise nx.NetworkXUnfeasible('degree sequence is not graphical') - if seed is not None: - random.seed(seed) - self.degree = list(degree) - # node labels are integers 0,...,n-1 - self.m = sum(self.degree)/2.0 # number of edges - try: - self.dmax = max(self.degree) # maximum degree - except ValueError: - self.dmax = 0 - - def generate(self): - # remaining_degree is mapping from int->remaining degree - self.remaining_degree = dict(enumerate(self.degree)) - # add all nodes to make sure we get isolated nodes - self.graph = nx.Graph() - self.graph.add_nodes_from(self.remaining_degree) - # remove zero degree nodes - for n,d in list(self.remaining_degree.items()): - if d == 0: - del self.remaining_degree[n] - if len(self.remaining_degree) > 0: - # build graph in three phases according to how many unmatched edges - self.phase1() - self.phase2() - self.phase3() - return self.graph - - def update_remaining(self, u, v, aux_graph=None): - # decrement remaining nodes, modify auxilliary graph if in phase3 - if aux_graph is not None: - # remove edges from auxilliary graph - aux_graph.remove_edge(u,v) - if self.remaining_degree[u] == 1: - del self.remaining_degree[u] - if aux_graph is not None: - aux_graph.remove_node(u) - else: - self.remaining_degree[u] -= 1 - if self.remaining_degree[v] == 1: - del self.remaining_degree[v] - if aux_graph is not None: - aux_graph.remove_node(v) - else: - self.remaining_degree[v] -= 1 - - def p(self,u,v): - # degree probability - return 1 - self.degree[u]*self.degree[v]/(4.0*self.m) - - def q(self,u,v): - # remaining degree probability - norm = float(max(self.remaining_degree.values()))**2 - return self.remaining_degree[u]*self.remaining_degree[v]/norm - - def suitable_edge(self): - # Check if there is a suitable edge that is not in the graph - # True if an (arbitrary) remaining node has at least one possible - # connection to another remaining node - nodes = iter(self.remaining_degree) - u = next(nodes) # one arbitrary node - for v in nodes: # loop over all other remaining nodes - if not self.graph.has_edge(u, v): - return True - return False - - def phase1(self): - # choose node pairs from (degree) weighted distribution - while sum(self.remaining_degree.values()) >= 2 * self.dmax**2: - u,v = sorted(random_weighted_sample(self.remaining_degree, 2)) - if self.graph.has_edge(u,v): - continue - if random.random() < self.p(u,v): # accept edge - self.graph.add_edge(u,v) - self.update_remaining(u,v) - - def phase2(self): - # choose remaining nodes uniformly at random and use rejection sampling - while len(self.remaining_degree) >= 2 * self.dmax: - norm = float(max(self.remaining_degree.values()))**2 - while True: - u,v = sorted(random.sample(self.remaining_degree.keys(), 2)) - if self.graph.has_edge(u,v): - continue - if random.random() < self.q(u,v): - break - if random.random() < self.p(u,v): # accept edge - self.graph.add_edge(u,v) - self.update_remaining(u,v) - - def phase3(self): - # build potential remaining edges and choose with rejection sampling - potential_edges = combinations(self.remaining_degree, 2) - # build auxilliary graph of potential edges not already in graph - H = nx.Graph([(u,v) for (u,v) in potential_edges - if not self.graph.has_edge(u,v)]) - while self.remaining_degree: - if not self.suitable_edge(): - raise nx.NetworkXUnfeasible('no suitable edges left') - while True: - u,v = sorted(random.choice(H.edges())) - if random.random() < self.q(u,v): - break - if random.random() < self.p(u,v): # accept edge - self.graph.add_edge(u,v) - self.update_remaining(u,v, aux_graph=H) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/directed.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/directed.py deleted file mode 100644 index d1dc712..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/directed.py +++ /dev/null @@ -1,304 +0,0 @@ -""" -Generators for some directed graphs. - -gn_graph: growing network -gnc_graph: growing network with copying -gnr_graph: growing network with redirection -scale_free_graph: scale free directed graph - -""" -# Copyright (C) 2006-2009 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ ="""Aric Hagberg (hagberg@lanl.gov)\nWillem Ligtenberg (W.P.A.Ligtenberg@tue.nl)""" - -__all__ = ['gn_graph', 'gnc_graph', 'gnr_graph','scale_free_graph'] - -import random - -import networkx as nx -from networkx.generators.classic import empty_graph -from networkx.utils import discrete_sequence - - -def gn_graph(n,kernel=None,create_using=None,seed=None): - """Return the GN digraph with n nodes. - - The GN (growing network) graph is built by adding nodes one at a time with - a link to one previously added node. The target node for the link is - chosen with probability based on degree. The default attachment kernel is - a linear function of degree. - - The graph is always a (directed) tree. - - Parameters - ---------- - n : int - The number of nodes for the generated graph. - kernel : function - The attachment kernel. - create_using : graph, optional (default DiGraph) - Return graph of this type. The instance will be cleared. - seed : hashable object, optional - The seed for the random number generator. - - Examples - -------- - >>> D=nx.gn_graph(10) # the GN graph - >>> G=D.to_undirected() # the undirected version - - To specify an attachment kernel use the kernel keyword - - >>> D=nx.gn_graph(10,kernel=lambda x:x**1.5) # A_k=k^1.5 - - References - ---------- - .. [1] P. L. Krapivsky and S. Redner, - Organization of Growing Random Networks, - Phys. Rev. E, 63, 066123, 2001. - """ - if create_using is None: - create_using = nx.DiGraph() - elif not create_using.is_directed(): - raise nx.NetworkXError("Directed Graph required in create_using") - - if kernel is None: - kernel = lambda x: x - - if seed is not None: - random.seed(seed) - - G=empty_graph(1,create_using) - G.name="gn_graph(%s)"%(n) - - if n==1: - return G - - G.add_edge(1,0) # get started - ds=[1,1] # degree sequence - - for source in range(2,n): - # compute distribution from kernel and degree - dist=[kernel(d) for d in ds] - # choose target from discrete distribution - target=discrete_sequence(1,distribution=dist)[0] - G.add_edge(source,target) - ds.append(1) # the source has only one link (degree one) - ds[target]+=1 # add one to the target link degree - return G - - -def gnr_graph(n,p,create_using=None,seed=None): - """Return the GNR digraph with n nodes and redirection probability p. - - The GNR (growing network with redirection) graph is built by adding nodes - one at a time with a link to one previously added node. The previous - target node is chosen uniformly at random. With probabiliy p the link is - instead "redirected" to the successor node of the target. The graph is - always a (directed) tree. - - Parameters - ---------- - n : int - The number of nodes for the generated graph. - p : float - The redirection probability. - create_using : graph, optional (default DiGraph) - Return graph of this type. The instance will be cleared. - seed : hashable object, optional - The seed for the random number generator. - - Examples - -------- - >>> D=nx.gnr_graph(10,0.5) # the GNR graph - >>> G=D.to_undirected() # the undirected version - - References - ---------- - .. [1] P. L. Krapivsky and S. Redner, - Organization of Growing Random Networks, - Phys. Rev. E, 63, 066123, 2001. - """ - if create_using is None: - create_using = nx.DiGraph() - elif not create_using.is_directed(): - raise nx.NetworkXError("Directed Graph required in create_using") - - if not seed is None: - random.seed(seed) - - G=empty_graph(1,create_using) - G.name="gnr_graph(%s,%s)"%(n,p) - - if n==1: - return G - - for source in range(1,n): - target=random.randrange(0,source) - if random.random() < p and target !=0: - target=G.successors(target)[0] - G.add_edge(source,target) - - return G - - -def gnc_graph(n,create_using=None,seed=None): - """Return the GNC digraph with n nodes. - - The GNC (growing network with copying) graph is built by adding nodes one - at a time with a links to one previously added node (chosen uniformly at - random) and to all of that node's successors. - - Parameters - ---------- - n : int - The number of nodes for the generated graph. - create_using : graph, optional (default DiGraph) - Return graph of this type. The instance will be cleared. - seed : hashable object, optional - The seed for the random number generator. - - References - ---------- - .. [1] P. L. Krapivsky and S. Redner, - Network Growth by Copying, - Phys. Rev. E, 71, 036118, 2005k.}, - """ - if create_using is None: - create_using = nx.DiGraph() - elif not create_using.is_directed(): - raise nx.NetworkXError("Directed Graph required in create_using") - - if not seed is None: - random.seed(seed) - - G=empty_graph(1,create_using) - G.name="gnc_graph(%s)"%(n) - - if n==1: - return G - - for source in range(1,n): - target=random.randrange(0,source) - for succ in G.successors(target): - G.add_edge(source,succ) - G.add_edge(source,target) - - return G - - -def scale_free_graph(n, - alpha=0.41, - beta=0.54, - gamma=0.05, - delta_in=0.2, - delta_out=0, - create_using=None, - seed=None): - """Return a scale free directed graph. - - Parameters - ---------- - n : integer - Number of nodes in graph - alpha : float - Probability for adding a new node connected to an existing node - chosen randomly according to the in-degree distribution. - beta : float - Probability for adding an edge between two existing nodes. - One existing node is chosen randomly according the in-degree - distribution and the other chosen randomly according to the out-degree - distribution. - gamma : float - Probability for adding a new node conecgted to an existing node - chosen randomly according to the out-degree distribution. - delta_in : float - Bias for choosing ndoes from in-degree distribution. - delta_out : float - Bias for choosing ndoes from out-degree distribution. - create_using : graph, optional (default MultiDiGraph) - Use this graph instance to start the process (default=3-cycle). - seed : integer, optional - Seed for random number generator - - Examples - -------- - >>> G=nx.scale_free_graph(100) - - Notes - ----- - The sum of alpha, beta, and gamma must be 1. - - References - ---------- - .. [1] B. Bollob{\'a}s, C. Borgs, J. Chayes, and O. Riordan, - Directed scale-free graphs, - Proceedings of the fourteenth annual ACM-SIAM symposium on - Discrete algorithms, 132--139, 2003. - """ - - def _choose_node(G,distribution,delta): - cumsum=0.0 - # normalization - psum=float(sum(distribution.values()))+float(delta)*len(distribution) - r=random.random() - for i in range(0,len(distribution)): - cumsum+=(distribution[i]+delta)/psum - if r < cumsum: - break - return i - - if create_using is None: - # start with 3-cycle - G = nx.MultiDiGraph() - G.add_edges_from([(0,1),(1,2),(2,0)]) - else: - # keep existing graph structure? - G = create_using - if not (G.is_directed() and G.is_multigraph()): - raise nx.NetworkXError(\ - "MultiDiGraph required in create_using") - - if alpha <= 0: - raise ValueError('alpha must be >= 0.') - if beta <= 0: - raise ValueError('beta must be >= 0.') - if gamma <= 0: - raise ValueError('beta must be >= 0.') - - if alpha+beta+gamma !=1.0: - raise ValueError('alpha+beta+gamma must equal 1.') - - G.name="directed_scale_free_graph(%s,alpha=%s,beta=%s,gamma=%s,delta_in=%s,delta_out=%s)"%(n,alpha,beta,gamma,delta_in,delta_out) - - # seed random number generated (uses None as default) - random.seed(seed) - - while len(G)<n: - r = random.random() - # random choice in alpha,beta,gamma ranges - if r<alpha: - # alpha - # add new node v - v = len(G) - # choose w according to in-degree and delta_in - w = _choose_node(G, G.in_degree(),delta_in) - elif r < alpha+beta: - # beta - # choose v according to out-degree and delta_out - v = _choose_node(G, G.out_degree(),delta_out) - # choose w according to in-degree and delta_in - w = _choose_node(G, G.in_degree(),delta_in) - else: - # gamma - # choose v according to out-degree and delta_out - v = _choose_node(G, G.out_degree(),delta_out) - # add new node w - w = len(G) - G.add_edge(v,w) - - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/ego.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/ego.py deleted file mode 100644 index 15e5bc2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/ego.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -Ego graph. -""" -# Copyright (C) 2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """\n""".join(['Drew Conway <drew.conway@nyu.edu>', - 'Aric Hagberg <hagberg@lanl.gov>']) -__all__ = ['ego_graph'] - -import networkx as nx - -def ego_graph(G,n,radius=1,center=True,undirected=False,distance=None): - """Returns induced subgraph of neighbors centered at node n within - a given radius. - - Parameters - ---------- - G : graph - A NetworkX Graph or DiGraph - - n : node - A single node - - radius : number, optional - Include all neighbors of distance<=radius from n. - - center : bool, optional - If False, do not include center node in graph - - undirected : bool, optional - If True use both in- and out-neighbors of directed graphs. - - distance : key, optional - Use specified edge data key as distance. For example, setting - distance='weight' will use the edge weight to measure the - distance from the node n. - - Notes - ----- - For directed graphs D this produces the "out" neighborhood - or successors. If you want the neighborhood of predecessors - first reverse the graph with D.reverse(). If you want both - directions use the keyword argument undirected=True. - - Node, edge, and graph attributes are copied to the returned subgraph. - """ - if undirected: - if distance is not None: - sp,_=nx.single_source_dijkstra(G.to_undirected(), - n,cutoff=radius, - weight=distance) - else: - sp=nx.single_source_shortest_path_length(G.to_undirected(), - n,cutoff=radius) - else: - if distance is not None: - sp,_=nx.single_source_dijkstra(G, - n,cutoff=radius, - weight=distance) - else: - sp=nx.single_source_shortest_path_length(G,n,cutoff=radius) - - H=G.subgraph(sp).copy() - if not center: - H.remove_node(n) - return H diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/geometric.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/geometric.py deleted file mode 100644 index b64e0c2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/geometric.py +++ /dev/null @@ -1,352 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Generators for geometric graphs. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -from __future__ import print_function - -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Dan Schult (dschult@colgate.edu)', - 'Ben Edwards (BJEdwards@gmail.com)']) - -__all__ = ['random_geometric_graph', - 'waxman_graph', - 'geographical_threshold_graph', - 'navigable_small_world_graph'] - -from bisect import bisect_left -from functools import reduce -from itertools import product -import math, random, sys -import networkx as nx - -#--------------------------------------------------------------------------- -# Random Geometric Graphs -#--------------------------------------------------------------------------- - -def random_geometric_graph(n, radius, dim=2, pos=None): - r"""Return the random geometric graph in the unit cube. - - The random geometric graph model places n nodes uniformly at random - in the unit cube Two nodes `u,v` are connected with an edge if - `d(u,v)<=r` where `d` is the Euclidean distance and `r` is a radius - threshold. - - Parameters - ---------- - n : int - Number of nodes - radius: float - Distance threshold value - dim : int, optional - Dimension of graph - pos : dict, optional - A dictionary keyed by node with node positions as values. - - Returns - ------- - Graph - - Examples - -------- - >>> G = nx.random_geometric_graph(20,0.1) - - Notes - ----- - This uses an `n^2` algorithm to build the graph. A faster algorithm - is possible using k-d trees. - - The pos keyword can be used to specify node positions so you can create - an arbitrary distribution and domain for positions. If you need a distance - function other than Euclidean you'll have to hack the algorithm. - - E.g to use a 2d Gaussian distribution of node positions with mean (0,0) - and std. dev. 2 - - >>> import random - >>> n=20 - >>> p=dict((i,(random.gauss(0,2),random.gauss(0,2))) for i in range(n)) - >>> G = nx.random_geometric_graph(n,0.2,pos=p) - - References - ---------- - .. [1] Penrose, Mathew, Random Geometric Graphs, - Oxford Studies in Probability, 5, 2003. - """ - G=nx.Graph() - G.name="Random Geometric Graph" - G.add_nodes_from(range(n)) - if pos is None: - # random positions - for n in G: - G.node[n]['pos']=[random.random() for i in range(0,dim)] - else: - nx.set_node_attributes(G,'pos',pos) - # connect nodes within "radius" of each other - # n^2 algorithm, could use a k-d tree implementation - nodes = G.nodes(data=True) - while nodes: - u,du = nodes.pop() - pu = du['pos'] - for v,dv in nodes: - pv = dv['pos'] - d = sum(((a-b)**2 for a,b in zip(pu,pv))) - if d <= radius**2: - G.add_edge(u,v) - return G - -def geographical_threshold_graph(n, theta, alpha=2, dim=2, - pos=None, weight=None): - r"""Return a geographical threshold graph. - - The geographical threshold graph model places n nodes uniformly at random - in a rectangular domain. Each node `u` is assigned a weight `w_u`. - Two nodes `u,v` are connected with an edge if - - .. math:: - - w_u + w_v \ge \theta r^{\alpha} - - where `r` is the Euclidean distance between `u` and `v`, - and `\theta`, `\alpha` are parameters. - - Parameters - ---------- - n : int - Number of nodes - theta: float - Threshold value - alpha: float, optional - Exponent of distance function - dim : int, optional - Dimension of graph - pos : dict - Node positions as a dictionary of tuples keyed by node. - weight : dict - Node weights as a dictionary of numbers keyed by node. - - Returns - ------- - Graph - - Examples - -------- - >>> G = nx.geographical_threshold_graph(20,50) - - Notes - ----- - If weights are not specified they are assigned to nodes by drawing randomly - from an the exponential distribution with rate parameter `\lambda=1`. - To specify a weights from a different distribution assign them to a - dictionary and pass it as the weight= keyword - - >>> import random - >>> n = 20 - >>> w=dict((i,random.expovariate(5.0)) for i in range(n)) - >>> G = nx.geographical_threshold_graph(20,50,weight=w) - - If node positions are not specified they are randomly assigned from the - uniform distribution. - - References - ---------- - .. [1] Masuda, N., Miwa, H., Konno, N.: - Geographical threshold graphs with small-world and scale-free properties. - Physical Review E 71, 036108 (2005) - .. [2] Milan Bradonjić, Aric Hagberg and Allon G. Percus, - Giant component and connectivity in geographical threshold graphs, - in Algorithms and Models for the Web-Graph (WAW 2007), - Antony Bonato and Fan Chung (Eds), pp. 209--216, 2007 - """ - G=nx.Graph() - # add n nodes - G.add_nodes_from([v for v in range(n)]) - if weight is None: - # choose weights from exponential distribution - for n in G: - G.node[n]['weight'] = random.expovariate(1.0) - else: - nx.set_node_attributes(G,'weight',weight) - if pos is None: - # random positions - for n in G: - G.node[n]['pos']=[random.random() for i in range(0,dim)] - else: - nx.set_node_attributes(G,'pos',pos) - G.add_edges_from(geographical_threshold_edges(G, theta, alpha)) - return G - -def geographical_threshold_edges(G, theta, alpha=2): - # generate edges for a geographical threshold graph given a graph - # with positions and weights assigned as node attributes 'pos' and 'weight'. - nodes = G.nodes(data=True) - while nodes: - u,du = nodes.pop() - wu = du['weight'] - pu = du['pos'] - for v,dv in nodes: - wv = dv['weight'] - pv = dv['pos'] - r = math.sqrt(sum(((a-b)**2 for a,b in zip(pu,pv)))) - if wu+wv >= theta*r**alpha: - yield(u,v) - -def waxman_graph(n, alpha=0.4, beta=0.1, L=None, domain=(0,0,1,1)): - r"""Return a Waxman random graph. - - The Waxman random graph models place n nodes uniformly at random - in a rectangular domain. Two nodes u,v are connected with an edge - with probability - - .. math:: - p = \alpha*exp(-d/(\beta*L)). - - This function implements both Waxman models. - - Waxman-1: `L` not specified - The distance `d` is the Euclidean distance between the nodes u and v. - `L` is the maximum distance between all nodes in the graph. - - Waxman-2: `L` specified - The distance `d` is chosen randomly in `[0,L]`. - - Parameters - ---------- - n : int - Number of nodes - alpha: float - Model parameter - beta: float - Model parameter - L : float, optional - Maximum distance between nodes. If not specified the actual distance - is calculated. - domain : tuple of numbers, optional - Domain size (xmin, ymin, xmax, ymax) - - Returns - ------- - G: Graph - - References - ---------- - .. [1] B. M. Waxman, Routing of multipoint connections. - IEEE J. Select. Areas Commun. 6(9),(1988) 1617-1622. - """ - # build graph of n nodes with random positions in the unit square - G = nx.Graph() - G.add_nodes_from(range(n)) - (xmin,ymin,xmax,ymax)=domain - for n in G: - G.node[n]['pos']=((xmin + (xmax-xmin))*random.random(), - (ymin + (ymax-ymin))*random.random()) - if L is None: - # find maximum distance L between two nodes - l = 0 - pos = list(nx.get_node_attributes(G,'pos').values()) - while pos: - x1,y1 = pos.pop() - for x2,y2 in pos: - r2 = (x1-x2)**2 + (y1-y2)**2 - if r2 > l: - l = r2 - l=math.sqrt(l) - else: - # user specified maximum distance - l = L - - nodes=G.nodes() - if L is None: - # Waxman-1 model - # try all pairs, connect randomly based on euclidean distance - while nodes: - u = nodes.pop() - x1,y1 = G.node[u]['pos'] - for v in nodes: - x2,y2 = G.node[v]['pos'] - r = math.sqrt((x1-x2)**2 + (y1-y2)**2) - if random.random() < alpha*math.exp(-r/(beta*l)): - G.add_edge(u,v) - else: - # Waxman-2 model - # try all pairs, connect randomly based on randomly chosen l - while nodes: - u = nodes.pop() - for v in nodes: - r = random.random()*l - if random.random() < alpha*math.exp(-r/(beta*l)): - G.add_edge(u,v) - return G - - -def navigable_small_world_graph(n, p=1, q=1, r=2, dim=2, seed=None): - r"""Return a navigable small-world graph. - - A navigable small-world graph is a directed grid with additional - long-range connections that are chosen randomly. From [1]_: - - Begin with a set of nodes that are identified with the set of lattice - points in an `n \times n` square, `{(i,j): i\in {1,2,\ldots,n}, j\in {1,2,\ldots,n}}` - and define the lattice distance between two nodes `(i,j)` and `(k,l)` - to be the number of "lattice steps" separating them: `d((i,j),(k,l)) = |k-i|+|l-j|`. - - For a universal constant `p`, the node `u` has a directed edge to every other - node within lattice distance `p` (local contacts) . - - For universal constants `q\ge 0` and `r\ge 0` construct directed edges from `u` to `q` - other nodes (long-range contacts) using independent random trials; the i'th - directed edge from `u` has endpoint `v` with probability proportional to `d(u,v)^{-r}`. - - Parameters - ---------- - n : int - The number of nodes. - p : int - The diameter of short range connections. Each node is connected - to every other node within lattice distance p. - q : int - The number of long-range connections for each node. - r : float - Exponent for decaying probability of connections. The probability of - connecting to a node at lattice distance d is 1/d^r. - dim : int - Dimension of grid - seed : int, optional - Seed for random number generator (default=None). - - References - ---------- - .. [1] J. Kleinberg. The small-world phenomenon: An algorithmic - perspective. Proc. 32nd ACM Symposium on Theory of Computing, 2000. - """ - if (p < 1): - raise nx.NetworkXException("p must be >= 1") - if (q < 0): - raise nx.NetworkXException("q must be >= 0") - if (r < 0): - raise nx.NetworkXException("r must be >= 1") - if not seed is None: - random.seed(seed) - G = nx.DiGraph() - nodes = list(product(range(n),repeat=dim)) - for p1 in nodes: - probs = [0] - for p2 in nodes: - if p1==p2: - continue - d = sum((abs(b-a) for a,b in zip(p1,p2))) - if d <= p: - G.add_edge(p1,p2) - probs.append(d**-r) - cdf = list(nx.utils.cumulative_sum(probs)) - for _ in range(q): - target = nodes[bisect_left(cdf,random.uniform(0, cdf[-1]))] - G.add_edge(p1,target) - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/hybrid.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/hybrid.py deleted file mode 100644 index b4936fa..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/hybrid.py +++ /dev/null @@ -1,116 +0,0 @@ -""" -Hybrid - -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nDan Schult (dschult@colgate.edu)""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -_all__ = ['kl_connected_subgraph', 'is_kl_connected'] - -import copy -import networkx as nx - -def kl_connected_subgraph(G,k,l,low_memory=False,same_as_graph=False): - """ Returns the maximum locally (k,l) connected subgraph of G. - - (k,l)-connected subgraphs are presented by Fan Chung and Li - in "The Small World Phenomenon in hybrid power law graphs" - to appear in "Complex Networks" (Ed. E. Ben-Naim) Lecture - Notes in Physics, Springer (2004) - - low_memory=True then use a slightly slower, but lower memory version - same_as_graph=True then return a tuple with subgraph and - pflag for if G is kl-connected - """ - H=copy.deepcopy(G) # subgraph we construct by removing from G - - graphOK=True - deleted_some=True # hack to start off the while loop - while deleted_some: - deleted_some=False - for edge in H.edges(): - (u,v)=edge - ### Get copy of graph needed for this search - if low_memory: - verts=set([u,v]) - for i in range(k): - [verts.update(G.neighbors(w)) for w in verts.copy()] - G2=G.subgraph(list(verts)) - else: - G2=copy.deepcopy(G) - ### - path=[u,v] - cnt=0 - accept=0 - while path: - cnt += 1 # Found a path - if cnt>=l: - accept=1 - break - # record edges along this graph - prev=u - for w in path: - if prev!=w: - G2.remove_edge(prev,w) - prev=w -# path=shortest_path(G2,u,v,k) # ??? should "Cutoff" be k+1? - try: - path=nx.shortest_path(G2,u,v) # ??? should "Cutoff" be k+1? - except nx.NetworkXNoPath: - path = False - # No Other Paths - if accept==0: - H.remove_edge(u,v) - deleted_some=True - if graphOK: graphOK=False - # We looked through all edges and removed none of them. - # So, H is the maximal (k,l)-connected subgraph of G - if same_as_graph: - return (H,graphOK) - return H - -def is_kl_connected(G,k,l,low_memory=False): - """Returns True if G is kl connected.""" - graphOK=True - for edge in G.edges(): - (u,v)=edge - ### Get copy of graph needed for this search - if low_memory: - verts=set([u,v]) - for i in range(k): - [verts.update(G.neighbors(w)) for w in verts.copy()] - G2=G.subgraph(verts) - else: - G2=copy.deepcopy(G) - ### - path=[u,v] - cnt=0 - accept=0 - while path: - cnt += 1 # Found a path - if cnt>=l: - accept=1 - break - # record edges along this graph - prev=u - for w in path: - if w!=prev: - G2.remove_edge(prev,w) - prev=w -# path=shortest_path(G2,u,v,k) # ??? should "Cutoff" be k+1? - try: - path=nx.shortest_path(G2,u,v) # ??? should "Cutoff" be k+1? - except nx.NetworkXNoPath: - path = False - # No Other Paths - if accept==0: - graphOK=False - break - # return status - return graphOK - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/intersection.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/intersection.py deleted file mode 100644 index cc7903d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/intersection.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Generators for random intersection graphs. -""" -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import random -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)']) - -__all__ = ['uniform_random_intersection_graph', - 'k_random_intersection_graph', - 'general_random_intersection_graph', - ] - -def uniform_random_intersection_graph(n, m, p, seed=None): - """Return a uniform random intersection graph. - - Parameters - ---------- - n : int - The number of nodes in the first bipartite set (nodes) - m : int - The number of nodes in the second bipartite set (attributes) - p : float - Probability of connecting nodes between bipartite sets - seed : int, optional - Seed for random number generator (default=None). - - See Also - -------- - gnp_random_graph - - References - ---------- - .. [1] K.B. Singer-Cohen, Random Intersection Graphs, 1995, - PhD thesis, Johns Hopkins University - .. [2] Fill, J. A., Scheinerman, E. R., and Singer-Cohen, K. B., - Random intersection graphs when m = !(n): - An equivalence theorem relating the evolution of the g(n, m, p) - and g(n, p) models. Random Struct. Algorithms 16, 2 (2000), 156–176. - """ - G=nx.bipartite_random_graph(n, m, p, seed=seed) - return nx.projected_graph(G, range(n)) - -def k_random_intersection_graph(n,m,k): - """Return a intersection graph with randomly chosen attribute sets for - each node that are of equal size (k). - - Parameters - ---------- - n : int - The number of nodes in the first bipartite set (nodes) - m : int - The number of nodes in the second bipartite set (attributes) - k : float - Size of attribute set to assign to each node. - seed : int, optional - Seed for random number generator (default=None). - - See Also - -------- - gnp_random_graph, uniform_random_intersection_graph - - References - ---------- - .. [1] Godehardt, E., and Jaworski, J. - Two models of random intersection graphs and their applications. - Electronic Notes in Discrete Mathematics 10 (2001), 129--132. - """ - G = nx.empty_graph(n + m) - mset = range(n,n+m) - for v in range(n): - targets = random.sample(mset, k) - G.add_edges_from(zip([v]*len(targets), targets)) - return nx.projected_graph(G, range(n)) - -def general_random_intersection_graph(n,m,p): - """Return a random intersection graph with independent probabilities - for connections between node and attribute sets. - - Parameters - ---------- - n : int - The number of nodes in the first bipartite set (nodes) - m : int - The number of nodes in the second bipartite set (attributes) - p : list of floats of length m - Probabilities for connecting nodes to each attribute - seed : int, optional - Seed for random number generator (default=None). - - See Also - -------- - gnp_random_graph, uniform_random_intersection_graph - - References - ---------- - .. [1] Nikoletseas, S. E., Raptopoulos, C., and Spirakis, P. G. - The existence and efficient construction of large independent sets - in general random intersection graphs. In ICALP (2004), J. D´ıaz, - J. Karhum¨aki, A. Lepist¨o, and D. Sannella, Eds., vol. 3142 - of Lecture Notes in Computer Science, Springer, pp. 1029–1040. - """ - if len(p)!=m: - raise ValueError("Probability list p must have m elements.") - G = nx.empty_graph(n + m) - mset = range(n,n+m) - for u in range(n): - for v,q in zip(mset,p): - if random.random()<q: - G.add_edge(u,v) - return nx.projected_graph(G, range(n)) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/line.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/line.py deleted file mode 100644 index 4d6c14d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/line.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Line graphs. - -""" -# Copyright (C) 2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)\nDan Schult(dschult@colgate.edu)""" - -__all__ = ['line_graph'] - -import networkx as nx - -def line_graph(G): - """Return the line graph of the graph or digraph G. - - The line graph of a graph G has a node for each edge - in G and an edge between those nodes if the two edges - in G share a common node. - - For DiGraphs an edge an edge represents a directed path of length 2. - - The original node labels are kept as two-tuple node labels - in the line graph. - - Parameters - ---------- - G : graph - A NetworkX Graph or DiGraph - - Examples - -------- - >>> G=nx.star_graph(3) - >>> L=nx.line_graph(G) - >>> print(sorted(L.edges())) # makes a clique, K3 - [((0, 1), (0, 2)), ((0, 1), (0, 3)), ((0, 3), (0, 2))] - - Notes - ----- - Not implemented for MultiGraph or MultiDiGraph classes. - - Graph, node, and edge data are not propagated to the new graph. - - """ - if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph: - raise Exception("Line graph not implemented for Multi(Di)Graphs") - L=G.__class__() - if G.is_directed(): - for u,nlist in G.adjacency_iter(): # same as successors for digraph - # look for directed path of length two - for n in nlist: - nbrs=G[n] # successors - for nbr in nbrs: - if nbr!=u: - L.add_edge((u,n),(n,nbr)) - else: - for u,nlist in G.adjacency_iter(): - # label nodes as tuple of edge endpoints in original graph - # "node tuple" must be in lexigraphical order - nodes=[tuple(sorted(n)) for n in zip([u]*len(nlist),nlist)] - # add clique of nodes to graph - while nodes: - u=nodes.pop() - L.add_edges_from((u,v) for v in nodes) - return L - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/random_clustered.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/random_clustered.py deleted file mode 100644 index fe294e6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/random_clustered.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -"""Generate graphs with given degree and triangle sequence. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import random -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Joel Miller (joel.c.miller.research@gmail.com)']) - -__all__ = ['random_clustered_graph'] - - -def random_clustered_graph(joint_degree_sequence, create_using=None, seed=None): - """Generate a random graph with the given joint degree and triangle - degree sequence. - - This uses a configuration model-like approach to generate a - random pseudograph (graph with parallel edges and self loops) by - randomly assigning edges to match the given indepdenent edge - and triangle degree sequence. - - Parameters - ---------- - joint_degree_sequence : list of integer pairs - Each list entry corresponds to the independent edge degree and - triangle degree of a node. - create_using : graph, optional (default MultiGraph) - Return graph of this type. The instance will be cleared. - seed : hashable object, optional - The seed for the random number generator. - - Returns - ------- - G : MultiGraph - A graph with the specified degree sequence. Nodes are labeled - starting at 0 with an index corresponding to the position in - deg_sequence. - - Raises - ------ - NetworkXError - If the independent edge degree sequence sum is not even - or the triangle degree sequence sum is not divisible by 3. - - Notes - ----- - As described by Miller [1]_ (see also Newman [2]_ for an equivalent - description). - - A non-graphical degree sequence (not realizable by some simple - graph) is allowed since this function returns graphs with self - loops and parallel edges. An exception is raised if the - independent degree sequence does not have an even sum or the - triangle degree sequence sum is not divisible by 3. - - This configuration model-like construction process can lead to - duplicate edges and loops. You can remove the self-loops and - parallel edges (see below) which will likely result in a graph - that doesn't have the exact degree sequence specified. This - "finite-size effect" decreases as the size of the graph increases. - - References - ---------- - .. [1] J. C. Miller "Percolation and Epidemics on Random Clustered Graphs." - Physical Review E, Rapid Communication (to appear). - .. [2] M.E.J. Newman, "Random clustered networks". - Physical Review Letters (to appear). - - Examples - -------- - >>> deg_tri=[[1,0],[1,0],[1,0],[2,0],[1,0],[2,1],[0,1],[0,1]] - >>> G = nx.random_clustered_graph(deg_tri) - - To remove parallel edges: - - >>> G=nx.Graph(G) - - To remove self loops: - - >>> G.remove_edges_from(G.selfloop_edges()) - - """ - if create_using is None: - create_using = nx.MultiGraph() - elif create_using.is_directed(): - raise nx.NetworkXError("Directed Graph not supported") - - if not seed is None: - random.seed(seed) - - # In Python 3, zip() returns an iterator. Make this into a list. - joint_degree_sequence = list(joint_degree_sequence) - - N = len(joint_degree_sequence) - G = nx.empty_graph(N,create_using) - - ilist = [] - tlist = [] - for n in G: - degrees = joint_degree_sequence[n] - for icount in range(degrees[0]): - ilist.append(n) - for tcount in range(degrees[1]): - tlist.append(n) - - if len(ilist)%2 != 0 or len(tlist)%3 != 0: - raise nx.NetworkXError('Invalid degree sequence') - - random.shuffle(ilist) - random.shuffle(tlist) - while ilist: - G.add_edge(ilist.pop(),ilist.pop()) - while tlist: - n1 = tlist.pop() - n2 = tlist.pop() - n3 = tlist.pop() - G.add_edges_from([(n1,n2),(n1,n3),(n2,n3)]) - G.name = "random_clustered %d nodes %d edges"%(G.order(),G.size()) - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/random_graphs.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/random_graphs.py deleted file mode 100644 index 81c20ab..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/random_graphs.py +++ /dev/null @@ -1,890 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Generators for random graphs. - -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult (dschult@colgate.edu)']) -import itertools -import random -import math -import networkx as nx -from networkx.generators.classic import empty_graph, path_graph, complete_graph - -from collections import defaultdict - -__all__ = ['fast_gnp_random_graph', - 'gnp_random_graph', - 'dense_gnm_random_graph', - 'gnm_random_graph', - 'erdos_renyi_graph', - 'binomial_graph', - 'newman_watts_strogatz_graph', - 'watts_strogatz_graph', - 'connected_watts_strogatz_graph', - 'random_regular_graph', - 'barabasi_albert_graph', - 'powerlaw_cluster_graph', - 'random_lobster', - 'random_shell_graph', - 'random_powerlaw_tree', - 'random_powerlaw_tree_sequence'] - - -#------------------------------------------------------------------------- -# Some Famous Random Graphs -#------------------------------------------------------------------------- - - -def fast_gnp_random_graph(n, p, seed=None, directed=False): - """Return a random graph G_{n,p} (Erdős-Rényi graph, binomial graph). - - Parameters - ---------- - n : int - The number of nodes. - p : float - Probability for edge creation. - seed : int, optional - Seed for random number generator (default=None). - directed : bool, optional (default=False) - If True return a directed graph - - Notes - ----- - The G_{n,p} graph algorithm chooses each of the [n(n-1)]/2 - (undirected) or n(n-1) (directed) possible edges with probability p. - - This algorithm is O(n+m) where m is the expected number of - edges m=p*n*(n-1)/2. - - It should be faster than gnp_random_graph when p is small and - the expected number of edges is small (sparse graph). - - See Also - -------- - gnp_random_graph - - References - ---------- - .. [1] Vladimir Batagelj and Ulrik Brandes, - "Efficient generation of large random networks", - Phys. Rev. E, 71, 036113, 2005. - """ - G = empty_graph(n) - G.name="fast_gnp_random_graph(%s,%s)"%(n,p) - - if not seed is None: - random.seed(seed) - - if p <= 0 or p >= 1: - return nx.gnp_random_graph(n,p,directed=directed) - - v = 1 # Nodes in graph are from 0,n-1 (this is the second node index). - w = -1 - lp = math.log(1.0 - p) - - if directed: - G=nx.DiGraph(G) - while v < n: - lr = math.log(1.0 - random.random()) - w = w + 1 + int(lr/lp) - if v == w: # avoid self loops - w = w + 1 - while w >= n and v < n: - w = w - n - v = v + 1 - if v == w: # avoid self loops - w = w + 1 - if v < n: - G.add_edge(v, w) - else: - while v < n: - lr = math.log(1.0 - random.random()) - w = w + 1 + int(lr/lp) - while w >= v and v < n: - w = w - v - v = v + 1 - if v < n: - G.add_edge(v, w) - return G - - -def gnp_random_graph(n, p, seed=None, directed=False): - """Return a random graph G_{n,p} (Erdős-Rényi graph, binomial graph). - - Chooses each of the possible edges with probability p. - - This is also called binomial_graph and erdos_renyi_graph. - - Parameters - ---------- - n : int - The number of nodes. - p : float - Probability for edge creation. - seed : int, optional - Seed for random number generator (default=None). - directed : bool, optional (default=False) - If True return a directed graph - - See Also - -------- - fast_gnp_random_graph - - Notes - ----- - This is an O(n^2) algorithm. For sparse graphs (small p) see - fast_gnp_random_graph for a faster algorithm. - - References - ---------- - .. [1] P. Erdős and A. Rényi, On Random Graphs, Publ. Math. 6, 290 (1959). - .. [2] E. N. Gilbert, Random Graphs, Ann. Math. Stat., 30, 1141 (1959). - """ - if directed: - G=nx.DiGraph() - else: - G=nx.Graph() - G.add_nodes_from(range(n)) - G.name="gnp_random_graph(%s,%s)"%(n,p) - if p<=0: - return G - if p>=1: - return complete_graph(n,create_using=G) - - if not seed is None: - random.seed(seed) - - if G.is_directed(): - edges=itertools.permutations(range(n),2) - else: - edges=itertools.combinations(range(n),2) - - for e in edges: - if random.random() < p: - G.add_edge(*e) - return G - - -# add some aliases to common names -binomial_graph=gnp_random_graph -erdos_renyi_graph=gnp_random_graph - -def dense_gnm_random_graph(n, m, seed=None): - """Return the random graph G_{n,m}. - - Gives a graph picked randomly out of the set of all graphs - with n nodes and m edges. - This algorithm should be faster than gnm_random_graph for dense graphs. - - Parameters - ---------- - n : int - The number of nodes. - m : int - The number of edges. - seed : int, optional - Seed for random number generator (default=None). - - See Also - -------- - gnm_random_graph() - - Notes - ----- - Algorithm by Keith M. Briggs Mar 31, 2006. - Inspired by Knuth's Algorithm S (Selection sampling technique), - in section 3.4.2 of [1]_. - - References - ---------- - .. [1] Donald E. Knuth, The Art of Computer Programming, - Volume 2/Seminumerical algorithms, Third Edition, Addison-Wesley, 1997. - """ - mmax=n*(n-1)/2 - if m>=mmax: - G=complete_graph(n) - else: - G=empty_graph(n) - G.name="dense_gnm_random_graph(%s,%s)"%(n,m) - - if n==1 or m>=mmax: - return G - - if seed is not None: - random.seed(seed) - - u=0 - v=1 - t=0 - k=0 - while True: - if random.randrange(mmax-t)<m-k: - G.add_edge(u,v) - k+=1 - if k==m: return G - t+=1 - v+=1 - if v==n: # go to next row of adjacency matrix - u+=1 - v=u+1 - -def gnm_random_graph(n, m, seed=None, directed=False): - """Return the random graph G_{n,m}. - - Produces a graph picked randomly out of the set of all graphs - with n nodes and m edges. - - Parameters - ---------- - n : int - The number of nodes. - m : int - The number of edges. - seed : int, optional - Seed for random number generator (default=None). - directed : bool, optional (default=False) - If True return a directed graph - """ - if directed: - G=nx.DiGraph() - else: - G=nx.Graph() - G.add_nodes_from(range(n)) - G.name="gnm_random_graph(%s,%s)"%(n,m) - - if seed is not None: - random.seed(seed) - - if n==1: - return G - max_edges=n*(n-1) - if not directed: - max_edges/=2.0 - if m>=max_edges: - return complete_graph(n,create_using=G) - - nlist=G.nodes() - edge_count=0 - while edge_count < m: - # generate random edge,u,v - u = random.choice(nlist) - v = random.choice(nlist) - if u==v or G.has_edge(u,v): - continue - else: - G.add_edge(u,v) - edge_count=edge_count+1 - return G - - -def newman_watts_strogatz_graph(n, k, p, seed=None): - """Return a Newman-Watts-Strogatz small world graph. - - Parameters - ---------- - n : int - The number of nodes - k : int - Each node is connected to k nearest neighbors in ring topology - p : float - The probability of adding a new edge for each edge - seed : int, optional - seed for random number generator (default=None) - - Notes - ----- - First create a ring over n nodes. Then each node in the ring is - connected with its k nearest neighbors (k-1 neighbors if k is odd). - Then shortcuts are created by adding new edges as follows: - for each edge u-v in the underlying "n-ring with k nearest neighbors" - with probability p add a new edge u-w with randomly-chosen existing - node w. In contrast with watts_strogatz_graph(), no edges are removed. - - See Also - -------- - watts_strogatz_graph() - - References - ---------- - .. [1] M. E. J. Newman and D. J. Watts, - Renormalization group analysis of the small-world network model, - Physics Letters A, 263, 341, 1999. - http://dx.doi.org/10.1016/S0375-9601(99)00757-4 - """ - if seed is not None: - random.seed(seed) - if k>=n: - raise nx.NetworkXError("k>=n, choose smaller k or larger n") - G=empty_graph(n) - G.name="newman_watts_strogatz_graph(%s,%s,%s)"%(n,k,p) - nlist = G.nodes() - fromv = nlist - # connect the k/2 neighbors - for j in range(1, k // 2+1): - tov = fromv[j:] + fromv[0:j] # the first j are now last - for i in range(len(fromv)): - G.add_edge(fromv[i], tov[i]) - # for each edge u-v, with probability p, randomly select existing - # node w and add new edge u-w - e = G.edges() - for (u, v) in e: - if random.random() < p: - w = random.choice(nlist) - # no self-loops and reject if edge u-w exists - # is that the correct NWS model? - while w == u or G.has_edge(u, w): - w = random.choice(nlist) - if G.degree(u) >= n-1: - break # skip this rewiring - else: - G.add_edge(u,w) - return G - - -def watts_strogatz_graph(n, k, p, seed=None): - """Return a Watts-Strogatz small-world graph. - - - Parameters - ---------- - n : int - The number of nodes - k : int - Each node is connected to k nearest neighbors in ring topology - p : float - The probability of rewiring each edge - seed : int, optional - Seed for random number generator (default=None) - - See Also - -------- - newman_watts_strogatz_graph() - connected_watts_strogatz_graph() - - Notes - ----- - First create a ring over n nodes. Then each node in the ring is - connected with its k nearest neighbors (k-1 neighbors if k is odd). - Then shortcuts are created by replacing some edges as follows: - for each edge u-v in the underlying "n-ring with k nearest neighbors" - with probability p replace it with a new edge u-w with uniformly - random choice of existing node w. - - In contrast with newman_watts_strogatz_graph(), the random - rewiring does not increase the number of edges. The rewired graph - is not guaranteed to be connected as in connected_watts_strogatz_graph(). - - References - ---------- - .. [1] Duncan J. Watts and Steven H. Strogatz, - Collective dynamics of small-world networks, - Nature, 393, pp. 440--442, 1998. - """ - if k>=n: - raise nx.NetworkXError("k>=n, choose smaller k or larger n") - if seed is not None: - random.seed(seed) - - G = nx.Graph() - G.name="watts_strogatz_graph(%s,%s,%s)"%(n,k,p) - nodes = list(range(n)) # nodes are labeled 0 to n-1 - # connect each node to k/2 neighbors - for j in range(1, k // 2+1): - targets = nodes[j:] + nodes[0:j] # first j nodes are now last in list - G.add_edges_from(zip(nodes,targets)) - # rewire edges from each node - # loop over all nodes in order (label) and neighbors in order (distance) - # no self loops or multiple edges allowed - for j in range(1, k // 2+1): # outer loop is neighbors - targets = nodes[j:] + nodes[0:j] # first j nodes are now last in list - # inner loop in node order - for u,v in zip(nodes,targets): - if random.random() < p: - w = random.choice(nodes) - # Enforce no self-loops or multiple edges - while w == u or G.has_edge(u, w): - w = random.choice(nodes) - if G.degree(u) >= n-1: - break # skip this rewiring - else: - G.remove_edge(u,v) - G.add_edge(u,w) - return G - -def connected_watts_strogatz_graph(n, k, p, tries=100, seed=None): - """Return a connected Watts-Strogatz small-world graph. - - Attempt to generate a connected realization by repeated - generation of Watts-Strogatz small-world graphs. - An exception is raised if the maximum number of tries is exceeded. - - Parameters - ---------- - n : int - The number of nodes - k : int - Each node is connected to k nearest neighbors in ring topology - p : float - The probability of rewiring each edge - tries : int - Number of attempts to generate a connected graph. - seed : int, optional - The seed for random number generator. - - See Also - -------- - newman_watts_strogatz_graph() - watts_strogatz_graph() - - """ - G = watts_strogatz_graph(n, k, p, seed) - t=1 - while not nx.is_connected(G): - G = watts_strogatz_graph(n, k, p, seed) - t=t+1 - if t>tries: - raise nx.NetworkXError("Maximum number of tries exceeded") - return G - - -def random_regular_graph(d, n, seed=None): - """Return a random regular graph of n nodes each with degree d. - - The resulting graph G has no self-loops or parallel edges. - - Parameters - ---------- - d : int - Degree - n : integer - Number of nodes. The value of n*d must be even. - seed : hashable object - The seed for random number generator. - - Notes - ----- - The nodes are numbered form 0 to n-1. - - Kim and Vu's paper [2]_ shows that this algorithm samples in an - asymptotically uniform way from the space of random graphs when - d = O(n**(1/3-epsilon)). - - References - ---------- - .. [1] A. Steger and N. Wormald, - Generating random regular graphs quickly, - Probability and Computing 8 (1999), 377-396, 1999. - http://citeseer.ist.psu.edu/steger99generating.html - - .. [2] Jeong Han Kim and Van H. Vu, - Generating random regular graphs, - Proceedings of the thirty-fifth ACM symposium on Theory of computing, - San Diego, CA, USA, pp 213--222, 2003. - http://portal.acm.org/citation.cfm?id=780542.780576 - """ - if (n * d) % 2 != 0: - raise nx.NetworkXError("n * d must be even") - - if not 0 <= d < n: - raise nx.NetworkXError("the 0 <= d < n inequality must be satisfied") - - if seed is not None: - random.seed(seed) - - def _suitable(edges, potential_edges): - # Helper subroutine to check if there are suitable edges remaining - # If False, the generation of the graph has failed - if not potential_edges: - return True - for s1 in potential_edges: - for s2 in potential_edges: - # Two iterators on the same dictionary are guaranteed - # to visit it in the same order if there are no - # intervening modifications. - if s1 == s2: - # Only need to consider s1-s2 pair one time - break - if s1 > s2: - s1, s2 = s2, s1 - if (s1, s2) not in edges: - return True - return False - - def _try_creation(): - # Attempt to create an edge set - - edges = set() - stubs = list(range(n)) * d - - while stubs: - potential_edges = defaultdict(lambda: 0) - random.shuffle(stubs) - stubiter = iter(stubs) - for s1, s2 in zip(stubiter, stubiter): - if s1 > s2: - s1, s2 = s2, s1 - if s1 != s2 and ((s1, s2) not in edges): - edges.add((s1, s2)) - else: - potential_edges[s1] += 1 - potential_edges[s2] += 1 - - if not _suitable(edges, potential_edges): - return None # failed to find suitable edge set - - stubs = [node for node, potential in potential_edges.items() - for _ in range(potential)] - return edges - - # Even though a suitable edge set exists, - # the generation of such a set is not guaranteed. - # Try repeatedly to find one. - edges = _try_creation() - while edges is None: - edges = _try_creation() - - G = nx.Graph() - G.name = "random_regular_graph(%s, %s)" % (d, n) - G.add_edges_from(edges) - - return G - -def _random_subset(seq,m): - """ Return m unique elements from seq. - - This differs from random.sample which can return repeated - elements if seq holds repeated elements. - """ - targets=set() - while len(targets)<m: - x=random.choice(seq) - targets.add(x) - return targets - -def barabasi_albert_graph(n, m, seed=None): - """Return random graph using Barabási-Albert preferential attachment model. - - A graph of n nodes is grown by attaching new nodes each with m - edges that are preferentially attached to existing nodes with high - degree. - - Parameters - ---------- - n : int - Number of nodes - m : int - Number of edges to attach from a new node to existing nodes - seed : int, optional - Seed for random number generator (default=None). - - Returns - ------- - G : Graph - - Notes - ----- - The initialization is a graph with with m nodes and no edges. - - References - ---------- - .. [1] A. L. Barabási and R. Albert "Emergence of scaling in - random networks", Science 286, pp 509-512, 1999. - """ - - if m < 1 or m >=n: - raise nx.NetworkXError(\ - "Barabási-Albert network must have m>=1 and m<n, m=%d,n=%d"%(m,n)) - if seed is not None: - random.seed(seed) - - # Add m initial nodes (m0 in barabasi-speak) - G=empty_graph(m) - G.name="barabasi_albert_graph(%s,%s)"%(n,m) - # Target nodes for new edges - targets=list(range(m)) - # List of existing nodes, with nodes repeated once for each adjacent edge - repeated_nodes=[] - # Start adding the other n-m nodes. The first node is m. - source=m - while source<n: - # Add edges to m nodes from the source. - G.add_edges_from(zip([source]*m,targets)) - # Add one node to the list for each new edge just created. - repeated_nodes.extend(targets) - # And the new node "source" has m edges to add to the list. - repeated_nodes.extend([source]*m) - # Now choose m unique nodes from the existing nodes - # Pick uniformly from repeated_nodes (preferential attachement) - targets = _random_subset(repeated_nodes,m) - source += 1 - return G - -def powerlaw_cluster_graph(n, m, p, seed=None): - """Holme and Kim algorithm for growing graphs with powerlaw - degree distribution and approximate average clustering. - - Parameters - ---------- - n : int - the number of nodes - m : int - the number of random edges to add for each new node - p : float, - Probability of adding a triangle after adding a random edge - seed : int, optional - Seed for random number generator (default=None). - - Notes - ----- - The average clustering has a hard time getting above - a certain cutoff that depends on m. This cutoff is often quite low. - Note that the transitivity (fraction of triangles to possible - triangles) seems to go down with network size. - - It is essentially the Barabási-Albert (B-A) growth model with an - extra step that each random edge is followed by a chance of - making an edge to one of its neighbors too (and thus a triangle). - - This algorithm improves on B-A in the sense that it enables a - higher average clustering to be attained if desired. - - It seems possible to have a disconnected graph with this algorithm - since the initial m nodes may not be all linked to a new node - on the first iteration like the B-A model. - - References - ---------- - .. [1] P. Holme and B. J. Kim, - "Growing scale-free networks with tunable clustering", - Phys. Rev. E, 65, 026107, 2002. - """ - - if m < 1 or n < m: - raise nx.NetworkXError(\ - "NetworkXError must have m>1 and m<n, m=%d,n=%d"%(m,n)) - - if p > 1 or p < 0: - raise nx.NetworkXError(\ - "NetworkXError p must be in [0,1], p=%f"%(p)) - if seed is not None: - random.seed(seed) - - G=empty_graph(m) # add m initial nodes (m0 in barabasi-speak) - G.name="Powerlaw-Cluster Graph" - repeated_nodes=G.nodes() # list of existing nodes to sample from - # with nodes repeated once for each adjacent edge - source=m # next node is m - while source<n: # Now add the other n-1 nodes - possible_targets = _random_subset(repeated_nodes,m) - # do one preferential attachment for new node - target=possible_targets.pop() - G.add_edge(source,target) - repeated_nodes.append(target) # add one node to list for each new link - count=1 - while count<m: # add m-1 more new links - if random.random()<p: # clustering step: add triangle - neighborhood=[nbr for nbr in G.neighbors(target) \ - if not G.has_edge(source,nbr) \ - and not nbr==source] - if neighborhood: # if there is a neighbor without a link - nbr=random.choice(neighborhood) - G.add_edge(source,nbr) # add triangle - repeated_nodes.append(nbr) - count=count+1 - continue # go to top of while loop - # else do preferential attachment step if above fails - target=possible_targets.pop() - G.add_edge(source,target) - repeated_nodes.append(target) - count=count+1 - - repeated_nodes.extend([source]*m) # add source node to list m times - source += 1 - return G - -def random_lobster(n, p1, p2, seed=None): - """Return a random lobster. - - A lobster is a tree that reduces to a caterpillar when pruning all - leaf nodes. - - A caterpillar is a tree that reduces to a path graph when pruning - all leaf nodes (p2=0). - - Parameters - ---------- - n : int - The expected number of nodes in the backbone - p1 : float - Probability of adding an edge to the backbone - p2 : float - Probability of adding an edge one level beyond backbone - seed : int, optional - Seed for random number generator (default=None). - """ - # a necessary ingredient in any self-respecting graph library - if seed is not None: - random.seed(seed) - llen=int(2*random.random()*n + 0.5) - L=path_graph(llen) - L.name="random_lobster(%d,%s,%s)"%(n,p1,p2) - # build caterpillar: add edges to path graph with probability p1 - current_node=llen-1 - for n in range(llen): - if random.random()<p1: # add fuzzy caterpillar parts - current_node+=1 - L.add_edge(n,current_node) - if random.random()<p2: # add crunchy lobster bits - current_node+=1 - L.add_edge(current_node-1,current_node) - return L # voila, un lobster! - -def random_shell_graph(constructor, seed=None): - """Return a random shell graph for the constructor given. - - Parameters - ---------- - constructor: a list of three-tuples - (n,m,d) for each shell starting at the center shell. - n : int - The number of nodes in the shell - m : int - The number or edges in the shell - d : float - The ratio of inter-shell (next) edges to intra-shell edges. - d=0 means no intra shell edges, d=1 for the last shell - seed : int, optional - Seed for random number generator (default=None). - - Examples - -------- - >>> constructor=[(10,20,0.8),(20,40,0.8)] - >>> G=nx.random_shell_graph(constructor) - - """ - G=empty_graph(0) - G.name="random_shell_graph(constructor)" - - if seed is not None: - random.seed(seed) - - glist=[] - intra_edges=[] - nnodes=0 - # create gnm graphs for each shell - for (n,m,d) in constructor: - inter_edges=int(m*d) - intra_edges.append(m-inter_edges) - g=nx.convert_node_labels_to_integers( - gnm_random_graph(n,inter_edges), - first_label=nnodes) - glist.append(g) - nnodes+=n - G=nx.operators.union(G,g) - - # connect the shells randomly - for gi in range(len(glist)-1): - nlist1=glist[gi].nodes() - nlist2=glist[gi+1].nodes() - total_edges=intra_edges[gi] - edge_count=0 - while edge_count < total_edges: - u = random.choice(nlist1) - v = random.choice(nlist2) - if u==v or G.has_edge(u,v): - continue - else: - G.add_edge(u,v) - edge_count=edge_count+1 - return G - - -def random_powerlaw_tree(n, gamma=3, seed=None, tries=100): - """Return a tree with a powerlaw degree distribution. - - Parameters - ---------- - n : int, - The number of nodes - gamma : float - Exponent of the power-law - seed : int, optional - Seed for random number generator (default=None). - tries : int - Number of attempts to adjust sequence to make a tree - - Notes - ----- - A trial powerlaw degree sequence is chosen and then elements are - swapped with new elements from a powerlaw distribution until - the sequence makes a tree (#edges=#nodes-1). - - """ - from networkx.generators.degree_seq import degree_sequence_tree - try: - s=random_powerlaw_tree_sequence(n, - gamma=gamma, - seed=seed, - tries=tries) - except: - raise nx.NetworkXError(\ - "Exceeded max (%d) attempts for a valid tree sequence."%tries) - G=degree_sequence_tree(s) - G.name="random_powerlaw_tree(%s,%s)"%(n,gamma) - return G - - -def random_powerlaw_tree_sequence(n, gamma=3, seed=None, tries=100): - """ Return a degree sequence for a tree with a powerlaw distribution. - - Parameters - ---------- - n : int, - The number of nodes - gamma : float - Exponent of the power-law - seed : int, optional - Seed for random number generator (default=None). - tries : int - Number of attempts to adjust sequence to make a tree - - Notes - ----- - A trial powerlaw degree sequence is chosen and then elements are - swapped with new elements from a powerlaw distribution until - the sequence makes a tree (#edges=#nodes-1). - - - """ - if seed is not None: - random.seed(seed) - - # get trial sequence - z=nx.utils.powerlaw_sequence(n,exponent=gamma) - # round to integer values in the range [0,n] - zseq=[min(n, max( int(round(s)),0 )) for s in z] - - # another sequence to swap values from - z=nx.utils.powerlaw_sequence(tries,exponent=gamma) - # round to integer values in the range [0,n] - swap=[min(n, max( int(round(s)),0 )) for s in z] - - for deg in swap: - if n-sum(zseq)/2.0 == 1.0: # is a tree, return sequence - return zseq - index=random.randint(0,n-1) - zseq[index]=swap.pop() - - raise nx.NetworkXError(\ - "Exceeded max (%d) attempts for a valid tree sequence."%tries) - return False - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/small.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/small.py deleted file mode 100644 index f41f8d0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/small.py +++ /dev/null @@ -1,412 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Various small and named graphs, together with some compact generators. - -""" -__author__ ="""Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['make_small_graph', - 'LCF_graph', - 'bull_graph', - 'chvatal_graph', - 'cubical_graph', - 'desargues_graph', - 'diamond_graph', - 'dodecahedral_graph', - 'frucht_graph', - 'heawood_graph', - 'house_graph', - 'house_x_graph', - 'icosahedral_graph', - 'krackhardt_kite_graph', - 'moebius_kantor_graph', - 'octahedral_graph', - 'pappus_graph', - 'petersen_graph', - 'sedgewick_maze_graph', - 'tetrahedral_graph', - 'truncated_cube_graph', - 'truncated_tetrahedron_graph', - 'tutte_graph'] - -import networkx as nx -from networkx.generators.classic import empty_graph, cycle_graph, path_graph, complete_graph -from networkx.exception import NetworkXError - -#------------------------------------------------------------------------------ -# Tools for creating small graphs -#------------------------------------------------------------------------------ -def make_small_undirected_graph(graph_description, create_using=None): - """ - Return a small undirected graph described by graph_description. - - See make_small_graph. - """ - if create_using is not None and create_using.is_directed(): - raise NetworkXError("Directed Graph not supported") - return make_small_graph(graph_description, create_using) - -def make_small_graph(graph_description, create_using=None): - """ - Return the small graph described by graph_description. - - graph_description is a list of the form [ltype,name,n,xlist] - - Here ltype is one of "adjacencylist" or "edgelist", - name is the name of the graph and n the number of nodes. - This constructs a graph of n nodes with integer labels 0,..,n-1. - - If ltype="adjacencylist" then xlist is an adjacency list - with exactly n entries, in with the j'th entry (which can be empty) - specifies the nodes connected to vertex j. - e.g. the "square" graph C_4 can be obtained by - - >>> G=nx.make_small_graph(["adjacencylist","C_4",4,[[2,4],[1,3],[2,4],[1,3]]]) - - or, since we do not need to add edges twice, - - >>> G=nx.make_small_graph(["adjacencylist","C_4",4,[[2,4],[3],[4],[]]]) - - If ltype="edgelist" then xlist is an edge list - written as [[v1,w2],[v2,w2],...,[vk,wk]], - where vj and wj integers in the range 1,..,n - e.g. the "square" graph C_4 can be obtained by - - >>> G=nx.make_small_graph(["edgelist","C_4",4,[[1,2],[3,4],[2,3],[4,1]]]) - - Use the create_using argument to choose the graph class/type. - """ - ltype=graph_description[0] - name=graph_description[1] - n=graph_description[2] - - G=empty_graph(n, create_using) - nodes=G.nodes() - - if ltype=="adjacencylist": - adjlist=graph_description[3] - if len(adjlist) != n: - raise NetworkXError("invalid graph_description") - G.add_edges_from([(u-1,v) for v in nodes for u in adjlist[v]]) - elif ltype=="edgelist": - edgelist=graph_description[3] - for e in edgelist: - v1=e[0]-1 - v2=e[1]-1 - if v1<0 or v1>n-1 or v2<0 or v2>n-1: - raise NetworkXError("invalid graph_description") - else: - G.add_edge(v1,v2) - G.name=name - return G - - -def LCF_graph(n,shift_list,repeats,create_using=None): - """ - Return the cubic graph specified in LCF notation. - - LCF notation (LCF=Lederberg-Coxeter-Fruchte) is a compressed - notation used in the generation of various cubic Hamiltonian - graphs of high symmetry. See, for example, dodecahedral_graph, - desargues_graph, heawood_graph and pappus_graph below. - - n (number of nodes) - The starting graph is the n-cycle with nodes 0,...,n-1. - (The null graph is returned if n < 0.) - - shift_list = [s1,s2,..,sk], a list of integer shifts mod n, - - repeats - integer specifying the number of times that shifts in shift_list - are successively applied to each v_current in the n-cycle - to generate an edge between v_current and v_current+shift mod n. - - For v1 cycling through the n-cycle a total of k*repeats - with shift cycling through shiftlist repeats times connect - v1 with v1+shift mod n - - The utility graph K_{3,3} - - >>> G=nx.LCF_graph(6,[3,-3],3) - - The Heawood graph - - >>> G=nx.LCF_graph(14,[5,-5],7) - - See http://mathworld.wolfram.com/LCFNotation.html for a description - and references. - - """ - if create_using is not None and create_using.is_directed(): - raise NetworkXError("Directed Graph not supported") - - if n <= 0: - return empty_graph(0, create_using) - - # start with the n-cycle - G=cycle_graph(n, create_using) - G.name="LCF_graph" - nodes=G.nodes() - - n_extra_edges=repeats*len(shift_list) - # edges are added n_extra_edges times - # (not all of these need be new) - if n_extra_edges < 1: - return G - - for i in range(n_extra_edges): - shift=shift_list[i%len(shift_list)] #cycle through shift_list - v1=nodes[i%n] # cycle repeatedly through nodes - v2=nodes[(i + shift)%n] - G.add_edge(v1, v2) - return G - - -#------------------------------------------------------------------------------- -# Various small and named graphs -#------------------------------------------------------------------------------- - -def bull_graph(create_using=None): - """Return the Bull graph. """ - description=[ - "adjacencylist", - "Bull Graph", - 5, - [[2,3],[1,3,4],[1,2,5],[2],[3]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def chvatal_graph(create_using=None): - """Return the Chvátal graph.""" - description=[ - "adjacencylist", - "Chvatal Graph", - 12, - [[2,5,7,10],[3,6,8],[4,7,9],[5,8,10], - [6,9],[11,12],[11,12],[9,12], - [11],[11,12],[],[]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def cubical_graph(create_using=None): - """Return the 3-regular Platonic Cubical graph.""" - description=[ - "adjacencylist", - "Platonic Cubical Graph", - 8, - [[2,4,5],[1,3,8],[2,4,7],[1,3,6], - [1,6,8],[4,5,7],[3,6,8],[2,5,7]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def desargues_graph(create_using=None): - """ Return the Desargues graph.""" - G=LCF_graph(20, [5,-5,9,-9], 5, create_using) - G.name="Desargues Graph" - return G - -def diamond_graph(create_using=None): - """Return the Diamond graph. """ - description=[ - "adjacencylist", - "Diamond Graph", - 4, - [[2,3],[1,3,4],[1,2,4],[2,3]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def dodecahedral_graph(create_using=None): - """ Return the Platonic Dodecahedral graph. """ - G=LCF_graph(20, [10,7,4,-4,-7,10,-4,7,-7,4], 2, create_using) - G.name="Dodecahedral Graph" - return G - -def frucht_graph(create_using=None): - """Return the Frucht Graph. - - The Frucht Graph is the smallest cubical graph whose - automorphism group consists only of the identity element. - - """ - G=cycle_graph(7, create_using) - G.add_edges_from([[0,7],[1,7],[2,8],[3,9],[4,9],[5,10],[6,10], - [7,11],[8,11],[8,9],[10,11]]) - - G.name="Frucht Graph" - return G - -def heawood_graph(create_using=None): - """ Return the Heawood graph, a (3,6) cage. """ - G=LCF_graph(14, [5,-5], 7, create_using) - G.name="Heawood Graph" - return G - -def house_graph(create_using=None): - """Return the House graph (square with triangle on top).""" - description=[ - "adjacencylist", - "House Graph", - 5, - [[2,3],[1,4],[1,4,5],[2,3,5],[3,4]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def house_x_graph(create_using=None): - """Return the House graph with a cross inside the house square.""" - description=[ - "adjacencylist", - "House-with-X-inside Graph", - 5, - [[2,3,4],[1,3,4],[1,2,4,5],[1,2,3,5],[3,4]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def icosahedral_graph(create_using=None): - """Return the Platonic Icosahedral graph.""" - description=[ - "adjacencylist", - "Platonic Icosahedral Graph", - 12, - [[2,6,8,9,12],[3,6,7,9],[4,7,9,10],[5,7,10,11], - [6,7,11,12],[7,12],[],[9,10,11,12], - [10],[11],[12],[]] - ] - G=make_small_undirected_graph(description, create_using) - return G - - -def krackhardt_kite_graph(create_using=None): - """ - Return the Krackhardt Kite Social Network. - - A 10 actor social network introduced by David Krackhardt - to illustrate: degree, betweenness, centrality, closeness, etc. - The traditional labeling is: - Andre=1, Beverley=2, Carol=3, Diane=4, - Ed=5, Fernando=6, Garth=7, Heather=8, Ike=9, Jane=10. - - """ - description=[ - "adjacencylist", - "Krackhardt Kite Social Network", - 10, - [[2,3,4,6],[1,4,5,7],[1,4,6],[1,2,3,5,6,7],[2,4,7], - [1,3,4,7,8],[2,4,5,6,8],[6,7,9],[8,10],[9]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def moebius_kantor_graph(create_using=None): - """Return the Moebius-Kantor graph.""" - G=LCF_graph(16, [5,-5], 8, create_using) - G.name="Moebius-Kantor Graph" - return G - -def octahedral_graph(create_using=None): - """Return the Platonic Octahedral graph.""" - description=[ - "adjacencylist", - "Platonic Octahedral Graph", - 6, - [[2,3,4,5],[3,4,6],[5,6],[5,6],[6],[]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def pappus_graph(): - """ Return the Pappus graph.""" - G=LCF_graph(18,[5,7,-7,7,-7,-5],3) - G.name="Pappus Graph" - return G - -def petersen_graph(create_using=None): - """Return the Petersen graph.""" - description=[ - "adjacencylist", - "Petersen Graph", - 10, - [[2,5,6],[1,3,7],[2,4,8],[3,5,9],[4,1,10],[1,8,9],[2,9,10], - [3,6,10],[4,6,7],[5,7,8]] - ] - G=make_small_undirected_graph(description, create_using) - return G - - -def sedgewick_maze_graph(create_using=None): - """ - Return a small maze with a cycle. - - This is the maze used in Sedgewick,3rd Edition, Part 5, Graph - Algorithms, Chapter 18, e.g. Figure 18.2 and following. - Nodes are numbered 0,..,7 - """ - G=empty_graph(0, create_using) - G.add_nodes_from(range(8)) - G.add_edges_from([[0,2],[0,7],[0,5]]) - G.add_edges_from([[1,7],[2,6]]) - G.add_edges_from([[3,4],[3,5]]) - G.add_edges_from([[4,5],[4,7],[4,6]]) - G.name="Sedgewick Maze" - return G - -def tetrahedral_graph(create_using=None): - """ Return the 3-regular Platonic Tetrahedral graph.""" - G=complete_graph(4, create_using) - G.name="Platonic Tetrahedral graph" - return G - -def truncated_cube_graph(create_using=None): - """Return the skeleton of the truncated cube.""" - description=[ - "adjacencylist", - "Truncated Cube Graph", - 24, - [[2,3,5],[12,15],[4,5],[7,9], - [6],[17,19],[8,9],[11,13], - [10],[18,21],[12,13],[15], - [14],[22,23],[16],[20,24], - [18,19],[21],[20],[24], - [22],[23],[24],[]] - ] - G=make_small_undirected_graph(description, create_using) - return G - -def truncated_tetrahedron_graph(create_using=None): - """Return the skeleton of the truncated Platonic tetrahedron.""" - G=path_graph(12, create_using) -# G.add_edges_from([(1,3),(1,10),(2,7),(4,12),(5,12),(6,8),(9,11)]) - G.add_edges_from([(0,2),(0,9),(1,6),(3,11),(4,11),(5,7),(8,10)]) - G.name="Truncated Tetrahedron Graph" - return G - -def tutte_graph(create_using=None): - """Return the Tutte graph.""" - description=[ - "adjacencylist", - "Tutte's Graph", - 46, - [[2,3,4],[5,27],[11,12],[19,20],[6,34], - [7,30],[8,28],[9,15],[10,39],[11,38], - [40],[13,40],[14,36],[15,16],[35], - [17,23],[18,45],[19,44],[46],[21,46], - [22,42],[23,24],[41],[25,28],[26,33], - [27,32],[34],[29],[30,33],[31], - [32,34],[33],[],[],[36,39], - [37],[38,40],[39],[],[], - [42,45],[43],[44,46],[45],[],[]] - ] - G=make_small_undirected_graph(description, create_using) - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/social.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/social.py deleted file mode 100644 index 212dd9c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/social.py +++ /dev/null @@ -1,280 +0,0 @@ -""" -Famous social networks. -""" -import networkx as nx -__author__ = """\n""".join(['Jordi Torrents <jtorrents@milnou.net>', - 'Katy Bold <kbold@princeton.edu>', - 'Aric Hagberg <aric.hagberg@gmail.com)']) - -__all__ = ['karate_club_graph','davis_southern_women_graph', - 'florentine_families_graph'] - -def karate_club_graph(): - """Return Zachary's Karate club graph. - - References - ---------- - .. [1] Zachary W. - An information flow model for conflict and fission in small groups. - Journal of Anthropological Research, 33, 452-473, (1977). - - .. [2] Data file from: - http://vlado.fmf.uni-lj.si/pub/networks/data/Ucinet/UciData.htm - """ - G=nx.Graph() - G.add_nodes_from(range(34)) - G.name="Zachary's Karate Club" - - zacharydat="""\ -0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 -1 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 -1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 -1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 -0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 -0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 1 -0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 0""" - row=0 - for line in zacharydat.split('\n'): - thisrow=list(map(int,line.split(' '))) - for col in range(0,len(thisrow)): - if thisrow[col]==1: - G.add_edge(row,col) # col goes from 0,33 - row+=1 - club1 = 'Mr. Hi' - club2 = 'Officer' - G.node[0]['club'] = club1 - G.node[1]['club'] = club1 - G.node[2]['club'] = club1 - G.node[3]['club'] = club1 - G.node[4]['club'] = club1 - G.node[5]['club'] = club1 - G.node[6]['club'] = club1 - G.node[7]['club'] = club1 - G.node[8]['club'] = club1 - G.node[9]['club'] = club2 - G.node[10]['club'] = club1 - G.node[11]['club'] = club1 - G.node[12]['club'] = club1 - G.node[13]['club'] = club1 - G.node[14]['club'] = club2 - G.node[15]['club'] = club2 - G.node[16]['club'] = club1 - G.node[17]['club'] = club1 - G.node[18]['club'] = club2 - G.node[19]['club'] = club1 - G.node[20]['club'] = club2 - G.node[21]['club'] = club1 - G.node[22]['club'] = club2 - G.node[23]['club'] = club2 - G.node[24]['club'] = club2 - G.node[25]['club'] = club2 - G.node[26]['club'] = club2 - G.node[27]['club'] = club2 - G.node[28]['club'] = club2 - G.node[29]['club'] = club2 - G.node[30]['club'] = club2 - G.node[31]['club'] = club2 - G.node[32]['club'] = club2 - G.node[33]['club'] = club2 - return G - - - -def davis_southern_women_graph(): - """Return Davis Southern women social network. - - This is a bipartite graph. - - References - ---------- - .. [1] A. Davis, Gardner, B. B., Gardner, M. R., 1941. Deep South. - University of Chicago Press, Chicago, IL. - """ - G = nx.Graph() - # Top nodes - G.add_nodes_from(["Evelyn Jefferson", - "Laura Mandeville", - "Theresa Anderson", - "Brenda Rogers", - "Charlotte McDowd", - "Frances Anderson", - "Eleanor Nye", - "Pearl Oglethorpe", - "Ruth DeSand", - "Verne Sanderson", - "Myra Liddel", - "Katherina Rogers", - "Sylvia Avondale", - "Nora Fayette", - "Helen Lloyd", - "Dorothy Murchison", - "Olivia Carleton", - "Flora Price"], - bipartite=0) - # Bottom nodes - G.add_nodes_from(["E1", - "E2", - "E3", - "E4", - "E5", - "E6", - "E7", - "E8", - "E9", - "E10", - "E11", - "E12", - "E13", - "E14"], - bipartite=1) - - G.add_edges_from([("Evelyn Jefferson","E1"), - ("Evelyn Jefferson","E2"), - ("Evelyn Jefferson","E3"), - ("Evelyn Jefferson","E4"), - ("Evelyn Jefferson","E5"), - ("Evelyn Jefferson","E6"), - ("Evelyn Jefferson","E8"), - ("Evelyn Jefferson","E9"), - ("Laura Mandeville","E1"), - ("Laura Mandeville","E2"), - ("Laura Mandeville","E3"), - ("Laura Mandeville","E5"), - ("Laura Mandeville","E6"), - ("Laura Mandeville","E7"), - ("Laura Mandeville","E8"), - ("Theresa Anderson","E2"), - ("Theresa Anderson","E3"), - ("Theresa Anderson","E4"), - ("Theresa Anderson","E5"), - ("Theresa Anderson","E6"), - ("Theresa Anderson","E7"), - ("Theresa Anderson","E8"), - ("Theresa Anderson","E9"), - ("Brenda Rogers","E1"), - ("Brenda Rogers","E3"), - ("Brenda Rogers","E4"), - ("Brenda Rogers","E5"), - ("Brenda Rogers","E6"), - ("Brenda Rogers","E7"), - ("Brenda Rogers","E8"), - ("Charlotte McDowd","E3"), - ("Charlotte McDowd","E4"), - ("Charlotte McDowd","E5"), - ("Charlotte McDowd","E7"), - ("Frances Anderson","E3"), - ("Frances Anderson","E5"), - ("Frances Anderson","E6"), - ("Frances Anderson","E8"), - ("Eleanor Nye","E5"), - ("Eleanor Nye","E6"), - ("Eleanor Nye","E7"), - ("Eleanor Nye","E8"), - ("Pearl Oglethorpe","E6"), - ("Pearl Oglethorpe","E8"), - ("Pearl Oglethorpe","E9"), - ("Ruth DeSand","E5"), - ("Ruth DeSand","E7"), - ("Ruth DeSand","E8"), - ("Ruth DeSand","E9"), - ("Verne Sanderson","E7"), - ("Verne Sanderson","E8"), - ("Verne Sanderson","E9"), - ("Verne Sanderson","E12"), - ("Myra Liddel","E8"), - ("Myra Liddel","E9"), - ("Myra Liddel","E10"), - ("Myra Liddel","E12"), - ("Katherina Rogers","E8"), - ("Katherina Rogers","E9"), - ("Katherina Rogers","E10"), - ("Katherina Rogers","E12"), - ("Katherina Rogers","E13"), - ("Katherina Rogers","E14"), - ("Sylvia Avondale","E7"), - ("Sylvia Avondale","E8"), - ("Sylvia Avondale","E9"), - ("Sylvia Avondale","E10"), - ("Sylvia Avondale","E12"), - ("Sylvia Avondale","E13"), - ("Sylvia Avondale","E14"), - ("Nora Fayette","E6"), - ("Nora Fayette","E7"), - ("Nora Fayette","E9"), - ("Nora Fayette","E10"), - ("Nora Fayette","E11"), - ("Nora Fayette","E12"), - ("Nora Fayette","E13"), - ("Nora Fayette","E14"), - ("Helen Lloyd","E7"), - ("Helen Lloyd","E8"), - ("Helen Lloyd","E10"), - ("Helen Lloyd","E11"), - ("Helen Lloyd","E12"), - ("Dorothy Murchison","E8"), - ("Dorothy Murchison","E9"), - ("Olivia Carleton","E9"), - ("Olivia Carleton","E11"), - ("Flora Price","E9"), - ("Flora Price","E11")]) - return G - -def florentine_families_graph(): - """Return Florentine families graph. - - References - ---------- - .. [1] Ronald L. Breiger and Philippa E. Pattison - Cumulated social roles: The duality of persons and their algebras,1 - Social Networks, Volume 8, Issue 3, September 1986, Pages 215-256 - """ - G=nx.Graph() - G.add_edge('Acciaiuoli','Medici') - G.add_edge('Castellani','Peruzzi') - G.add_edge('Castellani','Strozzi') - G.add_edge('Castellani','Barbadori') - G.add_edge('Medici','Barbadori') - G.add_edge('Medici','Ridolfi') - G.add_edge('Medici','Tornabuoni') - G.add_edge('Medici','Albizzi') - G.add_edge('Medici','Salviati') - G.add_edge('Salviati','Pazzi') - G.add_edge('Peruzzi','Strozzi') - G.add_edge('Peruzzi','Bischeri') - G.add_edge('Strozzi','Ridolfi') - G.add_edge('Strozzi','Bischeri') - G.add_edge('Ridolfi','Tornabuoni') - G.add_edge('Tornabuoni','Guadagni') - G.add_edge('Albizzi','Ginori') - G.add_edge('Albizzi','Guadagni') - G.add_edge('Bischeri','Guadagni') - G.add_edge('Guadagni','Lamberteschi') - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/stochastic.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/stochastic.py deleted file mode 100644 index 5553f5f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/stochastic.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Stocastic graph.""" -# Copyright (C) 2010-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = "Aric Hagberg <aric.hagberg@gmail.com>" -__all__ = ['stochastic_graph'] - -def stochastic_graph(G, copy=True, weight='weight'): - """Return a right-stochastic representation of G. - - A right-stochastic graph is a weighted digraph in which all of - the node (out) neighbors edge weights sum to 1. - - Parameters - ----------- - G : graph - A NetworkX graph - - copy : boolean, optional - If True make a copy of the graph, otherwise modify the original graph - - weight : edge attribute key (optional, default='weight') - Edge data key used for weight. If no attribute is found for an edge - the edge weight is set to 1. - """ - if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph: - raise nx.NetworkXError('stochastic_graph not implemented ' - 'for multigraphs') - - if not G.is_directed(): - raise nx.NetworkXError('stochastic_graph not implemented ' - 'for undirected graphs') - - if copy: - W = nx.DiGraph(G) - else: - W = G # reference original graph, no copy - - degree = W.out_degree(weight=weight) - for (u,v,d) in W.edges(data=True): - d[weight] = float(d.get(weight,1.0))/degree[u] - return W diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_atlas.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_atlas.py deleted file mode 100644 index 2428385..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_atlas.py +++ /dev/null @@ -1,55 +0,0 @@ -from nose.tools import * -import networkx as nx - - -class TestAtlas(object): - def setUp(self): - self.GAG=nx.graph_atlas_g() - - def test_sizes(self): - G=self.GAG[0] - assert_equal(G.number_of_nodes(),0) - assert_equal(G.number_of_edges(),0) - - G=self.GAG[7] - assert_equal(G.number_of_nodes(),3) - assert_equal(G.number_of_edges(),3) - - def test_names(self): - i=0 - for g in self.GAG: - name=g.name - assert_equal(int(name[1:]),i) - i+=1 - - def test_monotone_nodes(self): - # check for monotone increasing number of nodes - previous=self.GAG[0] - for g in self.GAG: - assert_false(len(g)-len(previous) > 1) - previous=g.copy() - - def test_monotone_nodes(self): - # check for monotone increasing number of edges - # (for fixed number of nodes) - previous=self.GAG[0] - for g in self.GAG: - if len(g)==len(previous): - assert_false(g.size()-previous.size() > 1) - previous=g.copy() - - def test_monotone_degree_sequence(self): - # check for monotone increasing degree sequence - # (for fixed number f nodes and edges) - # note that 111223 < 112222 - previous=self.GAG[0] - for g in self.GAG: - if len(g)==0: - continue - if len(g)==len(previous) & g.size()==previous.size(): - deg_seq=sorted(g.degree().values()) - previous_deg_seq=sorted(previous.degree().values()) - assert_true(previous_deg_seq < deg_seq) - previous=g.copy() - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_bipartite.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_bipartite.py deleted file mode 100644 index 63d336e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_bipartite.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python - -from nose.tools import * -from networkx import * -from networkx.generators.bipartite import * - -"""Generators - Bipartite ----------------------- -""" - -class TestGeneratorsBipartite(): - def test_configuration_model(self): - aseq=[3,3,3,3] - bseq=[2,2,2,2,2] - assert_raises(networkx.exception.NetworkXError, - bipartite_configuration_model, aseq, bseq) - - aseq=[3,3,3,3] - bseq=[2,2,2,2,2,2] - G=bipartite_configuration_model(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,2,2,2] - bseq=[3,3,3,3] - G=bipartite_configuration_model(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,1,1,1] - bseq=[3,3,3] - G=bipartite_configuration_model(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [1, 1, 1, 2, 2, 2, 3, 3, 3]) - - GU=project(Graph(G),range(len(aseq))) - assert_equal(GU.number_of_nodes(), 6) - - GD=project(Graph(G),range(len(aseq),len(aseq)+len(bseq))) - assert_equal(GD.number_of_nodes(), 3) - - assert_raises(networkx.exception.NetworkXError, - bipartite_configuration_model, aseq, bseq, - create_using=DiGraph()) - - def test_havel_hakimi_graph(self): - aseq=[3,3,3,3] - bseq=[2,2,2,2,2] - assert_raises(networkx.exception.NetworkXError, - bipartite_havel_hakimi_graph, aseq, bseq) - - bseq=[2,2,2,2,2,2] - G=bipartite_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,2,2,2] - bseq=[3,3,3,3] - G=bipartite_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - GU=project(Graph(G),range(len(aseq))) - assert_equal(GU.number_of_nodes(), 6) - - GD=project(Graph(G),range(len(aseq),len(aseq)+len(bseq))) - assert_equal(GD.number_of_nodes(), 4) - assert_raises(networkx.exception.NetworkXError, - bipartite_havel_hakimi_graph, aseq, bseq, - create_using=DiGraph()) - - def test_reverse_havel_hakimi_graph(self): - aseq=[3,3,3,3] - bseq=[2,2,2,2,2] - assert_raises(networkx.exception.NetworkXError, - bipartite_reverse_havel_hakimi_graph, aseq, bseq) - - bseq=[2,2,2,2,2,2] - G=bipartite_reverse_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,2,2,2] - bseq=[3,3,3,3] - G=bipartite_reverse_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,1,1,1] - bseq=[3,3,3] - G=bipartite_reverse_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [1, 1, 1, 2, 2, 2, 3, 3, 3]) - - GU=project(Graph(G),range(len(aseq))) - assert_equal(GU.number_of_nodes(), 6) - - GD=project(Graph(G),range(len(aseq),len(aseq)+len(bseq))) - assert_equal(GD.number_of_nodes(), 3) - assert_raises(networkx.exception.NetworkXError, - bipartite_reverse_havel_hakimi_graph, aseq, bseq, - create_using=DiGraph()) - - def test_alternating_havel_hakimi_graph(self): - aseq=[3,3,3,3] - bseq=[2,2,2,2,2] - assert_raises(networkx.exception.NetworkXError, - bipartite_alternating_havel_hakimi_graph, aseq, bseq) - - bseq=[2,2,2,2,2,2] - G=bipartite_alternating_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,2,2,2] - bseq=[3,3,3,3] - G=bipartite_alternating_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]) - - aseq=[2,2,2,1,1,1] - bseq=[3,3,3] - G=bipartite_alternating_havel_hakimi_graph(aseq,bseq) - assert_equal(sorted(G.degree().values()), - [1, 1, 1, 2, 2, 2, 3, 3, 3]) - - GU=project(Graph(G),range(len(aseq))) - assert_equal(GU.number_of_nodes(), 6) - - GD=project(Graph(G),range(len(aseq),len(aseq)+len(bseq))) - assert_equal(GD.number_of_nodes(), 3) - - assert_raises(networkx.exception.NetworkXError, - bipartite_alternating_havel_hakimi_graph, aseq, bseq, - create_using=DiGraph()) - - def test_preferential_attachment(self): - aseq=[3,2,1,1] - G=bipartite_preferential_attachment_graph(aseq,0.5) - assert_raises(networkx.exception.NetworkXError, - bipartite_preferential_attachment_graph, aseq, 0.5, - create_using=DiGraph()) - - def test_bipartite_random_graph(self): - n=10 - m=20 - G=bipartite_random_graph(n,m,0.9) - assert_equal(len(G),30) - assert_true(is_bipartite(G)) - X,Y=nx.algorithms.bipartite.sets(G) - assert_equal(set(range(n)),X) - assert_equal(set(range(n,n+m)),Y) - - def test_directed_bipartite_random_graph(self): - n=10 - m=20 - G=bipartite_random_graph(n,m,0.9,directed=True) - assert_equal(len(G),30) - assert_true(is_bipartite(G)) - X,Y=nx.algorithms.bipartite.sets(G) - assert_equal(set(range(n)),X) - assert_equal(set(range(n,n+m)),Y) - - def test_bipartite_gnmk_random_graph(self): - n = 10 - m = 20 - edges = 100 - G = bipartite_gnmk_random_graph(n, m, edges) - assert_equal(len(G),30) - assert_true(is_bipartite(G)) - X,Y=nx.algorithms.bipartite.sets(G) - print(X) - assert_equal(set(range(n)),X) - assert_equal(set(range(n,n+m)),Y) - assert_equal(edges, len(G.edges())) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_classic.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_classic.py deleted file mode 100644 index 96ca367..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_classic.py +++ /dev/null @@ -1,408 +0,0 @@ -#!/usr/bin/env python -""" -==================== -Generators - Classic -==================== - -Unit tests for various classic graph generators in generators/classic.py -""" -from nose.tools import * -from networkx import * -from networkx.algorithms.isomorphism.isomorph import graph_could_be_isomorphic -is_isomorphic=graph_could_be_isomorphic - -class TestGeneratorClassic(): - def test_balanced_tree(self): - # balanced_tree(r,h) is a tree with (r**(h+1)-1)/(r-1) edges - for r,h in [(2,2),(3,3),(6,2)]: - t=balanced_tree(r,h) - order=t.order() - assert_true(order==(r**(h+1)-1)/(r-1)) - assert_true(is_connected(t)) - assert_true(t.size()==order-1) - dh = degree_histogram(t) - assert_equal(dh[0],0) # no nodes of 0 - assert_equal(dh[1],r**h) # nodes of degree 1 are leaves - assert_equal(dh[r],1) # root is degree r - assert_equal(dh[r+1],order-r**h-1)# everyone else is degree r+1 - assert_equal(len(dh),r+2) - - def test_balanced_tree_star(self): - # balanced_tree(r,1) is the r-star - t=balanced_tree(r=2,h=1) - assert_true(is_isomorphic(t,star_graph(2))) - t=balanced_tree(r=5,h=1) - assert_true(is_isomorphic(t,star_graph(5))) - t=balanced_tree(r=10,h=1) - assert_true(is_isomorphic(t,star_graph(10))) - - def test_full_rary_tree(self): - r=2 - n=9 - t=full_rary_tree(r,n) - assert_equal(t.order(),n) - assert_true(is_connected(t)) - dh = degree_histogram(t) - assert_equal(dh[0],0) # no nodes of 0 - assert_equal(dh[1],5) # nodes of degree 1 are leaves - assert_equal(dh[r],1) # root is degree r - assert_equal(dh[r+1],9-5-1) # everyone else is degree r+1 - assert_equal(len(dh),r+2) - - def test_full_rary_tree_balanced(self): - t=full_rary_tree(2,15) - th=balanced_tree(2,3) - assert_true(is_isomorphic(t,th)) - - def test_full_rary_tree_path(self): - t=full_rary_tree(1,10) - assert_true(is_isomorphic(t,path_graph(10))) - - def test_full_rary_tree_empty(self): - t=full_rary_tree(0,10) - assert_true(is_isomorphic(t,empty_graph(10))) - t=full_rary_tree(3,0) - assert_true(is_isomorphic(t,empty_graph(0))) - - def test_full_rary_tree_3_20(self): - t=full_rary_tree(3,20) - assert_equal(t.order(),20) - - def test_barbell_graph(self): - # number of nodes = 2*m1 + m2 (2 m1-complete graphs + m2-path + 2 edges) - # number of edges = 2*(number_of_edges(m1-complete graph) + m2 + 1 - m1=3; m2=5 - b=barbell_graph(m1,m2) - assert_true(number_of_nodes(b)==2*m1+m2) - assert_true(number_of_edges(b)==m1*(m1-1) + m2 + 1) - assert_equal(b.name, 'barbell_graph(3,5)') - - m1=4; m2=10 - b=barbell_graph(m1,m2) - assert_true(number_of_nodes(b)==2*m1+m2) - assert_true(number_of_edges(b)==m1*(m1-1) + m2 + 1) - assert_equal(b.name, 'barbell_graph(4,10)') - - m1=3; m2=20 - b=barbell_graph(m1,m2) - assert_true(number_of_nodes(b)==2*m1+m2) - assert_true(number_of_edges(b)==m1*(m1-1) + m2 + 1) - assert_equal(b.name, 'barbell_graph(3,20)') - - # Raise NetworkXError if m1<2 - m1=1; m2=20 - assert_raises(networkx.exception.NetworkXError, barbell_graph, m1, m2) - - # Raise NetworkXError if m2<0 - m1=5; m2=-2 - assert_raises(networkx.exception.NetworkXError, barbell_graph, m1, m2) - - # barbell_graph(2,m) = path_graph(m+4) - m1=2; m2=5 - b=barbell_graph(m1,m2) - assert_true(is_isomorphic(b, path_graph(m2+4))) - - m1=2; m2=10 - b=barbell_graph(m1,m2) - assert_true(is_isomorphic(b, path_graph(m2+4))) - - m1=2; m2=20 - b=barbell_graph(m1,m2) - assert_true(is_isomorphic(b, path_graph(m2+4))) - - assert_raises(networkx.exception.NetworkXError, barbell_graph, m1, m2, - create_using=DiGraph()) - - mb=barbell_graph(m1, m2, create_using=MultiGraph()) - assert_true(mb.edges()==b.edges()) - - def test_complete_graph(self): - # complete_graph(m) is a connected graph with - # m nodes and m*(m+1)/2 edges - for m in [0, 1, 3, 5]: - g = complete_graph(m) - assert_true(number_of_nodes(g) == m) - assert_true(number_of_edges(g) == m * (m - 1) // 2) - - - mg=complete_graph(m, create_using=MultiGraph()) - assert_true(mg.edges()==g.edges()) - - def test_complete_digraph(self): - # complete_graph(m) is a connected graph with - # m nodes and m*(m+1)/2 edges - for m in [0, 1, 3, 5]: - g = complete_graph(m,create_using=nx.DiGraph()) - assert_true(number_of_nodes(g) == m) - assert_true(number_of_edges(g) == m * (m - 1)) - - def test_complete_bipartite_graph(self): - G=complete_bipartite_graph(0,0) - assert_true(is_isomorphic( G, null_graph() )) - - for i in [1, 5]: - G=complete_bipartite_graph(i,0) - assert_true(is_isomorphic( G, empty_graph(i) )) - G=complete_bipartite_graph(0,i) - assert_true(is_isomorphic( G, empty_graph(i) )) - - G=complete_bipartite_graph(2,2) - assert_true(is_isomorphic( G, cycle_graph(4) )) - - G=complete_bipartite_graph(1,5) - assert_true(is_isomorphic( G, star_graph(5) )) - - G=complete_bipartite_graph(5,1) - assert_true(is_isomorphic( G, star_graph(5) )) - - # complete_bipartite_graph(m1,m2) is a connected graph with - # m1+m2 nodes and m1*m2 edges - for m1, m2 in [(5, 11), (7, 3)]: - G=complete_bipartite_graph(m1,m2) - assert_equal(number_of_nodes(G), m1 + m2) - assert_equal(number_of_edges(G), m1 * m2) - - assert_raises(networkx.exception.NetworkXError, - complete_bipartite_graph, 7, 3, create_using=DiGraph()) - - mG=complete_bipartite_graph(7, 3, create_using=MultiGraph()) - assert_equal(mG.edges(), G.edges()) - - def test_circular_ladder_graph(self): - G=circular_ladder_graph(5) - assert_raises(networkx.exception.NetworkXError, circular_ladder_graph, - 5, create_using=DiGraph()) - mG=circular_ladder_graph(5, create_using=MultiGraph()) - assert_equal(mG.edges(), G.edges()) - - def test_cycle_graph(self): - G=cycle_graph(4) - assert_equal(sorted(G.edges()), [(0, 1), (0, 3), (1, 2), (2, 3)]) - mG=cycle_graph(4, create_using=MultiGraph()) - assert_equal(sorted(mG.edges()), [(0, 1), (0, 3), (1, 2), (2, 3)]) - G=cycle_graph(4, create_using=DiGraph()) - assert_false(G.has_edge(2,1)) - assert_true(G.has_edge(1,2)) - - def test_dorogovtsev_goltsev_mendes_graph(self): - G=dorogovtsev_goltsev_mendes_graph(0) - assert_equal(G.edges(), [(0, 1)]) - assert_equal(G.nodes(), [0, 1]) - G=dorogovtsev_goltsev_mendes_graph(1) - assert_equal(G.edges(), [(0, 1), (0, 2), (1, 2)]) - assert_equal(average_clustering(G), 1.0) - assert_equal(list(triangles(G).values()), [1, 1, 1]) - G=dorogovtsev_goltsev_mendes_graph(10) - assert_equal(number_of_nodes(G), 29526) - assert_equal(number_of_edges(G), 59049) - assert_equal(G.degree(0), 1024) - assert_equal(G.degree(1), 1024) - assert_equal(G.degree(2), 1024) - - assert_raises(networkx.exception.NetworkXError, - dorogovtsev_goltsev_mendes_graph, 7, - create_using=DiGraph()) - assert_raises(networkx.exception.NetworkXError, - dorogovtsev_goltsev_mendes_graph, 7, - create_using=MultiGraph()) - - def test_empty_graph(self): - G=empty_graph() - assert_equal(number_of_nodes(G), 0) - G=empty_graph(42) - assert_equal(number_of_nodes(G), 42) - assert_equal(number_of_edges(G), 0) - assert_equal(G.name, 'empty_graph(42)') - - # create empty digraph - G=empty_graph(42,create_using=DiGraph(name="duh")) - assert_equal(number_of_nodes(G), 42) - assert_equal(number_of_edges(G), 0) - assert_equal(G.name, 'empty_graph(42)') - assert_true(isinstance(G,DiGraph)) - - # create empty multigraph - G=empty_graph(42,create_using=MultiGraph(name="duh")) - assert_equal(number_of_nodes(G), 42) - assert_equal(number_of_edges(G), 0) - assert_equal(G.name, 'empty_graph(42)') - assert_true(isinstance(G,MultiGraph)) - - # create empty graph from another - pete=petersen_graph() - G=empty_graph(42,create_using=pete) - assert_equal(number_of_nodes(G), 42) - assert_equal(number_of_edges(G), 0) - assert_equal(G.name, 'empty_graph(42)') - assert_true(isinstance(G,Graph)) - - def test_grid_2d_graph(self): - n=5;m=6 - G=grid_2d_graph(n,m) - assert_equal(number_of_nodes(G), n*m) - assert_equal(degree_histogram(G), [0,0,4,2*(n+m)-8,(n-2)*(m-2)]) - DG=grid_2d_graph(n,m, create_using=DiGraph()) - assert_equal(DG.succ, G.adj) - assert_equal(DG.pred, G.adj) - MG=grid_2d_graph(n,m, create_using=MultiGraph()) - assert_equal(MG.edges(), G.edges()) - - def test_grid_graph(self): - """grid_graph([n,m]) is a connected simple graph with the - following properties: - number_of_nodes=n*m - degree_histogram=[0,0,4,2*(n+m)-8,(n-2)*(m-2)] - """ - for n, m in [(3, 5), (5, 3), (4, 5), (5, 4)]: - dim=[n,m] - g=grid_graph(dim) - assert_equal(number_of_nodes(g), n*m) - assert_equal(degree_histogram(g), [0,0,4,2*(n+m)-8,(n-2)*(m-2)]) - assert_equal(dim,[n,m]) - - for n, m in [(1, 5), (5, 1)]: - dim=[n,m] - g=grid_graph(dim) - assert_equal(number_of_nodes(g), n*m) - assert_true(is_isomorphic(g,path_graph(5))) - assert_equal(dim,[n,m]) - -# mg=grid_graph([n,m], create_using=MultiGraph()) -# assert_equal(mg.edges(), g.edges()) - - def test_hypercube_graph(self): - for n, G in [(0, null_graph()), (1, path_graph(2)), - (2, cycle_graph(4)), (3, cubical_graph())]: - g=hypercube_graph(n) - assert_true(is_isomorphic(g, G)) - - g=hypercube_graph(4) - assert_equal(degree_histogram(g), [0, 0, 0, 0, 16]) - g=hypercube_graph(5) - assert_equal(degree_histogram(g), [0, 0, 0, 0, 0, 32]) - g=hypercube_graph(6) - assert_equal(degree_histogram(g), [0, 0, 0, 0, 0, 0, 64]) - -# mg=hypercube_graph(6, create_using=MultiGraph()) -# assert_equal(mg.edges(), g.edges()) - - def test_ladder_graph(self): - for i, G in [(0, empty_graph(0)), (1, path_graph(2)), - (2, hypercube_graph(2)), (10, grid_graph([2,10]))]: - assert_true(is_isomorphic(ladder_graph(i), G)) - - assert_raises(networkx.exception.NetworkXError, - ladder_graph, 2, create_using=DiGraph()) - - g = ladder_graph(2) - mg=ladder_graph(2, create_using=MultiGraph()) - assert_equal(mg.edges(), g.edges()) - - def test_lollipop_graph(self): - # number of nodes = m1 + m2 - # number of edges = number_of_edges(complete_graph(m1)) + m2 - for m1, m2 in [(3, 5), (4, 10), (3, 20)]: - b=lollipop_graph(m1,m2) - assert_equal(number_of_nodes(b), m1+m2) - assert_equal(number_of_edges(b), m1*(m1-1)/2 + m2) - assert_equal(b.name, - 'lollipop_graph(' + str(m1) + ',' + str(m2) + ')') - - # Raise NetworkXError if m<2 - assert_raises(networkx.exception.NetworkXError, - lollipop_graph, 1, 20) - - # Raise NetworkXError if n<0 - assert_raises(networkx.exception.NetworkXError, - lollipop_graph, 5, -2) - - # lollipop_graph(2,m) = path_graph(m+2) - for m1, m2 in [(2, 5), (2, 10), (2, 20)]: - b=lollipop_graph(m1,m2) - assert_true(is_isomorphic(b, path_graph(m2+2))) - - assert_raises(networkx.exception.NetworkXError, - lollipop_graph, m1, m2, create_using=DiGraph()) - - mb=lollipop_graph(m1, m2, create_using=MultiGraph()) - assert_true(mb.edges(), b.edges()) - - def test_null_graph(self): - assert_equal(number_of_nodes(null_graph()), 0) - - def test_path_graph(self): - p=path_graph(0) - assert_true(is_isomorphic(p, null_graph())) - assert_equal(p.name, 'path_graph(0)') - - p=path_graph(1) - assert_true(is_isomorphic( p, empty_graph(1))) - assert_equal(p.name, 'path_graph(1)') - - p=path_graph(10) - assert_true(is_connected(p)) - assert_equal(sorted(list(p.degree().values())), - [1, 1, 2, 2, 2, 2, 2, 2, 2, 2]) - assert_equal(p.order()-1, p.size()) - - dp=path_graph(3, create_using=DiGraph()) - assert_true(dp.has_edge(0,1)) - assert_false(dp.has_edge(1,0)) - - mp=path_graph(10, create_using=MultiGraph()) - assert_true(mp.edges()==p.edges()) - - def test_periodic_grid_2d_graph(self): - g=grid_2d_graph(0,0, periodic=True) - assert_equal(g.degree(), {}) - - for m, n, G in [(2, 2, cycle_graph(4)), (1, 7, cycle_graph(7)), - (7, 1, cycle_graph(7)), (2, 5, circular_ladder_graph(5)), - (5, 2, circular_ladder_graph(5)), (2, 4, cubical_graph()), - (4, 2, cubical_graph())]: - g=grid_2d_graph(m,n, periodic=True) - assert_true(is_isomorphic(g, G)) - - DG=grid_2d_graph(4, 2, periodic=True, create_using=DiGraph()) - assert_equal(DG.succ,g.adj) - assert_equal(DG.pred,g.adj) - MG=grid_2d_graph(4, 2, periodic=True, create_using=MultiGraph()) - assert_equal(MG.edges(),g.edges()) - - def test_star_graph(self): - assert_true(is_isomorphic(star_graph(0), empty_graph(1))) - assert_true(is_isomorphic(star_graph(1), path_graph(2))) - assert_true(is_isomorphic(star_graph(2), path_graph(3))) - - s=star_graph(10) - assert_equal(sorted(list(s.degree().values())), - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10]) - - assert_raises(networkx.exception.NetworkXError, - star_graph, 10, create_using=DiGraph()) - - ms=star_graph(10, create_using=MultiGraph()) - assert_true(ms.edges()==s.edges()) - - def test_trivial_graph(self): - assert_equal(number_of_nodes(trivial_graph()), 1) - - def test_wheel_graph(self): - for n, G in [(0, null_graph()), (1, empty_graph(1)), - (2, path_graph(2)), (3, complete_graph(3)), - (4, complete_graph(4))]: - g=wheel_graph(n) - assert_true(is_isomorphic( g, G)) - - assert_equal(g.name, 'wheel_graph(4)') - - g=wheel_graph(10) - assert_equal(sorted(list(g.degree().values())), - [3, 3, 3, 3, 3, 3, 3, 3, 3, 9]) - - assert_raises(networkx.exception.NetworkXError, - wheel_graph, 10, create_using=DiGraph()) - - mg=wheel_graph(10, create_using=MultiGraph()) - assert_equal(mg.edges(), g.edges()) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_degree_seq.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_degree_seq.py deleted file mode 100644 index 0d09855..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_degree_seq.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx -from networkx import * -from networkx.generators.degree_seq import * -from networkx.utils import uniform_sequence,powerlaw_sequence - -def test_configuration_model_empty(): - # empty graph has empty degree sequence - deg_seq=[] - G=configuration_model(deg_seq) - assert_equal(G.degree(), {}) - -def test_configuration_model(): - deg_seq=[5,3,3,3,3,2,2,2,1,1,1] - G=configuration_model(deg_seq,seed=12345678) - assert_equal(sorted(G.degree().values(),reverse=True), - [5, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1]) - assert_equal(sorted(G.degree(range(len(deg_seq))).values(), - reverse=True), - [5, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1]) - - # test that fixed seed delivers the same graph - deg_seq=[3,3,3,3,3,3,3,3,3,3,3,3] - G1=configuration_model(deg_seq,seed=1000) - G2=configuration_model(deg_seq,seed=1000) - assert_true(is_isomorphic(G1,G2)) - G1=configuration_model(deg_seq,seed=10) - G2=configuration_model(deg_seq,seed=10) - assert_true(is_isomorphic(G1,G2)) - -@raises(NetworkXError) -def test_configuation_raise(): - z=[5,3,3,3,3,2,2,2,1,1,1] - G = configuration_model(z, create_using=DiGraph()) - -@raises(NetworkXError) -def test_configuation_raise_odd(): - z=[5,3,3,3,3,2,2,2,1,1] - G = configuration_model(z, create_using=DiGraph()) - -@raises(NetworkXError) -def test_directed_configuation_raise_unequal(): - zin = [5,3,3,3,3,2,2,2,1,1] - zout = [5,3,3,3,3,2,2,2,1,2] - G = directed_configuration_model(zin, zout) - -def test_directed_configuation_mode(): - G = directed_configuration_model([],[],seed=0) - assert_equal(len(G),0) - - -def test_expected_degree_graph_empty(): - # empty graph has empty degree sequence - deg_seq=[] - G=expected_degree_graph(deg_seq) - assert_equal(G.degree(), {}) - - -def test_expected_degree_graph(): - # test that fixed seed delivers the same graph - deg_seq=[3,3,3,3,3,3,3,3,3,3,3,3] - G1=expected_degree_graph(deg_seq,seed=1000) - G2=expected_degree_graph(deg_seq,seed=1000) - assert_true(is_isomorphic(G1,G2)) - - G1=expected_degree_graph(deg_seq,seed=10) - G2=expected_degree_graph(deg_seq,seed=10) - assert_true(is_isomorphic(G1,G2)) - - -def test_expected_degree_graph_selfloops(): - deg_seq=[3,3,3,3,3,3,3,3,3,3,3,3] - G1=expected_degree_graph(deg_seq,seed=1000, selfloops=False) - G2=expected_degree_graph(deg_seq,seed=1000, selfloops=False) - assert_true(is_isomorphic(G1,G2)) - -def test_expected_degree_graph_skew(): - deg_seq=[10,2,2,2,2] - G1=expected_degree_graph(deg_seq,seed=1000) - G2=expected_degree_graph(deg_seq,seed=1000) - assert_true(is_isomorphic(G1,G2)) - - -def test_havel_hakimi_construction(): - G = havel_hakimi_graph([]) - assert_equal(len(G),0) - - z=[1000,3,3,3,3,2,2,2,1,1,1] - assert_raises(networkx.exception.NetworkXError, - havel_hakimi_graph, z) - z=["A",3,3,3,3,2,2,2,1,1,1] - assert_raises(networkx.exception.NetworkXError, - havel_hakimi_graph, z) - - z=[5,4,3,3,3,2,2,2] - G=havel_hakimi_graph(z) - G=configuration_model(z) - z=[6,5,4,4,2,1,1,1] - assert_raises(networkx.exception.NetworkXError, - havel_hakimi_graph, z) - - z=[10,3,3,3,3,2,2,2,2,2,2] - - G=havel_hakimi_graph(z) - - assert_raises(networkx.exception.NetworkXError, - havel_hakimi_graph, z, create_using=DiGraph()) - -def test_directed_havel_hakimi(): - # Test range of valid directed degree sequences - n, r = 100, 10 - p = 1.0 / r - for i in range(r): - G1 = nx.erdos_renyi_graph(n,p*(i+1),None,True) - din = list(G1.in_degree().values()) - dout = list(G1.out_degree().values()) - G2 = nx.directed_havel_hakimi_graph(din, dout) - assert_true(din == list(G2.in_degree().values())) - assert_true(dout == list(G2.out_degree().values())) - - # Test non-graphical sequence - dout = [1000,3,3,3,3,2,2,2,1,1,1] - din=[103,102,102,102,102,102,102,102,102,102] - assert_raises(nx.exception.NetworkXError, - nx.directed_havel_hakimi_graph, din, dout) - # Test valid sequences - dout=[1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - din=[2, 2, 2, 2, 2, 2, 2, 2, 0, 2] - G2 = nx.directed_havel_hakimi_graph(din, dout) - assert_true(din == list(G2.in_degree().values())) - assert_true(dout == list(G2.out_degree().values())) - # Test unequal sums - din=[2, 2, 2, 2, 2, 2, 2, 2, 2, 2] - assert_raises(nx.exception.NetworkXError, - nx.directed_havel_hakimi_graph, din, dout) - # Test for negative values - din=[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -2] - assert_raises(nx.exception.NetworkXError, - nx.directed_havel_hakimi_graph, din, dout) - -def test_degree_sequence_tree(): - z=[1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - G=degree_sequence_tree(z) - assert_true(len(G.nodes())==len(z)) - assert_true(len(G.edges())==sum(z)/2) - - assert_raises(networkx.exception.NetworkXError, - degree_sequence_tree, z, create_using=DiGraph()) - - z=[1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - assert_raises(networkx.exception.NetworkXError, - degree_sequence_tree, z) - -def test_random_degree_sequence_graph(): - d=[1,2,2,3] - G = nx.random_degree_sequence_graph(d) - assert_equal(d, list(G.degree().values())) - -def test_random_degree_sequence_graph_raise(): - z=[1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4] - assert_raises(networkx.exception.NetworkXUnfeasible, - random_degree_sequence_graph, z) - -def test_random_degree_sequence_large(): - G = nx.fast_gnp_random_graph(100,0.1) - d = G.degree().values() - G = nx.random_degree_sequence_graph(d, seed=0) - assert_equal(sorted(d), sorted(list(G.degree().values()))) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_directed.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_directed.py deleted file mode 100644 index 45b9ab1..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_directed.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python - -"""Generators - Directed Graphs ----------------------------- -""" - -from nose.tools import * -from networkx import * -from networkx.generators.directed import * - -class TestGeneratorsDirected(): - def test_smoke_test_random_graphs(self): - G=gn_graph(100) - G=gnr_graph(100,0.5) - G=gnc_graph(100) - G=scale_free_graph(100) - - def test_create_using_keyword_arguments(self): - assert_raises(networkx.exception.NetworkXError, - gn_graph, 100, create_using=Graph()) - assert_raises(networkx.exception.NetworkXError, - gnr_graph, 100, 0.5, create_using=Graph()) - assert_raises(networkx.exception.NetworkXError, - gnc_graph, 100, create_using=Graph()) - assert_raises(networkx.exception.NetworkXError, - scale_free_graph, 100, create_using=Graph()) - G=gn_graph(100,seed=1) - MG=gn_graph(100,create_using=MultiDiGraph(),seed=1) - assert_equal(G.edges(), MG.edges()) - G=gnr_graph(100,0.5,seed=1) - MG=gnr_graph(100,0.5,create_using=MultiDiGraph(),seed=1) - assert_equal(G.edges(), MG.edges()) - G=gnc_graph(100,seed=1) - MG=gnc_graph(100,create_using=MultiDiGraph(),seed=1) - assert_equal(G.edges(), MG.edges()) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_ego.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_ego.py deleted file mode 100644 index da15b60..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_ego.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -""" -ego graph ---------- -""" - -from nose.tools import assert_true, assert_equal -import networkx as nx - -class TestGeneratorEgo(): - def test_ego(self): - G=nx.star_graph(3) - H=nx.ego_graph(G,0) - assert_true(nx.is_isomorphic(G,H)) - G.add_edge(1,11) - G.add_edge(2,22) - G.add_edge(3,33) - H=nx.ego_graph(G,0) - assert_true(nx.is_isomorphic(nx.star_graph(3),H)) - G=nx.path_graph(3) - H=nx.ego_graph(G,0) - assert_equal(H.edges(), [(0, 1)]) - H=nx.ego_graph(G,0,undirected=True) - assert_equal(H.edges(), [(0, 1)]) - H=nx.ego_graph(G,0,center=False) - assert_equal(H.edges(), []) - - - def test_ego_distance(self): - G=nx.Graph() - G.add_edge(0,1,weight=2,distance=1) - G.add_edge(1,2,weight=2,distance=2) - G.add_edge(2,3,weight=2,distance=1) - assert_equal(sorted(nx.ego_graph(G,0,radius=3).nodes()),[0,1,2,3]) - eg=nx.ego_graph(G,0,radius=3,distance='weight') - assert_equal(sorted(eg.nodes()),[0,1]) - eg=nx.ego_graph(G,0,radius=3,distance='weight',undirected=True) - assert_equal(sorted(eg.nodes()),[0,1]) - eg=nx.ego_graph(G,0,radius=3,distance='distance') - assert_equal(sorted(eg.nodes()),[0,1,2]) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_geometric.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_geometric.py deleted file mode 100644 index 5e29e25..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_geometric.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestGeneratorsGeometric(): - def test_random_geometric_graph(self): - G=nx.random_geometric_graph(50,0.25) - assert_equal(len(G),50) - - def test_geographical_threshold_graph(self): - G=nx.geographical_threshold_graph(50,100) - assert_equal(len(G),50) - - def test_waxman_graph(self): - G=nx.waxman_graph(50,0.5,0.1) - assert_equal(len(G),50) - G=nx.waxman_graph(50,0.5,0.1,L=1) - assert_equal(len(G),50) - - def test_naviable_small_world(self): - G = nx.navigable_small_world_graph(5,p=1,q=0) - gg = nx.grid_2d_graph(5,5).to_directed() - assert_true(nx.is_isomorphic(G,gg)) - - G = nx.navigable_small_world_graph(5,p=1,q=0,dim=3) - gg = nx.grid_graph([5,5,5]).to_directed() - assert_true(nx.is_isomorphic(G,gg)) - - G = nx.navigable_small_world_graph(5,p=1,q=0,dim=1) - gg = nx.grid_graph([5]).to_directed() - assert_true(nx.is_isomorphic(G,gg)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_hybrid.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_hybrid.py deleted file mode 100644 index 88c7505..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_hybrid.py +++ /dev/null @@ -1,24 +0,0 @@ -from nose.tools import * -import networkx as nx - -def test_2d_grid_graph(): - # FC article claims 2d grid graph of size n is (3,3)-connected - # and (5,9)-connected, but I don't think it is (5,9)-connected - G=nx.grid_2d_graph(8,8,periodic=True) - assert_true(nx.is_kl_connected(G,3,3)) - assert_false(nx.is_kl_connected(G,5,9)) - (H,graphOK)=nx.kl_connected_subgraph(G,5,9,same_as_graph=True) - assert_false(graphOK) - -def test_small_graph(): - G=nx.Graph() - G.add_edge(1,2) - G.add_edge(1,3) - G.add_edge(2,3) - assert_true(nx.is_kl_connected(G,2,2)) - H=nx.kl_connected_subgraph(G,2,2) - (H,graphOK)=nx.kl_connected_subgraph(G,2,2, - low_memory=True, - same_as_graph=True) - assert_true(graphOK) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_intersection.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_intersection.py deleted file mode 100644 index 26bbcf6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_intersection.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx - -class TestIntersectionGraph(): - def test_random_intersection_graph(self): - G=nx.uniform_random_intersection_graph(10,5,0.5) - assert_equal(len(G),10) - - def test_k_random_intersection_graph(self): - G=nx.k_random_intersection_graph(10,5,2) - assert_equal(len(G),10) - - def test_general_random_intersection_graph(self): - G=nx.general_random_intersection_graph(10,5,[0.1,0.2,0.2,0.1,0.1]) - assert_equal(len(G),10) - assert_raises(ValueError, nx.general_random_intersection_graph,10,5, - [0.1,0.2,0.2,0.1]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_line.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_line.py deleted file mode 100644 index 35b71be..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_line.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python - -"""line graph ----------- -""" - -import networkx as nx -from nose.tools import * - - -class TestGeneratorLine(): - def test_line(self): - G=nx.star_graph(5) - L=nx.line_graph(G) - assert_true(nx.is_isomorphic(L,nx.complete_graph(5))) - G=nx.path_graph(5) - L=nx.line_graph(G) - assert_true(nx.is_isomorphic(L,nx.path_graph(4))) - G=nx.cycle_graph(5) - L=nx.line_graph(G) - assert_true(nx.is_isomorphic(L,G)) - G=nx.DiGraph() - G.add_edges_from([(0,1),(0,2),(0,3)]) - L=nx.line_graph(G) - assert_equal(L.adj, {}) - G=nx.DiGraph() - G.add_edges_from([(0,1),(1,2),(2,3)]) - L=nx.line_graph(G) - assert_equal(sorted(L.edges()), [((0, 1), (1, 2)), ((1, 2), (2, 3))]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_random_clustered.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_random_clustered.py deleted file mode 100644 index f052f2c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_random_clustered.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx - -class TestRandomClusteredGraph: - - def test_valid(self): - node=[1,1,1,2,1,2,0,0] - tri=[0,0,0,0,0,1,1,1] - joint_degree_sequence=zip(node,tri) - G = networkx.random_clustered_graph(joint_degree_sequence) - assert_equal(G.number_of_nodes(),8) - assert_equal(G.number_of_edges(),7) - - def test_valid2(self): - G = networkx.random_clustered_graph(\ - [(1,2),(2,1),(1,1),(1,1),(1,1),(2,0)]) - assert_equal(G.number_of_nodes(),6) - assert_equal(G.number_of_edges(),10) - - def test_invalid1(self): - assert_raises((TypeError,networkx.NetworkXError), - networkx.random_clustered_graph,[[1,1],[2,1],[0,1]]) - - def test_invalid2(self): - assert_raises((TypeError,networkx.NetworkXError), - networkx.random_clustered_graph,[[1,1],[1,2],[0,1]]) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_random_graphs.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_random_graphs.py deleted file mode 100644 index c49d74d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_random_graphs.py +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from networkx import * -from networkx.generators.random_graphs import * - -class TestGeneratorsRandom(): - def smoke_test_random_graph(self): - seed = 42 - G=gnp_random_graph(100,0.25,seed) - G=binomial_graph(100,0.25,seed) - G=erdos_renyi_graph(100,0.25,seed) - G=fast_gnp_random_graph(100,0.25,seed) - G=gnm_random_graph(100,20,seed) - G=dense_gnm_random_graph(100,20,seed) - - G=watts_strogatz_graph(10,2,0.25,seed) - assert_equal(len(G), 10) - assert_equal(G.number_of_edges(), 10) - - G=connected_watts_strogatz_graph(10,2,0.1,seed) - assert_equal(len(G), 10) - assert_equal(G.number_of_edges(), 10) - - G=watts_strogatz_graph(10,4,0.25,seed) - assert_equal(len(G), 10) - assert_equal(G.number_of_edges(), 20) - - G=newman_watts_strogatz_graph(10,2,0.0,seed) - assert_equal(len(G), 10) - assert_equal(G.number_of_edges(), 10) - - G=newman_watts_strogatz_graph(10,4,0.25,seed) - assert_equal(len(G), 10) - assert_true(G.number_of_edges() >= 20) - - G=barabasi_albert_graph(100,1,seed) - G=barabasi_albert_graph(100,3,seed) - assert_equal(G.number_of_edges(),(97*3)) - - G=powerlaw_cluster_graph(100,1,1.0,seed) - G=powerlaw_cluster_graph(100,3,0.0,seed) - assert_equal(G.number_of_edges(),(97*3)) - - G=random_regular_graph(10,20,seed) - - assert_raises(networkx.exception.NetworkXError, - random_regular_graph, 3, 21) - - constructor=[(10,20,0.8),(20,40,0.8)] - G=random_shell_graph(constructor,seed) - - G=nx.random_lobster(10,0.1,0.5,seed) - - def test_gnp(self): - G=gnp_random_graph(10,0.1) - assert_equal(len(G),10) - - G=gnp_random_graph(10,0.1,seed=42) - assert_equal(len(G),10) - - G=gnp_random_graph(10,1.1) - assert_equal(len(G),10) - assert_equal(len(G.edges()),45) - - G=gnp_random_graph(10,1.1,directed=True) - assert_equal(len(G),10) - assert_equal(len(G.edges()),90) - - G=gnp_random_graph(10,-1.1) - assert_equal(len(G),10) - assert_equal(len(G.edges()),0) - - G=binomial_graph(10,0.1) - assert_equal(len(G),10) - - G=erdos_renyi_graph(10,0.1) - assert_equal(len(G),10) - - - def test_fast_gnp(self): - G=fast_gnp_random_graph(10,0.1) - assert_equal(len(G),10) - - G=fast_gnp_random_graph(10,0.1,seed=42) - assert_equal(len(G),10) - - G=fast_gnp_random_graph(10,1.1) - assert_equal(len(G),10) - assert_equal(len(G.edges()),45) - - G=fast_gnp_random_graph(10,-1.1) - assert_equal(len(G),10) - assert_equal(len(G.edges()),0) - - G=fast_gnp_random_graph(10,0.1,directed=True) - assert_true(G.is_directed()) - assert_equal(len(G),10) - - - def test_gnm(self): - G=gnm_random_graph(10,3) - assert_equal(len(G),10) - assert_equal(len(G.edges()),3) - - G=gnm_random_graph(10,3,seed=42) - assert_equal(len(G),10) - assert_equal(len(G.edges()),3) - - G=gnm_random_graph(10,100) - assert_equal(len(G),10) - assert_equal(len(G.edges()),45) - - G=gnm_random_graph(10,100,directed=True) - assert_equal(len(G),10) - assert_equal(len(G.edges()),90) - - G=gnm_random_graph(10,-1.1) - assert_equal(len(G),10) - assert_equal(len(G.edges()),0) - - def test_watts_strogatz_big_k(self): - assert_raises(networkx.exception.NetworkXError, - watts_strogatz_graph, 10, 10, 0.25) - assert_raises(networkx.exception.NetworkXError, - newman_watts_strogatz_graph, 10, 10, 0.25) - # could create an infinite loop, now doesn't - # infinite loop used to occur when a node has degree n-1 and needs to rewire - watts_strogatz_graph(10, 9, 0.25, seed=0) - newman_watts_strogatz_graph(10, 9, 0.5, seed=0) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_small.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_small.py deleted file mode 100644 index 5228d3a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_small.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env python - -from nose.tools import * -from networkx import * -from networkx.algorithms.isomorphism.isomorph import graph_could_be_isomorphic -is_isomorphic=graph_could_be_isomorphic - -"""Generators - Small -===================== - -Some small graphs -""" - -null=null_graph() - -class TestGeneratorsSmall(): - def test_make_small_graph(self): - d=["adjacencylist","Bull Graph",5,[[2,3],[1,3,4],[1,2,5],[2],[3]]] - G=make_small_graph(d) - assert_true(is_isomorphic(G, bull_graph())) - - def test__LCF_graph(self): - # If n<=0, then return the null_graph - G=LCF_graph(-10,[1,2],100) - assert_true(is_isomorphic(G,null)) - G=LCF_graph(0,[1,2],3) - assert_true(is_isomorphic(G,null)) - G=LCF_graph(0,[1,2],10) - assert_true(is_isomorphic(G,null)) - - # Test that LCF(n,[],0) == cycle_graph(n) - for a, b, c in [(5, [], 0), (10, [], 0), (5, [], 1), (10, [], 10)]: - G=LCF_graph(a, b, c) - assert_true(is_isomorphic(G,cycle_graph(a))) - - # Generate the utility graph K_{3,3} - G=LCF_graph(6,[3,-3],3) - utility_graph=complete_bipartite_graph(3,3) - assert_true(is_isomorphic(G, utility_graph)) - - def test_properties_named_small_graphs(self): - G=bull_graph() - assert_equal(G.number_of_nodes(), 5) - assert_equal(G.number_of_edges(), 5) - assert_equal(sorted(G.degree().values()), [1, 1, 2, 3, 3]) - assert_equal(diameter(G), 3) - assert_equal(radius(G), 2) - - G=chvatal_graph() - assert_equal(G.number_of_nodes(), 12) - assert_equal(G.number_of_edges(), 24) - assert_equal(list(G.degree().values()), 12 * [4]) - assert_equal(diameter(G), 2) - assert_equal(radius(G), 2) - - G=cubical_graph() - assert_equal(G.number_of_nodes(), 8) - assert_equal(G.number_of_edges(), 12) - assert_equal(list(G.degree().values()), 8*[3]) - assert_equal(diameter(G), 3) - assert_equal(radius(G), 3) - - G=desargues_graph() - assert_equal(G.number_of_nodes(), 20) - assert_equal(G.number_of_edges(), 30) - assert_equal(list(G.degree().values()), 20*[3]) - - G=diamond_graph() - assert_equal(G.number_of_nodes(), 4) - assert_equal(sorted(G.degree().values()), [2, 2, 3, 3]) - assert_equal(diameter(G), 2) - assert_equal(radius(G), 1) - - G=dodecahedral_graph() - assert_equal(G.number_of_nodes(), 20) - assert_equal(G.number_of_edges(), 30) - assert_equal(list(G.degree().values()), 20*[3]) - assert_equal(diameter(G), 5) - assert_equal(radius(G), 5) - - G=frucht_graph() - assert_equal(G.number_of_nodes(), 12) - assert_equal(G.number_of_edges(), 18) - assert_equal(list(G.degree().values()), 12*[3]) - assert_equal(diameter(G), 4) - assert_equal(radius(G), 3) - - G=heawood_graph() - assert_equal(G.number_of_nodes(), 14) - assert_equal(G.number_of_edges(), 21) - assert_equal(list(G.degree().values()), 14*[3]) - assert_equal(diameter(G), 3) - assert_equal(radius(G), 3) - - G=house_graph() - assert_equal(G.number_of_nodes(), 5) - assert_equal(G.number_of_edges(), 6) - assert_equal(sorted(G.degree().values()), [2, 2, 2, 3, 3]) - assert_equal(diameter(G), 2) - assert_equal(radius(G), 2) - - G=house_x_graph() - assert_equal(G.number_of_nodes(), 5) - assert_equal(G.number_of_edges(), 8) - assert_equal(sorted(G.degree().values()), [2, 3, 3, 4, 4]) - assert_equal(diameter(G), 2) - assert_equal(radius(G), 1) - - G=icosahedral_graph() - assert_equal(G.number_of_nodes(), 12) - assert_equal(G.number_of_edges(), 30) - assert_equal(list(G.degree().values()), - [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]) - assert_equal(diameter(G), 3) - assert_equal(radius(G), 3) - - G=krackhardt_kite_graph() - assert_equal(G.number_of_nodes(), 10) - assert_equal(G.number_of_edges(), 18) - assert_equal(sorted(G.degree().values()), - [1, 2, 3, 3, 3, 4, 4, 5, 5, 6]) - - G=moebius_kantor_graph() - assert_equal(G.number_of_nodes(), 16) - assert_equal(G.number_of_edges(), 24) - assert_equal(list(G.degree().values()), 16*[3]) - assert_equal(diameter(G), 4) - - G=octahedral_graph() - assert_equal(G.number_of_nodes(), 6) - assert_equal(G.number_of_edges(), 12) - assert_equal(list(G.degree().values()), 6*[4]) - assert_equal(diameter(G), 2) - assert_equal(radius(G), 2) - - G=pappus_graph() - assert_equal(G.number_of_nodes(), 18) - assert_equal(G.number_of_edges(), 27) - assert_equal(list(G.degree().values()), 18*[3]) - assert_equal(diameter(G), 4) - - G=petersen_graph() - assert_equal(G.number_of_nodes(), 10) - assert_equal(G.number_of_edges(), 15) - assert_equal(list(G.degree().values()), 10*[3]) - assert_equal(diameter(G), 2) - assert_equal(radius(G), 2) - - G=sedgewick_maze_graph() - assert_equal(G.number_of_nodes(), 8) - assert_equal(G.number_of_edges(), 10) - assert_equal(sorted(G.degree().values()), [1, 2, 2, 2, 3, 3, 3, 4]) - - G=tetrahedral_graph() - assert_equal(G.number_of_nodes(), 4) - assert_equal(G.number_of_edges(), 6) - assert_equal(list(G.degree().values()), [3, 3, 3, 3]) - assert_equal(diameter(G), 1) - assert_equal(radius(G), 1) - - G=truncated_cube_graph() - assert_equal(G.number_of_nodes(), 24) - assert_equal(G.number_of_edges(), 36) - assert_equal(list(G.degree().values()), 24*[3]) - - G=truncated_tetrahedron_graph() - assert_equal(G.number_of_nodes(), 12) - assert_equal(G.number_of_edges(), 18) - assert_equal(list(G.degree().values()), 12*[3]) - - G=tutte_graph() - assert_equal(G.number_of_nodes(), 46) - assert_equal(G.number_of_edges(), 69) - assert_equal(list(G.degree().values()), 46*[3]) - - # Test create_using with directed or multigraphs on small graphs - assert_raises(networkx.exception.NetworkXError, tutte_graph, - create_using=DiGraph()) - MG=tutte_graph(create_using=MultiGraph()) - assert_equal(MG.edges(), G.edges()) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_stochastic.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_stochastic.py deleted file mode 100644 index 15c6fef..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_stochastic.py +++ /dev/null @@ -1,33 +0,0 @@ -from nose.tools import assert_true, assert_equal, raises -import networkx as nx - -def test_stochastic(): - G=nx.DiGraph() - G.add_edge(0,1) - G.add_edge(0,2) - S=nx.stochastic_graph(G) - assert_true(nx.is_isomorphic(G,S)) - assert_equal(sorted(S.edges(data=True)), - [(0, 1, {'weight': 0.5}), - (0, 2, {'weight': 0.5})]) - S=nx.stochastic_graph(G,copy=True) - assert_equal(sorted(S.edges(data=True)), - [(0, 1, {'weight': 0.5}), - (0, 2, {'weight': 0.5})]) - -def test_stochastic_ints(): - G=nx.DiGraph() - G.add_edge(0,1,weight=1) - G.add_edge(0,2,weight=1) - S=nx.stochastic_graph(G) - assert_equal(sorted(S.edges(data=True)), - [(0, 1, {'weight': 0.5}), - (0, 2, {'weight': 0.5})]) - -@raises(nx.NetworkXError) -def test_stochastic_graph_input(): - S = nx.stochastic_graph(nx.Graph()) - -@raises(nx.NetworkXError) -def test_stochastic_multigraph_input(): - S = nx.stochastic_graph(nx.MultiGraph()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_threshold.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_threshold.py deleted file mode 100644 index 198d7cc..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/tests/test_threshold.py +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env python - -"""Threshold Graphs -================ -""" - -from nose.tools import * -from nose import SkipTest -from nose.plugins.attrib import attr -import networkx as nx -import networkx.generators.threshold as nxt -from networkx.algorithms.isomorphism.isomorph import graph_could_be_isomorphic - -cnlti = nx.convert_node_labels_to_integers - - -class TestGeneratorThreshold(): - def test_threshold_sequence_graph_test(self): - G=nx.star_graph(10) - assert_true(nxt.is_threshold_graph(G)) - assert_true(nxt.is_threshold_sequence(list(G.degree().values()))) - - G=nx.complete_graph(10) - assert_true(nxt.is_threshold_graph(G)) - assert_true(nxt.is_threshold_sequence(list(G.degree().values()))) - - deg=[3,2,2,1,1,1] - assert_false(nxt.is_threshold_sequence(deg)) - - deg=[3,2,2,1] - assert_true(nxt.is_threshold_sequence(deg)) - - G=nx.generators.havel_hakimi_graph(deg) - assert_true(nxt.is_threshold_graph(G)) - - def test_creation_sequences(self): - deg=[3,2,2,1] - G=nx.generators.havel_hakimi_graph(deg) - cs0=nxt.creation_sequence(deg) - H0=nxt.threshold_graph(cs0) - assert_equal(''.join(cs0), 'ddid') - - cs1=nxt.creation_sequence(deg, with_labels=True) - H1=nxt.threshold_graph(cs1) - assert_equal(cs1, [(1, 'd'), (2, 'd'), (3, 'i'), (0, 'd')]) - - cs2=nxt.creation_sequence(deg, compact=True) - H2=nxt.threshold_graph(cs2) - assert_equal(cs2, [2, 1, 1]) - assert_equal(''.join(nxt.uncompact(cs2)), 'ddid') - assert_true(graph_could_be_isomorphic(H0,G)) - assert_true(graph_could_be_isomorphic(H0,H1)) - assert_true(graph_could_be_isomorphic(H0,H2)) - - def test_shortest_path(self): - deg=[3,2,2,1] - G=nx.generators.havel_hakimi_graph(deg) - cs1=nxt.creation_sequence(deg, with_labels=True) - for n, m in [(3, 0), (0, 3), (0, 2), (0, 1), (1, 3), - (3, 1), (1, 2), (2, 3)]: - assert_equal(nxt.shortest_path(cs1,n,m), - nx.shortest_path(G, n, m)) - - spl=nxt.shortest_path_length(cs1,3) - spl2=nxt.shortest_path_length([ t for v,t in cs1],2) - assert_equal(spl, spl2) - - spld={} - for j,pl in enumerate(spl): - n=cs1[j][0] - spld[n]=pl - assert_equal(spld, nx.single_source_shortest_path_length(G, 3)) - - def test_weights_thresholds(self): - wseq=[3,4,3,3,5,6,5,4,5,6] - cs=nxt.weights_to_creation_sequence(wseq,threshold=10) - wseq=nxt.creation_sequence_to_weights(cs) - cs2=nxt.weights_to_creation_sequence(wseq) - assert_equal(cs, cs2) - - wseq=nxt.creation_sequence_to_weights(nxt.uncompact([3,1,2,3,3,2,3])) - assert_equal(wseq, - [s*0.125 for s in [4,4,4,3,5,5,2,2,2,6,6,6,1,1,7,7,7]]) - - wseq=nxt.creation_sequence_to_weights([3,1,2,3,3,2,3]) - assert_equal(wseq, - [s*0.125 for s in [4,4,4,3,5,5,2,2,2,6,6,6,1,1,7,7,7]]) - - wseq=nxt.creation_sequence_to_weights(list(enumerate('ddidiiidididi'))) - assert_equal(wseq, - [s*0.1 for s in [5,5,4,6,3,3,3,7,2,8,1,9,0]]) - - wseq=nxt.creation_sequence_to_weights('ddidiiidididi') - assert_equal(wseq, - [s*0.1 for s in [5,5,4,6,3,3,3,7,2,8,1,9,0]]) - - wseq=nxt.creation_sequence_to_weights('ddidiiidididid') - ws=[s/float(12) for s in [6,6,5,7,4,4,4,8,3,9,2,10,1,11]] - assert_true(sum([abs(c-d) for c,d in zip(wseq,ws)]) < 1e-14) - - def test_finding_routines(self): - G=nx.Graph({1:[2],2:[3],3:[4],4:[5],5:[6]}) - G.add_edge(2,4) - G.add_edge(2,5) - G.add_edge(2,7) - G.add_edge(3,6) - G.add_edge(4,6) - - # Alternating 4 cycle - assert_equal(nxt.find_alternating_4_cycle(G), [1, 2, 3, 6]) - - # Threshold graph - TG=nxt.find_threshold_graph(G) - assert_true(nxt.is_threshold_graph(TG)) - assert_equal(sorted(TG.nodes()), [1, 2, 3, 4, 5, 7]) - - cs=nxt.creation_sequence(TG.degree(),with_labels=True) - assert_equal(nxt.find_creation_sequence(G), cs) - - def test_fast_versions_properties_threshold_graphs(self): - cs='ddiiddid' - G=nxt.threshold_graph(cs) - assert_equal(nxt.density('ddiiddid'), nx.density(G)) - assert_equal(sorted(nxt.degree_sequence(cs)), - sorted(G.degree().values())) - - ts=nxt.triangle_sequence(cs) - assert_equal(ts, list(nx.triangles(G).values())) - assert_equal(sum(ts) // 3, nxt.triangles(cs)) - - c1=nxt.cluster_sequence(cs) - c2=list(nx.clustering(G).values()) - assert_almost_equal(sum([abs(c-d) for c,d in zip(c1,c2)]), 0) - - b1=nx.betweenness_centrality(G).values() - b2=nxt.betweenness_sequence(cs) - assert_true(sum([abs(c-d) for c,d in zip(b1,b2)]) < 1e-14) - - assert_equal(nxt.eigenvalues(cs), [0, 1, 3, 3, 5, 7, 7, 8]) - - # Degree Correlation - assert_true(abs(nxt.degree_correlation(cs)+0.593038821954) < 1e-12) - assert_equal(nxt.degree_correlation('diiiddi'), -0.8) - assert_equal(nxt.degree_correlation('did'), -1.0) - assert_equal(nxt.degree_correlation('ddd'), 1.0) - assert_equal(nxt.eigenvalues('dddiii'), [0, 0, 0, 0, 3, 3]) - assert_equal(nxt.eigenvalues('dddiiid'), [0, 1, 1, 1, 4, 4, 7]) - - def test_tg_creation_routines(self): - s=nxt.left_d_threshold_sequence(5,7) - s=nxt.right_d_threshold_sequence(5,7) - s1=nxt.swap_d(s,1.0,1.0) - - - @attr('numpy') - def test_eigenvectors(self): - try: - import numpy as N - eigenval=N.linalg.eigvals - except ImportError: - raise SkipTest('NumPy not available.') - - cs='ddiiddid' - G=nxt.threshold_graph(cs) - (tgeval,tgevec)=nxt.eigenvectors(cs) - dot=N.dot - assert_equal([ abs(dot(lv,lv)-1.0)<1e-9 for lv in tgevec ], [True]*8) - lapl=nx.laplacian_matrix(G) -# tgev=[ dot(lv,dot(lapl,lv)) for lv in tgevec ] -# assert_true(sum([abs(c-d) for c,d in zip(tgev,tgeval)]) < 1e-9) -# tgev.sort() -# lev=list(eigenval(lapl)) -# lev.sort() -# assert_true(sum([abs(c-d) for c,d in zip(tgev,lev)]) < 1e-9) - - def test_create_using(self): - cs='ddiiddid' - G=nxt.threshold_graph(cs) - assert_raises(nx.exception.NetworkXError, - nxt.threshold_graph, cs, create_using=nx.DiGraph()) - MG=nxt.threshold_graph(cs,create_using=nx.MultiGraph()) - assert_equal(MG.edges(), G.edges()) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/generators/threshold.py b/lib/python2.7/site-packages/setoolsgui/networkx/generators/threshold.py deleted file mode 100644 index 68a565e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/generators/threshold.py +++ /dev/null @@ -1,906 +0,0 @@ -""" -Threshold Graphs - Creation, manipulation and identification. -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)\nDan Schult (dschult@colgate.edu)""" -# Copyright (C) 2004-2008 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# - -__all__=[] - -import random # for swap_d -from math import sqrt -import networkx - -def is_threshold_graph(G): - """ - Returns True if G is a threshold graph. - """ - return is_threshold_sequence(list(G.degree().values())) - -def is_threshold_sequence(degree_sequence): - """ - Returns True if the sequence is a threshold degree seqeunce. - - Uses the property that a threshold graph must be constructed by - adding either dominating or isolated nodes. Thus, it can be - deconstructed iteratively by removing a node of degree zero or a - node that connects to the remaining nodes. If this deconstruction - failes then the sequence is not a threshold sequence. - """ - ds=degree_sequence[:] # get a copy so we don't destroy original - ds.sort() - while ds: - if ds[0]==0: # if isolated node - ds.pop(0) # remove it - continue - if ds[-1]!=len(ds)-1: # is the largest degree node dominating? - return False # no, not a threshold degree sequence - ds.pop() # yes, largest is the dominating node - ds=[ d-1 for d in ds ] # remove it and decrement all degrees - return True - - -def creation_sequence(degree_sequence,with_labels=False,compact=False): - """ - Determines the creation sequence for the given threshold degree sequence. - - The creation sequence is a list of single characters 'd' - or 'i': 'd' for dominating or 'i' for isolated vertices. - Dominating vertices are connected to all vertices present when it - is added. The first node added is by convention 'd'. - This list can be converted to a string if desired using "".join(cs) - - If with_labels==True: - Returns a list of 2-tuples containing the vertex number - and a character 'd' or 'i' which describes the type of vertex. - - If compact==True: - Returns the creation sequence in a compact form that is the number - of 'i's and 'd's alternating. - Examples: - [1,2,2,3] represents d,i,i,d,d,i,i,i - [3,1,2] represents d,d,d,i,d,d - - Notice that the first number is the first vertex to be used for - construction and so is always 'd'. - - with_labels and compact cannot both be True. - - Returns None if the sequence is not a threshold sequence - """ - if with_labels and compact: - raise ValueError("compact sequences cannot be labeled") - - # make an indexed copy - if isinstance(degree_sequence,dict): # labeled degree seqeunce - ds = [ [degree,label] for (label,degree) in degree_sequence.items() ] - else: - ds=[ [d,i] for i,d in enumerate(degree_sequence) ] - ds.sort() - cs=[] # creation sequence - while ds: - if ds[0][0]==0: # isolated node - (d,v)=ds.pop(0) - if len(ds)>0: # make sure we start with a d - cs.insert(0,(v,'i')) - else: - cs.insert(0,(v,'d')) - continue - if ds[-1][0]!=len(ds)-1: # Not dominating node - return None # not a threshold degree sequence - (d,v)=ds.pop() - cs.insert(0,(v,'d')) - ds=[ [d[0]-1,d[1]] for d in ds ] # decrement due to removing node - - if with_labels: return cs - if compact: return make_compact(cs) - return [ v[1] for v in cs ] # not labeled - -def make_compact(creation_sequence): - """ - Returns the creation sequence in a compact form - that is the number of 'i's and 'd's alternating. - Examples: - [1,2,2,3] represents d,i,i,d,d,i,i,i. - [3,1,2] represents d,d,d,i,d,d. - Notice that the first number is the first vertex - to be used for construction and so is always 'd'. - - Labeled creation sequences lose their labels in the - compact representation. - """ - first=creation_sequence[0] - if isinstance(first,str): # creation sequence - cs = creation_sequence[:] - elif isinstance(first,tuple): # labeled creation sequence - cs = [ s[1] for s in creation_sequence ] - elif isinstance(first,int): # compact creation sequence - return creation_sequence - else: - raise TypeError("Not a valid creation sequence type") - - ccs=[] - count=1 # count the run lengths of d's or i's. - for i in range(1,len(cs)): - if cs[i]==cs[i-1]: - count+=1 - else: - ccs.append(count) - count=1 - ccs.append(count) # don't forget the last one - return ccs - -def uncompact(creation_sequence): - """ - Converts a compact creation sequence for a threshold - graph to a standard creation sequence (unlabeled). - If the creation_sequence is already standard, return it. - See creation_sequence. - """ - first=creation_sequence[0] - if isinstance(first,str): # creation sequence - return creation_sequence - elif isinstance(first,tuple): # labeled creation sequence - return creation_sequence - elif isinstance(first,int): # compact creation sequence - ccscopy=creation_sequence[:] - else: - raise TypeError("Not a valid creation sequence type") - cs = [] - while ccscopy: - cs.extend(ccscopy.pop(0)*['d']) - if ccscopy: - cs.extend(ccscopy.pop(0)*['i']) - return cs - -def creation_sequence_to_weights(creation_sequence): - """ - Returns a list of node weights which create the threshold - graph designated by the creation sequence. The weights - are scaled so that the threshold is 1.0. The order of the - nodes is the same as that in the creation sequence. - """ - # Turn input sequence into a labeled creation sequence - first=creation_sequence[0] - if isinstance(first,str): # creation sequence - if isinstance(creation_sequence,list): - wseq = creation_sequence[:] - else: - wseq = list(creation_sequence) # string like 'ddidid' - elif isinstance(first,tuple): # labeled creation sequence - wseq = [ v[1] for v in creation_sequence] - elif isinstance(first,int): # compact creation sequence - wseq = uncompact(creation_sequence) - else: - raise TypeError("Not a valid creation sequence type") - # pass through twice--first backwards - wseq.reverse() - w=0 - prev='i' - for j,s in enumerate(wseq): - if s=='i': - wseq[j]=w - prev=s - elif prev=='i': - prev=s - w+=1 - wseq.reverse() # now pass through forwards - for j,s in enumerate(wseq): - if s=='d': - wseq[j]=w - prev=s - elif prev=='d': - prev=s - w+=1 - # Now scale weights - if prev=='d': w+=1 - wscale=1./float(w) - return [ ww*wscale for ww in wseq] - #return wseq - -def weights_to_creation_sequence(weights,threshold=1,with_labels=False,compact=False): - """ - Returns a creation sequence for a threshold graph - determined by the weights and threshold given as input. - If the sum of two node weights is greater than the - threshold value, an edge is created between these nodes. - - The creation sequence is a list of single characters 'd' - or 'i': 'd' for dominating or 'i' for isolated vertices. - Dominating vertices are connected to all vertices present - when it is added. The first node added is by convention 'd'. - - If with_labels==True: - Returns a list of 2-tuples containing the vertex number - and a character 'd' or 'i' which describes the type of vertex. - - If compact==True: - Returns the creation sequence in a compact form that is the number - of 'i's and 'd's alternating. - Examples: - [1,2,2,3] represents d,i,i,d,d,i,i,i - [3,1,2] represents d,d,d,i,d,d - - Notice that the first number is the first vertex to be used for - construction and so is always 'd'. - - with_labels and compact cannot both be True. - """ - if with_labels and compact: - raise ValueError("compact sequences cannot be labeled") - - # make an indexed copy - if isinstance(weights,dict): # labeled weights - wseq = [ [w,label] for (label,w) in weights.items() ] - else: - wseq = [ [w,i] for i,w in enumerate(weights) ] - wseq.sort() - cs=[] # creation sequence - cutoff=threshold-wseq[-1][0] - while wseq: - if wseq[0][0]<cutoff: # isolated node - (w,label)=wseq.pop(0) - cs.append((label,'i')) - else: - (w,label)=wseq.pop() - cs.append((label,'d')) - cutoff=threshold-wseq[-1][0] - if len(wseq)==1: # make sure we start with a d - (w,label)=wseq.pop() - cs.append((label,'d')) - # put in correct order - cs.reverse() - - if with_labels: return cs - if compact: return make_compact(cs) - return [ v[1] for v in cs ] # not labeled - - -# Manipulating NetworkX.Graphs in context of threshold graphs -def threshold_graph(creation_sequence, create_using=None): - """ - Create a threshold graph from the creation sequence or compact - creation_sequence. - - The input sequence can be a - - creation sequence (e.g. ['d','i','d','d','d','i']) - labeled creation sequence (e.g. [(0,'d'),(2,'d'),(1,'i')]) - compact creation sequence (e.g. [2,1,1,2,0]) - - Use cs=creation_sequence(degree_sequence,labeled=True) - to convert a degree sequence to a creation sequence. - - Returns None if the sequence is not valid - """ - # Turn input sequence into a labeled creation sequence - first=creation_sequence[0] - if isinstance(first,str): # creation sequence - ci = list(enumerate(creation_sequence)) - elif isinstance(first,tuple): # labeled creation sequence - ci = creation_sequence[:] - elif isinstance(first,int): # compact creation sequence - cs = uncompact(creation_sequence) - ci = list(enumerate(cs)) - else: - print("not a valid creation sequence type") - return None - - if create_using is None: - G = networkx.Graph() - elif create_using.is_directed(): - raise networkx.NetworkXError("Directed Graph not supported") - else: - G = create_using - G.clear() - - G.name="Threshold Graph" - - # add nodes and edges - # if type is 'i' just add nodea - # if type is a d connect to everything previous - while ci: - (v,node_type)=ci.pop(0) - if node_type=='d': # dominating type, connect to all existing nodes - for u in G.nodes(): - G.add_edge(v,u) - G.add_node(v) - return G - - - -def find_alternating_4_cycle(G): - """ - Returns False if there aren't any alternating 4 cycles. - Otherwise returns the cycle as [a,b,c,d] where (a,b) - and (c,d) are edges and (a,c) and (b,d) are not. - """ - for (u,v) in G.edges(): - for w in G.nodes(): - if not G.has_edge(u,w) and u!=w: - for x in G.neighbors(w): - if not G.has_edge(v,x) and v!=x: - return [u,v,w,x] - return False - - - -def find_threshold_graph(G, create_using=None): - """ - Return a threshold subgraph that is close to largest in G. - The threshold graph will contain the largest degree node in G. - - """ - return threshold_graph(find_creation_sequence(G),create_using) - - -def find_creation_sequence(G): - """ - Find a threshold subgraph that is close to largest in G. - Returns the labeled creation sequence of that threshold graph. - """ - cs=[] - # get a local pointer to the working part of the graph - H=G - while H.order()>0: - # get new degree sequence on subgraph - dsdict=H.degree() - ds=[ [d,v] for v,d in dsdict.items() ] - ds.sort() - # Update threshold graph nodes - if ds[-1][0]==0: # all are isolated - cs.extend( zip( dsdict, ['i']*(len(ds)-1)+['d']) ) - break # Done! - # pull off isolated nodes - while ds[0][0]==0: - (d,iso)=ds.pop(0) - cs.append((iso,'i')) - # find new biggest node - (d,bigv)=ds.pop() - # add edges of star to t_g - cs.append((bigv,'d')) - # form subgraph of neighbors of big node - H=H.subgraph(H.neighbors(bigv)) - cs.reverse() - return cs - - - -### Properties of Threshold Graphs -def triangles(creation_sequence): - """ - Compute number of triangles in the threshold graph with the - given creation sequence. - """ - # shortcut algoritm that doesn't require computing number - # of triangles at each node. - cs=creation_sequence # alias - dr=cs.count("d") # number of d's in sequence - ntri=dr*(dr-1)*(dr-2)/6 # number of triangles in clique of nd d's - # now add dr choose 2 triangles for every 'i' in sequence where - # dr is the number of d's to the right of the current i - for i,typ in enumerate(cs): - if typ=="i": - ntri+=dr*(dr-1)/2 - else: - dr-=1 - return ntri - - -def triangle_sequence(creation_sequence): - """ - Return triangle sequence for the given threshold graph creation sequence. - - """ - cs=creation_sequence - seq=[] - dr=cs.count("d") # number of d's to the right of the current pos - dcur=(dr-1)*(dr-2) // 2 # number of triangles through a node of clique dr - irun=0 # number of i's in the last run - drun=0 # number of d's in the last run - for i,sym in enumerate(cs): - if sym=="d": - drun+=1 - tri=dcur+(dr-1)*irun # new triangles at this d - else: # cs[i]="i": - if prevsym=="d": # new string of i's - dcur+=(dr-1)*irun # accumulate shared shortest paths - irun=0 # reset i run counter - dr-=drun # reduce number of d's to right - drun=0 # reset d run counter - irun+=1 - tri=dr*(dr-1) // 2 # new triangles at this i - seq.append(tri) - prevsym=sym - return seq - -def cluster_sequence(creation_sequence): - """ - Return cluster sequence for the given threshold graph creation sequence. - """ - triseq=triangle_sequence(creation_sequence) - degseq=degree_sequence(creation_sequence) - cseq=[] - for i,deg in enumerate(degseq): - tri=triseq[i] - if deg <= 1: # isolated vertex or single pair gets cc 0 - cseq.append(0) - continue - max_size=(deg*(deg-1)) // 2 - cseq.append(float(tri)/float(max_size)) - return cseq - - -def degree_sequence(creation_sequence): - """ - Return degree sequence for the threshold graph with the given - creation sequence - """ - cs=creation_sequence # alias - seq=[] - rd=cs.count("d") # number of d to the right - for i,sym in enumerate(cs): - if sym=="d": - rd-=1 - seq.append(rd+i) - else: - seq.append(rd) - return seq - -def density(creation_sequence): - """ - Return the density of the graph with this creation_sequence. - The density is the fraction of possible edges present. - """ - N=len(creation_sequence) - two_size=sum(degree_sequence(creation_sequence)) - two_possible=N*(N-1) - den=two_size/float(two_possible) - return den - -def degree_correlation(creation_sequence): - """ - Return the degree-degree correlation over all edges. - """ - cs=creation_sequence - s1=0 # deg_i*deg_j - s2=0 # deg_i^2+deg_j^2 - s3=0 # deg_i+deg_j - m=0 # number of edges - rd=cs.count("d") # number of d nodes to the right - rdi=[ i for i,sym in enumerate(cs) if sym=="d"] # index of "d"s - ds=degree_sequence(cs) - for i,sym in enumerate(cs): - if sym=="d": - if i!=rdi[0]: - print("Logic error in degree_correlation",i,rdi) - raise ValueError - rdi.pop(0) - degi=ds[i] - for dj in rdi: - degj=ds[dj] - s1+=degj*degi - s2+=degi**2+degj**2 - s3+=degi+degj - m+=1 - denom=(2*m*s2-s3*s3) - numer=(4*m*s1-s3*s3) - if denom==0: - if numer==0: - return 1 - raise ValueError("Zero Denominator but Numerator is %s"%numer) - return numer/float(denom) - - -def shortest_path(creation_sequence,u,v): - """ - Find the shortest path between u and v in a - threshold graph G with the given creation_sequence. - - For an unlabeled creation_sequence, the vertices - u and v must be integers in (0,len(sequence)) refering - to the position of the desired vertices in the sequence. - - For a labeled creation_sequence, u and v are labels of veritices. - - Use cs=creation_sequence(degree_sequence,with_labels=True) - to convert a degree sequence to a creation sequence. - - Returns a list of vertices from u to v. - Example: if they are neighbors, it returns [u,v] - """ - # Turn input sequence into a labeled creation sequence - first=creation_sequence[0] - if isinstance(first,str): # creation sequence - cs = [(i,creation_sequence[i]) for i in range(len(creation_sequence))] - elif isinstance(first,tuple): # labeled creation sequence - cs = creation_sequence[:] - elif isinstance(first,int): # compact creation sequence - ci = uncompact(creation_sequence) - cs = [(i,ci[i]) for i in range(len(ci))] - else: - raise TypeError("Not a valid creation sequence type") - - verts=[ s[0] for s in cs ] - if v not in verts: - raise ValueError("Vertex %s not in graph from creation_sequence"%v) - if u not in verts: - raise ValueError("Vertex %s not in graph from creation_sequence"%u) - # Done checking - if u==v: return [u] - - uindex=verts.index(u) - vindex=verts.index(v) - bigind=max(uindex,vindex) - if cs[bigind][1]=='d': - return [u,v] - # must be that cs[bigind][1]=='i' - cs=cs[bigind:] - while cs: - vert=cs.pop() - if vert[1]=='d': - return [u,vert[0],v] - # All after u are type 'i' so no connection - return -1 - -def shortest_path_length(creation_sequence,i): - """ - Return the shortest path length from indicated node to - every other node for the threshold graph with the given - creation sequence. - Node is indicated by index i in creation_sequence unless - creation_sequence is labeled in which case, i is taken to - be the label of the node. - - Paths lengths in threshold graphs are at most 2. - Length to unreachable nodes is set to -1. - """ - # Turn input sequence into a labeled creation sequence - first=creation_sequence[0] - if isinstance(first,str): # creation sequence - if isinstance(creation_sequence,list): - cs = creation_sequence[:] - else: - cs = list(creation_sequence) - elif isinstance(first,tuple): # labeled creation sequence - cs = [ v[1] for v in creation_sequence] - i = [v[0] for v in creation_sequence].index(i) - elif isinstance(first,int): # compact creation sequence - cs = uncompact(creation_sequence) - else: - raise TypeError("Not a valid creation sequence type") - - # Compute - N=len(cs) - spl=[2]*N # length 2 to every node - spl[i]=0 # except self which is 0 - # 1 for all d's to the right - for j in range(i+1,N): - if cs[j]=="d": - spl[j]=1 - if cs[i]=='d': # 1 for all nodes to the left - for j in range(i): - spl[j]=1 - # and -1 for any trailing i to indicate unreachable - for j in range(N-1,0,-1): - if cs[j]=="d": - break - spl[j]=-1 - return spl - - -def betweenness_sequence(creation_sequence,normalized=True): - """ - Return betweenness for the threshold graph with the given creation - sequence. The result is unscaled. To scale the values - to the iterval [0,1] divide by (n-1)*(n-2). - """ - cs=creation_sequence - seq=[] # betweenness - lastchar='d' # first node is always a 'd' - dr=float(cs.count("d")) # number of d's to the right of curren pos - irun=0 # number of i's in the last run - drun=0 # number of d's in the last run - dlast=0.0 # betweenness of last d - for i,c in enumerate(cs): - if c=='d': #cs[i]=="d": - # betweennees = amt shared with eariler d's and i's - # + new isolated nodes covered - # + new paths to all previous nodes - b=dlast + (irun-1)*irun/dr + 2*irun*(i-drun-irun)/dr - drun+=1 # update counter - else: # cs[i]="i": - if lastchar=='d': # if this is a new run of i's - dlast=b # accumulate betweenness - dr-=drun # update number of d's to the right - drun=0 # reset d counter - irun=0 # reset i counter - b=0 # isolated nodes have zero betweenness - irun+=1 # add another i to the run - seq.append(float(b)) - lastchar=c - - # normalize by the number of possible shortest paths - if normalized: - order=len(cs) - scale=1.0/((order-1)*(order-2)) - seq=[ s*scale for s in seq ] - - return seq - - -def eigenvectors(creation_sequence): - """ - Return a 2-tuple of Laplacian eigenvalues and eigenvectors - for the threshold network with creation_sequence. - The first value is a list of eigenvalues. - The second value is a list of eigenvectors. - The lists are in the same order so corresponding eigenvectors - and eigenvalues are in the same position in the two lists. - - Notice that the order of the eigenvalues returned by eigenvalues(cs) - may not correspond to the order of these eigenvectors. - """ - ccs=make_compact(creation_sequence) - N=sum(ccs) - vec=[0]*N - val=vec[:] - # get number of type d nodes to the right (all for first node) - dr=sum(ccs[::2]) - - nn=ccs[0] - vec[0]=[1./sqrt(N)]*N - val[0]=0 - e=dr - dr-=nn - type_d=True - i=1 - dd=1 - while dd<nn: - scale=1./sqrt(dd*dd+i) - vec[i]=i*[-scale]+[dd*scale]+[0]*(N-i-1) - val[i]=e - i+=1 - dd+=1 - if len(ccs)==1: return (val,vec) - for nn in ccs[1:]: - scale=1./sqrt(nn*i*(i+nn)) - vec[i]=i*[-nn*scale]+nn*[i*scale]+[0]*(N-i-nn) - # find eigenvalue - type_d=not type_d - if type_d: - e=i+dr - dr-=nn - else: - e=dr - val[i]=e - st=i - i+=1 - dd=1 - while dd<nn: - scale=1./sqrt(i-st+dd*dd) - vec[i]=[0]*st+(i-st)*[-scale]+[dd*scale]+[0]*(N-i-1) - val[i]=e - i+=1 - dd+=1 - return (val,vec) - -def spectral_projection(u,eigenpairs): - """ - Returns the coefficients of each eigenvector - in a projection of the vector u onto the normalized - eigenvectors which are contained in eigenpairs. - - eigenpairs should be a list of two objects. The - first is a list of eigenvalues and the second a list - of eigenvectors. The eigenvectors should be lists. - - There's not a lot of error checking on lengths of - arrays, etc. so be careful. - """ - coeff=[] - evect=eigenpairs[1] - for ev in evect: - c=sum([ evv*uv for (evv,uv) in zip(ev,u)]) - coeff.append(c) - return coeff - - - -def eigenvalues(creation_sequence): - """ - Return sequence of eigenvalues of the Laplacian of the threshold - graph for the given creation_sequence. - - Based on the Ferrer's diagram method. The spectrum is integral - and is the conjugate of the degree sequence. - - See:: - - @Article{degree-merris-1994, - author = {Russel Merris}, - title = {Degree maximal graphs are Laplacian integral}, - journal = {Linear Algebra Appl.}, - year = {1994}, - volume = {199}, - pages = {381--389}, - } - - """ - degseq=degree_sequence(creation_sequence) - degseq.sort() - eiglist=[] # zero is always one eigenvalue - eig=0 - row=len(degseq) - bigdeg=degseq.pop() - while row: - if bigdeg<row: - eiglist.append(eig) - row-=1 - else: - eig+=1 - if degseq: - bigdeg=degseq.pop() - else: - bigdeg=0 - return eiglist - - -### Threshold graph creation routines - -def random_threshold_sequence(n,p,seed=None): - """ - Create a random threshold sequence of size n. - A creation sequence is built by randomly choosing d's with - probabiliy p and i's with probability 1-p. - - s=nx.random_threshold_sequence(10,0.5) - - returns a threshold sequence of length 10 with equal - probably of an i or a d at each position. - - A "random" threshold graph can be built with - - G=nx.threshold_graph(s) - - """ - if not seed is None: - random.seed(seed) - - if not (p<=1 and p>=0): - raise ValueError("p must be in [0,1]") - - cs=['d'] # threshold sequences always start with a d - for i in range(1,n): - if random.random() < p: - cs.append('d') - else: - cs.append('i') - return cs - - - - - -# maybe *_d_threshold_sequence routines should -# be (or be called from) a single routine with a more descriptive name -# and a keyword parameter? -def right_d_threshold_sequence(n,m): - """ - Create a skewed threshold graph with a given number - of vertices (n) and a given number of edges (m). - - The routine returns an unlabeled creation sequence - for the threshold graph. - - FIXME: describe algorithm - - """ - cs=['d']+['i']*(n-1) # create sequence with n insolated nodes - - # m <n : not enough edges, make disconnected - if m < n: - cs[m]='d' - return cs - - # too many edges - if m > n*(n-1)/2: - raise ValueError("Too many edges for this many nodes.") - - # connected case m >n-1 - ind=n-1 - sum=n-1 - while sum<m: - cs[ind]='d' - ind -= 1 - sum += ind - ind=m-(sum-ind) - cs[ind]='d' - return cs - -def left_d_threshold_sequence(n,m): - """ - Create a skewed threshold graph with a given number - of vertices (n) and a given number of edges (m). - - The routine returns an unlabeled creation sequence - for the threshold graph. - - FIXME: describe algorithm - - """ - cs=['d']+['i']*(n-1) # create sequence with n insolated nodes - - # m <n : not enough edges, make disconnected - if m < n: - cs[m]='d' - return cs - - # too many edges - if m > n*(n-1)/2: - raise ValueError("Too many edges for this many nodes.") - - # Connected case when M>N-1 - cs[n-1]='d' - sum=n-1 - ind=1 - while sum<m: - cs[ind]='d' - sum += ind - ind += 1 - if sum>m: # be sure not to change the first vertex - cs[sum-m]='i' - return cs - -def swap_d(cs,p_split=1.0,p_combine=1.0,seed=None): - """ - Perform a "swap" operation on a threshold sequence. - - The swap preserves the number of nodes and edges - in the graph for the given sequence. - The resulting sequence is still a threshold sequence. - - Perform one split and one combine operation on the - 'd's of a creation sequence for a threshold graph. - This operation maintains the number of nodes and edges - in the graph, but shifts the edges from node to node - maintaining the threshold quality of the graph. - """ - if not seed is None: - random.seed(seed) - - # preprocess the creation sequence - dlist= [ i for (i,node_type) in enumerate(cs[1:-1]) if node_type=='d' ] - # split - if random.random()<p_split: - choice=random.choice(dlist) - split_to=random.choice(range(choice)) - flip_side=choice-split_to - if split_to!=flip_side and cs[split_to]=='i' and cs[flip_side]=='i': - cs[choice]='i' - cs[split_to]='d' - cs[flip_side]='d' - dlist.remove(choice) - # don't add or combine may reverse this action - # dlist.extend([split_to,flip_side]) -# print >>sys.stderr,"split at %s to %s and %s"%(choice,split_to,flip_side) - # combine - if random.random()<p_combine and dlist: - first_choice= random.choice(dlist) - second_choice=random.choice(dlist) - target=first_choice+second_choice - if target >= len(cs) or cs[target]=='d' or first_choice==second_choice: - return cs - # OK to combine - cs[first_choice]='i' - cs[second_choice]='i' - cs[target]='d' -# print >>sys.stderr,"combine %s and %s to make %s."%(first_choice,second_choice,target) - - return cs - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/__init__.py deleted file mode 100644 index 9f63c89..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from networkx.linalg.attrmatrix import * -import networkx.linalg.attrmatrix -from networkx.linalg.spectrum import * -import networkx.linalg.spectrum -from networkx.linalg.graphmatrix import * -import networkx.linalg.graphmatrix -from networkx.linalg.laplacianmatrix import * -import networkx.linalg.laplacianmatrix - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/attrmatrix.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/attrmatrix.py deleted file mode 100644 index df193bb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/attrmatrix.py +++ /dev/null @@ -1,458 +0,0 @@ -""" - Functions for constructing matrix-like objects from graph attributes. -""" - -__all__ = ['attr_matrix', 'attr_sparse_matrix'] - -import networkx as nx - -def _node_value(G, node_attr): - """Returns a function that returns a value from G.node[u]. - - We return a function expecting a node as its sole argument. Then, in the - simplest scenario, the returned function will return G.node[u][node_attr]. - However, we also handle the case when `node_attr` is None or when it is a - function itself. - - Parameters - ---------- - G : graph - A NetworkX graph - - node_attr : {None, str, callable} - Specification of how the value of the node attribute should be obtained - from the node attribute dictionary. - - Returns - ------- - value : function - A function expecting a node as its sole argument. The function will - returns a value from G.node[u] that depends on `edge_attr`. - - """ - if node_attr is None: - value = lambda u: u - elif not hasattr(node_attr, '__call__'): - # assume it is a key for the node attribute dictionary - value = lambda u: G.node[u][node_attr] - else: - # Advanced: Allow users to specify something else. - # - # For example, - # node_attr = lambda u: G.node[u].get('size', .5) * 3 - # - value = node_attr - - return value - -def _edge_value(G, edge_attr): - """Returns a function that returns a value from G[u][v]. - - Suppose there exists an edge between u and v. Then we return a function - expecting u and v as arguments. For Graph and DiGraph, G[u][v] is - the edge attribute dictionary, and the function (essentially) returns - G[u][v][edge_attr]. However, we also handle cases when `edge_attr` is None - and when it is a function itself. For MultiGraph and MultiDiGraph, G[u][v] - is a dictionary of all edges between u and v. In this case, the returned - function sums the value of `edge_attr` for every edge between u and v. - - Parameters - ---------- - G : graph - A NetworkX graph - - edge_attr : {None, str, callable} - Specification of how the value of the edge attribute should be obtained - from the edge attribute dictionary, G[u][v]. For multigraphs, G[u][v] - is a dictionary of all the edges between u and v. This allows for - special treatment of multiedges. - - Returns - ------- - value : function - A function expecting two nodes as parameters. The nodes should - represent the from- and to- node of an edge. The function will - return a value from G[u][v] that depends on `edge_attr`. - - """ - - if edge_attr is None: - # topological count of edges - - if G.is_multigraph(): - value = lambda u,v: len(G[u][v]) - else: - value = lambda u,v: 1 - - elif not hasattr(edge_attr, '__call__'): - # assume it is a key for the edge attribute dictionary - - if edge_attr == 'weight': - # provide a default value - if G.is_multigraph(): - value = lambda u,v: sum([d.get(edge_attr, 1) for d in G[u][v].values()]) - else: - value = lambda u,v: G[u][v].get(edge_attr, 1) - else: - # otherwise, the edge attribute MUST exist for each edge - if G.is_multigraph(): - value = lambda u,v: sum([d[edge_attr] for d in G[u][v].values()]) - else: - value = lambda u,v: G[u][v][edge_attr] - - else: - # Advanced: Allow users to specify something else. - # - # Alternative default value: - # edge_attr = lambda u,v: G[u][v].get('thickness', .5) - # - # Function on an attribute: - # edge_attr = lambda u,v: abs(G[u][v]['weight']) - # - # Handle Multi(Di)Graphs differently: - # edge_attr = lambda u,v: numpy.prod([d['size'] for d in G[u][v].values()]) - # - # Ignore multiple edges - # edge_attr = lambda u,v: 1 if len(G[u][v]) else 0 - # - value = edge_attr - - return value - -def attr_matrix(G, edge_attr=None, node_attr=None, normalized=False, - rc_order=None, dtype=None, order=None): - """Returns a NumPy matrix using attributes from G. - - If only `G` is passed in, then the adjacency matrix is constructed. - - Let A be a discrete set of values for the node attribute `node_attr`. Then - the elements of A represent the rows and columns of the constructed matrix. - Now, iterate through every edge e=(u,v) in `G` and consider the value - of the edge attribute `edge_attr`. If ua and va are the values of the - node attribute `node_attr` for u and v, respectively, then the value of - the edge attribute is added to the matrix element at (ua, va). - - Parameters - ---------- - G : graph - The NetworkX graph used to construct the NumPy matrix. - - edge_attr : str, optional - Each element of the matrix represents a running total of the - specified edge attribute for edges whose node attributes correspond - to the rows/cols of the matirx. The attribute must be present for - all edges in the graph. If no attribute is specified, then we - just count the number of edges whose node attributes correspond - to the matrix element. - - node_attr : str, optional - Each row and column in the matrix represents a particular value - of the node attribute. The attribute must be present for all nodes - in the graph. Note, the values of this attribute should be reliably - hashable. So, float values are not recommended. If no attribute is - specified, then the rows and columns will be the nodes of the graph. - - normalized : bool, optional - If True, then each row is normalized by the summation of its values. - - rc_order : list, optional - A list of the node attribute values. This list specifies the ordering - of rows and columns of the array. If no ordering is provided, then - the ordering will be random (and also, a return value). - - Other Parameters - ---------------- - dtype : NumPy data-type, optional - A valid NumPy dtype used to initialize the array. Keep in mind certain - dtypes can yield unexpected results if the array is to be normalized. - The parameter is passed to numpy.zeros(). If unspecified, the NumPy - default is used. - - order : {'C', 'F'}, optional - Whether to store multidimensional data in C- or Fortran-contiguous - (row- or column-wise) order in memory. This parameter is passed to - numpy.zeros(). If unspecified, the NumPy default is used. - - Returns - ------- - M : NumPy matrix - The attribute matrix. - - ordering : list - If `rc_order` was specified, then only the matrix is returned. - However, if `rc_order` was None, then the ordering used to construct - the matrix is returned as well. - - Examples - -------- - Construct an adjacency matrix: - - >>> G = nx.Graph() - >>> G.add_edge(0,1,thickness=1,weight=3) - >>> G.add_edge(0,2,thickness=2) - >>> G.add_edge(1,2,thickness=3) - >>> nx.attr_matrix(G, rc_order=[0,1,2]) - matrix([[ 0., 1., 1.], - [ 1., 0., 1.], - [ 1., 1., 0.]]) - - Alternatively, we can obtain the matrix describing edge thickness. - - >>> nx.attr_matrix(G, edge_attr='thickness', rc_order=[0,1,2]) - matrix([[ 0., 1., 2.], - [ 1., 0., 3.], - [ 2., 3., 0.]]) - - We can also color the nodes and ask for the probability distribution over - all edges (u,v) describing: - - Pr(v has color Y | u has color X) - - >>> G.node[0]['color'] = 'red' - >>> G.node[1]['color'] = 'red' - >>> G.node[2]['color'] = 'blue' - >>> rc = ['red', 'blue'] - >>> nx.attr_matrix(G, node_attr='color', normalized=True, rc_order=rc) - matrix([[ 0.33333333, 0.66666667], - [ 1. , 0. ]]) - - For example, the above tells us that for all edges (u,v): - - Pr( v is red | u is red) = 1/3 - Pr( v is blue | u is red) = 2/3 - - Pr( v is red | u is blue) = 1 - Pr( v is blue | u is blue) = 0 - - Finally, we can obtain the total weights listed by the node colors. - - >>> nx.attr_matrix(G, edge_attr='weight', node_attr='color', rc_order=rc) - matrix([[ 3., 2.], - [ 2., 0.]]) - - Thus, the total weight over all edges (u,v) with u and v having colors: - - (red, red) is 3 # the sole contribution is from edge (0,1) - (red, blue) is 2 # contributions from edges (0,2) and (1,2) - (blue, red) is 2 # same as (red, blue) since graph is undirected - (blue, blue) is 0 # there are no edges with blue endpoints - - """ - try: - import numpy as np - except ImportError: - raise ImportError( - "attr_matrix() requires numpy: http://scipy.org/ ") - - edge_value = _edge_value(G, edge_attr) - node_value = _node_value(G, node_attr) - - if rc_order is None: - ordering = list(set([node_value(n) for n in G])) - else: - ordering = rc_order - - N = len(ordering) - undirected = not G.is_directed() - index = dict(zip(ordering, range(N))) - M = np.zeros((N,N), dtype=dtype, order=order) - - seen = set([]) - for u,nbrdict in G.adjacency_iter(): - for v in nbrdict: - # Obtain the node attribute values. - i, j = index[node_value(u)], index[node_value(v)] - if v not in seen: - M[i,j] += edge_value(u,v) - if undirected: - M[j,i] = M[i,j] - - if undirected: - seen.add(u) - - if normalized: - M /= M.sum(axis=1).reshape((N,1)) - - M = np.asmatrix(M) - - if rc_order is None: - return M, ordering - else: - return M - -def attr_sparse_matrix(G, edge_attr=None, node_attr=None, - normalized=False, rc_order=None, dtype=None): - """Returns a SciPy sparse matrix using attributes from G. - - If only `G` is passed in, then the adjacency matrix is constructed. - - Let A be a discrete set of values for the node attribute `node_attr`. Then - the elements of A represent the rows and columns of the constructed matrix. - Now, iterate through every edge e=(u,v) in `G` and consider the value - of the edge attribute `edge_attr`. If ua and va are the values of the - node attribute `node_attr` for u and v, respectively, then the value of - the edge attribute is added to the matrix element at (ua, va). - - Parameters - ---------- - G : graph - The NetworkX graph used to construct the NumPy matrix. - - edge_attr : str, optional - Each element of the matrix represents a running total of the - specified edge attribute for edges whose node attributes correspond - to the rows/cols of the matirx. The attribute must be present for - all edges in the graph. If no attribute is specified, then we - just count the number of edges whose node attributes correspond - to the matrix element. - - node_attr : str, optional - Each row and column in the matrix represents a particular value - of the node attribute. The attribute must be present for all nodes - in the graph. Note, the values of this attribute should be reliably - hashable. So, float values are not recommended. If no attribute is - specified, then the rows and columns will be the nodes of the graph. - - normalized : bool, optional - If True, then each row is normalized by the summation of its values. - - rc_order : list, optional - A list of the node attribute values. This list specifies the ordering - of rows and columns of the array. If no ordering is provided, then - the ordering will be random (and also, a return value). - - Other Parameters - ---------------- - dtype : NumPy data-type, optional - A valid NumPy dtype used to initialize the array. Keep in mind certain - dtypes can yield unexpected results if the array is to be normalized. - The parameter is passed to numpy.zeros(). If unspecified, the NumPy - default is used. - - Returns - ------- - M : SciPy sparse matrix - The attribute matrix. - - ordering : list - If `rc_order` was specified, then only the matrix is returned. - However, if `rc_order` was None, then the ordering used to construct - the matrix is returned as well. - - Examples - -------- - Construct an adjacency matrix: - - >>> G = nx.Graph() - >>> G.add_edge(0,1,thickness=1,weight=3) - >>> G.add_edge(0,2,thickness=2) - >>> G.add_edge(1,2,thickness=3) - >>> M = nx.attr_sparse_matrix(G, rc_order=[0,1,2]) - >>> M.todense() - matrix([[ 0., 1., 1.], - [ 1., 0., 1.], - [ 1., 1., 0.]]) - - Alternatively, we can obtain the matrix describing edge thickness. - - >>> M = nx.attr_sparse_matrix(G, edge_attr='thickness', rc_order=[0,1,2]) - >>> M.todense() - matrix([[ 0., 1., 2.], - [ 1., 0., 3.], - [ 2., 3., 0.]]) - - We can also color the nodes and ask for the probability distribution over - all edges (u,v) describing: - - Pr(v has color Y | u has color X) - - >>> G.node[0]['color'] = 'red' - >>> G.node[1]['color'] = 'red' - >>> G.node[2]['color'] = 'blue' - >>> rc = ['red', 'blue'] - >>> M = nx.attr_sparse_matrix(G, node_attr='color', \ - normalized=True, rc_order=rc) - >>> M.todense() - matrix([[ 0.33333333, 0.66666667], - [ 1. , 0. ]]) - - For example, the above tells us that for all edges (u,v): - - Pr( v is red | u is red) = 1/3 - Pr( v is blue | u is red) = 2/3 - - Pr( v is red | u is blue) = 1 - Pr( v is blue | u is blue) = 0 - - Finally, we can obtain the total weights listed by the node colors. - - >>> M = nx.attr_sparse_matrix(G, edge_attr='weight',\ - node_attr='color', rc_order=rc) - >>> M.todense() - matrix([[ 3., 2.], - [ 2., 0.]]) - - Thus, the total weight over all edges (u,v) with u and v having colors: - - (red, red) is 3 # the sole contribution is from edge (0,1) - (red, blue) is 2 # contributions from edges (0,2) and (1,2) - (blue, red) is 2 # same as (red, blue) since graph is undirected - (blue, blue) is 0 # there are no edges with blue endpoints - - """ - try: - import numpy as np - from scipy import sparse - except ImportError: - raise ImportError( - "attr_sparse_matrix() requires scipy: http://scipy.org/ ") - - edge_value = _edge_value(G, edge_attr) - node_value = _node_value(G, node_attr) - - if rc_order is None: - ordering = list(set([node_value(n) for n in G])) - else: - ordering = rc_order - - N = len(ordering) - undirected = not G.is_directed() - index = dict(zip(ordering, range(N))) - M = sparse.lil_matrix((N,N), dtype=dtype) - - seen = set([]) - for u,nbrdict in G.adjacency_iter(): - for v in nbrdict: - # Obtain the node attribute values. - i, j = index[node_value(u)], index[node_value(v)] - if v not in seen: - M[i,j] += edge_value(u,v) - if undirected: - M[j,i] = M[i,j] - - if undirected: - seen.add(u) - - if normalized: - norms = np.asarray(M.sum(axis=1)).ravel() - for i,norm in enumerate(norms): - M[i,:] /= norm - - if rc_order is None: - return M, ordering - else: - return M - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") - try: - import scipy - except: - raise SkipTest("SciPy not available") - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/graphmatrix.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/graphmatrix.py deleted file mode 100644 index c677619..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/graphmatrix.py +++ /dev/null @@ -1,156 +0,0 @@ -""" -Adjacency matrix and incidence matrix of graphs. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) - -__all__ = ['incidence_matrix', - 'adj_matrix', 'adjacency_matrix', - ] - - -def incidence_matrix(G, nodelist=None, edgelist=None, - oriented=False, weight=None): - """Return incidence matrix of G. - - The incidence matrix assigns each row to a node and each column to an edge. - For a standard incidence matrix a 1 appears wherever a row's node is - incident on the column's edge. For an oriented incidence matrix each - edge is assigned an orientation (arbitrarily for undirected and aligning to - direction for directed). A -1 appears for the tail of an edge and 1 - for the head of the edge. The elements are zero otherwise. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list, optional (default= all nodes in G) - The rows are ordered according to the nodes in nodelist. - If nodelist is None, then the ordering is produced by G.nodes(). - - edgelist : list, optional (default= all edges in G) - The columns are ordered according to the edges in edgelist. - If edgelist is None, then the ordering is produced by G.edges(). - - oriented: bool, optional (default=False) - If True, matrix elements are +1 or -1 for the head or tail node - respectively of each edge. If False, +1 occurs at both nodes. - - weight : string or None, optional (default=None) - The edge data key used to provide each value in the matrix. - If None, then each edge has weight 1. Edge weights, if used, - should be positive so that the orientation can provide the sign. - - Returns - ------- - A : NumPy matrix - The incidence matrix of G. - - Notes - ----- - For MultiGraph/MultiDiGraph, the edges in edgelist should be - (u,v,key) 3-tuples. - - "Networks are the best discrete model for so many problems in - applied mathematics" [1]_. - - References - ---------- - .. [1] Gil Strang, Network applications: A = incidence matrix, - http://academicearth.org/lectures/network-applications-incidence-matrix - """ - try: - import numpy as np - except ImportError: - raise ImportError( - "incidence_matrix() requires numpy: http://scipy.org/ ") - if nodelist is None: - nodelist = G.nodes() - if edgelist is None: - if G.is_multigraph(): - edgelist = G.edges(keys=True) - else: - edgelist = G.edges() - A = np.zeros((len(nodelist),len(edgelist))) - node_index = dict( (node,i) for i,node in enumerate(nodelist) ) - for ei,e in enumerate(edgelist): - (u,v) = e[:2] - if u == v: continue # self loops give zero column - try: - ui = node_index[u] - vi = node_index[v] - except KeyError: - raise NetworkXError('node %s or %s in edgelist ' - 'but not in nodelist"%(u,v)') - if weight is None: - wt = 1 - else: - if G.is_multigraph(): - ekey = e[2] - wt = G[u][v][ekey].get(weight,1) - else: - wt = G[u][v].get(weight,1) - if oriented: - A[ui,ei] = -wt - A[vi,ei] = wt - else: - A[ui,ei] = wt - A[vi,ei] = wt - return np.asmatrix(A) - -def adjacency_matrix(G, nodelist=None, weight='weight'): - """Return adjacency matrix of G. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list, optional - The rows and columns are ordered according to the nodes in nodelist. - If nodelist is None, then the ordering is produced by G.nodes(). - - weight : string or None, optional (default='weight') - The edge data key used to provide each value in the matrix. - If None, then each edge has weight 1. - - Returns - ------- - A : numpy matrix - Adjacency matrix representation of G. - - Notes - ----- - If you want a pure Python adjacency matrix representation try - networkx.convert.to_dict_of_dicts which will return a - dictionary-of-dictionaries format that can be addressed as a - sparse matrix. - - For MultiGraph/MultiDiGraph, the edges weights are summed. - See to_numpy_matrix for other options. - - See Also - -------- - to_numpy_matrix - to_dict_of_dicts - """ - return nx.to_numpy_matrix(G,nodelist=nodelist,weight=weight) - -adj_matrix=adjacency_matrix - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/laplacianmatrix.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/laplacianmatrix.py deleted file mode 100644 index ffb256c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/laplacianmatrix.py +++ /dev/null @@ -1,277 +0,0 @@ -""" -Laplacian matrix of graphs. -""" -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import require, not_implemented_for - -__author__ = "\n".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult (dschult@colgate.edu)', - 'Alejandro Weinstein <alejandro.weinstein@gmail.com>']) - -__all__ = ['laplacian_matrix', - 'normalized_laplacian_matrix', - 'directed_laplacian_matrix'] - -@require('numpy') -@not_implemented_for('directed') -def laplacian_matrix(G, nodelist=None, weight='weight'): - """Return the Laplacian matrix of G. - - The graph Laplacian is the matrix L = D - A, where - A is the adjacency matrix and D is the diagonal matrix of node degrees. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list, optional - The rows and columns are ordered according to the nodes in nodelist. - If nodelist is None, then the ordering is produced by G.nodes(). - - weight : string or None, optional (default='weight') - The edge data key used to compute each value in the matrix. - If None, then each edge has weight 1. - - Returns - ------- - L : NumPy matrix - The Laplacian matrix of G. - - Notes - ----- - For MultiGraph/MultiDiGraph, the edges weights are summed. - See to_numpy_matrix for other options. - - See Also - -------- - to_numpy_matrix - normalized_laplacian_matrix - """ - import numpy as np - if nodelist is None: - nodelist = G.nodes() - if G.is_multigraph(): - # this isn't the fastest way to do this... - A = np.asarray(nx.to_numpy_matrix(G,nodelist=nodelist,weight=weight)) - I = np.identity(A.shape[0]) - D = I*np.sum(A,axis=1) - L = D - A - else: - # Graph or DiGraph, this is faster than above - n = len(nodelist) - index = dict( (n,i) for i,n in enumerate(nodelist) ) - L = np.zeros((n,n)) - for ui,u in enumerate(nodelist): - totalwt = 0.0 - for v,d in G[u].items(): - try: - vi = index[v] - except KeyError: - continue - wt = d.get(weight,1) - L[ui,vi] = -wt - totalwt += wt - L[ui,ui] = totalwt - return np.asmatrix(L) - -@require('numpy') -@not_implemented_for('directed') -def normalized_laplacian_matrix(G, nodelist=None, weight='weight'): - r"""Return the normalized Laplacian matrix of G. - - The normalized graph Laplacian is the matrix - - .. math:: - - NL = D^{-1/2} L D^{-1/2} - - where `L` is the graph Laplacian and `D` is the diagonal matrix of - node degrees. - - Parameters - ---------- - G : graph - A NetworkX graph - - nodelist : list, optional - The rows and columns are ordered according to the nodes in nodelist. - If nodelist is None, then the ordering is produced by G.nodes(). - - weight : string or None, optional (default='weight') - The edge data key used to compute each value in the matrix. - If None, then each edge has weight 1. - - Returns - ------- - L : NumPy matrix - The normalized Laplacian matrix of G. - - Notes - ----- - For MultiGraph/MultiDiGraph, the edges weights are summed. - See to_numpy_matrix for other options. - - If the Graph contains selfloops, D is defined as diag(sum(A,1)), where A is - the adjencency matrix [2]_. - - See Also - -------- - laplacian_matrix - - References - ---------- - .. [1] Fan Chung-Graham, Spectral Graph Theory, - CBMS Regional Conference Series in Mathematics, Number 92, 1997. - .. [2] Steve Butler, Interlacing For Weighted Graphs Using The Normalized - Laplacian, Electronic Journal of Linear Algebra, Volume 16, pp. 90-98, - March 2007. - """ - import numpy as np - if G.is_multigraph(): - L = laplacian_matrix(G, nodelist=nodelist, weight=weight) - D = np.diag(L) - elif G.number_of_selfloops() == 0: - L = laplacian_matrix(G, nodelist=nodelist, weight=weight) - D = np.diag(L) - else: - A = np.array(nx.adj_matrix(G)) - D = np.sum(A, 1) - L = np.diag(D) - A - - # Handle div by 0. It happens if there are unconnected nodes - with np.errstate(divide='ignore'): - Disqrt = np.diag(1 / np.sqrt(D)) - Disqrt[np.isinf(Disqrt)] = 0 - Ln = np.dot(Disqrt, np.dot(L,Disqrt)) - return Ln - -############################################################################### -# Code based on -# https://bitbucket.org/bedwards/networkx-community/src/370bd69fc02f/networkx/algorithms/community/ - -@require('numpy') -@not_implemented_for('undirected') -@not_implemented_for('multigraph') -def directed_laplacian_matrix(G, nodelist=None, weight='weight', - walk_type=None, alpha=0.95): - r"""Return the directed Laplacian matrix of G. - - The graph directed Laplacian is the matrix - - .. math:: - - L = I - (\Phi^{1/2} P \Phi^{-1/2} + \Phi^{-1/2} P^T \Phi^{1/2} ) / 2 - - where `I` is the identity matrix, `P` is the transition matrix of the - graph, and `\Phi` a matrix with the Perron vector of `P` in the diagonal and - zeros elsewhere. - - Depending on the value of walk_type, `P` can be the transition matrix - induced by a random walk, a lazy random walk, or a random walk with - teleportation (PageRank). - - Parameters - ---------- - G : DiGraph - A NetworkX graph - - nodelist : list, optional - The rows and columns are ordered according to the nodes in nodelist. - If nodelist is None, then the ordering is produced by G.nodes(). - - weight : string or None, optional (default='weight') - The edge data key used to compute each value in the matrix. - If None, then each edge has weight 1. - - walk_type : string or None, optional (default=None) - If None, `P` is selected depending on the properties of the - graph. Otherwise is one of 'random', 'lazy', or 'pagerank' - - alpha : real - (1 - alpha) is the teleportation probability used with pagerank - - Returns - ------- - L : NumPy array - Normalized Laplacian of G. - - Raises - ------ - NetworkXError - If NumPy cannot be imported - - NetworkXNotImplemnted - If G is not a DiGraph - - Notes - ----- - Only implemented for DiGraphs - - See Also - -------- - laplacian_matrix - - References - ---------- - .. [1] Fan Chung (2005). - Laplacians and the Cheeger inequality for directed graphs. - Annals of Combinatorics, 9(1), 2005 - """ - import numpy as np - if walk_type is None: - if nx.is_strongly_connected(G): - if nx.is_aperiodic(G): - walk_type = "random" - else: - walk_type = "lazy" - else: - walk_type = "pagerank" - - M = nx.to_numpy_matrix(G, nodelist=nodelist, weight=weight) - n, m = M.shape - if walk_type in ["random", "lazy"]: - DI = np.diagflat(1.0 / np.sum(M, axis=1)) - if walk_type == "random": - P = DI * M - else: - I = np.identity(n) - P = (I + DI * M) / 2.0 - elif walk_type == "pagerank": - if not (0 < alpha < 1): - raise nx.NetworkXError('alpha must be between 0 and 1') - # add constant to dangling nodes' row - dangling = np.where(M.sum(axis=1) == 0) - for d in dangling[0]: - M[d] = 1.0 / n - # normalize - M = M / M.sum(axis=1) - P = alpha * M + (1 - alpha) / n - else: - raise nx.NetworkXError("walk_type must be random, lazy, or pagerank") - - evals, evecs = np.linalg.eig(P.T) - index = evals.argsort()[-1] # index of largest eval,evec - # eigenvector of largest eigenvalue at ind[-1] - v = np.array(evecs[:,index]).flatten().real - p = v / v.sum() - sp = np.sqrt(p) - Q = np.diag(sp) * P * np.diag(1.0/sp) - I = np.identity(len(G)) - - return I - (Q + Q.T) /2.0 - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/spectrum.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/spectrum.py deleted file mode 100644 index bca7288..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/spectrum.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Eigenvalue spectrum of graphs. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)']) - -__all__ = ['laplacian_spectrum', 'adjacency_spectrum'] - - -def laplacian_spectrum(G, weight='weight'): - """Return eigenvalues of the Laplacian of G - - Parameters - ---------- - G : graph - A NetworkX graph - - weight : string or None, optional (default='weight') - The edge data key used to compute each value in the matrix. - If None, then each edge has weight 1. - - Returns - ------- - evals : NumPy array - Eigenvalues - - Notes - ----- - For MultiGraph/MultiDiGraph, the edges weights are summed. - See to_numpy_matrix for other options. - - See Also - -------- - laplacian_matrix - """ - try: - import numpy as np - except ImportError: - raise ImportError( - "laplacian_spectrum() requires NumPy: http://scipy.org/ ") - return np.linalg.eigvals(nx.laplacian_matrix(G,weight=weight)) - -def adjacency_spectrum(G, weight='weight'): - """Return eigenvalues of the adjacency matrix of G. - - Parameters - ---------- - G : graph - A NetworkX graph - - weight : string or None, optional (default='weight') - The edge data key used to compute each value in the matrix. - If None, then each edge has weight 1. - - Returns - ------- - evals : NumPy array - Eigenvalues - - Notes - ----- - For MultiGraph/MultiDiGraph, the edges weights are summed. - See to_numpy_matrix for other options. - - See Also - -------- - adjacency_matrix - """ - try: - import numpy as np - except ImportError: - raise ImportError( - "adjacency_spectrum() requires NumPy: http://scipy.org/ ") - return np.linalg.eigvals(nx.adjacency_matrix(G,weight=weight)) - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import numpy - except: - raise SkipTest("NumPy not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_graphmatrix.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_graphmatrix.py deleted file mode 100644 index bba234e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_graphmatrix.py +++ /dev/null @@ -1,89 +0,0 @@ -from nose import SkipTest - -import networkx as nx -from networkx.generators.degree_seq import havel_hakimi_graph - -class TestGraphMatrix(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global numpy - global assert_equal - global assert_almost_equal - try: - import numpy - from numpy.testing import assert_equal,assert_almost_equal - except ImportError: - raise SkipTest('NumPy not available.') - - def setUp(self): - deg=[3,2,2,1,0] - self.G=havel_hakimi_graph(deg) - self.OI=numpy.array([[-1, -1, -1, 0], - [1, 0, 0, -1], - [0, 1, 0, 1], - [0, 0, 1, 0], - [0, 0, 0, 0]]) - self.A=numpy.array([[0, 1, 1, 1, 0], - [1, 0, 1, 0, 0], - [1, 1, 0, 0, 0], - [1, 0, 0, 0, 0], - [0, 0, 0, 0, 0]]) - self.WG=nx.Graph( (u,v,{'weight':0.5,'other':0.3}) - for (u,v) in self.G.edges_iter() ) - self.WG.add_node(4) - self.WA=numpy.array([[0 , 0.5, 0.5, 0.5, 0], - [0.5, 0 , 0.5, 0 , 0], - [0.5, 0.5, 0 , 0 , 0], - [0.5, 0 , 0 , 0 , 0], - [0 , 0 , 0 , 0 , 0]]) - self.MG=nx.MultiGraph(self.G) - self.MG2=self.MG.copy() - self.MG2.add_edge(0,1) - self.MG2A=numpy.array([[0, 2, 1, 1, 0], - [2, 0, 1, 0, 0], - [1, 1, 0, 0, 0], - [1, 0, 0, 0, 0], - [0, 0, 0, 0, 0]]) - self.MGOI=numpy.array([[-1, -1, -1, -1, 0], - [1, 1, 0, 0, -1], - [0, 0, 1, 0, 1], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 0]]) - - def test_incidence_matrix(self): - "Conversion to incidence matrix" - assert_equal(nx.incidence_matrix(self.G,oriented=True),self.OI) - assert_equal(nx.incidence_matrix(self.G),numpy.abs(self.OI)) - assert_equal(nx.incidence_matrix(self.MG,oriented=True),self.OI) - assert_equal(nx.incidence_matrix(self.MG),numpy.abs(self.OI)) - assert_equal(nx.incidence_matrix(self.MG2,oriented=True),self.MGOI) - assert_equal(nx.incidence_matrix(self.MG2),numpy.abs(self.MGOI)) - assert_equal(nx.incidence_matrix(self.WG,oriented=True),self.OI) - assert_equal(nx.incidence_matrix(self.WG),numpy.abs(self.OI)) - assert_equal(nx.incidence_matrix(self.WG,oriented=True, - weight='weight'),0.5*self.OI) - assert_equal(nx.incidence_matrix(self.WG,weight='weight'), - numpy.abs(0.5*self.OI)) - assert_equal(nx.incidence_matrix(self.WG,oriented=True,weight='other'), - 0.3*self.OI) - WMG=nx.MultiGraph(self.WG) - WMG.add_edge(0,1,attr_dict={'weight':0.5,'other':0.3}) - assert_equal(nx.incidence_matrix(WMG,weight='weight'), - numpy.abs(0.5*self.MGOI)) - assert_equal(nx.incidence_matrix(WMG,weight='weight',oriented=True), - 0.5*self.MGOI) - assert_equal(nx.incidence_matrix(WMG,weight='other',oriented=True), - 0.3*self.MGOI) - - def test_adjacency_matrix(self): - "Conversion to adjacency matrix" - assert_equal(nx.adj_matrix(self.G),self.A) - assert_equal(nx.adj_matrix(self.MG),self.A) - assert_equal(nx.adj_matrix(self.MG2),self.MG2A) - assert_equal(nx.adj_matrix(self.G,nodelist=[0,1]),self.A[:2,:2]) - assert_equal(nx.adj_matrix(self.WG),self.WA) - assert_equal(nx.adj_matrix(self.WG,weight=None),self.A) - assert_equal(nx.adj_matrix(self.MG2,weight=None),self.MG2A) - assert_equal(nx.adj_matrix(self.WG,weight='other'),0.6*self.WA) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_laplacian.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_laplacian.py deleted file mode 100644 index 87725fe..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_laplacian.py +++ /dev/null @@ -1,101 +0,0 @@ -from nose import SkipTest - -import networkx as nx -from networkx.generators.degree_seq import havel_hakimi_graph - -class TestLaplacian(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global numpy - global assert_equal - global assert_almost_equal - try: - import numpy - from numpy.testing import assert_equal,assert_almost_equal - except ImportError: - raise SkipTest('NumPy not available.') - - def setUp(self): - deg=[3,2,2,1,0] - self.G=havel_hakimi_graph(deg) - self.WG=nx.Graph( (u,v,{'weight':0.5,'other':0.3}) - for (u,v) in self.G.edges_iter() ) - self.WG.add_node(4) - self.MG=nx.MultiGraph(self.G) - - # Graph with selfloops - self.Gsl = self.G.copy() - for node in self.Gsl.nodes(): - self.Gsl.add_edge(node, node) - - - def test_laplacian(self): - "Graph Laplacian" - NL=numpy.array([[ 3, -1, -1, -1, 0], - [-1, 2, -1, 0, 0], - [-1, -1, 2, 0, 0], - [-1, 0, 0, 1, 0], - [ 0, 0, 0, 0, 0]]) - WL=0.5*NL - OL=0.3*NL - assert_equal(nx.laplacian_matrix(self.G),NL) - assert_equal(nx.laplacian_matrix(self.MG),NL) - assert_equal(nx.laplacian_matrix(self.G,nodelist=[0,1]), - numpy.array([[ 1, -1],[-1, 1]])) - assert_equal(nx.laplacian_matrix(self.WG),WL) - assert_equal(nx.laplacian_matrix(self.WG,weight=None),NL) - assert_equal(nx.laplacian_matrix(self.WG,weight='other'),OL) - - def test_normalized_laplacian(self): - "Generalized Graph Laplacian" - GL=numpy.array([[ 1.00, -0.408, -0.408, -0.577, 0.00], - [-0.408, 1.00, -0.50, 0.00 , 0.00], - [-0.408, -0.50, 1.00, 0.00, 0.00], - [-0.577, 0.00, 0.00, 1.00, 0.00], - [ 0.00, 0.00, 0.00, 0.00, 0.00]]) - Lsl = numpy.array([[ 0.75 , -0.2887, -0.2887, -0.3536, 0.], - [-0.2887, 0.6667, -0.3333, 0. , 0.], - [-0.2887, -0.3333, 0.6667, 0. , 0.], - [-0.3536, 0. , 0. , 0.5 , 0.], - [ 0. , 0. , 0. , 0. , 0.]]) - - assert_almost_equal(nx.normalized_laplacian_matrix(self.G),GL,decimal=3) - assert_almost_equal(nx.normalized_laplacian_matrix(self.MG),GL,decimal=3) - assert_almost_equal(nx.normalized_laplacian_matrix(self.WG),GL,decimal=3) - assert_almost_equal(nx.normalized_laplacian_matrix(self.WG,weight='other'),GL,decimal=3) - assert_almost_equal(nx.normalized_laplacian_matrix(self.Gsl), Lsl, decimal=3) - - def test_directed_laplacian(self): - "Directed Laplacian" - # Graph used as an example in Sec. 4.1 of Langville and Meyer, - # "Google's PageRank and Beyond". The graph contains dangling nodes, so - # the pagerank random walk is selected by directed_laplacian - G = nx.DiGraph() - G.add_edges_from(((1,2), (1,3), (3,1), (3,2), (3,5), (4,5), (4,6), - (5,4), (5,6), (6,4))) - GL = numpy.array([[ 0.9833, -0.2941, -0.3882, -0.0291, -0.0231, -0.0261], - [-0.2941, 0.8333, -0.2339, -0.0536, -0.0589, -0.0554], - [-0.3882, -0.2339, 0.9833, -0.0278, -0.0896, -0.0251], - [-0.0291, -0.0536, -0.0278, 0.9833, -0.4878, -0.6675], - [-0.0231, -0.0589, -0.0896, -0.4878, 0.9833, -0.2078], - [-0.0261, -0.0554, -0.0251, -0.6675, -0.2078, 0.9833]]) - assert_almost_equal(nx.directed_laplacian_matrix(G, alpha=0.9), GL, decimal=3) - - # Make the graph strongly connected, so we can use a random and lazy walk - G.add_edges_from((((2,5), (6,1)))) - GL = numpy.array([[ 1. , -0.3062, -0.4714, 0. , 0. , -0.3227], - [-0.3062, 1. , -0.1443, 0. , -0.3162, 0. ], - [-0.4714, -0.1443, 1. , 0. , -0.0913, 0. ], - [ 0. , 0. , 0. , 1. , -0.5 , -0.5 ], - [ 0. , -0.3162, -0.0913, -0.5 , 1. , -0.25 ], - [-0.3227, 0. , 0. , -0.5 , -0.25 , 1. ]]) - assert_almost_equal(nx.directed_laplacian_matrix(G, walk_type='random'), GL, decimal=3) - - GL = numpy.array([[ 0.5 , -0.1531, -0.2357, 0. , 0. , -0.1614], - [-0.1531, 0.5 , -0.0722, 0. , -0.1581, 0. ], - [-0.2357, -0.0722, 0.5 , 0. , -0.0456, 0. ], - [ 0. , 0. , 0. , 0.5 , -0.25 , -0.25 ], - [ 0. , -0.1581, -0.0456, -0.25 , 0.5 , -0.125 ], - [-0.1614, 0. , 0. , -0.25 , -0.125 , 0.5 ]]) - assert_almost_equal(nx.directed_laplacian_matrix(G, walk_type='lazy'), GL, decimal=3) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_spectrum.py b/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_spectrum.py deleted file mode 100644 index a2961cb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/linalg/tests/test_spectrum.py +++ /dev/null @@ -1,44 +0,0 @@ -from nose import SkipTest - -import networkx as nx -from networkx.generators.degree_seq import havel_hakimi_graph - -class TestSpectrum(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global numpy - global assert_equal - global assert_almost_equal - try: - import numpy - from numpy.testing import assert_equal,assert_almost_equal - except ImportError: - raise SkipTest('NumPy not available.') - - def setUp(self): - deg=[3,2,2,1,0] - self.G=havel_hakimi_graph(deg) - self.P=nx.path_graph(3) - self.WG=nx.Graph( (u,v,{'weight':0.5,'other':0.3}) - for (u,v) in self.G.edges_iter() ) - self.WG.add_node(4) - - def test_laplacian_spectrum(self): - "Laplacian eigenvalues" - evals=numpy.array([0, 0, 1, 3, 4]) - e=sorted(nx.laplacian_spectrum(self.G)) - assert_almost_equal(e,evals) - e=sorted(nx.laplacian_spectrum(self.WG,weight=None)) - assert_almost_equal(e,evals) - e=sorted(nx.laplacian_spectrum(self.WG)) - assert_almost_equal(e,0.5*evals) - e=sorted(nx.laplacian_spectrum(self.WG,weight='other')) - assert_almost_equal(e,0.3*evals) - - def test_adjacency_spectrum(self): - "Adjacency eigenvalues" - evals=numpy.array([-numpy.sqrt(2), 0, numpy.sqrt(2)]) - e=sorted(nx.adjacency_spectrum(self.P)) - assert_almost_equal(e,evals) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/__init__.py deleted file mode 100644 index c806cd0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -A package for reading and writing graphs in various formats. - -""" -from networkx.readwrite.adjlist import * -from networkx.readwrite.multiline_adjlist import * -from networkx.readwrite.edgelist import * -from networkx.readwrite.gpickle import * -from networkx.readwrite.pajek import * -from networkx.readwrite.leda import * -from networkx.readwrite.sparsegraph6 import * -from networkx.readwrite.nx_yaml import * -from networkx.readwrite.gml import * -from networkx.readwrite.graphml import * -from networkx.readwrite.gexf import * -from networkx.readwrite.nx_shp import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/adjlist.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/adjlist.py deleted file mode 100644 index 57f1e24..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/adjlist.py +++ /dev/null @@ -1,314 +0,0 @@ -# -*- coding: utf-8 -*- -""" -************** -Adjacency List -************** -Read and write NetworkX graphs as adjacency lists. - -Adjacency list format is useful for graphs without data associated -with nodes or edges and for nodes that can be meaningfully represented -as strings. - -Format ------- -The adjacency list format consists of lines with node labels. The -first label in a line is the source node. Further labels in the line -are considered target nodes and are added to the graph along with an edge -between the source node and target node. - -The graph with edges a-b, a-c, d-e can be represented as the following -adjacency list (anything following the # in a line is a comment):: - - a b c # source target target - d e -""" -__author__ = '\n'.join(['Aric Hagberg <hagberg@lanl.gov>', - 'Dan Schult <dschult@colgate.edu>', - 'Loïc Séguin-C. <loicseguin@gmail.com>']) -# Copyright (C) 2004-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['generate_adjlist', - 'write_adjlist', - 'parse_adjlist', - 'read_adjlist'] - -from networkx.utils import make_str, open_file -import networkx as nx - - -def generate_adjlist(G, delimiter = ' '): - """Generate a single line of the graph G in adjacency list format. - - Parameters - ---------- - G : NetworkX graph - - delimiter : string, optional - Separator for node labels - - Returns - ------- - lines : string - Lines of data in adjlist format. - - Examples - -------- - >>> G = nx.lollipop_graph(4, 3) - >>> for line in nx.generate_adjlist(G): - ... print(line) - 0 1 2 3 - 1 2 3 - 2 3 - 3 4 - 4 5 - 5 6 - 6 - - See Also - -------- - write_adjlist, read_adjlist - - """ - directed=G.is_directed() - seen=set() - for s,nbrs in G.adjacency_iter(): - line = make_str(s)+delimiter - for t,data in nbrs.items(): - if not directed and t in seen: - continue - if G.is_multigraph(): - for d in data.values(): - line += make_str(t) + delimiter - else: - line += make_str(t) + delimiter - if not directed: - seen.add(s) - yield line[:-len(delimiter)] - -@open_file(1,mode='wb') -def write_adjlist(G, path, comments="#", delimiter=' ', encoding = 'utf-8'): - """Write graph G in single-line adjacency-list format to path. - - - Parameters - ---------- - G : NetworkX graph - - path : string or file - Filename or file handle for data output. - Filenames ending in .gz or .bz2 will be compressed. - - comments : string, optional - Marker for comment lines - - delimiter : string, optional - Separator for node labels - - encoding : string, optional - Text encoding. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_adjlist(G,"test.adjlist") - - The path can be a filehandle or a string with the name of the file. If a - filehandle is provided, it has to be opened in 'wb' mode. - - >>> fh=open("test.adjlist",'wb') - >>> nx.write_adjlist(G, fh) - - Notes - ----- - This format does not store graph, node, or edge data. - - See Also - -------- - read_adjlist, generate_adjlist - """ - import sys - import time - pargs=comments + " ".join(sys.argv) + '\n' - header = (pargs - + comments + " GMT %s\n" % (time.asctime(time.gmtime())) - + comments + " %s\n" % (G.name)) - path.write(header.encode(encoding)) - - for line in generate_adjlist(G, delimiter): - line+='\n' - path.write(line.encode(encoding)) - - -def parse_adjlist(lines, comments = '#', delimiter = None, - create_using = None, nodetype = None): - """Parse lines of a graph adjacency list representation. - - Parameters - ---------- - lines : list or iterator of strings - Input data in adjlist format - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - nodetype : Python type, optional - Convert nodes to this type. - - comments : string, optional - Marker for comment lines - - delimiter : string, optional - Separator for node labels. The default is whitespace. - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - - Returns - ------- - G: NetworkX graph - The graph corresponding to the lines in adjacency list format. - - Examples - -------- - >>> lines = ['1 2 5', - ... '2 3 4', - ... '3 5', - ... '4', - ... '5'] - >>> G = nx.parse_adjlist(lines, nodetype = int) - >>> G.nodes() - [1, 2, 3, 4, 5] - >>> G.edges() - [(1, 2), (1, 5), (2, 3), (2, 4), (3, 5)] - - See Also - -------- - read_adjlist - - """ - if create_using is None: - G=nx.Graph() - else: - try: - G=create_using - G.clear() - except: - raise TypeError("Input graph is not a NetworkX graph type") - - for line in lines: - p=line.find(comments) - if p>=0: - line = line[:p] - if not len(line): - continue - vlist=line.strip().split(delimiter) - u=vlist.pop(0) - # convert types - if nodetype is not None: - try: - u=nodetype(u) - except: - raise TypeError("Failed to convert node (%s) to type %s"\ - %(u,nodetype)) - G.add_node(u) - if nodetype is not None: - try: - vlist=map(nodetype,vlist) - except: - raise TypeError("Failed to convert nodes (%s) to type %s"\ - %(','.join(vlist),nodetype)) - G.add_edges_from([(u, v) for v in vlist]) - return G - -@open_file(0,mode='rb') -def read_adjlist(path, comments="#", delimiter=None, create_using=None, - nodetype=None, encoding = 'utf-8'): - """Read graph in adjacency list format from path. - - Parameters - ---------- - path : string or file - Filename or file handle to read. - Filenames ending in .gz or .bz2 will be uncompressed. - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - nodetype : Python type, optional - Convert nodes to this type. - - comments : string, optional - Marker for comment lines - - delimiter : string, optional - Separator for node labels. The default is whitespace. - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - - Returns - ------- - G: NetworkX graph - The graph corresponding to the lines in adjacency list format. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_adjlist(G, "test.adjlist") - >>> G=nx.read_adjlist("test.adjlist") - - The path can be a filehandle or a string with the name of the file. If a - filehandle is provided, it has to be opened in 'rb' mode. - - >>> fh=open("test.adjlist", 'rb') - >>> G=nx.read_adjlist(fh) - - Filenames ending in .gz or .bz2 will be compressed. - - >>> nx.write_adjlist(G,"test.adjlist.gz") - >>> G=nx.read_adjlist("test.adjlist.gz") - - The optional nodetype is a function to convert node strings to nodetype. - - For example - - >>> G=nx.read_adjlist("test.adjlist", nodetype=int) - - will attempt to convert all nodes to integer type. - - Since nodes must be hashable, the function nodetype must return hashable - types (e.g. int, float, str, frozenset - or tuples of those, etc.) - - The optional create_using parameter is a NetworkX graph container. - The default is Graph(), an undirected graph. To read the data as - a directed graph use - - >>> G=nx.read_adjlist("test.adjlist", create_using=nx.DiGraph()) - - Notes - ----- - This format does not store graph or node data. - - See Also - -------- - write_adjlist - """ - lines = (line.decode(encoding) for line in path) - return parse_adjlist(lines, - comments = comments, - delimiter = delimiter, - create_using = create_using, - nodetype = nodetype) - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.adjlist') - os.unlink('test.adjlist.gz') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/edgelist.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/edgelist.py deleted file mode 100644 index 4a1aea9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/edgelist.py +++ /dev/null @@ -1,464 +0,0 @@ -""" -********** -Edge Lists -********** -Read and write NetworkX graphs as edge lists. - -The multi-line adjacency list format is useful for graphs with nodes -that can be meaningfully represented as strings. With the edgelist -format simple edge data can be stored but node or graph data is not. -There is no way of representing isolated nodes unless the node has a -self-loop edge. - -Format ------- -You can read or write three formats of edge lists with these functions. - -Node pairs with no data:: - - 1 2 - -Python dictionary as data:: - - 1 2 {'weight':7, 'color':'green'} - -Arbitrary data:: - - 1 2 7 green -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nDan Schult (dschult@colgate.edu)""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['generate_edgelist', - 'write_edgelist', - 'parse_edgelist', - 'read_edgelist', - 'read_weighted_edgelist', - 'write_weighted_edgelist'] - -from networkx.utils import open_file, make_str -import networkx as nx - -def generate_edgelist(G, delimiter=' ', data=True): - """Generate a single line of the graph G in edge list format. - - Parameters - ---------- - G : NetworkX graph - - delimiter : string, optional - Separator for node labels - - data : bool or list of keys - If False generate no edge data. If True use a dictionary - representation of edge data. If a list of keys use a list of data - values corresponding to the keys. - - Returns - ------- - lines : string - Lines of data in adjlist format. - - Examples - -------- - >>> G = nx.lollipop_graph(4, 3) - >>> G[1][2]['weight'] = 3 - >>> G[3][4]['capacity'] = 12 - >>> for line in nx.generate_edgelist(G, data=False): - ... print(line) - 0 1 - 0 2 - 0 3 - 1 2 - 1 3 - 2 3 - 3 4 - 4 5 - 5 6 - - >>> for line in nx.generate_edgelist(G): - ... print(line) - 0 1 {} - 0 2 {} - 0 3 {} - 1 2 {'weight': 3} - 1 3 {} - 2 3 {} - 3 4 {'capacity': 12} - 4 5 {} - 5 6 {} - - >>> for line in nx.generate_edgelist(G,data=['weight']): - ... print(line) - 0 1 - 0 2 - 0 3 - 1 2 3 - 1 3 - 2 3 - 3 4 - 4 5 - 5 6 - - See Also - -------- - write_adjlist, read_adjlist - """ - if data is True or data is False: - for e in G.edges(data=data): - yield delimiter.join(map(make_str,e)) - else: - for u,v,d in G.edges(data=True): - e=[u,v] - try: - e.extend(d[k] for k in data) - except KeyError: - pass # missing data for this edge, should warn? - yield delimiter.join(map(make_str,e)) - -@open_file(1,mode='wb') -def write_edgelist(G, path, comments="#", delimiter=' ', data=True, - encoding = 'utf-8'): - """Write graph as a list of edges. - - Parameters - ---------- - G : graph - A NetworkX graph - path : file or string - File or filename to write. If a file is provided, it must be - opened in 'wb' mode. Filenames ending in .gz or .bz2 will be compressed. - comments : string, optional - The character used to indicate the start of a comment - delimiter : string, optional - The string used to separate values. The default is whitespace. - data : bool or list, optional - If False write no edge data. - If True write a string representation of the edge data dictionary.. - If a list (or other iterable) is provided, write the keys specified - in the list. - encoding: string, optional - Specify which encoding to use when writing file. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_edgelist(G, "test.edgelist") - >>> G=nx.path_graph(4) - >>> fh=open("test.edgelist",'wb') - >>> nx.write_edgelist(G, fh) - >>> nx.write_edgelist(G, "test.edgelist.gz") - >>> nx.write_edgelist(G, "test.edgelist.gz", data=False) - - >>> G=nx.Graph() - >>> G.add_edge(1,2,weight=7,color='red') - >>> nx.write_edgelist(G,'test.edgelist',data=False) - >>> nx.write_edgelist(G,'test.edgelist',data=['color']) - >>> nx.write_edgelist(G,'test.edgelist',data=['color','weight']) - - See Also - -------- - write_edgelist() - write_weighted_edgelist() - """ - - for line in generate_edgelist(G, delimiter, data): - line+='\n' - path.write(line.encode(encoding)) - -def parse_edgelist(lines, comments='#', delimiter=None, - create_using=None, nodetype=None, data=True): - """Parse lines of an edge list representation of a graph. - - - Returns - ------- - G: NetworkX Graph - The graph corresponding to lines - data : bool or list of (label,type) tuples - If False generate no edge data or if True use a dictionary - representation of edge data or a list tuples specifying dictionary - key names and types for edge data. - create_using: NetworkX graph container, optional - Use given NetworkX graph for holding nodes or edges. - nodetype : Python type, optional - Convert nodes to this type. - comments : string, optional - Marker for comment lines - delimiter : string, optional - Separator for node labels - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - Examples - -------- - Edgelist with no data: - - >>> lines = ["1 2", - ... "2 3", - ... "3 4"] - >>> G = nx.parse_edgelist(lines, nodetype = int) - >>> G.nodes() - [1, 2, 3, 4] - >>> G.edges() - [(1, 2), (2, 3), (3, 4)] - - Edgelist with data in Python dictionary representation: - - >>> lines = ["1 2 {'weight':3}", - ... "2 3 {'weight':27}", - ... "3 4 {'weight':3.0}"] - >>> G = nx.parse_edgelist(lines, nodetype = int) - >>> G.nodes() - [1, 2, 3, 4] - >>> G.edges(data = True) - [(1, 2, {'weight': 3}), (2, 3, {'weight': 27}), (3, 4, {'weight': 3.0})] - - Edgelist with data in a list: - - >>> lines = ["1 2 3", - ... "2 3 27", - ... "3 4 3.0"] - >>> G = nx.parse_edgelist(lines, nodetype = int, data=(('weight',float),)) - >>> G.nodes() - [1, 2, 3, 4] - >>> G.edges(data = True) - [(1, 2, {'weight': 3.0}), (2, 3, {'weight': 27.0}), (3, 4, {'weight': 3.0})] - - See Also - -------- - read_weighted_edgelist - - """ - from ast import literal_eval - if create_using is None: - G=nx.Graph() - else: - try: - G=create_using - G.clear() - except: - raise TypeError("create_using input is not a NetworkX graph type") - - for line in lines: - p=line.find(comments) - if p>=0: - line = line[:p] - if not len(line): - continue - # split line, should have 2 or more - s=line.strip().split(delimiter) - if len(s)<2: - continue - u=s.pop(0) - v=s.pop(0) - d=s - if nodetype is not None: - try: - u=nodetype(u) - v=nodetype(v) - except: - raise TypeError("Failed to convert nodes %s,%s to type %s." - %(u,v,nodetype)) - - if len(d)==0 or data is False: - # no data or data type specified - edgedata={} - elif data is True: - # no edge types specified - try: # try to evaluate as dictionary - edgedata=dict(literal_eval(' '.join(d))) - except: - raise TypeError( - "Failed to convert edge data (%s) to dictionary."%(d)) - else: - # convert edge data to dictionary with specified keys and type - if len(d)!=len(data): - raise IndexError( - "Edge data %s and data_keys %s are not the same length"% - (d, data)) - edgedata={} - for (edge_key,edge_type),edge_value in zip(data,d): - try: - edge_value=edge_type(edge_value) - except: - raise TypeError( - "Failed to convert %s data %s to type %s." - %(edge_key, edge_value, edge_type)) - edgedata.update({edge_key:edge_value}) - G.add_edge(u, v, attr_dict=edgedata) - return G - -@open_file(0,mode='rb') -def read_edgelist(path, comments="#", delimiter=None, create_using=None, - nodetype=None, data=True, edgetype=None, encoding='utf-8'): - """Read a graph from a list of edges. - - Parameters - ---------- - path : file or string - File or filename to write. If a file is provided, it must be - opened in 'rb' mode. - Filenames ending in .gz or .bz2 will be uncompressed. - comments : string, optional - The character used to indicate the start of a comment. - delimiter : string, optional - The string used to separate values. The default is whitespace. - create_using : Graph container, optional, - Use specified container to build graph. The default is networkx.Graph, - an undirected graph. - nodetype : int, float, str, Python type, optional - Convert node data from strings to specified type - data : bool or list of (label,type) tuples - Tuples specifying dictionary key names and types for edge data - edgetype : int, float, str, Python type, optional OBSOLETE - Convert edge data from strings to specified type and use as 'weight' - encoding: string, optional - Specify which encoding to use when reading file. - - Returns - ------- - G : graph - A networkx Graph or other type specified with create_using - - Examples - -------- - >>> nx.write_edgelist(nx.path_graph(4), "test.edgelist") - >>> G=nx.read_edgelist("test.edgelist") - - >>> fh=open("test.edgelist", 'rb') - >>> G=nx.read_edgelist(fh) - >>> fh.close() - - >>> G=nx.read_edgelist("test.edgelist", nodetype=int) - >>> G=nx.read_edgelist("test.edgelist",create_using=nx.DiGraph()) - - Edgelist with data in a list: - - >>> textline = '1 2 3' - >>> fh = open('test.edgelist','w') - >>> d = fh.write(textline) - >>> fh.close() - >>> G = nx.read_edgelist('test.edgelist', nodetype=int, data=(('weight',float),)) - >>> G.nodes() - [1, 2] - >>> G.edges(data = True) - [(1, 2, {'weight': 3.0})] - - See parse_edgelist() for more examples of formatting. - - See Also - -------- - parse_edgelist - - Notes - ----- - Since nodes must be hashable, the function nodetype must return hashable - types (e.g. int, float, str, frozenset - or tuples of those, etc.) - """ - lines = (line.decode(encoding) for line in path) - return parse_edgelist(lines,comments=comments, delimiter=delimiter, - create_using=create_using, nodetype=nodetype, - data=data) - - -def write_weighted_edgelist(G, path, comments="#", - delimiter=' ', encoding='utf-8'): - """Write graph G as a list of edges with numeric weights. - - Parameters - ---------- - G : graph - A NetworkX graph - path : file or string - File or filename to write. If a file is provided, it must be - opened in 'wb' mode. - Filenames ending in .gz or .bz2 will be compressed. - comments : string, optional - The character used to indicate the start of a comment - delimiter : string, optional - The string used to separate values. The default is whitespace. - encoding: string, optional - Specify which encoding to use when writing file. - - Examples - -------- - >>> G=nx.Graph() - >>> G.add_edge(1,2,weight=7) - >>> nx.write_weighted_edgelist(G, 'test.weighted.edgelist') - - See Also - -------- - read_edgelist() - write_edgelist() - write_weighted_edgelist() - - """ - write_edgelist(G,path, comments=comments, delimiter=delimiter, - data=('weight',), encoding = encoding) - -def read_weighted_edgelist(path, comments="#", delimiter=None, - create_using=None, nodetype=None, encoding='utf-8'): - - """Read a graph as list of edges with numeric weights. - - Parameters - ---------- - path : file or string - File or filename to write. If a file is provided, it must be - opened in 'rb' mode. - Filenames ending in .gz or .bz2 will be uncompressed. - comments : string, optional - The character used to indicate the start of a comment. - delimiter : string, optional - The string used to separate values. The default is whitespace. - create_using : Graph container, optional, - Use specified container to build graph. The default is networkx.Graph, - an undirected graph. - nodetype : int, float, str, Python type, optional - Convert node data from strings to specified type - encoding: string, optional - Specify which encoding to use when reading file. - - Returns - ------- - G : graph - A networkx Graph or other type specified with create_using - - Notes - ----- - Since nodes must be hashable, the function nodetype must return hashable - types (e.g. int, float, str, frozenset - or tuples of those, etc.) - - Example edgelist file format. - - With numeric edge data:: - - # read with - # >>> G=nx.read_weighted_edgelist(fh) - # source target data - a b 1 - a c 3.14159 - d e 42 - """ - return read_edgelist(path, - comments=comments, - delimiter=delimiter, - create_using=create_using, - nodetype=nodetype, - data=(('weight',float),), - encoding = encoding - ) - - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.edgelist') - os.unlink('test.edgelist.gz') - os.unlink('test.weighted.edgelist') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gexf.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gexf.py deleted file mode 100644 index 88503ac..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gexf.py +++ /dev/null @@ -1,926 +0,0 @@ -""" -**** -GEXF -**** -Read and write graphs in GEXF format. - -GEXF (Graph Exchange XML Format) is a language for describing complex -network structures, their associated data and dynamics. - -This implementation does not support mixed graphs (directed and -undirected edges together). - -Format ------- -GEXF is an XML format. See http://gexf.net/format/schema.html for the -specification and http://gexf.net/format/basic.html for examples. -""" -# Copyright (C) 2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -# Based on GraphML NetworkX GraphML reader -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['write_gexf', 'read_gexf', 'relabel_gexf_graph', 'generate_gexf'] -import itertools -import networkx as nx -from networkx.utils import open_file, make_str -try: - from xml.etree.cElementTree import Element, ElementTree, tostring -except ImportError: - try: - from xml.etree.ElementTree import Element, ElementTree, tostring - except ImportError: - pass - -@open_file(1,mode='wb') -def write_gexf(G, path, encoding='utf-8',prettyprint=True,version='1.1draft'): - """Write G in GEXF format to path. - - "GEXF (Graph Exchange XML Format) is a language for describing - complex networks structures, their associated data and dynamics" [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - path : file or string - File or file name to write. - File names ending in .gz or .bz2 will be compressed. - encoding : string (optional) - Encoding for text data. - prettyprint : bool (optional) - If True use line breaks and indenting in output XML. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_gexf(G, "test.gexf") - - Notes - ----- - This implementation does not support mixed graphs (directed and undirected - edges together). - - The node id attribute is set to be the string of the node label. - If you want to specify an id use set it as node data, e.g. - node['a']['id']=1 to set the id of node 'a' to 1. - - References - ---------- - .. [1] GEXF graph format, http://gexf.net/format/ - """ - writer = GEXFWriter(encoding=encoding,prettyprint=prettyprint, - version=version) - writer.add_graph(G) - writer.write(path) - -def generate_gexf(G, encoding='utf-8',prettyprint=True,version='1.1draft'): - """Generate lines of GEXF format representation of G" - - "GEXF (Graph Exchange XML Format) is a language for describing - complex networks structures, their associated data and dynamics" [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - encoding : string (optional) - Encoding for text data. - prettyprint : bool (optional) - If True use line breaks and indenting in output XML. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> linefeed=chr(10) # linefeed=\n - >>> s=linefeed.join(nx.generate_gexf(G)) # doctest: +SKIP - >>> for line in nx.generate_gexf(G): # doctest: +SKIP - ... print line - - Notes - ----- - This implementation does not support mixed graphs (directed and undirected - edges together). - - The node id attribute is set to be the string of the node label. - If you want to specify an id use set it as node data, e.g. - node['a']['id']=1 to set the id of node 'a' to 1. - - References - ---------- - .. [1] GEXF graph format, http://gexf.net/format/ - """ - writer = GEXFWriter(encoding=encoding,prettyprint=prettyprint, - version=version) - writer.add_graph(G) - for line in str(writer).splitlines(): - yield line - -@open_file(0,mode='rb') -def read_gexf(path,node_type=None,relabel=False,version='1.1draft'): - """Read graph in GEXF format from path. - - "GEXF (Graph Exchange XML Format) is a language for describing - complex networks structures, their associated data and dynamics" [1]_. - - Parameters - ---------- - path : file or string - File or file name to write. - File names ending in .gz or .bz2 will be compressed. - - node_type: Python type (default: None) - Convert node ids to this type if not None. - - relabel : bool (default: False) - If True relabel the nodes to use the GEXF node "label" attribute - instead of the node "id" attribute as the NetworkX node label. - - Returns - ------- - graph: NetworkX graph - If no parallel edges are found a Graph or DiGraph is returned. - Otherwise a MultiGraph or MultiDiGraph is returned. - - Notes - ----- - This implementation does not support mixed graphs (directed and undirected - edges together). - - References - ---------- - .. [1] GEXF graph format, http://gexf.net/format/ - """ - reader = GEXFReader(node_type=node_type,version=version) - if relabel: - G=relabel_gexf_graph(reader(path)) - else: - G=reader(path) - return G - -class GEXF(object): -# global register_namespace - - versions={} - d={'NS_GEXF':"http://www.gexf.net/1.1draft", - 'NS_VIZ':"http://www.gexf.net/1.1draft/viz", - 'NS_XSI':"http://www.w3.org/2001/XMLSchema-instance", - 'SCHEMALOCATION':' '.join(['http://www.gexf.net/1.1draft', - 'http://www.gexf.net/1.1draft/gexf.xsd' - ]), - 'VERSION':'1.1' - } - versions['1.1draft']=d - d={'NS_GEXF':"http://www.gexf.net/1.2draft", - 'NS_VIZ':"http://www.gexf.net/1.2draft/viz", - 'NS_XSI':"http://www.w3.org/2001/XMLSchema-instance", - 'SCHEMALOCATION':' '.join(['http://www.gexf.net/1.2draft', - 'http://www.gexf.net/1.2draft/gexf.xsd' - ]), - 'VERSION':'1.2' - } - versions['1.2draft']=d - - - types=[(int,"integer"), - (float,"float"), - (float,"double"), - (bool,"boolean"), - (list,"string"), - (dict,"string"), - ] - - try: # Python 3.x - blurb = chr(1245) # just to trigger the exception - types.extend([ - (str,"liststring"), - (str,"anyURI"), - (str,"string")]) - except ValueError: # Python 2.6+ - types.extend([ - (str,"liststring"), - (str,"anyURI"), - (str,"string"), - (unicode,"liststring"), - (unicode,"anyURI"), - (unicode,"string")]) - - xml_type = dict(types) - python_type = dict(reversed(a) for a in types) - convert_bool={'true':True,'false':False} - -# try: -# register_namespace = ET.register_namespace -# except AttributeError: -# def register_namespace(prefix, uri): -# ET._namespace_map[uri] = prefix - - - def set_version(self,version): - d=self.versions.get(version) - if d is None: - raise nx.NetworkXError('Unknown GEXF version %s'%version) - self.NS_GEXF = d['NS_GEXF'] - self.NS_VIZ = d['NS_VIZ'] - self.NS_XSI = d['NS_XSI'] - self.SCHEMALOCATION = d['NS_XSI'] - self.VERSION=d['VERSION'] - self.version=version - -# register_namespace('viz', d['NS_VIZ']) - - -class GEXFWriter(GEXF): - # class for writing GEXF format files - # use write_gexf() function - def __init__(self, graph=None, encoding="utf-8", - mode='static',prettyprint=True, - version='1.1draft'): - try: - import xml.etree.ElementTree - except ImportError: - raise ImportError('GEXF writer requires ' - 'xml.elementtree.ElementTree') - self.prettyprint=prettyprint - self.mode=mode - self.encoding = encoding - self.set_version(version) - self.xml = Element("gexf", - {'xmlns':self.NS_GEXF, - 'xmlns:xsi':self.NS_XSI, - 'xmlns:viz':self.NS_VIZ, - 'xsi:schemaLocation':self.SCHEMALOCATION, - 'version':self.VERSION}) - - # counters for edge and attribute identifiers - self.edge_id=itertools.count() - self.attr_id=itertools.count() - # default attributes are stored in dictionaries - self.attr={} - self.attr['node']={} - self.attr['edge']={} - self.attr['node']['dynamic']={} - self.attr['node']['static']={} - self.attr['edge']['dynamic']={} - self.attr['edge']['static']={} - - if graph is not None: - self.add_graph(graph) - - def __str__(self): - if self.prettyprint: - self.indent(self.xml) - s=tostring(self.xml).decode(self.encoding) - return s - - def add_graph(self, G): - # Add a graph element to the XML - if G.is_directed(): - default='directed' - else: - default='undirected' - graph_element = Element("graph",defaultedgetype=default,mode=self.mode) - self.graph_element=graph_element - self.add_nodes(G,graph_element) - self.add_edges(G,graph_element) - self.xml.append(graph_element) - - - def add_nodes(self, G, graph_element): - nodes_element = Element('nodes') - for node,data in G.nodes_iter(data=True): - node_data=data.copy() - node_id = make_str(node_data.pop('id', node)) - kw={'id':node_id} - label = make_str(node_data.pop('label', node)) - kw['label']=label - try: - pid=node_data.pop('pid') - kw['pid'] = make_str(pid) - except KeyError: - pass - - # add node element with attributes - node_element = Element("node", **kw) - - # add node element and attr subelements - default=G.graph.get('node_default',{}) - node_data=self.add_parents(node_element, node_data) - if self.version=='1.1': - node_data=self.add_slices(node_element, node_data) - else: - node_data=self.add_spells(node_element, node_data) - node_data=self.add_viz(node_element,node_data) - node_data=self.add_attributes("node", node_element, - node_data, default) - nodes_element.append(node_element) - graph_element.append(nodes_element) - - - def add_edges(self, G, graph_element): - def edge_key_data(G): - # helper function to unify multigraph and graph edge iterator - if G.is_multigraph(): - for u,v,key,data in G.edges_iter(data=True,keys=True): - edge_data=data.copy() - edge_data.update(key=key) - edge_id=edge_data.pop('id',None) - if edge_id is None: - edge_id=next(self.edge_id) - yield u,v,edge_id,edge_data - else: - for u,v,data in G.edges_iter(data=True): - edge_data=data.copy() - edge_id=edge_data.pop('id',None) - if edge_id is None: - edge_id=next(self.edge_id) - yield u,v,edge_id,edge_data - - edges_element = Element('edges') - for u,v,key,edge_data in edge_key_data(G): - kw={'id':make_str(key)} - try: - edge_weight=edge_data.pop('weight') - kw['weight']=make_str(edge_weight) - except KeyError: - pass - try: - edge_type=edge_data.pop('type') - kw['type']=make_str(edge_type) - except KeyError: - pass - source_id = make_str(G.node[u].get('id', u)) - target_id = make_str(G.node[v].get('id', v)) - edge_element = Element("edge", - source=source_id,target=target_id, - **kw) - default=G.graph.get('edge_default',{}) - edge_data=self.add_viz(edge_element,edge_data) - edge_data=self.add_attributes("edge", edge_element, - edge_data, default) - edges_element.append(edge_element) - graph_element.append(edges_element) - - - def add_attributes(self, node_or_edge, xml_obj, data, default): - # Add attrvalues to node or edge - attvalues=Element('attvalues') - if len(data)==0: - return data - if 'start' in data or 'end' in data: - mode='dynamic' - else: - mode='static' - for k,v in data.items(): - # rename generic multigraph key to avoid any name conflict - if k == 'key': - k='networkx_key' - attr_id = self.get_attr_id(make_str(k), self.xml_type[type(v)], - node_or_edge, default, mode) - if type(v)==list: - # dynamic data - for val,start,end in v: - e=Element("attvalue") - e.attrib['for']=attr_id - e.attrib['value']=make_str(val) - if start is not None: - e.attrib['start']=make_str(start) - if end is not None: - e.attrib['end']=make_str(end) - attvalues.append(e) - else: - # static data - e=Element("attvalue") - e.attrib['for']=attr_id - e.attrib['value']=make_str(v) - attvalues.append(e) - xml_obj.append(attvalues) - return data - - def get_attr_id(self, title, attr_type, edge_or_node, default, mode): - # find the id of the attribute or generate a new id - try: - return self.attr[edge_or_node][mode][title] - except KeyError: - # generate new id - new_id=str(next(self.attr_id)) - self.attr[edge_or_node][mode][title] = new_id - attr_kwargs = {"id":new_id, "title":title, "type":attr_type} - attribute=Element("attribute",**attr_kwargs) - # add subelement for data default value if present - default_title=default.get(title) - if default_title is not None: - default_element=Element("default") - default_element.text=make_str(default_title) - attribute.append(default_element) - # new insert it into the XML - attributes_element=None - for a in self.graph_element.findall("attributes"): - # find existing attributes element by class and mode - a_class=a.get('class') - a_mode=a.get('mode','static') # default mode is static - if a_class==edge_or_node and a_mode==mode: - attributes_element=a - if attributes_element is None: - # create new attributes element - attr_kwargs = {"mode":mode,"class":edge_or_node} - attributes_element=Element('attributes', **attr_kwargs) - self.graph_element.insert(0,attributes_element) - attributes_element.append(attribute) - return new_id - - - def add_viz(self,element,node_data): - viz=node_data.pop('viz',False) - if viz: - color=viz.get('color') - if color is not None: - if self.VERSION=='1.1': - e=Element("{%s}color"%self.NS_VIZ, - r=str(color.get('r')), - g=str(color.get('g')), - b=str(color.get('b')), - ) - else: - e=Element("{%s}color"%self.NS_VIZ, - r=str(color.get('r')), - g=str(color.get('g')), - b=str(color.get('b')), - a=str(color.get('a')), - ) - element.append(e) - - size=viz.get('size') - if size is not None: - e=Element("{%s}size"%self.NS_VIZ,value=str(size)) - element.append(e) - - thickness=viz.get('thickness') - if thickness is not None: - e=Element("{%s}thickness"%self.NS_VIZ,value=str(thickness)) - element.append(e) - - shape=viz.get('shape') - if shape is not None: - if shape.startswith('http'): - e=Element("{%s}shape"%self.NS_VIZ, - value='image',uri=str(shape)) - else: - e=Element("{%s}shape"%self.NS_VIZ,value=str(shape)) - element.append(e) - - position=viz.get('position') - if position is not None: - e=Element("{%s}position"%self.NS_VIZ, - x=str(position.get('x')), - y=str(position.get('y')), - z=str(position.get('z')), - ) - element.append(e) - return node_data - - def add_parents(self,node_element,node_data): - parents=node_data.pop('parents',False) - if parents: - parents_element=Element('parents') - for p in parents: - e=Element('parent') - e.attrib['for']=str(p) - parents_element.append(e) - node_element.append(parents_element) - return node_data - - def add_slices(self,node_element,node_data): - slices=node_data.pop('slices',False) - if slices: - slices_element=Element('slices') - for start,end in slices: - e=Element('slice',start=str(start),end=str(end)) - slices_element.append(e) - node_element.append(slices_element) - return node_data - - - def add_spells(self,node_element,node_data): - spells=node_data.pop('spells',False) - if spells: - spells_element=Element('spells') - for start,end in spells: - e=Element('spell') - if start is not None: - e.attrib['start']=make_str(start) - if end is not None: - e.attrib['end']=make_str(end) - spells_element.append(e) - node_element.append(spells_element) - return node_data - - - def write(self, fh): - # Serialize graph G in GEXF to the open fh - if self.prettyprint: - self.indent(self.xml) - document = ElementTree(self.xml) - header='<?xml version="1.0" encoding="%s"?>'%self.encoding - fh.write(header.encode(self.encoding)) - document.write(fh, encoding=self.encoding) - - - def indent(self, elem, level=0): - # in-place prettyprint formatter - i = "\n" + level*" " - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + " " - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - self.indent(elem, level+1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i - - -class GEXFReader(GEXF): - # Class to read GEXF format files - # use read_gexf() function - def __init__(self, node_type=None,version='1.1draft'): - try: - import xml.etree.ElementTree - except ImportError: - raise ImportError('GEXF reader requires ' - 'xml.elementtree.ElementTree') - self.node_type=node_type - # assume simple graph and test for multigraph on read - self.simple_graph=True - self.set_version(version) - - def __call__(self, stream): - self.xml = ElementTree(file=stream) - g=self.xml.find("{%s}graph" % self.NS_GEXF) - if g is not None: - return self.make_graph(g) - # try all the versions - for version in self.versions: - self.set_version(version) - g=self.xml.find("{%s}graph" % self.NS_GEXF) - if g is not None: - return self.make_graph(g) - raise nx.NetworkXError("No <graph> element in GEXF file") - - - def make_graph(self, graph_xml): - # mode is "static" or "dynamic" - graph_mode = graph_xml.get("mode", "") - self.dynamic=(graph_mode=='dynamic') - - # start with empty DiGraph or MultiDiGraph - edgedefault = graph_xml.get("defaultedgetype", None) - if edgedefault=='directed': - G=nx.MultiDiGraph() - else: - G=nx.MultiGraph() - - # graph attributes - graph_start=graph_xml.get('start') - if graph_start is not None: - G.graph['start']=graph_start - graph_end=graph_xml.get('end') - if graph_end is not None: - G.graph['end']=graph_end - - # node and edge attributes - attributes_elements=graph_xml.findall("{%s}attributes"%self.NS_GEXF) - # dictionaries to hold attributes and attribute defaults - node_attr={} - node_default={} - edge_attr={} - edge_default={} - for a in attributes_elements: - attr_class = a.get("class") - if attr_class=='node': - na,nd = self.find_gexf_attributes(a) - node_attr.update(na) - node_default.update(nd) - G.graph['node_default']=node_default - elif attr_class=='edge': - ea,ed = self.find_gexf_attributes(a) - edge_attr.update(ea) - edge_default.update(ed) - G.graph['edge_default']=edge_default - else: - raise # unknown attribute class - - # Hack to handle Gephi0.7beta bug - # add weight attribute - ea={'weight':{'type': 'double', 'mode': 'static', 'title': 'weight'}} - ed={} - edge_attr.update(ea) - edge_default.update(ed) - G.graph['edge_default']=edge_default - - # add nodes - nodes_element=graph_xml.find("{%s}nodes" % self.NS_GEXF) - if nodes_element is not None: - for node_xml in nodes_element.findall("{%s}node" % self.NS_GEXF): - self.add_node(G, node_xml, node_attr) - - # add edges - edges_element=graph_xml.find("{%s}edges" % self.NS_GEXF) - if edges_element is not None: - for edge_xml in edges_element.findall("{%s}edge" % self.NS_GEXF): - self.add_edge(G, edge_xml, edge_attr) - - # switch to Graph or DiGraph if no parallel edges were found. - if self.simple_graph: - if G.is_directed(): - G=nx.DiGraph(G) - else: - G=nx.Graph(G) - return G - - def add_node(self, G, node_xml, node_attr, node_pid=None): - # add a single node with attributes to the graph - - # get attributes and subattributues for node - data = self.decode_attr_elements(node_attr, node_xml) - data = self.add_parents(data, node_xml) # add any parents - if self.version=='1.1': - data = self.add_slices(data, node_xml) # add slices - else: - data = self.add_spells(data, node_xml) # add spells - data = self.add_viz(data, node_xml) # add viz - data = self.add_start_end(data, node_xml) # add start/end - - # find the node id and cast it to the appropriate type - node_id = node_xml.get("id") - if self.node_type is not None: - node_id=self.node_type(node_id) - - # every node should have a label - node_label = node_xml.get("label") - data['label']=node_label - - # parent node id - node_pid = node_xml.get("pid", node_pid) - if node_pid is not None: - data['pid']=node_pid - - # check for subnodes, recursive - subnodes=node_xml.find("{%s}nodes" % self.NS_GEXF) - if subnodes is not None: - for node_xml in subnodes.findall("{%s}node" % self.NS_GEXF): - self.add_node(G, node_xml, node_attr, node_pid=node_id) - - G.add_node(node_id, data) - - def add_start_end(self, data, xml): - # start and end times - node_start = xml.get("start") - if node_start is not None: - data['start']=node_start - node_end = xml.get("end") - if node_end is not None: - data['end']=node_end - return data - - - def add_viz(self, data, node_xml): - # add viz element for node - viz={} - color=node_xml.find("{%s}color"%self.NS_VIZ) - if color is not None: - if self.VERSION=='1.1': - viz['color']={'r':int(color.get('r')), - 'g':int(color.get('g')), - 'b':int(color.get('b'))} - else: - viz['color']={'r':int(color.get('r')), - 'g':int(color.get('g')), - 'b':int(color.get('b')), - 'a':float(color.get('a', 1)), - } - - size=node_xml.find("{%s}size"%self.NS_VIZ) - if size is not None: - viz['size']=float(size.get('value')) - - thickness=node_xml.find("{%s}thickness"%self.NS_VIZ) - if thickness is not None: - viz['thickness']=float(thickness.get('value')) - - shape=node_xml.find("{%s}shape"%self.NS_VIZ) - if shape is not None: - viz['shape']=shape.get('shape') - if viz['shape']=='image': - viz['shape']=shape.get('uri') - - position=node_xml.find("{%s}position"%self.NS_VIZ) - if position is not None: - viz['position']={'x':float(position.get('x',0)), - 'y':float(position.get('y',0)), - 'z':float(position.get('z',0))} - - if len(viz)>0: - data['viz']=viz - return data - - def add_parents(self, data, node_xml): - parents_element=node_xml.find("{%s}parents"%self.NS_GEXF) - if parents_element is not None: - data['parents']=[] - for p in parents_element.findall("{%s}parent"%self.NS_GEXF): - parent=p.get('for') - data['parents'].append(parent) - return data - - def add_slices(self, data, node_xml): - slices_element=node_xml.find("{%s}slices"%self.NS_GEXF) - if slices_element is not None: - data['slices']=[] - for s in slices_element.findall("{%s}slice"%self.NS_GEXF): - start=s.get('start') - end=s.get('end') - data['slices'].append((start,end)) - return data - - def add_spells(self, data, node_xml): - spells_element=node_xml.find("{%s}spells"%self.NS_GEXF) - if spells_element is not None: - data['spells']=[] - for s in spells_element.findall("{%s}spell"%self.NS_GEXF): - start=s.get('start') - end=s.get('end') - data['spells'].append((start,end)) - return data - - - def add_edge(self, G, edge_element, edge_attr): - # add an edge to the graph - - # raise error if we find mixed directed and undirected edges - edge_direction = edge_element.get("type") - if G.is_directed() and edge_direction=='undirected': - raise nx.NetworkXError(\ - "Undirected edge found in directed graph.") - if (not G.is_directed()) and edge_direction=='directed': - raise nx.NetworkXError(\ - "Directed edge found in undirected graph.") - - # Get source and target and recast type if required - source = edge_element.get("source") - target = edge_element.get("target") - if self.node_type is not None: - source=self.node_type(source) - target=self.node_type(target) - - data = self.decode_attr_elements(edge_attr, edge_element) - data = self.add_start_end(data,edge_element) - - # GEXF stores edge ids as an attribute - # NetworkX uses them as keys in multigraphs - # if networkx_key is not specified as an attribute - edge_id = edge_element.get("id") - if edge_id is not None: - data["id"] = edge_id - - # check if there is a 'multigraph_key' and use that as edge_id - multigraph_key = data.pop('networkx_key',None) - if multigraph_key is not None: - edge_id=multigraph_key - - weight = edge_element.get('weight') - if weight is not None: - data['weight']=float(weight) - - edge_label = edge_element.get("label") - if edge_label is not None: - data['label']=edge_label - - - - if G.has_edge(source,target): - # seen this edge before - this is a multigraph - self.simple_graph=False - G.add_edge(source, target, key=edge_id, **data) - if edge_direction=='mutual': - G.add_edge(target, source, key=edge_id, **data) - - def decode_attr_elements(self, gexf_keys, obj_xml): - # Use the key information to decode the attr XML - attr = {} - # look for outer "<attvalues>" element - attr_element=obj_xml.find("{%s}attvalues" % self.NS_GEXF) - if attr_element is not None: - # loop over <attvalue> elements - for a in attr_element.findall("{%s}attvalue" % self.NS_GEXF): - key = a.get('for') # for is required - try: # should be in our gexf_keys dictionary - title=gexf_keys[key]['title'] - except KeyError: - raise nx.NetworkXError("No attribute defined for=%s"%key) - atype=gexf_keys[key]['type'] - value=a.get('value') - if atype=='boolean': - value=self.convert_bool[value] - else: - value=self.python_type[atype](value) - if gexf_keys[key]['mode']=='dynamic': - # for dynamic graphs use list of three-tuples - # [(value1,start1,end1), (value2,start2,end2), etc] - start=a.get('start') - end=a.get('end') - if title in attr: - attr[title].append((value,start,end)) - else: - attr[title]=[(value,start,end)] - else: - # for static graphs just assign the value - attr[title] = value - return attr - - def find_gexf_attributes(self, attributes_element): - # Extract all the attributes and defaults - attrs = {} - defaults = {} - mode=attributes_element.get('mode') - for k in attributes_element.findall("{%s}attribute" % self.NS_GEXF): - attr_id = k.get("id") - title=k.get('title') - atype=k.get('type') - attrs[attr_id]={'title':title,'type':atype,'mode':mode} - # check for the "default" subelement of key element and add - default=k.find("{%s}default" % self.NS_GEXF) - if default is not None: - if atype=='boolean': - value=self.convert_bool[default.text] - else: - value=self.python_type[atype](default.text) - defaults[title]=value - return attrs,defaults - - -def relabel_gexf_graph(G): - """Relabel graph using "label" node keyword for node label. - - Parameters - ---------- - G : graph - A NetworkX graph read from GEXF data - - Returns - ------- - H : graph - A NetworkX graph with relabed nodes - - Notes - ----- - This function relabels the nodes in a NetworkX graph with the - "label" attribute. It also handles relabeling the specific GEXF - node attributes "parents", and "pid". - """ - # build mapping of node labels, do some error checking - try: - mapping=[(u,G.node[u]['label']) for u in G] - except KeyError: - raise nx.NetworkXError('Failed to relabel nodes: ' - 'missing node labels found. ' - 'Use relabel=False.') - x,y=zip(*mapping) - if len(set(y))!=len(G): - raise nx.NetworkXError('Failed to relabel nodes: ' - 'duplicate node labels found. ' - 'Use relabel=False.') - mapping=dict(mapping) - H=nx.relabel_nodes(G,mapping) - # relabel attributes - for n in G: - m=mapping[n] - H.node[m]['id']=n - H.node[m].pop('label') - if 'pid' in H.node[m]: - H.node[m]['pid']=mapping[G.node[n]['pid']] - if 'parents' in H.node[m]: - H.node[m]['parents']=[mapping[p] for p in G.node[n]['parents']] - return H - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import xml.etree.cElementTree - except: - raise SkipTest("xml.etree.cElementTree not available") - -# fixture for nose tests -def teardown_module(module): - import os - try: - os.unlink('test.gexf') - except: - pass diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gml.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gml.py deleted file mode 100644 index d248eb4..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gml.py +++ /dev/null @@ -1,410 +0,0 @@ -""" -Read graphs in GML format. - -"GML, the G>raph Modelling Language, is our proposal for a portable -file format for graphs. GML's key features are portability, simple -syntax, extensibility and flexibility. A GML file consists of a -hierarchical key-value lists. Graphs can be annotated with arbitrary -data structures. The idea for a common file format was born at the -GD'95; this proposal is the outcome of many discussions. GML is the -standard file format in the Graphlet graph editor system. It has been -overtaken and adapted by several other systems for drawing graphs." - -See http://www.infosun.fim.uni-passau.de/Graphlet/GML/gml-tr.html - -Requires pyparsing: http://pyparsing.wikispaces.com/ - -Format ------- -See http://www.infosun.fim.uni-passau.de/Graphlet/GML/gml-tr.html -for format specification. - -Example graphs in GML format: -http://www-personal.umich.edu/~mejn/netdata/ -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -# Copyright (C) 2008-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['read_gml', 'parse_gml', 'generate_gml', 'write_gml'] - -import networkx as nx -from networkx.exception import NetworkXError -from networkx.utils import is_string_like, open_file - - -@open_file(0,mode='rb') -def read_gml(path,encoding='UTF-8',relabel=False): - """Read graph in GML format from path. - - Parameters - ---------- - path : filename or filehandle - The filename or filehandle to read from. - - encoding : string, optional - Text encoding. - - relabel : bool, optional - If True use the GML node label attribute for node names otherwise use - the node id. - - Returns - ------- - G : MultiGraph or MultiDiGraph - - Raises - ------ - ImportError - If the pyparsing module is not available. - - See Also - -------- - write_gml, parse_gml - - Notes - ----- - Requires pyparsing: http://pyparsing.wikispaces.com/ - - References - ---------- - GML specification: - http://www.infosun.fim.uni-passau.de/Graphlet/GML/gml-tr.html - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_gml(G,'test.gml') - >>> H=nx.read_gml('test.gml') - """ - lines=(line.decode(encoding) for line in path) - G=parse_gml(lines,relabel=relabel) - return G - -def parse_gml(lines, relabel=True): - """Parse GML graph from a string or iterable. - - Parameters - ---------- - lines : string or iterable - Data in GML format. - - relabel : bool, optional - If True use the GML node label attribute for node names otherwise use - the node id. - - Returns - ------- - G : MultiGraph or MultiDiGraph - - Raises - ------ - ImportError - If the pyparsing module is not available. - - See Also - -------- - write_gml, read_gml - - Notes - ----- - This stores nested GML attributes as dictionaries in the - NetworkX graph, node, and edge attribute structures. - - Requires pyparsing: http://pyparsing.wikispaces.com/ - - References - ---------- - GML specification: - http://www.infosun.fim.uni-passau.de/Graphlet/GML/gml-tr.html - """ - try: - from pyparsing import ParseException - except ImportError: - try: - from matplotlib.pyparsing import ParseException - except: - raise ImportError('Import Error: not able to import pyparsing:', - 'http://pyparsing.wikispaces.com/') - try: - data = "".join(lines) - gml = pyparse_gml() - tokens =gml.parseString(data) - except ParseException as err: - print((err.line)) - print((" "*(err.column-1) + "^")) - print(err) - raise - - # function to recursively make dicts of key/value pairs - def wrap(tok): - listtype=type(tok) - result={} - for k,v in tok: - if type(v)==listtype: - result[str(k)]=wrap(v) - else: - result[str(k)]=v - return result - - # Set flag - multigraph=False - # but assume multigraphs to start - if tokens.directed==1: - G=nx.MultiDiGraph() - else: - G=nx.MultiGraph() - - for k,v in tokens.asList(): - if k=="node": - vdict=wrap(v) - node=vdict['id'] - G.add_node(node,attr_dict=vdict) - elif k=="edge": - vdict=wrap(v) - source=vdict.pop('source') - target=vdict.pop('target') - if G.has_edge(source,target): - multigraph=True - G.add_edge(source,target,attr_dict=vdict) - else: - G.graph[k]=v - - # switch to Graph or DiGraph if no parallel edges were found. - if not multigraph: - if G.is_directed(): - G=nx.DiGraph(G) - else: - G=nx.Graph(G) - - if relabel: - # relabel, but check for duplicate labels first - mapping=[(n,d['label']) for n,d in G.node.items()] - x,y=zip(*mapping) - if len(set(y))!=len(G): - raise NetworkXError('Failed to relabel nodes: ' - 'duplicate node labels found. ' - 'Use relabel=False.') - G=nx.relabel_nodes(G,dict(mapping)) - return G - - -def pyparse_gml(): - """A pyparsing tokenizer for GML graph format. - - This is not intended to be called directly. - - See Also - -------- - write_gml, read_gml, parse_gml - """ - try: - from pyparsing import \ - Literal, CaselessLiteral, Word, Forward,\ - ZeroOrMore, Group, Dict, Optional, Combine,\ - ParseException, restOfLine, White, alphas, alphanums, nums,\ - OneOrMore,quotedString,removeQuotes,dblQuotedString, Regex - except ImportError: - try: - from matplotlib.pyparsing import \ - Literal, CaselessLiteral, Word, Forward,\ - ZeroOrMore, Group, Dict, Optional, Combine,\ - ParseException, restOfLine, White, alphas, alphanums, nums,\ - OneOrMore,quotedString,removeQuotes,dblQuotedString, Regex - except: - raise ImportError('pyparsing not found', - 'http://pyparsing.wikispaces.com/') - - lbrack = Literal("[").suppress() - rbrack = Literal("]").suppress() - pound = ("#") - comment = pound + Optional( restOfLine ) - integer = Word(nums+'-').setParseAction(lambda s,l,t:[ int(t[0])]) - real = Regex(r"[+-]?\d+\.\d*([eE][+-]?\d+)?").setParseAction( - lambda s,l,t:[ float(t[0]) ]) - dblQuotedString.setParseAction( removeQuotes ) - key = Word(alphas,alphanums+'_') - value_atom = (real | integer | Word(alphanums) | dblQuotedString) - value = Forward() # to be defined later with << operator - keyvalue = Group(key+value) - value << (value_atom | Group( lbrack + ZeroOrMore(keyvalue) + rbrack )) - node = Group(Literal("node") + lbrack + Group(OneOrMore(keyvalue)) + rbrack) - edge = Group(Literal("edge") + lbrack + Group(OneOrMore(keyvalue)) + rbrack) - - creator = Group(Literal("Creator")+ Optional( restOfLine )) - version = Group(Literal("Version")+ Optional( restOfLine )) - graphkey = Literal("graph").suppress() - - graph = Dict (Optional(creator)+Optional(version)+\ - graphkey + lbrack + ZeroOrMore( (node|edge|keyvalue) ) + rbrack ) - graph.ignore(comment) - - return graph - -def generate_gml(G): - """Generate a single entry of the graph G in GML format. - - Parameters - ---------- - G : NetworkX graph - - Returns - ------- - lines: string - Lines in GML format. - - Notes - ----- - This implementation does not support all Python data types as GML - data. Nodes, node attributes, edge attributes, and graph - attributes must be either dictionaries or single stings or - numbers. If they are not an attempt is made to represent them as - strings. For example, a list as edge data - G[1][2]['somedata']=[1,2,3], will be represented in the GML file - as:: - - edge [ - source 1 - target 2 - somedata "[1, 2, 3]" - ] - """ - # recursively make dicts into gml brackets - def listify(d,indent,indentlevel): - result='[ \n' - for k,v in d.items(): - if type(v)==dict: - v=listify(v,indent,indentlevel+1) - result += (indentlevel+1)*indent + \ - string_item(k,v,indentlevel*indent)+'\n' - return result+indentlevel*indent+"]" - - def string_item(k,v,indent): - # try to make a string of the data - if type(v)==dict: - v=listify(v,indent,2) - elif is_string_like(v): - v='"%s"'%v - elif type(v)==bool: - v=int(v) - return "%s %s"%(k,v) - - # check for attributes or assign empty dict - if hasattr(G,'graph_attr'): - graph_attr=G.graph_attr - else: - graph_attr={} - if hasattr(G,'node_attr'): - node_attr=G.node_attr - else: - node_attr={} - - indent=2*' ' - count=iter(range(len(G))) - node_id={} - - yield "graph [" - if G.is_directed(): - yield indent+"directed 1" - # write graph attributes - for k,v in G.graph.items(): - if k == 'directed': - continue - yield indent+string_item(k,v,indent) - # write nodes - for n in G: - yield indent+"node [" - # get id or assign number - nid=G.node[n].get('id',next(count)) - node_id[n]=nid - yield 2*indent+"id %s"%nid - label=G.node[n].get('label',n) - if is_string_like(label): - label='"%s"'%label - yield 2*indent+'label %s'%label - if n in G: - for k,v in G.node[n].items(): - if k=='id' or k == 'label': continue - yield 2*indent+string_item(k,v,indent) - yield indent+"]" - # write edges - for u,v,edgedata in G.edges_iter(data=True): - yield indent+"edge [" - yield 2*indent+"source %s"%node_id[u] - yield 2*indent+"target %s"%node_id[v] - for k,v in edgedata.items(): - if k=='source': continue - if k=='target': continue - yield 2*indent+string_item(k,v,indent) - yield indent+"]" - yield "]" - -@open_file(1,mode='wb') -def write_gml(G, path): - """ - Write the graph G in GML format to the file or file handle path. - - Parameters - ---------- - path : filename or filehandle - The filename or filehandle to write. Filenames ending in - .gz or .gz2 will be compressed. - - See Also - -------- - read_gml, parse_gml - - Notes - ----- - GML specifications indicate that the file should only use - 7bit ASCII text encoding.iso8859-1 (latin-1). - - This implementation does not support all Python data types as GML - data. Nodes, node attributes, edge attributes, and graph - attributes must be either dictionaries or single stings or - numbers. If they are not an attempt is made to represent them as - strings. For example, a list as edge data - G[1][2]['somedata']=[1,2,3], will be represented in the GML file - as:: - - edge [ - source 1 - target 2 - somedata "[1, 2, 3]" - ] - - - Examples - --------- - >>> G=nx.path_graph(4) - >>> nx.write_gml(G,"test.gml") - - Filenames ending in .gz or .bz2 will be compressed. - - >>> nx.write_gml(G,"test.gml.gz") - """ - for line in generate_gml(G): - line+='\n' - path.write(line.encode('latin-1')) - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import pyparsing - except: - try: - import matplotlib.pyparsing - except: - raise SkipTest("pyparsing not available") - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.gml') - os.unlink('test.gml.gz') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gpickle.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gpickle.py deleted file mode 100644 index 688a35c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/gpickle.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -************** -Pickled Graphs -************** -Read and write NetworkX graphs as Python pickles. - -"The pickle module implements a fundamental, but powerful algorithm -for serializing and de-serializing a Python object -structure. "Pickling" is the process whereby a Python object hierarchy -is converted into a byte stream, and "unpickling" is the inverse -operation, whereby a byte stream is converted back into an object -hierarchy." - -Note that NetworkX graphs can contain any hashable Python object as -node (not just integers and strings). For arbitrary data types it may -be difficult to represent the data as text. In that case using Python -pickles to store the graph data can be used. - -Format ------- -See http://docs.python.org/library/pickle.html -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)\nDan Schult (dschult@colgate.edu)""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['read_gpickle', 'write_gpickle'] - -import networkx as nx -from networkx.utils import open_file - -try: - import cPickle as pickle -except ImportError: - import pickle - -@open_file(1,mode='wb') -def write_gpickle(G, path): - """Write graph in Python pickle format. - - Pickles are a serialized byte stream of a Python object [1]_. - This format will preserve Python objects used as nodes or edges. - - Parameters - ---------- - G : graph - A NetworkX graph - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be compressed. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_gpickle(G,"test.gpickle") - - References - ---------- - .. [1] http://docs.python.org/library/pickle.html - """ - pickle.dump(G, path, pickle.HIGHEST_PROTOCOL) - -@open_file(0,mode='rb') -def read_gpickle(path): - """Read graph object in Python pickle format. - - Pickles are a serialized byte stream of a Python object [1]_. - This format will preserve Python objects used as nodes or edges. - - Parameters - ---------- - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be uncompressed. - - Returns - ------- - G : graph - A NetworkX graph - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_gpickle(G,"test.gpickle") - >>> G=nx.read_gpickle("test.gpickle") - - References - ---------- - .. [1] http://docs.python.org/library/pickle.html - """ - return pickle.load(path) - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.gpickle') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/graphml.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/graphml.py deleted file mode 100644 index 7f896e0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/graphml.py +++ /dev/null @@ -1,579 +0,0 @@ -""" -******* -GraphML -******* -Read and write graphs in GraphML format. - -This implementation does not support mixed graphs (directed and unidirected -edges together), hyperedges, nested graphs, or ports. - -"GraphML is a comprehensive and easy-to-use file format for graphs. It -consists of a language core to describe the structural properties of a -graph and a flexible extension mechanism to add application-specific -data. Its main features include support of - - * directed, undirected, and mixed graphs, - * hypergraphs, - * hierarchical graphs, - * graphical representations, - * references to external data, - * application-specific attribute data, and - * light-weight parsers. - -Unlike many other file formats for graphs, GraphML does not use a -custom syntax. Instead, it is based on XML and hence ideally suited as -a common denominator for all kinds of services generating, archiving, -or processing graphs." - -http://graphml.graphdrawing.org/ - -Format ------- -GraphML is an XML format. See -http://graphml.graphdrawing.org/specification.html for the specification and -http://graphml.graphdrawing.org/primer/graphml-primer.html -for examples. -""" -__author__ = """\n""".join(['Salim Fadhley', - 'Aric Hagberg (hagberg@lanl.gov)' - ]) - -__all__ = ['write_graphml', 'read_graphml', 'generate_graphml', - 'parse_graphml', 'GraphMLWriter', 'GraphMLReader'] - -import networkx as nx -from networkx.utils import open_file, make_str -import warnings -try: - from xml.etree.cElementTree import Element, ElementTree, tostring, fromstring -except ImportError: - try: - from xml.etree.ElementTree import Element, ElementTree, tostring, fromstring - except ImportError: - pass - -@open_file(1,mode='wb') -def write_graphml(G, path, encoding='utf-8',prettyprint=True): - """Write G in GraphML XML format to path - - Parameters - ---------- - G : graph - A networkx graph - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be compressed. - encoding : string (optional) - Encoding for text data. - prettyprint : bool (optional) - If True use line breaks and indenting in output XML. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_graphml(G, "test.graphml") - - Notes - ----- - This implementation does not support mixed graphs (directed and unidirected - edges together) hyperedges, nested graphs, or ports. - """ - writer = GraphMLWriter(encoding=encoding,prettyprint=prettyprint) - writer.add_graph_element(G) - writer.dump(path) - -def generate_graphml(G, encoding='utf-8',prettyprint=True): - """Generate GraphML lines for G - - Parameters - ---------- - G : graph - A networkx graph - encoding : string (optional) - Encoding for text data. - prettyprint : bool (optional) - If True use line breaks and indenting in output XML. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> linefeed=chr(10) # linefeed=\n - >>> s=linefeed.join(nx.generate_graphml(G)) # doctest: +SKIP - >>> for line in nx.generate_graphml(G): # doctest: +SKIP - ... print(line) - - Notes - ----- - This implementation does not support mixed graphs (directed and unidirected - edges together) hyperedges, nested graphs, or ports. - """ - writer = GraphMLWriter(encoding=encoding,prettyprint=prettyprint) - writer.add_graph_element(G) - for line in str(writer).splitlines(): - yield line - -@open_file(0,mode='rb') -def read_graphml(path,node_type=str): - """Read graph in GraphML format from path. - - Parameters - ---------- - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be compressed. - - node_type: Python type (default: str) - Convert node ids to this type - - Returns - ------- - graph: NetworkX graph - If no parallel edges are found a Graph or DiGraph is returned. - Otherwise a MultiGraph or MultiDiGraph is returned. - - Notes - ----- - This implementation does not support mixed graphs (directed and unidirected - edges together), hypergraphs, nested graphs, or ports. - - For multigraphs the GraphML edge "id" will be used as the edge - key. If not specified then they "key" attribute will be used. If - there is no "key" attribute a default NetworkX multigraph edge key - will be provided. - - Files with the yEd "yfiles" extension will can be read but the graphics - information is discarded. - - yEd compressed files ("file.graphmlz" extension) can be read by renaming - the file to "file.graphml.gz". - - """ - reader = GraphMLReader(node_type=node_type) - # need to check for multiple graphs - glist=list(reader(path=path)) - return glist[0] - - -def parse_graphml(graphml_string,node_type=str): - """Read graph in GraphML format from string. - - Parameters - ---------- - graphml_string : string - String containing graphml information - (e.g., contents of a graphml file). - - node_type: Python type (default: str) - Convert node ids to this type - - Returns - ------- - graph: NetworkX graph - If no parallel edges are found a Graph or DiGraph is returned. - Otherwise a MultiGraph or MultiDiGraph is returned. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> linefeed=chr(10) # linefeed=\n - >>> s=linefeed.join(nx.generate_graphml(G)) - >>> H=nx.parse_graphml(s) - - Notes - ----- - This implementation does not support mixed graphs (directed and unidirected - edges together), hypergraphs, nested graphs, or ports. - - For multigraphs the GraphML edge "id" will be used as the edge - key. If not specified then they "key" attribute will be used. If - there is no "key" attribute a default NetworkX multigraph edge key - will be provided. - - """ - reader = GraphMLReader(node_type=node_type) - # need to check for multiple graphs - glist=list(reader(string=graphml_string)) - return glist[0] - - -class GraphML(object): - NS_GRAPHML = "http://graphml.graphdrawing.org/xmlns" - NS_XSI = "http://www.w3.org/2001/XMLSchema-instance" - #xmlns:y="http://www.yworks.com/xml/graphml" - NS_Y = "http://www.yworks.com/xml/graphml" - SCHEMALOCATION = \ - ' '.join(['http://graphml.graphdrawing.org/xmlns', - 'http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd']) - - try: - chr(12345) # Fails on Py!=3. - unicode = str # Py3k's str is our unicode type - long = int # Py3K's int is our long type - except ValueError: - # Python 2.x - pass - - types=[(int,"integer"), # for Gephi GraphML bug - (str,"yfiles"),(str,"string"), (unicode,"string"), - (int,"int"), (long,"long"), - (float,"float"), (float,"double"), - (bool, "boolean")] - - xml_type = dict(types) - python_type = dict(reversed(a) for a in types) - convert_bool={'true':True,'false':False, - 'True': True, 'False': False} - - - -class GraphMLWriter(GraphML): - def __init__(self, graph=None, encoding="utf-8",prettyprint=True): - try: - import xml.etree.ElementTree - except ImportError: - raise ImportError('GraphML writer requires ' - 'xml.elementtree.ElementTree') - self.prettyprint=prettyprint - self.encoding = encoding - self.xml = Element("graphml", - {'xmlns':self.NS_GRAPHML, - 'xmlns:xsi':self.NS_XSI, - 'xsi:schemaLocation':self.SCHEMALOCATION} - ) - self.keys={} - - if graph is not None: - self.add_graph_element(graph) - - - def __str__(self): - if self.prettyprint: - self.indent(self.xml) - s=tostring(self.xml).decode(self.encoding) - return s - - def get_key(self, name, attr_type, scope, default): - keys_key = (name, attr_type, scope) - try: - return self.keys[keys_key] - except KeyError: - new_id = "d%i" % len(list(self.keys)) - self.keys[keys_key] = new_id - key_kwargs = {"id":new_id, - "for":scope, - "attr.name":name, - "attr.type":attr_type} - key_element=Element("key",**key_kwargs) - # add subelement for data default value if present - if default is not None: - default_element=Element("default") - default_element.text=make_str(default) - key_element.append(default_element) - self.xml.insert(0,key_element) - return new_id - - - def add_data(self, name, element_type, value, - scope="all", - default=None): - """ - Make a data element for an edge or a node. Keep a log of the - type in the keys table. - """ - if element_type not in self.xml_type: - raise nx.NetworkXError('GraphML writer does not support ' - '%s as data values.'%element_type) - key_id = self.get_key(name, self.xml_type[element_type], scope, default) - data_element = Element("data", key=key_id) - data_element.text = make_str(value) - return data_element - - def add_attributes(self, scope, xml_obj, data, default): - """Appends attributes to edges or nodes. - """ - for k,v in data.items(): - default_value=default.get(k) - obj=self.add_data(make_str(k), type(v), make_str(v), - scope=scope, default=default_value) - xml_obj.append(obj) - - def add_nodes(self, G, graph_element): - for node,data in G.nodes_iter(data=True): - node_element = Element("node", id = make_str(node)) - default=G.graph.get('node_default',{}) - self.add_attributes("node", node_element, data, default) - graph_element.append(node_element) - - def add_edges(self, G, graph_element): - if G.is_multigraph(): - for u,v,key,data in G.edges_iter(data=True,keys=True): - edge_element = Element("edge",source=make_str(u), - target=make_str(v)) - default=G.graph.get('edge_default',{}) - self.add_attributes("edge", edge_element, data, default) - self.add_attributes("edge", edge_element, - {'key':key}, default) - graph_element.append(edge_element) - else: - for u,v,data in G.edges_iter(data=True): - edge_element = Element("edge",source=make_str(u), - target=make_str(v)) - default=G.graph.get('edge_default',{}) - self.add_attributes("edge", edge_element, data, default) - graph_element.append(edge_element) - - def add_graph_element(self, G): - """ - Serialize graph G in GraphML to the stream. - """ - if G.is_directed(): - default_edge_type='directed' - else: - default_edge_type='undirected' - - graphid=G.graph.pop('id',None) - if graphid is None: - graph_element = Element("graph", - edgedefault = default_edge_type) - else: - graph_element = Element("graph", - edgedefault = default_edge_type, - id=graphid) - - default={} - data=dict((k,v) for (k,v) in G.graph.items() - if k not in ['node_default','edge_default']) - self.add_attributes("graph", graph_element, data, default) - self.add_nodes(G,graph_element) - self.add_edges(G,graph_element) - self.xml.append(graph_element) - - def add_graphs(self, graph_list): - """ - Add many graphs to this GraphML document. - """ - for G in graph_list: - self.add_graph_element(G) - - def dump(self, stream): - if self.prettyprint: - self.indent(self.xml) - document = ElementTree(self.xml) - header='<?xml version="1.0" encoding="%s"?>'%self.encoding - stream.write(header.encode(self.encoding)) - document.write(stream, encoding=self.encoding) - - def indent(self, elem, level=0): - # in-place prettyprint formatter - i = "\n" + level*" " - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + " " - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - self.indent(elem, level+1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i - - -class GraphMLReader(GraphML): - """Read a GraphML document. Produces NetworkX graph objects. - """ - def __init__(self, node_type=str): - try: - import xml.etree.ElementTree - except ImportError: - raise ImportError('GraphML reader requires ' - 'xml.elementtree.ElementTree') - self.node_type=node_type - self.multigraph=False # assume multigraph and test for parallel edges - - def __call__(self, path=None, string=None): - if path is not None: - self.xml = ElementTree(file=path) - elif string is not None: - self.xml = fromstring(string) - else: - raise ValueError("Must specify either 'path' or 'string' as kwarg.") - (keys,defaults) = self.find_graphml_keys(self.xml) - for g in self.xml.findall("{%s}graph" % self.NS_GRAPHML): - yield self.make_graph(g, keys, defaults) - - def make_graph(self, graph_xml, graphml_keys, defaults): - # set default graph type - edgedefault = graph_xml.get("edgedefault", None) - if edgedefault=='directed': - G=nx.MultiDiGraph() - else: - G=nx.MultiGraph() - # set defaults for graph attributes - G.graph['node_default']={} - G.graph['edge_default']={} - for key_id,value in defaults.items(): - key_for=graphml_keys[key_id]['for'] - name=graphml_keys[key_id]['name'] - python_type=graphml_keys[key_id]['type'] - if key_for=='node': - G.graph['node_default'].update({name:python_type(value)}) - if key_for=='edge': - G.graph['edge_default'].update({name:python_type(value)}) - # hyperedges are not supported - hyperedge=graph_xml.find("{%s}hyperedge" % self.NS_GRAPHML) - if hyperedge is not None: - raise nx.NetworkXError("GraphML reader does not support hyperedges") - # add nodes - for node_xml in graph_xml.findall("{%s}node" % self.NS_GRAPHML): - self.add_node(G, node_xml, graphml_keys) - # add edges - for edge_xml in graph_xml.findall("{%s}edge" % self.NS_GRAPHML): - self.add_edge(G, edge_xml, graphml_keys) - # add graph data - data = self.decode_data_elements(graphml_keys, graph_xml) - G.graph.update(data) - - # switch to Graph or DiGraph if no parallel edges were found. - if not self.multigraph: - if G.is_directed(): - return nx.DiGraph(G) - else: - return nx.Graph(G) - else: - return G - - def add_node(self, G, node_xml, graphml_keys): - """Add a node to the graph. - """ - # warn on finding unsupported ports tag - ports=node_xml.find("{%s}port" % self.NS_GRAPHML) - if ports is not None: - warnings.warn("GraphML port tag not supported.") - # find the node by id and cast it to the appropriate type - node_id = self.node_type(node_xml.get("id")) - # get data/attributes for node - data = self.decode_data_elements(graphml_keys, node_xml) - G.add_node(node_id, data) - - def add_edge(self, G, edge_element, graphml_keys): - """Add an edge to the graph. - """ - # warn on finding unsupported ports tag - ports=edge_element.find("{%s}port" % self.NS_GRAPHML) - if ports is not None: - warnings.warn("GraphML port tag not supported.") - - # raise error if we find mixed directed and undirected edges - directed = edge_element.get("directed") - if G.is_directed() and directed=='false': - raise nx.NetworkXError(\ - "directed=false edge found in directed graph.") - if (not G.is_directed()) and directed=='true': - raise nx.NetworkXError(\ - "directed=true edge found in undirected graph.") - - source = self.node_type(edge_element.get("source")) - target = self.node_type(edge_element.get("target")) - data = self.decode_data_elements(graphml_keys, edge_element) - # GraphML stores edge ids as an attribute - # NetworkX uses them as keys in multigraphs too if no key - # attribute is specified - edge_id = edge_element.get("id") - if edge_id: - data["id"] = edge_id - if G.has_edge(source,target): - # mark this as a multigraph - self.multigraph=True - if edge_id is None: - # no id specified, try using 'key' attribute as id - edge_id=data.pop('key',None) - G.add_edge(source, target, key=edge_id, **data) - - def decode_data_elements(self, graphml_keys, obj_xml): - """Use the key information to decode the data XML if present.""" - data = {} - for data_element in obj_xml.findall("{%s}data" % self.NS_GRAPHML): - key = data_element.get("key") - try: - data_name=graphml_keys[key]['name'] - data_type=graphml_keys[key]['type'] - except KeyError: - raise nx.NetworkXError("Bad GraphML data: no key %s"%key) - text=data_element.text - # assume anything with subelements is a yfiles extension - if text is not None and len(list(data_element))==0: - if data_type==bool: - data[data_name] = self.convert_bool[text] - else: - data[data_name] = data_type(text) - elif len(list(data_element)) > 0: - # Assume yfiles as subelements, try to extract node_label - node_label = None - for node_type in ['ShapeNode', 'SVGNode', 'ImageNode']: - geometry = data_element.find("{%s}%s/{%s}Geometry" % - (self.NS_Y, node_type, self.NS_Y)) - if geometry is not None: - data['x'] = geometry.get('x') - data['y'] = geometry.get('y') - if node_label is None: - node_label = data_element.find("{%s}%s/{%s}NodeLabel" % - (self.NS_Y, node_type, self.NS_Y)) - if node_label is not None: - data['label'] = node_label.text - - # check all the diffrent types of edges avaivable in yEd. - for e in ['PolyLineEdge', 'SplineEdge', 'QuadCurveEdge', 'BezierEdge', 'ArcEdge']: - edge_label = data_element.find("{%s}%s/{%s}EdgeLabel"% - (self.NS_Y, e, (self.NS_Y))) - if edge_label is not None: - break - - if edge_label is not None: - data['label'] = edge_label.text - return data - - def find_graphml_keys(self, graph_element): - """Extracts all the keys and key defaults from the xml. - """ - graphml_keys = {} - graphml_key_defaults = {} - for k in graph_element.findall("{%s}key" % self.NS_GRAPHML): - attr_id = k.get("id") - attr_type=k.get('attr.type') - attr_name=k.get("attr.name") - yfiles_type=k.get("yfiles.type") - if yfiles_type is not None: - attr_name = yfiles_type - attr_type = 'yfiles' - if attr_type is None: - attr_type = "string" - warnings.warn("No key type for id %s. Using string"%attr_id) - if attr_name is None: - raise nx.NetworkXError("Unknown key for id %s in file."%attr_id) - graphml_keys[attr_id] = { - "name":attr_name, - "type":self.python_type[attr_type], - "for":k.get("for")} - # check for "default" subelement of key element - default=k.find("{%s}default" % self.NS_GRAPHML) - if default is not None: - graphml_key_defaults[attr_id]=default.text - return graphml_keys,graphml_key_defaults - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import xml.etree.ElementTree - except: - raise SkipTest("xml.etree.ElementTree not available") - -# fixture for nose tests -def teardown_module(module): - import os - try: - os.unlink('test.graphml') - except: - pass diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/__init__.py deleted file mode 100644 index ea3db6e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -********* -JSON data -********* -Generate and parse JSON serializable data for NetworkX graphs. -""" -from networkx.readwrite.json_graph.node_link import * -from networkx.readwrite.json_graph.adjacency import * -from networkx.readwrite.json_graph.tree import * -from networkx.readwrite.json_graph.serialize import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/adjacency.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/adjacency.py deleted file mode 100644 index d5b0df2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/adjacency.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) 2011-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from copy import deepcopy -from itertools import count,repeat -import json -import networkx as nx -__author__ = """Aric Hagberg <aric.hagberg@gmail.com>""" -__all__ = ['adjacency_data', 'adjacency_graph'] - -def adjacency_data(G): - """Return data in adjacency format that is suitable for JSON serialization - and use in Javascript documents. - - Parameters - ---------- - G : NetworkX graph - - Returns - ------- - data : dict - A dictionary with node-link formatted data. - - Examples - -------- - >>> from networkx.readwrite import json_graph - >>> G = nx.Graph([(1,2)]) - >>> data = json_graph.adjacency_data(G) - - To serialize with json - - >>> import json - >>> s = json.dumps(data) - - Notes - ----- - Graph, node, and link attributes will be written when using this format - but attribute keys must be strings if you want to serialize the resulting - data with JSON. - - See Also - -------- - adjacency_graph, node_link_data, tree_data - """ - multigraph = G.is_multigraph() - data = {} - data['directed'] = G.is_directed() - data['multigraph'] = multigraph - data['graph'] = list(G.graph.items()) - data['nodes'] = [] - data['adjacency'] = [] - for n,nbrdict in G.adjacency_iter(): - data['nodes'].append(dict(id=n, **G.node[n])) - adj = [] - if multigraph: - for nbr,key in nbrdict.items(): - for k,d in key.items(): - adj.append(dict(id=nbr, key=k, **d)) - else: - for nbr,d in nbrdict.items(): - adj.append(dict(id=nbr, **d)) - data['adjacency'].append(adj) - return data - -def adjacency_graph(data, directed=False, multigraph=True): - """Return graph from adjacency data format. - - Parameters - ---------- - data : dict - Adjacency list formatted graph data - - Returns - ------- - G : NetworkX graph - A NetworkX graph object - - directed : bool - If True, and direction not specified in data, return a directed graph. - - multigraph : bool - If True, and multigraph not specified in data, return a multigraph. - - Examples - -------- - >>> from networkx.readwrite import json_graph - >>> G = nx.Graph([(1,2)]) - >>> data = json_graph.adjacency_data(G) - >>> H = json_graph.adjacency_graph(data) - - See Also - -------- - adjacency_graph, node_link_data, tree_data - """ - multigraph = data.get('multigraph',multigraph) - directed = data.get('directed',directed) - if multigraph: - graph = nx.MultiGraph() - else: - graph = nx.Graph() - if directed: - graph = graph.to_directed() - graph.graph = dict(data.get('graph',[])) - mapping=[] - for d in data['nodes']: - node_data = d.copy() - node = node_data.pop('id') - mapping.append(node) - graph.add_node(node, attr_dict=node_data) - for i,d in enumerate(data['adjacency']): - source = mapping[i] - for tdata in d: - target_data = tdata.copy() - target = target_data.pop('id') - key = target_data.pop('key', None) - if not multigraph or key is None: - graph.add_edge(source,target,attr_dict=tdata) - else: - graph.add_edge(source,target,key=key, attr_dict=tdata) - return graph diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/node_link.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/node_link.py deleted file mode 100644 index 03f150f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/node_link.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright (C) 2011-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from itertools import count,repeat -import json -import networkx as nx -__author__ = """Aric Hagberg <hagberg@lanl.gov>""" -__all__ = ['node_link_data', 'node_link_graph'] - -def node_link_data(G): - """Return data in node-link format that is suitable for JSON serialization - and use in Javascript documents. - - Parameters - ---------- - G : NetworkX graph - - Returns - ------- - data : dict - A dictionary with node-link formatted data. - - Examples - -------- - >>> from networkx.readwrite import json_graph - >>> G = nx.Graph([(1,2)]) - >>> data = json_graph.node_link_data(G) - - To serialize with json - - >>> import json - >>> s = json.dumps(data) - - Notes - ----- - Graph, node, and link attributes are stored in this format but keys - for attributes must be strings if you want to serialize with JSON. - - See Also - -------- - node_link_graph, adjacency_data, tree_data - """ - multigraph = G.is_multigraph() - mapping = dict(zip(G,count())) - data = {} - data['directed'] = G.is_directed() - data['multigraph'] = multigraph - data['graph'] = list(G.graph.items()) - data['nodes'] = [ dict(id=n, **G.node[n]) for n in G ] - if multigraph: - data['links'] = [ dict(source=mapping[u], target=mapping[v], key=k, **d) - for u,v,k,d in G.edges(keys=True, data=True) ] - else: - data['links'] = [ dict(source=mapping[u], target=mapping[v], **d) - for u,v,d in G.edges(data=True) ] - - return data - - -def node_link_graph(data, directed=False, multigraph=True): - """Return graph from node-link data format. - - Parameters - ---------- - data : dict - node-link formatted graph data - - directed : bool - If True, and direction not specified in data, return a directed graph. - - multigraph : bool - If True, and multigraph not specified in data, return a multigraph. - - Returns - ------- - G : NetworkX graph - A NetworkX graph object - - Examples - -------- - >>> from networkx.readwrite import json_graph - >>> G = nx.Graph([(1,2)]) - >>> data = json_graph.node_link_data(G) - >>> H = json_graph.node_link_graph(data) - - See Also - -------- - node_link_data, adjacency_data, tree_data - """ - multigraph = data.get('multigraph',multigraph) - directed = data.get('directed',directed) - if multigraph: - graph = nx.MultiGraph() - else: - graph = nx.Graph() - if directed: - graph = graph.to_directed() - mapping=[] - graph.graph = dict(data.get('graph',[])) - c = count() - for d in data['nodes']: - node = d.get('id',next(c)) - mapping.append(node) - nodedata = dict((str(k),v) for k,v in d.items() if k!='id') - graph.add_node(node, **nodedata) - for d in data['links']: - link_data = d.copy() - source = link_data.pop('source') - target = link_data.pop('target') - edgedata = dict((str(k),v) for k,v in d.items() - if k!='source' and k!='target') - graph.add_edge(mapping[source],mapping[target],**edgedata) - return graph diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/serialize.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/serialize.py deleted file mode 100644 index 5861836..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/serialize.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from functools import partial,update_wrapper -import json -from networkx.readwrite.json_graph import node_link_data,node_link_graph -__author__ = """Aric Hagberg (hagberg@lanl.gov))""" -__all__ = ['dumps','loads','dump','load'] - -class NXJSONEncoder(json.JSONEncoder): - def default(self, o): - return node_link_data(o) - - -class NXJSONDecoder(json.JSONDecoder): - def decode(self, s): - d = json.loads(s) - return node_link_graph(d) - -# modification of json functions to serialize networkx graphs -dumps = partial(json.dumps, cls=NXJSONEncoder) -update_wrapper(dumps,json.dumps) -loads = partial(json.loads, cls=NXJSONDecoder) -update_wrapper(loads,json.loads) -dump = partial(json.dump, cls=NXJSONEncoder) -update_wrapper(dump,json.dump) -load = partial(json.load, cls=NXJSONDecoder) -update_wrapper(load,json.load) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_adjacency.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_adjacency.py deleted file mode 100644 index f8bf214..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_adjacency.py +++ /dev/null @@ -1,52 +0,0 @@ -import json -from nose.tools import assert_equal, assert_raises, assert_not_equal,assert_true -import networkx as nx -from networkx.readwrite.json_graph import * - -class TestAdjacency: - - def test_graph(self): - G = nx.path_graph(4) - H = adjacency_graph(adjacency_data(G)) - nx.is_isomorphic(G,H) - - def test_graph_attributes(self): - G = nx.path_graph(4) - G.add_node(1,color='red') - G.add_edge(1,2,width=7) - G.graph['foo']='bar' - G.graph[1]='one' - - H = adjacency_graph(adjacency_data(G)) - assert_equal(H.graph['foo'],'bar') - assert_equal(H.node[1]['color'],'red') - assert_equal(H[1][2]['width'],7) - - d = json.dumps(adjacency_data(G)) - H = adjacency_graph(json.loads(d)) - assert_equal(H.graph['foo'],'bar') - assert_equal(H.graph[1],'one') - assert_equal(H.node[1]['color'],'red') - assert_equal(H[1][2]['width'],7) - - def test_digraph(self): - G = nx.DiGraph() - G.add_path([1,2,3]) - H = adjacency_graph(adjacency_data(G)) - assert_true(H.is_directed()) - nx.is_isomorphic(G,H) - - def test_multidigraph(self): - G = nx.MultiDiGraph() - G.add_path([1,2,3]) - H = adjacency_graph(adjacency_data(G)) - assert_true(H.is_directed()) - assert_true(H.is_multigraph()) - - def test_multigraph(self): - G = nx.MultiGraph() - G.add_edge(1,2,key='first') - G.add_edge(1,2,key='second',color='blue') - H = adjacency_graph(adjacency_data(G)) - nx.is_isomorphic(G,H) - assert_equal(H[1][2]['second']['color'],'blue') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_node_link.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_node_link.py deleted file mode 100644 index 5430e0d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_node_link.py +++ /dev/null @@ -1,44 +0,0 @@ -import json -from nose.tools import assert_equal, assert_raises, assert_not_equal,assert_true -import networkx as nx -from networkx.readwrite.json_graph import * - -class TestNodeLink: - - def test_graph(self): - G = nx.path_graph(4) - H = node_link_graph(node_link_data(G)) - nx.is_isomorphic(G,H) - - def test_graph_attributes(self): - G = nx.path_graph(4) - G.add_node(1,color='red') - G.add_edge(1,2,width=7) - G.graph[1]='one' - G.graph['foo']='bar' - - H = node_link_graph(node_link_data(G)) - assert_equal(H.graph['foo'],'bar') - assert_equal(H.node[1]['color'],'red') - assert_equal(H[1][2]['width'],7) - - d=json.dumps(node_link_data(G)) - H = node_link_graph(json.loads(d)) - assert_equal(H.graph['foo'],'bar') - assert_equal(H.graph[1],'one') - assert_equal(H.node[1]['color'],'red') - assert_equal(H[1][2]['width'],7) - - def test_digraph(self): - G = nx.DiGraph() - H = node_link_graph(node_link_data(G)) - assert_true(H.is_directed()) - - - def test_multigraph(self): - G = nx.MultiGraph() - G.add_edge(1,2,key='first') - G.add_edge(1,2,key='second',color='blue') - H = node_link_graph(node_link_data(G)) - nx.is_isomorphic(G,H) - assert_equal(H[1][2]['second']['color'],'blue') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_serialize.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_serialize.py deleted file mode 100644 index cc8d7ff..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_serialize.py +++ /dev/null @@ -1,49 +0,0 @@ -import json -from nose.tools import assert_equal, assert_raises, assert_not_equal,assert_true -import networkx as nx -from networkx.readwrite.json_graph import * - -class TestAdjacency: - - def test_graph(self): - G = nx.path_graph(4) - H = loads(dumps(G)) - nx.is_isomorphic(G,H) - - def test_graph_attributes(self): - G = nx.path_graph(4) - G.add_node(1,color='red') - G.add_edge(1,2,width=7) - G.graph['foo']='bar' - G.graph[1]='one' - - H = loads(dumps(G)) - assert_equal(H.graph['foo'],'bar') - assert_equal(H.graph[1],'one') - assert_equal(H.node[1]['color'],'red') - assert_equal(H[1][2]['width'],7) - - try: - from StringIO import StringIO - except: - from io import StringIO - io = StringIO() - dump(G,io) - io.seek(0) - H=load(io) - assert_equal(H.graph['foo'],'bar') - assert_equal(H.graph[1],'one') - assert_equal(H.node[1]['color'],'red') - assert_equal(H[1][2]['width'],7) - - - def test_digraph(self): - G = nx.DiGraph() - H = loads(dumps(G)) - assert_true(H.is_directed()) - - def test_multidigraph(self): - G = nx.MultiDiGraph() - H = loads(dumps(G)) - assert_true(H.is_directed()) - assert_true(H.is_multigraph()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_tree.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_tree.py deleted file mode 100644 index 19ba8f2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tests/test_tree.py +++ /dev/null @@ -1,29 +0,0 @@ -import json -from nose.tools import assert_equal, assert_raises, assert_not_equal,assert_true -import networkx as nx -from networkx.readwrite.json_graph import * - -class TestTree: - - def test_graph(self): - G=nx.DiGraph() - G.add_nodes_from([1,2,3],color='red') - G.add_edge(1,2,foo=7) - G.add_edge(1,3,foo=10) - G.add_edge(3,4,foo=10) - H = tree_graph(tree_data(G,1)) - nx.is_isomorphic(G,H) - - def test_graph_attributes(self): - G=nx.DiGraph() - G.add_nodes_from([1,2,3],color='red') - G.add_edge(1,2,foo=7) - G.add_edge(1,3,foo=10) - G.add_edge(3,4,foo=10) - H = tree_graph(tree_data(G,1)) - assert_equal(H.node[1]['color'],'red') - - d = json.dumps(tree_data(G,1)) - H = tree_graph(json.loads(d)) - assert_equal(H.node[1]['color'],'red') - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tree.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tree.py deleted file mode 100644 index d2229e9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/json_graph/tree.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -from itertools import count,repeat -import json -import networkx as nx -__author__ = """Aric Hagberg (hagberg@lanl.gov))""" -__all__ = ['tree_data', - 'tree_graph'] - -def tree_data(G, root): - """Return data in tree format that is suitable for JSON serialization - and use in Javascript documents. - - Parameters - ---------- - G : NetworkX graph - G must be an oriented tree - - root : node - The root of the tree - - Returns - ------- - data : dict - A dictionary with node-link formatted data. - - Examples - -------- - >>> from networkx.readwrite import json_graph - >>> G = nx.DiGraph([(1,2)]) - >>> data = json_graph.tree_data(G,root=1) - - To serialize with json - - >>> import json - >>> s = json.dumps(data) - - Notes - ----- - Node attributes are stored in this format but keys - for attributes must be strings if you want to serialize with JSON. - - Graph and edge attributes are not stored. - - See Also - -------- - tree_graph, node_link_data, node_link_data - """ - if not G.number_of_nodes()==G.number_of_edges()+1: - raise TypeError("G is not a tree.") - if not G.is_directed(): - raise TypeError("G is not directed") - def add_children(n, G): - nbrs = G[n] - if len(nbrs) == 0: - return [] - children = [] - for child in nbrs: - d = dict(id=child, **G.node[child]) - c = add_children(child,G) - if c: - d['children'] = c - children.append(d) - return children - data = dict(id=root, **G.node[root]) - data['children'] = add_children(root,G) - return data - -def tree_graph(data): - """Return graph from tree data format. - - Parameters - ---------- - data : dict - Tree formatted graph data - - Returns - ------- - G : NetworkX DiGraph - - Examples - -------- - >>> from networkx.readwrite import json_graph - >>> G = nx.DiGraph([(1,2)]) - >>> data = json_graph.tree_data(G,root=1) - >>> H = json_graph.tree_graph(data) - - See Also - -------- - tree_graph, node_link_data, adjacency_data - """ - graph = nx.DiGraph() - def add_children(parent, children): - for data in children: - child = data['id'] - graph.add_edge(parent, child) - grandchildren = data.get('children',[]) - if grandchildren: - add_children(child,grandchildren) - nodedata = dict((str(k),v) for k,v in data.items() - if k!='id' and k!='children') - graph.add_node(child,attr_dict=nodedata) - root = data['id'] - children = data.get('children',[]) - nodedata = dict((k,v) for k,v in data.items() - if k!='id' and k!='children') - graph.add_node(root, attr_dict=nodedata) - add_children(root, children) - return graph diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/leda.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/leda.py deleted file mode 100644 index a4d17db..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/leda.py +++ /dev/null @@ -1,106 +0,0 @@ -""" -Read graphs in LEDA format. - -LEDA is a C++ class library for efficient data types and algorithms. - -Format ------- -See http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html - -""" -# Original author: D. Eppstein, UC Irvine, August 12, 2003. -# The original code at http://www.ics.uci.edu/~eppstein/PADS/ is public domain. -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['read_leda', 'parse_leda'] - -import networkx as nx -from networkx.exception import NetworkXError -from networkx.utils import open_file, is_string_like - -@open_file(0,mode='rb') -def read_leda(path, encoding='UTF-8'): - """Read graph in LEDA format from path. - - Parameters - ---------- - path : file or string - File or filename to read. Filenames ending in .gz or .bz2 will be - uncompressed. - - Returns - ------- - G : NetworkX graph - - Examples - -------- - G=nx.read_leda('file.leda') - - References - ---------- - .. [1] http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html - """ - lines=(line.decode(encoding) for line in path) - G=parse_leda(lines) - return G - - -def parse_leda(lines): - """Read graph in LEDA format from string or iterable. - - Parameters - ---------- - lines : string or iterable - Data in LEDA format. - - Returns - ------- - G : NetworkX graph - - Examples - -------- - G=nx.parse_leda(string) - - References - ---------- - .. [1] http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html - """ - if is_string_like(lines): lines=iter(lines.split('\n')) - lines = iter([line.rstrip('\n') for line in lines \ - if not (line.startswith('#') or line.startswith('\n') or line=='')]) - for i in range(3): - next(lines) - # Graph - du = int(next(lines)) # -1=directed, -2=undirected - if du==-1: - G = nx.DiGraph() - else: - G = nx.Graph() - - # Nodes - n =int(next(lines)) # number of nodes - node={} - for i in range(1,n+1): # LEDA counts from 1 to n - symbol=next(lines).rstrip().strip('|{}| ') - if symbol=="": symbol=str(i) # use int if no label - could be trouble - node[i]=symbol - - G.add_nodes_from([s for i,s in node.items()]) - - # Edges - m = int(next(lines)) # number of edges - for i in range(m): - try: - s,t,reversal,label=next(lines).split() - except: - raise NetworkXError('Too few fields in LEDA.GRAPH edge %d'%(i+1)) - # BEWARE: no handling of reversal edges - G.add_edge(node[int(s)],node[int(t)],label=label[2:-2]) - return G - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/multiline_adjlist.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/multiline_adjlist.py deleted file mode 100644 index 30c3234..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/multiline_adjlist.py +++ /dev/null @@ -1,390 +0,0 @@ -# -*- coding: utf-8 -*- -""" -************************* -Multi-line Adjacency List -************************* -Read and write NetworkX graphs as multi-line adjacency lists. - -The multi-line adjacency list format is useful for graphs with -nodes that can be meaningfully represented as strings. With this format -simple edge data can be stored but node or graph data is not. - -Format ------- -The first label in a line is the source node label followed by the node degree -d. The next d lines are target node labels and optional edge data. -That pattern repeats for all nodes in the graph. - -The graph with edges a-b, a-c, d-e can be represented as the following -adjacency list (anything following the # in a line is a comment):: - - # example.multiline-adjlist - a 2 - b - c - d 1 - e -""" -__author__ = '\n'.join(['Aric Hagberg <hagberg@lanl.gov>', - 'Dan Schult <dschult@colgate.edu>', - 'Loïc Séguin-C. <loicseguin@gmail.com>']) -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['generate_multiline_adjlist', - 'write_multiline_adjlist', - 'parse_multiline_adjlist', - 'read_multiline_adjlist'] - -from networkx.utils import make_str, open_file -import networkx as nx - -def generate_multiline_adjlist(G, delimiter = ' '): - """Generate a single line of the graph G in multiline adjacency list format. - - Parameters - ---------- - G : NetworkX graph - - delimiter : string, optional - Separator for node labels - - Returns - ------- - lines : string - Lines of data in multiline adjlist format. - - Examples - -------- - >>> G = nx.lollipop_graph(4, 3) - >>> for line in nx.generate_multiline_adjlist(G): - ... print(line) - 0 3 - 1 {} - 2 {} - 3 {} - 1 2 - 2 {} - 3 {} - 2 1 - 3 {} - 3 1 - 4 {} - 4 1 - 5 {} - 5 1 - 6 {} - 6 0 - - See Also - -------- - write_multiline_adjlist, read_multiline_adjlist - """ - if G.is_directed(): - if G.is_multigraph(): - for s,nbrs in G.adjacency_iter(): - nbr_edges=[ (u,data) - for u,datadict in nbrs.items() - for key,data in datadict.items()] - deg=len(nbr_edges) - yield make_str(s)+delimiter+"%i"%(deg) - for u,d in nbr_edges: - if d is None: - yield make_str(u) - else: - yield make_str(u)+delimiter+make_str(d) - else: # directed single edges - for s,nbrs in G.adjacency_iter(): - deg=len(nbrs) - yield make_str(s)+delimiter+"%i"%(deg) - for u,d in nbrs.items(): - if d is None: - yield make_str(u) - else: - yield make_str(u)+delimiter+make_str(d) - else: # undirected - if G.is_multigraph(): - seen=set() # helper dict used to avoid duplicate edges - for s,nbrs in G.adjacency_iter(): - nbr_edges=[ (u,data) - for u,datadict in nbrs.items() - if u not in seen - for key,data in datadict.items()] - deg=len(nbr_edges) - yield make_str(s)+delimiter+"%i"%(deg) - for u,d in nbr_edges: - if d is None: - yield make_str(u) - else: - yield make_str(u)+delimiter+make_str(d) - seen.add(s) - else: # undirected single edges - seen=set() # helper dict used to avoid duplicate edges - for s,nbrs in G.adjacency_iter(): - nbr_edges=[ (u,d) for u,d in nbrs.items() if u not in seen] - deg=len(nbr_edges) - yield make_str(s)+delimiter+"%i"%(deg) - for u,d in nbr_edges: - if d is None: - yield make_str(u) - else: - yield make_str(u)+delimiter+make_str(d) - seen.add(s) - -@open_file(1,mode='wb') -def write_multiline_adjlist(G, path, delimiter=' ', - comments='#', encoding = 'utf-8'): - """ Write the graph G in multiline adjacency list format to path - - Parameters - ---------- - G : NetworkX graph - - comments : string, optional - Marker for comment lines - - delimiter : string, optional - Separator for node labels - - encoding : string, optional - Text encoding. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_multiline_adjlist(G,"test.adjlist") - - The path can be a file handle or a string with the name of the file. If a - file handle is provided, it has to be opened in 'wb' mode. - - >>> fh=open("test.adjlist",'wb') - >>> nx.write_multiline_adjlist(G,fh) - - Filenames ending in .gz or .bz2 will be compressed. - - >>> nx.write_multiline_adjlist(G,"test.adjlist.gz") - - See Also - -------- - read_multiline_adjlist - """ - import sys - import time - - pargs=comments+" ".join(sys.argv) - header = ("%s\n" % (pargs) - + comments + " GMT %s\n" % (time.asctime(time.gmtime())) - + comments + " %s\n" % (G.name)) - path.write(header.encode(encoding)) - - for multiline in generate_multiline_adjlist(G, delimiter): - multiline+='\n' - path.write(multiline.encode(encoding)) - -def parse_multiline_adjlist(lines, comments = '#', delimiter = None, - create_using = None, nodetype = None, - edgetype = None): - """Parse lines of a multiline adjacency list representation of a graph. - - Parameters - ---------- - lines : list or iterator of strings - Input data in multiline adjlist format - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - nodetype : Python type, optional - Convert nodes to this type. - - comments : string, optional - Marker for comment lines - - delimiter : string, optional - Separator for node labels. The default is whitespace. - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - - Returns - ------- - G: NetworkX graph - The graph corresponding to the lines in multiline adjacency list format. - - Examples - -------- - >>> lines = ['1 2', - ... "2 {'weight':3, 'name': 'Frodo'}", - ... "3 {}", - ... "2 1", - ... "5 {'weight':6, 'name': 'Saruman'}"] - >>> G = nx.parse_multiline_adjlist(iter(lines), nodetype = int) - >>> G.nodes() - [1, 2, 3, 5] - """ - from ast import literal_eval - if create_using is None: - G=nx.Graph() - else: - try: - G=create_using - G.clear() - except: - raise TypeError("Input graph is not a networkx graph type") - - for line in lines: - p=line.find(comments) - if p>=0: - line = line[:p] - if not line: continue - try: - (u,deg)=line.strip().split(delimiter) - deg=int(deg) - except: - raise TypeError("Failed to read node and degree on line (%s)"%line) - if nodetype is not None: - try: - u=nodetype(u) - except: - raise TypeError("Failed to convert node (%s) to type %s"\ - %(u,nodetype)) - G.add_node(u) - for i in range(deg): - while True: - try: - line = next(lines) - except StopIteration: - msg = "Failed to find neighbor for node (%s)" % (u,) - raise TypeError(msg) - p=line.find(comments) - if p>=0: - line = line[:p] - if line: break - vlist=line.strip().split(delimiter) - numb=len(vlist) - if numb<1: - continue # isolated node - v=vlist.pop(0) - data=''.join(vlist) - if nodetype is not None: - try: - v=nodetype(v) - except: - raise TypeError( - "Failed to convert node (%s) to type %s"\ - %(v,nodetype)) - if edgetype is not None: - try: - edgedata={'weight':edgetype(data)} - except: - raise TypeError( - "Failed to convert edge data (%s) to type %s"\ - %(data, edgetype)) - else: - try: # try to evaluate - edgedata=literal_eval(data) - except: - edgedata={} - G.add_edge(u,v,attr_dict=edgedata) - - return G - -@open_file(0,mode='rb') -def read_multiline_adjlist(path, comments="#", delimiter=None, - create_using=None, - nodetype=None, edgetype=None, - encoding = 'utf-8'): - """Read graph in multi-line adjacency list format from path. - - Parameters - ---------- - path : string or file - Filename or file handle to read. - Filenames ending in .gz or .bz2 will be uncompressed. - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - nodetype : Python type, optional - Convert nodes to this type. - - edgetype : Python type, optional - Convert edge data to this type. - - comments : string, optional - Marker for comment lines - - delimiter : string, optional - Separator for node labels. The default is whitespace. - - create_using: NetworkX graph container - Use given NetworkX graph for holding nodes or edges. - - - Returns - ------- - G: NetworkX graph - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_multiline_adjlist(G,"test.adjlist") - >>> G=nx.read_multiline_adjlist("test.adjlist") - - The path can be a file or a string with the name of the file. If a - file s provided, it has to be opened in 'rb' mode. - - >>> fh=open("test.adjlist", 'rb') - >>> G=nx.read_multiline_adjlist(fh) - - Filenames ending in .gz or .bz2 will be compressed. - - >>> nx.write_multiline_adjlist(G,"test.adjlist.gz") - >>> G=nx.read_multiline_adjlist("test.adjlist.gz") - - The optional nodetype is a function to convert node strings to nodetype. - - For example - - >>> G=nx.read_multiline_adjlist("test.adjlist", nodetype=int) - - will attempt to convert all nodes to integer type. - - The optional edgetype is a function to convert edge data strings to - edgetype. - - >>> G=nx.read_multiline_adjlist("test.adjlist") - - The optional create_using parameter is a NetworkX graph container. - The default is Graph(), an undirected graph. To read the data as - a directed graph use - - >>> G=nx.read_multiline_adjlist("test.adjlist", create_using=nx.DiGraph()) - - Notes - ----- - This format does not store graph, node, or edge data. - - See Also - -------- - write_multiline_adjlist - """ - lines = (line.decode(encoding) for line in path) - return parse_multiline_adjlist(lines, - comments = comments, - delimiter = delimiter, - create_using = create_using, - nodetype = nodetype, - edgetype = edgetype) - - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.adjlist') - os.unlink('test.adjlist.gz') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/nx_shp.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/nx_shp.py deleted file mode 100644 index d873ea6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/nx_shp.py +++ /dev/null @@ -1,224 +0,0 @@ -""" -********* -Shapefile -********* - -Generates a networkx.DiGraph from point and line shapefiles. - -"The Esri Shapefile or simply a shapefile is a popular geospatial vector -data format for geographic information systems software. It is developed -and regulated by Esri as a (mostly) open specification for data -interoperability among Esri and other software products." -See http://en.wikipedia.org/wiki/Shapefile for additional information. -""" -# Copyright (C) 2004-2010 by -# Ben Reilly <benwreilly@gmail.com> -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """Ben Reilly (benwreilly@gmail.com)""" -__all__ = ['read_shp', 'write_shp'] - - -def read_shp(path): - """Generates a networkx.DiGraph from shapefiles. Point geometries are - translated into nodes, lines into edges. Coordinate tuples are used as - keys. Attributes are preserved, line geometries are simplified into start - and end coordinates. Accepts a single shapefile or directory of many - shapefiles. - - "The Esri Shapefile or simply a shapefile is a popular geospatial vector - data format for geographic information systems software [1]_." - - Parameters - ---------- - path : file or string - File, directory, or filename to read. - - Returns - ------- - G : NetworkX graph - - Examples - -------- - >>> G=nx.read_shp('test.shp') # doctest: +SKIP - - References - ---------- - .. [1] http://en.wikipedia.org/wiki/Shapefile - """ - try: - from osgeo import ogr - except ImportError: - raise ImportError("read_shp requires OGR: http://www.gdal.org/") - - net = nx.DiGraph() - - def getfieldinfo(lyr, feature, flds): - f = feature - return [f.GetField(f.GetFieldIndex(x)) for x in flds] - - def addlyr(lyr, fields): - for findex in xrange(lyr.GetFeatureCount()): - f = lyr.GetFeature(findex) - flddata = getfieldinfo(lyr, f, fields) - g = f.geometry() - attributes = dict(zip(fields, flddata)) - attributes["ShpName"] = lyr.GetName() - if g.GetGeometryType() == 1: # point - net.add_node((g.GetPoint_2D(0)), attributes) - if g.GetGeometryType() == 2: # linestring - attributes["Wkb"] = g.ExportToWkb() - attributes["Wkt"] = g.ExportToWkt() - attributes["Json"] = g.ExportToJson() - last = g.GetPointCount() - 1 - net.add_edge(g.GetPoint_2D(0), g.GetPoint_2D(last), attributes) - - if isinstance(path, str): - shp = ogr.Open(path) - lyrcount = shp.GetLayerCount() # multiple layers indicate a directory - for lyrindex in xrange(lyrcount): - lyr = shp.GetLayerByIndex(lyrindex) - flds = [x.GetName() for x in lyr.schema] - addlyr(lyr, flds) - return net - - -def write_shp(G, outdir): - """Writes a networkx.DiGraph to two shapefiles, edges and nodes. - Nodes and edges are expected to have a Well Known Binary (Wkb) or - Well Known Text (Wkt) key in order to generate geometries. Also - acceptable are nodes with a numeric tuple key (x,y). - - "The Esri Shapefile or simply a shapefile is a popular geospatial vector - data format for geographic information systems software [1]_." - - Parameters - ---------- - outdir : directory path - Output directory for the two shapefiles. - - Returns - ------- - None - - Examples - -------- - nx.write_shp(digraph, '/shapefiles') # doctest +SKIP - - References - ---------- - .. [1] http://en.wikipedia.org/wiki/Shapefile - """ - try: - from osgeo import ogr - except ImportError: - raise ImportError("write_shp requires OGR: http://www.gdal.org/") - # easier to debug in python if ogr throws exceptions - ogr.UseExceptions() - - def netgeometry(key, data): - if 'Wkb' in data: - geom = ogr.CreateGeometryFromWkb(data['Wkb']) - elif 'Wkt' in data: - geom = ogr.CreateGeometryFromWkt(data['Wkt']) - elif type(key[0]).__name__ == 'tuple': # edge keys are packed tuples - geom = ogr.Geometry(ogr.wkbLineString) - _from, _to = key[0], key[1] - try: - geom.SetPoint(0, *_from) - geom.SetPoint(1, *_to) - except TypeError: - # assume user used tuple of int and choked ogr - _ffrom = [float(x) for x in _from] - _fto = [float(x) for x in _to] - geom.SetPoint(0, *_ffrom) - geom.SetPoint(1, *_fto) - else: - geom = ogr.Geometry(ogr.wkbPoint) - try: - geom.SetPoint(0, *key) - except TypeError: - # assume user used tuple of int and choked ogr - fkey = [float(x) for x in key] - geom.SetPoint(0, *fkey) - - return geom - - # Create_feature with new optional attributes arg (should be dict type) - def create_feature(geometry, lyr, attributes=None): - feature = ogr.Feature(lyr.GetLayerDefn()) - feature.SetGeometry(g) - if attributes != None: - # Loop through attributes, assigning data to each field - for field, data in attributes.iter(): - feature.SetField(field, data) - lyr.CreateFeature(feature) - feature.Destroy() - - drv = ogr.GetDriverByName("ESRI Shapefile") - shpdir = drv.CreateDataSource(outdir) - # delete pre-existing output first otherwise ogr chokes - try: - shpdir.DeleteLayer("nodes") - except: - pass - nodes = shpdir.CreateLayer("nodes", None, ogr.wkbPoint) - for n in G: - data = G.node[n] or {} - g = netgeometry(n, data) - create_feature(g, nodes) - try: - shpdir.DeleteLayer("edges") - except: - pass - edges = shpdir.CreateLayer("edges", None, ogr.wkbLineString) - - # New edge attribute write support merged into edge loop - fields = {} # storage for field names and their data types - attributes = {} # storage for attribute data (indexed by field names) - - # Conversion dict between python and ogr types - OGRTypes = {int: ogr.OFTInteger, str: ogr.OFTString, float: ogr.OFTReal} - - # Edge loop - for e in G.edges(data=True): - data = G.get_edge_data(*e) - g = netgeometry(e, data) - # Loop through attribute data in edges - for key, data in e[2].iter(): - # Reject spatial data not required for attribute table - if (key != 'Json' and key != 'Wkt' and key != 'Wkb' - and key != 'ShpName'): - # For all edges check/add field and data type to fields dict - if key not in fields: - # Field not in previous edges so add to dict - if type(data) in OGRTypes: - fields[key] = OGRTypes[type(data)] - else: - # Data type not supported, default to string (char 80) - fields[key] = ogr.OFTString - # Create the new field - newfield = ogr.FieldDefn(key, fields[key]) - edges.CreateField(newfield) - # Store the data from new field to dict for CreateLayer() - attributes[key] = data - else: - # Field already exists, add data to dict for CreateLayer() - attributes[key] = data - # Create the feature with, passing new attribute data - create_feature(g, edges, attributes) - - nodes, edges = None, None - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import ogr - except: - raise SkipTest("OGR not available") diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/nx_yaml.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/nx_yaml.py deleted file mode 100644 index 00c916f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/nx_yaml.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -**** -YAML -**** -Read and write NetworkX graphs in YAML format. - -"YAML is a data serialization format designed for human readability -and interaction with scripting languages." -See http://www.yaml.org for documentation. - -Format ------- -http://pyyaml.org/wiki/PyYAML - -""" -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['read_yaml', 'write_yaml'] - -import networkx as nx -from networkx.utils import open_file - -@open_file(1,mode='w') -def write_yaml(G, path, encoding='UTF-8', **kwds): - """Write graph G in YAML format to path. - - YAML is a data serialization format designed for human readability - and interaction with scripting languages [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be compressed. - encoding: string, optional - Specify which encoding to use when writing file. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_yaml(G,'test.yaml') - - References - ---------- - .. [1] http://www.yaml.org - """ - try: - import yaml - except ImportError: - raise ImportError("write_yaml() requires PyYAML: http://pyyaml.org/") - yaml.dump(G, path, **kwds) - -@open_file(0,mode='r') -def read_yaml(path): - """Read graph in YAML format from path. - - YAML is a data serialization format designed for human readability - and interaction with scripting languages [1]_. - - Parameters - ---------- - path : file or string - File or filename to read. Filenames ending in .gz or .bz2 - will be uncompressed. - - Returns - ------- - G : NetworkX graph - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_yaml(G,'test.yaml') - >>> G=nx.read_yaml('test.yaml') - - References - ---------- - .. [1] http://www.yaml.org - - """ - try: - import yaml - except ImportError: - raise ImportError("read_yaml() requires PyYAML: http://pyyaml.org/") - - G=yaml.load(path) - return G - - -# fixture for nose tests -def setup_module(module): - from nose import SkipTest - try: - import yaml - except: - raise SkipTest("PyYAML not available") - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.yaml') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/p2g.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/p2g.py deleted file mode 100644 index 92dca9d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/p2g.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -This module provides the following: read and write of p2g format -used in metabolic pathway studies. - -See http://www.cs.purdue.edu/homes/koyuturk/pathway/ for a description. - -The summary is included here: - -A file that describes a uniquely labeled graph (with extension ".gr") -format looks like the following: - - -name -3 4 -a -1 2 -b - -c -0 2 - -"name" is simply a description of what the graph corresponds to. The -second line displays the number of nodes and number of edges, -respectively. This sample graph contains three nodes labeled "a", "b", -and "c". The rest of the graph contains two lines for each node. The -first line for a node contains the node label. After the declaration -of the node label, the out-edges of that node in the graph are -provided. For instance, "a" is linked to nodes 1 and 2, which are -labeled "b" and "c", while the node labeled "b" has no outgoing -edges. Observe that node labeled "c" has an outgoing edge to -itself. Indeed, self-loops are allowed. Node index starts from 0. - -""" -# Copyright (C) 2008-2012 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx -from networkx.utils import is_string_like,open_file -__author__ = '\n'.join(['Willem Ligtenberg (w.p.a.ligtenberg@tue.nl)', - 'Aric Hagberg (aric.hagberg@gmail.com)']) - -@open_file(1,mode='w') -def write_p2g(G, path, encoding = 'utf-8'): - """Write NetworkX graph in p2g format. - - Notes - ----- - This format is meant to be used with directed graphs with - possible self loops. - """ - path.write(("%s\n"%G.name).encode(encoding)) - path.write(("%s %s\n"%(G.order(),G.size())).encode(encoding)) - nodes = G.nodes() - # make dictionary mapping nodes to integers - nodenumber=dict(zip(nodes,range(len(nodes)))) - for n in nodes: - path.write(("%s\n"%n).encode(encoding)) - for nbr in G.neighbors(n): - path.write(("%s "%nodenumber[nbr]).encode(encoding)) - path.write("\n".encode(encoding)) - -@open_file(0,mode='r') -def read_p2g(path, encoding='utf-8'): - """Read graph in p2g format from path. - - Returns - ------- - MultiDiGraph - - Notes - ----- - If you want a DiGraph (with no self loops allowed and no edge data) - use D=networkx.DiGraph(read_p2g(path)) - """ - lines = (line.decode(encoding) for line in path) - G=parse_p2g(lines) - return G - -def parse_p2g(lines): - """Parse p2g format graph from string or iterable. - - Returns - ------- - MultiDiGraph - """ - description = next(lines).strip() - # are multiedges (parallel edges) allowed? - G=networkx.MultiDiGraph(name=description,selfloops=True) - nnodes,nedges=map(int,next(lines).split()) - nodelabel={} - nbrs={} - # loop over the nodes keeping track of node labels and out neighbors - # defer adding edges until all node labels are known - for i in range(nnodes): - n=next(lines).strip() - nodelabel[i]=n - G.add_node(n) - nbrs[n]=map(int,next(lines).split()) - # now we know all of the node labels so we can add the edges - # with the correct labels - for n in G: - for nbr in nbrs[n]: - G.add_edge(n,nodelabel[nbr]) - return G diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/pajek.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/pajek.py deleted file mode 100644 index ffc3641..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/pajek.py +++ /dev/null @@ -1,231 +0,0 @@ -""" -***** -Pajek -***** -Read graphs in Pajek format. - -This implementation handles directed and undirected graphs including -those with self loops and parallel edges. - -Format ------- -See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm -for format information. -""" -# Copyright (C) 2008-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -from networkx.utils import is_string_like, open_file, make_str -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -__all__ = ['read_pajek', 'parse_pajek', 'generate_pajek', 'write_pajek'] - -def generate_pajek(G): - """Generate lines in Pajek graph format. - - Parameters - ---------- - G : graph - A Networkx graph - - References - ---------- - See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm - for format information. - """ - if G.name=='': - name='NetworkX' - else: - name=G.name - # Apparently many Pajek format readers can't process this line - # So we'll leave it out for now. - # yield '*network %s'%name - - # write nodes with attributes - yield '*vertices %s'%(G.order()) - nodes = G.nodes() - # make dictionary mapping nodes to integers - nodenumber=dict(zip(nodes,range(1,len(nodes)+1))) - for n in nodes: - na=G.node.get(n,{}) - x=na.get('x',0.0) - y=na.get('y',0.0) - id=int(na.get('id',nodenumber[n])) - nodenumber[n]=id - shape=na.get('shape','ellipse') - s=' '.join(map(make_qstr,(id,n,x,y,shape))) - for k,v in na.items(): - s+=' %s %s'%(make_qstr(k),make_qstr(v)) - yield s - - # write edges with attributes - if G.is_directed(): - yield '*arcs' - else: - yield '*edges' - for u,v,edgedata in G.edges(data=True): - d=edgedata.copy() - value=d.pop('weight',1.0) # use 1 as default edge value - s=' '.join(map(make_qstr,(nodenumber[u],nodenumber[v],value))) - for k,v in d.items(): - s+=' %s %s'%(make_qstr(k),make_qstr(v)) - s+=' %s %s'%(k,v) - yield s - -@open_file(1,mode='wb') -def write_pajek(G, path, encoding='UTF-8'): - """Write graph in Pajek format to path. - - Parameters - ---------- - G : graph - A Networkx graph - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be compressed. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_pajek(G, "test.net") - - References - ---------- - See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm - for format information. - """ - for line in generate_pajek(G): - line+='\n' - path.write(line.encode(encoding)) - -@open_file(0,mode='rb') -def read_pajek(path,encoding='UTF-8'): - """Read graph in Pajek format from path. - - Parameters - ---------- - path : file or string - File or filename to write. - Filenames ending in .gz or .bz2 will be uncompressed. - - Returns - ------- - G : NetworkX MultiGraph or MultiDiGraph. - - Examples - -------- - >>> G=nx.path_graph(4) - >>> nx.write_pajek(G, "test.net") - >>> G=nx.read_pajek("test.net") - - To create a Graph instead of a MultiGraph use - - >>> G1=nx.Graph(G) - - References - ---------- - See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm - for format information. - """ - lines = (line.decode(encoding) for line in path) - return parse_pajek(lines) - -def parse_pajek(lines): - """Parse Pajek format graph from string or iterable. - - Parameters - ---------- - lines : string or iterable - Data in Pajek format. - - Returns - ------- - G : NetworkX graph - - See Also - -------- - read_pajek() - - """ - import shlex - # multigraph=False - if is_string_like(lines): lines=iter(lines.split('\n')) - lines = iter([line.rstrip('\n') for line in lines]) - G=nx.MultiDiGraph() # are multiedges allowed in Pajek? assume yes - while lines: - try: - l=next(lines) - except: #EOF - break - if l.lower().startswith("*network"): - label,name=l.split() - G.name=name - if l.lower().startswith("*vertices"): - nodelabels={} - l,nnodes=l.split() - for i in range(int(nnodes)): - splitline=shlex.split(str(next(lines))) - id,label=splitline[0:2] - G.add_node(label) - nodelabels[id]=label - G.node[label]={'id':id} - try: - x,y,shape=splitline[2:5] - G.node[label].update({'x':float(x), - 'y':float(y), - 'shape':shape}) - except: - pass - extra_attr=zip(splitline[5::2],splitline[6::2]) - G.node[label].update(extra_attr) - if l.lower().startswith("*edges") or l.lower().startswith("*arcs"): - if l.lower().startswith("*edge"): - # switch from multidigraph to multigraph - G=nx.MultiGraph(G) - if l.lower().startswith("*arcs"): - # switch to directed with multiple arcs for each existing edge - G=G.to_directed() - for l in lines: - splitline=shlex.split(str(l)) - if len(splitline)<2: - continue - ui,vi=splitline[0:2] - u=nodelabels.get(ui,ui) - v=nodelabels.get(vi,vi) - # parse the data attached to this edge and put in a dictionary - edge_data={} - try: - # there should always be a single value on the edge? - w=splitline[2:3] - edge_data.update({'weight':float(w[0])}) - except: - pass - # if there isn't, just assign a 1 -# edge_data.update({'value':1}) - extra_attr=zip(splitline[3::2],splitline[4::2]) - edge_data.update(extra_attr) - # if G.has_edge(u,v): - # multigraph=True - G.add_edge(u,v,**edge_data) - return G - - - -def make_qstr(t): - """Return the string representation of t. - Add outer double-quotes if the string has a space. - """ - if not is_string_like(t): - t = str(t) - if " " in t: - t=r'"%s"'%t - return t - - -# fixture for nose tests -def teardown_module(module): - import os - os.unlink('test.net') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/sparsegraph6.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/sparsegraph6.py deleted file mode 100644 index 440c92a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/sparsegraph6.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -************** -SparseGraph 6 -************** -Read graphs in graph6 and sparse6 format. - -Format ------- - -"graph6 and sparse6 are formats for storing undirected graphs in a -compact manner, using only printable ASCII characters. Files in these -formats have text type and contain one line per graph." -http://cs.anu.edu.au/~bdm/data/formats.html - -See http://cs.anu.edu.au/~bdm/data/formats.txt for details. -""" -# Original author: D. Eppstein, UC Irvine, August 12, 2003. -# The original code at http://www.ics.uci.edu/~eppstein/PADS/ is public domain. -__author__ = """Aric Hagberg (hagberg@lanl.gov)""" -# Copyright (C) 2004-2010 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -__all__ = ['read_graph6', 'parse_graph6', 'read_graph6_list', - 'read_sparse6', 'parse_sparse6', 'read_sparse6_list'] - -import networkx as nx -from networkx.exception import NetworkXError -from networkx.utils import open_file - -# graph6 - -def read_graph6(path): - """Read simple undirected graphs in graph6 format from path. - - Returns a single Graph. - """ - return read_graph6_list(path)[0] - -def parse_graph6(str): - """Read a simple undirected graph in graph6 format from string. - - Returns a single Graph. - """ - def bits(): - """Return sequence of individual bits from 6-bit-per-value - list of data values.""" - for d in data: - for i in [5,4,3,2,1,0]: - yield (d>>i)&1 - - if str.startswith('>>graph6<<'): - str = str[10:] - data = graph6data(str) - n, data = graph6n(data) - nd = (n*(n-1)//2 + 5) // 6 - if len(data) != nd: - raise NetworkXError(\ - 'Expected %d bits but got %d in graph6' % (n*(n-1)//2, len(data)*6)) - - G=nx.Graph() - G.add_nodes_from(range(n)) - for (i,j),b in zip([(i,j) for j in range(1,n) for i in range(j)], bits()): - if b: G.add_edge(i,j) - return G - -@open_file(0,mode='rt') -def read_graph6_list(path): - """Read simple undirected graphs in graph6 format from path. - - Returns a list of Graphs, one for each line in file. - """ - glist=[] - for line in path: - line = line.strip() - if not len(line): continue - glist.append(parse_graph6(line)) - return glist - -# sparse6 - -def read_sparse6(path): - """Read simple undirected graphs in sparse6 format from path. - - Returns a single MultiGraph.""" - return read_sparse6_list(path)[0] - -@open_file(0,mode='rt') -def read_sparse6_list(path): - """Read undirected graphs in sparse6 format from path. - - Returns a list of MultiGraphs, one for each line in file.""" - glist=[] - for line in path: - line = line.strip() - if not len(line): continue - glist.append(parse_sparse6(line)) - return glist - -def parse_sparse6(string): - """Read undirected graph in sparse6 format from string. - - Returns a MultiGraph. - """ - if string.startswith('>>sparse6<<'): - string = str[10:] - if not string.startswith(':'): - raise NetworkXError('Expected colon in sparse6') - n, data = graph6n(graph6data(string[1:])) - k = 1 - while 1<<k < n: - k += 1 - - def parseData(): - """Return stream of pairs b[i], x[i] for sparse6 format.""" - chunks = iter(data) - d = None # partial data word - dLen = 0 # how many unparsed bits are left in d - - while 1: - if dLen < 1: - d = next(chunks) - dLen = 6 - dLen -= 1 - b = (d>>dLen) & 1 # grab top remaining bit - - x = d & ((1<<dLen)-1) # partially built up value of x - xLen = dLen # how many bits included so far in x - while xLen < k: # now grab full chunks until we have enough - d = next(chunks) - dLen = 6 - x = (x<<6) + d - xLen += 6 - x = (x >> (xLen - k)) # shift back the extra bits - dLen = xLen - k - yield b,x - - v = 0 - - G=nx.MultiGraph() - G.add_nodes_from(range(n)) - - for b,x in parseData(): - if b: v += 1 - if x >= n: break # padding with ones can cause overlarge number here - elif x > v: v = x - else: - G.add_edge(x,v) - - return G - -# helper functions - -def graph6data(str): - """Convert graph6 character sequence to 6-bit integers.""" - v = [ord(c)-63 for c in str] - if min(v) < 0 or max(v) > 63: - return None - return v - -def graph6n(data): - """Read initial one or four-unit value from graph6 sequence. - Return value, rest of seq.""" - if data[0] <= 62: - return data[0], data[1:] - return (data[1]<<12) + (data[2]<<6) + data[3], data[4:] diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_adjlist.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_adjlist.py deleted file mode 100644 index 9b3c0f2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_adjlist.py +++ /dev/null @@ -1,283 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Unit tests for adjlist. -""" -import io -from nose.tools import assert_equal, assert_raises, assert_not_equal -import os -import tempfile -import networkx as nx -from networkx.testing import * - - -class TestAdjlist(): - - def setUp(self): - self.G=nx.Graph(name="test") - e=[('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('a','f')] - self.G.add_edges_from(e) - self.G.add_node('g') - self.DG=nx.DiGraph(self.G) - self.XG=nx.MultiGraph() - self.XG.add_weighted_edges_from([(1,2,5),(1,2,5),(1,2,1),(3,3,42)]) - self. XDG=nx.MultiDiGraph(self.XG) - - def test_read_multiline_adjlist_1(self): - # Unit test for https://networkx.lanl.gov/trac/ticket/252 - s = b"""# comment line -1 2 -# comment line -2 -3 -""" - bytesIO = io.BytesIO(s) - G = nx.read_multiline_adjlist(bytesIO) - adj = {'1': {'3': {}, '2': {}}, '3': {'1': {}}, '2': {'1': {}}} - assert_equal(G.adj, adj) - - def test_unicode(self): - G = nx.Graph() - try: # Python 3.x - name1 = chr(2344) + chr(123) + chr(6543) - name2 = chr(5543) + chr(1543) + chr(324) - except ValueError: # Python 2.6+ - name1 = unichr(2344) + unichr(123) + unichr(6543) - name2 = unichr(5543) + unichr(1543) + unichr(324) - G.add_edge(name1, 'Radiohead', {name2: 3}) - fd, fname = tempfile.mkstemp() - nx.write_multiline_adjlist(G, fname) - H = nx.read_multiline_adjlist(fname) - assert_equal(G.adj, H.adj) - os.close(fd) - os.unlink(fname) - - def test_latin1_error(self): - G = nx.Graph() - try: # Python 3.x - name1 = chr(2344) + chr(123) + chr(6543) - name2 = chr(5543) + chr(1543) + chr(324) - except ValueError: # Python 2.6+ - name1 = unichr(2344) + unichr(123) + unichr(6543) - name2 = unichr(5543) + unichr(1543) + unichr(324) - G.add_edge(name1, 'Radiohead', {name2: 3}) - fd, fname = tempfile.mkstemp() - assert_raises(UnicodeEncodeError, - nx.write_multiline_adjlist, - G, fname, encoding = 'latin-1') - os.close(fd) - os.unlink(fname) - - def test_latin1(self): - G = nx.Graph() - try: # Python 3.x - blurb = chr(1245) # just to trigger the exception - name1 = 'Bj' + chr(246) + 'rk' - name2 = chr(220) + 'ber' - except ValueError: # Python 2.6+ - name1 = 'Bj' + unichr(246) + 'rk' - name2 = unichr(220) + 'ber' - G.add_edge(name1, 'Radiohead', {name2: 3}) - fd, fname = tempfile.mkstemp() - nx.write_multiline_adjlist(G, fname, encoding = 'latin-1') - H = nx.read_multiline_adjlist(fname, encoding = 'latin-1') - assert_equal(G.adj, H.adj) - os.close(fd) - os.unlink(fname) - - - - def test_adjlist_graph(self): - G=self.G - (fd,fname)=tempfile.mkstemp() - nx.write_adjlist(G,fname) - H=nx.read_adjlist(fname) - H2=nx.read_adjlist(fname) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - def test_adjlist_digraph(self): - G=self.DG - (fd,fname)=tempfile.mkstemp() - nx.write_adjlist(G,fname) - H=nx.read_adjlist(fname,create_using=nx.DiGraph()) - H2=nx.read_adjlist(fname,create_using=nx.DiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_adjlist_integers(self): - (fd,fname)=tempfile.mkstemp() - G=nx.convert_node_labels_to_integers(self.G) - nx.write_adjlist(G,fname) - H=nx.read_adjlist(fname,nodetype=int) - H2=nx.read_adjlist(fname,nodetype=int) - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_adjlist_digraph(self): - G=self.DG - (fd,fname)=tempfile.mkstemp() - nx.write_adjlist(G,fname) - H=nx.read_adjlist(fname,create_using=nx.DiGraph()) - H2=nx.read_adjlist(fname,create_using=nx.DiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_adjlist_multigraph(self): - G=self.XG - (fd,fname)=tempfile.mkstemp() - nx.write_adjlist(G,fname) - H=nx.read_adjlist(fname,nodetype=int, - create_using=nx.MultiGraph()) - H2=nx.read_adjlist(fname,nodetype=int, - create_using=nx.MultiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - def test_adjlist_multidigraph(self): - G=self.XDG - (fd,fname)=tempfile.mkstemp() - nx.write_adjlist(G,fname) - H=nx.read_adjlist(fname,nodetype=int, - create_using=nx.MultiDiGraph()) - H2=nx.read_adjlist(fname,nodetype=int, - create_using=nx.MultiDiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_adjlist_delimiter(self): - fh=io.BytesIO() - G = nx.path_graph(3) - nx.write_adjlist(G, fh, delimiter=':') - fh.seek(0) - H = nx.read_adjlist(fh, nodetype=int, delimiter=':') - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - - - - - - -class TestMultilineAdjlist(): - - def setUp(self): - self.G=nx.Graph(name="test") - e=[('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('a','f')] - self.G.add_edges_from(e) - self.G.add_node('g') - self.DG=nx.DiGraph(self.G) - self.DG.remove_edge('b','a') - self.DG.remove_edge('b','c') - self.XG=nx.MultiGraph() - self.XG.add_weighted_edges_from([(1,2,5),(1,2,5),(1,2,1),(3,3,42)]) - self. XDG=nx.MultiDiGraph(self.XG) - - - def test_multiline_adjlist_graph(self): - G=self.G - (fd,fname)=tempfile.mkstemp() - nx.write_multiline_adjlist(G,fname) - H=nx.read_multiline_adjlist(fname) - H2=nx.read_multiline_adjlist(fname) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_multiline_adjlist_digraph(self): - G=self.DG - (fd,fname)=tempfile.mkstemp() - nx.write_multiline_adjlist(G,fname) - H=nx.read_multiline_adjlist(fname,create_using=nx.DiGraph()) - H2=nx.read_multiline_adjlist(fname,create_using=nx.DiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_multiline_adjlist_integers(self): - (fd,fname)=tempfile.mkstemp() - G=nx.convert_node_labels_to_integers(self.G) - nx.write_multiline_adjlist(G,fname) - H=nx.read_multiline_adjlist(fname,nodetype=int) - H2=nx.read_multiline_adjlist(fname,nodetype=int) - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_multiline_adjlist_digraph(self): - G=self.DG - (fd,fname)=tempfile.mkstemp() - nx.write_multiline_adjlist(G,fname) - H=nx.read_multiline_adjlist(fname,create_using=nx.DiGraph()) - H2=nx.read_multiline_adjlist(fname,create_using=nx.DiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_edges_equal(H.edges(),G.edges()) - os.close(fd) - os.unlink(fname) - - - def test_multiline_adjlist_multigraph(self): - G=self.XG - (fd,fname)=tempfile.mkstemp() - nx.write_multiline_adjlist(G,fname) - H=nx.read_multiline_adjlist(fname,nodetype=int, - create_using=nx.MultiGraph()) - H2=nx.read_multiline_adjlist(fname,nodetype=int, - create_using=nx.MultiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - def test_multiline_adjlist_multidigraph(self): - G=self.XDG - (fd,fname)=tempfile.mkstemp() - nx.write_multiline_adjlist(G,fname) - H=nx.read_multiline_adjlist(fname,nodetype=int, - create_using=nx.MultiDiGraph()) - H2=nx.read_multiline_adjlist(fname,nodetype=int, - create_using=nx.MultiDiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - def test_multiline_adjlist_delimiter(self): - fh=io.BytesIO() - G = nx.path_graph(3) - nx.write_multiline_adjlist(G, fh, delimiter=':') - fh.seek(0) - H = nx.read_multiline_adjlist(fh, nodetype=int, delimiter=':') - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_edgelist.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_edgelist.py deleted file mode 100644 index be70bba..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_edgelist.py +++ /dev/null @@ -1,234 +0,0 @@ -""" - Unit tests for edgelists. -""" -from nose.tools import assert_equal, assert_raises, assert_not_equal -import networkx as nx -import io -import tempfile -import os - -def assert_equal_edges(elist1,elist2): - if len(elist1[0]) == 2: - return assert_equal(sorted(sorted(e) for e in elist1), - sorted(sorted(e) for e in elist2)) - else: - return assert_equal(sorted((sorted((u, v)), d) for u, v, d in elist1), - sorted((sorted((u, v)), d) for u, v, d in elist2)) - -class TestEdgelist: - - def setUp(self): - self.G=nx.Graph(name="test") - e=[('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('a','f')] - self.G.add_edges_from(e) - self.G.add_node('g') - self.DG=nx.DiGraph(self.G) - self.XG=nx.MultiGraph() - self.XG.add_weighted_edges_from([(1,2,5),(1,2,5),(1,2,1),(3,3,42)]) - self. XDG=nx.MultiDiGraph(self.XG) - - - def test_read_edgelist_1(self): - s = b"""\ -# comment line -1 2 -# comment line -2 3 -""" - bytesIO = io.BytesIO(s) - G = nx.read_edgelist(bytesIO,nodetype=int) - assert_equal_edges(G.edges(),[(1,2),(2,3)]) - - def test_read_edgelist_2(self): - s = b"""\ -# comment line -1 2 2.0 -# comment line -2 3 3.0 -""" - bytesIO = io.BytesIO(s) - G = nx.read_edgelist(bytesIO,nodetype=int,data=False) - assert_equal_edges(G.edges(),[(1,2),(2,3)]) - - bytesIO = io.BytesIO(s) - G = nx.read_weighted_edgelist(bytesIO,nodetype=int) - assert_equal_edges(G.edges(data=True),[(1,2,{'weight':2.0}),(2,3,{'weight':3.0})]) - - def test_read_edgelist_3(self): - s = b"""\ -# comment line -1 2 {'weight':2.0} -# comment line -2 3 {'weight':3.0} -""" - bytesIO = io.BytesIO(s) - G = nx.read_edgelist(bytesIO,nodetype=int,data=False) - assert_equal_edges(G.edges(),[(1,2),(2,3)]) - - bytesIO = io.BytesIO(s) - G = nx.read_edgelist(bytesIO,nodetype=int,data=True) - assert_equal_edges(G.edges(data=True),[(1,2,{'weight':2.0}),(2,3,{'weight':3.0})]) - - def test_write_edgelist_1(self): - fh=io.BytesIO() - G=nx.Graph() - G.add_edges_from([(1,2),(2,3)]) - nx.write_edgelist(G,fh,data=False) - fh.seek(0) - assert_equal(fh.read(),b"1 2\n2 3\n") - - def test_write_edgelist_2(self): - fh=io.BytesIO() - G=nx.Graph() - G.add_edges_from([(1,2),(2,3)]) - nx.write_edgelist(G,fh,data=True) - fh.seek(0) - assert_equal(fh.read(),b"1 2 {}\n2 3 {}\n") - - def test_write_edgelist_3(self): - fh=io.BytesIO() - G=nx.Graph() - G.add_edge(1,2,weight=2.0) - G.add_edge(2,3,weight=3.0) - nx.write_edgelist(G,fh,data=True) - fh.seek(0) - assert_equal(fh.read(),b"1 2 {'weight': 2.0}\n2 3 {'weight': 3.0}\n") - - def test_write_edgelist_4(self): - fh=io.BytesIO() - G=nx.Graph() - G.add_edge(1,2,weight=2.0) - G.add_edge(2,3,weight=3.0) - nx.write_edgelist(G,fh,data=[('weight')]) - fh.seek(0) - assert_equal(fh.read(),b"1 2 2.0\n2 3 3.0\n") - - def test_unicode(self): - G = nx.Graph() - try: # Python 3.x - name1 = chr(2344) + chr(123) + chr(6543) - name2 = chr(5543) + chr(1543) + chr(324) - except ValueError: # Python 2.6+ - name1 = unichr(2344) + unichr(123) + unichr(6543) - name2 = unichr(5543) + unichr(1543) + unichr(324) - G.add_edge(name1, 'Radiohead', attr_dict={name2: 3}) - fd, fname = tempfile.mkstemp() - nx.write_edgelist(G, fname) - H = nx.read_edgelist(fname) - assert_equal(G.adj, H.adj) - os.close(fd) - os.unlink(fname) - - def test_latin1_error(self): - G = nx.Graph() - try: # Python 3.x - name1 = chr(2344) + chr(123) + chr(6543) - name2 = chr(5543) + chr(1543) + chr(324) - except ValueError: # Python 2.6+ - name1 = unichr(2344) + unichr(123) + unichr(6543) - name2 = unichr(5543) + unichr(1543) + unichr(324) - G.add_edge(name1, 'Radiohead', attr_dict={name2: 3}) - fd, fname = tempfile.mkstemp() - assert_raises(UnicodeEncodeError, - nx.write_edgelist, - G, fname, encoding = 'latin-1') - os.close(fd) - os.unlink(fname) - - def test_latin1(self): - G = nx.Graph() - try: # Python 3.x - blurb = chr(1245) # just to trigger the exception - name1 = 'Bj' + chr(246) + 'rk' - name2 = chr(220) + 'ber' - except ValueError: # Python 2.6+ - name1 = 'Bj' + unichr(246) + 'rk' - name2 = unichr(220) + 'ber' - G.add_edge(name1, 'Radiohead', attr_dict={name2: 3}) - fd, fname = tempfile.mkstemp() - nx.write_edgelist(G, fname, encoding = 'latin-1') - H = nx.read_edgelist(fname, encoding = 'latin-1') - assert_equal(G.adj, H.adj) - os.close(fd) - os.unlink(fname) - - - def test_edgelist_graph(self): - G=self.G - (fd,fname)=tempfile.mkstemp() - nx.write_edgelist(G,fname) - H=nx.read_edgelist(fname) - H2=nx.read_edgelist(fname) - assert_not_equal(H,H2) # they should be different graphs - G.remove_node('g') # isolated nodes are not written in edgelist - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - def test_edgelist_digraph(self): - G=self.DG - (fd,fname)=tempfile.mkstemp() - nx.write_edgelist(G,fname) - H=nx.read_edgelist(fname,create_using=nx.DiGraph()) - H2=nx.read_edgelist(fname,create_using=nx.DiGraph()) - assert_not_equal(H,H2) # they should be different graphs - G.remove_node('g') # isolated nodes are not written in edgelist - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_edgelist_integers(self): - G=nx.convert_node_labels_to_integers(self.G) - (fd,fname)=tempfile.mkstemp() - nx.write_edgelist(G,fname) - H=nx.read_edgelist(fname,nodetype=int) - # isolated nodes are not written in edgelist - G.remove_nodes_from(nx.isolates(G)) - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_edgelist_digraph(self): - G=self.DG - (fd,fname)=tempfile.mkstemp() - nx.write_edgelist(G,fname) - H=nx.read_edgelist(fname,create_using=nx.DiGraph()) - G.remove_node('g') # isolated nodes are not written in edgelist - H2=nx.read_edgelist(fname,create_using=nx.DiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - - def test_edgelist_multigraph(self): - G=self.XG - (fd,fname)=tempfile.mkstemp() - nx.write_edgelist(G,fname) - H=nx.read_edgelist(fname,nodetype=int,create_using=nx.MultiGraph()) - H2=nx.read_edgelist(fname,nodetype=int,create_using=nx.MultiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - def test_edgelist_multidigraph(self): - G=self.XDG - (fd,fname)=tempfile.mkstemp() - nx.write_edgelist(G,fname) - H=nx.read_edgelist(fname,nodetype=int,create_using=nx.MultiDiGraph()) - H2=nx.read_edgelist(fname,nodetype=int,create_using=nx.MultiDiGraph()) - assert_not_equal(H,H2) # they should be different graphs - assert_equal(sorted(H.nodes()),sorted(G.nodes())) - assert_equal(sorted(H.edges()),sorted(G.edges())) - os.close(fd) - os.unlink(fname) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gexf.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gexf.py deleted file mode 100644 index bbd86ba..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gexf.py +++ /dev/null @@ -1,306 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx as nx -import io - -class TestGEXF(object): - @classmethod - def setupClass(cls): - try: - import xml.etree.ElementTree - except ImportError: - raise SkipTest('xml.etree.ElementTree not available.') - - def setUp(self): - self.simple_directed_data="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" version="1.1"> - <graph mode="static" defaultedgetype="directed"> - <nodes> - <node id="0" label="Hello" /> - <node id="1" label="Word" /> - </nodes> - <edges> - <edge id="0" source="0" target="1" /> - </edges> - </graph> -</gexf> -""" - self.simple_directed_graph=nx.DiGraph() - self.simple_directed_graph.add_node('0',label='Hello') - self.simple_directed_graph.add_node('1',label='World') - self.simple_directed_graph.add_edge('0','1',id='0') - - self.simple_directed_fh = \ - io.BytesIO(self.simple_directed_data.encode('UTF-8')) - - - self.attribute_data="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gexf.net/1.1draft http://www.gexf.net/1.1draft/gexf.xsd" version="1.1"> - <meta lastmodifieddate="2009-03-20"> - <creator>Gephi.org</creator> - <description>A Web network</description> - </meta> - <graph defaultedgetype="directed"> - <attributes class="node"> - <attribute id="0" title="url" type="string"/> - <attribute id="1" title="indegree" type="integer"/> - <attribute id="2" title="frog" type="boolean"> - <default>true</default> - </attribute> - </attributes> - <nodes> - <node id="0" label="Gephi"> - <attvalues> - <attvalue for="0" value="http://gephi.org"/> - <attvalue for="1" value="1"/> - </attvalues> - </node> - <node id="1" label="Webatlas"> - <attvalues> - <attvalue for="0" value="http://webatlas.fr"/> - <attvalue for="1" value="2"/> - </attvalues> - </node> - <node id="2" label="RTGI"> - <attvalues> - <attvalue for="0" value="http://rtgi.fr"/> - <attvalue for="1" value="1"/> - </attvalues> - </node> - <node id="3" label="BarabasiLab"> - <attvalues> - <attvalue for="0" value="http://barabasilab.com"/> - <attvalue for="1" value="1"/> - <attvalue for="2" value="false"/> - </attvalues> - </node> - </nodes> - <edges> - <edge id="0" source="0" target="1"/> - <edge id="1" source="0" target="2"/> - <edge id="2" source="1" target="0"/> - <edge id="3" source="2" target="1"/> - <edge id="4" source="0" target="3"/> - </edges> - </graph> -</gexf> -""" - self.attribute_graph=nx.DiGraph() - self.attribute_graph.graph['node_default']={'frog':True} - self.attribute_graph.add_node('0', - label='Gephi', - url='http://gephi.org', - indegree=1) - self.attribute_graph.add_node('1', - label='Webatlas', - url='http://webatlas.fr', - indegree=2) - - self.attribute_graph.add_node('2', - label='RTGI', - url='http://rtgi.fr', - indegree=1) - - self.attribute_graph.add_node('3', - label='BarabasiLab', - url='http://barabasilab.com', - indegree=1, - frog=False) - self.attribute_graph.add_edge('0','1',id='0') - self.attribute_graph.add_edge('0','2',id='1') - self.attribute_graph.add_edge('1','0',id='2') - self.attribute_graph.add_edge('2','1',id='3') - self.attribute_graph.add_edge('0','3',id='4') - self.attribute_fh = io.BytesIO(self.attribute_data.encode('UTF-8')) - - self.simple_undirected_data="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" version="1.1"> - <graph mode="static" defaultedgetype="undirected"> - <nodes> - <node id="0" label="Hello" /> - <node id="1" label="Word" /> - </nodes> - <edges> - <edge id="0" source="0" target="1" /> - </edges> - </graph> -</gexf> -""" - self.simple_undirected_graph=nx.Graph() - self.simple_undirected_graph.add_node('0',label='Hello') - self.simple_undirected_graph.add_node('1',label='World') - self.simple_undirected_graph.add_edge('0','1',id='0') - - self.simple_undirected_fh = io.BytesIO(self.simple_undirected_data.encode('UTF-8')) - - - def test_read_simple_directed_graphml(self): - G=self.simple_directed_graph - H=nx.read_gexf(self.simple_directed_fh) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal(sorted(G.edges()),sorted(H.edges())) - assert_equal(sorted(G.edges(data=True)), - sorted(H.edges(data=True))) - self.simple_directed_fh.seek(0) - - def test_write_read_simple_directed_graphml(self): - G=self.simple_directed_graph - fh=io.BytesIO() - nx.write_gexf(G,fh) - fh.seek(0) - H=nx.read_gexf(fh) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal(sorted(G.edges()),sorted(H.edges())) - assert_equal(sorted(G.edges(data=True)), - sorted(H.edges(data=True))) - self.simple_directed_fh.seek(0) - - def test_read_simple_undirected_graphml(self): - G=self.simple_undirected_graph - H=nx.read_gexf(self.simple_undirected_fh) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal( - sorted(sorted(e) for e in G.edges()), - sorted(sorted(e) for e in H.edges())) - self.simple_undirected_fh.seek(0) - - def test_read_attribute_graphml(self): - G=self.attribute_graph - H=nx.read_gexf(self.attribute_fh) - assert_equal(sorted(G.nodes(True)),sorted(H.nodes(data=True))) - ge=sorted(G.edges(data=True)) - he=sorted(H.edges(data=True)) - for a,b in zip(ge,he): - assert_equal(a,b) - self.attribute_fh.seek(0) - - def test_directed_edge_in_undirected(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" version="1.1"> - <graph mode="static" defaultedgetype="undirected"> - <nodes> - <node id="0" label="Hello" /> - <node id="1" label="Word" /> - </nodes> - <edges> - <edge id="0" source="0" target="1" type="directed"/> - </edges> - </graph> -</gexf> -""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_gexf,fh) - - def test_undirected_edge_in_directed(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" version="1.1"> - <graph mode="static" defaultedgetype="directed"> - <nodes> - <node id="0" label="Hello" /> - <node id="1" label="Word" /> - </nodes> - <edges> - <edge id="0" source="0" target="1" type="undirected"/> - </edges> - </graph> -</gexf> -""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_gexf,fh) - - - def test_key_error(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" version="1.1"> - <graph mode="static" defaultedgetype="directed"> - <nodes> - <node id="0" label="Hello"> - <attvalues> - <attvalue for='0' value='1'/> - </attvalues> - </node> - <node id="1" label="Word" /> - </nodes> - <edges> - <edge id="0" source="0" target="1" type="undirected"/> - </edges> - </graph> -</gexf> -""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_gexf,fh) - - def test_relabel(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<gexf xmlns="http://www.gexf.net/1.1draft" version="1.1"> - <graph mode="static" defaultedgetype="directed"> - <nodes> - <node id="0" label="Hello" /> - <node id="1" label="Word" /> - </nodes> - <edges> - <edge id="0" source="0" target="1"/> - </edges> - </graph> -</gexf> -""" - fh = io.BytesIO(s.encode('UTF-8')) - G=nx.read_gexf(fh,relabel=True) - assert_equal(sorted(G.nodes()),["Hello","Word"]) - - - def test_default_attribute(self): - G=nx.Graph() - G.add_node(1,label='1',color='green') - G.add_path([0,1,2,3]) - G.add_edge(1,2,foo=3) - G.graph['node_default']={'color':'yellow'} - G.graph['edge_default']={'foo':7} - fh = io.BytesIO() - nx.write_gexf(G,fh) - fh.seek(0) - H=nx.read_gexf(fh,node_type=int) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal( - sorted(sorted(e) for e in G.edges()), - sorted(sorted(e) for e in H.edges())) - assert_equal(G.graph,H.graph) - - def test_serialize_ints_to_strings(self): - G=nx.Graph() - G.add_node(1,id=7,label=77) - fh = io.BytesIO() - nx.write_gexf(G,fh) - fh.seek(0) - H=nx.read_gexf(fh,node_type=int) - assert_equal(H.nodes(),[7]) - assert_equal(H.node[7]['label'],'77') - - def test_write_with_node_attributes(self): - # Addresses #673. - G = nx.path_graph(4) - for i in range(4): - G.node[i]['id'] = i - G.node[i]['label'] = i - G.node[i]['pid'] = i - - expected = """<gexf version="1.1" xmlns="http://www.gexf.net/1.1draft" xmlns:viz="http://www.gexf.net/1.1draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance"> - <graph defaultedgetype="undirected" mode="static"> - <nodes> - <node id="0" label="0" pid="0" /> - <node id="1" label="1" pid="1" /> - <node id="2" label="2" pid="2" /> - <node id="3" label="3" pid="3" /> - </nodes> - <edges> - <edge id="0" source="0" target="1" /> - <edge id="1" source="1" target="2" /> - <edge id="2" source="2" target="3" /> - </edges> - </graph> -</gexf>""" - obtained = '\n'.join(nx.generate_gexf(G)) - assert_equal( expected, obtained ) - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gml.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gml.py deleted file mode 100644 index ed63bd2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gml.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python -import io -from nose.tools import * -from nose import SkipTest -import networkx - -class TestGraph(object): - @classmethod - def setupClass(cls): - global pyparsing - try: - import pyparsing - except ImportError: - try: - import matplotlib.pyparsing as pyparsing - except: - raise SkipTest('gml test: pyparsing not available.') - - def setUp(self): - self.simple_data="""Creator me -graph [ - comment "This is a sample graph" - directed 1 - IsPlanar 1 - pos [ x 0 y 1 ] - node [ - id 1 - label "Node 1" - pos [ x 1 y 1 ] - ] - node [ - id 2 - pos [ x 1 y 2 ] - label "Node 2" - ] - node [ - id 3 - label "Node 3" - pos [ x 1 y 3 ] - ] - edge [ - source 1 - target 2 - label "Edge from node 1 to node 2" - color [line "blue" thickness 3] - - ] - edge [ - source 2 - target 3 - label "Edge from node 2 to node 3" - ] - edge [ - source 3 - target 1 label - "Edge from node 3 to node 1" - ] -] -""" - def test_parse_gml(self): - G=networkx.parse_gml(self.simple_data,relabel=True) - assert_equals(sorted(G.nodes()),\ - ['Node 1', 'Node 2', 'Node 3']) - assert_equals( [e for e in sorted(G.edges())],\ - [('Node 1', 'Node 2'), - ('Node 2', 'Node 3'), - ('Node 3', 'Node 1')]) - - assert_equals( [e for e in sorted(G.edges(data=True))],\ - [('Node 1', 'Node 2', - {'color': {'line': 'blue', 'thickness': 3}, - 'label': 'Edge from node 1 to node 2'}), - ('Node 2', 'Node 3', - {'label': 'Edge from node 2 to node 3'}), - ('Node 3', 'Node 1', - {'label': 'Edge from node 3 to node 1'})]) - - - def test_read_gml(self): - import os,tempfile - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - fh.write(self.simple_data) - fh.close() - Gin=networkx.read_gml(fname,relabel=True) - G=networkx.parse_gml(self.simple_data,relabel=True) - assert_equals( sorted(G.nodes(data=True)), sorted(Gin.nodes(data=True))) - assert_equals( sorted(G.edges(data=True)), sorted(Gin.edges(data=True))) - os.close(fd) - os.unlink(fname) - - def test_relabel_duplicate(self): - data=""" -graph -[ - label "" - directed 1 - node - [ - id 0 - label "same" - ] - node - [ - id 1 - label "same" - ] -] -""" - fh = io.BytesIO(data.encode('UTF-8')) - fh.seek(0) - assert_raises(networkx.NetworkXError,networkx.read_gml,fh,relabel=True) - - def test_bool(self): - G=networkx.Graph() - G.add_node(1,on=True) - G.add_edge(1,2,on=False) - data = '\n'.join(list(networkx.generate_gml(G))) - answer ="""graph [ - node [ - id 0 - label 1 - on 1 - ] - node [ - id 1 - label 2 - ] - edge [ - source 0 - target 1 - on 0 - ] -]""" - assert_equal(data,answer) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gpickle.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gpickle.py deleted file mode 100644 index 429f753..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_gpickle.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -from nose.tools import assert_equal -import networkx as nx -import os,tempfile - -class TestGpickle(object): - def setUp(self): - G=nx.Graph(name="test") - e=[('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('a','f')] - G.add_edges_from(e,width=10) - G.add_node('g',color='green') - G.graph['number']=1 - self.G=G - - def test_gpickle(self): - G=self.G - (fd,fname)=tempfile.mkstemp() - nx.write_gpickle(G,fname); - Gin=nx.read_gpickle(fname); - assert_equal(sorted(G.nodes(data=True)), - sorted(Gin.nodes(data=True))) - assert_equal(sorted(G.edges(data=True)), - sorted(Gin.edges(data=True))) - assert_equal(G.graph,Gin.graph) - os.close(fd) - os.unlink(fname) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_graphml.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_graphml.py deleted file mode 100644 index c21c89b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_graphml.py +++ /dev/null @@ -1,445 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from nose import SkipTest -import networkx as nx -import io -import tempfile -import os - -class TestGraph(object): - @classmethod - def setupClass(cls): - try: - import xml.etree.ElementTree - except ImportError: - raise SkipTest('xml.etree.ElementTree not available.') - - def setUp(self): - self.simple_directed_data="""<?xml version="1.0" encoding="UTF-8"?> -<!-- This file was written by the JAVA GraphML Library.--> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <graph id="G" edgedefault="directed"> - <node id="n0"/> - <node id="n1"/> - <node id="n2"/> - <node id="n3"/> - <node id="n4"/> - <node id="n5"/> - <node id="n6"/> - <node id="n7"/> - <node id="n8"/> - <node id="n9"/> - <node id="n10"/> - <edge id="foo" source="n0" target="n2"/> - <edge source="n1" target="n2"/> - <edge source="n2" target="n3"/> - <edge source="n3" target="n5"/> - <edge source="n3" target="n4"/> - <edge source="n4" target="n6"/> - <edge source="n6" target="n5"/> - <edge source="n5" target="n7"/> - <edge source="n6" target="n8"/> - <edge source="n8" target="n7"/> - <edge source="n8" target="n9"/> - </graph> -</graphml>""" - self.simple_directed_graph=nx.DiGraph() - self.simple_directed_graph.add_node('n10') - self.simple_directed_graph.add_edge('n0','n2',id='foo') - self.simple_directed_graph.add_edges_from([('n1','n2'), - ('n2','n3'), - ('n3','n5'), - ('n3','n4'), - ('n4','n6'), - ('n6','n5'), - ('n5','n7'), - ('n6','n8'), - ('n8','n7'), - ('n8','n9'), - ]) - - self.simple_directed_fh = \ - io.BytesIO(self.simple_directed_data.encode('UTF-8')) - - - self.attribute_data="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns - http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <key id="d0" for="node" attr.name="color" attr.type="string"> - <default>yellow</default> - </key> - <key id="d1" for="edge" attr.name="weight" attr.type="double"/> - <graph id="G" edgedefault="directed"> - <node id="n0"> - <data key="d0">green</data> - </node> - <node id="n1"/> - <node id="n2"> - <data key="d0">blue</data> - </node> - <node id="n3"> - <data key="d0">red</data> - </node> - <node id="n4"/> - <node id="n5"> - <data key="d0">turquoise</data> - </node> - <edge id="e0" source="n0" target="n2"> - <data key="d1">1.0</data> - </edge> - <edge id="e1" source="n0" target="n1"> - <data key="d1">1.0</data> - </edge> - <edge id="e2" source="n1" target="n3"> - <data key="d1">2.0</data> - </edge> - <edge id="e3" source="n3" target="n2"/> - <edge id="e4" source="n2" target="n4"/> - <edge id="e5" source="n3" target="n5"/> - <edge id="e6" source="n5" target="n4"> - <data key="d1">1.1</data> - </edge> - </graph> -</graphml> -""" - self.attribute_graph=nx.DiGraph(id='G') - self.attribute_graph.graph['node_default']={'color':'yellow'} - self.attribute_graph.add_node('n0',color='green') - self.attribute_graph.add_node('n2',color='blue') - self.attribute_graph.add_node('n3',color='red') - self.attribute_graph.add_node('n4') - self.attribute_graph.add_node('n5',color='turquoise') - self.attribute_graph.add_edge('n0','n2',id='e0',weight=1.0) - self.attribute_graph.add_edge('n0','n1',id='e1',weight=1.0) - self.attribute_graph.add_edge('n1','n3',id='e2',weight=2.0) - self.attribute_graph.add_edge('n3','n2',id='e3') - self.attribute_graph.add_edge('n2','n4',id='e4') - self.attribute_graph.add_edge('n3','n5',id='e5') - self.attribute_graph.add_edge('n5','n4',id='e6',weight=1.1) - self.attribute_fh = io.BytesIO(self.attribute_data.encode('UTF-8')) - - self.simple_undirected_data="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <graph id="G"> - <node id="n0"/> - <node id="n1"/> - <node id="n2"/> - <node id="n10"/> - <edge id="foo" source="n0" target="n2"/> - <edge source="n1" target="n2"/> - <edge source="n2" target="n3"/> - </graph> -</graphml>""" -# <edge source="n8" target="n10" directed="false"/> - self.simple_undirected_graph=nx.Graph() - self.simple_undirected_graph.add_node('n10') - self.simple_undirected_graph.add_edge('n0','n2',id='foo') - self.simple_undirected_graph.add_edges_from([('n1','n2'), - ('n2','n3'), - ]) - - self.simple_undirected_fh = io.BytesIO(self.simple_undirected_data.encode('UTF-8')) - - - def test_read_simple_directed_graphml(self): - G=self.simple_directed_graph - H=nx.read_graphml(self.simple_directed_fh) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal(sorted(G.edges()),sorted(H.edges())) - assert_equal(sorted(G.edges(data=True)), - sorted(H.edges(data=True))) - self.simple_directed_fh.seek(0) - - I=nx.parse_graphml(self.simple_directed_data) - assert_equal(sorted(G.nodes()),sorted(I.nodes())) - assert_equal(sorted(G.edges()),sorted(I.edges())) - assert_equal(sorted(G.edges(data=True)), - sorted(I.edges(data=True))) - - def test_write_read_simple_directed_graphml(self): - G=self.simple_directed_graph - fh=io.BytesIO() - nx.write_graphml(G,fh) - fh.seek(0) - H=nx.read_graphml(fh) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal(sorted(G.edges()),sorted(H.edges())) - assert_equal(sorted(G.edges(data=True)), - sorted(H.edges(data=True))) - self.simple_directed_fh.seek(0) - - def test_read_simple_undirected_graphml(self): - G=self.simple_undirected_graph - H=nx.read_graphml(self.simple_undirected_fh) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal( - sorted(sorted(e) for e in G.edges()), - sorted(sorted(e) for e in H.edges())) - self.simple_undirected_fh.seek(0) - - I=nx.parse_graphml(self.simple_undirected_data) - assert_equal(sorted(G.nodes()),sorted(I.nodes())) - assert_equal( - sorted(sorted(e) for e in G.edges()), - sorted(sorted(e) for e in I.edges())) - - def test_read_attribute_graphml(self): - G=self.attribute_graph - H=nx.read_graphml(self.attribute_fh) - assert_equal(sorted(G.nodes(True)),sorted(H.nodes(data=True))) - ge=sorted(G.edges(data=True)) - he=sorted(H.edges(data=True)) - for a,b in zip(ge,he): - assert_equal(a,b) - self.attribute_fh.seek(0) - - I=nx.parse_graphml(self.attribute_data) - assert_equal(sorted(G.nodes(True)),sorted(I.nodes(data=True))) - ge=sorted(G.edges(data=True)) - he=sorted(I.edges(data=True)) - for a,b in zip(ge,he): - assert_equal(a,b) - - def test_directed_edge_in_undirected(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <graph id="G"> - <node id="n0"/> - <node id="n1"/> - <node id="n2"/> - <edge source="n0" target="n1"/> - <edge source="n1" target="n2" directed='true'/> - </graph> -</graphml>""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_graphml,fh) - assert_raises(nx.NetworkXError,nx.parse_graphml,s) - - def test_undirected_edge_in_directed(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <graph id="G" edgedefault='directed'> - <node id="n0"/> - <node id="n1"/> - <node id="n2"/> - <edge source="n0" target="n1"/> - <edge source="n1" target="n2" directed='false'/> - </graph> -</graphml>""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_graphml,fh) - assert_raises(nx.NetworkXError,nx.parse_graphml,s) - - def test_key_error(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns - http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <key id="d0" for="node" attr.name="color" attr.type="string"> - <default>yellow</default> - </key> - <key id="d1" for="edge" attr.name="weight" attr.type="double"/> - <graph id="G" edgedefault="directed"> - <node id="n0"> - <data key="d0">green</data> - </node> - <node id="n1"/> - <node id="n2"> - <data key="d0">blue</data> - </node> - <edge id="e0" source="n0" target="n2"> - <data key="d2">1.0</data> - </edge> - </graph> -</graphml> -""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_graphml,fh) - assert_raises(nx.NetworkXError,nx.parse_graphml,s) - - def test_hyperedge_error(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns - http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <key id="d0" for="node" attr.name="color" attr.type="string"> - <default>yellow</default> - </key> - <key id="d1" for="edge" attr.name="weight" attr.type="double"/> - <graph id="G" edgedefault="directed"> - <node id="n0"> - <data key="d0">green</data> - </node> - <node id="n1"/> - <node id="n2"> - <data key="d0">blue</data> - </node> - <hyperedge id="e0" source="n0" target="n2"> - <endpoint node="n0"/> - <endpoint node="n1"/> - <endpoint node="n2"/> - </hyperedge> - </graph> -</graphml> -""" - fh = io.BytesIO(s.encode('UTF-8')) - assert_raises(nx.NetworkXError,nx.read_graphml,fh) - assert_raises(nx.NetworkXError,nx.parse_graphml,s) - - # remove test until we get the "name" issue sorted - # https://networkx.lanl.gov/trac/ticket/544 - def test_default_attribute(self): - G=nx.Graph() - G.add_node(1,label=1,color='green') - G.add_path([0,1,2,3]) - G.add_edge(1,2,weight=3) - G.graph['node_default']={'color':'yellow'} - G.graph['edge_default']={'weight':7} - fh = io.BytesIO() - nx.write_graphml(G,fh) - fh.seek(0) - H=nx.read_graphml(fh,node_type=int) - assert_equal(sorted(G.nodes()),sorted(H.nodes())) - assert_equal( - sorted(sorted(e) for e in G.edges()), - sorted(sorted(e) for e in H.edges())) - assert_equal(G.graph,H.graph) - - def test_multigraph_keys(self): - # test that multigraphs use edge id attributes as key - pass - - def test_multigraph_to_graph(self): - # test converting multigraph to graph if no parallel edges are found - pass - - def test_yfiles_extension(self): - data="""<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> - <!--Created by yFiles for Java 2.7--> - <key for="graphml" id="d0" yfiles.type="resources"/> - <key attr.name="url" attr.type="string" for="node" id="d1"/> - <key attr.name="description" attr.type="string" for="node" id="d2"/> - <key for="node" id="d3" yfiles.type="nodegraphics"/> - <key attr.name="Description" attr.type="string" for="graph" id="d4"> - <default/> - </key> - <key attr.name="url" attr.type="string" for="edge" id="d5"/> - <key attr.name="description" attr.type="string" for="edge" id="d6"/> - <key for="edge" id="d7" yfiles.type="edgegraphics"/> - <graph edgedefault="directed" id="G"> - <node id="n0"> - <data key="d3"> - <y:ShapeNode> - <y:Geometry height="30.0" width="30.0" x="125.0" y="100.0"/> - <y:Fill color="#FFCC00" transparent="false"/> - <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" borderDistance="0.0" fontFamily="Dialog" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.1328125" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.27099609375" x="8.864501953125" y="5.43359375">1</y:NodeLabel> - <y:Shape type="rectangle"/> - </y:ShapeNode> - </data> - </node> - <node id="n1"> - <data key="d3"> - <y:ShapeNode> - <y:Geometry height="30.0" width="30.0" x="183.0" y="205.0"/> - <y:Fill color="#FFCC00" transparent="false"/> - <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" borderDistance="0.0" fontFamily="Dialog" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.1328125" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.27099609375" x="8.864501953125" y="5.43359375">2</y:NodeLabel> - <y:Shape type="rectangle"/> - </y:ShapeNode> - </data> - </node> - <edge id="e0" source="n0" target="n1"> - <data key="d7"> - <y:PolyLineEdge> - <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> - <y:LineStyle color="#000000" type="line" width="1.0"/> - <y:Arrows source="none" target="standard"/> - <y:BendStyle smoothed="false"/> - </y:PolyLineEdge> - </data> - </edge> - </graph> - <data key="d0"> - <y:Resources/> - </data> -</graphml> -""" - fh = io.BytesIO(data.encode('UTF-8')) - G=nx.read_graphml(fh) - assert_equal(G.edges(),[('n0','n1')]) - assert_equal(G['n0']['n1']['id'],'e0') - assert_equal(G.node['n0']['label'],'1') - assert_equal(G.node['n1']['label'],'2') - - H=nx.parse_graphml(data) - assert_equal(H.edges(),[('n0','n1')]) - assert_equal(H['n0']['n1']['id'],'e0') - assert_equal(H.node['n0']['label'],'1') - assert_equal(H.node['n1']['label'],'2') - - def test_unicode(self): - G = nx.Graph() - try: # Python 3.x - name1 = chr(2344) + chr(123) + chr(6543) - name2 = chr(5543) + chr(1543) + chr(324) - node_type=str - except ValueError: # Python 2.6+ - name1 = unichr(2344) + unichr(123) + unichr(6543) - name2 = unichr(5543) + unichr(1543) + unichr(324) - node_type=unicode - G.add_edge(name1, 'Radiohead', attr_dict={'foo': name2}) - fd, fname = tempfile.mkstemp() - nx.write_graphml(G, fname) - H = nx.read_graphml(fname,node_type=node_type) - assert_equal(G.adj, H.adj) - os.close(fd) - os.unlink(fname) - - - def test_bool(self): - s="""<?xml version="1.0" encoding="UTF-8"?> -<graphml xmlns="http://graphml.graphdrawing.org/xmlns" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns - http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"> - <key id="d0" for="node" attr.name="test" attr.type="boolean"> - <default>false</default> - </key> - <graph id="G" edgedefault="directed"> - <node id="n0"> - <data key="d0">True</data> - </node> - <node id="n1"/> - <node id="n2"> - <data key="d0">False</data> - </node> - <node id="n3"> - <data key="d0">true</data> - </node> - <node id="n4"> - <data key="d0">false</data> - </node> - - - </graph> -</graphml> -""" - fh = io.BytesIO(s.encode('UTF-8')) - G=nx.read_graphml(fh) - assert_equal(G.node['n0']['test'],True) - assert_equal(G.node['n2']['test'],False) - - H=nx.parse_graphml(s) - assert_equal(H.node['n0']['test'],True) - assert_equal(H.node['n2']['test'],False) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_leda.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_leda.py deleted file mode 100644 index 1c3614e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_leda.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -import os,tempfile - -class TestLEDA(object): - - def test_parse_leda(self): - data="""#header section \nLEDA.GRAPH \nstring\nint\n-1\n#nodes section\n5 \n|{v1}| \n|{v2}| \n|{v3}| \n|{v4}| \n|{v5}| \n\n#edges section\n7 \n1 2 0 |{4}| \n1 3 0 |{3}| \n2 3 0 |{2}| \n3 4 0 |{3}| \n3 5 0 |{7}| \n4 5 0 |{6}| \n5 1 0 |{foo}|""" - G=nx.parse_leda(data) - G=nx.parse_leda(data.split('\n')) - assert_equal(sorted(G.nodes()), - ['v1', 'v2', 'v3', 'v4', 'v5']) - assert_equal([e for e in sorted(G.edges(data=True))], - [('v1', 'v2', {'label': '4'}), - ('v1', 'v3', {'label': '3'}), - ('v2', 'v3', {'label': '2'}), - ('v3', 'v4', {'label': '3'}), - ('v3', 'v5', {'label': '7'}), - ('v4', 'v5', {'label': '6'}), - ('v5', 'v1', {'label': 'foo'})]) - - - def test_read_LEDA(self): - data="""#header section \nLEDA.GRAPH \nstring\nint\n-1\n#nodes section\n5 \n|{v1}| \n|{v2}| \n|{v3}| \n|{v4}| \n|{v5}| \n\n#edges section\n7 \n1 2 0 |{4}| \n1 3 0 |{3}| \n2 3 0 |{2}| \n3 4 0 |{3}| \n3 5 0 |{7}| \n4 5 0 |{6}| \n5 1 0 |{foo}|""" - G=nx.parse_leda(data) - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - b=fh.write(data) - fh.close() - Gin=nx.read_leda(fname) - assert_equal(sorted(G.nodes()),sorted(Gin.nodes())) - assert_equal(sorted(G.edges()),sorted(Gin.edges())) - os.close(fd) - os.unlink(fname) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_p2g.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_p2g.py deleted file mode 100644 index 6bd7d4e..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_p2g.py +++ /dev/null @@ -1,64 +0,0 @@ -from nose.tools import assert_equal, assert_raises, assert_not_equal -import networkx as nx -import io -import tempfile -import os -from networkx.readwrite.p2g import * -from networkx.testing import * - - -class TestP2G: - - def setUp(self): - self.G=nx.Graph(name="test") - e=[('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('a','f')] - self.G.add_edges_from(e) - self.G.add_node('g') - self.DG=nx.DiGraph(self.G) - - def test_read_p2g(self): - s = b"""\ -name -3 4 -a -1 2 -b - -c -0 2 -""" - bytesIO = io.BytesIO(s) - G = read_p2g(bytesIO) - assert_equal(G.name,'name') - assert_equal(sorted(G),['a','b','c']) - edges = [(str(u),str(v)) for u,v in G.edges()] - assert_edges_equal(G.edges(),[('a','c'),('a','b'),('c','a'),('c','c')]) - - def test_write_p2g(self): - s=b"""foo -3 2 -1 -1 -2 -2 -3 - -""" - fh=io.BytesIO() - G=nx.DiGraph() - G.name='foo' - G.add_edges_from([(1,2),(2,3)]) - write_p2g(G,fh) - fh.seek(0) - r=fh.read() - assert_equal(r,s) - - def test_write_read_p2g(self): - fh=io.BytesIO() - G=nx.DiGraph() - G.name='foo' - G.add_edges_from([('a','b'),('b','c')]) - write_p2g(G,fh) - fh.seek(0) - H=read_p2g(fh) - assert_edges_equal(G.edges(),H.edges()) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_pajek.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_pajek.py deleted file mode 100644 index a2e43d0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_pajek.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python -""" -Pajek tests -""" -from nose.tools import assert_equal -from networkx import * -import os,tempfile -from io import open -from networkx.testing import * - -class TestPajek(object): - def setUp(self): - self.data="""*network Tralala\n*vertices 4\n 1 "A1" 0.0938 0.0896 ellipse x_fact 1 y_fact 1\n 2 "Bb" 0.8188 0.2458 ellipse x_fact 1 y_fact 1\n 3 "C" 0.3688 0.7792 ellipse x_fact 1\n 4 "D2" 0.9583 0.8563 ellipse x_fact 1\n*arcs\n1 1 1 h2 0 w 3 c Blue s 3 a1 -130 k1 0.6 a2 -130 k2 0.6 ap 0.5 l "Bezier loop" lc BlueViolet fos 20 lr 58 lp 0.3 la 360\n2 1 1 h2 0 a1 120 k1 1.3 a2 -120 k2 0.3 ap 25 l "Bezier arc" lphi 270 la 180 lr 19 lp 0.5\n1 2 1 h2 0 a1 40 k1 2.8 a2 30 k2 0.8 ap 25 l "Bezier arc" lphi 90 la 0 lp 0.65\n4 2 -1 h2 0 w 1 k1 -2 k2 250 ap 25 l "Circular arc" c Red lc OrangeRed\n3 4 1 p Dashed h2 0 w 2 c OliveGreen ap 25 l "Straight arc" lc PineGreen\n1 3 1 p Dashed h2 0 w 5 k1 -1 k2 -20 ap 25 l "Oval arc" c Brown lc Black\n3 3 -1 h1 6 w 1 h2 12 k1 -2 k2 -15 ap 0.5 l "Circular loop" c Red lc OrangeRed lphi 270 la 180""" - self.G=nx.MultiDiGraph() - self.G.add_nodes_from(['A1', 'Bb', 'C', 'D2']) - self.G.add_edges_from([('A1', 'A1'), ('A1', 'Bb'), ('A1', 'C'), - ('Bb', 'A1'),('C', 'C'), ('C', 'D2'), - ('D2', 'Bb')]) - - self.G.graph['name']='Tralala' - (self.fd,self.fname)=tempfile.mkstemp() - fh=open(self.fname,'wb') - fh.write(self.data.encode('UTF-8')) - fh.close() - - def tearDown(self): - os.close(self.fd) - os.unlink(self.fname) - - def test_parse_pajek_simple(self): - # Example without node positions or shape - data="""*Vertices 2\n1 "1"\n2 "2"\n*Edges\n1 2\n2 1""" - G=parse_pajek(data) - assert_equal(sorted(G.nodes()), ['1', '2']) - assert_edges_equal(G.edges(), [('1', '2'), ('1', '2')]) - - def test_parse_pajek(self): - G=parse_pajek(self.data) - assert_equal(sorted(G.nodes()), ['A1', 'Bb', 'C', 'D2']) - assert_edges_equal(G.edges(), [('A1', 'A1'), ('A1', 'Bb'), - ('A1', 'C'), ('Bb', 'A1'), - ('C', 'C'), ('C', 'D2'), ('D2', 'Bb')]) - - def test_read_pajek(self): - G=parse_pajek(self.data) - Gin=read_pajek(self.fname) - assert_equal(sorted(G.nodes()), sorted(Gin.nodes())) - assert_edges_equal(G.edges(), Gin.edges()) - assert_equal(self.G.graph,Gin.graph) - for n in G.node: - assert_equal(G.node[n],Gin.node[n]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_shp.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_shp.py deleted file mode 100644 index 91c392c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_shp.py +++ /dev/null @@ -1,140 +0,0 @@ -"""Unit tests for shp. -""" - -import os -import tempfile -from nose import SkipTest -from nose.tools import assert_equal - -import networkx as nx - - -class TestShp(object): - @classmethod - def setupClass(cls): - global ogr - try: - from osgeo import ogr - except ImportError: - raise SkipTest('ogr not available.') - - def deletetmp(self, drv, *paths): - for p in paths: - if os.path.exists(p): - drv.DeleteDataSource(p) - - def setUp(self): - - def createlayer(driver): - lyr = shp.CreateLayer("edges", None, ogr.wkbLineString) - namedef = ogr.FieldDefn("Name", ogr.OFTString) - namedef.SetWidth(32) - lyr.CreateField(namedef) - return lyr - - drv = ogr.GetDriverByName("ESRI Shapefile") - - testdir = os.path.join(tempfile.gettempdir(), 'shpdir') - shppath = os.path.join(tempfile.gettempdir(), 'tmpshp.shp') - - self.deletetmp(drv, testdir, shppath) - os.mkdir(testdir) - - shp = drv.CreateDataSource(shppath) - lyr = createlayer(shp) - self.names = ['a', 'b', 'c'] # edgenames - self.paths = ( [(1.0, 1.0), (2.0, 2.0)], - [(2.0, 2.0), (3.0, 3.0)], - [(0.9, 0.9), (4.0, 2.0)] - ) - for path, name in zip(self.paths, self.names): - feat = ogr.Feature(lyr.GetLayerDefn()) - g = ogr.Geometry(ogr.wkbLineString) - map(lambda xy: g.AddPoint_2D(*xy), path) - feat.SetGeometry(g) - feat.SetField("Name", name) - lyr.CreateFeature(feat) - self.shppath = shppath - self.testdir = testdir - self.drv = drv - - def testload(self): - expected = nx.DiGraph() - map(expected.add_path, self.paths) - G = nx.read_shp(self.shppath) - assert_equal(sorted(expected.node), sorted(G.node)) - assert_equal(sorted(expected.edges()), sorted(G.edges())) - names = [G.get_edge_data(s, e)['Name'] for s, e in G.edges()] - assert_equal(self.names, sorted(names)) - - def checkgeom(self, lyr, expected): - feature = lyr.GetNextFeature() - actualwkt = [] - while feature: - actualwkt.append(feature.GetGeometryRef().ExportToWkt()) - feature = lyr.GetNextFeature() - assert_equal(sorted(expected), sorted(actualwkt)) - - def test_geometryexport(self): - expectedpoints = ( - "POINT (1 1)", - "POINT (2 2)", - "POINT (3 3)", - "POINT (0.9 0.9)", - "POINT (4 2)" - ) - expectedlines = ( - "LINESTRING (1 1,2 2)", - "LINESTRING (2 2,3 3)", - "LINESTRING (0.9 0.9,4 2)" - ) - tpath = os.path.join(tempfile.gettempdir(), 'shpdir') - G = nx.read_shp(self.shppath) - nx.write_shp(G, tpath) - shpdir = ogr.Open(tpath) - self.checkgeom(shpdir.GetLayerByName("nodes"), expectedpoints) - self.checkgeom(shpdir.GetLayerByName("edges"), expectedlines) - - def test_attributeexport(self): - def testattributes(lyr, graph): - feature = lyr.GetNextFeature() - while feature: - coords = [] - ref = feature.GetGeometryRef() - for i in xrange(ref.GetPointCount()): - coords.append(ref.GetPoint_2D(i)) - name = feature.GetFieldAsString('Name') - assert_equal(graph.get_edge_data(*coords)['Name'], name) - feature = lyr.GetNextFeature() - - tpath = os.path.join(tempfile.gettempdir(), 'shpdir') - - G = nx.read_shp(self.shppath) - nx.write_shp(G, tpath) - shpdir = ogr.Open(tpath) - edges = shpdir.GetLayerByName("edges") - testattributes(edges, G) - - def test_wkt_export(self): - G = nx.DiGraph() - tpath = os.path.join(tempfile.gettempdir(), 'shpdir') - points = ( - "POINT (0.9 0.9)", - "POINT (4 2)" - ) - line = ( - "LINESTRING (0.9 0.9,4 2)", - ) - G.add_node(1, Wkt=points[0]) - G.add_node(2, Wkt=points[1]) - G.add_edge(1, 2, Wkt=line[0]) - try: - nx.write_shp(G, tpath) - except Exception as e: - assert False, e - shpdir = ogr.Open(tpath) - self.checkgeom(shpdir.GetLayerByName("nodes"), points) - self.checkgeom(shpdir.GetLayerByName("edges"), line) - - def tearDown(self): - self.deletetmp(self.drv, self.testdir, self.shppath) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_sparsegraph6.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_sparsegraph6.py deleted file mode 100644 index fea9161..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_sparsegraph6.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -import networkx as nx -import os,tempfile - -class TestGraph6(object): - - def test_parse_graph6(self): - data="""DF{""" - G=nx.parse_graph6(data) - assert_equal(sorted(G.nodes()),[0, 1, 2, 3, 4]) - assert_equal([e for e in sorted(G.edges())], - [(0, 3), (0, 4), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]) - - def test_read_graph6(self): - data="""DF{""" - G=nx.parse_graph6(data) - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - b=fh.write(data) - fh.close() - Gin=nx.read_graph6(fname) - assert_equal(sorted(G.nodes()),sorted(Gin.nodes())) - assert_equal(sorted(G.edges()),sorted(Gin.edges())) - os.close(fd) - os.unlink(fname) - - def test_read_many_graph6(self): - # Read many graphs into list - data="""DF{\nD`{\nDqK\nD~{\n""" - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - b=fh.write(data) - fh.close() - glist=nx.read_graph6_list(fname) - assert_equal(len(glist),4) - for G in glist: - assert_equal(sorted(G.nodes()),[0, 1, 2, 3, 4]) - os.close(fd) - os.unlink(fname) - - -class TestSparseGraph6(object): - - def test_parse_sparse6(self): - data=""":Q___eDcdFcDeFcE`GaJ`IaHbKNbLM""" - G=nx.parse_sparse6(data) - assert_equal(sorted(G.nodes()), - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17]) - assert_equal([e for e in sorted(G.edges())], - [(0, 1), (0, 2), (0, 3), (1, 12), (1, 14), (2, 13), - (2, 15), (3, 16), (3, 17), (4, 7), (4, 9), (4, 11), - (5, 6), (5, 8), (5, 9), (6, 10), (6, 11), (7, 8), - (7, 10), (8, 12), (9, 15), (10, 14), (11, 13), - (12, 16), (13, 17), (14, 17), (15, 16)]) - - - def test_read_sparse6(self): - data=""":Q___eDcdFcDeFcE`GaJ`IaHbKNbLM""" - G=nx.parse_sparse6(data) - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - b=fh.write(data) - fh.close() - Gin=nx.read_sparse6(fname) - assert_equal(sorted(G.nodes()),sorted(Gin.nodes())) - assert_equal(sorted(G.edges()),sorted(Gin.edges())) - os.close(fd) - os.unlink(fname) - - def test_read_many_graph6(self): - # Read many graphs into list - data=""":Q___eDcdFcDeFcE`GaJ`IaHbKNbLM\n:Q___dCfDEdcEgcbEGbFIaJ`JaHN`IM""" - (fd,fname)=tempfile.mkstemp() - fh=open(fname,'w') - b=fh.write(data) - fh.close() - glist=nx.read_sparse6_list(fname) - assert_equal(len(glist),2) - for G in glist: - assert_equal(sorted(G.nodes()), - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17]) - os.close(fd) - os.unlink(fname) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_yaml.py b/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_yaml.py deleted file mode 100644 index ca0ff56..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/readwrite/tests/test_yaml.py +++ /dev/null @@ -1,53 +0,0 @@ -""" - Unit tests for yaml. -""" - -import os,tempfile -from nose import SkipTest -from nose.tools import assert_equal - -import networkx as nx - -class TestYaml(object): - @classmethod - def setupClass(cls): - global yaml - try: - import yaml - except ImportError: - raise SkipTest('yaml not available.') - - def setUp(self): - self.build_graphs() - - def build_graphs(self): - self.G = nx.Graph(name="test") - e = [('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('a','f')] - self.G.add_edges_from(e) - self.G.add_node('g') - - self.DG = nx.DiGraph(self.G) - - self.MG = nx.MultiGraph() - self.MG.add_weighted_edges_from([(1,2,5),(1,2,5),(1,2,1),(3,3,42)]) - - def assert_equal(self, G, data=False): - (fd, fname) = tempfile.mkstemp() - nx.write_yaml(G, fname) - Gin = nx.read_yaml(fname); - - assert_equal(sorted(G.nodes()),sorted(Gin.nodes())) - assert_equal(G.edges(data=data),Gin.edges(data=data)) - - os.close(fd) - os.unlink(fname) - - def testUndirected(self): - self.assert_equal(self.G, False) - - def testDirected(self): - self.assert_equal(self.DG, False) - - def testMultiGraph(self): - self.assert_equal(self.MG, True) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/relabel.py b/lib/python2.7/site-packages/setoolsgui/networkx/relabel.py deleted file mode 100644 index 4ff1196..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/relabel.py +++ /dev/null @@ -1,205 +0,0 @@ -# Copyright (C) 2006-2013 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>', - 'Pieter Swart (swart@lanl.gov)', - 'Dan Schult (dschult@colgate.edu)']) -__all__ = ['convert_node_labels_to_integers', 'relabel_nodes'] - -def relabel_nodes(G, mapping, copy=True): - """Relabel the nodes of the graph G. - - Parameters - ---------- - G : graph - A NetworkX graph - - mapping : dictionary - A dictionary with the old labels as keys and new labels as values. - A partial mapping is allowed. - - copy : bool (optional, default=True) - If True return a copy, or if False relabel the nodes in place. - - Examples - -------- - >>> G=nx.path_graph(3) # nodes 0-1-2 - >>> mapping={0:'a',1:'b',2:'c'} - >>> H=nx.relabel_nodes(G,mapping) - >>> print(sorted(H.nodes())) - ['a', 'b', 'c'] - - >>> G=nx.path_graph(26) # nodes 0..25 - >>> mapping=dict(zip(G.nodes(),"abcdefghijklmnopqrstuvwxyz")) - >>> H=nx.relabel_nodes(G,mapping) # nodes a..z - >>> mapping=dict(zip(G.nodes(),range(1,27))) - >>> G1=nx.relabel_nodes(G,mapping) # nodes 1..26 - - Partial in-place mapping: - - >>> G=nx.path_graph(3) # nodes 0-1-2 - >>> mapping={0:'a',1:'b'} # 0->'a' and 1->'b' - >>> G=nx.relabel_nodes(G,mapping, copy=False) - - print(G.nodes()) - [2, 'b', 'a'] - - Mapping as function: - - >>> G=nx.path_graph(3) - >>> def mapping(x): - ... return x**2 - >>> H=nx.relabel_nodes(G,mapping) - >>> print(H.nodes()) - [0, 1, 4] - - Notes - ----- - Only the nodes specified in the mapping will be relabeled. - - The keyword setting copy=False modifies the graph in place. - This is not always possible if the mapping is circular. - In that case use copy=True. - - See Also - -------- - convert_node_labels_to_integers - """ - # you can pass a function f(old_label)->new_label - # but we'll just make a dictionary here regardless - if not hasattr(mapping,"__getitem__"): - m = dict((n,mapping(n)) for n in G) - else: - m=mapping - if copy: - return _relabel_copy(G,m) - else: - return _relabel_inplace(G,m) - - -def _relabel_inplace(G, mapping): - old_labels=set(mapping.keys()) - new_labels=set(mapping.values()) - if len(old_labels & new_labels) > 0: - # labels sets overlap - # can we topological sort and still do the relabeling? - D=nx.DiGraph(list(mapping.items())) - D.remove_edges_from(D.selfloop_edges()) - try: - nodes=nx.topological_sort(D) - except nx.NetworkXUnfeasible: - raise nx.NetworkXUnfeasible('The node label sets are overlapping ' - 'and no ordering can resolve the ' - 'mapping. Use copy=True.') - nodes.reverse() # reverse topological order - else: - # non-overlapping label sets - nodes=old_labels - - multigraph = G.is_multigraph() - directed = G.is_directed() - - for old in nodes: - try: - new=mapping[old] - except KeyError: - continue - try: - G.add_node(new,attr_dict=G.node[old]) - except KeyError: - raise KeyError("Node %s is not in the graph"%old) - if multigraph: - new_edges=[(new,old == target and new or target,key,data) - for (_,target,key,data) - in G.edges(old,data=True,keys=True)] - if directed: - new_edges+=[(old == source and new or source,new,key,data) - for (source,_,key,data) - in G.in_edges(old,data=True,keys=True)] - else: - new_edges=[(new,old == target and new or target,data) - for (_,target,data) in G.edges(old,data=True)] - if directed: - new_edges+=[(old == source and new or source,new,data) - for (source,_,data) in G.in_edges(old,data=True)] - G.remove_node(old) - G.add_edges_from(new_edges) - return G - -def _relabel_copy(G, mapping): - H=G.__class__() - H.name="(%s)" % G.name - if G.is_multigraph(): - H.add_edges_from( (mapping.get(n1,n1),mapping.get(n2,n2),k,d.copy()) - for (n1,n2,k,d) in G.edges_iter(keys=True,data=True)) - else: - H.add_edges_from( (mapping.get(n1,n1),mapping.get(n2,n2),d.copy()) - for (n1,n2,d) in G.edges_iter(data=True)) - - H.add_nodes_from(mapping.get(n,n) for n in G) - H.node.update(dict((mapping.get(n,n),d.copy()) for n,d in G.node.items())) - H.graph.update(G.graph.copy()) - - return H - - -def convert_node_labels_to_integers(G, first_label=0, ordering="default", - label_attribute=None): - """Return a copy of the graph G with the nodes relabeled with integers. - - Parameters - ---------- - G : graph - A NetworkX graph - - first_label : int, optional (default=0) - An integer specifying the offset in numbering nodes. - The n new integer labels are numbered first_label, ..., n-1+first_label. - - ordering : string - "default" : inherit node ordering from G.nodes() - "sorted" : inherit node ordering from sorted(G.nodes()) - "increasing degree" : nodes are sorted by increasing degree - "decreasing degree" : nodes are sorted by decreasing degree - - label_attribute : string, optional (default=None) - Name of node attribute to store old label. If None no attribute - is created. - - Notes - ----- - Node and edge attribute data are copied to the new (relabeled) graph. - - See Also - -------- - relabel_nodes - """ - N = G.number_of_nodes()+first_label - if ordering == "default": - mapping = dict(zip(G.nodes(),range(first_label,N))) - elif ordering == "sorted": - nlist = G.nodes() - nlist.sort() - mapping=dict(zip(nlist,range(first_label,N))) - elif ordering == "increasing degree": - dv_pairs=[(d,n) for (n,d) in G.degree_iter()] - dv_pairs.sort() # in-place sort from lowest to highest degree - mapping = dict(zip([n for d,n in dv_pairs],range(first_label,N))) - elif ordering == "decreasing degree": - dv_pairs = [(d,n) for (n,d) in G.degree_iter()] - dv_pairs.sort() # in-place sort from lowest to highest degree - dv_pairs.reverse() - mapping = dict(zip([n for d,n in dv_pairs],range(first_label,N))) - else: - raise nx.NetworkXError('Unknown node ordering: %s'%ordering) - H = relabel_nodes(G,mapping) - H.name="("+G.name+")_with_int_labels" - # create node attribute with the old label - if label_attribute is not None: - nx.set_node_attributes(H, label_attribute, - dict((v,k) for k,v in mapping.items())) - return H diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/release.py b/lib/python2.7/site-packages/setoolsgui/networkx/release.py deleted file mode 100644 index 285db5f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/release.py +++ /dev/null @@ -1,254 +0,0 @@ -"""Release data for NetworkX. - -When NetworkX is imported a number of steps are followed to determine -the version information. - - 1) If the release is not a development release (dev=False), then version - information is read from version.py, a file containing statically - defined version information. This file should exist on every - downloadable release of NetworkX since setup.py creates it during - packaging/installation. However, version.py might not exist if one - is running NetworkX from the mercurial repository. In the event that - version.py does not exist, then no vcs information will be available. - - 2) If the release is a development release, then version information - is read dynamically, when possible. If no dynamic information can be - read, then an attempt is made to read the information from version.py. - If version.py does not exist, then no vcs information will be available. - -Clarification: - version.py is created only by setup.py - -When setup.py creates version.py, it does so before packaging/installation. -So the created file is included in the source distribution. When a user -downloads a tar.gz file and extracts the files, the files will not be in a -live version control repository. So when the user runs setup.py to install -NetworkX, we must make sure write_versionfile() does not overwrite the -revision information contained in the version.py that was included in the -tar.gz file. This is why write_versionfile() includes an early escape. - -""" - -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. - -from __future__ import absolute_import - -import os -import sys -import time -import datetime -import subprocess - -basedir = os.path.abspath(os.path.split(__file__)[0]) - -def write_versionfile(): - """Creates a static file containing version information.""" - versionfile = os.path.join(basedir, 'version.py') - - text = '''""" -Version information for NetworkX, created during installation. - -Do not add this file to the repository. - -""" - -import datetime - -version = %(version)r -date = %(date)r - -# Was NetworkX built from a development version? If so, remember that the major -# and minor versions reference the "target" (rather than "current") release. -dev = %(dev)r - -# Format: (name, major, min, revision) -version_info = %(version_info)r - -# Format: a 'datetime.datetime' instance -date_info = %(date_info)r - -# Format: (vcs, vcs_tuple) -vcs_info = %(vcs_info)r - -''' - - # Try to update all information - date, date_info, version, version_info, vcs_info = get_info(dynamic=True) - - def writefile(): - fh = open(versionfile, 'w') - subs = { - 'dev' : dev, - 'version': version, - 'version_info': version_info, - 'date': date, - 'date_info': date_info, - 'vcs_info': vcs_info - } - fh.write(text % subs) - fh.close() - - if vcs_info[0] == 'mercurial': - # Then, we want to update version.py. - writefile() - else: - if os.path.isfile(versionfile): - # This is *good*, and the most likely place users will be when - # running setup.py. We do not want to overwrite version.py. - # Grab the version so that setup can use it. - sys.path.insert(0, basedir) - from version import version - del sys.path[0] - else: - # This is *bad*. It means the user might have a tarball that - # does not include version.py. Let this error raise so we can - # fix the tarball. - ##raise Exception('version.py not found!') - - # We no longer require that prepared tarballs include a version.py - # So we use the possibly trunctated value from get_info() - # Then we write a new file. - writefile() - - return version - -def get_revision(): - """Returns revision and vcs information, dynamically obtained.""" - vcs, revision, tag = None, None, None - - hgdir = os.path.join(basedir, '..', '.hg') - gitdir = os.path.join(basedir, '..', '.git') - - if os.path.isdir(hgdir): - vcs = 'mercurial' - try: - p = subprocess.Popen(['hg', 'id'], - cwd=basedir, - stdout=subprocess.PIPE) - except OSError: - # Could not run hg, even though this is a mercurial repository. - pass - else: - stdout = p.communicate()[0] - # Force strings instead of unicode. - x = list(map(str, stdout.decode().strip().split())) - - if len(x) == 0: - # Somehow stdout was empty. This can happen, for example, - # if you're running in a terminal which has redirected stdout. - # In this case, we do not use any revision/tag info. - pass - elif len(x) == 1: - # We don't have 'tip' or anything similar...so no tag. - revision = str(x[0]) - else: - revision = str(x[0]) - tag = str(x[1]) - - elif os.path.isdir(gitdir): - vcs = 'git' - # For now, we are not bothering with revision and tag. - - vcs_info = (vcs, (revision, tag)) - - return revision, vcs_info - -def get_info(dynamic=True): - ## Date information - date_info = datetime.datetime.now() - date = time.asctime(date_info.timetuple()) - - revision, version, version_info, vcs_info = None, None, None, None - - import_failed = False - dynamic_failed = False - - if dynamic: - revision, vcs_info = get_revision() - if revision is None: - dynamic_failed = True - - if dynamic_failed or not dynamic: - # This is where most final releases of NetworkX will be. - # All info should come from version.py. If it does not exist, then - # no vcs information will be provided. - sys.path.insert(0, basedir) - try: - from version import date, date_info, version, version_info, vcs_info - except ImportError: - import_failed = True - vcs_info = (None, (None, None)) - else: - revision = vcs_info[1][0] - del sys.path[0] - - if import_failed or (dynamic and not dynamic_failed): - # We are here if: - # we failed to determine static versioning info, or - # we successfully obtained dynamic revision info - version = ''.join([str(major), '.', str(minor)]) - if dev: - version += '.dev_' + date_info.strftime("%Y%m%d%H%M%S") - version_info = (name, major, minor, revision) - - return date, date_info, version, version_info, vcs_info - -## Version information -name = 'networkx' -major = "1" -minor = "8.1" - - -## Declare current release as a development release. -## Change to False before tagging a release; then change back. -dev = False - - -description = "Python package for creating and manipulating graphs and networks" - -long_description = \ -""" -NetworkX is a Python package for the creation, manipulation, and -study of the structure, dynamics, and functions of complex networks. - -""" -license = 'BSD' -authors = {'Hagberg' : ('Aric Hagberg','hagberg@lanl.gov'), - 'Schult' : ('Dan Schult','dschult@colgate.edu'), - 'Swart' : ('Pieter Swart','swart@lanl.gov') - } -maintainer = "NetworkX Developers" -maintainer_email = "networkx-discuss@googlegroups.com" -url = 'http://networkx.lanl.gov/' -download_url="http://networkx.lanl.gov/download/networkx" -platforms = ['Linux','Mac OSX','Windows','Unix'] -keywords = ['Networks', 'Graph Theory', 'Mathematics', 'network', 'graph', 'discrete mathematics', 'math'] -classifiers = [ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.1', - 'Programming Language :: Python :: 3.2', - 'Topic :: Software Development :: Libraries :: Python Modules', - 'Topic :: Scientific/Engineering :: Bio-Informatics', - 'Topic :: Scientific/Engineering :: Information Analysis', - 'Topic :: Scientific/Engineering :: Mathematics', - 'Topic :: Scientific/Engineering :: Physics'] - -date, date_info, version, version_info, vcs_info = get_info() - -if __name__ == '__main__': - # Write versionfile for nightly snapshots. - write_versionfile() - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/testing/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/testing/__init__.py deleted file mode 100644 index db57076..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/testing/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from networkx.testing.utils import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/testing/tests/test_utils.py b/lib/python2.7/site-packages/setoolsgui/networkx/testing/tests/test_utils.py deleted file mode 100644 index 9c57649..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/testing/tests/test_utils.py +++ /dev/null @@ -1,108 +0,0 @@ -from nose.tools import * -import networkx as nx -from networkx.testing import * - -# thanks to numpy for this GenericTest class (numpy/testing/test_utils.py) -class _GenericTest(object): - def _test_equal(self, a, b): - self._assert_func(a, b) - - def _test_not_equal(self, a, b): - try: - self._assert_func(a, b) - passed = True - except AssertionError: - pass - else: - raise AssertionError("a and b are found equal but are not") - - -class TestNodesEqual(_GenericTest): - def setUp(self): - self._assert_func = assert_nodes_equal - - def test_nodes_equal(self): - a = [1,2,5,4] - b = [4,5,1,2] - self._test_equal(a,b) - - def test_nodes_not_equal(self): - a = [1,2,5,4] - b = [4,5,1,3] - self._test_not_equal(a,b) - - def test_nodes_with_data_equal(self): - G = nx.Graph() - G.add_nodes_from([1,2,3],color='red') - H = nx.Graph() - H.add_nodes_from([1,2,3],color='red') - self._test_equal(G.nodes(data=True), H.nodes(data=True)) - - def test_edges_with_data_not_equal(self): - G = nx.Graph() - G.add_nodes_from([1,2,3],color='red') - H = nx.Graph() - H.add_nodes_from([1,2,3],color='blue') - self._test_not_equal(G.nodes(data=True), H.nodes(data=True)) - - -class TestEdgesEqual(_GenericTest): - def setUp(self): - self._assert_func = assert_edges_equal - - def test_edges_equal(self): - a = [(1,2),(5,4)] - b = [(4,5),(1,2)] - self._test_equal(a,b) - - def test_edges_not_equal(self): - a = [(1,2),(5,4)] - b = [(4,5),(1,3)] - self._test_not_equal(a,b) - - def test_edges_with_data_equal(self): - G = nx.MultiGraph() - G.add_path([0,1,2],weight=1) - H = nx.MultiGraph() - H.add_path([0,1,2],weight=1) - self._test_equal(G.edges(data=True, keys=True), - H.edges(data=True, keys=True)) - - def test_edges_with_data_not_equal(self): - G = nx.MultiGraph() - G.add_path([0,1,2],weight=1) - H = nx.MultiGraph() - H.add_path([0,1,2],weight=2) - self._test_not_equal(G.edges(data=True, keys=True), - H.edges(data=True, keys=True)) - -class TestGraphsEqual(_GenericTest): - def setUp(self): - self._assert_func = assert_graphs_equal - - def test_graphs_equal(self): - G = nx.path_graph(4) - H = nx.Graph() - H.add_path(range(4)) - H.name='path_graph(4)' - self._test_equal(G,H) - - def test_graphs_not_equal(self): - G = nx.path_graph(4) - H = nx.Graph() - H.add_cycle(range(4)) - self._test_not_equal(G,H) - - def test_graphs_not_equal2(self): - G = nx.path_graph(4) - H = nx.Graph() - H.add_path(range(3)) - H.name='path_graph(4)' - self._test_not_equal(G,H) - - def test_graphs_not_equal3(self): - G = nx.path_graph(4) - H = nx.Graph() - H.add_path(range(4)) - H.name='path_graph(foo)' - self._test_not_equal(G,H) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/testing/utils.py b/lib/python2.7/site-packages/setoolsgui/networkx/testing/utils.py deleted file mode 100644 index 5cca7f8..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/testing/utils.py +++ /dev/null @@ -1,57 +0,0 @@ -import operator -from nose.tools import * -__all__ = ['assert_nodes_equal', 'assert_edges_equal','assert_graphs_equal'] - -def assert_nodes_equal(nlist1, nlist2): - # Assumes lists are either nodes, or (node,datadict) tuples, - # and also that nodes are orderable/sortable. - try: - l = len(nlist1[0]) - n1 = sorted(nlist1,key=operator.itemgetter(0)) - n2 = sorted(nlist2,key=operator.itemgetter(0)) - assert_equal(len(n1),len(n2)) - for a,b in zip(n1,n2): - assert_equal(a,b) - except TypeError: - assert_equal(set(nlist1),set(nlist2)) - return - -def assert_edges_equal(elist1, elist2): - # Assumes lists with u,v nodes either as - # edge tuples (u,v) - # edge tuples with data dicts (u,v,d) - # edge tuples with keys and data dicts (u,v,k, d) - # and also that nodes are orderable/sortable. - e1 = sorted(elist1,key=lambda x: sorted(x[0:2])) - e2 = sorted(elist2,key=lambda x: sorted(x[0:2])) - assert_equal(len(e1),len(e2)) - if len(e1) == 0: - return True - if len(e1[0]) == 2: - for a,b in zip(e1,e2): - assert_equal(set(a[0:2]),set(b[0:2])) - elif len(e1[0]) == 3: - for a,b in zip(e1,e2): - assert_equal(set(a[0:2]),set(b[0:2])) - assert_equal(a[2],b[2]) - elif len(e1[0]) == 4: - for a,b in zip(e1,e2): - assert_equal(set(a[0:2]),set(b[0:2])) - assert_equal(a[2],b[2]) - assert_equal(a[3],b[3]) - - -def assert_graphs_equal(graph1, graph2): - if graph1.is_multigraph(): - edges1 = graph1.edges(data=True,keys=True) - else: - edges1 = graph1.edges(data=True) - if graph2.is_multigraph(): - edges2 = graph2.edges(data=True,keys=True) - else: - edges2 = graph2.edges(data=True) - assert_nodes_equal(graph1.nodes(data=True), - graph2.nodes(data=True)) - assert_edges_equal(edges1, edges2) - assert_equal(graph1.graph,graph2.graph) - return diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/__init__.py +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/benchmark.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/benchmark.py deleted file mode 100644 index 5eb68d0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/benchmark.py +++ /dev/null @@ -1,248 +0,0 @@ -from timeit import Timer - -# This is gratefully modeled after the benchmarks found in -# the numpy svn repository. http://svn.scipy.org/svn/numpy/trunk - -class Benchmark(object): - """ - Benchmark a method or simple bit of code using different Graph classes. - If the test code is the same for each graph class, then you can set it - during instantiation through the argument test_string. - The argument test_string can also be a tuple of test code and setup code. - The code is entered as a string valid for use with the timeit module. - - Example: - >>> b=Benchmark(['Graph','XGraph']) - >>> b['Graph']=('G.add_nodes_from(nlist)','nlist=range(100)') - >>> b.run() - """ - def __init__(self,graph_classes,title='',test_string=None,runs=3,reps=1000): - self.runs = runs - self.reps = reps - self.title = title - self.class_tests = dict((gc,'') for gc in graph_classes) - # set up the test string if it is the same for all classes. - if test_string is not None: - if isinstance(test_string,tuple): - self['all']=test_string - else: - self['all']=(test_string,'') - - def __setitem__(self,graph_class,some_strs): - """ - Set a simple bit of code and setup string for the test. - Use this for cases where the code differs from one class to another. - """ - test_str, setup_str = some_strs - if graph_class == 'all': - graph_class = self.class_tests.keys() - elif not isinstance(graph_class,list): - graph_class = [graph_class] - - for GC in graph_class: - setup_string='import networkx as NX\nG=NX.%s.%s()\n'%\ - (GC.lower(),GC) + setup_str - self.class_tests[GC] = Timer(test_str, setup_string) - - - def run(self): - """Run the benchmark for each class and print results.""" - column_len = max(len(G) for G in self.class_tests) - - print('='*72) - if self.title: - print("%s: %s runs, %s reps"% (self.title,self.runs,self.reps)) - print('='*72) - - times=[] - for GC,timer in self.class_tests.items(): - name = GC.ljust(column_len) - try: - t=sum(timer.repeat(self.runs,self.reps))/self.runs -# print "%s: %s" % (name, timer.repeat(self.runs,self.reps)) - times.append((t,name)) - except Exception as e: - print("%s: Failed to benchmark (%s)." % (name,e)) - - - times.sort() - tmin=times[0][0] - for t,name in times: - print("%s: %5.2f %s" % (name, t/tmin*100.,t)) - print('-'*72) - print() - -if __name__ == "__main__": - # set up for all routines: - classes=['Graph','MultiGraph','DiGraph','MultiDiGraph'] - all_tests=['add_nodes','add_edges','remove_nodes','remove_edges',\ - 'neighbors','edges','degree','dijkstra','shortest path',\ - 'subgraph','edgedata_subgraph','laplacian'] - # Choose which tests to run - tests=all_tests - tests=['subgraph','edgedata_subgraph'] - #tests=all_tests[-1:] - N=100 - - if 'add_nodes' in tests: - title='Benchmark: Adding nodes' - test_string=('G.add_nodes_from(nlist)','nlist=range(%i)'%N) - b=Benchmark(classes,title,test_string,runs=3,reps=1000) - b.run() - - if 'add_edges' in tests: - title='Benchmark: Adding edges' - setup='elist=[(i,i+3) for i in range(%s-3)]\nG.add_nodes_from(range(%i))'%(N,N) - test_string=('G.add_edges_from(elist)',setup) - b=Benchmark(classes,title,test_string,runs=3,reps=1000) - b.run() - - if 'remove_nodes' in tests: - title='Benchmark: Adding and Deleting nodes' - setup='nlist=range(%i)'%N - test_string=('G.add_nodes_from(nlist)\nG.remove_nodes_from(nlist)',setup) - b=Benchmark(classes,title,test_string,runs=3,reps=1000) - b.run() - - if 'remove_edges' in tests: - title='Benchmark: Adding and Deleting edges' - setup='elist=[(i,i+3) for i in range(%s-3)]'%N - test_string=('G.add_edges_from(elist)\nG.remove_edges_from(elist)',setup) - b=Benchmark(classes,title,test_string,runs=3,reps=1000) - b.run() - - if 'neighbors' in tests: - N=500 - p=0.3 - title='Benchmark: reporting neighbors' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='for n in G:\n for nbr in G.neighbors(n):\n pass' - all_setup='H=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)\n' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'edges' in tests: - N=500 - p=0.3 - title='Benchmark: reporting edges' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='for n in G:\n for e in G.edges(n):\n pass' - all_setup='H=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)\n' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'degree' in tests: - N=500 - p=0.3 - title='Benchmark: reporting degree' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='for d in G.degree():\n pass' - all_setup='H=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)\n' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'dijkstra' in tests: - N=500 - p=0.3 - title='dijkstra single source shortest path' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='p=NX.single_source_dijkstra(G,i)' - all_setup='i=6\nH=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'shortest path' in tests: - N=500 - p=0.3 - title='single source shortest path' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='p=NX.single_source_shortest_path(G,i)' - all_setup='i=6\nH=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'subgraph' in tests: - N=500 - p=0.3 - title='subgraph method' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='G.subgraph(nlist)' - all_setup='nlist=range(100,150)\nH=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'edgedata_subgraph' in tests: - N=500 - p=0.3 - title='subgraph method with edge data present' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='G.subgraph(nlist)' - all_setup='nlist=range(100,150)\nH=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v,hi=3)' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)],hi=2)' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v,hi=1)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)],hi=2)' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() - - if 'laplacian' in tests: - N=500 - p=0.3 - title='creation of laplacian matrix' - b=Benchmark(classes,title,runs=3,reps=1) - test_string='NX.laplacian(G)' - all_setup='H=NX.binomial_graph(%s,%s)\nfor (u,v) in H.edges_iter():\n '%(N,p) - setup=all_setup+'G.add_edge(u,v)' - if 'Graph' in classes: b['Graph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'DiGraph' in classes: b['DiGraph']=(test_string,setup) - setup=all_setup+'G.add_edge(u,v)' - if 'MultiGraph' in classes: b['MultiGraph']=(test_string,setup) - setup=all_setup+'G.add_edges_from([(u,v),(v,u)])' - if 'MultiDiGraph' in classes: b['MultiDiGraph']=(test_string,setup) - b.run() diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/test.py deleted file mode 100755 index e776d32..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python -import sys -from os import path,getcwd - -def run(verbosity=1,doctest=False,numpy=True): - """Run NetworkX tests. - - Parameters - ---------- - verbosity: integer, optional - Level of detail in test reports. Higher numbers provide more detail. - - doctest: bool, optional - True to run doctests in code modules - - numpy: bool, optional - True to test modules dependent on numpy - """ - try: - import nose - except ImportError: - raise ImportError(\ - "The nose package is needed to run the NetworkX tests.") - - sys.stderr.write("Running NetworkX tests:") - nx_install_dir=path.join(path.dirname(__file__), path.pardir) - # stop if running from source directory - if getcwd() == path.abspath(path.join(nx_install_dir,path.pardir)): - raise RuntimeError("Can't run tests from source directory.\n" - "Run 'nosetests' from the command line.") - - argv=[' ','--verbosity=%d'%verbosity, - '-w',nx_install_dir, - '-exe'] - if doctest: - argv.extend(['--with-doctest','--doctest-extension=txt']) - if not numpy: - argv.extend(['-A not numpy']) - - - nose.run(argv=argv) - -if __name__=="__main__": - run() - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert.py deleted file mode 100644 index 38a66e2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert.py +++ /dev/null @@ -1,224 +0,0 @@ -#!/usr/bin/env python - -"""Convert -======= -""" - -from nose.tools import * -from networkx import * -from networkx.convert import * -from networkx.algorithms.operators import * -from networkx.generators.classic import barbell_graph,cycle_graph - -class TestConvert(): - def edgelists_equal(self,e1,e2): - return sorted(sorted(e) for e in e1)==sorted(sorted(e) for e in e2) - - - - def test_simple_graphs(self): - for dest, source in [(to_dict_of_dicts, from_dict_of_dicts), - (to_dict_of_lists, from_dict_of_lists)]: - G=barbell_graph(10,3) - dod=dest(G) - - # Dict of [dicts, lists] - GG=source(dod) - assert_equal(sorted(G.nodes()), sorted(GG.nodes())) - assert_equal(sorted(G.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dod) - assert_equal(sorted(G.nodes()), sorted(GW.nodes())) - assert_equal(sorted(G.edges()), sorted(GW.edges())) - GI=Graph(dod) - assert_equal(sorted(G.nodes()), sorted(GI.nodes())) - assert_equal(sorted(G.edges()), sorted(GI.edges())) - - # With nodelist keyword - P4=path_graph(4) - P3=path_graph(3) - dod=dest(P4,nodelist=[0,1,2]) - Gdod=Graph(dod) - assert_equal(sorted(Gdod.nodes()), sorted(P3.nodes())) - assert_equal(sorted(Gdod.edges()), sorted(P3.edges())) - - def test_digraphs(self): - for dest, source in [(to_dict_of_dicts, from_dict_of_dicts), - (to_dict_of_lists, from_dict_of_lists)]: - G=cycle_graph(10) - - # Dict of [dicts, lists] - dod=dest(G) - GG=source(dod) - assert_equal(sorted(G.nodes()), sorted(GG.nodes())) - assert_equal(sorted(G.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dod) - assert_equal(sorted(G.nodes()), sorted(GW.nodes())) - assert_equal(sorted(G.edges()), sorted(GW.edges())) - GI=Graph(dod) - assert_equal(sorted(G.nodes()), sorted(GI.nodes())) - assert_equal(sorted(G.edges()), sorted(GI.edges())) - - G=cycle_graph(10,create_using=DiGraph()) - dod=dest(G) - GG=source(dod, create_using=DiGraph()) - assert_equal(sorted(G.nodes()), sorted(GG.nodes())) - assert_equal(sorted(G.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dod, create_using=DiGraph()) - assert_equal(sorted(G.nodes()), sorted(GW.nodes())) - assert_equal(sorted(G.edges()), sorted(GW.edges())) - GI=DiGraph(dod) - assert_equal(sorted(G.nodes()), sorted(GI.nodes())) - assert_equal(sorted(G.edges()), sorted(GI.edges())) - - def test_graph(self): - G=cycle_graph(10) - e=G.edges() - source=[u for u,v in e] - dest=[v for u,v in e] - ex=zip(source,dest,source) - G=Graph() - G.add_weighted_edges_from(ex) - - # Dict of dicts - dod=to_dict_of_dicts(G) - GG=from_dict_of_dicts(dod,create_using=Graph()) - assert_equal(sorted(G.nodes()), sorted(GG.nodes())) - assert_equal(sorted(G.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dod,create_using=Graph()) - assert_equal(sorted(G.nodes()), sorted(GW.nodes())) - assert_equal(sorted(G.edges()), sorted(GW.edges())) - GI=Graph(dod) - assert_equal(sorted(G.nodes()), sorted(GI.nodes())) - assert_equal(sorted(G.edges()), sorted(GI.edges())) - - # Dict of lists - dol=to_dict_of_lists(G) - GG=from_dict_of_lists(dol,create_using=Graph()) - # dict of lists throws away edge data so set it to none - enone=[(u,v,{}) for (u,v,d) in G.edges(data=True)] - assert_equal(sorted(G.nodes()), sorted(GG.nodes())) - assert_equal(enone, sorted(GG.edges(data=True))) - GW=to_networkx_graph(dol,create_using=Graph()) - assert_equal(sorted(G.nodes()), sorted(GW.nodes())) - assert_equal(enone, sorted(GW.edges(data=True))) - GI=Graph(dol) - assert_equal(sorted(G.nodes()), sorted(GI.nodes())) - assert_equal(enone, sorted(GI.edges(data=True))) - - - def test_with_multiedges_self_loops(self): - G=cycle_graph(10) - e=G.edges() - source,dest = list(zip(*e)) - ex=list(zip(source,dest,source)) - XG=Graph() - XG.add_weighted_edges_from(ex) - XGM=MultiGraph() - XGM.add_weighted_edges_from(ex) - XGM.add_edge(0,1,weight=2) # multiedge - XGS=Graph() - XGS.add_weighted_edges_from(ex) - XGS.add_edge(0,0,weight=100) # self loop - - # Dict of dicts - # with self loops, OK - dod=to_dict_of_dicts(XGS) - GG=from_dict_of_dicts(dod,create_using=Graph()) - assert_equal(sorted(XGS.nodes()), sorted(GG.nodes())) - assert_equal(sorted(XGS.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dod,create_using=Graph()) - assert_equal(sorted(XGS.nodes()), sorted(GW.nodes())) - assert_equal(sorted(XGS.edges()), sorted(GW.edges())) - GI=Graph(dod) - assert_equal(sorted(XGS.nodes()), sorted(GI.nodes())) - assert_equal(sorted(XGS.edges()), sorted(GI.edges())) - - # Dict of lists - # with self loops, OK - dol=to_dict_of_lists(XGS) - GG=from_dict_of_lists(dol,create_using=Graph()) - # dict of lists throws away edge data so set it to none - enone=[(u,v,{}) for (u,v,d) in XGS.edges(data=True)] - assert_equal(sorted(XGS.nodes()), sorted(GG.nodes())) - assert_equal(enone, sorted(GG.edges(data=True))) - GW=to_networkx_graph(dol,create_using=Graph()) - assert_equal(sorted(XGS.nodes()), sorted(GW.nodes())) - assert_equal(enone, sorted(GW.edges(data=True))) - GI=Graph(dol) - assert_equal(sorted(XGS.nodes()), sorted(GI.nodes())) - assert_equal(enone, sorted(GI.edges(data=True))) - - # Dict of dicts - # with multiedges, OK - dod=to_dict_of_dicts(XGM) - GG=from_dict_of_dicts(dod,create_using=MultiGraph(), - multigraph_input=True) - assert_equal(sorted(XGM.nodes()), sorted(GG.nodes())) - assert_equal(sorted(XGM.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dod,create_using=MultiGraph(),multigraph_input=True) - assert_equal(sorted(XGM.nodes()), sorted(GW.nodes())) - assert_equal(sorted(XGM.edges()), sorted(GW.edges())) - GI=MultiGraph(dod) # convert can't tell whether to duplicate edges! - assert_equal(sorted(XGM.nodes()), sorted(GI.nodes())) - #assert_not_equal(sorted(XGM.edges()), sorted(GI.edges())) - assert_false(sorted(XGM.edges()) == sorted(GI.edges())) - GE=from_dict_of_dicts(dod,create_using=MultiGraph(), - multigraph_input=False) - assert_equal(sorted(XGM.nodes()), sorted(GE.nodes())) - assert_not_equal(sorted(XGM.edges()), sorted(GE.edges())) - GI=MultiGraph(XGM) - assert_equal(sorted(XGM.nodes()), sorted(GI.nodes())) - assert_equal(sorted(XGM.edges()), sorted(GI.edges())) - GM=MultiGraph(G) - assert_equal(sorted(GM.nodes()), sorted(G.nodes())) - assert_equal(sorted(GM.edges()), sorted(G.edges())) - - # Dict of lists - # with multiedges, OK, but better write as DiGraph else you'll - # get double edges - dol=to_dict_of_lists(G) - GG=from_dict_of_lists(dol,create_using=MultiGraph()) - assert_equal(sorted(G.nodes()), sorted(GG.nodes())) - assert_equal(sorted(G.edges()), sorted(GG.edges())) - GW=to_networkx_graph(dol,create_using=MultiGraph()) - assert_equal(sorted(G.nodes()), sorted(GW.nodes())) - assert_equal(sorted(G.edges()), sorted(GW.edges())) - GI=MultiGraph(dol) - assert_equal(sorted(G.nodes()), sorted(GI.nodes())) - assert_equal(sorted(G.edges()), sorted(GI.edges())) - - def test_edgelists(self): - P=path_graph(4) - e=[(0,1),(1,2),(2,3)] - G=Graph(e) - assert_equal(sorted(G.nodes()), sorted(P.nodes())) - assert_equal(sorted(G.edges()), sorted(P.edges())) - assert_equal(sorted(G.edges(data=True)), sorted(P.edges(data=True))) - - e=[(0,1,{}),(1,2,{}),(2,3,{})] - G=Graph(e) - assert_equal(sorted(G.nodes()), sorted(P.nodes())) - assert_equal(sorted(G.edges()), sorted(P.edges())) - assert_equal(sorted(G.edges(data=True)), sorted(P.edges(data=True))) - - e=((n,n+1) for n in range(3)) - G=Graph(e) - assert_equal(sorted(G.nodes()), sorted(P.nodes())) - assert_equal(sorted(G.edges()), sorted(P.edges())) - assert_equal(sorted(G.edges(data=True)), sorted(P.edges(data=True))) - - def test_directed_to_undirected(self): - edges1 = [(0, 1), (1, 2), (2, 0)] - edges2 = [(0, 1), (1, 2), (0, 2)] - assert_true(self.edgelists_equal(nx.Graph(nx.DiGraph(edges1)).edges(),edges1)) - assert_true(self.edgelists_equal(nx.Graph(nx.DiGraph(edges2)).edges(),edges1)) - assert_true(self.edgelists_equal(nx.MultiGraph(nx.DiGraph(edges1)).edges(),edges1)) - assert_true(self.edgelists_equal(nx.MultiGraph(nx.DiGraph(edges2)).edges(),edges1)) - - assert_true(self.edgelists_equal(nx.MultiGraph(nx.MultiDiGraph(edges1)).edges(), - edges1)) - assert_true(self.edgelists_equal(nx.MultiGraph(nx.MultiDiGraph(edges2)).edges(), - edges1)) - - assert_true(self.edgelists_equal(nx.Graph(nx.MultiDiGraph(edges1)).edges(),edges1)) - assert_true(self.edgelists_equal(nx.Graph(nx.MultiDiGraph(edges2)).edges(),edges1)) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert_numpy.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert_numpy.py deleted file mode 100644 index 2a4ef96..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert_numpy.py +++ /dev/null @@ -1,172 +0,0 @@ -from nose import SkipTest -from nose.tools import assert_raises, assert_true, assert_equal - -import networkx as nx -from networkx.generators.classic import barbell_graph,cycle_graph,path_graph - -class TestConvertNumpy(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global np - global np_assert_equal - try: - import numpy as np - np_assert_equal=np.testing.assert_equal - except ImportError: - raise SkipTest('NumPy not available.') - - def __init__(self): - self.G1 = barbell_graph(10, 3) - self.G2 = cycle_graph(10, create_using=nx.DiGraph()) - - self.G3 = self.create_weighted(nx.Graph()) - self.G4 = self.create_weighted(nx.DiGraph()) - - def create_weighted(self, G): - g = cycle_graph(4) - e = g.edges() - source = [u for u,v in e] - dest = [v for u,v in e] - weight = [s+10 for s in source] - ex = zip(source, dest, weight) - G.add_weighted_edges_from(ex) - return G - - def assert_equal(self, G1, G2): - assert_true( sorted(G1.nodes())==sorted(G2.nodes()) ) - assert_true( sorted(G1.edges())==sorted(G2.edges()) ) - - def identity_conversion(self, G, A, create_using): - GG = nx.from_numpy_matrix(A, create_using=create_using) - self.assert_equal(G, GG) - GW = nx.to_networkx_graph(A, create_using=create_using) - self.assert_equal(G, GW) - GI = create_using.__class__(A) - self.assert_equal(G, GI) - - def test_shape(self): - "Conversion from non-square array." - A=np.array([[1,2,3],[4,5,6]]) - assert_raises(nx.NetworkXError, nx.from_numpy_matrix, A) - - def test_identity_graph_matrix(self): - "Conversion from graph to matrix to graph." - A = nx.to_numpy_matrix(self.G1) - self.identity_conversion(self.G1, A, nx.Graph()) - - def test_identity_graph_array(self): - "Conversion from graph to array to graph." - A = nx.to_numpy_matrix(self.G1) - A = np.asarray(A) - self.identity_conversion(self.G1, A, nx.Graph()) - - def test_identity_digraph_matrix(self): - """Conversion from digraph to matrix to digraph.""" - A = nx.to_numpy_matrix(self.G2) - self.identity_conversion(self.G2, A, nx.DiGraph()) - - def test_identity_digraph_array(self): - """Conversion from digraph to array to digraph.""" - A = nx.to_numpy_matrix(self.G2) - A = np.asarray(A) - self.identity_conversion(self.G2, A, nx.DiGraph()) - - def test_identity_weighted_graph_matrix(self): - """Conversion from weighted graph to matrix to weighted graph.""" - A = nx.to_numpy_matrix(self.G3) - self.identity_conversion(self.G3, A, nx.Graph()) - - def test_identity_weighted_graph_array(self): - """Conversion from weighted graph to array to weighted graph.""" - A = nx.to_numpy_matrix(self.G3) - A = np.asarray(A) - self.identity_conversion(self.G3, A, nx.Graph()) - - def test_identity_weighted_digraph_matrix(self): - """Conversion from weighted digraph to matrix to weighted digraph.""" - A = nx.to_numpy_matrix(self.G4) - self.identity_conversion(self.G4, A, nx.DiGraph()) - - def test_identity_weighted_digraph_array(self): - """Conversion from weighted digraph to array to weighted digraph.""" - A = nx.to_numpy_matrix(self.G4) - A = np.asarray(A) - self.identity_conversion(self.G4, A, nx.DiGraph()) - - def test_nodelist(self): - """Conversion from graph to matrix to graph with nodelist.""" - P4 = path_graph(4) - P3 = path_graph(3) - nodelist = P3.nodes() - A = nx.to_numpy_matrix(P4, nodelist=nodelist) - GA = nx.Graph(A) - self.assert_equal(GA, P3) - - # Make nodelist ambiguous by containing duplicates. - nodelist += [nodelist[0]] - assert_raises(nx.NetworkXError, nx.to_numpy_matrix, P3, nodelist=nodelist) - - def test_weight_keyword(self): - WP4 = nx.Graph() - WP4.add_edges_from( (n,n+1,dict(weight=0.5,other=0.3)) for n in range(3) ) - P4 = path_graph(4) - A = nx.to_numpy_matrix(P4) - np_assert_equal(A, nx.to_numpy_matrix(WP4,weight=None)) - np_assert_equal(0.5*A, nx.to_numpy_matrix(WP4)) - np_assert_equal(0.3*A, nx.to_numpy_matrix(WP4,weight='other')) - - def test_from_numpy_matrix_type(self): - A=np.matrix([[1]]) - G=nx.from_numpy_matrix(A) - assert_equal(type(G[0][0]['weight']),int) - - A=np.matrix([[1]]).astype(np.float) - G=nx.from_numpy_matrix(A) - assert_equal(type(G[0][0]['weight']),float) - - A=np.matrix([[1]]).astype(np.str) - G=nx.from_numpy_matrix(A) - assert_equal(type(G[0][0]['weight']),str) - - A=np.matrix([[1]]).astype(np.bool) - G=nx.from_numpy_matrix(A) - assert_equal(type(G[0][0]['weight']),bool) - - A=np.matrix([[1]]).astype(np.complex) - G=nx.from_numpy_matrix(A) - assert_equal(type(G[0][0]['weight']),complex) - - A=np.matrix([[1]]).astype(np.object) - assert_raises(TypeError,nx.from_numpy_matrix,A) - - def test_from_numpy_matrix_dtype(self): - dt=[('weight',float),('cost',int)] - A=np.matrix([[(1.0,2)]],dtype=dt) - G=nx.from_numpy_matrix(A) - assert_equal(type(G[0][0]['weight']),float) - assert_equal(type(G[0][0]['cost']),int) - assert_equal(G[0][0]['cost'],2) - assert_equal(G[0][0]['weight'],1.0) - - def test_to_numpy_recarray(self): - G=nx.Graph() - G.add_edge(1,2,weight=7.0,cost=5) - A=nx.to_numpy_recarray(G,dtype=[('weight',float),('cost',int)]) - assert_equal(sorted(A.dtype.names),['cost','weight']) - assert_equal(A.weight[0,1],7.0) - assert_equal(A.weight[0,0],0.0) - assert_equal(A.cost[0,1],5) - assert_equal(A.cost[0,0],0) - - def test_numpy_multigraph(self): - G=nx.MultiGraph() - G.add_edge(1,2,weight=7) - G.add_edge(1,2,weight=70) - A=nx.to_numpy_matrix(G) - assert_equal(A[1,0],77) - A=nx.to_numpy_matrix(G,multigraph_weight=min) - assert_equal(A[1,0],7) - A=nx.to_numpy_matrix(G,multigraph_weight=max) - assert_equal(A[1,0],70) - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert_scipy.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert_scipy.py deleted file mode 100644 index f90dee7..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_convert_scipy.py +++ /dev/null @@ -1,179 +0,0 @@ -from nose import SkipTest -from nose.tools import assert_raises, assert_true, assert_equal, raises - -import networkx as nx -from networkx.generators.classic import barbell_graph,cycle_graph,path_graph - -class TestConvertNumpy(object): - @classmethod - def setupClass(cls): - global np, sp, sparse, np_assert_equal - try: - import numpy as np - import scipy as sp - import scipy.sparse as sparse - np_assert_equal=np.testing.assert_equal - except ImportError: - raise SkipTest('SciPy sparse library not available.') - - def __init__(self): - self.G1 = barbell_graph(10, 3) - self.G2 = cycle_graph(10, create_using=nx.DiGraph()) - - self.G3 = self.create_weighted(nx.Graph()) - self.G4 = self.create_weighted(nx.DiGraph()) - - def create_weighted(self, G): - g = cycle_graph(4) - e = g.edges() - source = [u for u,v in e] - dest = [v for u,v in e] - weight = [s+10 for s in source] - ex = zip(source, dest, weight) - G.add_weighted_edges_from(ex) - return G - - def assert_equal(self, G1, G2): - assert_true( sorted(G1.nodes())==sorted(G2.nodes()) ) - assert_true( sorted(G1.edges())==sorted(G2.edges()) ) - - def identity_conversion(self, G, A, create_using): - GG = nx.from_scipy_sparse_matrix(A, create_using=create_using) - self.assert_equal(G, GG) - - GW = nx.to_networkx_graph(A, create_using=create_using) - self.assert_equal(G, GW) - - GI = create_using.__class__(A) - self.assert_equal(G, GI) - - ACSR = A.tocsr() - GI = create_using.__class__(ACSR) - self.assert_equal(G, GI) - - ACOO = A.tocoo() - GI = create_using.__class__(ACOO) - self.assert_equal(G, GI) - - ACSC = A.tocsc() - GI = create_using.__class__(ACSC) - self.assert_equal(G, GI) - - AD = A.todense() - GI = create_using.__class__(AD) - self.assert_equal(G, GI) - - AA = A.toarray() - GI = create_using.__class__(AA) - self.assert_equal(G, GI) - - def test_shape(self): - "Conversion from non-square sparse array." - A = sp.sparse.lil_matrix([[1,2,3],[4,5,6]]) - assert_raises(nx.NetworkXError, nx.from_scipy_sparse_matrix, A) - - def test_identity_graph_matrix(self): - "Conversion from graph to sparse matrix to graph." - A = nx.to_scipy_sparse_matrix(self.G1) - self.identity_conversion(self.G1, A, nx.Graph()) - - def test_identity_digraph_matrix(self): - "Conversion from digraph to sparse matrix to digraph." - A = nx.to_scipy_sparse_matrix(self.G2) - self.identity_conversion(self.G2, A, nx.DiGraph()) - - def test_identity_weighted_graph_matrix(self): - """Conversion from weighted graph to sparse matrix to weighted graph.""" - A = nx.to_scipy_sparse_matrix(self.G3) - self.identity_conversion(self.G3, A, nx.Graph()) - - def test_identity_weighted_digraph_matrix(self): - """Conversion from weighted digraph to sparse matrix to weighted digraph.""" - A = nx.to_scipy_sparse_matrix(self.G4) - self.identity_conversion(self.G4, A, nx.DiGraph()) - - def test_nodelist(self): - """Conversion from graph to sparse matrix to graph with nodelist.""" - P4 = path_graph(4) - P3 = path_graph(3) - nodelist = P3.nodes() - A = nx.to_scipy_sparse_matrix(P4, nodelist=nodelist) - GA = nx.Graph(A) - self.assert_equal(GA, P3) - - # Make nodelist ambiguous by containing duplicates. - nodelist += [nodelist[0]] - assert_raises(nx.NetworkXError, nx.to_numpy_matrix, P3, - nodelist=nodelist) - - def test_weight_keyword(self): - WP4 = nx.Graph() - WP4.add_edges_from( (n,n+1,dict(weight=0.5,other=0.3)) - for n in range(3) ) - P4 = path_graph(4) - A = nx.to_scipy_sparse_matrix(P4) - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - np_assert_equal(0.5*A.todense(), - nx.to_scipy_sparse_matrix(WP4).todense()) - np_assert_equal(0.3*A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight='other').todense()) - - def test_format_keyword(self): - WP4 = nx.Graph() - WP4.add_edges_from( (n,n+1,dict(weight=0.5,other=0.3)) - for n in range(3) ) - P4 = path_graph(4) - A = nx.to_scipy_sparse_matrix(P4, format='csr') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - A = nx.to_scipy_sparse_matrix(P4, format='csc') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - A = nx.to_scipy_sparse_matrix(P4, format='coo') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - A = nx.to_scipy_sparse_matrix(P4, format='bsr') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - A = nx.to_scipy_sparse_matrix(P4, format='lil') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - A = nx.to_scipy_sparse_matrix(P4, format='dia') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - A = nx.to_scipy_sparse_matrix(P4, format='dok') - np_assert_equal(A.todense(), - nx.to_scipy_sparse_matrix(WP4,weight=None).todense()) - - @raises(nx.NetworkXError) - def test_format_keyword_fail(self): - WP4 = nx.Graph() - WP4.add_edges_from( (n,n+1,dict(weight=0.5,other=0.3)) - for n in range(3) ) - P4 = path_graph(4) - nx.to_scipy_sparse_matrix(P4, format='any_other') - - @raises(nx.NetworkXError) - def test_null_fail(self): - nx.to_scipy_sparse_matrix(nx.Graph()) - - def test_empty(self): - G = nx.Graph() - G.add_node(1) - M = nx.to_scipy_sparse_matrix(G) - np_assert_equal(M.todense(), np.matrix([[0]])) - - def test_ordering(self): - G = nx.DiGraph() - G.add_edge(1,2) - G.add_edge(2,3) - G.add_edge(3,1) - M = nx.to_scipy_sparse_matrix(G,nodelist=[3,2,1]) - np_assert_equal(M.todense(), np.matrix([[0,0,1],[1,0,0],[0,1,0]])) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_exceptions.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_exceptions.py deleted file mode 100644 index 796fdd2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_exceptions.py +++ /dev/null @@ -1,33 +0,0 @@ -from nose.tools import raises -import networkx as nx - -# smoke tests for exceptions - -@raises(nx.NetworkXException) -def test_raises_networkx_exception(): - raise nx.NetworkXException - -@raises(nx.NetworkXError) -def test_raises_networkx_error(): - raise nx.NetworkXError - -@raises(nx.NetworkXPointlessConcept) -def test_raises_networkx_pointless_concept(): - raise nx.NetworkXPointlessConcept - -@raises(nx.NetworkXAlgorithmError) -def test_raises_networkx_algorithm_error(): - raise nx.NetworkXAlgorithmError - -@raises(nx.NetworkXUnfeasible) -def test_raises_networkx_unfeasible(): - raise nx.NetworkXUnfeasible - -@raises(nx.NetworkXNoPath) -def test_raises_networkx_no_path(): - raise nx.NetworkXNoPath - -@raises(nx.NetworkXUnbounded) -def test_raises_networkx_unbounded(): - raise nx.NetworkXUnbounded - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_relabel.py b/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_relabel.py deleted file mode 100644 index e9dd2af..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/tests/test_relabel.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from networkx import * -from networkx.convert import * -from networkx.algorithms.operators import * -from networkx.generators.classic import barbell_graph,cycle_graph -from networkx.testing import * - -class TestRelabel(): - def test_convert_node_labels_to_integers(self): - # test that empty graph converts fine for all options - G=empty_graph() - H=convert_node_labels_to_integers(G,100) - assert_equal(H.name, '(empty_graph(0))_with_int_labels') - assert_equal(H.nodes(), []) - assert_equal(H.edges(), []) - - for opt in ["default", "sorted", "increasing degree", - "decreasing degree"]: - G=empty_graph() - H=convert_node_labels_to_integers(G,100, ordering=opt) - assert_equal(H.name, '(empty_graph(0))_with_int_labels') - assert_equal(H.nodes(), []) - assert_equal(H.edges(), []) - - G=empty_graph() - G.add_edges_from([('A','B'),('A','C'),('B','C'),('C','D')]) - G.name="paw" - H=convert_node_labels_to_integers(G) - degH=H.degree().values() - degG=G.degree().values() - assert_equal(sorted(degH), sorted(degG)) - - H=convert_node_labels_to_integers(G,1000) - degH=H.degree().values() - degG=G.degree().values() - assert_equal(sorted(degH), sorted(degG)) - assert_equal(H.nodes(), [1000, 1001, 1002, 1003]) - - H=convert_node_labels_to_integers(G,ordering="increasing degree") - degH=H.degree().values() - degG=G.degree().values() - assert_equal(sorted(degH), sorted(degG)) - assert_equal(degree(H,0), 1) - assert_equal(degree(H,1), 2) - assert_equal(degree(H,2), 2) - assert_equal(degree(H,3), 3) - - H=convert_node_labels_to_integers(G,ordering="decreasing degree") - degH=H.degree().values() - degG=G.degree().values() - assert_equal(sorted(degH), sorted(degG)) - assert_equal(degree(H,0), 3) - assert_equal(degree(H,1), 2) - assert_equal(degree(H,2), 2) - assert_equal(degree(H,3), 1) - - H=convert_node_labels_to_integers(G,ordering="increasing degree", - label_attribute='label') - degH=H.degree().values() - degG=G.degree().values() - assert_equal(sorted(degH), sorted(degG)) - assert_equal(degree(H,0), 1) - assert_equal(degree(H,1), 2) - assert_equal(degree(H,2), 2) - assert_equal(degree(H,3), 3) - - # check mapping - assert_equal(H.node[3]['label'],'C') - assert_equal(H.node[0]['label'],'D') - assert_true(H.node[1]['label']=='A' or H.node[2]['label']=='A') - assert_true(H.node[1]['label']=='B' or H.node[2]['label']=='B') - - def test_convert_to_integers2(self): - G=empty_graph() - G.add_edges_from([('C','D'),('A','B'),('A','C'),('B','C')]) - G.name="paw" - H=convert_node_labels_to_integers(G,ordering="sorted") - degH=H.degree().values() - degG=G.degree().values() - assert_equal(sorted(degH), sorted(degG)) - - H=convert_node_labels_to_integers(G,ordering="sorted", - label_attribute='label') - assert_equal(H.node[0]['label'],'A') - assert_equal(H.node[1]['label'],'B') - assert_equal(H.node[2]['label'],'C') - assert_equal(H.node[3]['label'],'D') - - @raises(nx.NetworkXError) - def test_convert_to_integers_raise(self): - G = nx.Graph() - H=convert_node_labels_to_integers(G,ordering="increasing age") - - - def test_relabel_nodes_copy(self): - G=empty_graph() - G.add_edges_from([('A','B'),('A','C'),('B','C'),('C','D')]) - mapping={'A':'aardvark','B':'bear','C':'cat','D':'dog'} - H=relabel_nodes(G,mapping) - assert_equal(sorted(H.nodes()), ['aardvark', 'bear', 'cat', 'dog']) - - def test_relabel_nodes_function(self): - G=empty_graph() - G.add_edges_from([('A','B'),('A','C'),('B','C'),('C','D')]) - # function mapping no longer encouraged but works - def mapping(n): - return ord(n) - H=relabel_nodes(G,mapping) - assert_equal(sorted(H.nodes()), [65, 66, 67, 68]) - - def test_relabel_nodes_graph(self): - G=Graph([('A','B'),('A','C'),('B','C'),('C','D')]) - mapping={'A':'aardvark','B':'bear','C':'cat','D':'dog'} - H=relabel_nodes(G,mapping) - assert_equal(sorted(H.nodes()), ['aardvark', 'bear', 'cat', 'dog']) - - def test_relabel_nodes_digraph(self): - G=DiGraph([('A','B'),('A','C'),('B','C'),('C','D')]) - mapping={'A':'aardvark','B':'bear','C':'cat','D':'dog'} - H=relabel_nodes(G,mapping,copy=False) - assert_equal(sorted(H.nodes()), ['aardvark', 'bear', 'cat', 'dog']) - - def test_relabel_nodes_multigraph(self): - G=MultiGraph([('a','b'),('a','b')]) - mapping={'a':'aardvark','b':'bear'} - G=relabel_nodes(G,mapping,copy=False) - assert_equal(sorted(G.nodes()), ['aardvark', 'bear']) - assert_edges_equal(sorted(G.edges()), - [('aardvark', 'bear'), ('aardvark', 'bear')]) - - def test_relabel_nodes_multidigraph(self): - G=MultiDiGraph([('a','b'),('a','b')]) - mapping={'a':'aardvark','b':'bear'} - G=relabel_nodes(G,mapping,copy=False) - assert_equal(sorted(G.nodes()), ['aardvark', 'bear']) - assert_equal(sorted(G.edges()), - [('aardvark', 'bear'), ('aardvark', 'bear')]) - - @raises(KeyError) - def test_relabel_nodes_missing(self): - G=Graph([('A','B'),('A','C'),('B','C'),('C','D')]) - mapping={0:'aardvark'} - G=relabel_nodes(G,mapping,copy=False) - - - def test_relabel_toposort(self): - K5=nx.complete_graph(4) - G=nx.complete_graph(4) - G=nx.relabel_nodes(G,dict( [(i,i+1) for i in range(4)]),copy=False) - nx.is_isomorphic(K5,G) - G=nx.complete_graph(4) - G=nx.relabel_nodes(G,dict( [(i,i-1) for i in range(4)]),copy=False) - nx.is_isomorphic(K5,G) - - - def test_relabel_selfloop(self): - G = nx.DiGraph([(1, 1), (1, 2), (2, 3)]) - G = nx.relabel_nodes(G, {1: 'One', 2: 'Two', 3: 'Three'}, copy=False) - assert_equal(sorted(G.nodes()),['One','Three','Two']) - G = nx.MultiDiGraph([(1, 1), (1, 2), (2, 3)]) - G = nx.relabel_nodes(G, {1: 'One', 2: 'Two', 3: 'Three'}, copy=False) - assert_equal(sorted(G.nodes()),['One','Three','Two']) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/__init__.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/__init__.py deleted file mode 100644 index d443064..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from networkx.utils.misc import * -from networkx.utils.decorators import * -from networkx.utils.random_sequence import * -from networkx.utils.union_find import * -from networkx.utils.rcm import * diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/decorators.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/decorators.py deleted file mode 100644 index def1548..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/decorators.py +++ /dev/null @@ -1,270 +0,0 @@ -import sys - -from collections import defaultdict -from os.path import splitext - -import networkx as nx -from networkx.external.decorator import decorator -from networkx.utils import is_string_like - -def not_implemented_for(*graph_types): - """Decorator to mark algorithms as not implemented - - Parameters - ---------- - graph_types : container of strings - Entries must be one of 'directed','undirected', 'multigraph', 'graph'. - - Returns - ------- - _require : function - The decorated function. - - Raises - ------ - NetworkXNotImplemnted - If any of the packages cannot be imported - - Notes - ----- - Multiple types are joined logically with "and". - For "or" use multiple @not_implemented_for() lines. - - Examples - -------- - Decorate functions like this:: - - @not_implemnted_for('directed') - def sp_function(): - pass - - @not_implemnted_for('directed','multigraph') - def sp_np_function(): - pass - """ - @decorator - def _not_implemented_for(f,*args,**kwargs): - graph = args[0] - terms= {'directed':graph.is_directed(), - 'undirected':not graph.is_directed(), - 'multigraph':graph.is_multigraph(), - 'graph':not graph.is_multigraph()} - match = True - try: - for t in graph_types: - match = match and terms[t] - except KeyError: - raise KeyError('use one or more of ', - 'directed, undirected, multigraph, graph') - if match: - raise nx.NetworkXNotImplemented('not implemented for %s type'% - ' '.join(graph_types)) - else: - return f(*args,**kwargs) - return _not_implemented_for - - -def require(*packages): - """Decorator to check whether specific packages can be imported. - - If a package cannot be imported, then NetworkXError is raised. - If all packages can be imported, then the original function is called. - - Parameters - ---------- - packages : container of strings - Container of module names that will be imported. - - Returns - ------- - _require : function - The decorated function. - - Raises - ------ - NetworkXError - If any of the packages cannot be imported - - Examples - -------- - Decorate functions like this:: - - @require('scipy') - def sp_function(): - import scipy - pass - - @require('numpy','scipy') - def sp_np_function(): - import numpy - import scipy - pass - """ - @decorator - def _require(f,*args,**kwargs): - for package in reversed(packages): - try: - __import__(package) - except: - msg = "{0} requires {1}" - raise nx.NetworkXError( msg.format(f.__name__, package) ) - return f(*args,**kwargs) - return _require - - -def _open_gz(path, mode): - import gzip - return gzip.open(path,mode=mode) - -def _open_bz2(path, mode): - import bz2 - return bz2.BZ2File(path,mode=mode) - -# To handle new extensions, define a function accepting a `path` and `mode`. -# Then add the extension to _dispatch_dict. -_dispatch_dict = defaultdict(lambda : open) -_dispatch_dict['.gz'] = _open_gz -_dispatch_dict['.bz2'] = _open_bz2 -_dispatch_dict['.gzip'] = _open_gz - - -def open_file(path_arg, mode='r'): - """Decorator to ensure clean opening and closing of files. - - Parameters - ---------- - path_arg : int - Location of the path argument in args. Even if the argument is a - named positional argument (with a default value), you must specify its - index as a positional argument. - mode : str - String for opening mode. - - Returns - ------- - _open_file : function - Function which cleanly executes the io. - - Examples - -------- - Decorate functions like this:: - - @open_file(0,'r') - def read_function(pathname): - pass - - @open_file(1,'w') - def write_function(G,pathname): - pass - - @open_file(1,'w') - def write_function(G, pathname='graph.dot') - pass - - @open_file('path', 'w+') - def another_function(arg, **kwargs): - path = kwargs['path'] - pass - """ - # Note that this decorator solves the problem when a path argument is - # specified as a string, but it does not handle the situation when the - # function wants to accept a default of None (and then handle it). - # Here is an example: - # - # @open_file('path') - # def some_function(arg1, arg2, path=None): - # if path is None: - # fobj = tempfile.NamedTemporaryFile(delete=False) - # close_fobj = True - # else: - # # `path` could have been a string or file object or something - # # similar. In any event, the decorator has given us a file object - # # and it will close it for us, if it should. - # fobj = path - # close_fobj = False - # - # try: - # fobj.write('blah') - # finally: - # if close_fobj: - # fobj.close() - # - # Normally, we'd want to use "with" to ensure that fobj gets closed. - # However, recall that the decorator will make `path` a file object for - # us, and using "with" would undesirably close that file object. Instead, - # you use a try block, as shown above. When we exit the function, fobj will - # be closed, if it should be, by the decorator. - - @decorator - def _open_file(func, *args, **kwargs): - - # Note that since we have used @decorator, *args, and **kwargs have - # already been resolved to match the function signature of func. This - # means default values have been propagated. For example, the function - # func(x, y, a=1, b=2, **kwargs) if called as func(0,1,b=5,c=10) would - # have args=(0,1,1,5) and kwargs={'c':10}. - - # First we parse the arguments of the decorator. The path_arg could - # be an positional argument or a keyword argument. Even if it is - try: - # path_arg is a required positional argument - # This works precisely because we are using @decorator - path = args[path_arg] - except TypeError: - # path_arg is a keyword argument. It is "required" in the sense - # that it must exist, according to the decorator specification, - # It can exist in `kwargs` by a developer specified default value - # or it could have been explicitly set by the user. - try: - path = kwargs[path_arg] - except KeyError: - # Could not find the keyword. Thus, no default was specified - # in the function signature and the user did not provide it. - msg = 'Missing required keyword argument: {0}' - raise nx.NetworkXError(msg.format(path_arg)) - else: - is_kwarg = True - except IndexError: - # A "required" argument was missing. This can only happen if - # the decorator of the function was incorrectly specified. - # So this probably is not a user error, but a developer error. - msg = "path_arg of open_file decorator is incorrect" - raise nx.NetworkXError(msg) - else: - is_kwarg = False - - # Now we have the path_arg. There are two types of input to consider: - # 1) string representing a path that should be opened - # 2) an already opened file object - if is_string_like(path): - ext = splitext(path)[1] - fobj = _dispatch_dict[ext](path, mode=mode) - close_fobj = True - elif hasattr(path, 'read'): - # path is already a file-like object - fobj = path - close_fobj = False - else: - # could be None, in which case the algorithm will deal with it - fobj = path - close_fobj = False - - # Insert file object into args or kwargs. - if is_kwarg: - new_args = args - kwargs[path_arg] = fobj - else: - # args is a tuple, so we must convert to list before modifying it. - new_args = list(args) - new_args[path_arg] = fobj - - # Finally, we call the original function, making sure to close the fobj. - try: - result = func(*new_args, **kwargs) - finally: - if close_fobj: - fobj.close() - - return result - - return _open_file diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/misc.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/misc.py deleted file mode 100644 index a942753..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/misc.py +++ /dev/null @@ -1,151 +0,0 @@ -""" -Miscellaneous Helpers for NetworkX. - -These are not imported into the base networkx namespace but -can be accessed, for example, as - ->>> import networkx ->>> networkx.utils.is_string_like('spam') -True -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import sys -import subprocess -import uuid - -import networkx as nx -from networkx.external.decorator import decorator - -__author__ = '\n'.join(['Aric Hagberg (hagberg@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)', - 'Ben Edwards(bedwards@cs.unm.edu)']) -### some cookbook stuff -# used in deciding whether something is a bunch of nodes, edges, etc. -# see G.add_nodes and others in Graph Class in networkx/base.py - -def is_string_like(obj): # from John Hunter, types-free version - """Check if obj is string.""" - try: - obj + '' - except (TypeError, ValueError): - return False - return True - -def iterable(obj): - """ Return True if obj is iterable with a well-defined len().""" - if hasattr(obj,"__iter__"): return True - try: - len(obj) - except: - return False - return True - -def flatten(obj, result=None): - """ Return flattened version of (possibly nested) iterable object. """ - if not iterable(obj) or is_string_like(obj): - return obj - if result is None: - result = [] - for item in obj: - if not iterable(item) or is_string_like(item): - result.append(item) - else: - flatten(item, result) - return obj.__class__(result) - -def is_list_of_ints( intlist ): - """ Return True if list is a list of ints. """ - if not isinstance(intlist,list): return False - for i in intlist: - if not isinstance(i,int): return False - return True - -def make_str(t): - """Return the string representation of t.""" - if is_string_like(t): return t - return str(t) - -def cumulative_sum(numbers): - """Yield cumulative sum of numbers. - - >>> import networkx.utils as utils - >>> list(utils.cumulative_sum([1,2,3,4])) - [1, 3, 6, 10] - """ - csum = 0 - for n in numbers: - csum += n - yield csum - -def generate_unique_node(): - """ Generate a unique node label.""" - return str(uuid.uuid1()) - -def default_opener(filename): - """Opens `filename` using system's default program. - - Parameters - ---------- - filename : str - The path of the file to be opened. - - """ - cmds = {'darwin': ['open'], - 'linux2': ['xdg-open'], - 'win32': ['cmd.exe', '/C', 'start', '']} - cmd = cmds[sys.platform] + [filename] - subprocess.call(cmd) - - -def dict_to_numpy_array(d,mapping=None): - """Convert a dictionary of dictionaries to a numpy array - with optional mapping.""" - try: - return dict_to_numpy_array2(d, mapping) - except AttributeError: - return dict_to_numpy_array1(d,mapping) - -def dict_to_numpy_array2(d,mapping=None): - """Convert a dictionary of dictionaries to a 2d numpy array - with optional mapping.""" - try: - import numpy - except ImportError: - raise ImportError( - "dict_to_numpy_array requires numpy : http://scipy.org/ ") - if mapping is None: - s=set(d.keys()) - for k,v in d.items(): - s.update(v.keys()) - mapping=dict(zip(s,range(len(s)))) - n=len(mapping) - a = numpy.zeros((n, n)) - for k1, row in d.items(): - for k2, value in row.items(): - i=mapping[k1] - j=mapping[k2] - a[i,j] = value - return a - -def dict_to_numpy_array1(d,mapping=None): - """Convert a dictionary of numbers to a 1d numpy array - with optional mapping.""" - try: - import numpy - except ImportError: - raise ImportError( - "dict_to_numpy_array requires numpy : http://scipy.org/ ") - if mapping is None: - s = set(d.keys()) - mapping = dict(zip(s,range(len(s)))) - n = len(mapping) - a = numpy.zeros(n) - for k1, value in d.items(): - i = mapping[k1] - a[i] = value - return a diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/random_sequence.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/random_sequence.py deleted file mode 100644 index a2f947d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/random_sequence.py +++ /dev/null @@ -1,222 +0,0 @@ -""" -Utilities for generating random numbers, random sequences, and -random selections. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import random -import sys -import networkx as nx -__author__ = '\n'.join(['Aric Hagberg (hagberg@lanl.gov)', - 'Dan Schult(dschult@colgate.edu)', - 'Ben Edwards(bedwards@cs.unm.edu)']) - -def create_degree_sequence(n, sfunction=None, max_tries=50, **kwds): - """ Attempt to create a valid degree sequence of length n using - specified function sfunction(n,**kwds). - - Parameters - ---------- - n : int - Length of degree sequence = number of nodes - sfunction: function - Function which returns a list of n real or integer values. - Called as "sfunction(n,**kwds)". - max_tries: int - Max number of attempts at creating valid degree sequence. - - Notes - ----- - Repeatedly create a degree sequence by calling sfunction(n,**kwds) - until achieving a valid degree sequence. If unsuccessful after - max_tries attempts, raise an exception. - - For examples of sfunctions that return sequences of random numbers, - see networkx.Utils. - - Examples - -------- - >>> from networkx.utils import uniform_sequence, create_degree_sequence - >>> seq=create_degree_sequence(10,uniform_sequence) - """ - tries=0 - max_deg=n - while tries < max_tries: - trialseq=sfunction(n,**kwds) - # round to integer values in the range [0,max_deg] - seq=[min(max_deg, max( int(round(s)),0 )) for s in trialseq] - # if graphical return, else throw away and try again - if nx.is_valid_degree_sequence(seq): - return seq - tries+=1 - raise nx.NetworkXError(\ - "Exceeded max (%d) attempts at a valid sequence."%max_tries) - - -# The same helpers for choosing random sequences from distributions -# uses Python's random module -# http://www.python.org/doc/current/lib/module-random.html - -def pareto_sequence(n,exponent=1.0): - """ - Return sample sequence of length n from a Pareto distribution. - """ - return [random.paretovariate(exponent) for i in range(n)] - - -def powerlaw_sequence(n,exponent=2.0): - """ - Return sample sequence of length n from a power law distribution. - """ - return [random.paretovariate(exponent-1) for i in range(n)] - -def zipf_rv(alpha, xmin=1, seed=None): - r"""Return a random value chosen from the Zipf distribution. - - The return value is an integer drawn from the probability distribution - ::math:: - - p(x)=\frac{x^{-\alpha}}{\zeta(\alpha,x_{min})}, - - where `\zeta(\alpha,x_{min})` is the Hurwitz zeta function. - - Parameters - ---------- - alpha : float - Exponent value of the distribution - xmin : int - Minimum value - seed : int - Seed value for random number generator - - Returns - ------- - x : int - Random value from Zipf distribution - - Raises - ------ - ValueError: - If xmin < 1 or - If alpha <= 1 - - Notes - ----- - The rejection algorithm generates random values for a the power-law - distribution in uniformly bounded expected time dependent on - parameters. See [1] for details on its operation. - - Examples - -------- - >>> nx.zipf_rv(alpha=2, xmin=3, seed=42) # doctest: +SKIP - - References - ---------- - ..[1] Luc Devroye, Non-Uniform Random Variate Generation, - Springer-Verlag, New York, 1986. - """ - if xmin < 1: - raise ValueError("xmin < 1") - if alpha <= 1: - raise ValueError("a <= 1.0") - if not seed is None: - random.seed(seed) - a1 = alpha - 1.0 - b = 2**a1 - while True: - u = 1.0 - random.random() # u in (0,1] - v = random.random() # v in [0,1) - x = int(xmin*u**-(1.0/a1)) - t = (1.0+(1.0/x))**a1 - if v*x*(t-1.0)/(b-1.0) <= t/b: - break - return x - -def zipf_sequence(n, alpha=2.0, xmin=1): - """Return a sample sequence of length n from a Zipf distribution with - exponent parameter alpha and minimum value xmin. - - See Also - -------- - zipf_rv - """ - return [ zipf_rv(alpha,xmin) for _ in range(n)] - -def uniform_sequence(n): - """ - Return sample sequence of length n from a uniform distribution. - """ - return [ random.uniform(0,n) for i in range(n)] - - -def cumulative_distribution(distribution): - """Return normalized cumulative distribution from discrete distribution.""" - - cdf=[] - cdf.append(0.0) - psum=float(sum(distribution)) - for i in range(0,len(distribution)): - cdf.append(cdf[i]+distribution[i]/psum) - return cdf - - -def discrete_sequence(n, distribution=None, cdistribution=None): - """ - Return sample sequence of length n from a given discrete distribution - or discrete cumulative distribution. - - One of the following must be specified. - - distribution = histogram of values, will be normalized - - cdistribution = normalized discrete cumulative distribution - - """ - import bisect - - if cdistribution is not None: - cdf=cdistribution - elif distribution is not None: - cdf=cumulative_distribution(distribution) - else: - raise nx.NetworkXError( - "discrete_sequence: distribution or cdistribution missing") - - - # get a uniform random number - inputseq=[random.random() for i in range(n)] - - # choose from CDF - seq=[bisect.bisect_left(cdf,s)-1 for s in inputseq] - return seq - - -def random_weighted_sample(mapping, k): - """Return k items without replacement from a weighted sample. - - The input is a dictionary of items with weights as values. - """ - if k > len(mapping): - raise ValueError("sample larger than population") - sample = set() - while len(sample) < k: - sample.add(weighted_choice(mapping)) - return list(sample) - -def weighted_choice(mapping): - """Return a single element from a weighted sample. - - The input is a dictionary of items with weights as values. - """ - # use roulette method - rnd = random.random() * sum(mapping.values()) - for k, w in mapping.items(): - rnd -= w - if rnd < 0: - return k - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/rcm.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/rcm.py deleted file mode 100644 index b21bd9b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/rcm.py +++ /dev/null @@ -1,150 +0,0 @@ -""" -Cuthill-McKee ordering of graph nodes to produce sparse matrices -""" -# Copyright (C) 2011 by -# Aric Hagberg <hagberg@lanl.gov> -# All rights reserved. -# BSD license. -from operator import itemgetter -import networkx as nx -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['cuthill_mckee_ordering', - 'reverse_cuthill_mckee_ordering'] - -def cuthill_mckee_ordering(G, start=None): - """Generate an ordering (permutation) of the graph nodes to make - a sparse matrix. - - Uses the Cuthill-McKee heuristic (based on breadth-first search) [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - start : node, optional - Start algorithm and specified node. The node should be on the - periphery of the graph for best results. - - Returns - ------- - nodes : generator - Generator of nodes in Cuthill-McKee ordering. - - Examples - -------- - >>> from networkx.utils import cuthill_mckee_ordering - >>> G = nx.path_graph(4) - >>> rcm = list(cuthill_mckee_ordering(G)) - >>> A = nx.adjacency_matrix(G, nodelist=rcm) # doctest: +SKIP - - See Also - -------- - reverse_cuthill_mckee_ordering - - Notes - ----- - The optimal solution the the bandwidth reduction is NP-complete [2]_. - - References - ---------- - .. [1] E. Cuthill and J. McKee. - Reducing the bandwidth of sparse symmetric matrices, - In Proc. 24th Nat. Conf. ACM, pages 157-172, 1969. - http://doi.acm.org/10.1145/800195.805928 - .. [2] Steven S. Skiena. 1997. The Algorithm Design Manual. - Springer-Verlag New York, Inc., New York, NY, USA. - """ - for c in nx.connected_components(G): - for n in connected_cuthill_mckee_ordering(G.subgraph(c), start): - yield n - -def reverse_cuthill_mckee_ordering(G, start=None): - """Generate an ordering (permutation) of the graph nodes to make - a sparse matrix. - - Uses the reverse Cuthill-McKee heuristic (based on breadth-first search) - [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - start : node, optional - Start algorithm and specified node. The node should be on the - periphery of the graph for best results. - - Returns - ------- - nodes : generator - Generator of nodes in reverse Cuthill-McKee ordering. - - Examples - -------- - >>> from networkx.utils import reverse_cuthill_mckee_ordering - >>> G = nx.path_graph(4) - >>> rcm = list(reverse_cuthill_mckee_ordering(G)) - >>> A = nx.adjacency_matrix(G, nodelist=rcm) # doctest: +SKIP - - See Also - -------- - cuthill_mckee_ordering - - Notes - ----- - The optimal solution the the bandwidth reduction is NP-complete [2]_. - - References - ---------- - .. [1] E. Cuthill and J. McKee. - Reducing the bandwidth of sparse symmetric matrices, - In Proc. 24th Nat. Conf. ACM, pages 157-72, 1969. - http://doi.acm.org/10.1145/800195.805928 - .. [2] Steven S. Skiena. 1997. The Algorithm Design Manual. - Springer-Verlag New York, Inc., New York, NY, USA. - """ - return reversed(list(cuthill_mckee_ordering(G, start=start))) - -def connected_cuthill_mckee_ordering(G, start=None): - # the cuthill mckee algorithm for connected graphs - if start is None: - (_, start) = find_pseudo_peripheral_node_pair(G) - yield start - visited = set([start]) - stack = [(start, iter(G[start]))] - while stack: - parent,children = stack[0] - if parent not in visited: - yield parent - try: - child = next(children) - if child not in visited: - yield child - visited.add(child) - # add children to stack, sorted by degree (lowest first) - nd = sorted(G.degree(G[child]).items(), key=itemgetter(1)) - children = (n for n,d in nd) - stack.append((child,children)) - except StopIteration: - stack.pop(0) - -def find_pseudo_peripheral_node_pair(G, start=None): - # helper for cuthill-mckee to find a "pseudo peripheral pair" - # to use as good starting node - if start is None: - u = next(G.nodes_iter()) - else: - u = start - lp = 0 - v = u - while True: - spl = nx.shortest_path_length(G, v) - l = max(spl.values()) - if l <= lp: - break - lp = l - farthest = [n for n,dist in spl.items() if dist==l] - v, deg = sorted(G.degree(farthest).items(), key=itemgetter(1))[0] - return u, v - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_decorators.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_decorators.py deleted file mode 100644 index 964b2c9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_decorators.py +++ /dev/null @@ -1,160 +0,0 @@ -import tempfile -import os - -from nose.tools import * - -import networkx as nx -from networkx.utils.decorators import open_file,require,not_implemented_for - -def test_not_implemented_decorator(): - @not_implemented_for('directed') - def test1(G): - pass - test1(nx.Graph()) - -@raises(KeyError) -def test_not_implemented_decorator_key(): - @not_implemented_for('foo') - def test1(G): - pass - test1(nx.Graph()) - -@raises(nx.NetworkXNotImplemented) -def test_not_implemented_decorator_raise(): - @not_implemented_for('graph') - def test1(G): - pass - test1(nx.Graph()) - - -def test_require_decorator1(): - @require('os','sys') - def test1(): - import os - import sys - test1() - -def test_require_decorator2(): - @require('blahhh') - def test2(): - import blahhh - assert_raises(nx.NetworkXError, test2) - -class TestOpenFileDecorator(object): - def setUp(self): - self.text = ['Blah... ', 'BLAH ', 'BLAH!!!!'] - self.fobj = tempfile.NamedTemporaryFile('wb+', delete=False) - self.name = self.fobj.name - - def write(self, path): - for text in self.text: - path.write(text.encode('ascii')) - - @open_file(1, 'r') - def read(self, path): - return path.readlines()[0] - - @staticmethod - @open_file(0, 'wb') - def writer_arg0(path): - path.write('demo'.encode('ascii')) - - @open_file(1, 'wb+') - def writer_arg1(self, path): - self.write(path) - - @open_file(2, 'wb') - def writer_arg2default(self, x, path=None): - if path is None: - fh = tempfile.NamedTemporaryFile('wb+', delete=False) - close_fh = True - else: - fh = path - close_fh = False - - try: - self.write(fh) - finally: - if close_fh: - fh.close() - - @open_file(4, 'wb') - def writer_arg4default(self, x, y, other='hello', path=None, **kwargs): - if path is None: - fh = tempfile.NamedTemporaryFile('wb+', delete=False) - close_fh = True - else: - fh = path - close_fh = False - - try: - self.write(fh) - finally: - if close_fh: - fh.close() - - @open_file('path', 'wb') - def writer_kwarg(self, **kwargs): - path = kwargs.get('path', None) - if path is None: - fh = tempfile.NamedTemporaryFile('wb+', delete=False) - close_fh = True - else: - fh = path - close_fh = False - - try: - self.write(fh) - finally: - if close_fh: - fh.close() - - def test_writer_arg0_str(self): - self.writer_arg0(self.name) - - def test_writer_arg0_fobj(self): - self.writer_arg0(self.fobj) - - def test_writer_arg1_str(self): - self.writer_arg1(self.name) - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_arg1_fobj(self): - self.writer_arg1(self.fobj) - assert_false(self.fobj.closed) - self.fobj.close() - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_arg2default_str(self): - self.writer_arg2default(0, path=None) - self.writer_arg2default(0, path=self.name) - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_arg2default_fobj(self): - self.writer_arg2default(0, path=self.fobj) - assert_false(self.fobj.closed) - self.fobj.close() - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_arg2default_fobj(self): - self.writer_arg2default(0, path=None) - - def test_writer_arg4default_fobj(self): - self.writer_arg4default(0, 1, dog='dog', other='other2') - self.writer_arg4default(0, 1, dog='dog', other='other2', path=self.name) - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_kwarg_str(self): - self.writer_kwarg(path=self.name) - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_kwarg_fobj(self): - self.writer_kwarg(path=self.fobj) - self.fobj.close() - assert_equal( self.read(self.name), ''.join(self.text) ) - - def test_writer_kwarg_fobj(self): - self.writer_kwarg(path=None) - - def tearDown(self): - self.fobj.close() diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_misc.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_misc.py deleted file mode 100644 index 77b8196..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_misc.py +++ /dev/null @@ -1,72 +0,0 @@ -from nose.tools import * -from nose import SkipTest -import networkx as nx -from networkx.utils import * - -def test_is_string_like(): - assert_true(is_string_like("aaaa")) - assert_false(is_string_like(None)) - assert_false(is_string_like(123)) - -def test_iterable(): - assert_false(iterable(None)) - assert_false(iterable(10)) - assert_true(iterable([1,2,3])) - assert_true(iterable((1,2,3))) - assert_true(iterable({1:"A",2:"X"})) - assert_true(iterable("ABC")) - -def test_graph_iterable(): - K=nx.complete_graph(10) - assert_true(iterable(K)) - assert_true(iterable(K.nodes_iter())) - assert_true(iterable(K.edges_iter())) - -def test_is_list_of_ints(): - assert_true(is_list_of_ints([1,2,3,42])) - assert_false(is_list_of_ints([1,2,3,"kermit"])) - -def test_random_number_distribution(): - # smoke test only - z=uniform_sequence(20) - z=powerlaw_sequence(20,exponent=2.5) - z=pareto_sequence(20,exponent=1.5) - z=discrete_sequence(20,distribution=[0,0,0,0,1,1,1,1,2,2,3]) - -class TestNumpyArray(object): - numpy=1 # nosetests attribute, use nosetests -a 'not numpy' to skip test - @classmethod - def setupClass(cls): - global numpy - global assert_equal - global assert_almost_equal - try: - import numpy - from numpy.testing import assert_equal,assert_almost_equal - except ImportError: - raise SkipTest('NumPy not available.') - - def test_dict_to_numpy_array1(self): - d = {'a':1,'b':2} - a = dict_to_numpy_array1(d) - assert_equal(a, numpy.array([1,2])) - a = dict_to_numpy_array1(d, mapping = {'b':0,'a':1}) - assert_equal(a, numpy.array([2,1])) - - def test_dict_to_numpy_array2(self): - d = {'a': {'a':1,'b':2}, - 'b': {'a':10,'b':20}} - a = dict_to_numpy_array(d) - assert_equal(a, numpy.array([[1,2],[10,20]])) - a = dict_to_numpy_array2(d, mapping = {'b':0,'a':1}) - assert_equal(a, numpy.array([[20,10],[2,1]])) - - - def test_dict_to_numpy_array(self): - d = {'a': {'a':1,'b':2}, - 'b': {'a':10,'b':20}} - a = dict_to_numpy_array(d) - assert_equal(a, numpy.array([[1,2],[10,20]])) - d = {'a':1,'b':2} - a = dict_to_numpy_array1(d) - assert_equal(a, numpy.array([1,2])) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_random_sequence.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_random_sequence.py deleted file mode 100644 index 0c3634a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_random_sequence.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python -from nose.tools import * -from networkx.utils import uniform_sequence,powerlaw_sequence,\ - create_degree_sequence,zipf_rv,zipf_sequence,random_weighted_sample,\ - weighted_choice -import networkx.utils - -def test_degree_sequences(): - seq=create_degree_sequence(10,uniform_sequence) - assert_equal(len(seq), 10) - seq=create_degree_sequence(10,powerlaw_sequence) - assert_equal(len(seq), 10) - -def test_zipf_rv(): - r = zipf_rv(2.3) - assert_true(type(r),int) - assert_raises(ValueError,zipf_rv,0.5) - assert_raises(ValueError,zipf_rv,2,xmin=0) - -def test_zipf_sequence(): - s = zipf_sequence(10) - assert_equal(len(s),10) - -def test_random_weighted_sample(): - mapping={'a':10,'b':20} - s = random_weighted_sample(mapping,2) - assert_equal(sorted(s),sorted(mapping.keys())) - assert_raises(ValueError,random_weighted_sample,mapping,3) - -def test_random_weighted_choice(): - mapping={'a':10,'b':0} - c = weighted_choice(mapping) - assert_equal(c,'a') diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_rcm.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_rcm.py deleted file mode 100644 index f267586..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/tests/test_rcm.py +++ /dev/null @@ -1,13 +0,0 @@ -from nose.tools import * -from networkx.utils import reverse_cuthill_mckee_ordering -import networkx as nx - -def test_reverse_cuthill_mckee(): - # example graph from - # http://www.boost.org/doc/libs/1_37_0/libs/graph/example/cuthill_mckee_ordering.cpp - G = nx.Graph([(0,3),(0,5),(1,2),(1,4),(1,6),(1,9),(2,3), - (2,4),(3,5),(3,8),(4,6),(5,6),(5,7),(6,7)]) - rcm = list(reverse_cuthill_mckee_ordering(G,start=0)) - assert_equal(rcm,[9, 1, 4, 6, 7, 2, 8, 5, 3, 0]) - rcm = list(reverse_cuthill_mckee_ordering(G)) - assert_equal(rcm,[0, 8, 5, 7, 3, 6, 4, 2, 1, 9]) diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/utils/union_find.py b/lib/python2.7/site-packages/setoolsgui/networkx/utils/union_find.py deleted file mode 100644 index d05dd92..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/utils/union_find.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Union-find data structure. -""" -# Copyright (C) 2004-2011 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx - -class UnionFind: - """Union-find data structure. - - Each unionFind instance X maintains a family of disjoint sets of - hashable objects, supporting the following two methods: - - - X[item] returns a name for the set containing the given item. - Each set is named by an arbitrarily-chosen one of its members; as - long as the set remains unchanged it will keep the same name. If - the item is not yet part of a set in X, a new singleton set is - created for it. - - - X.union(item1, item2, ...) merges the sets containing each item - into a single larger set. If any item is not yet part of a set - in X, it is added to X as one of the members of the merged set. - - Union-find data structure. Based on Josiah Carlson's code, - http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/215912 - with significant additional changes by D. Eppstein. - http://www.ics.uci.edu/~eppstein/PADS/UnionFind.py - - """ - - def __init__(self): - """Create a new empty union-find structure.""" - self.weights = {} - self.parents = {} - - def __getitem__(self, object): - """Find and return the name of the set containing the object.""" - - # check for previously unknown object - if object not in self.parents: - self.parents[object] = object - self.weights[object] = 1 - return object - - # find path of objects leading to the root - path = [object] - root = self.parents[object] - while root != path[-1]: - path.append(root) - root = self.parents[root] - - # compress the path and return - for ancestor in path: - self.parents[ancestor] = root - return root - - def __iter__(self): - """Iterate through all items ever found or unioned by this structure.""" - return iter(self.parents) - - def union(self, *objects): - """Find the sets containing the objects and merge them all.""" - roots = [self[x] for x in objects] - heaviest = max([(self.weights[r],r) for r in roots])[1] - for r in roots: - if r != heaviest: - self.weights[heaviest] += self.weights[r] - self.parents[r] = heaviest - - - diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/version.py b/lib/python2.7/site-packages/setoolsgui/networkx/version.py deleted file mode 100644 index 7369f8b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/networkx/version.py +++ /dev/null @@ -1,25 +0,0 @@ -""" -Version information for NetworkX, created during installation. - -Do not add this file to the repository. - -""" - -import datetime - -version = '1.8.1' -date = 'Sun Aug 4 07:56:54 2013' - -# Was NetworkX built from a development version? If so, remember that the major -# and minor versions reference the "target" (rather than "current") release. -dev = False - -# Format: (name, major, min, revision) -version_info = ('networkx', '1', '8.1', None) - -# Format: a 'datetime.datetime' instance -date_info = datetime.datetime(2013, 8, 4, 7, 56, 54, 416491) - -# Format: (vcs, vcs_tuple) -vcs_info = (None, (None, None)) - diff --git a/lib/python2.7/site-packages/setoolsgui/selinux/__init__.py b/lib/python2.7/site-packages/setoolsgui/selinux/__init__.py deleted file mode 100644 index b81b031..0000000 --- a/lib/python2.7/site-packages/setoolsgui/selinux/__init__.py +++ /dev/null @@ -1,2445 +0,0 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 2.0.11 -# -# Do not make changes to this file unless you know what you are doing--modify -# the SWIG interface file instead. - - - - - -from sys import version_info -if version_info >= (2,6,0): - def swig_import_helper(): - from os.path import dirname - import imp - fp = None - try: - fp, pathname, description = imp.find_module('_selinux', [dirname(__file__)]) - except ImportError: - import _selinux - return _selinux - if fp is not None: - try: - _mod = imp.load_module('_selinux', fp, pathname, description) - finally: - fp.close() - return _mod - _selinux = swig_import_helper() - del swig_import_helper -else: - import _selinux -del version_info -try: - _swig_property = property -except NameError: - pass # Python < 2.2 doesn't have 'property'. -def _swig_setattr_nondynamic(self,class_type,name,value,static=1): - if (name == "thisown"): return self.this.own(value) - if (name == "this"): - if type(value).__name__ == 'SwigPyObject': - self.__dict__[name] = value - return - method = class_type.__swig_setmethods__.get(name,None) - if method: return method(self,value) - if (not static): - self.__dict__[name] = value - else: - raise AttributeError("You cannot add attributes to %s" % self) - -def _swig_setattr(self,class_type,name,value): - return _swig_setattr_nondynamic(self,class_type,name,value,0) - -def _swig_getattr(self,class_type,name): - if (name == "thisown"): return self.this.own() - method = class_type.__swig_getmethods__.get(name,None) - if method: return method(self) - raise AttributeError(name) - -def _swig_repr(self): - try: strthis = "proxy of " + self.this.__repr__() - except: strthis = "" - return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) - -try: - _object = object - _newclass = 1 -except AttributeError: - class _object : pass - _newclass = 0 - - -import shutil, os, stat - -DISABLED = -1 -PERMISSIVE = 0 -ENFORCING = 1 - -def restorecon(path, recursive=False): - """ Restore SELinux context on a given path """ - - try: - mode = os.lstat(path)[stat.ST_MODE] - status, context = matchpathcon(path, mode) - except OSError: - path = os.path.realpath(os.path.expanduser(path)) - mode = os.lstat(path)[stat.ST_MODE] - status, context = matchpathcon(path, mode) - - if status == 0: - status, oldcontext = lgetfilecon(path) - if context != oldcontext: - lsetfilecon(path, context) - - if recursive: - for root, dirs, files in os.walk(path): - for name in files + dirs: - restorecon(os.path.join(root, name)) - -def chcon(path, context, recursive=False): - """ Set the SELinux context on a given path """ - lsetfilecon(path, context) - if recursive: - for root, dirs, files in os.walk(path): - for name in files + dirs: - lsetfilecon(os.path.join(root,name), context) - -def copytree(src, dest): - """ An SELinux-friendly shutil.copytree method """ - shutil.copytree(src, dest) - restorecon(dest, recursive=True) - -def install(src, dest): - """ An SELinux-friendly shutil.move method """ - shutil.move(src, dest) - restorecon(dest, recursive=True) - -class security_id(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, security_id, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, security_id, name) - __repr__ = _swig_repr - __swig_setmethods__["ctx"] = _selinux.security_id_ctx_set - __swig_getmethods__["ctx"] = _selinux.security_id_ctx_get - if _newclass:ctx = _swig_property(_selinux.security_id_ctx_get, _selinux.security_id_ctx_set) - __swig_setmethods__["refcnt"] = _selinux.security_id_refcnt_set - __swig_getmethods__["refcnt"] = _selinux.security_id_refcnt_get - if _newclass:refcnt = _swig_property(_selinux.security_id_refcnt_get, _selinux.security_id_refcnt_set) - def __init__(self): - this = _selinux.new_security_id() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_security_id - __del__ = lambda self : None; -security_id_swigregister = _selinux.security_id_swigregister -security_id_swigregister(security_id) - - -def avc_sid_to_context(*args): - return _selinux.avc_sid_to_context(*args) -avc_sid_to_context = _selinux.avc_sid_to_context - -def avc_sid_to_context_raw(*args): - return _selinux.avc_sid_to_context_raw(*args) -avc_sid_to_context_raw = _selinux.avc_sid_to_context_raw - -def avc_context_to_sid(*args): - return _selinux.avc_context_to_sid(*args) -avc_context_to_sid = _selinux.avc_context_to_sid - -def avc_context_to_sid_raw(*args): - return _selinux.avc_context_to_sid_raw(*args) -avc_context_to_sid_raw = _selinux.avc_context_to_sid_raw - -def sidget(*args): - return _selinux.sidget(*args) -sidget = _selinux.sidget - -def sidput(*args): - return _selinux.sidput(*args) -sidput = _selinux.sidput - -def avc_get_initial_sid(*args): - return _selinux.avc_get_initial_sid(*args) -avc_get_initial_sid = _selinux.avc_get_initial_sid -class avc_entry_ref(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, avc_entry_ref, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, avc_entry_ref, name) - __repr__ = _swig_repr - __swig_setmethods__["ae"] = _selinux.avc_entry_ref_ae_set - __swig_getmethods__["ae"] = _selinux.avc_entry_ref_ae_get - if _newclass:ae = _swig_property(_selinux.avc_entry_ref_ae_get, _selinux.avc_entry_ref_ae_set) - def __init__(self): - this = _selinux.new_avc_entry_ref() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_avc_entry_ref - __del__ = lambda self : None; -avc_entry_ref_swigregister = _selinux.avc_entry_ref_swigregister -avc_entry_ref_swigregister(avc_entry_ref) - -class avc_memory_callback(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, avc_memory_callback, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, avc_memory_callback, name) - __repr__ = _swig_repr - __swig_setmethods__["func_malloc"] = _selinux.avc_memory_callback_func_malloc_set - __swig_getmethods__["func_malloc"] = _selinux.avc_memory_callback_func_malloc_get - if _newclass:func_malloc = _swig_property(_selinux.avc_memory_callback_func_malloc_get, _selinux.avc_memory_callback_func_malloc_set) - __swig_setmethods__["func_free"] = _selinux.avc_memory_callback_func_free_set - __swig_getmethods__["func_free"] = _selinux.avc_memory_callback_func_free_get - if _newclass:func_free = _swig_property(_selinux.avc_memory_callback_func_free_get, _selinux.avc_memory_callback_func_free_set) - def __init__(self): - this = _selinux.new_avc_memory_callback() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_avc_memory_callback - __del__ = lambda self : None; -avc_memory_callback_swigregister = _selinux.avc_memory_callback_swigregister -avc_memory_callback_swigregister(avc_memory_callback) - -class avc_log_callback(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, avc_log_callback, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, avc_log_callback, name) - __repr__ = _swig_repr - __swig_setmethods__["func_log"] = _selinux.avc_log_callback_func_log_set - __swig_getmethods__["func_log"] = _selinux.avc_log_callback_func_log_get - if _newclass:func_log = _swig_property(_selinux.avc_log_callback_func_log_get, _selinux.avc_log_callback_func_log_set) - __swig_setmethods__["func_audit"] = _selinux.avc_log_callback_func_audit_set - __swig_getmethods__["func_audit"] = _selinux.avc_log_callback_func_audit_get - if _newclass:func_audit = _swig_property(_selinux.avc_log_callback_func_audit_get, _selinux.avc_log_callback_func_audit_set) - def __init__(self): - this = _selinux.new_avc_log_callback() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_avc_log_callback - __del__ = lambda self : None; -avc_log_callback_swigregister = _selinux.avc_log_callback_swigregister -avc_log_callback_swigregister(avc_log_callback) - -class avc_thread_callback(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, avc_thread_callback, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, avc_thread_callback, name) - __repr__ = _swig_repr - __swig_setmethods__["func_create_thread"] = _selinux.avc_thread_callback_func_create_thread_set - __swig_getmethods__["func_create_thread"] = _selinux.avc_thread_callback_func_create_thread_get - if _newclass:func_create_thread = _swig_property(_selinux.avc_thread_callback_func_create_thread_get, _selinux.avc_thread_callback_func_create_thread_set) - __swig_setmethods__["func_stop_thread"] = _selinux.avc_thread_callback_func_stop_thread_set - __swig_getmethods__["func_stop_thread"] = _selinux.avc_thread_callback_func_stop_thread_get - if _newclass:func_stop_thread = _swig_property(_selinux.avc_thread_callback_func_stop_thread_get, _selinux.avc_thread_callback_func_stop_thread_set) - def __init__(self): - this = _selinux.new_avc_thread_callback() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_avc_thread_callback - __del__ = lambda self : None; -avc_thread_callback_swigregister = _selinux.avc_thread_callback_swigregister -avc_thread_callback_swigregister(avc_thread_callback) - -class avc_lock_callback(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, avc_lock_callback, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, avc_lock_callback, name) - __repr__ = _swig_repr - __swig_setmethods__["func_alloc_lock"] = _selinux.avc_lock_callback_func_alloc_lock_set - __swig_getmethods__["func_alloc_lock"] = _selinux.avc_lock_callback_func_alloc_lock_get - if _newclass:func_alloc_lock = _swig_property(_selinux.avc_lock_callback_func_alloc_lock_get, _selinux.avc_lock_callback_func_alloc_lock_set) - __swig_setmethods__["func_get_lock"] = _selinux.avc_lock_callback_func_get_lock_set - __swig_getmethods__["func_get_lock"] = _selinux.avc_lock_callback_func_get_lock_get - if _newclass:func_get_lock = _swig_property(_selinux.avc_lock_callback_func_get_lock_get, _selinux.avc_lock_callback_func_get_lock_set) - __swig_setmethods__["func_release_lock"] = _selinux.avc_lock_callback_func_release_lock_set - __swig_getmethods__["func_release_lock"] = _selinux.avc_lock_callback_func_release_lock_get - if _newclass:func_release_lock = _swig_property(_selinux.avc_lock_callback_func_release_lock_get, _selinux.avc_lock_callback_func_release_lock_set) - __swig_setmethods__["func_free_lock"] = _selinux.avc_lock_callback_func_free_lock_set - __swig_getmethods__["func_free_lock"] = _selinux.avc_lock_callback_func_free_lock_get - if _newclass:func_free_lock = _swig_property(_selinux.avc_lock_callback_func_free_lock_get, _selinux.avc_lock_callback_func_free_lock_set) - def __init__(self): - this = _selinux.new_avc_lock_callback() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_avc_lock_callback - __del__ = lambda self : None; -avc_lock_callback_swigregister = _selinux.avc_lock_callback_swigregister -avc_lock_callback_swigregister(avc_lock_callback) - -AVC_OPT_UNUSED = _selinux.AVC_OPT_UNUSED -AVC_OPT_SETENFORCE = _selinux.AVC_OPT_SETENFORCE - -def avc_init(*args): - return _selinux.avc_init(*args) -avc_init = _selinux.avc_init - -def avc_open(*args): - return _selinux.avc_open(*args) -avc_open = _selinux.avc_open - -def avc_cleanup(): - return _selinux.avc_cleanup() -avc_cleanup = _selinux.avc_cleanup - -def avc_reset(): - return _selinux.avc_reset() -avc_reset = _selinux.avc_reset - -def avc_destroy(): - return _selinux.avc_destroy() -avc_destroy = _selinux.avc_destroy - -def avc_has_perm_noaudit(*args): - return _selinux.avc_has_perm_noaudit(*args) -avc_has_perm_noaudit = _selinux.avc_has_perm_noaudit - -def avc_has_perm(*args): - return _selinux.avc_has_perm(*args) -avc_has_perm = _selinux.avc_has_perm - -def avc_audit(*args): - return _selinux.avc_audit(*args) -avc_audit = _selinux.avc_audit - -def avc_compute_create(*args): - return _selinux.avc_compute_create(*args) -avc_compute_create = _selinux.avc_compute_create - -def avc_compute_member(*args): - return _selinux.avc_compute_member(*args) -avc_compute_member = _selinux.avc_compute_member -AVC_CALLBACK_GRANT = _selinux.AVC_CALLBACK_GRANT -AVC_CALLBACK_TRY_REVOKE = _selinux.AVC_CALLBACK_TRY_REVOKE -AVC_CALLBACK_REVOKE = _selinux.AVC_CALLBACK_REVOKE -AVC_CALLBACK_RESET = _selinux.AVC_CALLBACK_RESET -AVC_CALLBACK_AUDITALLOW_ENABLE = _selinux.AVC_CALLBACK_AUDITALLOW_ENABLE -AVC_CALLBACK_AUDITALLOW_DISABLE = _selinux.AVC_CALLBACK_AUDITALLOW_DISABLE -AVC_CALLBACK_AUDITDENY_ENABLE = _selinux.AVC_CALLBACK_AUDITDENY_ENABLE -AVC_CALLBACK_AUDITDENY_DISABLE = _selinux.AVC_CALLBACK_AUDITDENY_DISABLE -AVC_CACHE_STATS = _selinux.AVC_CACHE_STATS -class avc_cache_stats(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, avc_cache_stats, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, avc_cache_stats, name) - __repr__ = _swig_repr - __swig_setmethods__["entry_lookups"] = _selinux.avc_cache_stats_entry_lookups_set - __swig_getmethods__["entry_lookups"] = _selinux.avc_cache_stats_entry_lookups_get - if _newclass:entry_lookups = _swig_property(_selinux.avc_cache_stats_entry_lookups_get, _selinux.avc_cache_stats_entry_lookups_set) - __swig_setmethods__["entry_hits"] = _selinux.avc_cache_stats_entry_hits_set - __swig_getmethods__["entry_hits"] = _selinux.avc_cache_stats_entry_hits_get - if _newclass:entry_hits = _swig_property(_selinux.avc_cache_stats_entry_hits_get, _selinux.avc_cache_stats_entry_hits_set) - __swig_setmethods__["entry_misses"] = _selinux.avc_cache_stats_entry_misses_set - __swig_getmethods__["entry_misses"] = _selinux.avc_cache_stats_entry_misses_get - if _newclass:entry_misses = _swig_property(_selinux.avc_cache_stats_entry_misses_get, _selinux.avc_cache_stats_entry_misses_set) - __swig_setmethods__["entry_discards"] = _selinux.avc_cache_stats_entry_discards_set - __swig_getmethods__["entry_discards"] = _selinux.avc_cache_stats_entry_discards_get - if _newclass:entry_discards = _swig_property(_selinux.avc_cache_stats_entry_discards_get, _selinux.avc_cache_stats_entry_discards_set) - __swig_setmethods__["cav_lookups"] = _selinux.avc_cache_stats_cav_lookups_set - __swig_getmethods__["cav_lookups"] = _selinux.avc_cache_stats_cav_lookups_get - if _newclass:cav_lookups = _swig_property(_selinux.avc_cache_stats_cav_lookups_get, _selinux.avc_cache_stats_cav_lookups_set) - __swig_setmethods__["cav_hits"] = _selinux.avc_cache_stats_cav_hits_set - __swig_getmethods__["cav_hits"] = _selinux.avc_cache_stats_cav_hits_get - if _newclass:cav_hits = _swig_property(_selinux.avc_cache_stats_cav_hits_get, _selinux.avc_cache_stats_cav_hits_set) - __swig_setmethods__["cav_probes"] = _selinux.avc_cache_stats_cav_probes_set - __swig_getmethods__["cav_probes"] = _selinux.avc_cache_stats_cav_probes_get - if _newclass:cav_probes = _swig_property(_selinux.avc_cache_stats_cav_probes_get, _selinux.avc_cache_stats_cav_probes_set) - __swig_setmethods__["cav_misses"] = _selinux.avc_cache_stats_cav_misses_set - __swig_getmethods__["cav_misses"] = _selinux.avc_cache_stats_cav_misses_get - if _newclass:cav_misses = _swig_property(_selinux.avc_cache_stats_cav_misses_get, _selinux.avc_cache_stats_cav_misses_set) - def __init__(self): - this = _selinux.new_avc_cache_stats() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_avc_cache_stats - __del__ = lambda self : None; -avc_cache_stats_swigregister = _selinux.avc_cache_stats_swigregister -avc_cache_stats_swigregister(avc_cache_stats) - - -def avc_av_stats(): - return _selinux.avc_av_stats() -avc_av_stats = _selinux.avc_av_stats - -def avc_sid_stats(): - return _selinux.avc_sid_stats() -avc_sid_stats = _selinux.avc_sid_stats - -def avc_netlink_open(*args): - return _selinux.avc_netlink_open(*args) -avc_netlink_open = _selinux.avc_netlink_open - -def avc_netlink_loop(): - return _selinux.avc_netlink_loop() -avc_netlink_loop = _selinux.avc_netlink_loop - -def avc_netlink_close(): - return _selinux.avc_netlink_close() -avc_netlink_close = _selinux.avc_netlink_close - -def selinux_status_open(*args): - return _selinux.selinux_status_open(*args) -selinux_status_open = _selinux.selinux_status_open - -def selinux_status_close(): - return _selinux.selinux_status_close() -selinux_status_close = _selinux.selinux_status_close - -def selinux_status_updated(): - return _selinux.selinux_status_updated() -selinux_status_updated = _selinux.selinux_status_updated - -def selinux_status_getenforce(): - return _selinux.selinux_status_getenforce() -selinux_status_getenforce = _selinux.selinux_status_getenforce - -def selinux_status_policyload(): - return _selinux.selinux_status_policyload() -selinux_status_policyload = _selinux.selinux_status_policyload - -def selinux_status_deny_unknown(): - return _selinux.selinux_status_deny_unknown() -selinux_status_deny_unknown = _selinux.selinux_status_deny_unknown -COMMON_FILE__IOCTL = _selinux.COMMON_FILE__IOCTL -COMMON_FILE__READ = _selinux.COMMON_FILE__READ -COMMON_FILE__WRITE = _selinux.COMMON_FILE__WRITE -COMMON_FILE__CREATE = _selinux.COMMON_FILE__CREATE -COMMON_FILE__GETATTR = _selinux.COMMON_FILE__GETATTR -COMMON_FILE__SETATTR = _selinux.COMMON_FILE__SETATTR -COMMON_FILE__LOCK = _selinux.COMMON_FILE__LOCK -COMMON_FILE__RELABELFROM = _selinux.COMMON_FILE__RELABELFROM -COMMON_FILE__RELABELTO = _selinux.COMMON_FILE__RELABELTO -COMMON_FILE__APPEND = _selinux.COMMON_FILE__APPEND -COMMON_FILE__UNLINK = _selinux.COMMON_FILE__UNLINK -COMMON_FILE__LINK = _selinux.COMMON_FILE__LINK -COMMON_FILE__RENAME = _selinux.COMMON_FILE__RENAME -COMMON_FILE__EXECUTE = _selinux.COMMON_FILE__EXECUTE -COMMON_FILE__SWAPON = _selinux.COMMON_FILE__SWAPON -COMMON_FILE__QUOTAON = _selinux.COMMON_FILE__QUOTAON -COMMON_FILE__MOUNTON = _selinux.COMMON_FILE__MOUNTON -COMMON_SOCKET__IOCTL = _selinux.COMMON_SOCKET__IOCTL -COMMON_SOCKET__READ = _selinux.COMMON_SOCKET__READ -COMMON_SOCKET__WRITE = _selinux.COMMON_SOCKET__WRITE -COMMON_SOCKET__CREATE = _selinux.COMMON_SOCKET__CREATE -COMMON_SOCKET__GETATTR = _selinux.COMMON_SOCKET__GETATTR -COMMON_SOCKET__SETATTR = _selinux.COMMON_SOCKET__SETATTR -COMMON_SOCKET__LOCK = _selinux.COMMON_SOCKET__LOCK -COMMON_SOCKET__RELABELFROM = _selinux.COMMON_SOCKET__RELABELFROM -COMMON_SOCKET__RELABELTO = _selinux.COMMON_SOCKET__RELABELTO -COMMON_SOCKET__APPEND = _selinux.COMMON_SOCKET__APPEND -COMMON_SOCKET__BIND = _selinux.COMMON_SOCKET__BIND -COMMON_SOCKET__CONNECT = _selinux.COMMON_SOCKET__CONNECT -COMMON_SOCKET__LISTEN = _selinux.COMMON_SOCKET__LISTEN -COMMON_SOCKET__ACCEPT = _selinux.COMMON_SOCKET__ACCEPT -COMMON_SOCKET__GETOPT = _selinux.COMMON_SOCKET__GETOPT -COMMON_SOCKET__SETOPT = _selinux.COMMON_SOCKET__SETOPT -COMMON_SOCKET__SHUTDOWN = _selinux.COMMON_SOCKET__SHUTDOWN -COMMON_SOCKET__RECVFROM = _selinux.COMMON_SOCKET__RECVFROM -COMMON_SOCKET__SENDTO = _selinux.COMMON_SOCKET__SENDTO -COMMON_SOCKET__RECV_MSG = _selinux.COMMON_SOCKET__RECV_MSG -COMMON_SOCKET__SEND_MSG = _selinux.COMMON_SOCKET__SEND_MSG -COMMON_SOCKET__NAME_BIND = _selinux.COMMON_SOCKET__NAME_BIND -COMMON_IPC__CREATE = _selinux.COMMON_IPC__CREATE -COMMON_IPC__DESTROY = _selinux.COMMON_IPC__DESTROY -COMMON_IPC__GETATTR = _selinux.COMMON_IPC__GETATTR -COMMON_IPC__SETATTR = _selinux.COMMON_IPC__SETATTR -COMMON_IPC__READ = _selinux.COMMON_IPC__READ -COMMON_IPC__WRITE = _selinux.COMMON_IPC__WRITE -COMMON_IPC__ASSOCIATE = _selinux.COMMON_IPC__ASSOCIATE -COMMON_IPC__UNIX_READ = _selinux.COMMON_IPC__UNIX_READ -COMMON_IPC__UNIX_WRITE = _selinux.COMMON_IPC__UNIX_WRITE -COMMON_DATABASE__CREATE = _selinux.COMMON_DATABASE__CREATE -COMMON_DATABASE__DROP = _selinux.COMMON_DATABASE__DROP -COMMON_DATABASE__GETATTR = _selinux.COMMON_DATABASE__GETATTR -COMMON_DATABASE__SETATTR = _selinux.COMMON_DATABASE__SETATTR -COMMON_DATABASE__RELABELFROM = _selinux.COMMON_DATABASE__RELABELFROM -COMMON_DATABASE__RELABELTO = _selinux.COMMON_DATABASE__RELABELTO -FILESYSTEM__MOUNT = _selinux.FILESYSTEM__MOUNT -FILESYSTEM__REMOUNT = _selinux.FILESYSTEM__REMOUNT -FILESYSTEM__UNMOUNT = _selinux.FILESYSTEM__UNMOUNT -FILESYSTEM__GETATTR = _selinux.FILESYSTEM__GETATTR -FILESYSTEM__RELABELFROM = _selinux.FILESYSTEM__RELABELFROM -FILESYSTEM__RELABELTO = _selinux.FILESYSTEM__RELABELTO -FILESYSTEM__TRANSITION = _selinux.FILESYSTEM__TRANSITION -FILESYSTEM__ASSOCIATE = _selinux.FILESYSTEM__ASSOCIATE -FILESYSTEM__QUOTAMOD = _selinux.FILESYSTEM__QUOTAMOD -FILESYSTEM__QUOTAGET = _selinux.FILESYSTEM__QUOTAGET -DIR__IOCTL = _selinux.DIR__IOCTL -DIR__READ = _selinux.DIR__READ -DIR__WRITE = _selinux.DIR__WRITE -DIR__CREATE = _selinux.DIR__CREATE -DIR__GETATTR = _selinux.DIR__GETATTR -DIR__SETATTR = _selinux.DIR__SETATTR -DIR__LOCK = _selinux.DIR__LOCK -DIR__RELABELFROM = _selinux.DIR__RELABELFROM -DIR__RELABELTO = _selinux.DIR__RELABELTO -DIR__APPEND = _selinux.DIR__APPEND -DIR__UNLINK = _selinux.DIR__UNLINK -DIR__LINK = _selinux.DIR__LINK -DIR__RENAME = _selinux.DIR__RENAME -DIR__EXECUTE = _selinux.DIR__EXECUTE -DIR__SWAPON = _selinux.DIR__SWAPON -DIR__QUOTAON = _selinux.DIR__QUOTAON -DIR__MOUNTON = _selinux.DIR__MOUNTON -DIR__ADD_NAME = _selinux.DIR__ADD_NAME -DIR__REMOVE_NAME = _selinux.DIR__REMOVE_NAME -DIR__REPARENT = _selinux.DIR__REPARENT -DIR__SEARCH = _selinux.DIR__SEARCH -DIR__RMDIR = _selinux.DIR__RMDIR -DIR__OPEN = _selinux.DIR__OPEN -FILE__IOCTL = _selinux.FILE__IOCTL -FILE__READ = _selinux.FILE__READ -FILE__WRITE = _selinux.FILE__WRITE -FILE__CREATE = _selinux.FILE__CREATE -FILE__GETATTR = _selinux.FILE__GETATTR -FILE__SETATTR = _selinux.FILE__SETATTR -FILE__LOCK = _selinux.FILE__LOCK -FILE__RELABELFROM = _selinux.FILE__RELABELFROM -FILE__RELABELTO = _selinux.FILE__RELABELTO -FILE__APPEND = _selinux.FILE__APPEND -FILE__UNLINK = _selinux.FILE__UNLINK -FILE__LINK = _selinux.FILE__LINK -FILE__RENAME = _selinux.FILE__RENAME -FILE__EXECUTE = _selinux.FILE__EXECUTE -FILE__SWAPON = _selinux.FILE__SWAPON -FILE__QUOTAON = _selinux.FILE__QUOTAON -FILE__MOUNTON = _selinux.FILE__MOUNTON -FILE__EXECUTE_NO_TRANS = _selinux.FILE__EXECUTE_NO_TRANS -FILE__ENTRYPOINT = _selinux.FILE__ENTRYPOINT -FILE__EXECMOD = _selinux.FILE__EXECMOD -FILE__OPEN = _selinux.FILE__OPEN -LNK_FILE__IOCTL = _selinux.LNK_FILE__IOCTL -LNK_FILE__READ = _selinux.LNK_FILE__READ -LNK_FILE__WRITE = _selinux.LNK_FILE__WRITE -LNK_FILE__CREATE = _selinux.LNK_FILE__CREATE -LNK_FILE__GETATTR = _selinux.LNK_FILE__GETATTR -LNK_FILE__SETATTR = _selinux.LNK_FILE__SETATTR -LNK_FILE__LOCK = _selinux.LNK_FILE__LOCK -LNK_FILE__RELABELFROM = _selinux.LNK_FILE__RELABELFROM -LNK_FILE__RELABELTO = _selinux.LNK_FILE__RELABELTO -LNK_FILE__APPEND = _selinux.LNK_FILE__APPEND -LNK_FILE__UNLINK = _selinux.LNK_FILE__UNLINK -LNK_FILE__LINK = _selinux.LNK_FILE__LINK -LNK_FILE__RENAME = _selinux.LNK_FILE__RENAME -LNK_FILE__EXECUTE = _selinux.LNK_FILE__EXECUTE -LNK_FILE__SWAPON = _selinux.LNK_FILE__SWAPON -LNK_FILE__QUOTAON = _selinux.LNK_FILE__QUOTAON -LNK_FILE__MOUNTON = _selinux.LNK_FILE__MOUNTON -CHR_FILE__IOCTL = _selinux.CHR_FILE__IOCTL -CHR_FILE__READ = _selinux.CHR_FILE__READ -CHR_FILE__WRITE = _selinux.CHR_FILE__WRITE -CHR_FILE__CREATE = _selinux.CHR_FILE__CREATE -CHR_FILE__GETATTR = _selinux.CHR_FILE__GETATTR -CHR_FILE__SETATTR = _selinux.CHR_FILE__SETATTR -CHR_FILE__LOCK = _selinux.CHR_FILE__LOCK -CHR_FILE__RELABELFROM = _selinux.CHR_FILE__RELABELFROM -CHR_FILE__RELABELTO = _selinux.CHR_FILE__RELABELTO -CHR_FILE__APPEND = _selinux.CHR_FILE__APPEND -CHR_FILE__UNLINK = _selinux.CHR_FILE__UNLINK -CHR_FILE__LINK = _selinux.CHR_FILE__LINK -CHR_FILE__RENAME = _selinux.CHR_FILE__RENAME -CHR_FILE__EXECUTE = _selinux.CHR_FILE__EXECUTE -CHR_FILE__SWAPON = _selinux.CHR_FILE__SWAPON -CHR_FILE__QUOTAON = _selinux.CHR_FILE__QUOTAON -CHR_FILE__MOUNTON = _selinux.CHR_FILE__MOUNTON -CHR_FILE__EXECUTE_NO_TRANS = _selinux.CHR_FILE__EXECUTE_NO_TRANS -CHR_FILE__ENTRYPOINT = _selinux.CHR_FILE__ENTRYPOINT -CHR_FILE__EXECMOD = _selinux.CHR_FILE__EXECMOD -CHR_FILE__OPEN = _selinux.CHR_FILE__OPEN -BLK_FILE__IOCTL = _selinux.BLK_FILE__IOCTL -BLK_FILE__READ = _selinux.BLK_FILE__READ -BLK_FILE__WRITE = _selinux.BLK_FILE__WRITE -BLK_FILE__CREATE = _selinux.BLK_FILE__CREATE -BLK_FILE__GETATTR = _selinux.BLK_FILE__GETATTR -BLK_FILE__SETATTR = _selinux.BLK_FILE__SETATTR -BLK_FILE__LOCK = _selinux.BLK_FILE__LOCK -BLK_FILE__RELABELFROM = _selinux.BLK_FILE__RELABELFROM -BLK_FILE__RELABELTO = _selinux.BLK_FILE__RELABELTO -BLK_FILE__APPEND = _selinux.BLK_FILE__APPEND -BLK_FILE__UNLINK = _selinux.BLK_FILE__UNLINK -BLK_FILE__LINK = _selinux.BLK_FILE__LINK -BLK_FILE__RENAME = _selinux.BLK_FILE__RENAME -BLK_FILE__EXECUTE = _selinux.BLK_FILE__EXECUTE -BLK_FILE__SWAPON = _selinux.BLK_FILE__SWAPON -BLK_FILE__QUOTAON = _selinux.BLK_FILE__QUOTAON -BLK_FILE__MOUNTON = _selinux.BLK_FILE__MOUNTON -BLK_FILE__OPEN = _selinux.BLK_FILE__OPEN -SOCK_FILE__IOCTL = _selinux.SOCK_FILE__IOCTL -SOCK_FILE__READ = _selinux.SOCK_FILE__READ -SOCK_FILE__WRITE = _selinux.SOCK_FILE__WRITE -SOCK_FILE__CREATE = _selinux.SOCK_FILE__CREATE -SOCK_FILE__GETATTR = _selinux.SOCK_FILE__GETATTR -SOCK_FILE__SETATTR = _selinux.SOCK_FILE__SETATTR -SOCK_FILE__LOCK = _selinux.SOCK_FILE__LOCK -SOCK_FILE__RELABELFROM = _selinux.SOCK_FILE__RELABELFROM -SOCK_FILE__RELABELTO = _selinux.SOCK_FILE__RELABELTO -SOCK_FILE__APPEND = _selinux.SOCK_FILE__APPEND -SOCK_FILE__UNLINK = _selinux.SOCK_FILE__UNLINK -SOCK_FILE__LINK = _selinux.SOCK_FILE__LINK -SOCK_FILE__RENAME = _selinux.SOCK_FILE__RENAME -SOCK_FILE__EXECUTE = _selinux.SOCK_FILE__EXECUTE -SOCK_FILE__SWAPON = _selinux.SOCK_FILE__SWAPON -SOCK_FILE__QUOTAON = _selinux.SOCK_FILE__QUOTAON -SOCK_FILE__MOUNTON = _selinux.SOCK_FILE__MOUNTON -FIFO_FILE__IOCTL = _selinux.FIFO_FILE__IOCTL -FIFO_FILE__READ = _selinux.FIFO_FILE__READ -FIFO_FILE__WRITE = _selinux.FIFO_FILE__WRITE -FIFO_FILE__CREATE = _selinux.FIFO_FILE__CREATE -FIFO_FILE__GETATTR = _selinux.FIFO_FILE__GETATTR -FIFO_FILE__SETATTR = _selinux.FIFO_FILE__SETATTR -FIFO_FILE__LOCK = _selinux.FIFO_FILE__LOCK -FIFO_FILE__RELABELFROM = _selinux.FIFO_FILE__RELABELFROM -FIFO_FILE__RELABELTO = _selinux.FIFO_FILE__RELABELTO -FIFO_FILE__APPEND = _selinux.FIFO_FILE__APPEND -FIFO_FILE__UNLINK = _selinux.FIFO_FILE__UNLINK -FIFO_FILE__LINK = _selinux.FIFO_FILE__LINK -FIFO_FILE__RENAME = _selinux.FIFO_FILE__RENAME -FIFO_FILE__EXECUTE = _selinux.FIFO_FILE__EXECUTE -FIFO_FILE__SWAPON = _selinux.FIFO_FILE__SWAPON -FIFO_FILE__QUOTAON = _selinux.FIFO_FILE__QUOTAON -FIFO_FILE__MOUNTON = _selinux.FIFO_FILE__MOUNTON -FIFO_FILE__OPEN = _selinux.FIFO_FILE__OPEN -FD__USE = _selinux.FD__USE -SOCKET__IOCTL = _selinux.SOCKET__IOCTL -SOCKET__READ = _selinux.SOCKET__READ -SOCKET__WRITE = _selinux.SOCKET__WRITE -SOCKET__CREATE = _selinux.SOCKET__CREATE -SOCKET__GETATTR = _selinux.SOCKET__GETATTR -SOCKET__SETATTR = _selinux.SOCKET__SETATTR -SOCKET__LOCK = _selinux.SOCKET__LOCK -SOCKET__RELABELFROM = _selinux.SOCKET__RELABELFROM -SOCKET__RELABELTO = _selinux.SOCKET__RELABELTO -SOCKET__APPEND = _selinux.SOCKET__APPEND -SOCKET__BIND = _selinux.SOCKET__BIND -SOCKET__CONNECT = _selinux.SOCKET__CONNECT -SOCKET__LISTEN = _selinux.SOCKET__LISTEN -SOCKET__ACCEPT = _selinux.SOCKET__ACCEPT -SOCKET__GETOPT = _selinux.SOCKET__GETOPT -SOCKET__SETOPT = _selinux.SOCKET__SETOPT -SOCKET__SHUTDOWN = _selinux.SOCKET__SHUTDOWN -SOCKET__RECVFROM = _selinux.SOCKET__RECVFROM -SOCKET__SENDTO = _selinux.SOCKET__SENDTO -SOCKET__RECV_MSG = _selinux.SOCKET__RECV_MSG -SOCKET__SEND_MSG = _selinux.SOCKET__SEND_MSG -SOCKET__NAME_BIND = _selinux.SOCKET__NAME_BIND -TCP_SOCKET__IOCTL = _selinux.TCP_SOCKET__IOCTL -TCP_SOCKET__READ = _selinux.TCP_SOCKET__READ -TCP_SOCKET__WRITE = _selinux.TCP_SOCKET__WRITE -TCP_SOCKET__CREATE = _selinux.TCP_SOCKET__CREATE -TCP_SOCKET__GETATTR = _selinux.TCP_SOCKET__GETATTR -TCP_SOCKET__SETATTR = _selinux.TCP_SOCKET__SETATTR -TCP_SOCKET__LOCK = _selinux.TCP_SOCKET__LOCK -TCP_SOCKET__RELABELFROM = _selinux.TCP_SOCKET__RELABELFROM -TCP_SOCKET__RELABELTO = _selinux.TCP_SOCKET__RELABELTO -TCP_SOCKET__APPEND = _selinux.TCP_SOCKET__APPEND -TCP_SOCKET__BIND = _selinux.TCP_SOCKET__BIND -TCP_SOCKET__CONNECT = _selinux.TCP_SOCKET__CONNECT -TCP_SOCKET__LISTEN = _selinux.TCP_SOCKET__LISTEN -TCP_SOCKET__ACCEPT = _selinux.TCP_SOCKET__ACCEPT -TCP_SOCKET__GETOPT = _selinux.TCP_SOCKET__GETOPT -TCP_SOCKET__SETOPT = _selinux.TCP_SOCKET__SETOPT -TCP_SOCKET__SHUTDOWN = _selinux.TCP_SOCKET__SHUTDOWN -TCP_SOCKET__RECVFROM = _selinux.TCP_SOCKET__RECVFROM -TCP_SOCKET__SENDTO = _selinux.TCP_SOCKET__SENDTO -TCP_SOCKET__RECV_MSG = _selinux.TCP_SOCKET__RECV_MSG -TCP_SOCKET__SEND_MSG = _selinux.TCP_SOCKET__SEND_MSG -TCP_SOCKET__NAME_BIND = _selinux.TCP_SOCKET__NAME_BIND -TCP_SOCKET__CONNECTTO = _selinux.TCP_SOCKET__CONNECTTO -TCP_SOCKET__NEWCONN = _selinux.TCP_SOCKET__NEWCONN -TCP_SOCKET__ACCEPTFROM = _selinux.TCP_SOCKET__ACCEPTFROM -TCP_SOCKET__NODE_BIND = _selinux.TCP_SOCKET__NODE_BIND -TCP_SOCKET__NAME_CONNECT = _selinux.TCP_SOCKET__NAME_CONNECT -UDP_SOCKET__IOCTL = _selinux.UDP_SOCKET__IOCTL -UDP_SOCKET__READ = _selinux.UDP_SOCKET__READ -UDP_SOCKET__WRITE = _selinux.UDP_SOCKET__WRITE -UDP_SOCKET__CREATE = _selinux.UDP_SOCKET__CREATE -UDP_SOCKET__GETATTR = _selinux.UDP_SOCKET__GETATTR -UDP_SOCKET__SETATTR = _selinux.UDP_SOCKET__SETATTR -UDP_SOCKET__LOCK = _selinux.UDP_SOCKET__LOCK -UDP_SOCKET__RELABELFROM = _selinux.UDP_SOCKET__RELABELFROM -UDP_SOCKET__RELABELTO = _selinux.UDP_SOCKET__RELABELTO -UDP_SOCKET__APPEND = _selinux.UDP_SOCKET__APPEND -UDP_SOCKET__BIND = _selinux.UDP_SOCKET__BIND -UDP_SOCKET__CONNECT = _selinux.UDP_SOCKET__CONNECT -UDP_SOCKET__LISTEN = _selinux.UDP_SOCKET__LISTEN -UDP_SOCKET__ACCEPT = _selinux.UDP_SOCKET__ACCEPT -UDP_SOCKET__GETOPT = _selinux.UDP_SOCKET__GETOPT -UDP_SOCKET__SETOPT = _selinux.UDP_SOCKET__SETOPT -UDP_SOCKET__SHUTDOWN = _selinux.UDP_SOCKET__SHUTDOWN -UDP_SOCKET__RECVFROM = _selinux.UDP_SOCKET__RECVFROM -UDP_SOCKET__SENDTO = _selinux.UDP_SOCKET__SENDTO -UDP_SOCKET__RECV_MSG = _selinux.UDP_SOCKET__RECV_MSG -UDP_SOCKET__SEND_MSG = _selinux.UDP_SOCKET__SEND_MSG -UDP_SOCKET__NAME_BIND = _selinux.UDP_SOCKET__NAME_BIND -UDP_SOCKET__NODE_BIND = _selinux.UDP_SOCKET__NODE_BIND -RAWIP_SOCKET__IOCTL = _selinux.RAWIP_SOCKET__IOCTL -RAWIP_SOCKET__READ = _selinux.RAWIP_SOCKET__READ -RAWIP_SOCKET__WRITE = _selinux.RAWIP_SOCKET__WRITE -RAWIP_SOCKET__CREATE = _selinux.RAWIP_SOCKET__CREATE -RAWIP_SOCKET__GETATTR = _selinux.RAWIP_SOCKET__GETATTR -RAWIP_SOCKET__SETATTR = _selinux.RAWIP_SOCKET__SETATTR -RAWIP_SOCKET__LOCK = _selinux.RAWIP_SOCKET__LOCK -RAWIP_SOCKET__RELABELFROM = _selinux.RAWIP_SOCKET__RELABELFROM -RAWIP_SOCKET__RELABELTO = _selinux.RAWIP_SOCKET__RELABELTO -RAWIP_SOCKET__APPEND = _selinux.RAWIP_SOCKET__APPEND -RAWIP_SOCKET__BIND = _selinux.RAWIP_SOCKET__BIND -RAWIP_SOCKET__CONNECT = _selinux.RAWIP_SOCKET__CONNECT -RAWIP_SOCKET__LISTEN = _selinux.RAWIP_SOCKET__LISTEN -RAWIP_SOCKET__ACCEPT = _selinux.RAWIP_SOCKET__ACCEPT -RAWIP_SOCKET__GETOPT = _selinux.RAWIP_SOCKET__GETOPT -RAWIP_SOCKET__SETOPT = _selinux.RAWIP_SOCKET__SETOPT -RAWIP_SOCKET__SHUTDOWN = _selinux.RAWIP_SOCKET__SHUTDOWN -RAWIP_SOCKET__RECVFROM = _selinux.RAWIP_SOCKET__RECVFROM -RAWIP_SOCKET__SENDTO = _selinux.RAWIP_SOCKET__SENDTO -RAWIP_SOCKET__RECV_MSG = _selinux.RAWIP_SOCKET__RECV_MSG -RAWIP_SOCKET__SEND_MSG = _selinux.RAWIP_SOCKET__SEND_MSG -RAWIP_SOCKET__NAME_BIND = _selinux.RAWIP_SOCKET__NAME_BIND -RAWIP_SOCKET__NODE_BIND = _selinux.RAWIP_SOCKET__NODE_BIND -NODE__TCP_RECV = _selinux.NODE__TCP_RECV -NODE__TCP_SEND = _selinux.NODE__TCP_SEND -NODE__UDP_RECV = _selinux.NODE__UDP_RECV -NODE__UDP_SEND = _selinux.NODE__UDP_SEND -NODE__RAWIP_RECV = _selinux.NODE__RAWIP_RECV -NODE__RAWIP_SEND = _selinux.NODE__RAWIP_SEND -NODE__ENFORCE_DEST = _selinux.NODE__ENFORCE_DEST -NODE__DCCP_RECV = _selinux.NODE__DCCP_RECV -NODE__DCCP_SEND = _selinux.NODE__DCCP_SEND -NODE__RECVFROM = _selinux.NODE__RECVFROM -NODE__SENDTO = _selinux.NODE__SENDTO -NETIF__TCP_RECV = _selinux.NETIF__TCP_RECV -NETIF__TCP_SEND = _selinux.NETIF__TCP_SEND -NETIF__UDP_RECV = _selinux.NETIF__UDP_RECV -NETIF__UDP_SEND = _selinux.NETIF__UDP_SEND -NETIF__RAWIP_RECV = _selinux.NETIF__RAWIP_RECV -NETIF__RAWIP_SEND = _selinux.NETIF__RAWIP_SEND -NETIF__DCCP_RECV = _selinux.NETIF__DCCP_RECV -NETIF__DCCP_SEND = _selinux.NETIF__DCCP_SEND -NETIF__INGRESS = _selinux.NETIF__INGRESS -NETIF__EGRESS = _selinux.NETIF__EGRESS -NETLINK_SOCKET__IOCTL = _selinux.NETLINK_SOCKET__IOCTL -NETLINK_SOCKET__READ = _selinux.NETLINK_SOCKET__READ -NETLINK_SOCKET__WRITE = _selinux.NETLINK_SOCKET__WRITE -NETLINK_SOCKET__CREATE = _selinux.NETLINK_SOCKET__CREATE -NETLINK_SOCKET__GETATTR = _selinux.NETLINK_SOCKET__GETATTR -NETLINK_SOCKET__SETATTR = _selinux.NETLINK_SOCKET__SETATTR -NETLINK_SOCKET__LOCK = _selinux.NETLINK_SOCKET__LOCK -NETLINK_SOCKET__RELABELFROM = _selinux.NETLINK_SOCKET__RELABELFROM -NETLINK_SOCKET__RELABELTO = _selinux.NETLINK_SOCKET__RELABELTO -NETLINK_SOCKET__APPEND = _selinux.NETLINK_SOCKET__APPEND -NETLINK_SOCKET__BIND = _selinux.NETLINK_SOCKET__BIND -NETLINK_SOCKET__CONNECT = _selinux.NETLINK_SOCKET__CONNECT -NETLINK_SOCKET__LISTEN = _selinux.NETLINK_SOCKET__LISTEN -NETLINK_SOCKET__ACCEPT = _selinux.NETLINK_SOCKET__ACCEPT -NETLINK_SOCKET__GETOPT = _selinux.NETLINK_SOCKET__GETOPT -NETLINK_SOCKET__SETOPT = _selinux.NETLINK_SOCKET__SETOPT -NETLINK_SOCKET__SHUTDOWN = _selinux.NETLINK_SOCKET__SHUTDOWN -NETLINK_SOCKET__RECVFROM = _selinux.NETLINK_SOCKET__RECVFROM -NETLINK_SOCKET__SENDTO = _selinux.NETLINK_SOCKET__SENDTO -NETLINK_SOCKET__RECV_MSG = _selinux.NETLINK_SOCKET__RECV_MSG -NETLINK_SOCKET__SEND_MSG = _selinux.NETLINK_SOCKET__SEND_MSG -NETLINK_SOCKET__NAME_BIND = _selinux.NETLINK_SOCKET__NAME_BIND -PACKET_SOCKET__IOCTL = _selinux.PACKET_SOCKET__IOCTL -PACKET_SOCKET__READ = _selinux.PACKET_SOCKET__READ -PACKET_SOCKET__WRITE = _selinux.PACKET_SOCKET__WRITE -PACKET_SOCKET__CREATE = _selinux.PACKET_SOCKET__CREATE -PACKET_SOCKET__GETATTR = _selinux.PACKET_SOCKET__GETATTR -PACKET_SOCKET__SETATTR = _selinux.PACKET_SOCKET__SETATTR -PACKET_SOCKET__LOCK = _selinux.PACKET_SOCKET__LOCK -PACKET_SOCKET__RELABELFROM = _selinux.PACKET_SOCKET__RELABELFROM -PACKET_SOCKET__RELABELTO = _selinux.PACKET_SOCKET__RELABELTO -PACKET_SOCKET__APPEND = _selinux.PACKET_SOCKET__APPEND -PACKET_SOCKET__BIND = _selinux.PACKET_SOCKET__BIND -PACKET_SOCKET__CONNECT = _selinux.PACKET_SOCKET__CONNECT -PACKET_SOCKET__LISTEN = _selinux.PACKET_SOCKET__LISTEN -PACKET_SOCKET__ACCEPT = _selinux.PACKET_SOCKET__ACCEPT -PACKET_SOCKET__GETOPT = _selinux.PACKET_SOCKET__GETOPT -PACKET_SOCKET__SETOPT = _selinux.PACKET_SOCKET__SETOPT -PACKET_SOCKET__SHUTDOWN = _selinux.PACKET_SOCKET__SHUTDOWN -PACKET_SOCKET__RECVFROM = _selinux.PACKET_SOCKET__RECVFROM -PACKET_SOCKET__SENDTO = _selinux.PACKET_SOCKET__SENDTO -PACKET_SOCKET__RECV_MSG = _selinux.PACKET_SOCKET__RECV_MSG -PACKET_SOCKET__SEND_MSG = _selinux.PACKET_SOCKET__SEND_MSG -PACKET_SOCKET__NAME_BIND = _selinux.PACKET_SOCKET__NAME_BIND -KEY_SOCKET__IOCTL = _selinux.KEY_SOCKET__IOCTL -KEY_SOCKET__READ = _selinux.KEY_SOCKET__READ -KEY_SOCKET__WRITE = _selinux.KEY_SOCKET__WRITE -KEY_SOCKET__CREATE = _selinux.KEY_SOCKET__CREATE -KEY_SOCKET__GETATTR = _selinux.KEY_SOCKET__GETATTR -KEY_SOCKET__SETATTR = _selinux.KEY_SOCKET__SETATTR -KEY_SOCKET__LOCK = _selinux.KEY_SOCKET__LOCK -KEY_SOCKET__RELABELFROM = _selinux.KEY_SOCKET__RELABELFROM -KEY_SOCKET__RELABELTO = _selinux.KEY_SOCKET__RELABELTO -KEY_SOCKET__APPEND = _selinux.KEY_SOCKET__APPEND -KEY_SOCKET__BIND = _selinux.KEY_SOCKET__BIND -KEY_SOCKET__CONNECT = _selinux.KEY_SOCKET__CONNECT -KEY_SOCKET__LISTEN = _selinux.KEY_SOCKET__LISTEN -KEY_SOCKET__ACCEPT = _selinux.KEY_SOCKET__ACCEPT -KEY_SOCKET__GETOPT = _selinux.KEY_SOCKET__GETOPT -KEY_SOCKET__SETOPT = _selinux.KEY_SOCKET__SETOPT -KEY_SOCKET__SHUTDOWN = _selinux.KEY_SOCKET__SHUTDOWN -KEY_SOCKET__RECVFROM = _selinux.KEY_SOCKET__RECVFROM -KEY_SOCKET__SENDTO = _selinux.KEY_SOCKET__SENDTO -KEY_SOCKET__RECV_MSG = _selinux.KEY_SOCKET__RECV_MSG -KEY_SOCKET__SEND_MSG = _selinux.KEY_SOCKET__SEND_MSG -KEY_SOCKET__NAME_BIND = _selinux.KEY_SOCKET__NAME_BIND -UNIX_STREAM_SOCKET__IOCTL = _selinux.UNIX_STREAM_SOCKET__IOCTL -UNIX_STREAM_SOCKET__READ = _selinux.UNIX_STREAM_SOCKET__READ -UNIX_STREAM_SOCKET__WRITE = _selinux.UNIX_STREAM_SOCKET__WRITE -UNIX_STREAM_SOCKET__CREATE = _selinux.UNIX_STREAM_SOCKET__CREATE -UNIX_STREAM_SOCKET__GETATTR = _selinux.UNIX_STREAM_SOCKET__GETATTR -UNIX_STREAM_SOCKET__SETATTR = _selinux.UNIX_STREAM_SOCKET__SETATTR -UNIX_STREAM_SOCKET__LOCK = _selinux.UNIX_STREAM_SOCKET__LOCK -UNIX_STREAM_SOCKET__RELABELFROM = _selinux.UNIX_STREAM_SOCKET__RELABELFROM -UNIX_STREAM_SOCKET__RELABELTO = _selinux.UNIX_STREAM_SOCKET__RELABELTO -UNIX_STREAM_SOCKET__APPEND = _selinux.UNIX_STREAM_SOCKET__APPEND -UNIX_STREAM_SOCKET__BIND = _selinux.UNIX_STREAM_SOCKET__BIND -UNIX_STREAM_SOCKET__CONNECT = _selinux.UNIX_STREAM_SOCKET__CONNECT -UNIX_STREAM_SOCKET__LISTEN = _selinux.UNIX_STREAM_SOCKET__LISTEN -UNIX_STREAM_SOCKET__ACCEPT = _selinux.UNIX_STREAM_SOCKET__ACCEPT -UNIX_STREAM_SOCKET__GETOPT = _selinux.UNIX_STREAM_SOCKET__GETOPT -UNIX_STREAM_SOCKET__SETOPT = _selinux.UNIX_STREAM_SOCKET__SETOPT -UNIX_STREAM_SOCKET__SHUTDOWN = _selinux.UNIX_STREAM_SOCKET__SHUTDOWN -UNIX_STREAM_SOCKET__RECVFROM = _selinux.UNIX_STREAM_SOCKET__RECVFROM -UNIX_STREAM_SOCKET__SENDTO = _selinux.UNIX_STREAM_SOCKET__SENDTO -UNIX_STREAM_SOCKET__RECV_MSG = _selinux.UNIX_STREAM_SOCKET__RECV_MSG -UNIX_STREAM_SOCKET__SEND_MSG = _selinux.UNIX_STREAM_SOCKET__SEND_MSG -UNIX_STREAM_SOCKET__NAME_BIND = _selinux.UNIX_STREAM_SOCKET__NAME_BIND -UNIX_STREAM_SOCKET__CONNECTTO = _selinux.UNIX_STREAM_SOCKET__CONNECTTO -UNIX_STREAM_SOCKET__NEWCONN = _selinux.UNIX_STREAM_SOCKET__NEWCONN -UNIX_STREAM_SOCKET__ACCEPTFROM = _selinux.UNIX_STREAM_SOCKET__ACCEPTFROM -UNIX_DGRAM_SOCKET__IOCTL = _selinux.UNIX_DGRAM_SOCKET__IOCTL -UNIX_DGRAM_SOCKET__READ = _selinux.UNIX_DGRAM_SOCKET__READ -UNIX_DGRAM_SOCKET__WRITE = _selinux.UNIX_DGRAM_SOCKET__WRITE -UNIX_DGRAM_SOCKET__CREATE = _selinux.UNIX_DGRAM_SOCKET__CREATE -UNIX_DGRAM_SOCKET__GETATTR = _selinux.UNIX_DGRAM_SOCKET__GETATTR -UNIX_DGRAM_SOCKET__SETATTR = _selinux.UNIX_DGRAM_SOCKET__SETATTR -UNIX_DGRAM_SOCKET__LOCK = _selinux.UNIX_DGRAM_SOCKET__LOCK -UNIX_DGRAM_SOCKET__RELABELFROM = _selinux.UNIX_DGRAM_SOCKET__RELABELFROM -UNIX_DGRAM_SOCKET__RELABELTO = _selinux.UNIX_DGRAM_SOCKET__RELABELTO -UNIX_DGRAM_SOCKET__APPEND = _selinux.UNIX_DGRAM_SOCKET__APPEND -UNIX_DGRAM_SOCKET__BIND = _selinux.UNIX_DGRAM_SOCKET__BIND -UNIX_DGRAM_SOCKET__CONNECT = _selinux.UNIX_DGRAM_SOCKET__CONNECT -UNIX_DGRAM_SOCKET__LISTEN = _selinux.UNIX_DGRAM_SOCKET__LISTEN -UNIX_DGRAM_SOCKET__ACCEPT = _selinux.UNIX_DGRAM_SOCKET__ACCEPT -UNIX_DGRAM_SOCKET__GETOPT = _selinux.UNIX_DGRAM_SOCKET__GETOPT -UNIX_DGRAM_SOCKET__SETOPT = _selinux.UNIX_DGRAM_SOCKET__SETOPT -UNIX_DGRAM_SOCKET__SHUTDOWN = _selinux.UNIX_DGRAM_SOCKET__SHUTDOWN -UNIX_DGRAM_SOCKET__RECVFROM = _selinux.UNIX_DGRAM_SOCKET__RECVFROM -UNIX_DGRAM_SOCKET__SENDTO = _selinux.UNIX_DGRAM_SOCKET__SENDTO -UNIX_DGRAM_SOCKET__RECV_MSG = _selinux.UNIX_DGRAM_SOCKET__RECV_MSG -UNIX_DGRAM_SOCKET__SEND_MSG = _selinux.UNIX_DGRAM_SOCKET__SEND_MSG -UNIX_DGRAM_SOCKET__NAME_BIND = _selinux.UNIX_DGRAM_SOCKET__NAME_BIND -PROCESS__FORK = _selinux.PROCESS__FORK -PROCESS__TRANSITION = _selinux.PROCESS__TRANSITION -PROCESS__SIGCHLD = _selinux.PROCESS__SIGCHLD -PROCESS__SIGKILL = _selinux.PROCESS__SIGKILL -PROCESS__SIGSTOP = _selinux.PROCESS__SIGSTOP -PROCESS__SIGNULL = _selinux.PROCESS__SIGNULL -PROCESS__SIGNAL = _selinux.PROCESS__SIGNAL -PROCESS__PTRACE = _selinux.PROCESS__PTRACE -PROCESS__GETSCHED = _selinux.PROCESS__GETSCHED -PROCESS__SETSCHED = _selinux.PROCESS__SETSCHED -PROCESS__GETSESSION = _selinux.PROCESS__GETSESSION -PROCESS__GETPGID = _selinux.PROCESS__GETPGID -PROCESS__SETPGID = _selinux.PROCESS__SETPGID -PROCESS__GETCAP = _selinux.PROCESS__GETCAP -PROCESS__SETCAP = _selinux.PROCESS__SETCAP -PROCESS__SHARE = _selinux.PROCESS__SHARE -PROCESS__GETATTR = _selinux.PROCESS__GETATTR -PROCESS__SETEXEC = _selinux.PROCESS__SETEXEC -PROCESS__SETFSCREATE = _selinux.PROCESS__SETFSCREATE -PROCESS__NOATSECURE = _selinux.PROCESS__NOATSECURE -PROCESS__SIGINH = _selinux.PROCESS__SIGINH -PROCESS__SETRLIMIT = _selinux.PROCESS__SETRLIMIT -PROCESS__RLIMITINH = _selinux.PROCESS__RLIMITINH -PROCESS__DYNTRANSITION = _selinux.PROCESS__DYNTRANSITION -PROCESS__SETCURRENT = _selinux.PROCESS__SETCURRENT -PROCESS__EXECMEM = _selinux.PROCESS__EXECMEM -PROCESS__EXECSTACK = _selinux.PROCESS__EXECSTACK -PROCESS__EXECHEAP = _selinux.PROCESS__EXECHEAP -PROCESS__SETKEYCREATE = _selinux.PROCESS__SETKEYCREATE -PROCESS__SETSOCKCREATE = _selinux.PROCESS__SETSOCKCREATE -IPC__CREATE = _selinux.IPC__CREATE -IPC__DESTROY = _selinux.IPC__DESTROY -IPC__GETATTR = _selinux.IPC__GETATTR -IPC__SETATTR = _selinux.IPC__SETATTR -IPC__READ = _selinux.IPC__READ -IPC__WRITE = _selinux.IPC__WRITE -IPC__ASSOCIATE = _selinux.IPC__ASSOCIATE -IPC__UNIX_READ = _selinux.IPC__UNIX_READ -IPC__UNIX_WRITE = _selinux.IPC__UNIX_WRITE -SEM__CREATE = _selinux.SEM__CREATE -SEM__DESTROY = _selinux.SEM__DESTROY -SEM__GETATTR = _selinux.SEM__GETATTR -SEM__SETATTR = _selinux.SEM__SETATTR -SEM__READ = _selinux.SEM__READ -SEM__WRITE = _selinux.SEM__WRITE -SEM__ASSOCIATE = _selinux.SEM__ASSOCIATE -SEM__UNIX_READ = _selinux.SEM__UNIX_READ -SEM__UNIX_WRITE = _selinux.SEM__UNIX_WRITE -MSGQ__CREATE = _selinux.MSGQ__CREATE -MSGQ__DESTROY = _selinux.MSGQ__DESTROY -MSGQ__GETATTR = _selinux.MSGQ__GETATTR -MSGQ__SETATTR = _selinux.MSGQ__SETATTR -MSGQ__READ = _selinux.MSGQ__READ -MSGQ__WRITE = _selinux.MSGQ__WRITE -MSGQ__ASSOCIATE = _selinux.MSGQ__ASSOCIATE -MSGQ__UNIX_READ = _selinux.MSGQ__UNIX_READ -MSGQ__UNIX_WRITE = _selinux.MSGQ__UNIX_WRITE -MSGQ__ENQUEUE = _selinux.MSGQ__ENQUEUE -MSG__SEND = _selinux.MSG__SEND -MSG__RECEIVE = _selinux.MSG__RECEIVE -SHM__CREATE = _selinux.SHM__CREATE -SHM__DESTROY = _selinux.SHM__DESTROY -SHM__GETATTR = _selinux.SHM__GETATTR -SHM__SETATTR = _selinux.SHM__SETATTR -SHM__READ = _selinux.SHM__READ -SHM__WRITE = _selinux.SHM__WRITE -SHM__ASSOCIATE = _selinux.SHM__ASSOCIATE -SHM__UNIX_READ = _selinux.SHM__UNIX_READ -SHM__UNIX_WRITE = _selinux.SHM__UNIX_WRITE -SHM__LOCK = _selinux.SHM__LOCK -SECURITY__COMPUTE_AV = _selinux.SECURITY__COMPUTE_AV -SECURITY__COMPUTE_CREATE = _selinux.SECURITY__COMPUTE_CREATE -SECURITY__COMPUTE_MEMBER = _selinux.SECURITY__COMPUTE_MEMBER -SECURITY__CHECK_CONTEXT = _selinux.SECURITY__CHECK_CONTEXT -SECURITY__LOAD_POLICY = _selinux.SECURITY__LOAD_POLICY -SECURITY__COMPUTE_RELABEL = _selinux.SECURITY__COMPUTE_RELABEL -SECURITY__COMPUTE_USER = _selinux.SECURITY__COMPUTE_USER -SECURITY__SETENFORCE = _selinux.SECURITY__SETENFORCE -SECURITY__SETBOOL = _selinux.SECURITY__SETBOOL -SECURITY__SETSECPARAM = _selinux.SECURITY__SETSECPARAM -SECURITY__SETCHECKREQPROT = _selinux.SECURITY__SETCHECKREQPROT -SYSTEM__IPC_INFO = _selinux.SYSTEM__IPC_INFO -SYSTEM__SYSLOG_READ = _selinux.SYSTEM__SYSLOG_READ -SYSTEM__SYSLOG_MOD = _selinux.SYSTEM__SYSLOG_MOD -SYSTEM__SYSLOG_CONSOLE = _selinux.SYSTEM__SYSLOG_CONSOLE -CAPABILITY__CHOWN = _selinux.CAPABILITY__CHOWN -CAPABILITY__DAC_OVERRIDE = _selinux.CAPABILITY__DAC_OVERRIDE -CAPABILITY__DAC_READ_SEARCH = _selinux.CAPABILITY__DAC_READ_SEARCH -CAPABILITY__FOWNER = _selinux.CAPABILITY__FOWNER -CAPABILITY__FSETID = _selinux.CAPABILITY__FSETID -CAPABILITY__KILL = _selinux.CAPABILITY__KILL -CAPABILITY__SETGID = _selinux.CAPABILITY__SETGID -CAPABILITY__SETUID = _selinux.CAPABILITY__SETUID -CAPABILITY__SETPCAP = _selinux.CAPABILITY__SETPCAP -CAPABILITY__LINUX_IMMUTABLE = _selinux.CAPABILITY__LINUX_IMMUTABLE -CAPABILITY__NET_BIND_SERVICE = _selinux.CAPABILITY__NET_BIND_SERVICE -CAPABILITY__NET_BROADCAST = _selinux.CAPABILITY__NET_BROADCAST -CAPABILITY__NET_ADMIN = _selinux.CAPABILITY__NET_ADMIN -CAPABILITY__NET_RAW = _selinux.CAPABILITY__NET_RAW -CAPABILITY__IPC_LOCK = _selinux.CAPABILITY__IPC_LOCK -CAPABILITY__IPC_OWNER = _selinux.CAPABILITY__IPC_OWNER -CAPABILITY__SYS_MODULE = _selinux.CAPABILITY__SYS_MODULE -CAPABILITY__SYS_RAWIO = _selinux.CAPABILITY__SYS_RAWIO -CAPABILITY__SYS_CHROOT = _selinux.CAPABILITY__SYS_CHROOT -CAPABILITY__SYS_PTRACE = _selinux.CAPABILITY__SYS_PTRACE -CAPABILITY__SYS_PACCT = _selinux.CAPABILITY__SYS_PACCT -CAPABILITY__SYS_ADMIN = _selinux.CAPABILITY__SYS_ADMIN -CAPABILITY__SYS_BOOT = _selinux.CAPABILITY__SYS_BOOT -CAPABILITY__SYS_NICE = _selinux.CAPABILITY__SYS_NICE -CAPABILITY__SYS_RESOURCE = _selinux.CAPABILITY__SYS_RESOURCE -CAPABILITY__SYS_TIME = _selinux.CAPABILITY__SYS_TIME -CAPABILITY__SYS_TTY_CONFIG = _selinux.CAPABILITY__SYS_TTY_CONFIG -CAPABILITY__MKNOD = _selinux.CAPABILITY__MKNOD -CAPABILITY__LEASE = _selinux.CAPABILITY__LEASE -CAPABILITY__AUDIT_WRITE = _selinux.CAPABILITY__AUDIT_WRITE -CAPABILITY__AUDIT_CONTROL = _selinux.CAPABILITY__AUDIT_CONTROL -CAPABILITY__SETFCAP = _selinux.CAPABILITY__SETFCAP -CAPABILITY2__MAC_OVERRIDE = _selinux.CAPABILITY2__MAC_OVERRIDE -CAPABILITY2__MAC_ADMIN = _selinux.CAPABILITY2__MAC_ADMIN -PASSWD__PASSWD = _selinux.PASSWD__PASSWD -PASSWD__CHFN = _selinux.PASSWD__CHFN -PASSWD__CHSH = _selinux.PASSWD__CHSH -PASSWD__ROOTOK = _selinux.PASSWD__ROOTOK -PASSWD__CRONTAB = _selinux.PASSWD__CRONTAB -X_DRAWABLE__CREATE = _selinux.X_DRAWABLE__CREATE -X_DRAWABLE__DESTROY = _selinux.X_DRAWABLE__DESTROY -X_DRAWABLE__READ = _selinux.X_DRAWABLE__READ -X_DRAWABLE__WRITE = _selinux.X_DRAWABLE__WRITE -X_DRAWABLE__BLEND = _selinux.X_DRAWABLE__BLEND -X_DRAWABLE__GETATTR = _selinux.X_DRAWABLE__GETATTR -X_DRAWABLE__SETATTR = _selinux.X_DRAWABLE__SETATTR -X_DRAWABLE__LIST_CHILD = _selinux.X_DRAWABLE__LIST_CHILD -X_DRAWABLE__ADD_CHILD = _selinux.X_DRAWABLE__ADD_CHILD -X_DRAWABLE__REMOVE_CHILD = _selinux.X_DRAWABLE__REMOVE_CHILD -X_DRAWABLE__LIST_PROPERTY = _selinux.X_DRAWABLE__LIST_PROPERTY -X_DRAWABLE__GET_PROPERTY = _selinux.X_DRAWABLE__GET_PROPERTY -X_DRAWABLE__SET_PROPERTY = _selinux.X_DRAWABLE__SET_PROPERTY -X_DRAWABLE__MANAGE = _selinux.X_DRAWABLE__MANAGE -X_DRAWABLE__OVERRIDE = _selinux.X_DRAWABLE__OVERRIDE -X_DRAWABLE__SHOW = _selinux.X_DRAWABLE__SHOW -X_DRAWABLE__HIDE = _selinux.X_DRAWABLE__HIDE -X_DRAWABLE__SEND = _selinux.X_DRAWABLE__SEND -X_DRAWABLE__RECEIVE = _selinux.X_DRAWABLE__RECEIVE -X_SCREEN__GETATTR = _selinux.X_SCREEN__GETATTR -X_SCREEN__SETATTR = _selinux.X_SCREEN__SETATTR -X_SCREEN__HIDE_CURSOR = _selinux.X_SCREEN__HIDE_CURSOR -X_SCREEN__SHOW_CURSOR = _selinux.X_SCREEN__SHOW_CURSOR -X_SCREEN__SAVER_GETATTR = _selinux.X_SCREEN__SAVER_GETATTR -X_SCREEN__SAVER_SETATTR = _selinux.X_SCREEN__SAVER_SETATTR -X_SCREEN__SAVER_HIDE = _selinux.X_SCREEN__SAVER_HIDE -X_SCREEN__SAVER_SHOW = _selinux.X_SCREEN__SAVER_SHOW -X_GC__CREATE = _selinux.X_GC__CREATE -X_GC__DESTROY = _selinux.X_GC__DESTROY -X_GC__GETATTR = _selinux.X_GC__GETATTR -X_GC__SETATTR = _selinux.X_GC__SETATTR -X_GC__USE = _selinux.X_GC__USE -X_FONT__CREATE = _selinux.X_FONT__CREATE -X_FONT__DESTROY = _selinux.X_FONT__DESTROY -X_FONT__GETATTR = _selinux.X_FONT__GETATTR -X_FONT__ADD_GLYPH = _selinux.X_FONT__ADD_GLYPH -X_FONT__REMOVE_GLYPH = _selinux.X_FONT__REMOVE_GLYPH -X_FONT__USE = _selinux.X_FONT__USE -X_COLORMAP__CREATE = _selinux.X_COLORMAP__CREATE -X_COLORMAP__DESTROY = _selinux.X_COLORMAP__DESTROY -X_COLORMAP__READ = _selinux.X_COLORMAP__READ -X_COLORMAP__WRITE = _selinux.X_COLORMAP__WRITE -X_COLORMAP__GETATTR = _selinux.X_COLORMAP__GETATTR -X_COLORMAP__ADD_COLOR = _selinux.X_COLORMAP__ADD_COLOR -X_COLORMAP__REMOVE_COLOR = _selinux.X_COLORMAP__REMOVE_COLOR -X_COLORMAP__INSTALL = _selinux.X_COLORMAP__INSTALL -X_COLORMAP__UNINSTALL = _selinux.X_COLORMAP__UNINSTALL -X_COLORMAP__USE = _selinux.X_COLORMAP__USE -X_PROPERTY__CREATE = _selinux.X_PROPERTY__CREATE -X_PROPERTY__DESTROY = _selinux.X_PROPERTY__DESTROY -X_PROPERTY__READ = _selinux.X_PROPERTY__READ -X_PROPERTY__WRITE = _selinux.X_PROPERTY__WRITE -X_PROPERTY__APPEND = _selinux.X_PROPERTY__APPEND -X_PROPERTY__GETATTR = _selinux.X_PROPERTY__GETATTR -X_PROPERTY__SETATTR = _selinux.X_PROPERTY__SETATTR -X_SELECTION__READ = _selinux.X_SELECTION__READ -X_SELECTION__WRITE = _selinux.X_SELECTION__WRITE -X_SELECTION__GETATTR = _selinux.X_SELECTION__GETATTR -X_SELECTION__SETATTR = _selinux.X_SELECTION__SETATTR -X_CURSOR__CREATE = _selinux.X_CURSOR__CREATE -X_CURSOR__DESTROY = _selinux.X_CURSOR__DESTROY -X_CURSOR__READ = _selinux.X_CURSOR__READ -X_CURSOR__WRITE = _selinux.X_CURSOR__WRITE -X_CURSOR__GETATTR = _selinux.X_CURSOR__GETATTR -X_CURSOR__SETATTR = _selinux.X_CURSOR__SETATTR -X_CURSOR__USE = _selinux.X_CURSOR__USE -X_CLIENT__DESTROY = _selinux.X_CLIENT__DESTROY -X_CLIENT__GETATTR = _selinux.X_CLIENT__GETATTR -X_CLIENT__SETATTR = _selinux.X_CLIENT__SETATTR -X_CLIENT__MANAGE = _selinux.X_CLIENT__MANAGE -X_DEVICE__GETATTR = _selinux.X_DEVICE__GETATTR -X_DEVICE__SETATTR = _selinux.X_DEVICE__SETATTR -X_DEVICE__USE = _selinux.X_DEVICE__USE -X_DEVICE__READ = _selinux.X_DEVICE__READ -X_DEVICE__WRITE = _selinux.X_DEVICE__WRITE -X_DEVICE__GETFOCUS = _selinux.X_DEVICE__GETFOCUS -X_DEVICE__SETFOCUS = _selinux.X_DEVICE__SETFOCUS -X_DEVICE__BELL = _selinux.X_DEVICE__BELL -X_DEVICE__FORCE_CURSOR = _selinux.X_DEVICE__FORCE_CURSOR -X_DEVICE__FREEZE = _selinux.X_DEVICE__FREEZE -X_DEVICE__GRAB = _selinux.X_DEVICE__GRAB -X_DEVICE__MANAGE = _selinux.X_DEVICE__MANAGE -X_SERVER__GETATTR = _selinux.X_SERVER__GETATTR -X_SERVER__SETATTR = _selinux.X_SERVER__SETATTR -X_SERVER__RECORD = _selinux.X_SERVER__RECORD -X_SERVER__DEBUG = _selinux.X_SERVER__DEBUG -X_SERVER__GRAB = _selinux.X_SERVER__GRAB -X_SERVER__MANAGE = _selinux.X_SERVER__MANAGE -X_EXTENSION__QUERY = _selinux.X_EXTENSION__QUERY -X_EXTENSION__USE = _selinux.X_EXTENSION__USE -X_RESOURCE__READ = _selinux.X_RESOURCE__READ -X_RESOURCE__WRITE = _selinux.X_RESOURCE__WRITE -X_EVENT__SEND = _selinux.X_EVENT__SEND -X_EVENT__RECEIVE = _selinux.X_EVENT__RECEIVE -X_SYNTHETIC_EVENT__SEND = _selinux.X_SYNTHETIC_EVENT__SEND -X_SYNTHETIC_EVENT__RECEIVE = _selinux.X_SYNTHETIC_EVENT__RECEIVE -NETLINK_ROUTE_SOCKET__IOCTL = _selinux.NETLINK_ROUTE_SOCKET__IOCTL -NETLINK_ROUTE_SOCKET__READ = _selinux.NETLINK_ROUTE_SOCKET__READ -NETLINK_ROUTE_SOCKET__WRITE = _selinux.NETLINK_ROUTE_SOCKET__WRITE -NETLINK_ROUTE_SOCKET__CREATE = _selinux.NETLINK_ROUTE_SOCKET__CREATE -NETLINK_ROUTE_SOCKET__GETATTR = _selinux.NETLINK_ROUTE_SOCKET__GETATTR -NETLINK_ROUTE_SOCKET__SETATTR = _selinux.NETLINK_ROUTE_SOCKET__SETATTR -NETLINK_ROUTE_SOCKET__LOCK = _selinux.NETLINK_ROUTE_SOCKET__LOCK -NETLINK_ROUTE_SOCKET__RELABELFROM = _selinux.NETLINK_ROUTE_SOCKET__RELABELFROM -NETLINK_ROUTE_SOCKET__RELABELTO = _selinux.NETLINK_ROUTE_SOCKET__RELABELTO -NETLINK_ROUTE_SOCKET__APPEND = _selinux.NETLINK_ROUTE_SOCKET__APPEND -NETLINK_ROUTE_SOCKET__BIND = _selinux.NETLINK_ROUTE_SOCKET__BIND -NETLINK_ROUTE_SOCKET__CONNECT = _selinux.NETLINK_ROUTE_SOCKET__CONNECT -NETLINK_ROUTE_SOCKET__LISTEN = _selinux.NETLINK_ROUTE_SOCKET__LISTEN -NETLINK_ROUTE_SOCKET__ACCEPT = _selinux.NETLINK_ROUTE_SOCKET__ACCEPT -NETLINK_ROUTE_SOCKET__GETOPT = _selinux.NETLINK_ROUTE_SOCKET__GETOPT -NETLINK_ROUTE_SOCKET__SETOPT = _selinux.NETLINK_ROUTE_SOCKET__SETOPT -NETLINK_ROUTE_SOCKET__SHUTDOWN = _selinux.NETLINK_ROUTE_SOCKET__SHUTDOWN -NETLINK_ROUTE_SOCKET__RECVFROM = _selinux.NETLINK_ROUTE_SOCKET__RECVFROM -NETLINK_ROUTE_SOCKET__SENDTO = _selinux.NETLINK_ROUTE_SOCKET__SENDTO -NETLINK_ROUTE_SOCKET__RECV_MSG = _selinux.NETLINK_ROUTE_SOCKET__RECV_MSG -NETLINK_ROUTE_SOCKET__SEND_MSG = _selinux.NETLINK_ROUTE_SOCKET__SEND_MSG -NETLINK_ROUTE_SOCKET__NAME_BIND = _selinux.NETLINK_ROUTE_SOCKET__NAME_BIND -NETLINK_ROUTE_SOCKET__NLMSG_READ = _selinux.NETLINK_ROUTE_SOCKET__NLMSG_READ -NETLINK_ROUTE_SOCKET__NLMSG_WRITE = _selinux.NETLINK_ROUTE_SOCKET__NLMSG_WRITE -NETLINK_FIREWALL_SOCKET__IOCTL = _selinux.NETLINK_FIREWALL_SOCKET__IOCTL -NETLINK_FIREWALL_SOCKET__READ = _selinux.NETLINK_FIREWALL_SOCKET__READ -NETLINK_FIREWALL_SOCKET__WRITE = _selinux.NETLINK_FIREWALL_SOCKET__WRITE -NETLINK_FIREWALL_SOCKET__CREATE = _selinux.NETLINK_FIREWALL_SOCKET__CREATE -NETLINK_FIREWALL_SOCKET__GETATTR = _selinux.NETLINK_FIREWALL_SOCKET__GETATTR -NETLINK_FIREWALL_SOCKET__SETATTR = _selinux.NETLINK_FIREWALL_SOCKET__SETATTR -NETLINK_FIREWALL_SOCKET__LOCK = _selinux.NETLINK_FIREWALL_SOCKET__LOCK -NETLINK_FIREWALL_SOCKET__RELABELFROM = _selinux.NETLINK_FIREWALL_SOCKET__RELABELFROM -NETLINK_FIREWALL_SOCKET__RELABELTO = _selinux.NETLINK_FIREWALL_SOCKET__RELABELTO -NETLINK_FIREWALL_SOCKET__APPEND = _selinux.NETLINK_FIREWALL_SOCKET__APPEND -NETLINK_FIREWALL_SOCKET__BIND = _selinux.NETLINK_FIREWALL_SOCKET__BIND -NETLINK_FIREWALL_SOCKET__CONNECT = _selinux.NETLINK_FIREWALL_SOCKET__CONNECT -NETLINK_FIREWALL_SOCKET__LISTEN = _selinux.NETLINK_FIREWALL_SOCKET__LISTEN -NETLINK_FIREWALL_SOCKET__ACCEPT = _selinux.NETLINK_FIREWALL_SOCKET__ACCEPT -NETLINK_FIREWALL_SOCKET__GETOPT = _selinux.NETLINK_FIREWALL_SOCKET__GETOPT -NETLINK_FIREWALL_SOCKET__SETOPT = _selinux.NETLINK_FIREWALL_SOCKET__SETOPT -NETLINK_FIREWALL_SOCKET__SHUTDOWN = _selinux.NETLINK_FIREWALL_SOCKET__SHUTDOWN -NETLINK_FIREWALL_SOCKET__RECVFROM = _selinux.NETLINK_FIREWALL_SOCKET__RECVFROM -NETLINK_FIREWALL_SOCKET__SENDTO = _selinux.NETLINK_FIREWALL_SOCKET__SENDTO -NETLINK_FIREWALL_SOCKET__RECV_MSG = _selinux.NETLINK_FIREWALL_SOCKET__RECV_MSG -NETLINK_FIREWALL_SOCKET__SEND_MSG = _selinux.NETLINK_FIREWALL_SOCKET__SEND_MSG -NETLINK_FIREWALL_SOCKET__NAME_BIND = _selinux.NETLINK_FIREWALL_SOCKET__NAME_BIND -NETLINK_FIREWALL_SOCKET__NLMSG_READ = _selinux.NETLINK_FIREWALL_SOCKET__NLMSG_READ -NETLINK_FIREWALL_SOCKET__NLMSG_WRITE = _selinux.NETLINK_FIREWALL_SOCKET__NLMSG_WRITE -NETLINK_TCPDIAG_SOCKET__IOCTL = _selinux.NETLINK_TCPDIAG_SOCKET__IOCTL -NETLINK_TCPDIAG_SOCKET__READ = _selinux.NETLINK_TCPDIAG_SOCKET__READ -NETLINK_TCPDIAG_SOCKET__WRITE = _selinux.NETLINK_TCPDIAG_SOCKET__WRITE -NETLINK_TCPDIAG_SOCKET__CREATE = _selinux.NETLINK_TCPDIAG_SOCKET__CREATE -NETLINK_TCPDIAG_SOCKET__GETATTR = _selinux.NETLINK_TCPDIAG_SOCKET__GETATTR -NETLINK_TCPDIAG_SOCKET__SETATTR = _selinux.NETLINK_TCPDIAG_SOCKET__SETATTR -NETLINK_TCPDIAG_SOCKET__LOCK = _selinux.NETLINK_TCPDIAG_SOCKET__LOCK -NETLINK_TCPDIAG_SOCKET__RELABELFROM = _selinux.NETLINK_TCPDIAG_SOCKET__RELABELFROM -NETLINK_TCPDIAG_SOCKET__RELABELTO = _selinux.NETLINK_TCPDIAG_SOCKET__RELABELTO -NETLINK_TCPDIAG_SOCKET__APPEND = _selinux.NETLINK_TCPDIAG_SOCKET__APPEND -NETLINK_TCPDIAG_SOCKET__BIND = _selinux.NETLINK_TCPDIAG_SOCKET__BIND -NETLINK_TCPDIAG_SOCKET__CONNECT = _selinux.NETLINK_TCPDIAG_SOCKET__CONNECT -NETLINK_TCPDIAG_SOCKET__LISTEN = _selinux.NETLINK_TCPDIAG_SOCKET__LISTEN -NETLINK_TCPDIAG_SOCKET__ACCEPT = _selinux.NETLINK_TCPDIAG_SOCKET__ACCEPT -NETLINK_TCPDIAG_SOCKET__GETOPT = _selinux.NETLINK_TCPDIAG_SOCKET__GETOPT -NETLINK_TCPDIAG_SOCKET__SETOPT = _selinux.NETLINK_TCPDIAG_SOCKET__SETOPT -NETLINK_TCPDIAG_SOCKET__SHUTDOWN = _selinux.NETLINK_TCPDIAG_SOCKET__SHUTDOWN -NETLINK_TCPDIAG_SOCKET__RECVFROM = _selinux.NETLINK_TCPDIAG_SOCKET__RECVFROM -NETLINK_TCPDIAG_SOCKET__SENDTO = _selinux.NETLINK_TCPDIAG_SOCKET__SENDTO -NETLINK_TCPDIAG_SOCKET__RECV_MSG = _selinux.NETLINK_TCPDIAG_SOCKET__RECV_MSG -NETLINK_TCPDIAG_SOCKET__SEND_MSG = _selinux.NETLINK_TCPDIAG_SOCKET__SEND_MSG -NETLINK_TCPDIAG_SOCKET__NAME_BIND = _selinux.NETLINK_TCPDIAG_SOCKET__NAME_BIND -NETLINK_TCPDIAG_SOCKET__NLMSG_READ = _selinux.NETLINK_TCPDIAG_SOCKET__NLMSG_READ -NETLINK_TCPDIAG_SOCKET__NLMSG_WRITE = _selinux.NETLINK_TCPDIAG_SOCKET__NLMSG_WRITE -NETLINK_NFLOG_SOCKET__IOCTL = _selinux.NETLINK_NFLOG_SOCKET__IOCTL -NETLINK_NFLOG_SOCKET__READ = _selinux.NETLINK_NFLOG_SOCKET__READ -NETLINK_NFLOG_SOCKET__WRITE = _selinux.NETLINK_NFLOG_SOCKET__WRITE -NETLINK_NFLOG_SOCKET__CREATE = _selinux.NETLINK_NFLOG_SOCKET__CREATE -NETLINK_NFLOG_SOCKET__GETATTR = _selinux.NETLINK_NFLOG_SOCKET__GETATTR -NETLINK_NFLOG_SOCKET__SETATTR = _selinux.NETLINK_NFLOG_SOCKET__SETATTR -NETLINK_NFLOG_SOCKET__LOCK = _selinux.NETLINK_NFLOG_SOCKET__LOCK -NETLINK_NFLOG_SOCKET__RELABELFROM = _selinux.NETLINK_NFLOG_SOCKET__RELABELFROM -NETLINK_NFLOG_SOCKET__RELABELTO = _selinux.NETLINK_NFLOG_SOCKET__RELABELTO -NETLINK_NFLOG_SOCKET__APPEND = _selinux.NETLINK_NFLOG_SOCKET__APPEND -NETLINK_NFLOG_SOCKET__BIND = _selinux.NETLINK_NFLOG_SOCKET__BIND -NETLINK_NFLOG_SOCKET__CONNECT = _selinux.NETLINK_NFLOG_SOCKET__CONNECT -NETLINK_NFLOG_SOCKET__LISTEN = _selinux.NETLINK_NFLOG_SOCKET__LISTEN -NETLINK_NFLOG_SOCKET__ACCEPT = _selinux.NETLINK_NFLOG_SOCKET__ACCEPT -NETLINK_NFLOG_SOCKET__GETOPT = _selinux.NETLINK_NFLOG_SOCKET__GETOPT -NETLINK_NFLOG_SOCKET__SETOPT = _selinux.NETLINK_NFLOG_SOCKET__SETOPT -NETLINK_NFLOG_SOCKET__SHUTDOWN = _selinux.NETLINK_NFLOG_SOCKET__SHUTDOWN -NETLINK_NFLOG_SOCKET__RECVFROM = _selinux.NETLINK_NFLOG_SOCKET__RECVFROM -NETLINK_NFLOG_SOCKET__SENDTO = _selinux.NETLINK_NFLOG_SOCKET__SENDTO -NETLINK_NFLOG_SOCKET__RECV_MSG = _selinux.NETLINK_NFLOG_SOCKET__RECV_MSG -NETLINK_NFLOG_SOCKET__SEND_MSG = _selinux.NETLINK_NFLOG_SOCKET__SEND_MSG -NETLINK_NFLOG_SOCKET__NAME_BIND = _selinux.NETLINK_NFLOG_SOCKET__NAME_BIND -NETLINK_XFRM_SOCKET__IOCTL = _selinux.NETLINK_XFRM_SOCKET__IOCTL -NETLINK_XFRM_SOCKET__READ = _selinux.NETLINK_XFRM_SOCKET__READ -NETLINK_XFRM_SOCKET__WRITE = _selinux.NETLINK_XFRM_SOCKET__WRITE -NETLINK_XFRM_SOCKET__CREATE = _selinux.NETLINK_XFRM_SOCKET__CREATE -NETLINK_XFRM_SOCKET__GETATTR = _selinux.NETLINK_XFRM_SOCKET__GETATTR -NETLINK_XFRM_SOCKET__SETATTR = _selinux.NETLINK_XFRM_SOCKET__SETATTR -NETLINK_XFRM_SOCKET__LOCK = _selinux.NETLINK_XFRM_SOCKET__LOCK -NETLINK_XFRM_SOCKET__RELABELFROM = _selinux.NETLINK_XFRM_SOCKET__RELABELFROM -NETLINK_XFRM_SOCKET__RELABELTO = _selinux.NETLINK_XFRM_SOCKET__RELABELTO -NETLINK_XFRM_SOCKET__APPEND = _selinux.NETLINK_XFRM_SOCKET__APPEND -NETLINK_XFRM_SOCKET__BIND = _selinux.NETLINK_XFRM_SOCKET__BIND -NETLINK_XFRM_SOCKET__CONNECT = _selinux.NETLINK_XFRM_SOCKET__CONNECT -NETLINK_XFRM_SOCKET__LISTEN = _selinux.NETLINK_XFRM_SOCKET__LISTEN -NETLINK_XFRM_SOCKET__ACCEPT = _selinux.NETLINK_XFRM_SOCKET__ACCEPT -NETLINK_XFRM_SOCKET__GETOPT = _selinux.NETLINK_XFRM_SOCKET__GETOPT -NETLINK_XFRM_SOCKET__SETOPT = _selinux.NETLINK_XFRM_SOCKET__SETOPT -NETLINK_XFRM_SOCKET__SHUTDOWN = _selinux.NETLINK_XFRM_SOCKET__SHUTDOWN -NETLINK_XFRM_SOCKET__RECVFROM = _selinux.NETLINK_XFRM_SOCKET__RECVFROM -NETLINK_XFRM_SOCKET__SENDTO = _selinux.NETLINK_XFRM_SOCKET__SENDTO -NETLINK_XFRM_SOCKET__RECV_MSG = _selinux.NETLINK_XFRM_SOCKET__RECV_MSG -NETLINK_XFRM_SOCKET__SEND_MSG = _selinux.NETLINK_XFRM_SOCKET__SEND_MSG -NETLINK_XFRM_SOCKET__NAME_BIND = _selinux.NETLINK_XFRM_SOCKET__NAME_BIND -NETLINK_XFRM_SOCKET__NLMSG_READ = _selinux.NETLINK_XFRM_SOCKET__NLMSG_READ -NETLINK_XFRM_SOCKET__NLMSG_WRITE = _selinux.NETLINK_XFRM_SOCKET__NLMSG_WRITE -NETLINK_SELINUX_SOCKET__IOCTL = _selinux.NETLINK_SELINUX_SOCKET__IOCTL -NETLINK_SELINUX_SOCKET__READ = _selinux.NETLINK_SELINUX_SOCKET__READ -NETLINK_SELINUX_SOCKET__WRITE = _selinux.NETLINK_SELINUX_SOCKET__WRITE -NETLINK_SELINUX_SOCKET__CREATE = _selinux.NETLINK_SELINUX_SOCKET__CREATE -NETLINK_SELINUX_SOCKET__GETATTR = _selinux.NETLINK_SELINUX_SOCKET__GETATTR -NETLINK_SELINUX_SOCKET__SETATTR = _selinux.NETLINK_SELINUX_SOCKET__SETATTR -NETLINK_SELINUX_SOCKET__LOCK = _selinux.NETLINK_SELINUX_SOCKET__LOCK -NETLINK_SELINUX_SOCKET__RELABELFROM = _selinux.NETLINK_SELINUX_SOCKET__RELABELFROM -NETLINK_SELINUX_SOCKET__RELABELTO = _selinux.NETLINK_SELINUX_SOCKET__RELABELTO -NETLINK_SELINUX_SOCKET__APPEND = _selinux.NETLINK_SELINUX_SOCKET__APPEND -NETLINK_SELINUX_SOCKET__BIND = _selinux.NETLINK_SELINUX_SOCKET__BIND -NETLINK_SELINUX_SOCKET__CONNECT = _selinux.NETLINK_SELINUX_SOCKET__CONNECT -NETLINK_SELINUX_SOCKET__LISTEN = _selinux.NETLINK_SELINUX_SOCKET__LISTEN -NETLINK_SELINUX_SOCKET__ACCEPT = _selinux.NETLINK_SELINUX_SOCKET__ACCEPT -NETLINK_SELINUX_SOCKET__GETOPT = _selinux.NETLINK_SELINUX_SOCKET__GETOPT -NETLINK_SELINUX_SOCKET__SETOPT = _selinux.NETLINK_SELINUX_SOCKET__SETOPT -NETLINK_SELINUX_SOCKET__SHUTDOWN = _selinux.NETLINK_SELINUX_SOCKET__SHUTDOWN -NETLINK_SELINUX_SOCKET__RECVFROM = _selinux.NETLINK_SELINUX_SOCKET__RECVFROM -NETLINK_SELINUX_SOCKET__SENDTO = _selinux.NETLINK_SELINUX_SOCKET__SENDTO -NETLINK_SELINUX_SOCKET__RECV_MSG = _selinux.NETLINK_SELINUX_SOCKET__RECV_MSG -NETLINK_SELINUX_SOCKET__SEND_MSG = _selinux.NETLINK_SELINUX_SOCKET__SEND_MSG -NETLINK_SELINUX_SOCKET__NAME_BIND = _selinux.NETLINK_SELINUX_SOCKET__NAME_BIND -NETLINK_AUDIT_SOCKET__IOCTL = _selinux.NETLINK_AUDIT_SOCKET__IOCTL -NETLINK_AUDIT_SOCKET__READ = _selinux.NETLINK_AUDIT_SOCKET__READ -NETLINK_AUDIT_SOCKET__WRITE = _selinux.NETLINK_AUDIT_SOCKET__WRITE -NETLINK_AUDIT_SOCKET__CREATE = _selinux.NETLINK_AUDIT_SOCKET__CREATE -NETLINK_AUDIT_SOCKET__GETATTR = _selinux.NETLINK_AUDIT_SOCKET__GETATTR -NETLINK_AUDIT_SOCKET__SETATTR = _selinux.NETLINK_AUDIT_SOCKET__SETATTR -NETLINK_AUDIT_SOCKET__LOCK = _selinux.NETLINK_AUDIT_SOCKET__LOCK -NETLINK_AUDIT_SOCKET__RELABELFROM = _selinux.NETLINK_AUDIT_SOCKET__RELABELFROM -NETLINK_AUDIT_SOCKET__RELABELTO = _selinux.NETLINK_AUDIT_SOCKET__RELABELTO -NETLINK_AUDIT_SOCKET__APPEND = _selinux.NETLINK_AUDIT_SOCKET__APPEND -NETLINK_AUDIT_SOCKET__BIND = _selinux.NETLINK_AUDIT_SOCKET__BIND -NETLINK_AUDIT_SOCKET__CONNECT = _selinux.NETLINK_AUDIT_SOCKET__CONNECT -NETLINK_AUDIT_SOCKET__LISTEN = _selinux.NETLINK_AUDIT_SOCKET__LISTEN -NETLINK_AUDIT_SOCKET__ACCEPT = _selinux.NETLINK_AUDIT_SOCKET__ACCEPT -NETLINK_AUDIT_SOCKET__GETOPT = _selinux.NETLINK_AUDIT_SOCKET__GETOPT -NETLINK_AUDIT_SOCKET__SETOPT = _selinux.NETLINK_AUDIT_SOCKET__SETOPT -NETLINK_AUDIT_SOCKET__SHUTDOWN = _selinux.NETLINK_AUDIT_SOCKET__SHUTDOWN -NETLINK_AUDIT_SOCKET__RECVFROM = _selinux.NETLINK_AUDIT_SOCKET__RECVFROM -NETLINK_AUDIT_SOCKET__SENDTO = _selinux.NETLINK_AUDIT_SOCKET__SENDTO -NETLINK_AUDIT_SOCKET__RECV_MSG = _selinux.NETLINK_AUDIT_SOCKET__RECV_MSG -NETLINK_AUDIT_SOCKET__SEND_MSG = _selinux.NETLINK_AUDIT_SOCKET__SEND_MSG -NETLINK_AUDIT_SOCKET__NAME_BIND = _selinux.NETLINK_AUDIT_SOCKET__NAME_BIND -NETLINK_AUDIT_SOCKET__NLMSG_READ = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_READ -NETLINK_AUDIT_SOCKET__NLMSG_WRITE = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_WRITE -NETLINK_AUDIT_SOCKET__NLMSG_RELAY = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_RELAY -NETLINK_AUDIT_SOCKET__NLMSG_READPRIV = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_READPRIV -NETLINK_AUDIT_SOCKET__NLMSG_TTY_AUDIT = _selinux.NETLINK_AUDIT_SOCKET__NLMSG_TTY_AUDIT -NETLINK_IP6FW_SOCKET__IOCTL = _selinux.NETLINK_IP6FW_SOCKET__IOCTL -NETLINK_IP6FW_SOCKET__READ = _selinux.NETLINK_IP6FW_SOCKET__READ -NETLINK_IP6FW_SOCKET__WRITE = _selinux.NETLINK_IP6FW_SOCKET__WRITE -NETLINK_IP6FW_SOCKET__CREATE = _selinux.NETLINK_IP6FW_SOCKET__CREATE -NETLINK_IP6FW_SOCKET__GETATTR = _selinux.NETLINK_IP6FW_SOCKET__GETATTR -NETLINK_IP6FW_SOCKET__SETATTR = _selinux.NETLINK_IP6FW_SOCKET__SETATTR -NETLINK_IP6FW_SOCKET__LOCK = _selinux.NETLINK_IP6FW_SOCKET__LOCK -NETLINK_IP6FW_SOCKET__RELABELFROM = _selinux.NETLINK_IP6FW_SOCKET__RELABELFROM -NETLINK_IP6FW_SOCKET__RELABELTO = _selinux.NETLINK_IP6FW_SOCKET__RELABELTO -NETLINK_IP6FW_SOCKET__APPEND = _selinux.NETLINK_IP6FW_SOCKET__APPEND -NETLINK_IP6FW_SOCKET__BIND = _selinux.NETLINK_IP6FW_SOCKET__BIND -NETLINK_IP6FW_SOCKET__CONNECT = _selinux.NETLINK_IP6FW_SOCKET__CONNECT -NETLINK_IP6FW_SOCKET__LISTEN = _selinux.NETLINK_IP6FW_SOCKET__LISTEN -NETLINK_IP6FW_SOCKET__ACCEPT = _selinux.NETLINK_IP6FW_SOCKET__ACCEPT -NETLINK_IP6FW_SOCKET__GETOPT = _selinux.NETLINK_IP6FW_SOCKET__GETOPT -NETLINK_IP6FW_SOCKET__SETOPT = _selinux.NETLINK_IP6FW_SOCKET__SETOPT -NETLINK_IP6FW_SOCKET__SHUTDOWN = _selinux.NETLINK_IP6FW_SOCKET__SHUTDOWN -NETLINK_IP6FW_SOCKET__RECVFROM = _selinux.NETLINK_IP6FW_SOCKET__RECVFROM -NETLINK_IP6FW_SOCKET__SENDTO = _selinux.NETLINK_IP6FW_SOCKET__SENDTO -NETLINK_IP6FW_SOCKET__RECV_MSG = _selinux.NETLINK_IP6FW_SOCKET__RECV_MSG -NETLINK_IP6FW_SOCKET__SEND_MSG = _selinux.NETLINK_IP6FW_SOCKET__SEND_MSG -NETLINK_IP6FW_SOCKET__NAME_BIND = _selinux.NETLINK_IP6FW_SOCKET__NAME_BIND -NETLINK_IP6FW_SOCKET__NLMSG_READ = _selinux.NETLINK_IP6FW_SOCKET__NLMSG_READ -NETLINK_IP6FW_SOCKET__NLMSG_WRITE = _selinux.NETLINK_IP6FW_SOCKET__NLMSG_WRITE -NETLINK_DNRT_SOCKET__IOCTL = _selinux.NETLINK_DNRT_SOCKET__IOCTL -NETLINK_DNRT_SOCKET__READ = _selinux.NETLINK_DNRT_SOCKET__READ -NETLINK_DNRT_SOCKET__WRITE = _selinux.NETLINK_DNRT_SOCKET__WRITE -NETLINK_DNRT_SOCKET__CREATE = _selinux.NETLINK_DNRT_SOCKET__CREATE -NETLINK_DNRT_SOCKET__GETATTR = _selinux.NETLINK_DNRT_SOCKET__GETATTR -NETLINK_DNRT_SOCKET__SETATTR = _selinux.NETLINK_DNRT_SOCKET__SETATTR -NETLINK_DNRT_SOCKET__LOCK = _selinux.NETLINK_DNRT_SOCKET__LOCK -NETLINK_DNRT_SOCKET__RELABELFROM = _selinux.NETLINK_DNRT_SOCKET__RELABELFROM -NETLINK_DNRT_SOCKET__RELABELTO = _selinux.NETLINK_DNRT_SOCKET__RELABELTO -NETLINK_DNRT_SOCKET__APPEND = _selinux.NETLINK_DNRT_SOCKET__APPEND -NETLINK_DNRT_SOCKET__BIND = _selinux.NETLINK_DNRT_SOCKET__BIND -NETLINK_DNRT_SOCKET__CONNECT = _selinux.NETLINK_DNRT_SOCKET__CONNECT -NETLINK_DNRT_SOCKET__LISTEN = _selinux.NETLINK_DNRT_SOCKET__LISTEN -NETLINK_DNRT_SOCKET__ACCEPT = _selinux.NETLINK_DNRT_SOCKET__ACCEPT -NETLINK_DNRT_SOCKET__GETOPT = _selinux.NETLINK_DNRT_SOCKET__GETOPT -NETLINK_DNRT_SOCKET__SETOPT = _selinux.NETLINK_DNRT_SOCKET__SETOPT -NETLINK_DNRT_SOCKET__SHUTDOWN = _selinux.NETLINK_DNRT_SOCKET__SHUTDOWN -NETLINK_DNRT_SOCKET__RECVFROM = _selinux.NETLINK_DNRT_SOCKET__RECVFROM -NETLINK_DNRT_SOCKET__SENDTO = _selinux.NETLINK_DNRT_SOCKET__SENDTO -NETLINK_DNRT_SOCKET__RECV_MSG = _selinux.NETLINK_DNRT_SOCKET__RECV_MSG -NETLINK_DNRT_SOCKET__SEND_MSG = _selinux.NETLINK_DNRT_SOCKET__SEND_MSG -NETLINK_DNRT_SOCKET__NAME_BIND = _selinux.NETLINK_DNRT_SOCKET__NAME_BIND -DBUS__ACQUIRE_SVC = _selinux.DBUS__ACQUIRE_SVC -DBUS__SEND_MSG = _selinux.DBUS__SEND_MSG -NSCD__GETPWD = _selinux.NSCD__GETPWD -NSCD__GETGRP = _selinux.NSCD__GETGRP -NSCD__GETHOST = _selinux.NSCD__GETHOST -NSCD__GETSTAT = _selinux.NSCD__GETSTAT -NSCD__ADMIN = _selinux.NSCD__ADMIN -NSCD__SHMEMPWD = _selinux.NSCD__SHMEMPWD -NSCD__SHMEMGRP = _selinux.NSCD__SHMEMGRP -NSCD__SHMEMHOST = _selinux.NSCD__SHMEMHOST -NSCD__GETSERV = _selinux.NSCD__GETSERV -NSCD__SHMEMSERV = _selinux.NSCD__SHMEMSERV -ASSOCIATION__SENDTO = _selinux.ASSOCIATION__SENDTO -ASSOCIATION__RECVFROM = _selinux.ASSOCIATION__RECVFROM -ASSOCIATION__SETCONTEXT = _selinux.ASSOCIATION__SETCONTEXT -ASSOCIATION__POLMATCH = _selinux.ASSOCIATION__POLMATCH -NETLINK_KOBJECT_UEVENT_SOCKET__IOCTL = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__IOCTL -NETLINK_KOBJECT_UEVENT_SOCKET__READ = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__READ -NETLINK_KOBJECT_UEVENT_SOCKET__WRITE = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__WRITE -NETLINK_KOBJECT_UEVENT_SOCKET__CREATE = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__CREATE -NETLINK_KOBJECT_UEVENT_SOCKET__GETATTR = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__GETATTR -NETLINK_KOBJECT_UEVENT_SOCKET__SETATTR = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SETATTR -NETLINK_KOBJECT_UEVENT_SOCKET__LOCK = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__LOCK -NETLINK_KOBJECT_UEVENT_SOCKET__RELABELFROM = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RELABELFROM -NETLINK_KOBJECT_UEVENT_SOCKET__RELABELTO = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RELABELTO -NETLINK_KOBJECT_UEVENT_SOCKET__APPEND = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__APPEND -NETLINK_KOBJECT_UEVENT_SOCKET__BIND = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__BIND -NETLINK_KOBJECT_UEVENT_SOCKET__CONNECT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__CONNECT -NETLINK_KOBJECT_UEVENT_SOCKET__LISTEN = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__LISTEN -NETLINK_KOBJECT_UEVENT_SOCKET__ACCEPT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__ACCEPT -NETLINK_KOBJECT_UEVENT_SOCKET__GETOPT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__GETOPT -NETLINK_KOBJECT_UEVENT_SOCKET__SETOPT = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SETOPT -NETLINK_KOBJECT_UEVENT_SOCKET__SHUTDOWN = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SHUTDOWN -NETLINK_KOBJECT_UEVENT_SOCKET__RECVFROM = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RECVFROM -NETLINK_KOBJECT_UEVENT_SOCKET__SENDTO = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SENDTO -NETLINK_KOBJECT_UEVENT_SOCKET__RECV_MSG = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__RECV_MSG -NETLINK_KOBJECT_UEVENT_SOCKET__SEND_MSG = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__SEND_MSG -NETLINK_KOBJECT_UEVENT_SOCKET__NAME_BIND = _selinux.NETLINK_KOBJECT_UEVENT_SOCKET__NAME_BIND -APPLETALK_SOCKET__IOCTL = _selinux.APPLETALK_SOCKET__IOCTL -APPLETALK_SOCKET__READ = _selinux.APPLETALK_SOCKET__READ -APPLETALK_SOCKET__WRITE = _selinux.APPLETALK_SOCKET__WRITE -APPLETALK_SOCKET__CREATE = _selinux.APPLETALK_SOCKET__CREATE -APPLETALK_SOCKET__GETATTR = _selinux.APPLETALK_SOCKET__GETATTR -APPLETALK_SOCKET__SETATTR = _selinux.APPLETALK_SOCKET__SETATTR -APPLETALK_SOCKET__LOCK = _selinux.APPLETALK_SOCKET__LOCK -APPLETALK_SOCKET__RELABELFROM = _selinux.APPLETALK_SOCKET__RELABELFROM -APPLETALK_SOCKET__RELABELTO = _selinux.APPLETALK_SOCKET__RELABELTO -APPLETALK_SOCKET__APPEND = _selinux.APPLETALK_SOCKET__APPEND -APPLETALK_SOCKET__BIND = _selinux.APPLETALK_SOCKET__BIND -APPLETALK_SOCKET__CONNECT = _selinux.APPLETALK_SOCKET__CONNECT -APPLETALK_SOCKET__LISTEN = _selinux.APPLETALK_SOCKET__LISTEN -APPLETALK_SOCKET__ACCEPT = _selinux.APPLETALK_SOCKET__ACCEPT -APPLETALK_SOCKET__GETOPT = _selinux.APPLETALK_SOCKET__GETOPT -APPLETALK_SOCKET__SETOPT = _selinux.APPLETALK_SOCKET__SETOPT -APPLETALK_SOCKET__SHUTDOWN = _selinux.APPLETALK_SOCKET__SHUTDOWN -APPLETALK_SOCKET__RECVFROM = _selinux.APPLETALK_SOCKET__RECVFROM -APPLETALK_SOCKET__SENDTO = _selinux.APPLETALK_SOCKET__SENDTO -APPLETALK_SOCKET__RECV_MSG = _selinux.APPLETALK_SOCKET__RECV_MSG -APPLETALK_SOCKET__SEND_MSG = _selinux.APPLETALK_SOCKET__SEND_MSG -APPLETALK_SOCKET__NAME_BIND = _selinux.APPLETALK_SOCKET__NAME_BIND -PACKET__SEND = _selinux.PACKET__SEND -PACKET__RECV = _selinux.PACKET__RECV -PACKET__RELABELTO = _selinux.PACKET__RELABELTO -PACKET__FLOW_IN = _selinux.PACKET__FLOW_IN -PACKET__FLOW_OUT = _selinux.PACKET__FLOW_OUT -PACKET__FORWARD_IN = _selinux.PACKET__FORWARD_IN -PACKET__FORWARD_OUT = _selinux.PACKET__FORWARD_OUT -KEY__VIEW = _selinux.KEY__VIEW -KEY__READ = _selinux.KEY__READ -KEY__WRITE = _selinux.KEY__WRITE -KEY__SEARCH = _selinux.KEY__SEARCH -KEY__LINK = _selinux.KEY__LINK -KEY__SETATTR = _selinux.KEY__SETATTR -KEY__CREATE = _selinux.KEY__CREATE -CONTEXT__TRANSLATE = _selinux.CONTEXT__TRANSLATE -CONTEXT__CONTAINS = _selinux.CONTEXT__CONTAINS -DCCP_SOCKET__IOCTL = _selinux.DCCP_SOCKET__IOCTL -DCCP_SOCKET__READ = _selinux.DCCP_SOCKET__READ -DCCP_SOCKET__WRITE = _selinux.DCCP_SOCKET__WRITE -DCCP_SOCKET__CREATE = _selinux.DCCP_SOCKET__CREATE -DCCP_SOCKET__GETATTR = _selinux.DCCP_SOCKET__GETATTR -DCCP_SOCKET__SETATTR = _selinux.DCCP_SOCKET__SETATTR -DCCP_SOCKET__LOCK = _selinux.DCCP_SOCKET__LOCK -DCCP_SOCKET__RELABELFROM = _selinux.DCCP_SOCKET__RELABELFROM -DCCP_SOCKET__RELABELTO = _selinux.DCCP_SOCKET__RELABELTO -DCCP_SOCKET__APPEND = _selinux.DCCP_SOCKET__APPEND -DCCP_SOCKET__BIND = _selinux.DCCP_SOCKET__BIND -DCCP_SOCKET__CONNECT = _selinux.DCCP_SOCKET__CONNECT -DCCP_SOCKET__LISTEN = _selinux.DCCP_SOCKET__LISTEN -DCCP_SOCKET__ACCEPT = _selinux.DCCP_SOCKET__ACCEPT -DCCP_SOCKET__GETOPT = _selinux.DCCP_SOCKET__GETOPT -DCCP_SOCKET__SETOPT = _selinux.DCCP_SOCKET__SETOPT -DCCP_SOCKET__SHUTDOWN = _selinux.DCCP_SOCKET__SHUTDOWN -DCCP_SOCKET__RECVFROM = _selinux.DCCP_SOCKET__RECVFROM -DCCP_SOCKET__SENDTO = _selinux.DCCP_SOCKET__SENDTO -DCCP_SOCKET__RECV_MSG = _selinux.DCCP_SOCKET__RECV_MSG -DCCP_SOCKET__SEND_MSG = _selinux.DCCP_SOCKET__SEND_MSG -DCCP_SOCKET__NAME_BIND = _selinux.DCCP_SOCKET__NAME_BIND -DCCP_SOCKET__NODE_BIND = _selinux.DCCP_SOCKET__NODE_BIND -DCCP_SOCKET__NAME_CONNECT = _selinux.DCCP_SOCKET__NAME_CONNECT -MEMPROTECT__MMAP_ZERO = _selinux.MEMPROTECT__MMAP_ZERO -DB_DATABASE__CREATE = _selinux.DB_DATABASE__CREATE -DB_DATABASE__DROP = _selinux.DB_DATABASE__DROP -DB_DATABASE__GETATTR = _selinux.DB_DATABASE__GETATTR -DB_DATABASE__SETATTR = _selinux.DB_DATABASE__SETATTR -DB_DATABASE__RELABELFROM = _selinux.DB_DATABASE__RELABELFROM -DB_DATABASE__RELABELTO = _selinux.DB_DATABASE__RELABELTO -DB_DATABASE__ACCESS = _selinux.DB_DATABASE__ACCESS -DB_DATABASE__INSTALL_MODULE = _selinux.DB_DATABASE__INSTALL_MODULE -DB_DATABASE__LOAD_MODULE = _selinux.DB_DATABASE__LOAD_MODULE -DB_DATABASE__GET_PARAM = _selinux.DB_DATABASE__GET_PARAM -DB_DATABASE__SET_PARAM = _selinux.DB_DATABASE__SET_PARAM -DB_TABLE__CREATE = _selinux.DB_TABLE__CREATE -DB_TABLE__DROP = _selinux.DB_TABLE__DROP -DB_TABLE__GETATTR = _selinux.DB_TABLE__GETATTR -DB_TABLE__SETATTR = _selinux.DB_TABLE__SETATTR -DB_TABLE__RELABELFROM = _selinux.DB_TABLE__RELABELFROM -DB_TABLE__RELABELTO = _selinux.DB_TABLE__RELABELTO -DB_TABLE__USE = _selinux.DB_TABLE__USE -DB_TABLE__SELECT = _selinux.DB_TABLE__SELECT -DB_TABLE__UPDATE = _selinux.DB_TABLE__UPDATE -DB_TABLE__INSERT = _selinux.DB_TABLE__INSERT -DB_TABLE__DELETE = _selinux.DB_TABLE__DELETE -DB_TABLE__LOCK = _selinux.DB_TABLE__LOCK -DB_PROCEDURE__CREATE = _selinux.DB_PROCEDURE__CREATE -DB_PROCEDURE__DROP = _selinux.DB_PROCEDURE__DROP -DB_PROCEDURE__GETATTR = _selinux.DB_PROCEDURE__GETATTR -DB_PROCEDURE__SETATTR = _selinux.DB_PROCEDURE__SETATTR -DB_PROCEDURE__RELABELFROM = _selinux.DB_PROCEDURE__RELABELFROM -DB_PROCEDURE__RELABELTO = _selinux.DB_PROCEDURE__RELABELTO -DB_PROCEDURE__EXECUTE = _selinux.DB_PROCEDURE__EXECUTE -DB_PROCEDURE__ENTRYPOINT = _selinux.DB_PROCEDURE__ENTRYPOINT -DB_COLUMN__CREATE = _selinux.DB_COLUMN__CREATE -DB_COLUMN__DROP = _selinux.DB_COLUMN__DROP -DB_COLUMN__GETATTR = _selinux.DB_COLUMN__GETATTR -DB_COLUMN__SETATTR = _selinux.DB_COLUMN__SETATTR -DB_COLUMN__RELABELFROM = _selinux.DB_COLUMN__RELABELFROM -DB_COLUMN__RELABELTO = _selinux.DB_COLUMN__RELABELTO -DB_COLUMN__USE = _selinux.DB_COLUMN__USE -DB_COLUMN__SELECT = _selinux.DB_COLUMN__SELECT -DB_COLUMN__UPDATE = _selinux.DB_COLUMN__UPDATE -DB_COLUMN__INSERT = _selinux.DB_COLUMN__INSERT -DB_TUPLE__RELABELFROM = _selinux.DB_TUPLE__RELABELFROM -DB_TUPLE__RELABELTO = _selinux.DB_TUPLE__RELABELTO -DB_TUPLE__USE = _selinux.DB_TUPLE__USE -DB_TUPLE__SELECT = _selinux.DB_TUPLE__SELECT -DB_TUPLE__UPDATE = _selinux.DB_TUPLE__UPDATE -DB_TUPLE__INSERT = _selinux.DB_TUPLE__INSERT -DB_TUPLE__DELETE = _selinux.DB_TUPLE__DELETE -DB_BLOB__CREATE = _selinux.DB_BLOB__CREATE -DB_BLOB__DROP = _selinux.DB_BLOB__DROP -DB_BLOB__GETATTR = _selinux.DB_BLOB__GETATTR -DB_BLOB__SETATTR = _selinux.DB_BLOB__SETATTR -DB_BLOB__RELABELFROM = _selinux.DB_BLOB__RELABELFROM -DB_BLOB__RELABELTO = _selinux.DB_BLOB__RELABELTO -DB_BLOB__READ = _selinux.DB_BLOB__READ -DB_BLOB__WRITE = _selinux.DB_BLOB__WRITE -DB_BLOB__IMPORT = _selinux.DB_BLOB__IMPORT -DB_BLOB__EXPORT = _selinux.DB_BLOB__EXPORT -PEER__RECV = _selinux.PEER__RECV -X_APPLICATION_DATA__PASTE = _selinux.X_APPLICATION_DATA__PASTE -X_APPLICATION_DATA__PASTE_AFTER_CONFIRM = _selinux.X_APPLICATION_DATA__PASTE_AFTER_CONFIRM -X_APPLICATION_DATA__COPY = _selinux.X_APPLICATION_DATA__COPY -class context_s_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, context_s_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, context_s_t, name) - __repr__ = _swig_repr - __swig_setmethods__["ptr"] = _selinux.context_s_t_ptr_set - __swig_getmethods__["ptr"] = _selinux.context_s_t_ptr_get - if _newclass:ptr = _swig_property(_selinux.context_s_t_ptr_get, _selinux.context_s_t_ptr_set) - def __init__(self): - this = _selinux.new_context_s_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_context_s_t - __del__ = lambda self : None; -context_s_t_swigregister = _selinux.context_s_t_swigregister -context_s_t_swigregister(context_s_t) - - -def context_new(*args): - return _selinux.context_new(*args) -context_new = _selinux.context_new - -def context_str(*args): - return _selinux.context_str(*args) -context_str = _selinux.context_str - -def context_free(*args): - return _selinux.context_free(*args) -context_free = _selinux.context_free - -def context_type_get(*args): - return _selinux.context_type_get(*args) -context_type_get = _selinux.context_type_get - -def context_range_get(*args): - return _selinux.context_range_get(*args) -context_range_get = _selinux.context_range_get - -def context_role_get(*args): - return _selinux.context_role_get(*args) -context_role_get = _selinux.context_role_get - -def context_user_get(*args): - return _selinux.context_user_get(*args) -context_user_get = _selinux.context_user_get - -def context_type_set(*args): - return _selinux.context_type_set(*args) -context_type_set = _selinux.context_type_set - -def context_range_set(*args): - return _selinux.context_range_set(*args) -context_range_set = _selinux.context_range_set - -def context_role_set(*args): - return _selinux.context_role_set(*args) -context_role_set = _selinux.context_role_set - -def context_user_set(*args): - return _selinux.context_user_set(*args) -context_user_set = _selinux.context_user_set -SECCLASS_SECURITY = _selinux.SECCLASS_SECURITY -SECCLASS_PROCESS = _selinux.SECCLASS_PROCESS -SECCLASS_SYSTEM = _selinux.SECCLASS_SYSTEM -SECCLASS_CAPABILITY = _selinux.SECCLASS_CAPABILITY -SECCLASS_FILESYSTEM = _selinux.SECCLASS_FILESYSTEM -SECCLASS_FILE = _selinux.SECCLASS_FILE -SECCLASS_DIR = _selinux.SECCLASS_DIR -SECCLASS_FD = _selinux.SECCLASS_FD -SECCLASS_LNK_FILE = _selinux.SECCLASS_LNK_FILE -SECCLASS_CHR_FILE = _selinux.SECCLASS_CHR_FILE -SECCLASS_BLK_FILE = _selinux.SECCLASS_BLK_FILE -SECCLASS_SOCK_FILE = _selinux.SECCLASS_SOCK_FILE -SECCLASS_FIFO_FILE = _selinux.SECCLASS_FIFO_FILE -SECCLASS_SOCKET = _selinux.SECCLASS_SOCKET -SECCLASS_TCP_SOCKET = _selinux.SECCLASS_TCP_SOCKET -SECCLASS_UDP_SOCKET = _selinux.SECCLASS_UDP_SOCKET -SECCLASS_RAWIP_SOCKET = _selinux.SECCLASS_RAWIP_SOCKET -SECCLASS_NODE = _selinux.SECCLASS_NODE -SECCLASS_NETIF = _selinux.SECCLASS_NETIF -SECCLASS_NETLINK_SOCKET = _selinux.SECCLASS_NETLINK_SOCKET -SECCLASS_PACKET_SOCKET = _selinux.SECCLASS_PACKET_SOCKET -SECCLASS_KEY_SOCKET = _selinux.SECCLASS_KEY_SOCKET -SECCLASS_UNIX_STREAM_SOCKET = _selinux.SECCLASS_UNIX_STREAM_SOCKET -SECCLASS_UNIX_DGRAM_SOCKET = _selinux.SECCLASS_UNIX_DGRAM_SOCKET -SECCLASS_SEM = _selinux.SECCLASS_SEM -SECCLASS_MSG = _selinux.SECCLASS_MSG -SECCLASS_MSGQ = _selinux.SECCLASS_MSGQ -SECCLASS_SHM = _selinux.SECCLASS_SHM -SECCLASS_IPC = _selinux.SECCLASS_IPC -SECCLASS_PASSWD = _selinux.SECCLASS_PASSWD -SECCLASS_X_DRAWABLE = _selinux.SECCLASS_X_DRAWABLE -SECCLASS_X_SCREEN = _selinux.SECCLASS_X_SCREEN -SECCLASS_X_GC = _selinux.SECCLASS_X_GC -SECCLASS_X_FONT = _selinux.SECCLASS_X_FONT -SECCLASS_X_COLORMAP = _selinux.SECCLASS_X_COLORMAP -SECCLASS_X_PROPERTY = _selinux.SECCLASS_X_PROPERTY -SECCLASS_X_SELECTION = _selinux.SECCLASS_X_SELECTION -SECCLASS_X_CURSOR = _selinux.SECCLASS_X_CURSOR -SECCLASS_X_CLIENT = _selinux.SECCLASS_X_CLIENT -SECCLASS_X_DEVICE = _selinux.SECCLASS_X_DEVICE -SECCLASS_X_SERVER = _selinux.SECCLASS_X_SERVER -SECCLASS_X_EXTENSION = _selinux.SECCLASS_X_EXTENSION -SECCLASS_NETLINK_ROUTE_SOCKET = _selinux.SECCLASS_NETLINK_ROUTE_SOCKET -SECCLASS_NETLINK_FIREWALL_SOCKET = _selinux.SECCLASS_NETLINK_FIREWALL_SOCKET -SECCLASS_NETLINK_TCPDIAG_SOCKET = _selinux.SECCLASS_NETLINK_TCPDIAG_SOCKET -SECCLASS_NETLINK_NFLOG_SOCKET = _selinux.SECCLASS_NETLINK_NFLOG_SOCKET -SECCLASS_NETLINK_XFRM_SOCKET = _selinux.SECCLASS_NETLINK_XFRM_SOCKET -SECCLASS_NETLINK_SELINUX_SOCKET = _selinux.SECCLASS_NETLINK_SELINUX_SOCKET -SECCLASS_NETLINK_AUDIT_SOCKET = _selinux.SECCLASS_NETLINK_AUDIT_SOCKET -SECCLASS_NETLINK_IP6FW_SOCKET = _selinux.SECCLASS_NETLINK_IP6FW_SOCKET -SECCLASS_NETLINK_DNRT_SOCKET = _selinux.SECCLASS_NETLINK_DNRT_SOCKET -SECCLASS_DBUS = _selinux.SECCLASS_DBUS -SECCLASS_NSCD = _selinux.SECCLASS_NSCD -SECCLASS_ASSOCIATION = _selinux.SECCLASS_ASSOCIATION -SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET = _selinux.SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET -SECCLASS_APPLETALK_SOCKET = _selinux.SECCLASS_APPLETALK_SOCKET -SECCLASS_PACKET = _selinux.SECCLASS_PACKET -SECCLASS_KEY = _selinux.SECCLASS_KEY -SECCLASS_CONTEXT = _selinux.SECCLASS_CONTEXT -SECCLASS_DCCP_SOCKET = _selinux.SECCLASS_DCCP_SOCKET -SECCLASS_MEMPROTECT = _selinux.SECCLASS_MEMPROTECT -SECCLASS_DB_DATABASE = _selinux.SECCLASS_DB_DATABASE -SECCLASS_DB_TABLE = _selinux.SECCLASS_DB_TABLE -SECCLASS_DB_PROCEDURE = _selinux.SECCLASS_DB_PROCEDURE -SECCLASS_DB_COLUMN = _selinux.SECCLASS_DB_COLUMN -SECCLASS_DB_TUPLE = _selinux.SECCLASS_DB_TUPLE -SECCLASS_DB_BLOB = _selinux.SECCLASS_DB_BLOB -SECCLASS_PEER = _selinux.SECCLASS_PEER -SECCLASS_CAPABILITY2 = _selinux.SECCLASS_CAPABILITY2 -SECCLASS_X_RESOURCE = _selinux.SECCLASS_X_RESOURCE -SECCLASS_X_EVENT = _selinux.SECCLASS_X_EVENT -SECCLASS_X_SYNTHETIC_EVENT = _selinux.SECCLASS_X_SYNTHETIC_EVENT -SECCLASS_X_APPLICATION_DATA = _selinux.SECCLASS_X_APPLICATION_DATA -SECINITSID_KERNEL = _selinux.SECINITSID_KERNEL -SECINITSID_SECURITY = _selinux.SECINITSID_SECURITY -SECINITSID_UNLABELED = _selinux.SECINITSID_UNLABELED -SECINITSID_FS = _selinux.SECINITSID_FS -SECINITSID_FILE = _selinux.SECINITSID_FILE -SECINITSID_FILE_LABELS = _selinux.SECINITSID_FILE_LABELS -SECINITSID_INIT = _selinux.SECINITSID_INIT -SECINITSID_ANY_SOCKET = _selinux.SECINITSID_ANY_SOCKET -SECINITSID_PORT = _selinux.SECINITSID_PORT -SECINITSID_NETIF = _selinux.SECINITSID_NETIF -SECINITSID_NETMSG = _selinux.SECINITSID_NETMSG -SECINITSID_NODE = _selinux.SECINITSID_NODE -SECINITSID_IGMP_PACKET = _selinux.SECINITSID_IGMP_PACKET -SECINITSID_ICMP_SOCKET = _selinux.SECINITSID_ICMP_SOCKET -SECINITSID_TCP_SOCKET = _selinux.SECINITSID_TCP_SOCKET -SECINITSID_SYSCTL_MODPROBE = _selinux.SECINITSID_SYSCTL_MODPROBE -SECINITSID_SYSCTL = _selinux.SECINITSID_SYSCTL -SECINITSID_SYSCTL_FS = _selinux.SECINITSID_SYSCTL_FS -SECINITSID_SYSCTL_KERNEL = _selinux.SECINITSID_SYSCTL_KERNEL -SECINITSID_SYSCTL_NET = _selinux.SECINITSID_SYSCTL_NET -SECINITSID_SYSCTL_NET_UNIX = _selinux.SECINITSID_SYSCTL_NET_UNIX -SECINITSID_SYSCTL_VM = _selinux.SECINITSID_SYSCTL_VM -SECINITSID_SYSCTL_DEV = _selinux.SECINITSID_SYSCTL_DEV -SECINITSID_KMOD = _selinux.SECINITSID_KMOD -SECINITSID_POLICY = _selinux.SECINITSID_POLICY -SECINITSID_SCMP_PACKET = _selinux.SECINITSID_SCMP_PACKET -SECINITSID_DEVNULL = _selinux.SECINITSID_DEVNULL -SECINITSID_NUM = _selinux.SECINITSID_NUM -SELINUX_DEFAULTUSER = _selinux.SELINUX_DEFAULTUSER - -def get_ordered_context_list(*args): - return _selinux.get_ordered_context_list(*args) -get_ordered_context_list = _selinux.get_ordered_context_list - -def get_ordered_context_list_with_level(*args): - return _selinux.get_ordered_context_list_with_level(*args) -get_ordered_context_list_with_level = _selinux.get_ordered_context_list_with_level - -def get_default_context(*args): - return _selinux.get_default_context(*args) -get_default_context = _selinux.get_default_context - -def get_default_context_with_level(*args): - return _selinux.get_default_context_with_level(*args) -get_default_context_with_level = _selinux.get_default_context_with_level - -def get_default_context_with_role(*args): - return _selinux.get_default_context_with_role(*args) -get_default_context_with_role = _selinux.get_default_context_with_role - -def get_default_context_with_rolelevel(*args): - return _selinux.get_default_context_with_rolelevel(*args) -get_default_context_with_rolelevel = _selinux.get_default_context_with_rolelevel - -def query_user_context(): - return _selinux.query_user_context() -query_user_context = _selinux.query_user_context - -def manual_user_enter_context(*args): - return _selinux.manual_user_enter_context(*args) -manual_user_enter_context = _selinux.manual_user_enter_context - -def selinux_default_type_path(): - return _selinux.selinux_default_type_path() -selinux_default_type_path = _selinux.selinux_default_type_path - -def get_default_type(*args): - return _selinux.get_default_type(*args) -get_default_type = _selinux.get_default_type -SELABEL_CTX_FILE = _selinux.SELABEL_CTX_FILE -SELABEL_CTX_MEDIA = _selinux.SELABEL_CTX_MEDIA -SELABEL_CTX_X = _selinux.SELABEL_CTX_X -SELABEL_CTX_DB = _selinux.SELABEL_CTX_DB -SELABEL_CTX_ANDROID_PROP = _selinux.SELABEL_CTX_ANDROID_PROP -SELABEL_OPT_UNUSED = _selinux.SELABEL_OPT_UNUSED -SELABEL_OPT_VALIDATE = _selinux.SELABEL_OPT_VALIDATE -SELABEL_OPT_BASEONLY = _selinux.SELABEL_OPT_BASEONLY -SELABEL_OPT_PATH = _selinux.SELABEL_OPT_PATH -SELABEL_OPT_SUBSET = _selinux.SELABEL_OPT_SUBSET -SELABEL_NOPT = _selinux.SELABEL_NOPT - -def selabel_open(*args): - return _selinux.selabel_open(*args) -selabel_open = _selinux.selabel_open - -def selabel_close(*args): - return _selinux.selabel_close(*args) -selabel_close = _selinux.selabel_close - -def selabel_lookup(*args): - return _selinux.selabel_lookup(*args) -selabel_lookup = _selinux.selabel_lookup - -def selabel_lookup_raw(*args): - return _selinux.selabel_lookup_raw(*args) -selabel_lookup_raw = _selinux.selabel_lookup_raw - -def selabel_partial_match(*args): - return _selinux.selabel_partial_match(*args) -selabel_partial_match = _selinux.selabel_partial_match - -def selabel_lookup_best_match(*args): - return _selinux.selabel_lookup_best_match(*args) -selabel_lookup_best_match = _selinux.selabel_lookup_best_match - -def selabel_lookup_best_match_raw(*args): - return _selinux.selabel_lookup_best_match_raw(*args) -selabel_lookup_best_match_raw = _selinux.selabel_lookup_best_match_raw - -def selabel_stats(*args): - return _selinux.selabel_stats(*args) -selabel_stats = _selinux.selabel_stats -SELABEL_X_PROP = _selinux.SELABEL_X_PROP -SELABEL_X_EXT = _selinux.SELABEL_X_EXT -SELABEL_X_CLIENT = _selinux.SELABEL_X_CLIENT -SELABEL_X_EVENT = _selinux.SELABEL_X_EVENT -SELABEL_X_SELN = _selinux.SELABEL_X_SELN -SELABEL_X_POLYPROP = _selinux.SELABEL_X_POLYPROP -SELABEL_X_POLYSELN = _selinux.SELABEL_X_POLYSELN -SELABEL_DB_DATABASE = _selinux.SELABEL_DB_DATABASE -SELABEL_DB_SCHEMA = _selinux.SELABEL_DB_SCHEMA -SELABEL_DB_TABLE = _selinux.SELABEL_DB_TABLE -SELABEL_DB_COLUMN = _selinux.SELABEL_DB_COLUMN -SELABEL_DB_SEQUENCE = _selinux.SELABEL_DB_SEQUENCE -SELABEL_DB_VIEW = _selinux.SELABEL_DB_VIEW -SELABEL_DB_PROCEDURE = _selinux.SELABEL_DB_PROCEDURE -SELABEL_DB_BLOB = _selinux.SELABEL_DB_BLOB -SELABEL_DB_TUPLE = _selinux.SELABEL_DB_TUPLE -SELABEL_DB_LANGUAGE = _selinux.SELABEL_DB_LANGUAGE -SELABEL_DB_EXCEPTION = _selinux.SELABEL_DB_EXCEPTION -SELABEL_DB_DATATYPE = _selinux.SELABEL_DB_DATATYPE - -def is_selinux_enabled(): - return _selinux.is_selinux_enabled() -is_selinux_enabled = _selinux.is_selinux_enabled - -def is_selinux_mls_enabled(): - return _selinux.is_selinux_mls_enabled() -is_selinux_mls_enabled = _selinux.is_selinux_mls_enabled - -def getcon(): - return _selinux.getcon() -getcon = _selinux.getcon - -def getcon_raw(): - return _selinux.getcon_raw() -getcon_raw = _selinux.getcon_raw - -def setcon(*args): - return _selinux.setcon(*args) -setcon = _selinux.setcon - -def setcon_raw(*args): - return _selinux.setcon_raw(*args) -setcon_raw = _selinux.setcon_raw - -def getpidcon(*args): - return _selinux.getpidcon(*args) -getpidcon = _selinux.getpidcon - -def getpidcon_raw(*args): - return _selinux.getpidcon_raw(*args) -getpidcon_raw = _selinux.getpidcon_raw - -def getprevcon(): - return _selinux.getprevcon() -getprevcon = _selinux.getprevcon - -def getprevcon_raw(): - return _selinux.getprevcon_raw() -getprevcon_raw = _selinux.getprevcon_raw - -def getexeccon(): - return _selinux.getexeccon() -getexeccon = _selinux.getexeccon - -def getexeccon_raw(): - return _selinux.getexeccon_raw() -getexeccon_raw = _selinux.getexeccon_raw - -def setexeccon(*args): - return _selinux.setexeccon(*args) -setexeccon = _selinux.setexeccon - -def setexeccon_raw(*args): - return _selinux.setexeccon_raw(*args) -setexeccon_raw = _selinux.setexeccon_raw - -def getfscreatecon(): - return _selinux.getfscreatecon() -getfscreatecon = _selinux.getfscreatecon - -def getfscreatecon_raw(): - return _selinux.getfscreatecon_raw() -getfscreatecon_raw = _selinux.getfscreatecon_raw - -def setfscreatecon(*args): - return _selinux.setfscreatecon(*args) -setfscreatecon = _selinux.setfscreatecon - -def setfscreatecon_raw(*args): - return _selinux.setfscreatecon_raw(*args) -setfscreatecon_raw = _selinux.setfscreatecon_raw - -def getkeycreatecon(): - return _selinux.getkeycreatecon() -getkeycreatecon = _selinux.getkeycreatecon - -def getkeycreatecon_raw(): - return _selinux.getkeycreatecon_raw() -getkeycreatecon_raw = _selinux.getkeycreatecon_raw - -def setkeycreatecon(*args): - return _selinux.setkeycreatecon(*args) -setkeycreatecon = _selinux.setkeycreatecon - -def setkeycreatecon_raw(*args): - return _selinux.setkeycreatecon_raw(*args) -setkeycreatecon_raw = _selinux.setkeycreatecon_raw - -def getsockcreatecon(): - return _selinux.getsockcreatecon() -getsockcreatecon = _selinux.getsockcreatecon - -def getsockcreatecon_raw(): - return _selinux.getsockcreatecon_raw() -getsockcreatecon_raw = _selinux.getsockcreatecon_raw - -def setsockcreatecon(*args): - return _selinux.setsockcreatecon(*args) -setsockcreatecon = _selinux.setsockcreatecon - -def setsockcreatecon_raw(*args): - return _selinux.setsockcreatecon_raw(*args) -setsockcreatecon_raw = _selinux.setsockcreatecon_raw - -def getfilecon(*args): - return _selinux.getfilecon(*args) -getfilecon = _selinux.getfilecon - -def getfilecon_raw(*args): - return _selinux.getfilecon_raw(*args) -getfilecon_raw = _selinux.getfilecon_raw - -def lgetfilecon(*args): - return _selinux.lgetfilecon(*args) -lgetfilecon = _selinux.lgetfilecon - -def lgetfilecon_raw(*args): - return _selinux.lgetfilecon_raw(*args) -lgetfilecon_raw = _selinux.lgetfilecon_raw - -def fgetfilecon(*args): - return _selinux.fgetfilecon(*args) -fgetfilecon = _selinux.fgetfilecon - -def fgetfilecon_raw(*args): - return _selinux.fgetfilecon_raw(*args) -fgetfilecon_raw = _selinux.fgetfilecon_raw - -def setfilecon(*args): - return _selinux.setfilecon(*args) -setfilecon = _selinux.setfilecon - -def setfilecon_raw(*args): - return _selinux.setfilecon_raw(*args) -setfilecon_raw = _selinux.setfilecon_raw - -def lsetfilecon(*args): - return _selinux.lsetfilecon(*args) -lsetfilecon = _selinux.lsetfilecon - -def lsetfilecon_raw(*args): - return _selinux.lsetfilecon_raw(*args) -lsetfilecon_raw = _selinux.lsetfilecon_raw - -def fsetfilecon(*args): - return _selinux.fsetfilecon(*args) -fsetfilecon = _selinux.fsetfilecon - -def fsetfilecon_raw(*args): - return _selinux.fsetfilecon_raw(*args) -fsetfilecon_raw = _selinux.fsetfilecon_raw - -def getpeercon(*args): - return _selinux.getpeercon(*args) -getpeercon = _selinux.getpeercon - -def getpeercon_raw(*args): - return _selinux.getpeercon_raw(*args) -getpeercon_raw = _selinux.getpeercon_raw -class av_decision(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, av_decision, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, av_decision, name) - __repr__ = _swig_repr - __swig_setmethods__["allowed"] = _selinux.av_decision_allowed_set - __swig_getmethods__["allowed"] = _selinux.av_decision_allowed_get - if _newclass:allowed = _swig_property(_selinux.av_decision_allowed_get, _selinux.av_decision_allowed_set) - __swig_setmethods__["decided"] = _selinux.av_decision_decided_set - __swig_getmethods__["decided"] = _selinux.av_decision_decided_get - if _newclass:decided = _swig_property(_selinux.av_decision_decided_get, _selinux.av_decision_decided_set) - __swig_setmethods__["auditallow"] = _selinux.av_decision_auditallow_set - __swig_getmethods__["auditallow"] = _selinux.av_decision_auditallow_get - if _newclass:auditallow = _swig_property(_selinux.av_decision_auditallow_get, _selinux.av_decision_auditallow_set) - __swig_setmethods__["auditdeny"] = _selinux.av_decision_auditdeny_set - __swig_getmethods__["auditdeny"] = _selinux.av_decision_auditdeny_get - if _newclass:auditdeny = _swig_property(_selinux.av_decision_auditdeny_get, _selinux.av_decision_auditdeny_set) - __swig_setmethods__["seqno"] = _selinux.av_decision_seqno_set - __swig_getmethods__["seqno"] = _selinux.av_decision_seqno_get - if _newclass:seqno = _swig_property(_selinux.av_decision_seqno_get, _selinux.av_decision_seqno_set) - __swig_setmethods__["flags"] = _selinux.av_decision_flags_set - __swig_getmethods__["flags"] = _selinux.av_decision_flags_get - if _newclass:flags = _swig_property(_selinux.av_decision_flags_get, _selinux.av_decision_flags_set) - def __init__(self): - this = _selinux.new_av_decision() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_av_decision - __del__ = lambda self : None; -av_decision_swigregister = _selinux.av_decision_swigregister -av_decision_swigregister(av_decision) - -SELINUX_AVD_FLAGS_PERMISSIVE = _selinux.SELINUX_AVD_FLAGS_PERMISSIVE -class selinux_opt(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, selinux_opt, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, selinux_opt, name) - __repr__ = _swig_repr - __swig_setmethods__["type"] = _selinux.selinux_opt_type_set - __swig_getmethods__["type"] = _selinux.selinux_opt_type_get - if _newclass:type = _swig_property(_selinux.selinux_opt_type_get, _selinux.selinux_opt_type_set) - __swig_setmethods__["value"] = _selinux.selinux_opt_value_set - __swig_getmethods__["value"] = _selinux.selinux_opt_value_get - if _newclass:value = _swig_property(_selinux.selinux_opt_value_get, _selinux.selinux_opt_value_set) - def __init__(self): - this = _selinux.new_selinux_opt() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_selinux_opt - __del__ = lambda self : None; -selinux_opt_swigregister = _selinux.selinux_opt_swigregister -selinux_opt_swigregister(selinux_opt) - -class selinux_callback(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, selinux_callback, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, selinux_callback, name) - __repr__ = _swig_repr - __swig_setmethods__["func_log"] = _selinux.selinux_callback_func_log_set - __swig_getmethods__["func_log"] = _selinux.selinux_callback_func_log_get - if _newclass:func_log = _swig_property(_selinux.selinux_callback_func_log_get, _selinux.selinux_callback_func_log_set) - __swig_setmethods__["func_audit"] = _selinux.selinux_callback_func_audit_set - __swig_getmethods__["func_audit"] = _selinux.selinux_callback_func_audit_get - if _newclass:func_audit = _swig_property(_selinux.selinux_callback_func_audit_get, _selinux.selinux_callback_func_audit_set) - __swig_setmethods__["func_validate"] = _selinux.selinux_callback_func_validate_set - __swig_getmethods__["func_validate"] = _selinux.selinux_callback_func_validate_get - if _newclass:func_validate = _swig_property(_selinux.selinux_callback_func_validate_get, _selinux.selinux_callback_func_validate_set) - __swig_setmethods__["func_setenforce"] = _selinux.selinux_callback_func_setenforce_set - __swig_getmethods__["func_setenforce"] = _selinux.selinux_callback_func_setenforce_get - if _newclass:func_setenforce = _swig_property(_selinux.selinux_callback_func_setenforce_get, _selinux.selinux_callback_func_setenforce_set) - __swig_setmethods__["func_policyload"] = _selinux.selinux_callback_func_policyload_set - __swig_getmethods__["func_policyload"] = _selinux.selinux_callback_func_policyload_get - if _newclass:func_policyload = _swig_property(_selinux.selinux_callback_func_policyload_get, _selinux.selinux_callback_func_policyload_set) - def __init__(self): - this = _selinux.new_selinux_callback() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_selinux_callback - __del__ = lambda self : None; -selinux_callback_swigregister = _selinux.selinux_callback_swigregister -selinux_callback_swigregister(selinux_callback) - -SELINUX_CB_LOG = _selinux.SELINUX_CB_LOG -SELINUX_CB_AUDIT = _selinux.SELINUX_CB_AUDIT -SELINUX_CB_VALIDATE = _selinux.SELINUX_CB_VALIDATE -SELINUX_CB_SETENFORCE = _selinux.SELINUX_CB_SETENFORCE -SELINUX_CB_POLICYLOAD = _selinux.SELINUX_CB_POLICYLOAD - -def selinux_get_callback(*args): - return _selinux.selinux_get_callback(*args) -selinux_get_callback = _selinux.selinux_get_callback - -def selinux_set_callback(*args): - return _selinux.selinux_set_callback(*args) -selinux_set_callback = _selinux.selinux_set_callback -SELINUX_ERROR = _selinux.SELINUX_ERROR -SELINUX_WARNING = _selinux.SELINUX_WARNING -SELINUX_INFO = _selinux.SELINUX_INFO -SELINUX_AVC = _selinux.SELINUX_AVC -SELINUX_TRANS_DIR = _selinux.SELINUX_TRANS_DIR - -def security_compute_av(*args): - return _selinux.security_compute_av(*args) -security_compute_av = _selinux.security_compute_av - -def security_compute_av_raw(*args): - return _selinux.security_compute_av_raw(*args) -security_compute_av_raw = _selinux.security_compute_av_raw - -def security_compute_av_flags(*args): - return _selinux.security_compute_av_flags(*args) -security_compute_av_flags = _selinux.security_compute_av_flags - -def security_compute_av_flags_raw(*args): - return _selinux.security_compute_av_flags_raw(*args) -security_compute_av_flags_raw = _selinux.security_compute_av_flags_raw - -def security_compute_create(*args): - return _selinux.security_compute_create(*args) -security_compute_create = _selinux.security_compute_create - -def security_compute_create_raw(*args): - return _selinux.security_compute_create_raw(*args) -security_compute_create_raw = _selinux.security_compute_create_raw - -def security_compute_create_name(*args): - return _selinux.security_compute_create_name(*args) -security_compute_create_name = _selinux.security_compute_create_name - -def security_compute_create_name_raw(*args): - return _selinux.security_compute_create_name_raw(*args) -security_compute_create_name_raw = _selinux.security_compute_create_name_raw - -def security_compute_relabel(*args): - return _selinux.security_compute_relabel(*args) -security_compute_relabel = _selinux.security_compute_relabel - -def security_compute_relabel_raw(*args): - return _selinux.security_compute_relabel_raw(*args) -security_compute_relabel_raw = _selinux.security_compute_relabel_raw - -def security_compute_member(*args): - return _selinux.security_compute_member(*args) -security_compute_member = _selinux.security_compute_member - -def security_compute_member_raw(*args): - return _selinux.security_compute_member_raw(*args) -security_compute_member_raw = _selinux.security_compute_member_raw - -def security_compute_user(*args): - return _selinux.security_compute_user(*args) -security_compute_user = _selinux.security_compute_user - -def security_compute_user_raw(*args): - return _selinux.security_compute_user_raw(*args) -security_compute_user_raw = _selinux.security_compute_user_raw - -def security_load_policy(*args): - return _selinux.security_load_policy(*args) -security_load_policy = _selinux.security_load_policy - -def security_get_initial_context(*args): - return _selinux.security_get_initial_context(*args) -security_get_initial_context = _selinux.security_get_initial_context - -def security_get_initial_context_raw(*args): - return _selinux.security_get_initial_context_raw(*args) -security_get_initial_context_raw = _selinux.security_get_initial_context_raw - -def selinux_mkload_policy(*args): - return _selinux.selinux_mkload_policy(*args) -selinux_mkload_policy = _selinux.selinux_mkload_policy - -def selinux_init_load_policy(): - return _selinux.selinux_init_load_policy() -selinux_init_load_policy = _selinux.selinux_init_load_policy -class SELboolean(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, SELboolean, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, SELboolean, name) - __repr__ = _swig_repr - __swig_setmethods__["name"] = _selinux.SELboolean_name_set - __swig_getmethods__["name"] = _selinux.SELboolean_name_get - if _newclass:name = _swig_property(_selinux.SELboolean_name_get, _selinux.SELboolean_name_set) - __swig_setmethods__["value"] = _selinux.SELboolean_value_set - __swig_getmethods__["value"] = _selinux.SELboolean_value_get - if _newclass:value = _swig_property(_selinux.SELboolean_value_get, _selinux.SELboolean_value_set) - def __init__(self): - this = _selinux.new_SELboolean() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_SELboolean - __del__ = lambda self : None; -SELboolean_swigregister = _selinux.SELboolean_swigregister -SELboolean_swigregister(SELboolean) - - -def security_set_boolean_list(*args): - return _selinux.security_set_boolean_list(*args) -security_set_boolean_list = _selinux.security_set_boolean_list - -def security_load_booleans(*args): - return _selinux.security_load_booleans(*args) -security_load_booleans = _selinux.security_load_booleans - -def security_check_context(*args): - return _selinux.security_check_context(*args) -security_check_context = _selinux.security_check_context - -def security_check_context_raw(*args): - return _selinux.security_check_context_raw(*args) -security_check_context_raw = _selinux.security_check_context_raw - -def security_canonicalize_context(*args): - return _selinux.security_canonicalize_context(*args) -security_canonicalize_context = _selinux.security_canonicalize_context - -def security_canonicalize_context_raw(*args): - return _selinux.security_canonicalize_context_raw(*args) -security_canonicalize_context_raw = _selinux.security_canonicalize_context_raw - -def security_getenforce(): - return _selinux.security_getenforce() -security_getenforce = _selinux.security_getenforce - -def security_setenforce(*args): - return _selinux.security_setenforce(*args) -security_setenforce = _selinux.security_setenforce - -def security_deny_unknown(): - return _selinux.security_deny_unknown() -security_deny_unknown = _selinux.security_deny_unknown - -def security_disable(): - return _selinux.security_disable() -security_disable = _selinux.security_disable - -def security_policyvers(): - return _selinux.security_policyvers() -security_policyvers = _selinux.security_policyvers - -def security_get_boolean_names(): - return _selinux.security_get_boolean_names() -security_get_boolean_names = _selinux.security_get_boolean_names - -def security_get_boolean_pending(*args): - return _selinux.security_get_boolean_pending(*args) -security_get_boolean_pending = _selinux.security_get_boolean_pending - -def security_get_boolean_active(*args): - return _selinux.security_get_boolean_active(*args) -security_get_boolean_active = _selinux.security_get_boolean_active - -def security_set_boolean(*args): - return _selinux.security_set_boolean(*args) -security_set_boolean = _selinux.security_set_boolean - -def security_commit_booleans(): - return _selinux.security_commit_booleans() -security_commit_booleans = _selinux.security_commit_booleans -class security_class_mapping(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, security_class_mapping, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, security_class_mapping, name) - __repr__ = _swig_repr - __swig_setmethods__["name"] = _selinux.security_class_mapping_name_set - __swig_getmethods__["name"] = _selinux.security_class_mapping_name_get - if _newclass:name = _swig_property(_selinux.security_class_mapping_name_get, _selinux.security_class_mapping_name_set) - __swig_setmethods__["perms"] = _selinux.security_class_mapping_perms_set - __swig_getmethods__["perms"] = _selinux.security_class_mapping_perms_get - if _newclass:perms = _swig_property(_selinux.security_class_mapping_perms_get, _selinux.security_class_mapping_perms_set) - def __init__(self): - this = _selinux.new_security_class_mapping() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _selinux.delete_security_class_mapping - __del__ = lambda self : None; -security_class_mapping_swigregister = _selinux.security_class_mapping_swigregister -security_class_mapping_swigregister(security_class_mapping) - - -def selinux_set_mapping(*args): - return _selinux.selinux_set_mapping(*args) -selinux_set_mapping = _selinux.selinux_set_mapping - -def mode_to_security_class(*args): - return _selinux.mode_to_security_class(*args) -mode_to_security_class = _selinux.mode_to_security_class - -def string_to_security_class(*args): - return _selinux.string_to_security_class(*args) -string_to_security_class = _selinux.string_to_security_class - -def security_class_to_string(*args): - return _selinux.security_class_to_string(*args) -security_class_to_string = _selinux.security_class_to_string - -def security_av_perm_to_string(*args): - return _selinux.security_av_perm_to_string(*args) -security_av_perm_to_string = _selinux.security_av_perm_to_string - -def string_to_av_perm(*args): - return _selinux.string_to_av_perm(*args) -string_to_av_perm = _selinux.string_to_av_perm - -def security_av_string(*args): - return _selinux.security_av_string(*args) -security_av_string = _selinux.security_av_string - -def print_access_vector(*args): - return _selinux.print_access_vector(*args) -print_access_vector = _selinux.print_access_vector -MATCHPATHCON_BASEONLY = _selinux.MATCHPATHCON_BASEONLY -MATCHPATHCON_NOTRANS = _selinux.MATCHPATHCON_NOTRANS -MATCHPATHCON_VALIDATE = _selinux.MATCHPATHCON_VALIDATE - -def set_matchpathcon_flags(*args): - return _selinux.set_matchpathcon_flags(*args) -set_matchpathcon_flags = _selinux.set_matchpathcon_flags - -def matchpathcon_init(*args): - return _selinux.matchpathcon_init(*args) -matchpathcon_init = _selinux.matchpathcon_init - -def matchpathcon_init_prefix(*args): - return _selinux.matchpathcon_init_prefix(*args) -matchpathcon_init_prefix = _selinux.matchpathcon_init_prefix - -def matchpathcon_fini(): - return _selinux.matchpathcon_fini() -matchpathcon_fini = _selinux.matchpathcon_fini - -def realpath_not_final(*args): - return _selinux.realpath_not_final(*args) -realpath_not_final = _selinux.realpath_not_final - -def matchpathcon(*args): - return _selinux.matchpathcon(*args) -matchpathcon = _selinux.matchpathcon - -def matchpathcon_index(*args): - return _selinux.matchpathcon_index(*args) -matchpathcon_index = _selinux.matchpathcon_index - -def matchpathcon_filespec_add(*args): - return _selinux.matchpathcon_filespec_add(*args) -matchpathcon_filespec_add = _selinux.matchpathcon_filespec_add - -def matchpathcon_filespec_destroy(): - return _selinux.matchpathcon_filespec_destroy() -matchpathcon_filespec_destroy = _selinux.matchpathcon_filespec_destroy - -def matchpathcon_filespec_eval(): - return _selinux.matchpathcon_filespec_eval() -matchpathcon_filespec_eval = _selinux.matchpathcon_filespec_eval - -def matchpathcon_checkmatches(*args): - return _selinux.matchpathcon_checkmatches(*args) -matchpathcon_checkmatches = _selinux.matchpathcon_checkmatches - -def matchmediacon(*args): - return _selinux.matchmediacon(*args) -matchmediacon = _selinux.matchmediacon - -def selinux_getenforcemode(): - return _selinux.selinux_getenforcemode() -selinux_getenforcemode = _selinux.selinux_getenforcemode - -def selinux_boolean_sub(*args): - return _selinux.selinux_boolean_sub(*args) -selinux_boolean_sub = _selinux.selinux_boolean_sub - -def selinux_getpolicytype(): - return _selinux.selinux_getpolicytype() -selinux_getpolicytype = _selinux.selinux_getpolicytype - -def selinux_policy_root(): - return _selinux.selinux_policy_root() -selinux_policy_root = _selinux.selinux_policy_root - -def selinux_set_policy_root(*args): - return _selinux.selinux_set_policy_root(*args) -selinux_set_policy_root = _selinux.selinux_set_policy_root - -def selinux_current_policy_path(): - return _selinux.selinux_current_policy_path() -selinux_current_policy_path = _selinux.selinux_current_policy_path - -def selinux_binary_policy_path(): - return _selinux.selinux_binary_policy_path() -selinux_binary_policy_path = _selinux.selinux_binary_policy_path - -def selinux_failsafe_context_path(): - return _selinux.selinux_failsafe_context_path() -selinux_failsafe_context_path = _selinux.selinux_failsafe_context_path - -def selinux_removable_context_path(): - return _selinux.selinux_removable_context_path() -selinux_removable_context_path = _selinux.selinux_removable_context_path - -def selinux_default_context_path(): - return _selinux.selinux_default_context_path() -selinux_default_context_path = _selinux.selinux_default_context_path - -def selinux_user_contexts_path(): - return _selinux.selinux_user_contexts_path() -selinux_user_contexts_path = _selinux.selinux_user_contexts_path - -def selinux_file_context_path(): - return _selinux.selinux_file_context_path() -selinux_file_context_path = _selinux.selinux_file_context_path - -def selinux_file_context_homedir_path(): - return _selinux.selinux_file_context_homedir_path() -selinux_file_context_homedir_path = _selinux.selinux_file_context_homedir_path - -def selinux_file_context_local_path(): - return _selinux.selinux_file_context_local_path() -selinux_file_context_local_path = _selinux.selinux_file_context_local_path - -def selinux_file_context_subs_path(): - return _selinux.selinux_file_context_subs_path() -selinux_file_context_subs_path = _selinux.selinux_file_context_subs_path - -def selinux_file_context_subs_dist_path(): - return _selinux.selinux_file_context_subs_dist_path() -selinux_file_context_subs_dist_path = _selinux.selinux_file_context_subs_dist_path - -def selinux_homedir_context_path(): - return _selinux.selinux_homedir_context_path() -selinux_homedir_context_path = _selinux.selinux_homedir_context_path - -def selinux_media_context_path(): - return _selinux.selinux_media_context_path() -selinux_media_context_path = _selinux.selinux_media_context_path - -def selinux_virtual_domain_context_path(): - return _selinux.selinux_virtual_domain_context_path() -selinux_virtual_domain_context_path = _selinux.selinux_virtual_domain_context_path - -def selinux_virtual_image_context_path(): - return _selinux.selinux_virtual_image_context_path() -selinux_virtual_image_context_path = _selinux.selinux_virtual_image_context_path - -def selinux_lxc_contexts_path(): - return _selinux.selinux_lxc_contexts_path() -selinux_lxc_contexts_path = _selinux.selinux_lxc_contexts_path - -def selinux_x_context_path(): - return _selinux.selinux_x_context_path() -selinux_x_context_path = _selinux.selinux_x_context_path - -def selinux_sepgsql_context_path(): - return _selinux.selinux_sepgsql_context_path() -selinux_sepgsql_context_path = _selinux.selinux_sepgsql_context_path - -def selinux_systemd_contexts_path(): - return _selinux.selinux_systemd_contexts_path() -selinux_systemd_contexts_path = _selinux.selinux_systemd_contexts_path - -def selinux_contexts_path(): - return _selinux.selinux_contexts_path() -selinux_contexts_path = _selinux.selinux_contexts_path - -def selinux_securetty_types_path(): - return _selinux.selinux_securetty_types_path() -selinux_securetty_types_path = _selinux.selinux_securetty_types_path - -def selinux_booleans_subs_path(): - return _selinux.selinux_booleans_subs_path() -selinux_booleans_subs_path = _selinux.selinux_booleans_subs_path - -def selinux_booleans_path(): - return _selinux.selinux_booleans_path() -selinux_booleans_path = _selinux.selinux_booleans_path - -def selinux_customizable_types_path(): - return _selinux.selinux_customizable_types_path() -selinux_customizable_types_path = _selinux.selinux_customizable_types_path - -def selinux_users_path(): - return _selinux.selinux_users_path() -selinux_users_path = _selinux.selinux_users_path - -def selinux_usersconf_path(): - return _selinux.selinux_usersconf_path() -selinux_usersconf_path = _selinux.selinux_usersconf_path - -def selinux_translations_path(): - return _selinux.selinux_translations_path() -selinux_translations_path = _selinux.selinux_translations_path - -def selinux_colors_path(): - return _selinux.selinux_colors_path() -selinux_colors_path = _selinux.selinux_colors_path - -def selinux_netfilter_context_path(): - return _selinux.selinux_netfilter_context_path() -selinux_netfilter_context_path = _selinux.selinux_netfilter_context_path - -def selinux_path(): - return _selinux.selinux_path() -selinux_path = _selinux.selinux_path - -def selinux_check_access(*args): - return _selinux.selinux_check_access(*args) -selinux_check_access = _selinux.selinux_check_access - -def selinux_check_passwd_access(*args): - return _selinux.selinux_check_passwd_access(*args) -selinux_check_passwd_access = _selinux.selinux_check_passwd_access - -def checkPasswdAccess(*args): - return _selinux.checkPasswdAccess(*args) -checkPasswdAccess = _selinux.checkPasswdAccess - -def selinux_check_securetty_context(*args): - return _selinux.selinux_check_securetty_context(*args) -selinux_check_securetty_context = _selinux.selinux_check_securetty_context - -def set_selinuxmnt(*args): - return _selinux.set_selinuxmnt(*args) -set_selinuxmnt = _selinux.set_selinuxmnt - -def selinuxfs_exists(): - return _selinux.selinuxfs_exists() -selinuxfs_exists = _selinux.selinuxfs_exists - -def fini_selinuxmnt(): - return _selinux.fini_selinuxmnt() -fini_selinuxmnt = _selinux.fini_selinuxmnt - -def setexecfilecon(*args): - return _selinux.setexecfilecon(*args) -setexecfilecon = _selinux.setexecfilecon - -def rpm_execcon(*args): - return _selinux.rpm_execcon(*args) -rpm_execcon = _selinux.rpm_execcon - -def is_context_customizable(*args): - return _selinux.is_context_customizable(*args) -is_context_customizable = _selinux.is_context_customizable - -def selinux_trans_to_raw_context(*args): - return _selinux.selinux_trans_to_raw_context(*args) -selinux_trans_to_raw_context = _selinux.selinux_trans_to_raw_context - -def selinux_raw_to_trans_context(*args): - return _selinux.selinux_raw_to_trans_context(*args) -selinux_raw_to_trans_context = _selinux.selinux_raw_to_trans_context - -def selinux_raw_context_to_color(*args): - return _selinux.selinux_raw_context_to_color(*args) -selinux_raw_context_to_color = _selinux.selinux_raw_context_to_color - -def getseuserbyname(*args): - return _selinux.getseuserbyname(*args) -getseuserbyname = _selinux.getseuserbyname - -def getseuser(*args): - return _selinux.getseuser(*args) -getseuser = _selinux.getseuser - -def selinux_file_context_cmp(*args): - return _selinux.selinux_file_context_cmp(*args) -selinux_file_context_cmp = _selinux.selinux_file_context_cmp - -def selinux_file_context_verify(*args): - return _selinux.selinux_file_context_verify(*args) -selinux_file_context_verify = _selinux.selinux_file_context_verify - -def selinux_lsetfilecon_default(*args): - return _selinux.selinux_lsetfilecon_default(*args) -selinux_lsetfilecon_default = _selinux.selinux_lsetfilecon_default - -def selinux_reset_config(): - return _selinux.selinux_reset_config() -selinux_reset_config = _selinux.selinux_reset_config -# This file is compatible with both classic and new-style classes. - - diff --git a/lib/python2.7/site-packages/setoolsgui/selinux/_selinux.so b/lib/python2.7/site-packages/setoolsgui/selinux/_selinux.so Binary files differdeleted file mode 100755 index f4a045f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/selinux/_selinux.so +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/selinux/audit2why.so b/lib/python2.7/site-packages/setoolsgui/selinux/audit2why.so Binary files differdeleted file mode 100755 index e7daaab..0000000 --- a/lib/python2.7/site-packages/setoolsgui/selinux/audit2why.so +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/__init__.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/__init__.py +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/access.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/access.py deleted file mode 100644 index cf13210..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/access.py +++ /dev/null @@ -1,331 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Classes representing basic access. - -SELinux - at the most basic level - represents access as -the 4-tuple subject (type or context), target (type or context), -object class, permission. The policy language elaborates this basic -access to faciliate more concise rules (e.g., allow rules can have multiple -source or target types - see refpolicy for more information). - -This module has objects for representing the most basic access (AccessVector) -and sets of that access (AccessVectorSet). These objects are used in Madison -in a variety of ways, but they are the fundamental representation of access. -""" - -import refpolicy -from selinux import audit2why - -def is_idparam(id): - """Determine if an id is a paramater in the form $N, where N is - an integer. - - Returns: - True if the id is a paramater - False if the id is not a paramater - """ - if len(id) > 1 and id[0] == '$': - try: - int(id[1:]) - except ValueError: - return False - return True - else: - return False - -class AccessVector: - """ - An access vector is the basic unit of access in SELinux. - - Access vectors are the most basic representation of access within - SELinux. It represents the access a source type has to a target - type in terms of an object class and a set of permissions. - - Access vectors are distinct from AVRules in that they can only - store a single source type, target type, and object class. The - simplicity of AccessVectors makes them useful for storing access - in a form that is easy to search and compare. - - The source, target, and object are stored as string. No checking - done to verify that the strings are valid SELinux identifiers. - Identifiers in the form $N (where N is an integer) are reserved as - interface parameters and are treated as wild cards in many - circumstances. - - Properties: - .src_type - The source type allowed access. [String or None] - .tgt_type - The target type to which access is allowed. [String or None] - .obj_class - The object class to which access is allowed. [String or None] - .perms - The permissions allowed to the object class. [IdSet] - .audit_msgs - The audit messages that generated this access vector [List of strings] - """ - def __init__(self, init_list=None): - if init_list: - self.from_list(init_list) - else: - self.src_type = None - self.tgt_type = None - self.obj_class = None - self.perms = refpolicy.IdSet() - self.audit_msgs = [] - self.type = audit2why.TERULE - self.data = [] - - # The direction of the information flow represented by this - # access vector - used for matching - self.info_flow_dir = None - - def from_list(self, list): - """Initialize an access vector from a list. - - Initialize an access vector from a list treating the list as - positional arguments - i.e., 0 = src_type, 1 = tgt_type, etc. - All of the list elements 3 and greater are treated as perms. - For example, the list ['foo_t', 'bar_t', 'file', 'read', 'write'] - would create an access vector list with the source type 'foo_t', - target type 'bar_t', object class 'file', and permissions 'read' - and 'write'. - - This format is useful for very simple storage to strings or disc - (see to_list) and for initializing access vectors. - """ - if len(list) < 4: - raise ValueError("List must contain at least four elements %s" % str(list)) - self.src_type = list[0] - self.tgt_type = list[1] - self.obj_class = list[2] - self.perms = refpolicy.IdSet(list[3:]) - - def to_list(self): - """ - Convert an access vector to a list. - - Convert an access vector to a list treating the list as positional - values. See from_list for more information on how an access vector - is represented in a list. - """ - l = [self.src_type, self.tgt_type, self.obj_class] - l.extend(self.perms) - return l - - def __str__(self): - return self.to_string() - - def to_string(self): - return "allow %s %s:%s %s;" % (self.src_type, self.tgt_type, - self.obj_class, self.perms.to_space_str()) - - def __cmp__(self, other): - if self.src_type != other.src_type: - return cmp(self.src_type, other.src_type) - if self.tgt_type != other.tgt_type: - return cmp(self.tgt_type, other.tgt_type) - if self.obj_class != self.obj_class: - return cmp(self.obj_class, other.obj_class) - if len(self.perms) != len(other.perms): - return cmp(len(self.perms), len(other.perms)) - x = list(self.perms) - x.sort() - y = list(other.perms) - y.sort() - for pa, pb in zip(x, y): - if pa != pb: - return cmp(pa, pb) - return 0 - -def avrule_to_access_vectors(avrule): - """Convert an avrule into a list of access vectors. - - AccessVectors and AVRules are similary, but differ in that - an AVRule can more than one source type, target type, and - object class. This function expands a single avrule into a - list of one or more AccessVectors representing the access - defined in the AVRule. - - - """ - if isinstance(avrule, AccessVector): - return [avrule] - a = [] - for src_type in avrule.src_types: - for tgt_type in avrule.tgt_types: - for obj_class in avrule.obj_classes: - access = AccessVector() - access.src_type = src_type - access.tgt_type = tgt_type - access.obj_class = obj_class - access.perms = avrule.perms.copy() - a.append(access) - return a - -class AccessVectorSet: - """A non-overlapping set of access vectors. - - An AccessVectorSet is designed to store one or more access vectors - that are non-overlapping. Access can be added to the set - incrementally and access vectors will be added or merged as - necessary. For example, adding the following access vectors using - add_av: - allow $1 etc_t : read; - allow $1 etc_t : write; - allow $1 var_log_t : read; - Would result in an access vector set with the access vectors: - allow $1 etc_t : { read write}; - allow $1 var_log_t : read; - """ - def __init__(self): - """Initialize an access vector set. - """ - self.src = {} - # The information flow direction of this access vector - # set - see objectmodel.py for more information. This - # stored here to speed up searching - see matching.py. - self.info_dir = None - - def __iter__(self): - """Iterate over all of the unique access vectors in the set.""" - for tgts in self.src.values(): - for objs in tgts.values(): - for av in objs.values(): - yield av - - def __len__(self): - """Return the number of unique access vectors in the set. - - Because of the inernal representation of the access vector set, - __len__ is not a constant time operation. Worst case is O(N) - where N is the number of unique access vectors, but the common - case is probably better. - """ - l = 0 - for tgts in self.src.values(): - for objs in tgts.values(): - l += len(objs) - return l - - def to_list(self): - """Return the unique access vectors in the set as a list. - - The format of the returned list is a set of nested lists, - each access vector represented by a list. This format is - designed to be simply serializable to a file. - - For example, consider an access vector set with the following - access vectors: - allow $1 user_t : file read; - allow $1 etc_t : file { read write}; - to_list would return the following: - [[$1, user_t, file, read] - [$1, etc_t, file, read, write]] - - See AccessVector.to_list for more information. - """ - l = [] - for av in self: - l.append(av.to_list()) - - return l - - def from_list(self, l): - """Add access vectors stored in a list. - - See to list for more information on the list format that this - method accepts. - - This will add all of the access from the list. Any existing - access vectors in the set will be retained. - """ - for av in l: - self.add_av(AccessVector(av)) - - def add(self, src_type, tgt_type, obj_class, perms, audit_msg=None, avc_type=audit2why.TERULE, data=[]): - """Add an access vector to the set. - """ - tgt = self.src.setdefault(src_type, { }) - cls = tgt.setdefault(tgt_type, { }) - - if cls.has_key((obj_class, avc_type)): - access = cls[obj_class, avc_type] - else: - access = AccessVector() - access.src_type = src_type - access.tgt_type = tgt_type - access.obj_class = obj_class - access.data = data - access.type = avc_type - cls[obj_class, avc_type] = access - - access.perms.update(perms) - if audit_msg: - access.audit_msgs.append(audit_msg) - - def add_av(self, av, audit_msg=None): - """Add an access vector to the set.""" - self.add(av.src_type, av.tgt_type, av.obj_class, av.perms) - - -def avs_extract_types(avs): - types = refpolicy.IdSet() - for av in avs: - types.add(av.src_type) - types.add(av.tgt_type) - - return types - -def avs_extract_obj_perms(avs): - perms = { } - for av in avs: - if perms.has_key(av.obj_class): - s = perms[av.obj_class] - else: - s = refpolicy.IdSet() - perms[av.obj_class] = s - s.update(av.perms) - return perms - -class RoleTypeSet: - """A non-overlapping set of role type statements. - - This clas allows the incremental addition of role type statements and - maintains a non-overlapping list of statements. - """ - def __init__(self): - """Initialize an access vector set.""" - self.role_types = {} - - def __iter__(self): - """Iterate over all of the unique role allows statements in the set.""" - for role_type in self.role_types.values(): - yield role_type - - def __len__(self): - """Return the unique number of role allow statements.""" - return len(self.role_types.keys()) - - def add(self, role, type): - if self.role_types.has_key(role): - role_type = self.role_types[role] - else: - role_type = refpolicy.RoleType() - role_type.role = role - self.role_types[role] = role_type - - role_type.types.add(type) diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/audit.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/audit.py deleted file mode 100644 index 56919be..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/audit.py +++ /dev/null @@ -1,549 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -import refpolicy -import access -import re -import sys - -# Convenience functions - -def get_audit_boot_msgs(): - """Obtain all of the avc and policy load messages from the audit - log. This function uses ausearch and requires that the current - process have sufficient rights to run ausearch. - - Returns: - string contain all of the audit messages returned by ausearch. - """ - import subprocess - import time - fd=open("/proc/uptime", "r") - off=float(fd.read().split()[0]) - fd.close - s = time.localtime(time.time() - off) - bootdate = time.strftime("%x", s) - boottime = time.strftime("%X", s) - output = subprocess.Popen(["/sbin/ausearch", "-m", "AVC,USER_AVC,MAC_POLICY_LOAD,DAEMON_START,SELINUX_ERR", "-ts", bootdate, boottime], - stdout=subprocess.PIPE).communicate()[0] - return output - -def get_audit_msgs(): - """Obtain all of the avc and policy load messages from the audit - log. This function uses ausearch and requires that the current - process have sufficient rights to run ausearch. - - Returns: - string contain all of the audit messages returned by ausearch. - """ - import subprocess - output = subprocess.Popen(["/sbin/ausearch", "-m", "AVC,USER_AVC,MAC_POLICY_LOAD,DAEMON_START,SELINUX_ERR"], - stdout=subprocess.PIPE).communicate()[0] - return output - -def get_dmesg_msgs(): - """Obtain all of the avc and policy load messages from /bin/dmesg. - - Returns: - string contain all of the audit messages returned by dmesg. - """ - import subprocess - output = subprocess.Popen(["/bin/dmesg"], - stdout=subprocess.PIPE).communicate()[0] - return output - -# Classes representing audit messages - -class AuditMessage: - """Base class for all objects representing audit messages. - - AuditMessage is a base class for all audit messages and only - provides storage for the raw message (as a string) and a - parsing function that does nothing. - """ - def __init__(self, message): - self.message = message - self.header = "" - - def from_split_string(self, recs): - """Parse a string that has been split into records by space into - an audit message. - - This method should be overridden by subclasses. Error reporting - should be done by raise ValueError exceptions. - """ - for msg in recs: - fields = msg.split("=") - if len(fields) != 2: - if msg[:6] == "audit(": - self.header = msg - return - else: - continue - - if fields[0] == "msg": - self.header = fields[1] - return - - -class InvalidMessage(AuditMessage): - """Class representing invalid audit messages. This is used to differentiate - between audit messages that aren't recognized (that should return None from - the audit message parser) and a message that is recognized but is malformed - in some way. - """ - def __init__(self, message): - AuditMessage.__init__(self, message) - -class PathMessage(AuditMessage): - """Class representing a path message""" - def __init__(self, message): - AuditMessage.__init__(self, message) - self.path = "" - - def from_split_string(self, recs): - AuditMessage.from_split_string(self, recs) - - for msg in recs: - fields = msg.split("=") - if len(fields) != 2: - continue - if fields[0] == "path": - self.path = fields[1][1:-1] - return -import selinux.audit2why as audit2why - -avcdict = {} - -class AVCMessage(AuditMessage): - """AVC message representing an access denial or granted message. - - This is a very basic class and does not represent all possible fields - in an avc message. Currently the fields are: - scontext - context for the source (process) that generated the message - tcontext - context for the target - tclass - object class for the target (only one) - comm - the process name - exe - the on-disc binary - path - the path of the target - access - list of accesses that were allowed or denied - denial - boolean indicating whether this was a denial (True) or granted - (False) message. - - An example audit message generated from the audit daemon looks like (line breaks - added): - 'type=AVC msg=audit(1155568085.407:10877): avc: denied { search } for - pid=677 comm="python" name="modules" dev=dm-0 ino=13716388 - scontext=user_u:system_r:setroubleshootd_t:s0 - tcontext=system_u:object_r:modules_object_t:s0 tclass=dir' - - An example audit message stored in syslog (not processed by the audit daemon - line - breaks added): - 'Sep 12 08:26:43 dhcp83-5 kernel: audit(1158064002.046:4): avc: denied { read } - for pid=2 496 comm="bluez-pin" name=".gdm1K3IFT" dev=dm-0 ino=3601333 - scontext=user_u:system_r:bluetooth_helper_t:s0-s0:c0 - tcontext=system_u:object_r:xdm_tmp_t:s0 tclass=file - """ - def __init__(self, message): - AuditMessage.__init__(self, message) - self.scontext = refpolicy.SecurityContext() - self.tcontext = refpolicy.SecurityContext() - self.tclass = "" - self.comm = "" - self.exe = "" - self.path = "" - self.name = "" - self.accesses = [] - self.denial = True - self.type = audit2why.TERULE - - def __parse_access(self, recs, start): - # This is kind of sucky - the access that is in a space separated - # list like '{ read write }'. This doesn't fit particularly well with splitting - # the string on spaces. This function takes the list of recs and a starting - # position one beyond the open brace. It then adds the accesses until it finds - # the close brace or the end of the list (which is an error if reached without - # seeing a close brace). - found_close = False - i = start - if i == (len(recs) - 1): - raise ValueError("AVC message in invalid format [%s]\n" % self.message) - while i < len(recs): - if recs[i] == "}": - found_close = True - break - self.accesses.append(recs[i]) - i = i + 1 - if not found_close: - raise ValueError("AVC message in invalid format [%s]\n" % self.message) - return i + 1 - - - def from_split_string(self, recs): - AuditMessage.from_split_string(self, recs) - # FUTURE - fully parse avc messages and store all possible fields - # Required fields - found_src = False - found_tgt = False - found_class = False - found_access = False - - for i in range(len(recs)): - if recs[i] == "{": - i = self.__parse_access(recs, i + 1) - found_access = True - continue - elif recs[i] == "granted": - self.denial = False - - fields = recs[i].split("=") - if len(fields) != 2: - continue - if fields[0] == "scontext": - self.scontext = refpolicy.SecurityContext(fields[1]) - found_src = True - elif fields[0] == "tcontext": - self.tcontext = refpolicy.SecurityContext(fields[1]) - found_tgt = True - elif fields[0] == "tclass": - self.tclass = fields[1] - found_class = True - elif fields[0] == "comm": - self.comm = fields[1][1:-1] - elif fields[0] == "exe": - self.exe = fields[1][1:-1] - elif fields[0] == "name": - self.name = fields[1][1:-1] - - if not found_src or not found_tgt or not found_class or not found_access: - raise ValueError("AVC message in invalid format [%s]\n" % self.message) - self.analyze() - - def analyze(self): - tcontext = self.tcontext.to_string() - scontext = self.scontext.to_string() - access_tuple = tuple( self.accesses) - self.data = [] - - if (scontext, tcontext, self.tclass, access_tuple) in avcdict.keys(): - self.type, self.data = avcdict[(scontext, tcontext, self.tclass, access_tuple)] - else: - self.type, self.data = audit2why.analyze(scontext, tcontext, self.tclass, self.accesses); - if self.type == audit2why.NOPOLICY: - self.type = audit2why.TERULE - if self.type == audit2why.BADTCON: - raise ValueError("Invalid Target Context %s\n" % tcontext) - if self.type == audit2why.BADSCON: - raise ValueError("Invalid Source Context %s\n" % scontext) - if self.type == audit2why.BADSCON: - raise ValueError("Invalid Type Class %s\n" % self.tclass) - if self.type == audit2why.BADPERM: - raise ValueError("Invalid permission %s\n" % " ".join(self.accesses)) - if self.type == audit2why.BADCOMPUTE: - raise ValueError("Error during access vector computation") - - if self.type == audit2why.CONSTRAINT: - self.data = [ self.data ] - if self.scontext.user != self.tcontext.user: - self.data.append(("user (%s)" % self.scontext.user, 'user (%s)' % self.tcontext.user)) - if self.scontext.role != self.tcontext.role and self.tcontext.role != "object_r": - self.data.append(("role (%s)" % self.scontext.role, 'role (%s)' % self.tcontext.role)) - if self.scontext.level != self.tcontext.level: - self.data.append(("level (%s)" % self.scontext.level, 'level (%s)' % self.tcontext.level)) - - avcdict[(scontext, tcontext, self.tclass, access_tuple)] = (self.type, self.data) - -class PolicyLoadMessage(AuditMessage): - """Audit message indicating that the policy was reloaded.""" - def __init__(self, message): - AuditMessage.__init__(self, message) - -class DaemonStartMessage(AuditMessage): - """Audit message indicating that a daemon was started.""" - def __init__(self, message): - AuditMessage.__init__(self, message) - self.auditd = False - - def from_split_string(self, recs): - AuditMessage.from_split_string(self, recs) - if "auditd" in recs: - self.auditd = True - - -class ComputeSidMessage(AuditMessage): - """Audit message indicating that a sid was not valid. - - Compute sid messages are generated on attempting to create a security - context that is not valid. Security contexts are invalid if the role is - not authorized for the user or the type is not authorized for the role. - - This class does not store all of the fields from the compute sid message - - just the type and role. - """ - def __init__(self, message): - AuditMessage.__init__(self, message) - self.invalid_context = refpolicy.SecurityContext() - self.scontext = refpolicy.SecurityContext() - self.tcontext = refpolicy.SecurityContext() - self.tclass = "" - - def from_split_string(self, recs): - AuditMessage.from_split_string(self, recs) - if len(recs) < 10: - raise ValueError("Split string does not represent a valid compute sid message") - - try: - self.invalid_context = refpolicy.SecurityContext(recs[5]) - self.scontext = refpolicy.SecurityContext(recs[7].split("=")[1]) - self.tcontext = refpolicy.SecurityContext(recs[8].split("=")[1]) - self.tclass = recs[9].split("=")[1] - except: - raise ValueError("Split string does not represent a valid compute sid message") - def output(self): - return "role %s types %s;\n" % (self.role, self.type) - -# Parser for audit messages - -class AuditParser: - """Parser for audit messages. - - This class parses audit messages and stores them according to their message - type. This is not a general purpose audit message parser - it only extracts - selinux related messages. - - Each audit messages are stored in one of four lists: - avc_msgs - avc denial or granted messages. Messages are stored in - AVCMessage objects. - comput_sid_messages - invalid sid messages. Messages are stored in - ComputSidMessage objects. - invalid_msgs - selinux related messages that are not valid. Messages - are stored in InvalidMessageObjects. - policy_load_messages - policy load messages. Messages are stored in - PolicyLoadMessage objects. - - These lists will be reset when a policy load message is seen if - AuditParser.last_load_only is set to true. It is assumed that messages - are fed to the parser in chronological order - time stamps are not - parsed. - """ - def __init__(self, last_load_only=False): - self.__initialize() - self.last_load_only = last_load_only - - def __initialize(self): - self.avc_msgs = [] - self.compute_sid_msgs = [] - self.invalid_msgs = [] - self.policy_load_msgs = [] - self.path_msgs = [] - self.by_header = { } - self.check_input_file = False - - # Low-level parsing function - tries to determine if this audit - # message is an SELinux related message and then parses it into - # the appropriate AuditMessage subclass. This function deliberately - # does not impose policy (e.g., on policy load message) or store - # messages to make as simple and reusable as possible. - # - # Return values: - # None - no recognized audit message found in this line - # - # InvalidMessage - a recognized but invalid message was found. - # - # AuditMessage (or subclass) - object representing a parsed - # and valid audit message. - def __parse_line(self, line): - rec = line.split() - for i in rec: - found = False - if i == "avc:" or i == "message=avc:" or i == "msg='avc:": - msg = AVCMessage(line) - found = True - elif i == "security_compute_sid:": - msg = ComputeSidMessage(line) - found = True - elif i == "type=MAC_POLICY_LOAD" or i == "type=1403": - msg = PolicyLoadMessage(line) - found = True - elif i == "type=AVC_PATH": - msg = PathMessage(line) - found = True - elif i == "type=DAEMON_START": - msg = DaemonStartMessage(list) - found = True - - if found: - self.check_input_file = True - try: - msg.from_split_string(rec) - except ValueError: - msg = InvalidMessage(line) - return msg - return None - - # Higher-level parse function - take a line, parse it into an - # AuditMessage object, and store it in the appropriate list. - # This function will optionally reset all of the lists when - # it sees a load policy message depending on the value of - # self.last_load_only. - def __parse(self, line): - msg = self.__parse_line(line) - if msg is None: - return - - # Append to the correct list - if isinstance(msg, PolicyLoadMessage): - if self.last_load_only: - self.__initialize() - elif isinstance(msg, DaemonStartMessage): - # We initialize every time the auditd is started. This - # is less than ideal, but unfortunately it is the only - # way to catch reboots since the initial policy load - # by init is not stored in the audit log. - if msg.auditd and self.last_load_only: - self.__initialize() - self.policy_load_msgs.append(msg) - elif isinstance(msg, AVCMessage): - self.avc_msgs.append(msg) - elif isinstance(msg, ComputeSidMessage): - self.compute_sid_msgs.append(msg) - elif isinstance(msg, InvalidMessage): - self.invalid_msgs.append(msg) - elif isinstance(msg, PathMessage): - self.path_msgs.append(msg) - - # Group by audit header - if msg.header != "": - if self.by_header.has_key(msg.header): - self.by_header[msg.header].append(msg) - else: - self.by_header[msg.header] = [msg] - - - # Post processing will add additional information from AVC messages - # from related messages - only works on messages generated by - # the audit system. - def __post_process(self): - for value in self.by_header.values(): - avc = [] - path = None - for msg in value: - if isinstance(msg, PathMessage): - path = msg - elif isinstance(msg, AVCMessage): - avc.append(msg) - if len(avc) > 0 and path: - for a in avc: - a.path = path.path - - def parse_file(self, input): - """Parse the contents of a file object. This method can be called - multiple times (along with parse_string).""" - line = input.readline() - while line: - self.__parse(line) - line = input.readline() - if not self.check_input_file: - sys.stderr.write("Nothing to do\n") - sys.exit(0) - self.__post_process() - - def parse_string(self, input): - """Parse a string containing audit messages - messages should - be separated by new lines. This method can be called multiple - times (along with parse_file).""" - lines = input.split('\n') - for l in lines: - self.__parse(l) - self.__post_process() - - def to_role(self, role_filter=None): - """Return RoleAllowSet statements matching the specified filter - - Filter out types that match the filer, or all roles - - Params: - role_filter - [optional] Filter object used to filter the - output. - Returns: - Access vector set representing the denied access in the - audit logs parsed by this object. - """ - role_types = access.RoleTypeSet() - for cs in self.compute_sid_msgs: - if not role_filter or role_filter.filter(cs): - role_types.add(cs.invalid_context.role, cs.invalid_context.type) - - return role_types - - def to_access(self, avc_filter=None, only_denials=True): - """Convert the audit logs access into a an access vector set. - - Convert the audit logs into an access vector set, optionally - filtering the restults with the passed in filter object. - - Filter objects are object instances with a .filter method - that takes and access vector and returns True if the message - should be included in the final output and False otherwise. - - Params: - avc_filter - [optional] Filter object used to filter the - output. - Returns: - Access vector set representing the denied access in the - audit logs parsed by this object. - """ - av_set = access.AccessVectorSet() - for avc in self.avc_msgs: - if avc.denial != True and only_denials: - continue - if avc_filter: - if avc_filter.filter(avc): - av_set.add(avc.scontext.type, avc.tcontext.type, avc.tclass, - avc.accesses, avc, avc_type=avc.type, data=avc.data) - else: - av_set.add(avc.scontext.type, avc.tcontext.type, avc.tclass, - avc.accesses, avc, avc_type=avc.type, data=avc.data) - return av_set - -class AVCTypeFilter: - def __init__(self, regex): - self.regex = re.compile(regex) - - def filter(self, avc): - if self.regex.match(avc.scontext.type): - return True - if self.regex.match(avc.tcontext.type): - return True - return False - -class ComputeSidTypeFilter: - def __init__(self, regex): - self.regex = re.compile(regex) - - def filter(self, avc): - if self.regex.match(avc.invalid_context.type): - return True - if self.regex.match(avc.scontext.type): - return True - if self.regex.match(avc.tcontext.type): - return True - return False - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/classperms.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/classperms.py deleted file mode 100644 index c925dee..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/classperms.py +++ /dev/null @@ -1,116 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -import sys - -tokens = ('DEFINE', - 'NAME', - 'TICK', - 'SQUOTE', - 'OBRACE', - 'CBRACE', - 'SEMI', - 'OPAREN', - 'CPAREN', - 'COMMA') - -reserved = { - 'define' : 'DEFINE' } - -t_TICK = r'\`' -t_SQUOTE = r'\'' -t_OBRACE = r'\{' -t_CBRACE = r'\}' -t_SEMI = r'\;' -t_OPAREN = r'\(' -t_CPAREN = r'\)' -t_COMMA = r'\,' - -t_ignore = " \t\n" - -def t_NAME(t): - r'[a-zA-Z_][a-zA-Z0-9_]*' - t.type = reserved.get(t.value,'NAME') - return t - -def t_error(t): - print "Illegal character '%s'" % t.value[0] - t.skip(1) - -import lex -lex.lex() - -def p_statements(p): - '''statements : define_stmt - | define_stmt statements - ''' - if len(p) == 2: - p[0] = [p[1]] - else: - p[0] = [p[1]] + [p[2]] - -def p_define_stmt(p): - # This sucks - corresponds to 'define(`foo',`{ read write }') - '''define_stmt : DEFINE OPAREN TICK NAME SQUOTE COMMA TICK list SQUOTE CPAREN - ''' - - p[0] = [p[4], p[8]] - -def p_list(p): - '''list : NAME - | OBRACE names CBRACE - ''' - if p[1] == "{": - p[0] = p[2] - else: - p[0] = [p[1]] - -def p_names(p): - '''names : NAME - | NAME names - ''' - if len(p) == 2: - p[0] = [p[1]] - else: - p[0] = [p[1]] + p[2] - -def p_error(p): - print "Syntax error on line %d %s [type=%s]" % (p.lineno, p.value, p.type) - -import yacc -yacc.yacc() - - -f = open("all_perms.spt") -txt = f.read() -f.close() - -#lex.input(txt) -#while 1: -# tok = lex.token() -# if not tok: -# break -# print tok - -test = "define(`foo',`{ read write append }')" -test2 = """define(`all_filesystem_perms',`{ mount remount unmount getattr relabelfrom relabelto transition associate quotamod quotaget }') -define(`all_security_perms',`{ compute_av compute_create compute_member check_context load_policy compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot }') -""" -result = yacc.parse(txt) -print result - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/defaults.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/defaults.py deleted file mode 100644 index 218bc7c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/defaults.py +++ /dev/null @@ -1,77 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -import os -import re - -# Select the correct location for the development files based on a -# path variable (optionally read from a configuration file) -class PathChoooser(object): - def __init__(self, pathname): - self.config = dict() - if not os.path.exists(pathname): - self.config_pathname = "(defaults)" - self.config["SELINUX_DEVEL_PATH"] = "/usr/share/selinux/default:/usr/share/selinux/mls:/usr/share/selinux/devel" - return - self.config_pathname = pathname - ignore = re.compile(r"^\s*(?:#.+)?$") - consider = re.compile(r"^\s*(\w+)\s*=\s*(.+?)\s*$") - for lineno, line in enumerate(open(pathname)): - if ignore.match(line): continue - mo = consider.match(line) - if not mo: - raise ValueError, "%s:%d: line is not in key = value format" % (pathname, lineno+1) - self.config[mo.group(1)] = mo.group(2) - - # We're only exporting one useful function, so why not be a function - def __call__(self, testfilename, pathset="SELINUX_DEVEL_PATH"): - paths = self.config.get(pathset, None) - if paths is None: - raise ValueError, "%s was not in %s" % (pathset, self.config_pathname) - paths = paths.split(":") - for p in paths: - target = os.path.join(p, testfilename) - if os.path.exists(target): return target - return os.path.join(paths[0], testfilename) - - -""" -Various default settings, including file and directory locations. -""" - -def data_dir(): - return "/var/lib/sepolgen" - -def perm_map(): - return data_dir() + "/perm_map" - -def interface_info(): - return data_dir() + "/interface_info" - -def attribute_info(): - return data_dir() + "/attribute_info" - -def refpolicy_makefile(): - chooser = PathChoooser("/etc/selinux/sepolgen.conf") - return chooser("Makefile") - -def headers(): - chooser = PathChoooser("/etc/selinux/sepolgen.conf") - return chooser("include") - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/interfaces.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/interfaces.py deleted file mode 100644 index 88a6dc3..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/interfaces.py +++ /dev/null @@ -1,509 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Classes for representing and manipulating interfaces. -""" - -import access -import refpolicy -import itertools -import objectmodel -import matching - -from sepolgeni18n import _ - -import copy - -class Param: - """ - Object representing a paramater for an interface. - """ - def __init__(self): - self.__name = "" - self.type = refpolicy.SRC_TYPE - self.obj_classes = refpolicy.IdSet() - self.required = True - - def set_name(self, name): - if not access.is_idparam(name): - raise ValueError("Name [%s] is not a param" % name) - self.__name = name - - def get_name(self): - return self.__name - - name = property(get_name, set_name) - - num = property(fget=lambda self: int(self.name[1:])) - - def __repr__(self): - return "<sepolgen.policygen.Param instance [%s, %s, %s]>" % \ - (self.name, refpolicy.field_to_str[self.type], " ".join(self.obj_classes)) - - -# Helper for extract perms -def __param_insert(name, type, av, params): - ret = 0 - if name in params: - p = params[name] - # The entries are identical - we're done - if type == p.type: - return - # Hanldle implicitly typed objects (like process) - if (type == refpolicy.SRC_TYPE or type == refpolicy.TGT_TYPE) and \ - (p.type == refpolicy.TGT_TYPE or p.type == refpolicy.SRC_TYPE): - #print name, refpolicy.field_to_str[p.type] - # If the object is not implicitly typed, tell the - # caller there is a likely conflict. - ret = 1 - if av: - avobjs = [av.obj_class] - else: - avobjs = [] - for obj in itertools.chain(p.obj_classes, avobjs): - if obj in objectmodel.implicitly_typed_objects: - ret = 0 - break - # "Promote" to a SRC_TYPE as this is the likely usage. - # We do this even if the above test fails on purpose - # as there is really no sane way to resolve the conflict - # here. The caller can take other actions if needed. - p.type = refpolicy.SRC_TYPE - else: - # There is some conflict - no way to resolve it really - # so we just leave the first entry and tell the caller - # there was a conflict. - ret = 1 - else: - p = Param() - p.name = name - p.type = type - params[p.name] = p - - if av: - p.obj_classes.add(av.obj_class) - return ret - - - -def av_extract_params(av, params): - """Extract the paramaters from an access vector. - - Extract the paramaters (in the form $N) from an access - vector, storing them as Param objects in a dictionary. - Some attempt is made at resolving conflicts with other - entries in the dict, but if an unresolvable conflict is - found it is reported to the caller. - - The goal here is to figure out how interface paramaters are - actually used in the interface - e.g., that $1 is a domain used as - a SRC_TYPE. In general an interface will look like this: - - interface(`foo', ` - allow $1 foo : file read; - ') - - This is simple to figure out - $1 is a SRC_TYPE. A few interfaces - are more complex, for example: - - interface(`foo_trans',` - domain_auto_trans($1,fingerd_exec_t,fingerd_t) - - allow $1 fingerd_t:fd use; - allow fingerd_t $1:fd use; - allow fingerd_t $1:fifo_file rw_file_perms; - allow fingerd_t $1:process sigchld; - ') - - Here the usage seems ambigious, but it is not. $1 is still domain - and therefore should be returned as a SRC_TYPE. - - Returns: - 0 - success - 1 - conflict found - """ - ret = 0 - found_src = False - if access.is_idparam(av.src_type): - if __param_insert(av.src_type, refpolicy.SRC_TYPE, av, params) == 1: - ret = 1 - - if access.is_idparam(av.tgt_type): - if __param_insert(av.tgt_type, refpolicy.TGT_TYPE, av, params) == 1: - ret = 1 - - if access.is_idparam(av.obj_class): - if __param_insert(av.obj_class, refpolicy.OBJ_CLASS, av, params) == 1: - ret = 1 - - for perm in av.perms: - if access.is_idparam(perm): - if __param_insert(perm, PERM) == 1: - ret = 1 - - return ret - -def role_extract_params(role, params): - if access.is_idparam(role.role): - return __param_insert(role.role, refpolicy.ROLE, None, params) - -def type_rule_extract_params(rule, params): - def extract_from_set(set, type): - ret = 0 - for x in set: - if access.is_idparam(x): - if __param_insert(x, type, None, params): - ret = 1 - return ret - - ret = 0 - if extract_from_set(rule.src_types, refpolicy.SRC_TYPE): - ret = 1 - - if extract_from_set(rule.tgt_types, refpolicy.TGT_TYPE): - ret = 1 - - if extract_from_set(rule.obj_classes, refpolicy.OBJ_CLASS): - ret = 1 - - if access.is_idparam(rule.dest_type): - if __param_insert(rule.dest_type, refpolicy.DEST_TYPE, None, params): - ret = 1 - - return ret - -def ifcall_extract_params(ifcall, params): - ret = 0 - for arg in ifcall.args: - if access.is_idparam(arg): - # Assume interface arguments are source types. Fairly safe - # assumption for most interfaces - if __param_insert(arg, refpolicy.SRC_TYPE, None, params): - ret = 1 - - return ret - -class AttributeVector: - def __init__(self): - self.name = "" - self.access = access.AccessVectorSet() - - def add_av(self, av): - self.access.add_av(av) - -class AttributeSet: - def __init__(self): - self.attributes = { } - - def add_attr(self, attr): - self.attributes[attr.name] = attr - - def from_file(self, fd): - def parse_attr(line): - fields = line[1:-1].split() - if len(fields) != 2 or fields[0] != "Attribute": - raise SyntaxError("Syntax error Attribute statement %s" % line) - a = AttributeVector() - a.name = fields[1] - - return a - - a = None - for line in fd: - line = line[:-1] - if line[0] == "[": - if a: - self.add_attr(a) - a = parse_attr(line) - elif a: - l = line.split(",") - av = access.AccessVector(l) - a.add_av(av) - if a: - self.add_attr(a) - -class InterfaceVector: - def __init__(self, interface=None, attributes={}): - # Enabled is a loose concept currently - we are essentially - # not enabling interfaces that we can't handle currently. - # See InterfaceVector.add_ifv for more information. - self.enabled = True - self.name = "" - # The access that is enabled by this interface - eventually - # this will include indirect access from typeattribute - # statements. - self.access = access.AccessVectorSet() - # Paramaters are stored in a dictionary (key: param name - # value: Param object). - self.params = { } - if interface: - self.from_interface(interface, attributes) - self.expanded = False - - def from_interface(self, interface, attributes={}): - self.name = interface.name - - # Add allow rules - for avrule in interface.avrules(): - if avrule.rule_type != refpolicy.AVRule.ALLOW: - continue - # Handle some policy bugs - if "dontaudit" in interface.name: - #print "allow rule in interface: %s" % interface - continue - avs = access.avrule_to_access_vectors(avrule) - for av in avs: - self.add_av(av) - - # Add typeattribute access - if attributes: - for typeattribute in interface.typeattributes(): - for attr in typeattribute.attributes: - if not attributes.attributes.has_key(attr): - # print "missing attribute " + attr - continue - attr_vec = attributes.attributes[attr] - for a in attr_vec.access: - av = copy.copy(a) - if av.src_type == attr_vec.name: - av.src_type = typeattribute.type - if av.tgt_type == attr_vec.name: - av.tgt_type = typeattribute.type - self.add_av(av) - - - # Extract paramaters from roles - for role in interface.roles(): - if role_extract_params(role, self.params): - pass - #print "found conflicting role param %s for interface %s" % \ - # (role.name, interface.name) - # Extract paramaters from type rules - for rule in interface.typerules(): - if type_rule_extract_params(rule, self.params): - pass - #print "found conflicting params in rule %s in interface %s" % \ - # (str(rule), interface.name) - - for ifcall in interface.interface_calls(): - if ifcall_extract_params(ifcall, self.params): - pass - #print "found conflicting params in ifcall %s in interface %s" % \ - # (str(ifcall), interface.name) - - - def add_av(self, av): - if av_extract_params(av, self.params) == 1: - pass - #print "found conflicting perms [%s]" % str(av) - self.access.add_av(av) - - def to_string(self): - s = [] - s.append("[InterfaceVector %s]" % self.name) - for av in self.access: - s.append(str(av)) - return "\n".join(s) - - def __str__(self): - return self.__repr__() - - def __repr__(self): - return "<InterfaceVector %s:%s>" % (self.name, self.enabled) - - -class InterfaceSet: - def __init__(self, output=None): - self.interfaces = { } - self.tgt_type_map = { } - self.tgt_type_all = [] - self.output = output - - def o(self, str): - if self.output: - self.output.write(str + "\n") - - def to_file(self, fd): - for iv in self.interfaces.values(): - fd.write("[InterfaceVector %s " % iv.name) - for param in iv.params.values(): - fd.write("%s:%s " % (param.name, refpolicy.field_to_str[param.type])) - fd.write("]\n") - avl = iv.access.to_list() - for av in avl: - fd.write(",".join(av)) - fd.write("\n") - - def from_file(self, fd): - def parse_ifv(line): - fields = line[1:-1].split() - if len(fields) < 2 or fields[0] != "InterfaceVector": - raise SyntaxError("Syntax error InterfaceVector statement %s" % line) - ifv = InterfaceVector() - ifv.name = fields[1] - if len(fields) == 2: - return - for field in fields[2:]: - p = field.split(":") - if len(p) != 2: - raise SyntaxError("Invalid param in InterfaceVector statement %s" % line) - param = Param() - param.name = p[0] - param.type = refpolicy.str_to_field[p[1]] - ifv.params[param.name] = param - return ifv - - ifv = None - for line in fd: - line = line[:-1] - if line[0] == "[": - if ifv: - self.add_ifv(ifv) - ifv = parse_ifv(line) - elif ifv: - l = line.split(",") - av = access.AccessVector(l) - ifv.add_av(av) - if ifv: - self.add_ifv(ifv) - - self.index() - - def add_ifv(self, ifv): - self.interfaces[ifv.name] = ifv - - def index(self): - for ifv in self.interfaces.values(): - tgt_types = set() - for av in ifv.access: - if access.is_idparam(av.tgt_type): - self.tgt_type_all.append(ifv) - tgt_types = set() - break - tgt_types.add(av.tgt_type) - - for type in tgt_types: - l = self.tgt_type_map.setdefault(type, []) - l.append(ifv) - - def add(self, interface, attributes={}): - ifv = InterfaceVector(interface, attributes) - self.add_ifv(ifv) - - def add_headers(self, headers, output=None, attributes={}): - for i in itertools.chain(headers.interfaces(), headers.templates()): - self.add(i, attributes) - - self.expand_ifcalls(headers) - self.index() - - def map_param(self, id, ifcall): - if access.is_idparam(id): - num = int(id[1:]) - if num > len(ifcall.args): - # Tell caller to drop this because it must have - # been generated from an optional param. - return None - else: - arg = ifcall.args[num - 1] - if isinstance(arg, list): - return arg - else: - return [arg] - else: - return [id] - - def map_add_av(self, ifv, av, ifcall): - src_types = self.map_param(av.src_type, ifcall) - if src_types is None: - return - - tgt_types = self.map_param(av.tgt_type, ifcall) - if tgt_types is None: - return - - obj_classes = self.map_param(av.obj_class, ifcall) - if obj_classes is None: - return - - new_perms = refpolicy.IdSet() - for perm in av.perms: - p = self.map_param(perm, ifcall) - if p is None: - continue - else: - new_perms.update(p) - if len(new_perms) == 0: - return - - for src_type in src_types: - for tgt_type in tgt_types: - for obj_class in obj_classes: - ifv.access.add(src_type, tgt_type, obj_class, new_perms) - - def do_expand_ifcalls(self, interface, if_by_name): - # Descend an interface call tree adding the access - # from each interface. This is a depth first walk - # of the tree. - - stack = [(interface, None)] - ifv = self.interfaces[interface.name] - ifv.expanded = True - - while len(stack) > 0: - cur, cur_ifcall = stack.pop(-1) - - cur_ifv = self.interfaces[cur.name] - if cur != interface: - - for av in cur_ifv.access: - self.map_add_av(ifv, av, cur_ifcall) - - # If we have already fully expanded this interface - # there is no reason to descend further. - if cur_ifv.expanded: - continue - - for ifcall in cur.interface_calls(): - if ifcall.ifname == interface.name: - self.o(_("Found circular interface class")) - return - try: - newif = if_by_name[ifcall.ifname] - except KeyError: - self.o(_("Missing interface definition for %s" % ifcall.ifname)) - continue - - stack.append((newif, ifcall)) - - - def expand_ifcalls(self, headers): - # Create a map of interface names to interfaces - - # this mirrors the interface vector map we already - # have. - if_by_name = { } - - for i in itertools.chain(headers.interfaces(), headers.templates()): - if_by_name[i.name] = i - - - for interface in itertools.chain(headers.interfaces(), headers.templates()): - self.do_expand_ifcalls(interface, if_by_name) - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/lex.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/lex.py deleted file mode 100644 index c149366..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/lex.py +++ /dev/null @@ -1,866 +0,0 @@ -#----------------------------------------------------------------------------- -# ply: lex.py -# -# Author: David M. Beazley (dave@dabeaz.com) -# -# Copyright (C) 2001-2006, David M. Beazley -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See the file COPYING for a complete copy of the LGPL. -#----------------------------------------------------------------------------- - -__version__ = "2.2" - -import re, sys, types - -# Regular expression used to match valid token names -_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$') - -# Available instance types. This is used when lexers are defined by a class. -# It's a little funky because I want to preserve backwards compatibility -# with Python 2.0 where types.ObjectType is undefined. - -try: - _INSTANCETYPE = (types.InstanceType, types.ObjectType) -except AttributeError: - _INSTANCETYPE = types.InstanceType - class object: pass # Note: needed if no new-style classes present - -# Exception thrown when invalid token encountered and no default error -# handler is defined. -class LexError(Exception): - def __init__(self,message,s): - self.args = (message,) - self.text = s - -# Token class -class LexToken(object): - def __str__(self): - return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos) - def __repr__(self): - return str(self) - def skip(self,n): - self.lexer.skip(n) - -# ----------------------------------------------------------------------------- -# Lexer class -# -# This class encapsulates all of the methods and data associated with a lexer. -# -# input() - Store a new string in the lexer -# token() - Get the next token -# ----------------------------------------------------------------------------- - -class Lexer: - def __init__(self): - self.lexre = None # Master regular expression. This is a list of - # tuples (re,findex) where re is a compiled - # regular expression and findex is a list - # mapping regex group numbers to rules - self.lexretext = None # Current regular expression strings - self.lexstatere = {} # Dictionary mapping lexer states to master regexs - self.lexstateretext = {} # Dictionary mapping lexer states to regex strings - self.lexstate = "INITIAL" # Current lexer state - self.lexstatestack = [] # Stack of lexer states - self.lexstateinfo = None # State information - self.lexstateignore = {} # Dictionary of ignored characters for each state - self.lexstateerrorf = {} # Dictionary of error functions for each state - self.lexreflags = 0 # Optional re compile flags - self.lexdata = None # Actual input data (as a string) - self.lexpos = 0 # Current position in input text - self.lexlen = 0 # Length of the input text - self.lexerrorf = None # Error rule (if any) - self.lextokens = None # List of valid tokens - self.lexignore = "" # Ignored characters - self.lexliterals = "" # Literal characters that can be passed through - self.lexmodule = None # Module - self.lineno = 1 # Current line number - self.lexdebug = 0 # Debugging mode - self.lexoptimize = 0 # Optimized mode - - def clone(self,object=None): - c = Lexer() - c.lexstatere = self.lexstatere - c.lexstateinfo = self.lexstateinfo - c.lexstateretext = self.lexstateretext - c.lexstate = self.lexstate - c.lexstatestack = self.lexstatestack - c.lexstateignore = self.lexstateignore - c.lexstateerrorf = self.lexstateerrorf - c.lexreflags = self.lexreflags - c.lexdata = self.lexdata - c.lexpos = self.lexpos - c.lexlen = self.lexlen - c.lextokens = self.lextokens - c.lexdebug = self.lexdebug - c.lineno = self.lineno - c.lexoptimize = self.lexoptimize - c.lexliterals = self.lexliterals - c.lexmodule = self.lexmodule - - # If the object parameter has been supplied, it means we are attaching the - # lexer to a new object. In this case, we have to rebind all methods in - # the lexstatere and lexstateerrorf tables. - - if object: - newtab = { } - for key, ritem in self.lexstatere.items(): - newre = [] - for cre, findex in ritem: - newfindex = [] - for f in findex: - if not f or not f[0]: - newfindex.append(f) - continue - newfindex.append((getattr(object,f[0].__name__),f[1])) - newre.append((cre,newfindex)) - newtab[key] = newre - c.lexstatere = newtab - c.lexstateerrorf = { } - for key, ef in self.lexstateerrorf.items(): - c.lexstateerrorf[key] = getattr(object,ef.__name__) - c.lexmodule = object - - # Set up other attributes - c.begin(c.lexstate) - return c - - # ------------------------------------------------------------ - # writetab() - Write lexer information to a table file - # ------------------------------------------------------------ - def writetab(self,tabfile): - tf = open(tabfile+".py","w") - tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__)) - tf.write("_lextokens = %s\n" % repr(self.lextokens)) - tf.write("_lexreflags = %s\n" % repr(self.lexreflags)) - tf.write("_lexliterals = %s\n" % repr(self.lexliterals)) - tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo)) - - tabre = { } - for key, lre in self.lexstatere.items(): - titem = [] - for i in range(len(lre)): - titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1]))) - tabre[key] = titem - - tf.write("_lexstatere = %s\n" % repr(tabre)) - tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore)) - - taberr = { } - for key, ef in self.lexstateerrorf.items(): - if ef: - taberr[key] = ef.__name__ - else: - taberr[key] = None - tf.write("_lexstateerrorf = %s\n" % repr(taberr)) - tf.close() - - # ------------------------------------------------------------ - # readtab() - Read lexer information from a tab file - # ------------------------------------------------------------ - def readtab(self,tabfile,fdict): - exec "import %s as lextab" % tabfile - self.lextokens = lextab._lextokens - self.lexreflags = lextab._lexreflags - self.lexliterals = lextab._lexliterals - self.lexstateinfo = lextab._lexstateinfo - self.lexstateignore = lextab._lexstateignore - self.lexstatere = { } - self.lexstateretext = { } - for key,lre in lextab._lexstatere.items(): - titem = [] - txtitem = [] - for i in range(len(lre)): - titem.append((re.compile(lre[i][0],lextab._lexreflags),_names_to_funcs(lre[i][1],fdict))) - txtitem.append(lre[i][0]) - self.lexstatere[key] = titem - self.lexstateretext[key] = txtitem - self.lexstateerrorf = { } - for key,ef in lextab._lexstateerrorf.items(): - self.lexstateerrorf[key] = fdict[ef] - self.begin('INITIAL') - - # ------------------------------------------------------------ - # input() - Push a new string into the lexer - # ------------------------------------------------------------ - def input(self,s): - if not (isinstance(s,types.StringType) or isinstance(s,types.UnicodeType)): - raise ValueError, "Expected a string" - self.lexdata = s - self.lexpos = 0 - self.lexlen = len(s) - - # ------------------------------------------------------------ - # begin() - Changes the lexing state - # ------------------------------------------------------------ - def begin(self,state): - if not self.lexstatere.has_key(state): - raise ValueError, "Undefined state" - self.lexre = self.lexstatere[state] - self.lexretext = self.lexstateretext[state] - self.lexignore = self.lexstateignore.get(state,"") - self.lexerrorf = self.lexstateerrorf.get(state,None) - self.lexstate = state - - # ------------------------------------------------------------ - # push_state() - Changes the lexing state and saves old on stack - # ------------------------------------------------------------ - def push_state(self,state): - self.lexstatestack.append(self.lexstate) - self.begin(state) - - # ------------------------------------------------------------ - # pop_state() - Restores the previous state - # ------------------------------------------------------------ - def pop_state(self): - self.begin(self.lexstatestack.pop()) - - # ------------------------------------------------------------ - # current_state() - Returns the current lexing state - # ------------------------------------------------------------ - def current_state(self): - return self.lexstate - - # ------------------------------------------------------------ - # skip() - Skip ahead n characters - # ------------------------------------------------------------ - def skip(self,n): - self.lexpos += n - - # ------------------------------------------------------------ - # token() - Return the next token from the Lexer - # - # Note: This function has been carefully implemented to be as fast - # as possible. Don't make changes unless you really know what - # you are doing - # ------------------------------------------------------------ - def token(self): - # Make local copies of frequently referenced attributes - lexpos = self.lexpos - lexlen = self.lexlen - lexignore = self.lexignore - lexdata = self.lexdata - - while lexpos < lexlen: - # This code provides some short-circuit code for whitespace, tabs, and other ignored characters - if lexdata[lexpos] in lexignore: - lexpos += 1 - continue - - # Look for a regular expression match - for lexre,lexindexfunc in self.lexre: - m = lexre.match(lexdata,lexpos) - if not m: continue - - # Set last match in lexer so that rules can access it if they want - self.lexmatch = m - - # Create a token for return - tok = LexToken() - tok.value = m.group() - tok.lineno = self.lineno - tok.lexpos = lexpos - tok.lexer = self - - lexpos = m.end() - i = m.lastindex - func,tok.type = lexindexfunc[i] - self.lexpos = lexpos - - if not func: - # If no token type was set, it's an ignored token - if tok.type: return tok - break - - # if func not callable, it means it's an ignored token - if not callable(func): - break - - # If token is processed by a function, call it - newtok = func(tok) - - # Every function must return a token, if nothing, we just move to next token - if not newtok: - lexpos = self.lexpos # This is here in case user has updated lexpos. - break - - # Verify type of the token. If not in the token map, raise an error - if not self.lexoptimize: - if not self.lextokens.has_key(newtok.type): - raise LexError, ("%s:%d: Rule '%s' returned an unknown token type '%s'" % ( - func.func_code.co_filename, func.func_code.co_firstlineno, - func.__name__, newtok.type),lexdata[lexpos:]) - - return newtok - else: - # No match, see if in literals - if lexdata[lexpos] in self.lexliterals: - tok = LexToken() - tok.value = lexdata[lexpos] - tok.lineno = self.lineno - tok.lexer = self - tok.type = tok.value - tok.lexpos = lexpos - self.lexpos = lexpos + 1 - return tok - - # No match. Call t_error() if defined. - if self.lexerrorf: - tok = LexToken() - tok.value = self.lexdata[lexpos:] - tok.lineno = self.lineno - tok.type = "error" - tok.lexer = self - tok.lexpos = lexpos - self.lexpos = lexpos - newtok = self.lexerrorf(tok) - if lexpos == self.lexpos: - # Error method didn't change text position at all. This is an error. - raise LexError, ("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:]) - lexpos = self.lexpos - if not newtok: continue - return newtok - - self.lexpos = lexpos - raise LexError, ("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:]) - - self.lexpos = lexpos + 1 - if self.lexdata is None: - raise RuntimeError, "No input string given with input()" - return None - -# ----------------------------------------------------------------------------- -# _validate_file() -# -# This checks to see if there are duplicated t_rulename() functions or strings -# in the parser input file. This is done using a simple regular expression -# match on each line in the filename. -# ----------------------------------------------------------------------------- - -def _validate_file(filename): - import os.path - base,ext = os.path.splitext(filename) - if ext != '.py': return 1 # No idea what the file is. Return OK - - try: - f = open(filename) - lines = f.readlines() - f.close() - except IOError: - return 1 # Oh well - - fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(') - sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=') - counthash = { } - linen = 1 - noerror = 1 - for l in lines: - m = fre.match(l) - if not m: - m = sre.match(l) - if m: - name = m.group(1) - prev = counthash.get(name) - if not prev: - counthash[name] = linen - else: - print "%s:%d: Rule %s redefined. Previously defined on line %d" % (filename,linen,name,prev) - noerror = 0 - linen += 1 - return noerror - -# ----------------------------------------------------------------------------- -# _funcs_to_names() -# -# Given a list of regular expression functions, this converts it to a list -# suitable for output to a table file -# ----------------------------------------------------------------------------- - -def _funcs_to_names(funclist): - result = [] - for f in funclist: - if f and f[0]: - result.append((f[0].__name__,f[1])) - else: - result.append(f) - return result - -# ----------------------------------------------------------------------------- -# _names_to_funcs() -# -# Given a list of regular expression function names, this converts it back to -# functions. -# ----------------------------------------------------------------------------- - -def _names_to_funcs(namelist,fdict): - result = [] - for n in namelist: - if n and n[0]: - result.append((fdict[n[0]],n[1])) - else: - result.append(n) - return result - -# ----------------------------------------------------------------------------- -# _form_master_re() -# -# This function takes a list of all of the regex components and attempts to -# form the master regular expression. Given limitations in the Python re -# module, it may be necessary to break the master regex into separate expressions. -# ----------------------------------------------------------------------------- - -def _form_master_re(relist,reflags,ldict): - if not relist: return [] - regex = "|".join(relist) - try: - lexre = re.compile(regex,re.VERBOSE | reflags) - - # Build the index to function map for the matching engine - lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1) - for f,i in lexre.groupindex.items(): - handle = ldict.get(f,None) - if type(handle) in (types.FunctionType, types.MethodType): - lexindexfunc[i] = (handle,handle.__name__[2:]) - elif handle is not None: - # If rule was specified as a string, we build an anonymous - # callback function to carry out the action - if f.find("ignore_") > 0: - lexindexfunc[i] = (None,None) - print "IGNORE", f - else: - lexindexfunc[i] = (None, f[2:]) - - return [(lexre,lexindexfunc)],[regex] - except Exception,e: - m = int(len(relist)/2) - if m == 0: m = 1 - llist, lre = _form_master_re(relist[:m],reflags,ldict) - rlist, rre = _form_master_re(relist[m:],reflags,ldict) - return llist+rlist, lre+rre - -# ----------------------------------------------------------------------------- -# def _statetoken(s,names) -# -# Given a declaration name s of the form "t_" and a dictionary whose keys are -# state names, this function returns a tuple (states,tokenname) where states -# is a tuple of state names and tokenname is the name of the token. For example, -# calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM') -# ----------------------------------------------------------------------------- - -def _statetoken(s,names): - nonstate = 1 - parts = s.split("_") - for i in range(1,len(parts)): - if not names.has_key(parts[i]) and parts[i] != 'ANY': break - if i > 1: - states = tuple(parts[1:i]) - else: - states = ('INITIAL',) - - if 'ANY' in states: - states = tuple(names.keys()) - - tokenname = "_".join(parts[i:]) - return (states,tokenname) - -# ----------------------------------------------------------------------------- -# lex(module) -# -# Build all of the regular expression rules from definitions in the supplied module -# ----------------------------------------------------------------------------- -def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0): - global lexer - ldict = None - stateinfo = { 'INITIAL' : 'inclusive'} - error = 0 - files = { } - lexobj = Lexer() - lexobj.lexdebug = debug - lexobj.lexoptimize = optimize - global token,input - - if nowarn: warn = 0 - else: warn = 1 - - if object: module = object - - if module: - # User supplied a module object. - if isinstance(module, types.ModuleType): - ldict = module.__dict__ - elif isinstance(module, _INSTANCETYPE): - _items = [(k,getattr(module,k)) for k in dir(module)] - ldict = { } - for (i,v) in _items: - ldict[i] = v - else: - raise ValueError,"Expected a module or instance" - lexobj.lexmodule = module - - else: - # No module given. We might be able to get information from the caller. - try: - raise RuntimeError - except RuntimeError: - e,b,t = sys.exc_info() - f = t.tb_frame - f = f.f_back # Walk out to our calling function - ldict = f.f_globals # Grab its globals dictionary - - if optimize and lextab: - try: - lexobj.readtab(lextab,ldict) - token = lexobj.token - input = lexobj.input - lexer = lexobj - return lexobj - - except ImportError: - pass - - # Get the tokens, states, and literals variables (if any) - if (module and isinstance(module,_INSTANCETYPE)): - tokens = getattr(module,"tokens",None) - states = getattr(module,"states",None) - literals = getattr(module,"literals","") - else: - tokens = ldict.get("tokens",None) - states = ldict.get("states",None) - literals = ldict.get("literals","") - - if not tokens: - raise SyntaxError,"lex: module does not define 'tokens'" - if not (isinstance(tokens,types.ListType) or isinstance(tokens,types.TupleType)): - raise SyntaxError,"lex: tokens must be a list or tuple." - - # Build a dictionary of valid token names - lexobj.lextokens = { } - if not optimize: - for n in tokens: - if not _is_identifier.match(n): - print "lex: Bad token name '%s'" % n - error = 1 - if warn and lexobj.lextokens.has_key(n): - print "lex: Warning. Token '%s' multiply defined." % n - lexobj.lextokens[n] = None - else: - for n in tokens: lexobj.lextokens[n] = None - - if debug: - print "lex: tokens = '%s'" % lexobj.lextokens.keys() - - try: - for c in literals: - if not (isinstance(c,types.StringType) or isinstance(c,types.UnicodeType)) or len(c) > 1: - print "lex: Invalid literal %s. Must be a single character" % repr(c) - error = 1 - continue - - except TypeError: - print "lex: Invalid literals specification. literals must be a sequence of characters." - error = 1 - - lexobj.lexliterals = literals - - # Build statemap - if states: - if not (isinstance(states,types.TupleType) or isinstance(states,types.ListType)): - print "lex: states must be defined as a tuple or list." - error = 1 - else: - for s in states: - if not isinstance(s,types.TupleType) or len(s) != 2: - print "lex: invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')" % repr(s) - error = 1 - continue - name, statetype = s - if not isinstance(name,types.StringType): - print "lex: state name %s must be a string" % repr(name) - error = 1 - continue - if not (statetype == 'inclusive' or statetype == 'exclusive'): - print "lex: state type for state %s must be 'inclusive' or 'exclusive'" % name - error = 1 - continue - if stateinfo.has_key(name): - print "lex: state '%s' already defined." % name - error = 1 - continue - stateinfo[name] = statetype - - # Get a list of symbols with the t_ or s_ prefix - tsymbols = [f for f in ldict.keys() if f[:2] == 't_' ] - - # Now build up a list of functions and a list of strings - - funcsym = { } # Symbols defined as functions - strsym = { } # Symbols defined as strings - toknames = { } # Mapping of symbols to token names - - for s in stateinfo.keys(): - funcsym[s] = [] - strsym[s] = [] - - ignore = { } # Ignore strings by state - errorf = { } # Error functions by state - - if len(tsymbols) == 0: - raise SyntaxError,"lex: no rules of the form t_rulename are defined." - - for f in tsymbols: - t = ldict[f] - states, tokname = _statetoken(f,stateinfo) - toknames[f] = tokname - - if callable(t): - for s in states: funcsym[s].append((f,t)) - elif (isinstance(t, types.StringType) or isinstance(t,types.UnicodeType)): - for s in states: strsym[s].append((f,t)) - else: - print "lex: %s not defined as a function or string" % f - error = 1 - - # Sort the functions by line number - for f in funcsym.values(): - f.sort(lambda x,y: cmp(x[1].func_code.co_firstlineno,y[1].func_code.co_firstlineno)) - - # Sort the strings by regular expression length - for s in strsym.values(): - s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1]))) - - regexs = { } - - # Build the master regular expressions - for state in stateinfo.keys(): - regex_list = [] - - # Add rules defined by functions first - for fname, f in funcsym[state]: - line = f.func_code.co_firstlineno - file = f.func_code.co_filename - files[file] = None - tokname = toknames[fname] - - ismethod = isinstance(f, types.MethodType) - - if not optimize: - nargs = f.func_code.co_argcount - if ismethod: - reqargs = 2 - else: - reqargs = 1 - if nargs > reqargs: - print "%s:%d: Rule '%s' has too many arguments." % (file,line,f.__name__) - error = 1 - continue - - if nargs < reqargs: - print "%s:%d: Rule '%s' requires an argument." % (file,line,f.__name__) - error = 1 - continue - - if tokname == 'ignore': - print "%s:%d: Rule '%s' must be defined as a string." % (file,line,f.__name__) - error = 1 - continue - - if tokname == 'error': - errorf[state] = f - continue - - if f.__doc__: - if not optimize: - try: - c = re.compile("(?P<%s>%s)" % (f.__name__,f.__doc__), re.VERBOSE | reflags) - if c.match(""): - print "%s:%d: Regular expression for rule '%s' matches empty string." % (file,line,f.__name__) - error = 1 - continue - except re.error,e: - print "%s:%d: Invalid regular expression for rule '%s'. %s" % (file,line,f.__name__,e) - if '#' in f.__doc__: - print "%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'." % (file,line, f.__name__) - error = 1 - continue - - if debug: - print "lex: Adding rule %s -> '%s' (state '%s')" % (f.__name__,f.__doc__, state) - - # Okay. The regular expression seemed okay. Let's append it to the master regular - # expression we're building - - regex_list.append("(?P<%s>%s)" % (f.__name__,f.__doc__)) - else: - print "%s:%d: No regular expression defined for rule '%s'" % (file,line,f.__name__) - - # Now add all of the simple rules - for name,r in strsym[state]: - tokname = toknames[name] - - if tokname == 'ignore': - ignore[state] = r - continue - - if not optimize: - if tokname == 'error': - raise SyntaxError,"lex: Rule '%s' must be defined as a function" % name - error = 1 - continue - - if not lexobj.lextokens.has_key(tokname) and tokname.find("ignore_") < 0: - print "lex: Rule '%s' defined for an unspecified token %s." % (name,tokname) - error = 1 - continue - try: - c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | reflags) - if (c.match("")): - print "lex: Regular expression for rule '%s' matches empty string." % name - error = 1 - continue - except re.error,e: - print "lex: Invalid regular expression for rule '%s'. %s" % (name,e) - if '#' in r: - print "lex: Make sure '#' in rule '%s' is escaped with '\\#'." % name - - error = 1 - continue - if debug: - print "lex: Adding rule %s -> '%s' (state '%s')" % (name,r,state) - - regex_list.append("(?P<%s>%s)" % (name,r)) - - if not regex_list: - print "lex: No rules defined for state '%s'" % state - error = 1 - - regexs[state] = regex_list - - - if not optimize: - for f in files.keys(): - if not _validate_file(f): - error = 1 - - if error: - raise SyntaxError,"lex: Unable to build lexer." - - # From this point forward, we're reasonably confident that we can build the lexer. - # No more errors will be generated, but there might be some warning messages. - - # Build the master regular expressions - - for state in regexs.keys(): - lexre, re_text = _form_master_re(regexs[state],reflags,ldict) - lexobj.lexstatere[state] = lexre - lexobj.lexstateretext[state] = re_text - if debug: - for i in range(len(re_text)): - print "lex: state '%s'. regex[%d] = '%s'" % (state, i, re_text[i]) - - # For inclusive states, we need to add the INITIAL state - for state,type in stateinfo.items(): - if state != "INITIAL" and type == 'inclusive': - lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL']) - lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL']) - - lexobj.lexstateinfo = stateinfo - lexobj.lexre = lexobj.lexstatere["INITIAL"] - lexobj.lexretext = lexobj.lexstateretext["INITIAL"] - - # Set up ignore variables - lexobj.lexstateignore = ignore - lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","") - - # Set up error functions - lexobj.lexstateerrorf = errorf - lexobj.lexerrorf = errorf.get("INITIAL",None) - if warn and not lexobj.lexerrorf: - print "lex: Warning. no t_error rule is defined." - - # Check state information for ignore and error rules - for s,stype in stateinfo.items(): - if stype == 'exclusive': - if warn and not errorf.has_key(s): - print "lex: Warning. no error rule is defined for exclusive state '%s'" % s - if warn and not ignore.has_key(s) and lexobj.lexignore: - print "lex: Warning. no ignore rule is defined for exclusive state '%s'" % s - elif stype == 'inclusive': - if not errorf.has_key(s): - errorf[s] = errorf.get("INITIAL",None) - if not ignore.has_key(s): - ignore[s] = ignore.get("INITIAL","") - - - # Create global versions of the token() and input() functions - token = lexobj.token - input = lexobj.input - lexer = lexobj - - # If in optimize mode, we write the lextab - if lextab and optimize: - lexobj.writetab(lextab) - - return lexobj - -# ----------------------------------------------------------------------------- -# runmain() -# -# This runs the lexer as a main program -# ----------------------------------------------------------------------------- - -def runmain(lexer=None,data=None): - if not data: - try: - filename = sys.argv[1] - f = open(filename) - data = f.read() - f.close() - except IndexError: - print "Reading from standard input (type EOF to end):" - data = sys.stdin.read() - - if lexer: - _input = lexer.input - else: - _input = input - _input(data) - if lexer: - _token = lexer.token - else: - _token = token - - while 1: - tok = _token() - if not tok: break - print "(%s,%r,%d,%d)" % (tok.type, tok.value, tok.lineno,tok.lexpos) - - -# ----------------------------------------------------------------------------- -# @TOKEN(regex) -# -# This decorator function can be used to set the regex expression on a function -# when its docstring might need to be set in an alternative way -# ----------------------------------------------------------------------------- - -def TOKEN(r): - def set_doc(f): - f.__doc__ = r - return f - return set_doc - -# Alternative spelling of the TOKEN decorator -Token = TOKEN - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/matching.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/matching.py deleted file mode 100644 index d56dd92..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/matching.py +++ /dev/null @@ -1,255 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Classes and algorithms for matching requested access to access vectors. -""" - -import access -import objectmodel -import itertools - -class Match: - def __init__(self, interface=None, dist=0): - self.interface = interface - self.dist = dist - self.info_dir_change = False - - def __cmp__(self, other): - if self.dist == other.dist: - if self.info_dir_change: - if other.info_dir_change: - return 0 - else: - return 1 - else: - if other.info_dir_change: - return -1 - else: - return 0 - else: - if self.dist < other.dist: - return -1 - else: - return 1 - -class MatchList: - DEFAULT_THRESHOLD = 150 - def __init__(self): - # Match objects that pass the threshold - self.children = [] - # Match objects over the threshold - self.bastards = [] - self.threshold = self.DEFAULT_THRESHOLD - self.allow_info_dir_change = False - self.av = None - - def best(self): - if len(self.children): - return self.children[0] - if len(self.bastards): - return self.bastards[0] - return None - - def __len__(self): - # Only return the length of the matches so - # that this can be used to test if there is - # a match. - return len(self.children) + len(self.bastards) - - def __iter__(self): - return iter(self.children) - - def all(self): - return itertools.chain(self.children, self.bastards) - - def append(self, match): - if match.dist <= self.threshold: - if not match.info_dir_change or self.allow_info_dir_change: - self.children.append(match) - else: - self.bastards.append(match) - else: - self.bastards.append(match) - - def sort(self): - self.children.sort() - self.bastards.sort() - - -class AccessMatcher: - def __init__(self, perm_maps=None): - self.type_penalty = 10 - self.obj_penalty = 10 - if perm_maps: - self.perm_maps = perm_maps - else: - self.perm_maps = objectmodel.PermMappings() - # We want a change in the information flow direction - # to be a strong penalty - stronger than access to - # a few unrelated types. - self.info_dir_penalty = 100 - - def type_distance(self, a, b): - if a == b or access.is_idparam(b): - return 0 - else: - return -self.type_penalty - - - def perm_distance(self, av_req, av_prov): - # First check that we have enough perms - diff = av_req.perms.difference(av_prov.perms) - - if len(diff) != 0: - total = self.perm_maps.getdefault_distance(av_req.obj_class, diff) - return -total - else: - diff = av_prov.perms.difference(av_req.perms) - return self.perm_maps.getdefault_distance(av_req.obj_class, diff) - - def av_distance(self, req, prov): - """Determine the 'distance' between 2 access vectors. - - This function is used to find an access vector that matches - a 'required' access. To do this we comput a signed numeric - value that indicates how close the req access is to the - 'provided' access vector. The closer the value is to 0 - the closer the match, with 0 being an exact match. - - A value over 0 indicates that the prov access vector provides more - access than the req (in practice, this means that the source type, - target type, and object class is the same and the perms in prov is - a superset of those in req. - - A value under 0 indicates that the prov access less - or unrelated - - access to the req access. A different type or object class will - result in a very low value. - - The values other than 0 should only be interpreted relative to - one another - they have no exact meaning and are likely to - change. - - Params: - req - [AccessVector] The access that is required. This is the - access being matched. - prov - [AccessVector] The access provided. This is the potential - match that is being evaluated for req. - Returns: - 0 : Exact match between the acess vectors. - - < 0 : The prov av does not provide all of the access in req. - A smaller value indicates that the access is further. - - > 0 : The prov av provides more access than req. The larger - the value the more access over req. - """ - # FUTURE - this is _very_ expensive and probably needs some - # thorough performance work. This version is meant to give - # meaningful results relatively simply. - dist = 0 - - # Get the difference between the types. The addition is safe - # here because type_distance only returns 0 or negative. - dist += self.type_distance(req.src_type, prov.src_type) - dist += self.type_distance(req.tgt_type, prov.tgt_type) - - # Object class distance - if req.obj_class != prov.obj_class and not access.is_idparam(prov.obj_class): - dist -= self.obj_penalty - - # Permission distance - - # If this av doesn't have a matching source type, target type, and object class - # count all of the permissions against it. Otherwise determine the perm - # distance and dir. - if dist < 0: - pdist = self.perm_maps.getdefault_distance(prov.obj_class, prov.perms) - else: - pdist = self.perm_distance(req, prov) - - # Combine the perm and other distance - if dist < 0: - if pdist < 0: - return dist + pdist - else: - return dist - pdist - elif dist >= 0: - if pdist < 0: - return pdist - dist - else: - return dist + pdist - - def av_set_match(self, av_set, av): - """ - - """ - dist = None - - # Get the distance for each access vector - for x in av_set: - tmp = self.av_distance(av, x) - if dist is None: - dist = tmp - elif tmp >= 0: - if dist >= 0: - dist += tmp - else: - dist = tmp + -dist - else: - if dist < 0: - dist += tmp - else: - dist -= tmp - - # Penalize for information flow - we want to prevent the - # addition of a write if the requested is read none. We are - # much less concerned about the reverse. - av_dir = self.perm_maps.getdefault_direction(av.obj_class, av.perms) - - if av_set.info_dir is None: - av_set.info_dir = objectmodel.FLOW_NONE - for x in av_set: - av_set.info_dir = av_set.info_dir | \ - self.perm_maps.getdefault_direction(x.obj_class, x.perms) - if (av_dir & objectmodel.FLOW_WRITE == 0) and (av_set.info_dir & objectmodel.FLOW_WRITE): - if dist < 0: - dist -= self.info_dir_penalty - else: - dist += self.info_dir_penalty - - return dist - - def search_ifs(self, ifset, av, match_list): - match_list.av = av - for iv in itertools.chain(ifset.tgt_type_all, - ifset.tgt_type_map.get(av.tgt_type, [])): - if not iv.enabled: - #print "iv %s not enabled" % iv.name - continue - - dist = self.av_set_match(iv.access, av) - if dist >= 0: - m = Match(iv, dist) - match_list.append(m) - - - match_list.sort() - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/module.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/module.py deleted file mode 100644 index 7fc9443..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/module.py +++ /dev/null @@ -1,213 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Utilities for dealing with the compilation of modules and creation -of module tress. -""" - -import defaults - -import selinux - -import re -import tempfile -import commands -import os -import os.path -import subprocess -import shutil - -def is_valid_name(modname): - """Check that a module name is valid. - """ - m = re.findall("[^a-zA-Z0-9_\-\.]", modname) - if len(m) == 0 and modname[0].isalpha(): - return True - else: - return False - -class ModuleTree: - def __init__(self, modname): - self.modname = modname - self.dirname = None - - def dir_name(self): - return self.dirname - - def te_name(self): - return self.dirname + "/" + self.modname + ".te" - - def fc_name(self): - return self.dirname + "/" + self.modname + ".fc" - - def if_name(self): - return self.dirname + "/" + self.modname + ".if" - - def package_name(self): - return self.dirname + "/" + self.modname + ".pp" - - def makefile_name(self): - return self.dirname + "/Makefile" - - def create(self, parent_dirname, makefile_include=None): - self.dirname = parent_dirname + "/" + self.modname - os.mkdir(self.dirname) - fd = open(self.makefile_name(), "w") - if makefile_include: - fd.write("include " + makefile_include) - else: - fd.write("include " + defaults.refpolicy_makefile()) - fd.close() - - # Create empty files for the standard refpolicy - # module files - open(self.te_name(), "w").close() - open(self.fc_name(), "w").close() - open(self.if_name(), "w").close() - -def modname_from_sourcename(sourcename): - return os.path.splitext(os.path.split(sourcename)[1])[0] - -class ModuleCompiler: - """ModuleCompiler eases running of the module compiler. - - The ModuleCompiler class encapsulates running the commandline - module compiler (checkmodule) and module packager (semodule_package). - You are likely interested in the create_module_package method. - - Several options are controlled via paramaters (only effects the - non-refpol builds): - - .mls [boolean] Generate an MLS module (by passed -M to - checkmodule). True to generate an MLS module, false - otherwise. - - .module [boolean] Generate a module instead of a base module. - True to generate a module, false to generate a base. - - .checkmodule [string] Fully qualified path to the module compiler. - Default is /usr/bin/checkmodule. - - .semodule_package [string] Fully qualified path to the module - packager. Defaults to /usr/bin/semodule_package. - .output [file object] File object used to write verbose - output of the compililation and packaging process. - """ - def __init__(self, output=None): - """Create a ModuleCompiler instance, optionally with an - output file object for verbose output of the compilation process. - """ - self.mls = selinux.is_selinux_mls_enabled() - self.module = True - self.checkmodule = "/usr/bin/checkmodule" - self.semodule_package = "/usr/bin/semodule_package" - self.output = output - self.last_output = "" - self.refpol_makefile = defaults.refpolicy_makefile() - self.make = "/usr/bin/make" - - def o(self, str): - if self.output: - self.output.write(str + "\n") - self.last_output = str - - def run(self, command): - self.o(command) - rc, output = commands.getstatusoutput(command) - self.o(output) - - return rc - - def gen_filenames(self, sourcename): - """Generate the module and policy package filenames from - a source file name. The source file must be in the form - of "foo.te". This will generate "foo.mod" and "foo.pp". - - Returns a tuple with (modname, policypackage). - """ - splitname = sourcename.split(".") - if len(splitname) < 2: - raise RuntimeError("invalid sourcefile name %s (must end in .te)", sourcename) - # Handle other periods in the filename correctly - basename = ".".join(splitname[0:-1]) - modname = basename + ".mod" - packagename = basename + ".pp" - - return (modname, packagename) - - def create_module_package(self, sourcename, refpolicy=True): - """Create a module package saved in a packagename from a - sourcename. - - The create_module_package creates a module package saved in a - file named sourcename (.pp is the standard extension) from a - source file (.te is the standard extension). The source file - should contain SELinux policy statements appropriate for a - base or non-base module (depending on the setting of .module). - - Only file names are accepted, not open file objects or - descriptors because the command line SELinux tools are used. - - On error a RuntimeError will be raised with a descriptive - error message. - """ - if refpolicy: - self.refpol_build(sourcename) - else: - modname, packagename = self.gen_filenames(sourcename) - self.compile(sourcename, modname) - self.package(modname, packagename) - os.unlink(modname) - - def refpol_build(self, sourcename): - # Compile - command = self.make + " -f " + self.refpol_makefile - rc = self.run(command) - - # Raise an error if the process failed - if rc != 0: - raise RuntimeError("compilation failed:\n%s" % self.last_output) - - def compile(self, sourcename, modname): - s = [self.checkmodule] - if self.mls: - s.append("-M") - if self.module: - s.append("-m") - s.append("-o") - s.append(modname) - s.append(sourcename) - - rc = self.run(" ".join(s)) - if rc != 0: - raise RuntimeError("compilation failed:\n%s" % self.last_output) - - def package(self, modname, packagename): - s = [self.semodule_package] - s.append("-o") - s.append(packagename) - s.append("-m") - s.append(modname) - - rc = self.run(" ".join(s)) - if rc != 0: - raise RuntimeError("packaging failed [%s]" % self.last_output) - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/objectmodel.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/objectmodel.py deleted file mode 100644 index 88c8a1f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/objectmodel.py +++ /dev/null @@ -1,172 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -This module provides knowledge object classes and permissions. It should -be used to keep this knowledge from leaking into the more generic parts of -the policy generation. -""" - -# Objects that can be implicitly typed - these objects do -# not _have_ to be implicitly typed (e.g., sockets can be -# explicitly labeled), but they often are. -# -# File is in this list for /proc/self -# -# This list is useful when dealing with rules that have a -# type (or param) used as both a subject and object. For -# example: -# -# allow httpd_t httpd_t : socket read; -# -# This rule makes sense because the socket was (presumably) created -# by a process with the type httpd_t. -implicitly_typed_objects = ["socket", "fd", "process", "file", "lnk_file", "fifo_file", - "dbus", "capability", "unix_stream_socket"] - -#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -# -#Information Flow -# -# All of the permissions in SELinux can be described in terms of -# information flow. For example, a read of a file is a flow of -# information from that file to the process reading. Viewing -# permissions in these terms can be used to model a varity of -# security properties. -# -# Here we have some infrastructure for understanding permissions -# in terms of information flow -# -#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -# Information flow deals with information either flowing from a subject -# to and object ("write") or to a subject from an object ("read"). Read -# or write is described from the subject point-of-view. It is also possible -# for a permission to represent both a read and write (though the flow is -# typical asymettric in terms of bandwidth). It is also possible for -# permission to not flow information (meaning that the result is pure -# side-effect). -# -# The following constants are for representing the directionality -# of information flow. -FLOW_NONE = 0 -FLOW_READ = 1 -FLOW_WRITE = 2 -FLOW_BOTH = FLOW_READ | FLOW_WRITE - -# These are used by the parser and for nice disply of the directions -str_to_dir = { "n" : FLOW_NONE, "r" : FLOW_READ, "w" : FLOW_WRITE, "b" : FLOW_BOTH } -dir_to_str = { FLOW_NONE : "n", FLOW_READ : "r", FLOW_WRITE : "w", FLOW_BOTH : "b" } - -class PermMap: - """A mapping between a permission and its information flow properties. - - PermMap represents the information flow properties of a single permission - including the direction (read, write, etc.) and an abstract representation - of the bandwidth of the flow (weight). - """ - def __init__(self, perm, dir, weight): - self.perm = perm - self.dir = dir - self.weight = weight - - def __repr__(self): - return "<sepolgen.objectmodel.PermMap %s %s %d>" % (self.perm, - dir_to_str[self.dir], - self.weight) - -class PermMappings: - """The information flow properties of a set of object classes and permissions. - - PermMappings maps one or more classes and permissions to their PermMap objects - describing their information flow charecteristics. - """ - def __init__(self): - self.classes = { } - self.default_weight = 5 - self.default_dir = FLOW_BOTH - - def from_file(self, fd): - """Read the permission mappings from a file. This reads the format used - by Apol in the setools suite. - """ - # This parsing is deliberitely picky and bails at the least error. It - # is assumed that the permission map file will be shipped as part - # of sepolgen and not user modified, so this is a reasonable design - # choice. If user supplied permission mappings are needed the parser - # should be made a little more robust and give better error messages. - cur = None - for line in fd: - fields = line.split() - if len(fields) == 0 or len(fields) == 1 or fields[0] == "#": - continue - if fields[0] == "class": - c = fields[1] - if self.classes.has_key(c): - raise ValueError("duplicate class in perm map") - self.classes[c] = { } - cur = self.classes[c] - else: - if len(fields) != 3: - raise ValueError("error in object classs permissions") - if cur is None: - raise ValueError("permission outside of class") - pm = PermMap(fields[0], str_to_dir[fields[1]], int(fields[2])) - cur[pm.perm] = pm - - def get(self, obj, perm): - """Get the permission map for the object permission. - - Returns: - PermMap representing the permission - Raises: - KeyError if the object or permission is not defined - """ - return self.classes[obj][perm] - - def getdefault(self, obj, perm): - """Get the permission map for the object permission or a default. - - getdefault is the same as get except that a default PermMap is - returned if the object class or permission is not defined. The - default is FLOW_BOTH with a weight of 5. - """ - try: - pm = self.classes[obj][perm] - except KeyError: - return PermMap(perm, self.default_dir, self.default_weight) - return pm - - def getdefault_direction(self, obj, perms): - dir = FLOW_NONE - for perm in perms: - pm = self.getdefault(obj, perm) - dir = dir | pm.dir - return dir - - def getdefault_distance(self, obj, perms): - total = 0 - for perm in perms: - pm = self.getdefault(obj, perm) - total += pm.weight - - return total - - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/output.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/output.py deleted file mode 100644 index 739452d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/output.py +++ /dev/null @@ -1,173 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Classes and functions for the output of reference policy modules. - -This module takes a refpolicy.Module object and formats it for -output using the ModuleWriter object. By separating the output -in this way the other parts of Madison can focus solely on -generating policy. This keeps the semantic / syntactic issues -cleanly separated from the formatting issues. -""" - -import refpolicy -import util - -class ModuleWriter: - def __init__(self): - self.fd = None - self.module = None - self.sort = True - self.requires = True - - def write(self, module, fd): - self.module = module - - if self.sort: - sort_filter(self.module) - - # FIXME - make this handle nesting - for node, depth in refpolicy.walktree(self.module, showdepth=True): - fd.write("%s\n" % str(node)) - -# Helper functions for sort_filter - this is all done old school -# C style rather than with polymorphic methods because this sorting -# is specific to output. It is not necessarily the comparison you -# want generally. - -# Compare two IdSets - we could probably do something clever -# with different here, but this works. -def id_set_cmp(x, y): - xl = util.set_to_list(x) - xl.sort() - yl = util.set_to_list(y) - yl.sort() - - if len(xl) != len(yl): - return cmp(xl[0], yl[0]) - for v in zip(xl, yl): - if v[0] != v[1]: - return cmp(v[0], v[1]) - return 0 - -# Compare two avrules -def avrule_cmp(a, b): - ret = id_set_cmp(a.src_types, b.src_types) - if ret is not 0: - return ret - ret = id_set_cmp(a.tgt_types, b.tgt_types) - if ret is not 0: - return ret - ret = id_set_cmp(a.obj_classes, b.obj_classes) - if ret is not 0: - return ret - - # At this point, who cares - just return something - return cmp(len(a.perms), len(b.perms)) - -# Compare two interface calls -def ifcall_cmp(a, b): - if a.args[0] != b.args[0]: - return cmp(a.args[0], b.args[0]) - return cmp(a.ifname, b.ifname) - -# Compare an two avrules or interface calls -def rule_cmp(a, b): - if isinstance(a, refpolicy.InterfaceCall): - if isinstance(b, refpolicy.InterfaceCall): - return ifcall_cmp(a, b) - else: - return id_set_cmp([a.args[0]], b.src_types) - else: - if isinstance(b, refpolicy.AVRule): - return avrule_cmp(a,b) - else: - return id_set_cmp(a.src_types, [b.args[0]]) - -def role_type_cmp(a, b): - return cmp(a.role, b.role) - -def sort_filter(module): - """Sort and group the output for readability. - """ - def sort_node(node): - c = [] - - # Module statement - for mod in node.module_declarations(): - c.append(mod) - c.append(refpolicy.Comment()) - - # Requires - for require in node.requires(): - c.append(require) - c.append(refpolicy.Comment()) - - # Rules - # - # We are going to group output by source type (which - # we assume is the first argument for interfaces). - rules = [] - rules.extend(node.avrules()) - rules.extend(node.interface_calls()) - rules.sort(rule_cmp) - - cur = None - sep_rules = [] - for rule in rules: - if isinstance(rule, refpolicy.InterfaceCall): - x = rule.args[0] - else: - x = util.first(rule.src_types) - - if cur != x: - if cur: - sep_rules.append(refpolicy.Comment()) - cur = x - comment = refpolicy.Comment() - comment.lines.append("============= %s ==============" % cur) - sep_rules.append(comment) - sep_rules.append(rule) - - c.extend(sep_rules) - - - ras = [] - ras.extend(node.role_types()) - ras.sort(role_type_cmp) - if len(ras): - comment = refpolicy.Comment() - comment.lines.append("============= ROLES ==============") - c.append(comment) - - - c.extend(ras) - - # Everything else - for child in node.children: - if child not in c: - c.append(child) - - node.children = c - - for node in module.nodes(): - sort_node(node) - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/policygen.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/policygen.py deleted file mode 100644 index 5f38577..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/policygen.py +++ /dev/null @@ -1,402 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -classes and algorithms for the generation of SELinux policy. -""" - -import itertools -import textwrap - -import refpolicy -import objectmodel -import access -import interfaces -import matching -import selinux.audit2why as audit2why -try: - from setools import * -except: - pass - -# Constants for the level of explanation from the generation -# routines -NO_EXPLANATION = 0 -SHORT_EXPLANATION = 1 -LONG_EXPLANATION = 2 - -class PolicyGenerator: - """Generate a reference policy module from access vectors. - - PolicyGenerator generates a new reference policy module - or updates an existing module based on requested access - in the form of access vectors. - - It generates allow rules and optionally module require - statements and reference policy interfaces. By default - only allow rules are generated. The methods .set_gen_refpol - and .set_gen_requires turns on interface generation and - requires generation respectively. - - PolicyGenerator can also optionally add comments explaining - why a particular access was allowed based on the audit - messages that generated the access. The access vectors - passed in must have the .audit_msgs field set correctly - and .explain set to SHORT|LONG_EXPLANATION to enable this - feature. - - The module created by PolicyGenerator can be passed to - output.ModuleWriter to output a text representation. - """ - def __init__(self, module=None): - """Initialize a PolicyGenerator with an optional - existing module. - - If the module paramater is not None then access - will be added to the passed in module. Otherwise - a new reference policy module will be created. - """ - self.ifgen = None - self.explain = NO_EXPLANATION - self.gen_requires = False - if module: - self.moduel = module - else: - self.module = refpolicy.Module() - - self.dontaudit = False - - self.domains = None - def set_gen_refpol(self, if_set=None, perm_maps=None): - """Set whether reference policy interfaces are generated. - - To turn on interface generation pass in an interface set - to use for interface generation. To turn off interface - generation pass in None. - - If interface generation is enabled requires generation - will also be enabled. - """ - if if_set: - self.ifgen = InterfaceGenerator(if_set, perm_maps) - self.gen_requires = True - else: - self.ifgen = None - self.__set_module_style() - - - def set_gen_requires(self, status=True): - """Set whether module requires are generated. - - Passing in true will turn on requires generation and - False will disable generation. If requires generation is - disabled interface generation will also be disabled and - can only be re-enabled via .set_gen_refpol. - """ - self.gen_requires = status - - def set_gen_explain(self, explain=SHORT_EXPLANATION): - """Set whether access is explained. - """ - self.explain = explain - - def set_gen_dontaudit(self, dontaudit): - self.dontaudit = dontaudit - - def __set_module_style(self): - if self.ifgen: - refpolicy = True - else: - refpolicy = False - for mod in self.module.module_declarations(): - mod.refpolicy = refpolicy - - def set_module_name(self, name, version="1.0"): - """Set the name of the module and optionally the version. - """ - # find an existing module declaration - m = None - for mod in self.module.module_declarations(): - m = mod - if not m: - m = refpolicy.ModuleDeclaration() - self.module.children.insert(0, m) - m.name = name - m.version = version - if self.ifgen: - m.refpolicy = True - else: - m.refpolicy = False - - def get_module(self): - # Generate the requires - if self.gen_requires: - gen_requires(self.module) - - """Return the generated module""" - return self.module - - def __add_allow_rules(self, avs): - for av in avs: - rule = refpolicy.AVRule(av) - if self.dontaudit: - rule.rule_type = rule.DONTAUDIT - rule.comment = "" - if self.explain: - rule.comment = str(refpolicy.Comment(explain_access(av, verbosity=self.explain))) - if av.type == audit2why.ALLOW: - rule.comment += "\n#!!!! This avc is allowed in the current policy" - if av.type == audit2why.DONTAUDIT: - rule.comment += "\n#!!!! This avc has a dontaudit rule in the current policy" - - if av.type == audit2why.BOOLEAN: - if len(av.data) > 1: - rule.comment += "\n#!!!! This avc can be allowed using one of the these booleans:\n# %s" % ", ".join(map(lambda x: x[0], av.data)) - else: - rule.comment += "\n#!!!! This avc can be allowed using the boolean '%s'" % av.data[0][0] - - if av.type == audit2why.CONSTRAINT: - rule.comment += "\n#!!!! This avc is a constraint violation. You would need to modify the attributes of either the source or target types to allow this access." - rule.comment += "\n#Constraint rule: " - rule.comment += "\n\t" + av.data[0] - for reason in av.data[1:]: - rule.comment += "\n#\tPossible cause is the source %s and target %s are different." % reason - - try: - if ( av.type == audit2why.TERULE and - "write" in av.perms and - ( "dir" in av.obj_class or "open" in av.perms )): - if not self.domains: - self.domains = seinfo(ATTRIBUTE, name="domain")[0]["types"] - types=[] - - for i in map(lambda x: x[TCONTEXT], sesearch([ALLOW], {SCONTEXT: av.src_type, CLASS: av.obj_class, PERMS: av.perms})): - if i not in self.domains: - types.append(i) - if len(types) == 1: - rule.comment += "\n#!!!! The source type '%s' can write to a '%s' of the following type:\n# %s\n" % ( av.src_type, av.obj_class, ", ".join(types)) - elif len(types) >= 1: - rule.comment += "\n#!!!! The source type '%s' can write to a '%s' of the following types:\n# %s\n" % ( av.src_type, av.obj_class, ", ".join(types)) - except: - pass - self.module.children.append(rule) - - - def add_access(self, av_set): - """Add the access from the access vector set to this - module. - """ - # Use the interface generator to split the access - # into raw allow rules and interfaces. After this - # a will contain a list of access that should be - # used as raw allow rules and the interfaces will - # be added to the module. - if self.ifgen: - raw_allow, ifcalls = self.ifgen.gen(av_set, self.explain) - self.module.children.extend(ifcalls) - else: - raw_allow = av_set - - # Generate the raw allow rules from the filtered list - self.__add_allow_rules(raw_allow) - - def add_role_types(self, role_type_set): - for role_type in role_type_set: - self.module.children.append(role_type) - -def explain_access(av, ml=None, verbosity=SHORT_EXPLANATION): - """Explain why a policy statement was generated. - - Return a string containing a text explanation of - why a policy statement was generated. The string is - commented and wrapped and can be directly inserted - into a policy. - - Params: - av - access vector representing the access. Should - have .audit_msgs set appropriately. - verbosity - the amount of explanation provided. Should - be set to NO_EXPLANATION, SHORT_EXPLANATION, or - LONG_EXPLANATION. - Returns: - list of strings - strings explaining the access or an empty - string if verbosity=NO_EXPLANATION or there is not sufficient - information to provide an explanation. - """ - s = [] - - def explain_interfaces(): - if not ml: - return - s.append(" Interface options:") - for match in ml.all(): - ifcall = call_interface(match.interface, ml.av) - s.append(' %s # [%d]' % (ifcall.to_string(), match.dist)) - - - # Format the raw audit data to explain why the - # access was requested - either long or short. - if verbosity == LONG_EXPLANATION: - for msg in av.audit_msgs: - s.append(' %s' % msg.header) - s.append(' scontext="%s" tcontext="%s"' % - (str(msg.scontext), str(msg.tcontext))) - s.append(' class="%s" perms="%s"' % - (msg.tclass, refpolicy.list_to_space_str(msg.accesses))) - s.append(' comm="%s" exe="%s" path="%s"' % (msg.comm, msg.exe, msg.path)) - s.extend(textwrap.wrap('message="' + msg.message + '"', 80, initial_indent=" ", - subsequent_indent=" ")) - explain_interfaces() - elif verbosity: - s.append(' src="%s" tgt="%s" class="%s", perms="%s"' % - (av.src_type, av.tgt_type, av.obj_class, av.perms.to_space_str())) - # For the short display we are only going to use the additional information - # from the first audit message. For the vast majority of cases this info - # will always be the same anyway. - if len(av.audit_msgs) > 0: - msg = av.audit_msgs[0] - s.append(' comm="%s" exe="%s" path="%s"' % (msg.comm, msg.exe, msg.path)) - explain_interfaces() - return s - -def param_comp(a, b): - return cmp(b.num, a.num) - -def call_interface(interface, av): - params = [] - args = [] - - params.extend(interface.params.values()) - params.sort(param_comp) - - ifcall = refpolicy.InterfaceCall() - ifcall.ifname = interface.name - - for i in range(len(params)): - if params[i].type == refpolicy.SRC_TYPE: - ifcall.args.append(av.src_type) - elif params[i].type == refpolicy.TGT_TYPE: - ifcall.args.append(av.tgt_type) - elif params[i].type == refpolicy.OBJ_CLASS: - ifcall.args.append(av.obj_class) - else: - print params[i].type - assert(0) - - assert(len(ifcall.args) > 0) - - return ifcall - -class InterfaceGenerator: - def __init__(self, ifs, perm_maps=None): - self.ifs = ifs - self.hack_check_ifs(ifs) - self.matcher = matching.AccessMatcher(perm_maps) - self.calls = [] - - def hack_check_ifs(self, ifs): - # FIXME: Disable interfaces we can't call - this is a hack. - # Because we don't handle roles, multiple paramaters, etc., - # etc., we must make certain we can actually use a returned - # interface. - for x in ifs.interfaces.values(): - params = [] - params.extend(x.params.values()) - params.sort(param_comp) - for i in range(len(params)): - # Check that the paramater position matches - # the number (e.g., $1 is the first arg). This - # will fail if the parser missed something. - if (i + 1) != params[i].num: - x.enabled = False - break - # Check that we can handle the param type (currently excludes - # roles. - if params[i].type not in [refpolicy.SRC_TYPE, refpolicy.TGT_TYPE, - refpolicy.OBJ_CLASS]: - x.enabled = False - break - - def gen(self, avs, verbosity): - raw_av = self.match(avs) - ifcalls = [] - for ml in self.calls: - ifcall = call_interface(ml.best().interface, ml.av) - if verbosity: - ifcall.comment = refpolicy.Comment(explain_access(ml.av, ml, verbosity)) - ifcalls.append((ifcall, ml)) - - d = [] - for ifcall, ifs in ifcalls: - found = False - for o_ifcall in d: - if o_ifcall.matches(ifcall): - if o_ifcall.comment and ifcall.comment: - o_ifcall.comment.merge(ifcall.comment) - found = True - if not found: - d.append(ifcall) - - return (raw_av, d) - - - def match(self, avs): - raw_av = [] - for av in avs: - ans = matching.MatchList() - self.matcher.search_ifs(self.ifs, av, ans) - if len(ans): - self.calls.append(ans) - else: - raw_av.append(av) - - return raw_av - - -def gen_requires(module): - """Add require statements to the module. - """ - def collect_requires(node): - r = refpolicy.Require() - for avrule in node.avrules(): - r.types.update(avrule.src_types) - r.types.update(avrule.tgt_types) - for obj in avrule.obj_classes: - r.add_obj_class(obj, avrule.perms) - - for ifcall in node.interface_calls(): - for arg in ifcall.args: - # FIXME - handle non-type arguments when we - # can actually figure those out. - r.types.add(arg) - - for role_type in node.role_types(): - r.roles.add(role_type.role) - r.types.update(role_type.types) - - r.types.discard("self") - - node.children.insert(0, r) - - # FUTURE - this is untested on modules with any sort of - # nesting - for node in module.nodes(): - collect_requires(node) - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/refparser.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/refparser.py deleted file mode 100644 index 83542d3..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/refparser.py +++ /dev/null @@ -1,1128 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006-2007 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -# OVERVIEW -# -# -# This is a parser for the refpolicy policy "language" - i.e., the -# normal SELinux policy language plus the refpolicy style M4 macro -# constructs on top of that base language. This parser is primarily -# aimed at parsing the policy headers in order to create an abstract -# policy representation suitable for generating policy. -# -# Both the lexer and parser are included in this file. The are implemented -# using the Ply library (included with sepolgen). - -import sys -import os -import re -import traceback - -import refpolicy -import access -import defaults - -import lex -import yacc - -# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -# -# lexer -# -# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -tokens = ( - # basic tokens, punctuation - 'TICK', - 'SQUOTE', - 'OBRACE', - 'CBRACE', - 'SEMI', - 'COLON', - 'OPAREN', - 'CPAREN', - 'COMMA', - 'MINUS', - 'TILDE', - 'ASTERISK', - 'AMP', - 'BAR', - 'EXPL', - 'EQUAL', - 'FILENAME', - 'IDENTIFIER', - 'NUMBER', - 'PATH', - 'IPV6_ADDR', - # reserved words - # module - 'MODULE', - 'POLICY_MODULE', - 'REQUIRE', - # flask - 'SID', - 'GENFSCON', - 'FS_USE_XATTR', - 'FS_USE_TRANS', - 'FS_USE_TASK', - 'PORTCON', - 'NODECON', - 'NETIFCON', - 'PIRQCON', - 'IOMEMCON', - 'IOPORTCON', - 'PCIDEVICECON', - 'DEVICETREECON', - # object classes - 'CLASS', - # types and attributes - 'TYPEATTRIBUTE', - 'ROLEATTRIBUTE', - 'TYPE', - 'ATTRIBUTE', - 'ATTRIBUTE_ROLE', - 'ALIAS', - 'TYPEALIAS', - # conditional policy - 'BOOL', - 'TRUE', - 'FALSE', - 'IF', - 'ELSE', - # users and roles - 'ROLE', - 'TYPES', - # rules - 'ALLOW', - 'DONTAUDIT', - 'AUDITALLOW', - 'NEVERALLOW', - 'PERMISSIVE', - 'TYPE_TRANSITION', - 'TYPE_CHANGE', - 'TYPE_MEMBER', - 'RANGE_TRANSITION', - 'ROLE_TRANSITION', - # refpolicy keywords - 'OPT_POLICY', - 'INTERFACE', - 'TUNABLE_POLICY', - 'GEN_REQ', - 'TEMPLATE', - 'GEN_CONTEXT', - # m4 - 'IFELSE', - 'IFDEF', - 'IFNDEF', - 'DEFINE' - ) - -# All reserved keywords - see t_IDENTIFIER for how these are matched in -# the lexer. -reserved = { - # module - 'module' : 'MODULE', - 'policy_module' : 'POLICY_MODULE', - 'require' : 'REQUIRE', - # flask - 'sid' : 'SID', - 'genfscon' : 'GENFSCON', - 'fs_use_xattr' : 'FS_USE_XATTR', - 'fs_use_trans' : 'FS_USE_TRANS', - 'fs_use_task' : 'FS_USE_TASK', - 'portcon' : 'PORTCON', - 'nodecon' : 'NODECON', - 'netifcon' : 'NETIFCON', - 'pirqcon' : 'PIRQCON', - 'iomemcon' : 'IOMEMCON', - 'ioportcon' : 'IOPORTCON', - 'pcidevicecon' : 'PCIDEVICECON', - 'devicetreecon' : 'DEVICETREECON', - # object classes - 'class' : 'CLASS', - # types and attributes - 'typeattribute' : 'TYPEATTRIBUTE', - 'roleattribute' : 'ROLEATTRIBUTE', - 'type' : 'TYPE', - 'attribute' : 'ATTRIBUTE', - 'attribute_role' : 'ATTRIBUTE_ROLE', - 'alias' : 'ALIAS', - 'typealias' : 'TYPEALIAS', - # conditional policy - 'bool' : 'BOOL', - 'true' : 'TRUE', - 'false' : 'FALSE', - 'if' : 'IF', - 'else' : 'ELSE', - # users and roles - 'role' : 'ROLE', - 'types' : 'TYPES', - # rules - 'allow' : 'ALLOW', - 'dontaudit' : 'DONTAUDIT', - 'auditallow' : 'AUDITALLOW', - 'neverallow' : 'NEVERALLOW', - 'permissive' : 'PERMISSIVE', - 'type_transition' : 'TYPE_TRANSITION', - 'type_change' : 'TYPE_CHANGE', - 'type_member' : 'TYPE_MEMBER', - 'range_transition' : 'RANGE_TRANSITION', - 'role_transition' : 'ROLE_TRANSITION', - # refpolicy keywords - 'optional_policy' : 'OPT_POLICY', - 'interface' : 'INTERFACE', - 'tunable_policy' : 'TUNABLE_POLICY', - 'gen_require' : 'GEN_REQ', - 'template' : 'TEMPLATE', - 'gen_context' : 'GEN_CONTEXT', - # M4 - 'ifelse' : 'IFELSE', - 'ifndef' : 'IFNDEF', - 'ifdef' : 'IFDEF', - 'define' : 'DEFINE' - } - -# The ply lexer allows definition of tokens in 2 ways: regular expressions -# or functions. - -# Simple regex tokens -t_TICK = r'\`' -t_SQUOTE = r'\'' -t_OBRACE = r'\{' -t_CBRACE = r'\}' -# This will handle spurios extra ';' via the + -t_SEMI = r'\;+' -t_COLON = r'\:' -t_OPAREN = r'\(' -t_CPAREN = r'\)' -t_COMMA = r'\,' -t_MINUS = r'\-' -t_TILDE = r'\~' -t_ASTERISK = r'\*' -t_AMP = r'\&' -t_BAR = r'\|' -t_EXPL = r'\!' -t_EQUAL = r'\=' -t_NUMBER = r'[0-9\.]+' -t_PATH = r'/[a-zA-Z0-9)_\.\*/]*' -#t_IPV6_ADDR = r'[a-fA-F0-9]{0,4}:[a-fA-F0-9]{0,4}:([a-fA-F0-9]{0,4}:)*' - -# Ignore whitespace - this is a special token for ply that more efficiently -# ignores uninteresting tokens. -t_ignore = " \t" - -# More complex tokens -def t_IPV6_ADDR(t): - r'[a-fA-F0-9]{0,4}:[a-fA-F0-9]{0,4}:([a-fA-F0-9]|:)*' - # This is a function simply to force it sooner into - # the regex list - return t - -def t_m4comment(t): - r'dnl.*\n' - # Ignore all comments - t.lexer.lineno += 1 - -def t_refpolicywarn1(t): - r'define.*refpolicywarn\(.*\n' - # Ignore refpolicywarn statements - they sometimes - # contain text that we can't parse. - t.skip(1) - -def t_refpolicywarn(t): - r'refpolicywarn\(.*\n' - # Ignore refpolicywarn statements - they sometimes - # contain text that we can't parse. - t.lexer.lineno += 1 - -def t_IDENTIFIER(t): - r'[a-zA-Z_\$][a-zA-Z0-9_\-\+\.\$\*~]*' - # Handle any keywords - t.type = reserved.get(t.value,'IDENTIFIER') - return t - -def t_FILENAME(t): - r'\"[a-zA-Z0-9_\-\+\.\$\*~ :]+\"' - # Handle any keywords - t.type = reserved.get(t.value,'FILENAME') - return t - -def t_comment(t): - r'\#.*\n' - # Ignore all comments - t.lexer.lineno += 1 - -def t_error(t): - print "Illegal character '%s'" % t.value[0] - t.skip(1) - -def t_newline(t): - r'\n+' - t.lexer.lineno += len(t.value) - -# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -# -# Parser -# -# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -# Global data used during parsing - making it global is easier than -# passing the state through the parsing functions. - -# m is the top-level data structure (stands for modules). -m = None -# error is either None (indicating no error) or a string error message. -error = None -parse_file = "" -# spt is the support macros (e.g., obj/perm sets) - it is an instance of -# refpolicy.SupportMacros and should always be present during parsing -# though it may not contain any macros. -spt = None -success = True - -# utilities -def collect(stmts, parent, val=None): - if stmts is None: - return - for s in stmts: - if s is None: - continue - s.parent = parent - if val is not None: - parent.children.insert(0, (val, s)) - else: - parent.children.insert(0, s) - -def expand(ids, s): - for id in ids: - if spt.has_key(id): - s.update(spt.by_name(id)) - else: - s.add(id) - -# Top-level non-terminal -def p_statements(p): - '''statements : statement - | statements statement - | empty - ''' - if len(p) == 2 and p[1]: - m.children.append(p[1]) - elif len(p) > 2 and p[2]: - m.children.append(p[2]) - -def p_statement(p): - '''statement : interface - | template - | obj_perm_set - | policy - | policy_module_stmt - | module_stmt - ''' - p[0] = p[1] - -def p_empty(p): - 'empty :' - pass - -# -# Reference policy language constructs -# - -# This is for the policy module statement (e.g., policy_module(foo,1.2.0)). -# We have a separate terminal for either the basic language module statement -# and interface calls to make it easier to identifier. -def p_policy_module_stmt(p): - 'policy_module_stmt : POLICY_MODULE OPAREN IDENTIFIER COMMA NUMBER CPAREN' - m = refpolicy.ModuleDeclaration() - m.name = p[3] - m.version = p[5] - m.refpolicy = True - p[0] = m - -def p_interface(p): - '''interface : INTERFACE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN - ''' - x = refpolicy.Interface(p[4]) - collect(p[8], x) - p[0] = x - -def p_template(p): - '''template : TEMPLATE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN - | DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN - ''' - x = refpolicy.Template(p[4]) - collect(p[8], x) - p[0] = x - -def p_define(p): - '''define : DEFINE OPAREN TICK IDENTIFIER SQUOTE CPAREN''' - # This is for defining single M4 values (to be used later in ifdef statements). - # Example: define(`sulogin_no_pam'). We don't currently do anything with these - # but we should in the future when we correctly resolve ifdef statements. - p[0] = None - -def p_interface_stmts(p): - '''interface_stmts : policy - | interface_stmts policy - | empty - ''' - if len(p) == 2 and p[1]: - p[0] = p[1] - elif len(p) > 2: - if not p[1]: - if p[2]: - p[0] = p[2] - elif not p[2]: - p[0] = p[1] - else: - p[0] = p[1] + p[2] - -def p_optional_policy(p): - '''optional_policy : OPT_POLICY OPAREN TICK interface_stmts SQUOTE CPAREN - | OPT_POLICY OPAREN TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN - ''' - o = refpolicy.OptionalPolicy() - collect(p[4], o, val=True) - if len(p) > 7: - collect(p[8], o, val=False) - p[0] = [o] - -def p_tunable_policy(p): - '''tunable_policy : TUNABLE_POLICY OPAREN TICK cond_expr SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN - | TUNABLE_POLICY OPAREN TICK cond_expr SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN - ''' - x = refpolicy.TunablePolicy() - x.cond_expr = p[4] - collect(p[8], x, val=True) - if len(p) > 11: - collect(p[12], x, val=False) - p[0] = [x] - -def p_ifelse(p): - '''ifelse : IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA COMMA TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi - | IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi - ''' -# x = refpolicy.IfDef(p[4]) -# v = True -# collect(p[8], x, val=v) -# if len(p) > 12: -# collect(p[12], x, val=False) -# p[0] = [x] - pass - - -def p_ifdef(p): - '''ifdef : IFDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi - | IFNDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi - | IFDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi - ''' - x = refpolicy.IfDef(p[4]) - if p[1] == 'ifdef': - v = True - else: - v = False - collect(p[8], x, val=v) - if len(p) > 12: - collect(p[12], x, val=False) - p[0] = [x] - -def p_interface_call(p): - '''interface_call : IDENTIFIER OPAREN interface_call_param_list CPAREN - | IDENTIFIER OPAREN CPAREN - | IDENTIFIER OPAREN interface_call_param_list CPAREN SEMI''' - # Allow spurious semi-colons at the end of interface calls - i = refpolicy.InterfaceCall(ifname=p[1]) - if len(p) > 4: - i.args.extend(p[3]) - p[0] = i - -def p_interface_call_param(p): - '''interface_call_param : IDENTIFIER - | IDENTIFIER MINUS IDENTIFIER - | nested_id_set - | TRUE - | FALSE - | FILENAME - ''' - # Intentionally let single identifiers pass through - # List means set, non-list identifier - if len(p) == 2: - p[0] = p[1] - else: - p[0] = [p[1], "-" + p[3]] - -def p_interface_call_param_list(p): - '''interface_call_param_list : interface_call_param - | interface_call_param_list COMMA interface_call_param - ''' - if len(p) == 2: - p[0] = [p[1]] - else: - p[0] = p[1] + [p[3]] - - -def p_obj_perm_set(p): - 'obj_perm_set : DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK names SQUOTE CPAREN' - s = refpolicy.ObjPermSet(p[4]) - s.perms = p[8] - p[0] = s - -# -# Basic SELinux policy language -# - -def p_policy(p): - '''policy : policy_stmt - | optional_policy - | tunable_policy - | ifdef - | ifelse - | conditional - ''' - p[0] = p[1] - -def p_policy_stmt(p): - '''policy_stmt : gen_require - | avrule_def - | typerule_def - | typeattribute_def - | roleattribute_def - | interface_call - | role_def - | role_allow - | permissive - | type_def - | typealias_def - | attribute_def - | attribute_role_def - | range_transition_def - | role_transition_def - | bool - | define - | initial_sid - | genfscon - | fs_use - | portcon - | nodecon - | netifcon - | pirqcon - | iomemcon - | ioportcon - | pcidevicecon - | devicetreecon - ''' - if p[1]: - p[0] = [p[1]] - -def p_module_stmt(p): - 'module_stmt : MODULE IDENTIFIER NUMBER SEMI' - m = refpolicy.ModuleDeclaration() - m.name = p[2] - m.version = p[3] - m.refpolicy = False - p[0] = m - -def p_gen_require(p): - '''gen_require : GEN_REQ OPAREN TICK requires SQUOTE CPAREN - | REQUIRE OBRACE requires CBRACE''' - # We ignore the require statements - they are redundant data from our point-of-view. - # Checkmodule will verify them later anyway so we just assume that they match what - # is in the rest of the interface. - pass - -def p_requires(p): - '''requires : require - | requires require - | ifdef - | requires ifdef - ''' - pass - -def p_require(p): - '''require : TYPE comma_list SEMI - | ROLE comma_list SEMI - | ATTRIBUTE comma_list SEMI - | ATTRIBUTE_ROLE comma_list SEMI - | CLASS comma_list SEMI - | BOOL comma_list SEMI - ''' - pass - -def p_security_context(p): - '''security_context : IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER - | IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER COLON mls_range_def''' - # This will likely need some updates to handle complex levels - s = refpolicy.SecurityContext() - s.user = p[1] - s.role = p[3] - s.type = p[5] - if len(p) > 6: - s.level = p[7] - - p[0] = s - -def p_gen_context(p): - '''gen_context : GEN_CONTEXT OPAREN security_context COMMA mls_range_def CPAREN - ''' - # We actually store gen_context statements in a SecurityContext - # object - it knows how to output either a bare context or a - # gen_context statement. - s = p[3] - s.level = p[5] - - p[0] = s - -def p_context(p): - '''context : security_context - | gen_context - ''' - p[0] = p[1] - -def p_initial_sid(p): - '''initial_sid : SID IDENTIFIER context''' - s = refpolicy.InitialSid() - s.name = p[2] - s.context = p[3] - p[0] = s - -def p_genfscon(p): - '''genfscon : GENFSCON IDENTIFIER PATH context''' - - g = refpolicy.GenfsCon() - g.filesystem = p[2] - g.path = p[3] - g.context = p[4] - - p[0] = g - -def p_fs_use(p): - '''fs_use : FS_USE_XATTR IDENTIFIER context SEMI - | FS_USE_TASK IDENTIFIER context SEMI - | FS_USE_TRANS IDENTIFIER context SEMI - ''' - f = refpolicy.FilesystemUse() - if p[1] == "fs_use_xattr": - f.type = refpolicy.FilesystemUse.XATTR - elif p[1] == "fs_use_task": - f.type = refpolicy.FilesystemUse.TASK - elif p[1] == "fs_use_trans": - f.type = refpolicy.FilesystemUse.TRANS - - f.filesystem = p[2] - f.context = p[3] - - p[0] = f - -def p_portcon(p): - '''portcon : PORTCON IDENTIFIER NUMBER context - | PORTCON IDENTIFIER NUMBER MINUS NUMBER context''' - c = refpolicy.PortCon() - c.port_type = p[2] - if len(p) == 5: - c.port_number = p[3] - c.context = p[4] - else: - c.port_number = p[3] + "-" + p[4] - c.context = p[5] - - p[0] = c - -def p_nodecon(p): - '''nodecon : NODECON NUMBER NUMBER context - | NODECON IPV6_ADDR IPV6_ADDR context - ''' - n = refpolicy.NodeCon() - n.start = p[2] - n.end = p[3] - n.context = p[4] - - p[0] = n - -def p_netifcon(p): - 'netifcon : NETIFCON IDENTIFIER context context' - n = refpolicy.NetifCon() - n.interface = p[2] - n.interface_context = p[3] - n.packet_context = p[4] - - p[0] = n - -def p_pirqcon(p): - 'pirqcon : PIRQCON NUMBER context' - c = refpolicy.PirqCon() - c.pirq_number = p[2] - c.context = p[3] - - p[0] = c - -def p_iomemcon(p): - '''iomemcon : IOMEMCON NUMBER context - | IOMEMCON NUMBER MINUS NUMBER context''' - c = refpolicy.IomemCon() - if len(p) == 4: - c.device_mem = p[2] - c.context = p[3] - else: - c.device_mem = p[2] + "-" + p[3] - c.context = p[4] - - p[0] = c - -def p_ioportcon(p): - '''ioportcon : IOPORTCON NUMBER context - | IOPORTCON NUMBER MINUS NUMBER context''' - c = refpolicy.IoportCon() - if len(p) == 4: - c.ioport = p[2] - c.context = p[3] - else: - c.ioport = p[2] + "-" + p[3] - c.context = p[4] - - p[0] = c - -def p_pcidevicecon(p): - 'pcidevicecon : PCIDEVICECON NUMBER context' - c = refpolicy.PciDeviceCon() - c.device = p[2] - c.context = p[3] - - p[0] = c - -def p_devicetreecon(p): - 'devicetreecon : DEVICETREECON NUMBER context' - c = refpolicy.DevicetTeeCon() - c.path = p[2] - c.context = p[3] - - p[0] = c - -def p_mls_range_def(p): - '''mls_range_def : mls_level_def MINUS mls_level_def - | mls_level_def - ''' - p[0] = p[1] - if len(p) > 2: - p[0] = p[0] + "-" + p[3] - -def p_mls_level_def(p): - '''mls_level_def : IDENTIFIER COLON comma_list - | IDENTIFIER - ''' - p[0] = p[1] - if len(p) > 2: - p[0] = p[0] + ":" + ",".join(p[3]) - -def p_type_def(p): - '''type_def : TYPE IDENTIFIER COMMA comma_list SEMI - | TYPE IDENTIFIER SEMI - | TYPE IDENTIFIER ALIAS names SEMI - | TYPE IDENTIFIER ALIAS names COMMA comma_list SEMI - ''' - t = refpolicy.Type(p[2]) - if len(p) == 6: - if p[3] == ',': - t.attributes.update(p[4]) - else: - t.aliases = p[4] - elif len(p) > 4: - t.aliases = p[4] - if len(p) == 8: - t.attributes.update(p[6]) - p[0] = t - -def p_attribute_def(p): - 'attribute_def : ATTRIBUTE IDENTIFIER SEMI' - a = refpolicy.Attribute(p[2]) - p[0] = a - -def p_attribute_role_def(p): - 'attribute_role_def : ATTRIBUTE_ROLE IDENTIFIER SEMI' - a = refpolicy.Attribute_Role(p[2]) - p[0] = a - -def p_typealias_def(p): - 'typealias_def : TYPEALIAS IDENTIFIER ALIAS names SEMI' - t = refpolicy.TypeAlias() - t.type = p[2] - t.aliases = p[4] - p[0] = t - -def p_role_def(p): - '''role_def : ROLE IDENTIFIER TYPES comma_list SEMI - | ROLE IDENTIFIER SEMI''' - r = refpolicy.Role() - r.role = p[2] - if len(p) > 4: - r.types.update(p[4]) - p[0] = r - -def p_role_allow(p): - 'role_allow : ALLOW names names SEMI' - r = refpolicy.RoleAllow() - r.src_roles = p[2] - r.tgt_roles = p[3] - p[0] = r - -def p_permissive(p): - 'permissive : PERMISSIVE names SEMI' - t.skip(1) - -def p_avrule_def(p): - '''avrule_def : ALLOW names names COLON names names SEMI - | DONTAUDIT names names COLON names names SEMI - | AUDITALLOW names names COLON names names SEMI - | NEVERALLOW names names COLON names names SEMI - ''' - a = refpolicy.AVRule() - if p[1] == 'dontaudit': - a.rule_type = refpolicy.AVRule.DONTAUDIT - elif p[1] == 'auditallow': - a.rule_type = refpolicy.AVRule.AUDITALLOW - elif p[1] == 'neverallow': - a.rule_type = refpolicy.AVRule.NEVERALLOW - a.src_types = p[2] - a.tgt_types = p[3] - a.obj_classes = p[5] - a.perms = p[6] - p[0] = a - -def p_typerule_def(p): - '''typerule_def : TYPE_TRANSITION names names COLON names IDENTIFIER SEMI - | TYPE_TRANSITION names names COLON names IDENTIFIER FILENAME SEMI - | TYPE_TRANSITION names names COLON names IDENTIFIER IDENTIFIER SEMI - | TYPE_CHANGE names names COLON names IDENTIFIER SEMI - | TYPE_MEMBER names names COLON names IDENTIFIER SEMI - ''' - t = refpolicy.TypeRule() - if p[1] == 'type_change': - t.rule_type = refpolicy.TypeRule.TYPE_CHANGE - elif p[1] == 'type_member': - t.rule_type = refpolicy.TypeRule.TYPE_MEMBER - t.src_types = p[2] - t.tgt_types = p[3] - t.obj_classes = p[5] - t.dest_type = p[6] - t.file_name = p[7] - p[0] = t - -def p_bool(p): - '''bool : BOOL IDENTIFIER TRUE SEMI - | BOOL IDENTIFIER FALSE SEMI''' - b = refpolicy.Bool() - b.name = p[2] - if p[3] == "true": - b.state = True - else: - b.state = False - p[0] = b - -def p_conditional(p): - ''' conditional : IF OPAREN cond_expr CPAREN OBRACE interface_stmts CBRACE - | IF OPAREN cond_expr CPAREN OBRACE interface_stmts CBRACE ELSE OBRACE interface_stmts CBRACE - ''' - c = refpolicy.Conditional() - c.cond_expr = p[3] - collect(p[6], c, val=True) - if len(p) > 8: - collect(p[10], c, val=False) - p[0] = [c] - -def p_typeattribute_def(p): - '''typeattribute_def : TYPEATTRIBUTE IDENTIFIER comma_list SEMI''' - t = refpolicy.TypeAttribute() - t.type = p[2] - t.attributes.update(p[3]) - p[0] = t - -def p_roleattribute_def(p): - '''roleattribute_def : ROLEATTRIBUTE IDENTIFIER comma_list SEMI''' - t = refpolicy.RoleAttribute() - t.role = p[2] - t.roleattributes.update(p[3]) - p[0] = t - -def p_range_transition_def(p): - '''range_transition_def : RANGE_TRANSITION names names COLON names mls_range_def SEMI - | RANGE_TRANSITION names names names SEMI''' - pass - -def p_role_transition_def(p): - '''role_transition_def : ROLE_TRANSITION names names names SEMI''' - pass - -def p_cond_expr(p): - '''cond_expr : IDENTIFIER - | EXPL cond_expr - | cond_expr AMP AMP cond_expr - | cond_expr BAR BAR cond_expr - | cond_expr EQUAL EQUAL cond_expr - | cond_expr EXPL EQUAL cond_expr - ''' - l = len(p) - if l == 2: - p[0] = [p[1]] - elif l == 3: - p[0] = [p[1]] + p[2] - else: - p[0] = p[1] + [p[2] + p[3]] + p[4] - - -# -# Basic terminals -# - -# Identifiers and lists of identifiers. These must -# be handled somewhat gracefully. Names returns an IdSet and care must -# be taken that this is _assigned_ to an object to correctly update -# all of the flags (as opposed to using update). The other terminals -# return list - this is to preserve ordering if it is important for -# parsing (for example, interface_call must retain the ordering). Other -# times the list should be used to update an IdSet. - -def p_names(p): - '''names : identifier - | nested_id_set - | asterisk - | TILDE identifier - | TILDE nested_id_set - | IDENTIFIER MINUS IDENTIFIER - ''' - s = refpolicy.IdSet() - if len(p) < 3: - expand(p[1], s) - elif len(p) == 3: - expand(p[2], s) - s.compliment = True - else: - expand([p[1]]) - s.add("-" + p[3]) - p[0] = s - -def p_identifier(p): - 'identifier : IDENTIFIER' - p[0] = [p[1]] - -def p_asterisk(p): - 'asterisk : ASTERISK' - p[0] = [p[1]] - -def p_nested_id_set(p): - '''nested_id_set : OBRACE nested_id_list CBRACE - ''' - p[0] = p[2] - -def p_nested_id_list(p): - '''nested_id_list : nested_id_element - | nested_id_list nested_id_element - ''' - if len(p) == 2: - p[0] = p[1] - else: - p[0] = p[1] + p[2] - -def p_nested_id_element(p): - '''nested_id_element : identifier - | MINUS IDENTIFIER - | nested_id_set - ''' - if len(p) == 2: - p[0] = p[1] - else: - # For now just leave the '-' - str = "-" + p[2] - p[0] = [str] - -def p_comma_list(p): - '''comma_list : nested_id_list - | comma_list COMMA nested_id_list - ''' - if len(p) > 2: - p[1] = p[1] + p[3] - p[0] = p[1] - -def p_optional_semi(p): - '''optional_semi : SEMI - | empty''' - pass - - -# -# Interface to the parser -# - -def p_error(tok): - global error, parse_file, success, parser - error = "%s: Syntax error on line %d %s [type=%s]" % (parse_file, tok.lineno, tok.value, tok.type) - print error - success = False - -def prep_spt(spt): - if not spt: - return { } - map = {} - for x in spt: - map[x.name] = x - -parser = None -lexer = None -def create_globals(module, support, debug): - global parser, lexer, m, spt - - if not parser: - lexer = lex.lex() - parser = yacc.yacc(method="LALR", debug=debug, write_tables=0) - - if module is not None: - m = module - else: - m = refpolicy.Module() - - if not support: - spt = refpolicy.SupportMacros() - else: - spt = support - -def parse(text, module=None, support=None, debug=False): - create_globals(module, support, debug) - global error, parser, lexer, success - - success = True - - try: - parser.parse(text, debug=debug, lexer=lexer) - except Exception, e: - parser = None - lexer = None - error = "internal parser error: %s" % str(e) + "\n" + traceback.format_exc() - - if not success: - # force the parser and lexer to be rebuilt - we have some problems otherwise - parser = None - msg = 'could not parse text: "%s"' % error - raise ValueError(msg) - return m - -def list_headers(root): - modules = [] - support_macros = None - - for dirpath, dirnames, filenames in os.walk(root): - for name in filenames: - modname = os.path.splitext(name) - filename = os.path.join(dirpath, name) - - if modname[1] == '.spt': - if name == "obj_perm_sets.spt": - support_macros = filename - elif len(re.findall("patterns", modname[0])): - modules.append((modname[0], filename)) - elif modname[1] == '.if': - modules.append((modname[0], filename)) - - return (modules, support_macros) - - -def parse_headers(root, output=None, expand=True, debug=False): - import util - - headers = refpolicy.Headers() - - modules = [] - support_macros = None - - if os.path.isfile(root): - name = os.path.split(root)[1] - if name == '': - raise ValueError("Invalid file name %s" % root) - modname = os.path.splitext(name) - modules.append((modname[0], root)) - all_modules, support_macros = list_headers(defaults.headers()) - else: - modules, support_macros = list_headers(root) - - if expand and not support_macros: - raise ValueError("could not find support macros (obj_perm_sets.spt)") - - def o(msg): - if output: - output.write(msg) - - def parse_file(f, module, spt=None): - global parse_file - if debug: - o("parsing file %s\n" % f) - try: - fd = open(f) - txt = fd.read() - fd.close() - parse_file = f - parse(txt, module, spt, debug) - except IOError, e: - return - except ValueError, e: - raise ValueError("error parsing file %s: %s" % (f, str(e))) - - spt = None - if support_macros: - o("Parsing support macros (%s): " % support_macros) - spt = refpolicy.SupportMacros() - parse_file(support_macros, spt) - - headers.children.append(spt) - - # FIXME: Total hack - add in can_exec rather than parse the insanity - # of misc_macros. We are just going to pretend that this is an interface - # to make the expansion work correctly. - can_exec = refpolicy.Interface("can_exec") - av = access.AccessVector(["$1","$2","file","execute_no_trans","open", "read", - "getattr","lock","execute","ioctl"]) - - can_exec.children.append(refpolicy.AVRule(av)) - headers.children.append(can_exec) - - o("done.\n") - - if output and not debug: - status = util.ConsoleProgressBar(sys.stdout, steps=len(modules)) - status.start("Parsing interface files") - - failures = [] - for x in modules: - m = refpolicy.Module() - m.name = x[0] - try: - if expand: - parse_file(x[1], m, spt) - else: - parse_file(x[1], m) - except ValueError, e: - o(str(e) + "\n") - failures.append(x[1]) - continue - - headers.children.append(m) - if output and not debug: - status.step() - - if len(failures): - o("failed to parse some headers: %s" % ", ".join(failures)) - - return headers diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/refpolicy.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/refpolicy.py deleted file mode 100644 index b8ed5c1..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/refpolicy.py +++ /dev/null @@ -1,917 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -import string -import itertools -import selinux - -# OVERVIEW -# -# This file contains objects and functions used to represent the reference -# policy (including the headers, M4 macros, and policy language statements). -# -# This representation is very different from the semantic representation -# used in libsepol. Instead, it is a more typical abstract representation -# used by the first stage of compilers. It is basically a parse tree. -# -# This choice is intentional as it allows us to handle the unprocessed -# M4 statements - including the $1 style arguments - and to more easily generate -# the data structures that we need for policy generation. -# - -# Constans for referring to fields -SRC_TYPE = 0 -TGT_TYPE = 1 -OBJ_CLASS = 2 -PERMS = 3 -ROLE = 4 -DEST_TYPE = 5 - -# String represenations of the above constants -field_to_str = ["source", "target", "object", "permission", "role", "destination" ] -str_to_field = { "source" : SRC_TYPE, "target" : TGT_TYPE, "object" : OBJ_CLASS, - "permission" : PERMS, "role" : ROLE, "destination" : DEST_TYPE } - -# Base Classes - -class PolicyBase: - def __init__(self, parent=None): - self.parent = None - self.comment = None - -class Node(PolicyBase): - """Base class objects produced from parsing the reference policy. - - The Node class is used as the base class for any non-leaf - object produced by parsing the reference policy. This object - should contain a reference to its parent (or None for a top-level - object) and 0 or more children. - - The general idea here is to have a very simple tree structure. Children - are not separated out by type. Instead the tree structure represents - fairly closely the real structure of the policy statements. - - The object should be iterable - by default over all children but - subclasses are free to provide additional iterators over a subset - of their childre (see Interface for example). - """ - - def __init__(self, parent=None): - PolicyBase.__init__(self, parent) - self.children = [] - - def __iter__(self): - return iter(self.children) - - # Not all of the iterators will return something on all Nodes, but - # they won't explode either. Putting them here is just easier. - - # Top level nodes - - def nodes(self): - return itertools.ifilter(lambda x: isinstance(x, Node), walktree(self)) - - def modules(self): - return itertools.ifilter(lambda x: isinstance(x, Module), walktree(self)) - - def interfaces(self): - return itertools.ifilter(lambda x: isinstance(x, Interface), walktree(self)) - - def templates(self): - return itertools.ifilter(lambda x: isinstance(x, Template), walktree(self)) - - def support_macros(self): - return itertools.ifilter(lambda x: isinstance(x, SupportMacros), walktree(self)) - - # Common policy statements - - def module_declarations(self): - return itertools.ifilter(lambda x: isinstance(x, ModuleDeclaration), walktree(self)) - - def interface_calls(self): - return itertools.ifilter(lambda x: isinstance(x, InterfaceCall), walktree(self)) - - def avrules(self): - return itertools.ifilter(lambda x: isinstance(x, AVRule), walktree(self)) - - def typerules(self): - return itertools.ifilter(lambda x: isinstance(x, TypeRule), walktree(self)) - - def typeattributes(self): - """Iterate over all of the TypeAttribute children of this Interface.""" - return itertools.ifilter(lambda x: isinstance(x, TypeAttribute), walktree(self)) - - def roleattributes(self): - """Iterate over all of the RoleAttribute children of this Interface.""" - return itertools.ifilter(lambda x: isinstance(x, RoleAttribute), walktree(self)) - - def requires(self): - return itertools.ifilter(lambda x: isinstance(x, Require), walktree(self)) - - def roles(self): - return itertools.ifilter(lambda x: isinstance(x, Role), walktree(self)) - - def role_allows(self): - return itertools.ifilter(lambda x: isinstance(x, RoleAllow), walktree(self)) - - def role_types(self): - return itertools.ifilter(lambda x: isinstance(x, RoleType), walktree(self)) - - def __str__(self): - if self.comment: - return str(self.comment) + "\n" + self.to_string() - else: - return self.to_string() - - def __repr__(self): - return "<%s(%s)>" % (self.__class__.__name__, self.to_string()) - - def to_string(self): - return "" - - -class Leaf(PolicyBase): - def __init__(self, parent=None): - PolicyBase.__init__(self, parent) - - def __str__(self): - if self.comment: - return str(self.comment) + "\n" + self.to_string() - else: - return self.to_string() - - def __repr__(self): - return "<%s(%s)>" % (self.__class__.__name__, self.to_string()) - - def to_string(self): - return "" - - - -# Utility functions - -def walktree(node, depthfirst=True, showdepth=False, type=None): - """Iterate over a Node and its Children. - - The walktree function iterates over a tree containing Nodes and - leaf objects. The iteration can perform a depth first or a breadth - first traversal of the tree (controlled by the depthfirst - paramater. The passed in node will be returned. - - This function will only work correctly for trees - arbitrary graphs - will likely cause infinite looping. - """ - # We control depth first / versus breadth first by - # how we pop items off of the node stack. - if depthfirst: - index = -1 - else: - index = 0 - - stack = [(node, 0)] - while len(stack) > 0: - cur, depth = stack.pop(index) - if showdepth: - yield cur, depth - else: - yield cur - - # If the node is not a Node instance it must - # be a leaf - so no need to add it to the stack - if isinstance(cur, Node): - items = [] - i = len(cur.children) - 1 - while i >= 0: - if type is None or isinstance(cur.children[i], type): - items.append((cur.children[i], depth + 1)) - i -= 1 - - stack.extend(items) - -def walknode(node, type=None): - """Iterate over the direct children of a Node. - - The walktree function iterates over the children of a Node. - Unlike walktree it does note return the passed in node or - the children of any Node objects (that is, it does not go - beyond the current level in the tree). - """ - for x in node: - if type is None or isinstance(x, type): - yield x - - -def list_to_space_str(s, cont=('{', '}')): - """Convert a set (or any sequence type) into a string representation - formatted to match SELinux space separated list conventions. - - For example the list ['read', 'write'] would be converted into: - '{ read write }' - """ - l = len(s) - str = "" - if l < 1: - raise ValueError("cannot convert 0 len set to string") - str = " ".join(s) - if l == 1: - return str - else: - return cont[0] + " " + str + " " + cont[1] - -def list_to_comma_str(s): - l = len(s) - if l < 1: - raise ValueError("cannot conver 0 len set to comma string") - - return ", ".join(s) - -# Basic SELinux types - -class IdSet(set): - def __init__(self, list=None): - if list: - set.__init__(self, list) - else: - set.__init__(self) - self.compliment = False - - def to_space_str(self): - return list_to_space_str(self) - - def to_comma_str(self): - return list_to_comma_str(self) - -class SecurityContext(Leaf): - """An SELinux security context with optional MCS / MLS fields.""" - def __init__(self, context=None, parent=None): - """Create a SecurityContext object, optionally from a string. - - Parameters: - [context] - string representing a security context. Same format - as a string passed to the from_string method. - """ - Leaf.__init__(self, parent) - self.user = "" - self.role = "" - self.type = "" - self.level = None - if context is not None: - self.from_string(context) - - def from_string(self, context): - """Parse a string representing a context into a SecurityContext. - - The string should be in the standard format - e.g., - 'user:role:type:level'. - - Raises ValueError if the string is not parsable as a security context. - """ - fields = context.split(":") - if len(fields) < 3: - raise ValueError("context string [%s] not in a valid format" % context) - - self.user = fields[0] - self.role = fields[1] - self.type = fields[2] - if len(fields) > 3: - # FUTURE - normalize level fields to allow more comparisons to succeed. - self.level = string.join(fields[3:], ':') - else: - self.level = None - - def __eq__(self, other): - """Compare two SecurityContext objects - all fields must be exactly the - the same for the comparison to work. It is possible for the level fields - to be semantically the same yet syntactically different - in this case - this function will return false. - """ - return self.user == other.user and \ - self.role == other.role and \ - self.type == other.type and \ - self.level == other.level - - def to_string(self, default_level=None): - """Return a string representing this security context. - - By default, the string will contiain a MCS / MLS level - potentially from the default which is passed in if none was - set. - - Arguments: - default_level - the default level to use if self.level is an - empty string. - - Returns: - A string represening the security context in the form - 'user:role:type:level'. - """ - fields = [self.user, self.role, self.type] - if self.level is None: - if default_level is None: - if selinux.is_selinux_mls_enabled() == 1: - fields.append("s0") - else: - fields.append(default_level) - else: - fields.append(self.level) - return ":".join(fields) - -class ObjectClass(Leaf): - """SELinux object class and permissions. - - This class is a basic representation of an SELinux object - class - it does not represent separate common permissions - - just the union of the common and class specific permissions. - It is meant to be convenient for policy generation. - """ - def __init__(self, name="", parent=None): - Leaf.__init__(self, parent) - self.name = name - self.perms = IdSet() - -# Basic statements - -class TypeAttribute(Leaf): - """SElinux typeattribute statement. - - This class represents a typeattribute statement. - """ - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.type = "" - self.attributes = IdSet() - - def to_string(self): - return "typeattribute %s %s;" % (self.type, self.attributes.to_comma_str()) - -class RoleAttribute(Leaf): - """SElinux roleattribute statement. - - This class represents a roleattribute statement. - """ - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.role = "" - self.roleattributes = IdSet() - - def to_string(self): - return "roleattribute %s %s;" % (self.role, self.roleattributes.to_comma_str()) - - -class Role(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.role = "" - self.types = IdSet() - - def to_string(self): - s = "" - for t in self.types: - s += "role %s types %s;\n" % (self.role, t) - return s - -class Type(Leaf): - def __init__(self, name="", parent=None): - Leaf.__init__(self, parent) - self.name = name - self.attributes = IdSet() - self.aliases = IdSet() - - def to_string(self): - s = "type %s" % self.name - if len(self.aliases) > 0: - s = s + "alias %s" % self.aliases.to_space_str() - if len(self.attributes) > 0: - s = s + ", %s" % self.attributes.to_comma_str() - return s + ";" - -class TypeAlias(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.type = "" - self.aliases = IdSet() - - def to_string(self): - return "typealias %s alias %s;" % (self.type, self.aliases.to_space_str()) - -class Attribute(Leaf): - def __init__(self, name="", parent=None): - Leaf.__init__(self, parent) - self.name = name - - def to_string(self): - return "attribute %s;" % self.name - -class Attribute_Role(Leaf): - def __init__(self, name="", parent=None): - Leaf.__init__(self, parent) - self.name = name - - def to_string(self): - return "attribute_role %s;" % self.name - - -# Classes representing rules - -class AVRule(Leaf): - """SELinux access vector (AV) rule. - - The AVRule class represents all varieties of AV rules including - allow, dontaudit, and auditallow (indicated by the flags self.ALLOW, - self.DONTAUDIT, and self.AUDITALLOW respectively). - - The source and target types, object classes, and perms are all represented - by sets containing strings. Sets are used to make it simple to add - strings repeatedly while avoiding duplicates. - - No checking is done to make certain that the symbols are valid or - consistent (e.g., perms that don't match the object classes). It is - even possible to put invalid types like '$1' into the rules to allow - storage of the reference policy interfaces. - """ - ALLOW = 0 - DONTAUDIT = 1 - AUDITALLOW = 2 - NEVERALLOW = 3 - - def __init__(self, av=None, parent=None): - Leaf.__init__(self, parent) - self.src_types = IdSet() - self.tgt_types = IdSet() - self.obj_classes = IdSet() - self.perms = IdSet() - self.rule_type = self.ALLOW - if av: - self.from_av(av) - - def __rule_type_str(self): - if self.rule_type == self.ALLOW: - return "allow" - elif self.rule_type == self.DONTAUDIT: - return "dontaudit" - else: - return "auditallow" - - def from_av(self, av): - """Add the access from an access vector to this allow - rule. - """ - self.src_types.add(av.src_type) - if av.src_type == av.tgt_type: - self.tgt_types.add("self") - else: - self.tgt_types.add(av.tgt_type) - self.obj_classes.add(av.obj_class) - self.perms.update(av.perms) - - def to_string(self): - """Return a string representation of the rule - that is a valid policy language representation (assuming - that the types, object class, etc. are valie). - """ - return "%s %s %s:%s %s;" % (self.__rule_type_str(), - self.src_types.to_space_str(), - self.tgt_types.to_space_str(), - self.obj_classes.to_space_str(), - self.perms.to_space_str()) -class TypeRule(Leaf): - """SELinux type rules. - - This class is very similar to the AVRule class, but is for representing - the type rules (type_trans, type_change, and type_member). The major - difference is the lack of perms and only and sing destination type. - """ - TYPE_TRANSITION = 0 - TYPE_CHANGE = 1 - TYPE_MEMBER = 2 - - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.src_types = IdSet() - self.tgt_types = IdSet() - self.obj_classes = IdSet() - self.dest_type = "" - self.rule_type = self.TYPE_TRANSITION - - def __rule_type_str(self): - if self.rule_type == self.TYPE_TRANSITION: - return "type_transition" - elif self.rule_type == self.TYPE_CHANGE: - return "type_change" - else: - return "type_member" - - def to_string(self): - return "%s %s %s:%s %s;" % (self.__rule_type_str(), - self.src_types.to_space_str(), - self.tgt_types.to_space_str(), - self.obj_classes.to_space_str(), - self.dest_type) - -class RoleAllow(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.src_roles = IdSet() - self.tgt_roles = IdSet() - - def to_string(self): - return "allow %s %s;" % (self.src_roles.to_comma_str(), - self.tgt_roles.to_comma_str()) - -class RoleType(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.role = "" - self.types = IdSet() - - def to_string(self): - s = "" - for t in self.types: - s += "role %s types %s;\n" % (self.role, t) - return s - -class ModuleDeclaration(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.name = "" - self.version = "" - self.refpolicy = False - - def to_string(self): - if self.refpolicy: - return "policy_module(%s, %s)" % (self.name, self.version) - else: - return "module %s %s;" % (self.name, self.version) - -class Conditional(Node): - def __init__(self, parent=None): - Node.__init__(self, parent) - self.cond_expr = [] - - def to_string(self): - return "[If %s]" % list_to_space_str(self.cond_expr, cont=("", "")) - -class Bool(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.name = "" - self.state = False - - def to_string(self): - s = "bool %s " % self.name - if s.state: - return s + "true" - else: - return s + "false" - -class InitialSid(Leaf): - def __init(self, parent=None): - Leaf.__init__(self, parent) - self.name = "" - self.context = None - - def to_string(self): - return "sid %s %s" % (self.name, str(self.context)) - -class GenfsCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.filesystem = "" - self.path = "" - self.context = None - - def to_string(self): - return "genfscon %s %s %s" % (self.filesystem, self.path, str(self.context)) - -class FilesystemUse(Leaf): - XATTR = 1 - TRANS = 2 - TASK = 3 - - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.type = self.XATTR - self.filesystem = "" - self.context = None - - def to_string(self): - s = "" - if self.type == XATTR: - s = "fs_use_xattr " - elif self.type == TRANS: - s = "fs_use_trans " - elif self.type == TASK: - s = "fs_use_task " - - return "%s %s %s;" % (s, self.filesystem, str(self.context)) - -class PortCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.port_type = "" - self.port_number = "" - self.context = None - - def to_string(self): - return "portcon %s %s %s" % (self.port_type, self.port_number, str(self.context)) - -class NodeCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.start = "" - self.end = "" - self.context = None - - def to_string(self): - return "nodecon %s %s %s" % (self.start, self.end, str(self.context)) - -class NetifCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.interface = "" - self.interface_context = None - self.packet_context = None - - def to_string(self): - return "netifcon %s %s %s" % (self.interface, str(self.interface_context), - str(self.packet_context)) -class PirqCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.pirq_number = "" - self.context = None - - def to_string(self): - return "pirqcon %s %s" % (self.pirq_number, str(self.context)) - -class IomemCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.device_mem = "" - self.context = None - - def to_string(self): - return "iomemcon %s %s" % (self.device_mem, str(self.context)) - -class IoportCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.ioport = "" - self.context = None - - def to_string(self): - return "ioportcon %s %s" % (self.ioport, str(self.context)) - -class PciDeviceCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.device = "" - self.context = None - - def to_string(self): - return "pcidevicecon %s %s" % (self.device, str(self.context)) - -class DeviceTreeCon(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.path = "" - self.context = None - - def to_string(self): - return "devicetreecon %s %s" % (self.path, str(self.context)) - -# Reference policy specific types - -def print_tree(head): - for node, depth in walktree(head, showdepth=True): - s = "" - for i in range(depth): - s = s + "\t" - print s + str(node) - - -class Headers(Node): - def __init__(self, parent=None): - Node.__init__(self, parent) - - def to_string(self): - return "[Headers]" - - -class Module(Node): - def __init__(self, parent=None): - Node.__init__(self, parent) - - def to_string(self): - return "" - -class Interface(Node): - """A reference policy interface definition. - - This class represents a reference policy interface definition. - """ - def __init__(self, name="", parent=None): - Node.__init__(self, parent) - self.name = name - - def to_string(self): - return "[Interface name: %s]" % self.name - -class TunablePolicy(Node): - def __init__(self, parent=None): - Node.__init__(self, parent) - self.cond_expr = [] - - def to_string(self): - return "[Tunable Policy %s]" % list_to_space_str(self.cond_expr, cont=("", "")) - -class Template(Node): - def __init__(self, name="", parent=None): - Node.__init__(self, parent) - self.name = name - - def to_string(self): - return "[Template name: %s]" % self.name - -class IfDef(Node): - def __init__(self, name="", parent=None): - Node.__init__(self, parent) - self.name = name - - def to_string(self): - return "[Ifdef name: %s]" % self.name - -class InterfaceCall(Leaf): - def __init__(self, ifname="", parent=None): - Leaf.__init__(self, parent) - self.ifname = ifname - self.args = [] - self.comments = [] - - def matches(self, other): - if self.ifname != other.ifname: - return False - if len(self.args) != len(other.args): - return False - for a,b in zip(self.args, other.args): - if a != b: - return False - return True - - def to_string(self): - s = "%s(" % self.ifname - i = 0 - for a in self.args: - if isinstance(a, list): - str = list_to_space_str(a) - else: - str = a - - if i != 0: - s = s + ", %s" % str - else: - s = s + str - i += 1 - return s + ")" - -class OptionalPolicy(Node): - def __init__(self, parent=None): - Node.__init__(self, parent) - - def to_string(self): - return "[Optional Policy]" - -class SupportMacros(Node): - def __init__(self, parent=None): - Node.__init__(self, parent) - self.map = None - - def to_string(self): - return "[Support Macros]" - - def __expand_perm(self, perm): - # Recursive expansion - the assumption is that these - # are ordered correctly so that no macro is used before - # it is defined - s = set() - if self.map.has_key(perm): - for p in self.by_name(perm): - s.update(self.__expand_perm(p)) - else: - s.add(perm) - return s - - def __gen_map(self): - self.map = {} - for x in self: - exp_perms = set() - for perm in x.perms: - exp_perms.update(self.__expand_perm(perm)) - self.map[x.name] = exp_perms - - def by_name(self, name): - if not self.map: - self.__gen_map() - return self.map[name] - - def has_key(self, name): - if not self.map: - self.__gen_map() - return self.map.has_key(name) - -class Require(Leaf): - def __init__(self, parent=None): - Leaf.__init__(self, parent) - self.types = IdSet() - self.obj_classes = { } - self.roles = IdSet() - self.data = IdSet() - self.users = IdSet() - - def add_obj_class(self, obj_class, perms): - p = self.obj_classes.setdefault(obj_class, IdSet()) - p.update(perms) - - - def to_string(self): - s = [] - s.append("require {") - for type in self.types: - s.append("\ttype %s;" % type) - for obj_class, perms in self.obj_classes.items(): - s.append("\tclass %s %s;" % (obj_class, perms.to_space_str())) - for role in self.roles: - s.append("\trole %s;" % role) - for bool in self.data: - s.append("\tbool %s;" % bool) - for user in self.users: - s.append("\tuser %s;" % user) - s.append("}") - - # Handle empty requires - if len(s) == 2: - return "" - - return "\n".join(s) - - -class ObjPermSet: - def __init__(self, name): - self.name = name - self.perms = set() - - def to_string(self): - return "define(`%s', `%s')" % (self.name, self.perms.to_space_str()) - -class ClassMap: - def __init__(self, obj_class, perms): - self.obj_class = obj_class - self.perms = perms - - def to_string(self): - return self.obj_class + ": " + self.perms - -class Comment: - def __init__(self, l=None): - if l: - self.lines = l - else: - self.lines = [] - - def to_string(self): - # If there are no lines, treat this as a spacer between - # policy statements and return a new line. - if len(self.lines) == 0: - return "" - else: - out = [] - for line in self.lines: - out.append("#" + line) - return "\n".join(out) - - def merge(self, other): - if len(other.lines): - for line in other.lines: - if line != "": - self.lines.append(line) - - def __str__(self): - return self.to_string() - - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/sepolgeni18n.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/sepolgeni18n.py deleted file mode 100644 index 998c435..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/sepolgeni18n.py +++ /dev/null @@ -1,26 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -try: - import gettext - t = gettext.translation( 'yumex' ) - _ = t.gettext -except: - def _(str): - return str diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/util.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/util.py deleted file mode 100644 index 74a11f5..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/util.py +++ /dev/null @@ -1,87 +0,0 @@ -# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com> -# -# Copyright (C) 2006 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; version 2 only -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -class ConsoleProgressBar: - def __init__(self, out, steps=100, indicator='#'): - self.blocks = 0 - self.current = 0 - self.steps = steps - self.indicator = indicator - self.out = out - self.done = False - - def start(self, message=None): - self.done = False - if message: - self.out.write('\n%s:\n' % message) - self.out.write('%--10---20---30---40---50---60---70---80---90--100\n') - - def step(self, n=1): - self.current += n - - old = self.blocks - self.blocks = int(round(self.current / float(self.steps) * 100) / 2) - - if self.blocks > 50: - self.blocks = 50 - - new = self.blocks - old - - self.out.write(self.indicator * new) - self.out.flush() - - if self.blocks == 50 and not self.done: - self.done = True - self.out.write("\n") - -def set_to_list(s): - l = [] - l.extend(s) - return l - -def first(s, sorted=False): - """ - Return the first element of a set. - - It sometimes useful to return the first element from a set but, - because sets are not indexable, this is rather hard. This function - will return the first element from a set. If sorted is True, then - the set will first be sorted (making this an expensive operation). - Otherwise a random element will be returned (as sets are not ordered). - """ - if not len(s): - raise IndexError("empty containter") - - if sorted: - l = set_to_list(s) - l.sort() - return l[0] - else: - for x in s: - return x - -if __name__ == "__main__": - import sys - import time - p = ConsoleProgressBar(sys.stdout, steps=999) - p.start("computing pi") - for i in range(999): - p.step() - time.sleep(0.001) - diff --git a/lib/python2.7/site-packages/setoolsgui/sepolgen/yacc.py b/lib/python2.7/site-packages/setoolsgui/sepolgen/yacc.py deleted file mode 100644 index bc4536d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sepolgen/yacc.py +++ /dev/null @@ -1,2209 +0,0 @@ -#----------------------------------------------------------------------------- -# ply: yacc.py -# -# Author(s): David M. Beazley (dave@dabeaz.com) -# -# Copyright (C) 2001-2006, David M. Beazley -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See the file COPYING for a complete copy of the LGPL. -# -# -# This implements an LR parser that is constructed from grammar rules defined -# as Python functions. The grammer is specified by supplying the BNF inside -# Python documentation strings. The inspiration for this technique was borrowed -# from John Aycock's Spark parsing system. PLY might be viewed as cross between -# Spark and the GNU bison utility. -# -# The current implementation is only somewhat object-oriented. The -# LR parser itself is defined in terms of an object (which allows multiple -# parsers to co-exist). However, most of the variables used during table -# construction are defined in terms of global variables. Users shouldn't -# notice unless they are trying to define multiple parsers at the same -# time using threads (in which case they should have their head examined). -# -# This implementation supports both SLR and LALR(1) parsing. LALR(1) -# support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu), -# using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles, -# Techniques, and Tools" (The Dragon Book). LALR(1) has since been replaced -# by the more efficient DeRemer and Pennello algorithm. -# -# :::::::: WARNING ::::::: -# -# Construction of LR parsing tables is fairly complicated and expensive. -# To make this module run fast, a *LOT* of work has been put into -# optimization---often at the expensive of readability and what might -# consider to be good Python "coding style." Modify the code at your -# own risk! -# ---------------------------------------------------------------------------- - -__version__ = "2.2" - -#----------------------------------------------------------------------------- -# === User configurable parameters === -# -# Change these to modify the default behavior of yacc (if you wish) -#----------------------------------------------------------------------------- - -yaccdebug = 1 # Debugging mode. If set, yacc generates a - # a 'parser.out' file in the current directory - -debug_file = 'parser.out' # Default name of the debugging file -tab_module = 'parsetab' # Default name of the table module -default_lr = 'LALR' # Default LR table generation method - -error_count = 3 # Number of symbols that must be shifted to leave recovery mode - -import re, types, sys, cStringIO, hashlib, os.path - -# Exception raised for yacc-related errors -class YaccError(Exception): pass - -#----------------------------------------------------------------------------- -# === LR Parsing Engine === -# -# The following classes are used for the LR parser itself. These are not -# used during table construction and are independent of the actual LR -# table generation algorithm -#----------------------------------------------------------------------------- - -# This class is used to hold non-terminal grammar symbols during parsing. -# It normally has the following attributes set: -# .type = Grammar symbol type -# .value = Symbol value -# .lineno = Starting line number -# .endlineno = Ending line number (optional, set automatically) -# .lexpos = Starting lex position -# .endlexpos = Ending lex position (optional, set automatically) - -class YaccSymbol: - def __str__(self): return self.type - def __repr__(self): return str(self) - -# This class is a wrapper around the objects actually passed to each -# grammar rule. Index lookup and assignment actually assign the -# .value attribute of the underlying YaccSymbol object. -# The lineno() method returns the line number of a given -# item (or 0 if not defined). The linespan() method returns -# a tuple of (startline,endline) representing the range of lines -# for a symbol. The lexspan() method returns a tuple (lexpos,endlexpos) -# representing the range of positional information for a symbol. - -class YaccProduction: - def __init__(self,s,stack=None): - self.slice = s - self.pbstack = [] - self.stack = stack - - def __getitem__(self,n): - if type(n) == types.IntType: - if n >= 0: return self.slice[n].value - else: return self.stack[n].value - else: - return [s.value for s in self.slice[n.start:n.stop:n.step]] - - def __setitem__(self,n,v): - self.slice[n].value = v - - def __len__(self): - return len(self.slice) - - def lineno(self,n): - return getattr(self.slice[n],"lineno",0) - - def linespan(self,n): - startline = getattr(self.slice[n],"lineno",0) - endline = getattr(self.slice[n],"endlineno",startline) - return startline,endline - - def lexpos(self,n): - return getattr(self.slice[n],"lexpos",0) - - def lexspan(self,n): - startpos = getattr(self.slice[n],"lexpos",0) - endpos = getattr(self.slice[n],"endlexpos",startpos) - return startpos,endpos - - def pushback(self,n): - if n <= 0: - raise ValueError, "Expected a positive value" - if n > (len(self.slice)-1): - raise ValueError, "Can't push %d tokens. Only %d are available." % (n,len(self.slice)-1) - for i in range(0,n): - self.pbstack.append(self.slice[-i-1]) - -# The LR Parsing engine. This is defined as a class so that multiple parsers -# can exist in the same process. A user never instantiates this directly. -# Instead, the global yacc() function should be used to create a suitable Parser -# object. - -class Parser: - def __init__(self,magic=None): - - # This is a hack to keep users from trying to instantiate a Parser - # object directly. - - if magic != "xyzzy": - raise YaccError, "Can't instantiate Parser. Use yacc() instead." - - # Reset internal state - self.productions = None # List of productions - self.errorfunc = None # Error handling function - self.action = { } # LR Action table - self.goto = { } # LR goto table - self.require = { } # Attribute require table - self.method = "Unknown LR" # Table construction method used - - def errok(self): - self.errorcount = 0 - - def restart(self): - del self.statestack[:] - del self.symstack[:] - sym = YaccSymbol() - sym.type = '$end' - self.symstack.append(sym) - self.statestack.append(0) - - def parse(self,input=None,lexer=None,debug=0): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table - goto = self.goto # Local reference to goto table - prod = self.productions # Local reference to production list - pslice = YaccProduction(None) # Production object passed to grammar rules - pslice.parser = self # Parser object - self.errorcount = 0 # Used during error recovery - - # If no lexer was given, we will try to use the lex module - if not lexer: - import lex - lexer = lex.lexer - - pslice.lexer = lexer - - # If input was supplied, pass to lexer - if input: - lexer.input(input) - - # Tokenize function - get_token = lexer.token - - statestack = [ ] # Stack of parsing states - self.statestack = statestack - symstack = [ ] # Stack of grammar symbols - self.symstack = symstack - - pslice.stack = symstack # Put in the production - errtoken = None # Err token - - # The start state is assumed to be (0,$end) - statestack.append(0) - sym = YaccSymbol() - sym.type = '$end' - symstack.append(sym) - - while 1: - # Get the next symbol on the input. If a lookahead symbol - # is already set, we just use that. Otherwise, we'll pull - # the next token off of the lookaheadstack or from the lexer - if debug > 1: - print 'state', statestack[-1] - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() - if not lookahead: - lookahead = YaccSymbol() - lookahead.type = '$end' - if debug: - errorlead = ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip() - - # Check the action table - s = statestack[-1] - ltype = lookahead.type - t = actions.get((s,ltype),None) - - if debug > 1: - print 'action', t - if t is not None: - if t > 0: - # shift a symbol on the stack - if ltype == '$end': - # Error, end of input - sys.stderr.write("yacc: Parse error. EOF\n") - return - statestack.append(t) - if debug > 1: - sys.stderr.write("%-60s shift state %s\n" % (errorlead, t)) - symstack.append(lookahead) - lookahead = None - - # Decrease error count on successful shift - if self.errorcount > 0: - self.errorcount -= 1 - - continue - - if t < 0: - # reduce a symbol on the stack, emit a production - p = prod[-t] - pname = p.name - plen = p.len - - # Get production function - sym = YaccSymbol() - sym.type = pname # Production name - sym.value = None - if debug > 1: - sys.stderr.write("%-60s reduce %d\n" % (errorlead, -t)) - - if plen: - targ = symstack[-plen-1:] - targ[0] = sym - try: - sym.lineno = targ[1].lineno - sym.endlineno = getattr(targ[-1],"endlineno",targ[-1].lineno) - sym.lexpos = targ[1].lexpos - sym.endlexpos = getattr(targ[-1],"endlexpos",targ[-1].lexpos) - except AttributeError: - sym.lineno = 0 - del symstack[-plen:] - del statestack[-plen:] - else: - sym.lineno = 0 - targ = [ sym ] - pslice.slice = targ - pslice.pbstack = [] - # Call the grammar rule with our special slice object - p.func(pslice) - - # If there was a pushback, put that on the stack - if pslice.pbstack: - lookaheadstack.append(lookahead) - for _t in pslice.pbstack: - lookaheadstack.append(_t) - lookahead = None - - symstack.append(sym) - statestack.append(goto[statestack[-1],pname]) - continue - - if t == 0: - n = symstack[-1] - return getattr(n,"value",None) - sys.stderr.write(errorlead, "\n") - - if t == None: - if debug: - sys.stderr.write(errorlead + "\n") - # We have some kind of parsing error here. To handle - # this, we are going to push the current token onto - # the tokenstack and replace it with an 'error' token. - # If there are any synchronization rules, they may - # catch it. - # - # In addition to pushing the error token, we call call - # the user defined p_error() function if this is the - # first syntax error. This function is only called if - # errorcount == 0. - if not self.errorcount: - self.errorcount = error_count - errtoken = lookahead - if errtoken.type == '$end': - errtoken = None # End of file! - if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - - if not self.errorcount: - # User must have done some kind of panic - # mode recovery on their own. The - # returned token is the next lookahead - lookahead = tok - errtoken = None - continue - else: - if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 - if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) - else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) - else: - sys.stderr.write("yacc: Parse error in input. EOF\n") - return - - else: - self.errorcount = error_count - - # case 1: the statestack only has 1 entry on it. If we're in this state, the - # entire parse has been rolled back and we're completely hosed. The token is - # discarded and we just keep going. - - if len(statestack) <= 1 and lookahead.type != '$end': - lookahead = None - errtoken = None - # Nuke the pushback stack - del lookaheadstack[:] - continue - - # case 2: the statestack has a couple of entries on it, but we're - # at the end of the file. nuke the top entry and generate an error token - - # Start nuking entries on the stack - if lookahead.type == '$end': - # Whoa. We're really hosed here. Bail out - return - - if lookahead.type != 'error': - sym = symstack[-1] - if sym.type == 'error': - # Hmmm. Error is on top of stack, we'll just nuke input - # symbol and continue - lookahead = None - continue - t = YaccSymbol() - t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno - t.value = lookahead - lookaheadstack.append(lookahead) - lookahead = t - else: - symstack.pop() - statestack.pop() - - continue - - # Call an error function here - raise RuntimeError, "yacc: internal parser error!!!\n" - -# ----------------------------------------------------------------------------- -# === Parser Construction === -# -# The following functions and variables are used to implement the yacc() function -# itself. This is pretty hairy stuff involving lots of error checking, -# construction of LR items, kernels, and so forth. Although a lot of -# this work is done using global variables, the resulting Parser object -# is completely self contained--meaning that it is safe to repeatedly -# call yacc() with different grammars in the same application. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# validate_file() -# -# This function checks to see if there are duplicated p_rulename() functions -# in the parser module file. Without this function, it is really easy for -# users to make mistakes by cutting and pasting code fragments (and it's a real -# bugger to try and figure out why the resulting parser doesn't work). Therefore, -# we just do a little regular expression pattern matching of def statements -# to try and detect duplicates. -# ----------------------------------------------------------------------------- - -def validate_file(filename): - base,ext = os.path.splitext(filename) - if ext != '.py': return 1 # No idea. Assume it's okay. - - try: - f = open(filename) - lines = f.readlines() - f.close() - except IOError: - return 1 # Oh well - - # Match def p_funcname( - fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(') - counthash = { } - linen = 1 - noerror = 1 - for l in lines: - m = fre.match(l) - if m: - name = m.group(1) - prev = counthash.get(name) - if not prev: - counthash[name] = linen - else: - sys.stderr.write("%s:%d: Function %s redefined. Previously defined on line %d\n" % (filename,linen,name,prev)) - noerror = 0 - linen += 1 - return noerror - -# This function looks for functions that might be grammar rules, but which don't have the proper p_suffix. -def validate_dict(d): - for n,v in d.items(): - if n[0:2] == 'p_' and type(v) in (types.FunctionType, types.MethodType): continue - if n[0:2] == 't_': continue - - if n[0:2] == 'p_': - sys.stderr.write("yacc: Warning. '%s' not defined as a function\n" % n) - if 1 and isinstance(v,types.FunctionType) and v.func_code.co_argcount == 1: - try: - doc = v.__doc__.split(" ") - if doc[1] == ':': - sys.stderr.write("%s:%d: Warning. Possible grammar rule '%s' defined without p_ prefix.\n" % (v.func_code.co_filename, v.func_code.co_firstlineno,n)) - except StandardError: - pass - -# ----------------------------------------------------------------------------- -# === GRAMMAR FUNCTIONS === -# -# The following global variables and functions are used to store, manipulate, -# and verify the grammar rules specified by the user. -# ----------------------------------------------------------------------------- - -# Initialize all of the global variables used during grammar construction -def initialize_vars(): - global Productions, Prodnames, Prodmap, Terminals - global Nonterminals, First, Follow, Precedence, LRitems - global Errorfunc, Signature, Requires - - Productions = [None] # A list of all of the productions. The first - # entry is always reserved for the purpose of - # building an augmented grammar - - Prodnames = { } # A dictionary mapping the names of nonterminals to a list of all - # productions of that nonterminal. - - Prodmap = { } # A dictionary that is only used to detect duplicate - # productions. - - Terminals = { } # A dictionary mapping the names of terminal symbols to a - # list of the rules where they are used. - - Nonterminals = { } # A dictionary mapping names of nonterminals to a list - # of rule numbers where they are used. - - First = { } # A dictionary of precomputed FIRST(x) symbols - - Follow = { } # A dictionary of precomputed FOLLOW(x) symbols - - Precedence = { } # Precedence rules for each terminal. Contains tuples of the - # form ('right',level) or ('nonassoc', level) or ('left',level) - - LRitems = [ ] # A list of all LR items for the grammar. These are the - # productions with the "dot" like E -> E . PLUS E - - Errorfunc = None # User defined error handler - - Signature = hashlib.sha256() # Digital signature of the grammar rules, precedence - # and other information. Used to determined when a - # parsing table needs to be regenerated. - - Requires = { } # Requires list - - # File objects used when creating the parser.out debugging file - global _vf, _vfc - _vf = cStringIO.StringIO() - _vfc = cStringIO.StringIO() - -# ----------------------------------------------------------------------------- -# class Production: -# -# This class stores the raw information about a single production or grammar rule. -# It has a few required attributes: -# -# name - Name of the production (nonterminal) -# prod - A list of symbols making up its production -# number - Production number. -# -# In addition, a few additional attributes are used to help with debugging or -# optimization of table generation. -# -# file - File where production action is defined. -# lineno - Line number where action is defined -# func - Action function -# prec - Precedence level -# lr_next - Next LR item. Example, if we are ' E -> E . PLUS E' -# then lr_next refers to 'E -> E PLUS . E' -# lr_index - LR item index (location of the ".") in the prod list. -# lookaheads - LALR lookahead symbols for this item -# len - Length of the production (number of symbols on right hand side) -# ----------------------------------------------------------------------------- - -class Production: - def __init__(self,**kw): - for k,v in kw.items(): - setattr(self,k,v) - self.lr_index = -1 - self.lr0_added = 0 # Flag indicating whether or not added to LR0 closure - self.lr1_added = 0 # Flag indicating whether or not added to LR1 - self.usyms = [ ] - self.lookaheads = { } - self.lk_added = { } - self.setnumbers = [ ] - - def __str__(self): - if self.prod: - s = "%s -> %s" % (self.name," ".join(self.prod)) - else: - s = "%s -> <empty>" % self.name - return s - - def __repr__(self): - return str(self) - - # Compute lr_items from the production - def lr_item(self,n): - if n > len(self.prod): return None - p = Production() - p.name = self.name - p.prod = list(self.prod) - p.number = self.number - p.lr_index = n - p.lookaheads = { } - p.setnumbers = self.setnumbers - p.prod.insert(n,".") - p.prod = tuple(p.prod) - p.len = len(p.prod) - p.usyms = self.usyms - - # Precompute list of productions immediately following - try: - p.lrafter = Prodnames[p.prod[n+1]] - except (IndexError,KeyError),e: - p.lrafter = [] - try: - p.lrbefore = p.prod[n-1] - except IndexError: - p.lrbefore = None - - return p - -class MiniProduction: - pass - -# regex matching identifiers -_is_identifier = re.compile(r'^[a-zA-Z0-9_-~]+$') - -# ----------------------------------------------------------------------------- -# add_production() -# -# Given an action function, this function assembles a production rule. -# The production rule is assumed to be found in the function's docstring. -# This rule has the general syntax: -# -# name1 ::= production1 -# | production2 -# | production3 -# ... -# | productionn -# name2 ::= production1 -# | production2 -# ... -# ----------------------------------------------------------------------------- - -def add_production(f,file,line,prodname,syms): - - if Terminals.has_key(prodname): - sys.stderr.write("%s:%d: Illegal rule name '%s'. Already defined as a token.\n" % (file,line,prodname)) - return -1 - if prodname == 'error': - sys.stderr.write("%s:%d: Illegal rule name '%s'. error is a reserved word.\n" % (file,line,prodname)) - return -1 - - if not _is_identifier.match(prodname): - sys.stderr.write("%s:%d: Illegal rule name '%s'\n" % (file,line,prodname)) - return -1 - - for x in range(len(syms)): - s = syms[x] - if s[0] in "'\"": - try: - c = eval(s) - if (len(c) > 1): - sys.stderr.write("%s:%d: Literal token %s in rule '%s' may only be a single character\n" % (file,line,s, prodname)) - return -1 - if not Terminals.has_key(c): - Terminals[c] = [] - syms[x] = c - continue - except SyntaxError: - pass - if not _is_identifier.match(s) and s != '%prec': - sys.stderr.write("%s:%d: Illegal name '%s' in rule '%s'\n" % (file,line,s, prodname)) - return -1 - - # See if the rule is already in the rulemap - map = "%s -> %s" % (prodname,syms) - if Prodmap.has_key(map): - m = Prodmap[map] - sys.stderr.write("%s:%d: Duplicate rule %s.\n" % (file,line, m)) - sys.stderr.write("%s:%d: Previous definition at %s:%d\n" % (file,line, m.file, m.line)) - return -1 - - p = Production() - p.name = prodname - p.prod = syms - p.file = file - p.line = line - p.func = f - p.number = len(Productions) - - - Productions.append(p) - Prodmap[map] = p - if not Nonterminals.has_key(prodname): - Nonterminals[prodname] = [ ] - - # Add all terminals to Terminals - i = 0 - while i < len(p.prod): - t = p.prod[i] - if t == '%prec': - try: - precname = p.prod[i+1] - except IndexError: - sys.stderr.write("%s:%d: Syntax error. Nothing follows %%prec.\n" % (p.file,p.line)) - return -1 - - prec = Precedence.get(precname,None) - if not prec: - sys.stderr.write("%s:%d: Nothing known about the precedence of '%s'\n" % (p.file,p.line,precname)) - return -1 - else: - p.prec = prec - del p.prod[i] - del p.prod[i] - continue - - if Terminals.has_key(t): - Terminals[t].append(p.number) - # Is a terminal. We'll assign a precedence to p based on this - if not hasattr(p,"prec"): - p.prec = Precedence.get(t,('right',0)) - else: - if not Nonterminals.has_key(t): - Nonterminals[t] = [ ] - Nonterminals[t].append(p.number) - i += 1 - - if not hasattr(p,"prec"): - p.prec = ('right',0) - - # Set final length of productions - p.len = len(p.prod) - p.prod = tuple(p.prod) - - # Calculate unique syms in the production - p.usyms = [ ] - for s in p.prod: - if s not in p.usyms: - p.usyms.append(s) - - # Add to the global productions list - try: - Prodnames[p.name].append(p) - except KeyError: - Prodnames[p.name] = [ p ] - return 0 - -# Given a raw rule function, this function rips out its doc string -# and adds rules to the grammar - -def add_function(f): - line = f.func_code.co_firstlineno - file = f.func_code.co_filename - error = 0 - - if isinstance(f,types.MethodType): - reqdargs = 2 - else: - reqdargs = 1 - - if f.func_code.co_argcount > reqdargs: - sys.stderr.write("%s:%d: Rule '%s' has too many arguments.\n" % (file,line,f.__name__)) - return -1 - - if f.func_code.co_argcount < reqdargs: - sys.stderr.write("%s:%d: Rule '%s' requires an argument.\n" % (file,line,f.__name__)) - return -1 - - if f.__doc__: - # Split the doc string into lines - pstrings = f.__doc__.splitlines() - lastp = None - dline = line - for ps in pstrings: - dline += 1 - p = ps.split() - if not p: continue - try: - if p[0] == '|': - # This is a continuation of a previous rule - if not lastp: - sys.stderr.write("%s:%d: Misplaced '|'.\n" % (file,dline)) - return -1 - prodname = lastp - if len(p) > 1: - syms = p[1:] - else: - syms = [ ] - else: - prodname = p[0] - lastp = prodname - assign = p[1] - if len(p) > 2: - syms = p[2:] - else: - syms = [ ] - if assign != ':' and assign != '::=': - sys.stderr.write("%s:%d: Syntax error. Expected ':'\n" % (file,dline)) - return -1 - - - e = add_production(f,file,dline,prodname,syms) - error += e - - - except StandardError: - sys.stderr.write("%s:%d: Syntax error in rule '%s'\n" % (file,dline,ps)) - error -= 1 - else: - sys.stderr.write("%s:%d: No documentation string specified in function '%s'\n" % (file,line,f.__name__)) - return error - - -# Cycle checking code (Michael Dyck) - -def compute_reachable(): - ''' - Find each symbol that can be reached from the start symbol. - Print a warning for any nonterminals that can't be reached. - (Unused terminals have already had their warning.) - ''' - Reachable = { } - for s in Terminals.keys() + Nonterminals.keys(): - Reachable[s] = 0 - - mark_reachable_from( Productions[0].prod[0], Reachable ) - - for s in Nonterminals.keys(): - if not Reachable[s]: - sys.stderr.write("yacc: Symbol '%s' is unreachable.\n" % s) - -def mark_reachable_from(s, Reachable): - ''' - Mark all symbols that are reachable from symbol s. - ''' - if Reachable[s]: - # We've already reached symbol s. - return - Reachable[s] = 1 - for p in Prodnames.get(s,[]): - for r in p.prod: - mark_reachable_from(r, Reachable) - -# ----------------------------------------------------------------------------- -# compute_terminates() -# -# This function looks at the various parsing rules and tries to detect -# infinite recursion cycles (grammar rules where there is no possible way -# to derive a string of only terminals). -# ----------------------------------------------------------------------------- -def compute_terminates(): - ''' - Raise an error for any symbols that don't terminate. - ''' - Terminates = {} - - # Terminals: - for t in Terminals.keys(): - Terminates[t] = 1 - - Terminates['$end'] = 1 - - # Nonterminals: - - # Initialize to false: - for n in Nonterminals.keys(): - Terminates[n] = 0 - - # Then propagate termination until no change: - while 1: - some_change = 0 - for (n,pl) in Prodnames.items(): - # Nonterminal n terminates iff any of its productions terminates. - for p in pl: - # Production p terminates iff all of its rhs symbols terminate. - for s in p.prod: - if not Terminates[s]: - # The symbol s does not terminate, - # so production p does not terminate. - p_terminates = 0 - break - else: - # didn't break from the loop, - # so every symbol s terminates - # so production p terminates. - p_terminates = 1 - - if p_terminates: - # symbol n terminates! - if not Terminates[n]: - Terminates[n] = 1 - some_change = 1 - # Don't need to consider any more productions for this n. - break - - if not some_change: - break - - some_error = 0 - for (s,terminates) in Terminates.items(): - if not terminates: - if not Prodnames.has_key(s) and not Terminals.has_key(s) and s != 'error': - # s is used-but-not-defined, and we've already warned of that, - # so it would be overkill to say that it's also non-terminating. - pass - else: - sys.stderr.write("yacc: Infinite recursion detected for symbol '%s'.\n" % s) - some_error = 1 - - return some_error - -# ----------------------------------------------------------------------------- -# verify_productions() -# -# This function examines all of the supplied rules to see if they seem valid. -# ----------------------------------------------------------------------------- -def verify_productions(cycle_check=1): - error = 0 - for p in Productions: - if not p: continue - - for s in p.prod: - if not Prodnames.has_key(s) and not Terminals.has_key(s) and s != 'error': - sys.stderr.write("%s:%d: Symbol '%s' used, but not defined as a token or a rule.\n" % (p.file,p.line,s)) - error = 1 - continue - - unused_tok = 0 - # Now verify all of the tokens - if yaccdebug: - _vf.write("Unused terminals:\n\n") - for s,v in Terminals.items(): - if s != 'error' and not v: - sys.stderr.write("yacc: Warning. Token '%s' defined, but not used.\n" % s) - if yaccdebug: _vf.write(" %s\n"% s) - unused_tok += 1 - - # Print out all of the productions - if yaccdebug: - _vf.write("\nGrammar\n\n") - for i in range(1,len(Productions)): - _vf.write("Rule %-5d %s\n" % (i, Productions[i])) - - unused_prod = 0 - # Verify the use of all productions - for s,v in Nonterminals.items(): - if not v: - p = Prodnames[s][0] - sys.stderr.write("%s:%d: Warning. Rule '%s' defined, but not used.\n" % (p.file,p.line, s)) - unused_prod += 1 - - - if unused_tok == 1: - sys.stderr.write("yacc: Warning. There is 1 unused token.\n") - if unused_tok > 1: - sys.stderr.write("yacc: Warning. There are %d unused tokens.\n" % unused_tok) - - if unused_prod == 1: - sys.stderr.write("yacc: Warning. There is 1 unused rule.\n") - if unused_prod > 1: - sys.stderr.write("yacc: Warning. There are %d unused rules.\n" % unused_prod) - - if yaccdebug: - _vf.write("\nTerminals, with rules where they appear\n\n") - ks = Terminals.keys() - ks.sort() - for k in ks: - _vf.write("%-20s : %s\n" % (k, " ".join([str(s) for s in Terminals[k]]))) - _vf.write("\nNonterminals, with rules where they appear\n\n") - ks = Nonterminals.keys() - ks.sort() - for k in ks: - _vf.write("%-20s : %s\n" % (k, " ".join([str(s) for s in Nonterminals[k]]))) - - if (cycle_check): - compute_reachable() - error += compute_terminates() -# error += check_cycles() - return error - -# ----------------------------------------------------------------------------- -# build_lritems() -# -# This function walks the list of productions and builds a complete set of the -# LR items. The LR items are stored in two ways: First, they are uniquely -# numbered and placed in the list _lritems. Second, a linked list of LR items -# is built for each production. For example: -# -# E -> E PLUS E -# -# Creates the list -# -# [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ] -# ----------------------------------------------------------------------------- - -def build_lritems(): - for p in Productions: - lastlri = p - lri = p.lr_item(0) - i = 0 - while 1: - lri = p.lr_item(i) - lastlri.lr_next = lri - if not lri: break - lri.lr_num = len(LRitems) - LRitems.append(lri) - lastlri = lri - i += 1 - - # In order for the rest of the parser generator to work, we need to - # guarantee that no more lritems are generated. Therefore, we nuke - # the p.lr_item method. (Only used in debugging) - # Production.lr_item = None - -# ----------------------------------------------------------------------------- -# add_precedence() -# -# Given a list of precedence rules, add to the precedence table. -# ----------------------------------------------------------------------------- - -def add_precedence(plist): - plevel = 0 - error = 0 - for p in plist: - plevel += 1 - try: - prec = p[0] - terms = p[1:] - if prec != 'left' and prec != 'right' and prec != 'nonassoc': - sys.stderr.write("yacc: Invalid precedence '%s'\n" % prec) - return -1 - for t in terms: - if Precedence.has_key(t): - sys.stderr.write("yacc: Precedence already specified for terminal '%s'\n" % t) - error += 1 - continue - Precedence[t] = (prec,plevel) - except: - sys.stderr.write("yacc: Invalid precedence table.\n") - error += 1 - - return error - -# ----------------------------------------------------------------------------- -# augment_grammar() -# -# Compute the augmented grammar. This is just a rule S' -> start where start -# is the starting symbol. -# ----------------------------------------------------------------------------- - -def augment_grammar(start=None): - if not start: - start = Productions[1].name - Productions[0] = Production(name="S'",prod=[start],number=0,len=1,prec=('right',0),func=None) - Productions[0].usyms = [ start ] - Nonterminals[start].append(0) - - -# ------------------------------------------------------------------------- -# first() -# -# Compute the value of FIRST1(beta) where beta is a tuple of symbols. -# -# During execution of compute_first1, the result may be incomplete. -# Afterward (e.g., when called from compute_follow()), it will be complete. -# ------------------------------------------------------------------------- -def first(beta): - - # We are computing First(x1,x2,x3,...,xn) - result = [ ] - for x in beta: - x_produces_empty = 0 - - # Add all the non-<empty> symbols of First[x] to the result. - for f in First[x]: - if f == '<empty>': - x_produces_empty = 1 - else: - if f not in result: result.append(f) - - if x_produces_empty: - # We have to consider the next x in beta, - # i.e. stay in the loop. - pass - else: - # We don't have to consider any further symbols in beta. - break - else: - # There was no 'break' from the loop, - # so x_produces_empty was true for all x in beta, - # so beta produces empty as well. - result.append('<empty>') - - return result - - -# FOLLOW(x) -# Given a non-terminal. This function computes the set of all symbols -# that might follow it. Dragon book, p. 189. - -def compute_follow(start=None): - # Add '$end' to the follow list of the start symbol - for k in Nonterminals.keys(): - Follow[k] = [ ] - - if not start: - start = Productions[1].name - - Follow[start] = [ '$end' ] - - while 1: - didadd = 0 - for p in Productions[1:]: - # Here is the production set - for i in range(len(p.prod)): - B = p.prod[i] - if Nonterminals.has_key(B): - # Okay. We got a non-terminal in a production - fst = first(p.prod[i+1:]) - hasempty = 0 - for f in fst: - if f != '<empty>' and f not in Follow[B]: - Follow[B].append(f) - didadd = 1 - if f == '<empty>': - hasempty = 1 - if hasempty or i == (len(p.prod)-1): - # Add elements of follow(a) to follow(b) - for f in Follow[p.name]: - if f not in Follow[B]: - Follow[B].append(f) - didadd = 1 - if not didadd: break - - if 0 and yaccdebug: - _vf.write('\nFollow:\n') - for k in Nonterminals.keys(): - _vf.write("%-20s : %s\n" % (k, " ".join([str(s) for s in Follow[k]]))) - -# ------------------------------------------------------------------------- -# compute_first1() -# -# Compute the value of FIRST1(X) for all symbols -# ------------------------------------------------------------------------- -def compute_first1(): - - # Terminals: - for t in Terminals.keys(): - First[t] = [t] - - First['$end'] = ['$end'] - First['#'] = ['#'] # what's this for? - - # Nonterminals: - - # Initialize to the empty set: - for n in Nonterminals.keys(): - First[n] = [] - - # Then propagate symbols until no change: - while 1: - some_change = 0 - for n in Nonterminals.keys(): - for p in Prodnames[n]: - for f in first(p.prod): - if f not in First[n]: - First[n].append( f ) - some_change = 1 - if not some_change: - break - - if 0 and yaccdebug: - _vf.write('\nFirst:\n') - for k in Nonterminals.keys(): - _vf.write("%-20s : %s\n" % - (k, " ".join([str(s) for s in First[k]]))) - -# ----------------------------------------------------------------------------- -# === SLR Generation === -# -# The following functions are used to construct SLR (Simple LR) parsing tables -# as described on p.221-229 of the dragon book. -# ----------------------------------------------------------------------------- - -# Global variables for the LR parsing engine -def lr_init_vars(): - global _lr_action, _lr_goto, _lr_method - global _lr_goto_cache, _lr0_cidhash - - _lr_action = { } # Action table - _lr_goto = { } # Goto table - _lr_method = "Unknown" # LR method used - _lr_goto_cache = { } - _lr0_cidhash = { } - - -# Compute the LR(0) closure operation on I, where I is a set of LR(0) items. -# prodlist is a list of productions. - -_add_count = 0 # Counter used to detect cycles - -def lr0_closure(I): - global _add_count - - _add_count += 1 - prodlist = Productions - - # Add everything in I to J - J = I[:] - didadd = 1 - while didadd: - didadd = 0 - for j in J: - for x in j.lrafter: - if x.lr0_added == _add_count: continue - # Add B --> .G to J - J.append(x.lr_next) - x.lr0_added = _add_count - didadd = 1 - - return J - -# Compute the LR(0) goto function goto(I,X) where I is a set -# of LR(0) items and X is a grammar symbol. This function is written -# in a way that guarantees uniqueness of the generated goto sets -# (i.e. the same goto set will never be returned as two different Python -# objects). With uniqueness, we can later do fast set comparisons using -# id(obj) instead of element-wise comparison. - -def lr0_goto(I,x): - # First we look for a previously cached entry - g = _lr_goto_cache.get((id(I),x),None) - if g: return g - - # Now we generate the goto set in a way that guarantees uniqueness - # of the result - - s = _lr_goto_cache.get(x,None) - if not s: - s = { } - _lr_goto_cache[x] = s - - gs = [ ] - for p in I: - n = p.lr_next - if n and n.lrbefore == x: - s1 = s.get(id(n),None) - if not s1: - s1 = { } - s[id(n)] = s1 - gs.append(n) - s = s1 - g = s.get('$end',None) - if not g: - if gs: - g = lr0_closure(gs) - s['$end'] = g - else: - s['$end'] = gs - _lr_goto_cache[(id(I),x)] = g - return g - -_lr0_cidhash = { } - -# Compute the LR(0) sets of item function -def lr0_items(): - - C = [ lr0_closure([Productions[0].lr_next]) ] - i = 0 - for I in C: - _lr0_cidhash[id(I)] = i - i += 1 - - # Loop over the items in C and each grammar symbols - i = 0 - while i < len(C): - I = C[i] - i += 1 - - # Collect all of the symbols that could possibly be in the goto(I,X) sets - asyms = { } - for ii in I: - for s in ii.usyms: - asyms[s] = None - - for x in asyms.keys(): - g = lr0_goto(I,x) - if not g: continue - if _lr0_cidhash.has_key(id(g)): continue - _lr0_cidhash[id(g)] = len(C) - C.append(g) - - return C - -# ----------------------------------------------------------------------------- -# ==== LALR(1) Parsing ==== -# -# LALR(1) parsing is almost exactly the same as SLR except that instead of -# relying upon Follow() sets when performing reductions, a more selective -# lookahead set that incorporates the state of the LR(0) machine is utilized. -# Thus, we mainly just have to focus on calculating the lookahead sets. -# -# The method used here is due to DeRemer and Pennelo (1982). -# -# DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1) -# Lookahead Sets", ACM Transactions on Programming Languages and Systems, -# Vol. 4, No. 4, Oct. 1982, pp. 615-649 -# -# Further details can also be found in: -# -# J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing", -# McGraw-Hill Book Company, (1985). -# -# Note: This implementation is a complete replacement of the LALR(1) -# implementation in PLY-1.x releases. That version was based on -# a less efficient algorithm and it had bugs in its implementation. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# compute_nullable_nonterminals() -# -# Creates a dictionary containing all of the non-terminals that might produce -# an empty production. -# ----------------------------------------------------------------------------- - -def compute_nullable_nonterminals(): - nullable = {} - num_nullable = 0 - while 1: - for p in Productions[1:]: - if p.len == 0: - nullable[p.name] = 1 - continue - for t in p.prod: - if not nullable.has_key(t): break - else: - nullable[p.name] = 1 - if len(nullable) == num_nullable: break - num_nullable = len(nullable) - return nullable - -# ----------------------------------------------------------------------------- -# find_nonterminal_trans(C) -# -# Given a set of LR(0) items, this functions finds all of the non-terminal -# transitions. These are transitions in which a dot appears immediately before -# a non-terminal. Returns a list of tuples of the form (state,N) where state -# is the state number and N is the nonterminal symbol. -# -# The input C is the set of LR(0) items. -# ----------------------------------------------------------------------------- - -def find_nonterminal_transitions(C): - trans = [] - for state in range(len(C)): - for p in C[state]: - if p.lr_index < p.len - 1: - t = (state,p.prod[p.lr_index+1]) - if Nonterminals.has_key(t[1]): - if t not in trans: trans.append(t) - state = state + 1 - return trans - -# ----------------------------------------------------------------------------- -# dr_relation() -# -# Computes the DR(p,A) relationships for non-terminal transitions. The input -# is a tuple (state,N) where state is a number and N is a nonterminal symbol. -# -# Returns a list of terminals. -# ----------------------------------------------------------------------------- - -def dr_relation(C,trans,nullable): - dr_set = { } - state,N = trans - terms = [] - - g = lr0_goto(C[state],N) - for p in g: - if p.lr_index < p.len - 1: - a = p.prod[p.lr_index+1] - if Terminals.has_key(a): - if a not in terms: terms.append(a) - - # This extra bit is to handle the start state - if state == 0 and N == Productions[0].prod[0]: - terms.append('$end') - - return terms - -# ----------------------------------------------------------------------------- -# reads_relation() -# -# Computes the READS() relation (p,A) READS (t,C). -# ----------------------------------------------------------------------------- - -def reads_relation(C, trans, empty): - # Look for empty transitions - rel = [] - state, N = trans - - g = lr0_goto(C[state],N) - j = _lr0_cidhash.get(id(g),-1) - for p in g: - if p.lr_index < p.len - 1: - a = p.prod[p.lr_index + 1] - if empty.has_key(a): - rel.append((j,a)) - - return rel - -# ----------------------------------------------------------------------------- -# compute_lookback_includes() -# -# Determines the lookback and includes relations -# -# LOOKBACK: -# -# This relation is determined by running the LR(0) state machine forward. -# For example, starting with a production "N : . A B C", we run it forward -# to obtain "N : A B C ." We then build a relationship between this final -# state and the starting state. These relationships are stored in a dictionary -# lookdict. -# -# INCLUDES: -# -# Computes the INCLUDE() relation (p,A) INCLUDES (p',B). -# -# This relation is used to determine non-terminal transitions that occur -# inside of other non-terminal transition states. (p,A) INCLUDES (p', B) -# if the following holds: -# -# B -> LAT, where T -> epsilon and p' -L-> p -# -# L is essentially a prefix (which may be empty), T is a suffix that must be -# able to derive an empty string. State p' must lead to state p with the string L. -# -# ----------------------------------------------------------------------------- - -def compute_lookback_includes(C,trans,nullable): - - lookdict = {} # Dictionary of lookback relations - includedict = {} # Dictionary of include relations - - # Make a dictionary of non-terminal transitions - dtrans = {} - for t in trans: - dtrans[t] = 1 - - # Loop over all transitions and compute lookbacks and includes - for state,N in trans: - lookb = [] - includes = [] - for p in C[state]: - if p.name != N: continue - - # Okay, we have a name match. We now follow the production all the way - # through the state machine until we get the . on the right hand side - - lr_index = p.lr_index - j = state - while lr_index < p.len - 1: - lr_index = lr_index + 1 - t = p.prod[lr_index] - - # Check to see if this symbol and state are a non-terminal transition - if dtrans.has_key((j,t)): - # Yes. Okay, there is some chance that this is an includes relation - # the only way to know for certain is whether the rest of the - # production derives empty - - li = lr_index + 1 - while li < p.len: - if Terminals.has_key(p.prod[li]): break # No forget it - if not nullable.has_key(p.prod[li]): break - li = li + 1 - else: - # Appears to be a relation between (j,t) and (state,N) - includes.append((j,t)) - - g = lr0_goto(C[j],t) # Go to next set - j = _lr0_cidhash.get(id(g),-1) # Go to next state - - # When we get here, j is the final state, now we have to locate the production - for r in C[j]: - if r.name != p.name: continue - if r.len != p.len: continue - i = 0 - # This look is comparing a production ". A B C" with "A B C ." - while i < r.lr_index: - if r.prod[i] != p.prod[i+1]: break - i = i + 1 - else: - lookb.append((j,r)) - for i in includes: - if not includedict.has_key(i): includedict[i] = [] - includedict[i].append((state,N)) - lookdict[(state,N)] = lookb - - return lookdict,includedict - -# ----------------------------------------------------------------------------- -# digraph() -# traverse() -# -# The following two functions are used to compute set valued functions -# of the form: -# -# F(x) = F'(x) U U{F(y) | x R y} -# -# This is used to compute the values of Read() sets as well as FOLLOW sets -# in LALR(1) generation. -# -# Inputs: X - An input set -# R - A relation -# FP - Set-valued function -# ------------------------------------------------------------------------------ - -def digraph(X,R,FP): - N = { } - for x in X: - N[x] = 0 - stack = [] - F = { } - for x in X: - if N[x] == 0: traverse(x,N,stack,F,X,R,FP) - return F - -def traverse(x,N,stack,F,X,R,FP): - stack.append(x) - d = len(stack) - N[x] = d - F[x] = FP(x) # F(X) <- F'(x) - - rel = R(x) # Get y's related to x - for y in rel: - if N[y] == 0: - traverse(y,N,stack,F,X,R,FP) - N[x] = min(N[x],N[y]) - for a in F.get(y,[]): - if a not in F[x]: F[x].append(a) - if N[x] == d: - N[stack[-1]] = sys.maxint - F[stack[-1]] = F[x] - element = stack.pop() - while element != x: - N[stack[-1]] = sys.maxint - F[stack[-1]] = F[x] - element = stack.pop() - -# ----------------------------------------------------------------------------- -# compute_read_sets() -# -# Given a set of LR(0) items, this function computes the read sets. -# -# Inputs: C = Set of LR(0) items -# ntrans = Set of nonterminal transitions -# nullable = Set of empty transitions -# -# Returns a set containing the read sets -# ----------------------------------------------------------------------------- - -def compute_read_sets(C, ntrans, nullable): - FP = lambda x: dr_relation(C,x,nullable) - R = lambda x: reads_relation(C,x,nullable) - F = digraph(ntrans,R,FP) - return F - -# ----------------------------------------------------------------------------- -# compute_follow_sets() -# -# Given a set of LR(0) items, a set of non-terminal transitions, a readset, -# and an include set, this function computes the follow sets -# -# Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)} -# -# Inputs: -# ntrans = Set of nonterminal transitions -# readsets = Readset (previously computed) -# inclsets = Include sets (previously computed) -# -# Returns a set containing the follow sets -# ----------------------------------------------------------------------------- - -def compute_follow_sets(ntrans,readsets,inclsets): - FP = lambda x: readsets[x] - R = lambda x: inclsets.get(x,[]) - F = digraph(ntrans,R,FP) - return F - -# ----------------------------------------------------------------------------- -# add_lookaheads() -# -# Attaches the lookahead symbols to grammar rules. -# -# Inputs: lookbacks - Set of lookback relations -# followset - Computed follow set -# -# This function directly attaches the lookaheads to productions contained -# in the lookbacks set -# ----------------------------------------------------------------------------- - -def add_lookaheads(lookbacks,followset): - for trans,lb in lookbacks.items(): - # Loop over productions in lookback - for state,p in lb: - if not p.lookaheads.has_key(state): - p.lookaheads[state] = [] - f = followset.get(trans,[]) - for a in f: - if a not in p.lookaheads[state]: p.lookaheads[state].append(a) - -# ----------------------------------------------------------------------------- -# add_lalr_lookaheads() -# -# This function does all of the work of adding lookahead information for use -# with LALR parsing -# ----------------------------------------------------------------------------- - -def add_lalr_lookaheads(C): - # Determine all of the nullable nonterminals - nullable = compute_nullable_nonterminals() - - # Find all non-terminal transitions - trans = find_nonterminal_transitions(C) - - # Compute read sets - readsets = compute_read_sets(C,trans,nullable) - - # Compute lookback/includes relations - lookd, included = compute_lookback_includes(C,trans,nullable) - - # Compute LALR FOLLOW sets - followsets = compute_follow_sets(trans,readsets,included) - - # Add all of the lookaheads - add_lookaheads(lookd,followsets) - -# ----------------------------------------------------------------------------- -# lr_parse_table() -# -# This function constructs the parse tables for SLR or LALR -# ----------------------------------------------------------------------------- -def lr_parse_table(method): - global _lr_method - goto = _lr_goto # Goto array - action = _lr_action # Action array - actionp = { } # Action production array (temporary) - - _lr_method = method - - n_srconflict = 0 - n_rrconflict = 0 - - if yaccdebug: - sys.stderr.write("yacc: Generating %s parsing table...\n" % method) - _vf.write("\n\nParsing method: %s\n\n" % method) - - # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items - # This determines the number of states - - C = lr0_items() - - if method == 'LALR': - add_lalr_lookaheads(C) - - # Build the parser table, state by state - st = 0 - for I in C: - # Loop over each production in I - actlist = [ ] # List of actions - - if yaccdebug: - _vf.write("\nstate %d\n\n" % st) - for p in I: - _vf.write(" (%d) %s\n" % (p.number, str(p))) - _vf.write("\n") - - for p in I: - try: - if p.prod[-1] == ".": - if p.name == "S'": - # Start symbol. Accept! - action[st,"$end"] = 0 - actionp[st,"$end"] = p - else: - # We are at the end of a production. Reduce! - if method == 'LALR': - laheads = p.lookaheads[st] - else: - laheads = Follow[p.name] - for a in laheads: - actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p))) - r = action.get((st,a),None) - if r is not None: - # Whoa. Have a shift/reduce or reduce/reduce conflict - if r > 0: - # Need to decide on shift or reduce here - # By default we favor shifting. Need to add - # some precedence rules here. - sprec,slevel = Productions[actionp[st,a].number].prec - rprec,rlevel = Precedence.get(a,('right',0)) - if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')): - # We really need to reduce here. - action[st,a] = -p.number - actionp[st,a] = p - if not slevel and not rlevel: - _vfc.write("shift/reduce conflict in state %d resolved as reduce.\n" % st) - _vf.write(" ! shift/reduce conflict for %s resolved as reduce.\n" % a) - n_srconflict += 1 - elif (slevel == rlevel) and (rprec == 'nonassoc'): - action[st,a] = None - else: - # Hmmm. Guess we'll keep the shift - if not rlevel: - _vfc.write("shift/reduce conflict in state %d resolved as shift.\n" % st) - _vf.write(" ! shift/reduce conflict for %s resolved as shift.\n" % a) - n_srconflict +=1 - elif r < 0: - # Reduce/reduce conflict. In this case, we favor the rule - # that was defined first in the grammar file - oldp = Productions[-r] - pp = Productions[p.number] - if oldp.line > pp.line: - action[st,a] = -p.number - actionp[st,a] = p - # sys.stderr.write("Reduce/reduce conflict in state %d\n" % st) - n_rrconflict += 1 - _vfc.write("reduce/reduce conflict in state %d resolved using rule %d (%s).\n" % (st, actionp[st,a].number, actionp[st,a])) - _vf.write(" ! reduce/reduce conflict for %s resolved using rule %d (%s).\n" % (a,actionp[st,a].number, actionp[st,a])) - else: - sys.stderr.write("Unknown conflict in state %d\n" % st) - else: - action[st,a] = -p.number - actionp[st,a] = p - else: - i = p.lr_index - a = p.prod[i+1] # Get symbol right after the "." - if Terminals.has_key(a): - g = lr0_goto(I,a) - j = _lr0_cidhash.get(id(g),-1) - if j >= 0: - # We are in a shift state - actlist.append((a,p,"shift and go to state %d" % j)) - r = action.get((st,a),None) - if r is not None: - # Whoa have a shift/reduce or shift/shift conflict - if r > 0: - if r != j: - sys.stderr.write("Shift/shift conflict in state %d\n" % st) - elif r < 0: - # Do a precedence check. - # - if precedence of reduce rule is higher, we reduce. - # - if precedence of reduce is same and left assoc, we reduce. - # - otherwise we shift - rprec,rlevel = Productions[actionp[st,a].number].prec - sprec,slevel = Precedence.get(a,('right',0)) - if (slevel > rlevel) or ((slevel == rlevel) and (rprec != 'left')): - # We decide to shift here... highest precedence to shift - action[st,a] = j - actionp[st,a] = p - if not rlevel: - n_srconflict += 1 - _vfc.write("shift/reduce conflict in state %d resolved as shift.\n" % st) - _vf.write(" ! shift/reduce conflict for %s resolved as shift.\n" % a) - elif (slevel == rlevel) and (rprec == 'nonassoc'): - action[st,a] = None - else: - # Hmmm. Guess we'll keep the reduce - if not slevel and not rlevel: - n_srconflict +=1 - _vfc.write("shift/reduce conflict in state %d resolved as reduce.\n" % st) - _vf.write(" ! shift/reduce conflict for %s resolved as reduce.\n" % a) - - else: - sys.stderr.write("Unknown conflict in state %d\n" % st) - else: - action[st,a] = j - actionp[st,a] = p - - except StandardError,e: - raise YaccError, "Hosed in lr_parse_table", e - - # Print the actions associated with each terminal - if yaccdebug: - _actprint = { } - for a,p,m in actlist: - if action.has_key((st,a)): - if p is actionp[st,a]: - _vf.write(" %-15s %s\n" % (a,m)) - _actprint[(a,m)] = 1 - _vf.write("\n") - for a,p,m in actlist: - if action.has_key((st,a)): - if p is not actionp[st,a]: - if not _actprint.has_key((a,m)): - _vf.write(" ! %-15s [ %s ]\n" % (a,m)) - _actprint[(a,m)] = 1 - - # Construct the goto table for this state - if yaccdebug: - _vf.write("\n") - nkeys = { } - for ii in I: - for s in ii.usyms: - if Nonterminals.has_key(s): - nkeys[s] = None - for n in nkeys.keys(): - g = lr0_goto(I,n) - j = _lr0_cidhash.get(id(g),-1) - if j >= 0: - goto[st,n] = j - if yaccdebug: - _vf.write(" %-30s shift and go to state %d\n" % (n,j)) - - st += 1 - - if yaccdebug: - if n_srconflict == 1: - sys.stderr.write("yacc: %d shift/reduce conflict\n" % n_srconflict) - if n_srconflict > 1: - sys.stderr.write("yacc: %d shift/reduce conflicts\n" % n_srconflict) - if n_rrconflict == 1: - sys.stderr.write("yacc: %d reduce/reduce conflict\n" % n_rrconflict) - if n_rrconflict > 1: - sys.stderr.write("yacc: %d reduce/reduce conflicts\n" % n_rrconflict) - -# ----------------------------------------------------------------------------- -# ==== LR Utility functions ==== -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# _lr_write_tables() -# -# This function writes the LR parsing tables to a file -# ----------------------------------------------------------------------------- - -def lr_write_tables(modulename=tab_module,outputdir=''): - filename = os.path.join(outputdir,modulename) + ".py" - try: - f = open(filename,"w") - - f.write(""" -# %s -# This file is automatically generated. Do not edit. - -_lr_method = %s - -_lr_signature = %s -""" % (filename, repr(_lr_method), repr(Signature.digest()))) - - # Change smaller to 0 to go back to original tables - smaller = 1 - - # Factor out names to try and make smaller - if smaller: - items = { } - - for k,v in _lr_action.items(): - i = items.get(k[1]) - if not i: - i = ([],[]) - items[k[1]] = i - i[0].append(k[0]) - i[1].append(v) - - f.write("\n_lr_action_items = {") - for k,v in items.items(): - f.write("%r:([" % k) - for i in v[0]: - f.write("%r," % i) - f.write("],[") - for i in v[1]: - f.write("%r," % i) - - f.write("]),") - f.write("}\n") - - f.write(""" -_lr_action = { } -for _k, _v in _lr_action_items.items(): - for _x,_y in zip(_v[0],_v[1]): - _lr_action[(_x,_k)] = _y -del _lr_action_items -""") - - else: - f.write("\n_lr_action = { "); - for k,v in _lr_action.items(): - f.write("(%r,%r):%r," % (k[0],k[1],v)) - f.write("}\n"); - - if smaller: - # Factor out names to try and make smaller - items = { } - - for k,v in _lr_goto.items(): - i = items.get(k[1]) - if not i: - i = ([],[]) - items[k[1]] = i - i[0].append(k[0]) - i[1].append(v) - - f.write("\n_lr_goto_items = {") - for k,v in items.items(): - f.write("%r:([" % k) - for i in v[0]: - f.write("%r," % i) - f.write("],[") - for i in v[1]: - f.write("%r," % i) - - f.write("]),") - f.write("}\n") - - f.write(""" -_lr_goto = { } -for _k, _v in _lr_goto_items.items(): - for _x,_y in zip(_v[0],_v[1]): - _lr_goto[(_x,_k)] = _y -del _lr_goto_items -""") - else: - f.write("\n_lr_goto = { "); - for k,v in _lr_goto.items(): - f.write("(%r,%r):%r," % (k[0],k[1],v)) - f.write("}\n"); - - # Write production table - f.write("_lr_productions = [\n") - for p in Productions: - if p: - if (p.func): - f.write(" (%r,%d,%r,%r,%d),\n" % (p.name, p.len, p.func.__name__,p.file,p.line)) - else: - f.write(" (%r,%d,None,None,None),\n" % (p.name, p.len)) - else: - f.write(" None,\n") - f.write("]\n") - - f.close() - - except IOError,e: - print "Unable to create '%s'" % filename - print e - return - -def lr_read_tables(module=tab_module,optimize=0): - global _lr_action, _lr_goto, _lr_productions, _lr_method - try: - exec "import %s as parsetab" % module - - if (optimize) or (Signature.digest() == parsetab._lr_signature): - _lr_action = parsetab._lr_action - _lr_goto = parsetab._lr_goto - _lr_productions = parsetab._lr_productions - _lr_method = parsetab._lr_method - return 1 - else: - return 0 - - except (ImportError,AttributeError): - return 0 - - -# Available instance types. This is used when parsers are defined by a class. -# it's a little funky because I want to preserve backwards compatibility -# with Python 2.0 where types.ObjectType is undefined. - -try: - _INSTANCETYPE = (types.InstanceType, types.ObjectType) -except AttributeError: - _INSTANCETYPE = types.InstanceType - -# ----------------------------------------------------------------------------- -# yacc(module) -# -# Build the parser module -# ----------------------------------------------------------------------------- - -def yacc(method=default_lr, debug=yaccdebug, module=None, tabmodule=tab_module, start=None, check_recursion=1, optimize=0,write_tables=1,debugfile=debug_file,outputdir=''): - global yaccdebug - yaccdebug = debug - - initialize_vars() - files = { } - error = 0 - - - # Add parsing method to signature - Signature.update(method) - - # If a "module" parameter was supplied, extract its dictionary. - # Note: a module may in fact be an instance as well. - - if module: - # User supplied a module object. - if isinstance(module, types.ModuleType): - ldict = module.__dict__ - elif isinstance(module, _INSTANCETYPE): - _items = [(k,getattr(module,k)) for k in dir(module)] - ldict = { } - for i in _items: - ldict[i[0]] = i[1] - else: - raise ValueError,"Expected a module" - - else: - # No module given. We might be able to get information from the caller. - # Throw an exception and unwind the traceback to get the globals - - try: - raise RuntimeError - except RuntimeError: - e,b,t = sys.exc_info() - f = t.tb_frame - f = f.f_back # Walk out to our calling function - ldict = f.f_globals # Grab its globals dictionary - - # Add starting symbol to signature - if not start: - start = ldict.get("start",None) - if start: - Signature.update(start) - - # If running in optimized mode. We're going to - - if (optimize and lr_read_tables(tabmodule,1)): - # Read parse table - del Productions[:] - for p in _lr_productions: - if not p: - Productions.append(None) - else: - m = MiniProduction() - m.name = p[0] - m.len = p[1] - m.file = p[3] - m.line = p[4] - if p[2]: - m.func = ldict[p[2]] - Productions.append(m) - - else: - # Get the tokens map - if (module and isinstance(module,_INSTANCETYPE)): - tokens = getattr(module,"tokens",None) - else: - tokens = ldict.get("tokens",None) - - if not tokens: - raise YaccError,"module does not define a list 'tokens'" - if not (isinstance(tokens,types.ListType) or isinstance(tokens,types.TupleType)): - raise YaccError,"tokens must be a list or tuple." - - # Check to see if a requires dictionary is defined. - requires = ldict.get("require",None) - if requires: - if not (isinstance(requires,types.DictType)): - raise YaccError,"require must be a dictionary." - - for r,v in requires.items(): - try: - if not (isinstance(v,types.ListType)): - raise TypeError - v1 = [x.split(".") for x in v] - Requires[r] = v1 - except StandardError: - print "Invalid specification for rule '%s' in require. Expected a list of strings" % r - - - # Build the dictionary of terminals. We a record a 0 in the - # dictionary to track whether or not a terminal is actually - # used in the grammar - - if 'error' in tokens: - print "yacc: Illegal token 'error'. Is a reserved word." - raise YaccError,"Illegal token name" - - for n in tokens: - if Terminals.has_key(n): - print "yacc: Warning. Token '%s' multiply defined." % n - Terminals[n] = [ ] - - Terminals['error'] = [ ] - - # Get the precedence map (if any) - prec = ldict.get("precedence",None) - if prec: - if not (isinstance(prec,types.ListType) or isinstance(prec,types.TupleType)): - raise YaccError,"precedence must be a list or tuple." - add_precedence(prec) - Signature.update(repr(prec)) - - for n in tokens: - if not Precedence.has_key(n): - Precedence[n] = ('right',0) # Default, right associative, 0 precedence - - # Look for error handler - ef = ldict.get('p_error',None) - if ef: - if isinstance(ef,types.FunctionType): - ismethod = 0 - elif isinstance(ef, types.MethodType): - ismethod = 1 - else: - raise YaccError,"'p_error' defined, but is not a function or method." - eline = ef.func_code.co_firstlineno - efile = ef.func_code.co_filename - files[efile] = None - - if (ef.func_code.co_argcount != 1+ismethod): - raise YaccError,"%s:%d: p_error() requires 1 argument." % (efile,eline) - global Errorfunc - Errorfunc = ef - else: - print "yacc: Warning. no p_error() function is defined." - - # Get the list of built-in functions with p_ prefix - symbols = [ldict[f] for f in ldict.keys() - if (type(ldict[f]) in (types.FunctionType, types.MethodType) and ldict[f].__name__[:2] == 'p_' - and ldict[f].__name__ != 'p_error')] - - # Check for non-empty symbols - if len(symbols) == 0: - raise YaccError,"no rules of the form p_rulename are defined." - - # Sort the symbols by line number - symbols.sort(lambda x,y: cmp(x.func_code.co_firstlineno,y.func_code.co_firstlineno)) - - # Add all of the symbols to the grammar - for f in symbols: - if (add_function(f)) < 0: - error += 1 - else: - files[f.func_code.co_filename] = None - - # Make a signature of the docstrings - for f in symbols: - if f.__doc__: - Signature.update(f.__doc__) - - lr_init_vars() - - if error: - raise YaccError,"Unable to construct parser." - - if not lr_read_tables(tabmodule): - - # Validate files - for filename in files.keys(): - if not validate_file(filename): - error = 1 - - # Validate dictionary - validate_dict(ldict) - - if start and not Prodnames.has_key(start): - raise YaccError,"Bad starting symbol '%s'" % start - - augment_grammar(start) - error = verify_productions(cycle_check=check_recursion) - otherfunc = [ldict[f] for f in ldict.keys() - if (type(f) in (types.FunctionType,types.MethodType) and ldict[f].__name__[:2] != 'p_')] - - if error: - raise YaccError,"Unable to construct parser." - - build_lritems() - compute_first1() - compute_follow(start) - - if method in ['SLR','LALR']: - lr_parse_table(method) - else: - raise YaccError, "Unknown parsing method '%s'" % method - - if write_tables: - lr_write_tables(tabmodule,outputdir) - - if yaccdebug: - try: - f = open(os.path.join(outputdir,debugfile),"w") - f.write(_vfc.getvalue()) - f.write("\n\n") - f.write(_vf.getvalue()) - f.close() - except IOError,e: - print "yacc: can't create '%s'" % debugfile,e - - # Made it here. Create a parser object and set up its internal state. - # Set global parse() method to bound method of parser object. - - p = Parser("xyzzy") - p.productions = Productions - p.errorfunc = Errorfunc - p.action = _lr_action - p.goto = _lr_goto - p.method = _lr_method - p.require = Requires - - global parse - parse = p.parse - - global parser - parser = p - - # Clean up all of the globals we created - if (not optimize): - yacc_cleanup() - return p - -# yacc_cleanup function. Delete all of the global variables -# used during table construction - -def yacc_cleanup(): - global _lr_action, _lr_goto, _lr_method, _lr_goto_cache - del _lr_action, _lr_goto, _lr_method, _lr_goto_cache - - global Productions, Prodnames, Prodmap, Terminals - global Nonterminals, First, Follow, Precedence, LRitems - global Errorfunc, Signature, Requires - - del Productions, Prodnames, Prodmap, Terminals - del Nonterminals, First, Follow, Precedence, LRitems - del Errorfunc, Signature, Requires - - global _vf, _vfc - del _vf, _vfc - - -# Stub that raises an error if parsing is attempted without first calling yacc() -def parse(*args,**kwargs): - raise YaccError, "yacc: No parser built with yacc()" - diff --git a/lib/python2.7/site-packages/setoolsgui/sesearch b/lib/python2.7/site-packages/setoolsgui/sesearch deleted file mode 100755 index e861db6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/sesearch +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/python -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with SETools. If not, see <http://www.gnu.org/licenses/>. -# - -from __future__ import print_function -import setools -import argparse -import sys -import logging - -parser = argparse.ArgumentParser( - description="SELinux policy rule search tool.", - epilog="TE/MLS rule searches cannot be mixed with RBAC rule searches.") -parser.add_argument("--version", action="version", version=setools.__version__) -parser.add_argument("policy", help="Path to the SELinux policy to search.", nargs="?") -parser.add_argument("-v", "--verbose", action="store_true", - help="Print extra informational messages") -parser.add_argument("--debug", action="store_true", dest="debug", help="Enable debugging.") - -rtypes = parser.add_argument_group("TE Rule Types") -rtypes.add_argument("-A", "--allow", action="append_const", - const="allow", dest="tertypes", - help="Search allow rules.") -rtypes.add_argument("--auditallow", action="append_const", - const="auditallow", dest="tertypes", - help="Search auditallow rules.") -rtypes.add_argument("--dontaudit", action="append_const", - const="dontaudit", dest="tertypes", - help="Search dontaudit rules.") -rtypes.add_argument("-T", "--type_trans", action="append_const", - const="type_transition", dest="tertypes", - help="Search type_transition rules.") -rtypes.add_argument("--type_change", action="append_const", - const="type_change", dest="tertypes", - help="Search type_change rules.") -rtypes.add_argument("--type_member", action="append_const", - const="type_member", dest="tertypes", - help="Search type_member rules.") - -rbacrtypes = parser.add_argument_group("RBAC Rule Types") -rbacrtypes.add_argument("--role_allow", action="append_const", - const="allow", dest="rbacrtypes", - help="Search role allow rules.") -rbacrtypes.add_argument("--role_trans", action="append_const", - const="role_transition", dest="rbacrtypes", - help="Search role_transition rules.") - -mlsrtypes = parser.add_argument_group("MLS Rule Types") -mlsrtypes.add_argument("--range_trans", action="append_const", - const="range_transition", dest="mlsrtypes", - help="Search range_transition rules.") - -expr = parser.add_argument_group("Expressions") -expr.add_argument("-s", "--source", - help="Source type/role of the TE/RBAC rule.") -expr.add_argument("-t", "--target", - help="Target type/role of the TE/RBAC rule.") -expr.add_argument("-c", "--class", dest="tclass", - help="Comma separated list of object classes") -expr.add_argument("-p", "--perms", metavar="PERMS", - help="Comma separated list of permissions.") -expr.add_argument("-D", "--default", - help="Default of the rule. (type/role/range transition rules)") -expr.add_argument("-b", "--bool", dest="boolean", metavar="BOOL", - help="Comma separated list of Booleans in the conditional expression.") - -opts = parser.add_argument_group("Search options") -opts.add_argument("-eb", action="store_true", dest="boolean_equal", - help="Match Boolean list exactly instead of matching any listed Boolean.") -opts.add_argument("-ep", action="store_true", dest="perms_equal", - help="Match permission set exactly instead of matching any listed permission.") -opts.add_argument("-ds", action="store_false", dest="source_indirect", - help="Match source attributes directly instead of matching member types/roles.") -opts.add_argument("-dt", action="store_false", dest="target_indirect", - help="Match target attributes directly instead of matching member types/roles.") -opts.add_argument("-rs", action="store_true", dest="source_regex", - help="Use regular expression matching for the source type/role.") -opts.add_argument("-rt", action="store_true", dest="target_regex", - help="Use regular expression matching for the target type/role.") -opts.add_argument("-rc", action="store_true", dest="tclass_regex", - help="Use regular expression matching for the object class.") -opts.add_argument("-rd", action="store_true", dest="default_regex", - help="Use regular expression matching for the default type/role.") -opts.add_argument("-rb", action="store_true", dest="boolean_regex", - help="Use regular expression matching for Booleans.") - -args = parser.parse_args() - -if not args.tertypes and not args.mlsrtypes and not args.rbacrtypes: - parser.error("At least one rule type must be specified.") - -if args.debug: - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s|%(levelname)s|%(name)s|%(message)s') -elif args.verbose: - logging.basicConfig(level=logging.INFO, format='%(message)s') -else: - logging.basicConfig(level=logging.WARNING, format='%(message)s') - -try: - p = setools.SELinuxPolicy(args.policy) - - if args.tertypes: - q = setools.TERuleQuery(p, - ruletype=args.tertypes, - source=args.source, - source_indirect=args.source_indirect, - source_regex=args.source_regex, - target=args.target, - target_indirect=args.target_indirect, - target_regex=args.target_regex, - tclass_regex=args.tclass_regex, - perms_equal=args.perms_equal, - default=args.default, - default_regex=args.default_regex, - boolean_regex=args.boolean_regex, - boolean_equal=args.boolean_equal) - - # these are broken out from the above statement to prevent making a list - # with an empty string in it (split on empty string) - if args.tclass: - if args.tclass_regex: - q.tclass = args.tclass - else: - q.tclass = args.tclass.split(",") - - if args.perms: - q.perms = args.perms.split(",") - - if args.boolean: - if args.boolean_regex: - q.boolean = args.boolean - else: - q.boolean = args.boolean.split(",") - - for r in sorted(q.results()): - print(r) - - if args.rbacrtypes: - q = setools.RBACRuleQuery(p, - ruletype=args.rbacrtypes, - source=args.source, - source_indirect=args.source_indirect, - source_regex=args.source_regex, - target=args.target, - target_indirect=args.target_indirect, - target_regex=args.target_regex, - default=args.default, - default_regex=args.default_regex, - tclass_regex=args.tclass_regex) - - # these are broken out from the above statement to prevent making a list - # with an empty string in it (split on empty string) - if args.tclass: - if args.tclass_regex: - q.tclass = args.tclass - else: - q.tclass = args.tclass.split(",") - - for r in sorted(q.results()): - print(r) - - if args.mlsrtypes: - q = setools.MLSRuleQuery(p, - ruletype=args.mlsrtypes, - source=args.source, - source_regex=args.source_regex, - target=args.target, - target_regex=args.target_regex, - tclass_regex=args.tclass_regex, - default=args.default) - - # these are broken out from the above statement to prevent making a list - # with an empty string in it (split on empty string) - if args.tclass: - if args.tclass_regex: - q.tclass = args.tclass - else: - q.tclass = args.tclass.split(",") - - for r in sorted(q.results()): - print(r) - -except Exception as err: - if args.debug: - import traceback - traceback.print_exc() - else: - print(err) - - sys.exit(-1) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/__init__.py b/lib/python2.7/site-packages/setoolsgui/setools/__init__.py deleted file mode 100644 index 4d03553..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/__init__.py +++ /dev/null @@ -1,68 +0,0 @@ -"""The SETools SELinux policy analysis library.""" -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -#try: -# import pkg_resources -# # pylint: disable=no-member -# __version__ = pkg_resources.get_distribution("setools").version -#except ImportError: # pragma: no cover -# __version__ = "unknown" -__version__ = "3.3.8" - -# Python classes for policy representation -from . import policyrep -from .policyrep import SELinuxPolicy - -# Exceptions -from . import exception - -# Component Queries -from .boolquery import BoolQuery -from .categoryquery import CategoryQuery -from .commonquery import CommonQuery -from .objclassquery import ObjClassQuery -from .polcapquery import PolCapQuery -from .rolequery import RoleQuery -from .sensitivityquery import SensitivityQuery -from .typequery import TypeQuery -from .typeattrquery import TypeAttributeQuery -from .userquery import UserQuery - -# Rule Queries -from .mlsrulequery import MLSRuleQuery -from .rbacrulequery import RBACRuleQuery -from .terulequery import TERuleQuery - -# Constraint queries -from .constraintquery import ConstraintQuery - -# In-policy Context Queries -from .fsusequery import FSUseQuery -from .genfsconquery import GenfsconQuery -from .initsidquery import InitialSIDQuery -from .netifconquery import NetifconQuery -from .nodeconquery import NodeconQuery -from .portconquery import PortconQuery - -# Information Flow Analysis -from .infoflow import InfoFlowAnalysis -from .permmap import PermissionMap - -# Domain Transition Analysis -from .dta import DomainTransitionAnalysis diff --git a/lib/python2.7/site-packages/setoolsgui/setools/boolquery.py b/lib/python2.7/site-packages/setoolsgui/setools/boolquery.py deleted file mode 100644 index b70b7d5..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/boolquery.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import compquery -from .descriptors import CriteriaDescriptor - - -class BoolQuery(compquery.ComponentQuery): - - """Query SELinux policy Booleans. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The Boolean name to match. - name_regex If true, regular expression matching - will be used on the Boolean name. - default The default state to match. If this - is None, the default state not be matched. - """ - - _default = None - - @property - def default(self): - return self._default - - @default.setter - def default(self, value): - if value is None: - self._default = None - else: - self._default = bool(value) - - def results(self): - """Generator which yields all Booleans matching the criteria.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Default: {0.default}".format(self)) - - for boolean in self.policy.bools(): - if not self._match_name(boolean): - continue - - if self.default is not None and boolean.state != self.default: - continue - - yield boolean diff --git a/lib/python2.7/site-packages/setoolsgui/setools/categoryquery.py b/lib/python2.7/site-packages/setoolsgui/setools/categoryquery.py deleted file mode 100644 index d4d7c4c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/categoryquery.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import compquery -from . import mixins - - -class CategoryQuery(mixins.MatchAlias, compquery.ComponentQuery): - - """ - Query MLS Categories - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The name of the category to match. - name_regex If true, regular expression matching will - be used for matching the name. - alias The alias name to match. - alias_regex If true, regular expression matching - will be used on the alias names. - """ - - def results(self): - """Generator which yields all matching categories.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Alias: {0.alias}, regex: {0.alias_regex}".format(self)) - - for cat in self.policy.categories(): - if not self._match_name(cat): - continue - - if not self._match_alias(cat): - continue - - yield cat diff --git a/lib/python2.7/site-packages/setoolsgui/setools/commonquery.py b/lib/python2.7/site-packages/setoolsgui/setools/commonquery.py deleted file mode 100644 index e105ccb..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/commonquery.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import compquery, mixins - - -class CommonQuery(mixins.MatchPermission, compquery.ComponentQuery): - - """ - Query common permission sets. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The name of the common to match. - name_regex If true, regular expression matching will - be used for matching the name. - perms The permissions to match. - perms_equal If true, only commons with permission sets - that are equal to the criteria will - match. Otherwise, any intersection - will match. - perms_regex If true, regular expression matching will be used - on the permission names instead of set logic. - """ - - def results(self): - """Generator which yields all matching commons.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Perms: {0.perms!r}, regex: {0.perms_regex}, eq: {0.perms_equal}". - format(self)) - - for com in self.policy.commons(): - if not self._match_name(com): - continue - - if not self._match_perms(com): - continue - - yield com diff --git a/lib/python2.7/site-packages/setoolsgui/setools/compquery.py b/lib/python2.7/site-packages/setoolsgui/setools/compquery.py deleted file mode 100644 index 3d8851a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/compquery.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -# pylint: disable=no-member,attribute-defined-outside-init,abstract-method -import re - -from . import query -from .descriptors import CriteriaDescriptor - - -class ComponentQuery(query.PolicyQuery): - - """Base class for SETools component queries.""" - - name = CriteriaDescriptor("name_regex") - name_regex = False - - def _match_name(self, obj): - """Match the object to the name criteria.""" - if not self.name: - # if there is no criteria, everything matches. - return True - - return self._match_regex(obj, self.name, self.name_regex) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/constraintquery.py b/lib/python2.7/site-packages/setoolsgui/setools/constraintquery.py deleted file mode 100644 index 82a6fc2..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/constraintquery.py +++ /dev/null @@ -1,142 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import mixins, query -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor, RuletypeDescriptor -from .policyrep.exception import ConstraintUseError - - -class ConstraintQuery(mixins.MatchObjClass, mixins.MatchPermission, query.PolicyQuery): - - """ - Query constraint rules, (mls)constrain/(mls)validatetrans. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - ruletype The list of rule type(s) to match. - tclass The object class(es) to match. - tclass_regex If true, use a regular expression for - matching the rule's object class. - perms The permission(s) to match. - perms_equal If true, the permission set of the rule - must exactly match the permissions - criteria. If false, any set intersection - will match. - perms_regex If true, regular expression matching will be used - on the permission names instead of set logic. - role The name of the role to match in the - constraint expression. - role_indirect If true, members of an attribute will be - matched rather than the attribute itself. - role_regex If true, regular expression matching will - be used on the role. - type_ The name of the type/attribute to match in the - constraint expression. - type_indirect If true, members of an attribute will be - matched rather than the attribute itself. - type_regex If true, regular expression matching will - be used on the type/attribute. - user The name of the user to match in the - constraint expression. - user_regex If true, regular expression matching will - be used on the user. - """ - - ruletype = RuletypeDescriptor("validate_constraint_ruletype") - user = CriteriaDescriptor("user_regex", "lookup_user") - user_regex = False - role = CriteriaDescriptor("role_regex", "lookup_role") - role_regex = False - role_indirect = True - type_ = CriteriaDescriptor("type_regex", "lookup_type_or_attr") - type_regex = False - type_indirect = True - - def _match_expr(self, expr, criteria, indirect, regex): - """ - Match roles/types/users in a constraint expression, - optionally by expanding the contents of attributes. - - Parameters: - expr The expression to match. - criteria The criteria to match. - indirect If attributes in the expression should be expanded. - regex If regular expression matching should be used. - """ - - if indirect: - obj = set() - for item in expr: - obj.update(item.expand()) - else: - obj = expr - - return self._match_in_set(obj, criteria, regex) - - def results(self): - """Generator which yields all matching constraints rules.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Ruletypes: {0.ruletype}".format(self)) - self.log.debug("Class: {0.tclass!r}, regex: {0.tclass_regex}".format(self)) - self.log.debug("Perms: {0.perms!r}, regex: {0.perms_regex}, eq: {0.perms_equal}". - format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - - for c in self.policy.constraints(): - if self.ruletype: - if c.ruletype not in self.ruletype: - continue - - if not self._match_object_class(c): - continue - - try: - if not self._match_perms(c): - continue - except ConstraintUseError: - continue - - if self.role and not self._match_expr( - c.roles, - self.role, - self.role_indirect, - self.role_regex): - continue - - if self.type_ and not self._match_expr( - c.types, - self.type_, - self.type_indirect, - self.type_regex): - continue - - if self.user and not self._match_expr( - c.users, - self.user, - False, - self.user_regex): - continue - - yield c diff --git a/lib/python2.7/site-packages/setoolsgui/setools/contextquery.py b/lib/python2.7/site-packages/setoolsgui/setools/contextquery.py deleted file mode 100644 index 5ce1632..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/contextquery.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -# pylint: disable=attribute-defined-outside-init,no-member -import re - -from . import query -from .descriptors import CriteriaDescriptor - - -class ContextQuery(query.PolicyQuery): - - """ - Base class for SETools in-policy labeling/context queries. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - context The object to match. - user The user to match in the context. - user_regex If true, regular expression matching - will be used on the user. - role The role to match in the context. - role_regex If true, regular expression matching - will be used on the role. - type_ The type to match in the context. - type_regex If true, regular expression matching - will be used on the type. - range_ The range to match in the context. - range_subset If true, the criteria will match if it - is a subset of the context's range. - range_overlap If true, the criteria will match if it - overlaps any of the context's range. - range_superset If true, the criteria will match if it - is a superset of the context's range. - range_proper If true, use proper superset/subset - on range matching operations. - No effect if not using set operations. - """ - - user = CriteriaDescriptor("user_regex", "lookup_user") - user_regex = False - role = CriteriaDescriptor("role_regex", "lookup_role") - role_regex = False - type_ = CriteriaDescriptor("type_regex", "lookup_type") - type_regex = False - range_ = CriteriaDescriptor(lookup_function="lookup_range") - range_overlap = False - range_subset = False - range_superset = False - range_proper = False - - def _match_context(self, context): - - if self.user and not query.PolicyQuery._match_regex( - context.user, - self.user, - self.user_regex): - return False - - if self.role and not query.PolicyQuery._match_regex( - context.role, - self.role, - self.role_regex): - return False - - if self.type_ and not query.PolicyQuery._match_regex( - context.type_, - self.type_, - self.type_regex): - return False - - if self.range_ and not query.PolicyQuery._match_range( - context.range_, - self.range_, - self.range_subset, - self.range_overlap, - self.range_superset, - self.range_proper): - return False - - return True diff --git a/lib/python2.7/site-packages/setoolsgui/setools/descriptors.py b/lib/python2.7/site-packages/setoolsgui/setools/descriptors.py deleted file mode 100644 index eab9210..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/descriptors.py +++ /dev/null @@ -1,230 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -""" -SETools descriptors. - -These classes override how a class's attributes are get/set/deleted. -This is how the @property decorator works. - -See https://docs.python.org/3/howto/descriptor.html -for more details. -""" - -import re -from collections import defaultdict -from weakref import WeakKeyDictionary - -# -# Query criteria descriptors -# -# Implementation note: if the name_regex attribute value -# is changed the criteria must be reset. -# - - -class CriteriaDescriptor(object): - - """ - Single item criteria descriptor. - - Parameters: - name_regex The name of instance's regex setting attribute; - used as name_regex below. If unset, - regular expressions will never be used. - lookup_function The name of the SELinuxPolicy lookup function, - e.g. lookup_type or lookup_boolean. - default_value The default value of the criteria. The default - is None. - - Read-only instance attribute use (obj parameter): - policy The instance of SELinuxPolicy - name_regex This attribute is read to determine if - the criteria should be looked up or - compiled into a regex. If the attribute - does not exist, False is assumed. - """ - - def __init__(self, name_regex=None, lookup_function=None, default_value=None): - assert name_regex or lookup_function, "A simple attribute should be used if there is " \ - "no regex nor lookup function." - self.regex = name_regex - self.default_value = default_value - self.lookup_function = lookup_function - - # use weak references so instances can be - # garbage collected, rather than unnecessarily - # kept around due to this descriptor. - self.instances = WeakKeyDictionary() - - def __get__(self, obj, objtype=None): - if obj is None: - return self - - return self.instances.setdefault(obj, self.default_value) - - def __set__(self, obj, value): - if not value: - self.instances[obj] = None - elif self.regex and getattr(obj, self.regex, False): - self.instances[obj] = re.compile(value) - elif self.lookup_function: - lookup = getattr(obj.policy, self.lookup_function) - self.instances[obj] = lookup(value) - else: - self.instances[obj] = value - - -class CriteriaSetDescriptor(CriteriaDescriptor): - - """Descriptor for a set of criteria.""" - - def __set__(self, obj, value): - if not value: - self.instances[obj] = None - elif self.regex and getattr(obj, self.regex, False): - self.instances[obj] = re.compile(value) - elif self.lookup_function: - lookup = getattr(obj.policy, self.lookup_function) - self.instances[obj] = set(lookup(v) for v in value) - else: - self.instances[obj] = set(value) - - -class RuletypeDescriptor(object): - - """ - Descriptor for a list of rule types. - - Parameters: - validator The name of the SELinuxPolicy ruletype - validator function, e.g. validate_te_ruletype - default_value The default value of the criteria. The default - is None. - - Read-only instance attribute use (obj parameter): - policy The instance of SELinuxPolicy - """ - - def __init__(self, validator): - self.validator = validator - - # use weak references so instances can be - # garbage collected, rather than unnecessarily - # kept around due to this descriptor. - self.instances = WeakKeyDictionary() - - def __get__(self, obj, objtype=None): - if obj is None: - return self - - return self.instances.setdefault(obj, None) - - def __set__(self, obj, value): - if value: - validate = getattr(obj.policy, self.validator) - validate(value) - self.instances[obj] = value - else: - self.instances[obj] = None - - -# -# NetworkX Graph Descriptors -# -# These descriptors are used to simplify all -# of the dictionary use in the NetworkX graph. -# - - -class NetworkXGraphEdgeDescriptor(object): - - """ - Descriptor base class for NetworkX graph edge attributes. - - Parameter: - name The edge property name - - Instance class attribute use (obj parameter): - G The NetworkX graph - source The edge's source node - target The edge's target node - """ - - def __init__(self, propname): - self.name = propname - - def __get__(self, obj, objtype=None): - if obj is None: - return self - - return obj.G[obj.source][obj.target][self.name] - - def __set__(self, obj, value): - raise NotImplementedError - - def __delete__(self, obj): - raise NotImplementedError - - -class EdgeAttrDict(NetworkXGraphEdgeDescriptor): - - """A descriptor for edge attributes that are dictionaries.""" - - def __set__(self, obj, value): - # None is a special value to initialize the attribute - if value is None: - obj.G[obj.source][obj.target][self.name] = defaultdict(list) - else: - raise ValueError("{0} dictionaries should not be assigned directly".format(self.name)) - - def __delete__(self, obj): - obj.G[obj.source][obj.target][self.name].clear() - - -class EdgeAttrIntMax(NetworkXGraphEdgeDescriptor): - - """ - A descriptor for edge attributes that are non-negative integers that always - keep the max assigned value until re-initialized. - """ - - def __set__(self, obj, value): - # None is a special value to initialize - if value is None: - obj.G[obj.source][obj.target][self.name] = 0 - else: - current_value = obj.G[obj.source][obj.target][self.name] - obj.G[obj.source][obj.target][self.name] = max(current_value, value) - - -class EdgeAttrList(NetworkXGraphEdgeDescriptor): - - """A descriptor for edge attributes that are lists.""" - - def __set__(self, obj, value): - # None is a special value to initialize - if value is None: - obj.G[obj.source][obj.target][self.name] = [] - else: - raise ValueError("{0} lists should not be assigned directly".format(self.name)) - - def __delete__(self, obj): - # in Python3 a .clear() function was added for lists - # keep this implementation for Python 2 compat - del obj.G[obj.source][obj.target][self.name][:] diff --git a/lib/python2.7/site-packages/setoolsgui/setools/dta.py b/lib/python2.7/site-packages/setoolsgui/setools/dta.py deleted file mode 100644 index 271efc4..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/dta.py +++ /dev/null @@ -1,603 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import itertools -import logging -from collections import defaultdict, namedtuple - -import networkx as nx -from networkx.exception import NetworkXError, NetworkXNoPath - -from .descriptors import EdgeAttrDict, EdgeAttrList - -__all__ = ['DomainTransitionAnalysis'] - -# Return values for the analysis -# are in the following tuple formats: -step_output = namedtuple("step", ["source", - "target", - "transition", - "entrypoints", - "setexec", - "dyntransition", - "setcurrent"]) - -entrypoint_output = namedtuple("entrypoints", ["name", - "entrypoint", - "execute", - "type_transition"]) - - -class DomainTransitionAnalysis(object): - - """Domain transition analysis.""" - - def __init__(self, policy, reverse=False, exclude=None): - """ - Parameter: - policy The policy to analyze. - """ - self.log = logging.getLogger(self.__class__.__name__) - - self.policy = policy - self.exclude = exclude - self.reverse = reverse - self.rebuildgraph = True - self.rebuildsubgraph = True - self.G = nx.DiGraph() - self.subG = None - - @property - def reverse(self): - return self._reverse - - @reverse.setter - def reverse(self, direction): - self._reverse = bool(direction) - self.rebuildsubgraph = True - - @property - def exclude(self): - return self._exclude - - @exclude.setter - def exclude(self, types): - if types: - self._exclude = [self.policy.lookup_type(t) for t in types] - else: - self._exclude = None - - self.rebuildsubgraph = True - - def shortest_path(self, source, target): - """ - Generator which yields one shortest domain transition path - between the source and target types (there may be more). - - Parameters: - source The source type. - target The target type. - - Yield: generator(steps) - - steps A generator that returns the tuple of - source, target, and rules for each - domain transition. - """ - s = self.policy.lookup_type(source) - t = self.policy.lookup_type(target) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating one shortest path from {0} to {1}...".format(s, t)) - - try: - yield self.__generate_steps(nx.shortest_path(self.subG, s, t)) - except (NetworkXNoPath, NetworkXError): - # NetworkXError: the type is valid but not in graph, e.g. excluded - # NetworkXNoPath: no paths or the target type is - # not in the graph - pass - - def all_paths(self, source, target, maxlen=2): - """ - Generator which yields all domain transition paths between - the source and target up to the specified maximum path - length. - - Parameters: - source The source type. - target The target type. - maxlen Maximum length of paths. - - Yield: generator(steps) - - steps A generator that returns the tuple of - source, target, and rules for each - domain transition. - """ - if maxlen < 1: - raise ValueError("Maximum path length must be positive.") - - s = self.policy.lookup_type(source) - t = self.policy.lookup_type(target) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating all paths from {0} to {1}, max len {2}...".format(s, t, maxlen)) - - try: - for path in nx.all_simple_paths(self.subG, s, t, maxlen): - yield self.__generate_steps(path) - except (NetworkXNoPath, NetworkXError): - # NetworkXError: the type is valid but not in graph, e.g. excluded - # NetworkXNoPath: no paths or the target type is - # not in the graph - pass - - def all_shortest_paths(self, source, target): - """ - Generator which yields all shortest domain transition paths - between the source and target types. - - Parameters: - source The source type. - target The target type. - - Yield: generator(steps) - - steps A generator that returns the tuple of - source, target, and rules for each - domain transition. - """ - s = self.policy.lookup_type(source) - t = self.policy.lookup_type(target) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating all shortest paths from {0} to {1}...".format(s, t)) - - try: - for path in nx.all_shortest_paths(self.subG, s, t): - yield self.__generate_steps(path) - except (NetworkXNoPath, NetworkXError, KeyError): - # NetworkXError: the type is valid but not in graph, e.g. excluded - # NetworkXNoPath: no paths or the target type is - # not in the graph - # KeyError: work around NetworkX bug - # when the source node is not in the graph - pass - - def transitions(self, type_): - """ - Generator which yields all domain transitions out of a - specified source type. - - Parameters: - type_ The starting type. - - Yield: generator(steps) - - steps A generator that returns the tuple of - source, target, and rules for each - domain transition. - """ - s = self.policy.lookup_type(type_) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating all transitions {1} {0}". - format(s, "in to" if self.reverse else "out from")) - - try: - for source, target in self.subG.out_edges_iter(s): - edge = Edge(self.subG, source, target) - - if self.reverse: - real_source, real_target = target, source - else: - real_source, real_target = source, target - - yield step_output(real_source, real_target, - edge.transition, - self.__generate_entrypoints(edge), - edge.setexec, - edge.dyntransition, - edge.setcurrent) - - except NetworkXError: - # NetworkXError: the type is valid but not in graph, e.g. excluded - pass - - def get_stats(self): # pragma: no cover - """ - Get the domain transition graph statistics. - - Return: tuple(nodes, edges) - - nodes The number of nodes (types) in the graph. - edges The number of edges (domain transitions) in the graph. - """ - return (self.G.number_of_nodes(), self.G.number_of_edges()) - - # - # Internal functions follow - # - @staticmethod - def __generate_entrypoints(edge): - """ - Generator which yields the entrypoint, execute, and - type_transition rules for each entrypoint. - - Parameter: - data The dictionary of entrypoints. - - Yield: tuple(type, entry, exec, trans) - - type The entrypoint type. - entry The list of entrypoint rules. - exec The list of execute rules. - trans The list of type_transition rules. - """ - for e in edge.entrypoint: - yield entrypoint_output(e, edge.entrypoint[e], edge.execute[e], edge.type_transition[e]) - - def __generate_steps(self, path): - """ - Generator which yields the source, target, and associated rules - for each domain transition. - - Parameter: - path A list of graph node names representing an information flow path. - - Yield: tuple(source, target, transition, entrypoints, - setexec, dyntransition, setcurrent) - - source The source type for this step of the domain transition. - target The target type for this step of the domain transition. - transition The list of transition rules. - entrypoints Generator which yields entrypoint-related rules. - setexec The list of setexec rules. - dyntranstion The list of dynamic transition rules. - setcurrent The list of setcurrent rules. - """ - - for s in range(1, len(path)): - source = path[s - 1] - target = path[s] - edge = Edge(self.subG, source, target) - - # Yield the actual source and target. - # The above perspective is reversed - # if the graph has been reversed. - if self.reverse: - real_source, real_target = target, source - else: - real_source, real_target = source, target - - yield step_output(real_source, real_target, - edge.transition, - self.__generate_entrypoints(edge), - edge.setexec, - edge.dyntransition, - edge.setcurrent) - - # - # Graph building functions - # - - # Domain transition requirements: - # - # Standard transitions a->b: - # allow a b:process transition; - # allow a b_exec:file execute; - # allow b b_exec:file entrypoint; - # - # and at least one of: - # allow a self:process setexec; - # type_transition a b_exec:process b; - # - # Dynamic transition x->y: - # allow x y:process dyntransition; - # allow x self:process setcurrent; - # - # Algorithm summary: - # 1. iterate over all rules - # 1. skip non allow/type_transition rules - # 2. if process transition or dyntransition, create edge, - # initialize rule lists, add the (dyn)transition rule - # 3. if process setexec or setcurrent, add to appropriate dict - # keyed on the subject - # 4. if file exec, entrypoint, or type_transition:process, - # add to appropriate dict keyed on subject,object. - # 2. Iterate over all graph edges: - # 1. if there is a transition rule (else add to invalid - # transition list): - # 1. use set intersection to find matching exec - # and entrypoint rules. If none, add to invalid - # transition list. - # 2. for each valid entrypoint, add rules to the - # edge's lists if there is either a - # type_transition for it or the source process - # has setexec permissions. - # 3. If there are neither type_transitions nor - # setexec permissions, add to the invalid - # transition list - # 2. if there is a dyntransition rule (else add to invalid - # dyntrans list): - # 1. If the source has a setcurrent rule, add it - # to the edge's list, else add to invalid - # dyntransition list. - # 3. Iterate over all graph edges: - # 1. if the edge has an invalid trans and dyntrans, delete - # the edge. - # 2. if the edge has an invalid trans, clear the related - # lists on the edge. - # 3. if the edge has an invalid dyntrans, clear the related - # lists on the edge. - # - def _build_graph(self): - self.G.clear() - - self.log.info("Building graph from {0}...".format(self.policy)) - - # hash tables keyed on domain type - setexec = defaultdict(list) - setcurrent = defaultdict(list) - - # hash tables keyed on (domain, entrypoint file type) - # the parameter for defaultdict has to be callable - # hence the lambda for the nested defaultdict - execute = defaultdict(lambda: defaultdict(list)) - entrypoint = defaultdict(lambda: defaultdict(list)) - - # hash table keyed on (domain, entrypoint, target domain) - type_trans = defaultdict(lambda: defaultdict(lambda: defaultdict(list))) - - for rule in self.policy.terules(): - if rule.ruletype == "allow": - if rule.tclass not in ["process", "file"]: - continue - - perms = rule.perms - - if rule.tclass == "process": - if "transition" in perms: - for s, t in itertools.product(rule.source.expand(), rule.target.expand()): - # only add edges if they actually - # transition to a new type - if s != t: - edge = Edge(self.G, s, t, create=True) - edge.transition.append(rule) - - if "dyntransition" in perms: - for s, t in itertools.product(rule.source.expand(), rule.target.expand()): - # only add edges if they actually - # transition to a new type - if s != t: - e = Edge(self.G, s, t, create=True) - e.dyntransition.append(rule) - - if "setexec" in perms: - for s in rule.source.expand(): - setexec[s].append(rule) - - if "setcurrent" in perms: - for s in rule.source.expand(): - setcurrent[s].append(rule) - - else: - if "execute" in perms: - for s, t in itertools.product( - rule.source.expand(), - rule.target.expand()): - execute[s][t].append(rule) - - if "entrypoint" in perms: - for s, t in itertools.product(rule.source.expand(), rule.target.expand()): - entrypoint[s][t].append(rule) - - elif rule.ruletype == "type_transition": - if rule.tclass != "process": - continue - - d = rule.default - for s, t in itertools.product(rule.source.expand(), rule.target.expand()): - type_trans[s][t][d].append(rule) - - invalid_edge = [] - clear_transition = [] - clear_dyntransition = [] - - for s, t in self.G.edges_iter(): - edge = Edge(self.G, s, t) - invalid_trans = False - invalid_dyntrans = False - - if edge.transition: - # get matching domain exec w/entrypoint type - entry = set(entrypoint[t].keys()) - exe = set(execute[s].keys()) - match = entry.intersection(exe) - - if not match: - # there are no valid entrypoints - invalid_trans = True - else: - # TODO try to improve the - # efficiency in this loop - for m in match: - if s in setexec or type_trans[s][m]: - # add key for each entrypoint - edge.entrypoint[m] += entrypoint[t][m] - edge.execute[m] += execute[s][m] - - if type_trans[s][m][t]: - edge.type_transition[m] += type_trans[s][m][t] - - if s in setexec: - edge.setexec.extend(setexec[s]) - - if not edge.setexec and not edge.type_transition: - invalid_trans = True - else: - invalid_trans = True - - if edge.dyntransition: - if s in setcurrent: - edge.setcurrent.extend(setcurrent[s]) - else: - invalid_dyntrans = True - else: - invalid_dyntrans = True - - # cannot change the edges while iterating over them, - # so keep appropriate lists - if invalid_trans and invalid_dyntrans: - invalid_edge.append(edge) - elif invalid_trans: - clear_transition.append(edge) - elif invalid_dyntrans: - clear_dyntransition.append(edge) - - # Remove invalid transitions - self.G.remove_edges_from(invalid_edge) - for edge in clear_transition: - # if only the regular transition is invalid, - # clear the relevant lists - del edge.transition - del edge.execute - del edge.entrypoint - del edge.type_transition - del edge.setexec - for edge in clear_dyntransition: - # if only the dynamic transition is invalid, - # clear the relevant lists - del edge.dyntransition - del edge.setcurrent - - self.rebuildgraph = False - self.rebuildsubgraph = True - self.log.info("Completed building graph.") - - def __remove_excluded_entrypoints(self): - invalid_edges = [] - for source, target in self.subG.edges_iter(): - edge = Edge(self.subG, source, target) - entrypoints = set(edge.entrypoint) - entrypoints.intersection_update(self.exclude) - - if not entrypoints: - # short circuit if there are no - # excluded entrypoint types on - # this edge. - continue - - for e in entrypoints: - # clear the entrypoint data - del edge.entrypoint[e] - del edge.execute[e] - - try: - del edge.type_transition[e] - except KeyError: # setexec - pass - - # cannot delete the edges while iterating over them - if not edge.entrypoint and not edge.dyntransition: - invalid_edges.append(edge) - - self.subG.remove_edges_from(invalid_edges) - - def _build_subgraph(self): - if self.rebuildgraph: - self._build_graph() - - self.log.info("Building subgraph.") - self.log.debug("Excluding {0}".format(self.exclude)) - self.log.debug("Reverse {0}".format(self.reverse)) - - # reverse graph for reverse DTA - if self.reverse: - self.subG = self.G.reverse(copy=True) - else: - self.subG = self.G.copy() - - if self.exclude: - # delete excluded domains from subgraph - self.subG.remove_nodes_from(self.exclude) - - # delete excluded entrypoints from subgraph - self.__remove_excluded_entrypoints() - - self.rebuildsubgraph = False - self.log.info("Completed building subgraph.") - - -class Edge(object): - - """ - A graph edge. Also used for returning domain transition steps. - - Parameters: - source The source type of the edge. - target The target tyep of the edge. - - Keyword Parameters: - create (T/F) create the edge if it does not exist. - The default is False. - """ - - transition = EdgeAttrList('transition') - setexec = EdgeAttrList('setexec') - dyntransition = EdgeAttrList('dyntransition') - setcurrent = EdgeAttrList('setcurrent') - entrypoint = EdgeAttrDict('entrypoint') - execute = EdgeAttrDict('execute') - type_transition = EdgeAttrDict('type_transition') - - def __init__(self, graph, source, target, create=False): - self.G = graph - self.source = source - self.target = target - - # a bit of a hack to make Edges work - # in NetworkX functions that work on - # 2-tuples of (source, target) - # (see __getitem__ below) - self.st_tuple = (source, target) - - if not self.G.has_edge(source, target): - if not create: - raise ValueError("Edge does not exist in graph") - else: - self.G.add_edge(source, target) - self.transition = None - self.entrypoint = None - self.execute = None - self.type_transition = None - self.setexec = None - self.dyntransition = None - self.setcurrent = None - - def __getitem__(self, key): - return self.st_tuple[key] diff --git a/lib/python2.7/site-packages/setoolsgui/setools/exception.py b/lib/python2.7/site-packages/setoolsgui/setools/exception.py deleted file mode 100644 index c3505cd..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/exception.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# - -# -# Base class for exceptions -# - - -class SEToolsException(Exception): - - """Base class for all SETools exceptions.""" - pass - -# -# Permission map exceptions -# - - -class PermissionMapException(SEToolsException): - - """Base class for all permission map exceptions.""" - pass - - -class PermissionMapParseError(PermissionMapException): - - """Exception for parse errors while reading permission map files.""" - pass - - -class RuleTypeError(PermissionMapException): - - """Exception for using rules with incorrect rule type.""" - pass - - -class UnmappedClass(PermissionMapException): - - """Exception for classes that are unmapped""" - pass - - -class UnmappedPermission(PermissionMapException): - - """Exception for permissions that are unmapped""" - pass diff --git a/lib/python2.7/site-packages/setoolsgui/setools/fsusequery.py b/lib/python2.7/site-packages/setoolsgui/setools/fsusequery.py deleted file mode 100644 index 6825a45..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/fsusequery.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import contextquery -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor - - -class FSUseQuery(contextquery.ContextQuery): - - """ - Query fs_use_* statements. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - ruletype The rule type(s) to match. - fs The criteria to match the file system type. - fs_regex If true, regular expression matching - will be used on the file system type. - user The criteria to match the context's user. - user_regex If true, regular expression matching - will be used on the user. - role The criteria to match the context's role. - role_regex If true, regular expression matching - will be used on the role. - type_ The criteria to match the context's type. - type_regex If true, regular expression matching - will be used on the type. - range_ The criteria to match the context's range. - range_subset If true, the criteria will match if it is a subset - of the context's range. - range_overlap If true, the criteria will match if it overlaps - any of the context's range. - range_superset If true, the criteria will match if it is a superset - of the context's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - ruletype = None - fs = CriteriaDescriptor("fs_regex") - fs_regex = False - - def results(self): - """Generator which yields all matching fs_use_* statements.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Ruletypes: {0.ruletype}".format(self)) - self.log.debug("FS: {0.fs!r}, regex: {0.fs_regex}".format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for fsu in self.policy.fs_uses(): - if self.ruletype and fsu.ruletype not in self.ruletype: - continue - - if self.fs and not self._match_regex( - fsu.fs, - self.fs, - self.fs_regex): - continue - - if not self._match_context(fsu.context): - continue - - yield fsu diff --git a/lib/python2.7/site-packages/setoolsgui/setools/genfsconquery.py b/lib/python2.7/site-packages/setoolsgui/setools/genfsconquery.py deleted file mode 100644 index c67dfd6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/genfsconquery.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import contextquery -from .descriptors import CriteriaDescriptor - - -class GenfsconQuery(contextquery.ContextQuery): - - """ - Query genfscon statements. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - fs The criteria to match the file system type. - fs_regex If true, regular expression matching - will be used on the file system type. - path The criteria to match the path. - path_regex If true, regular expression matching - will be used on the path. - user The criteria to match the context's user. - user_regex If true, regular expression matching - will be used on the user. - role The criteria to match the context's role. - role_regex If true, regular expression matching - will be used on the role. - type_ The criteria to match the context's type. - type_regex If true, regular expression matching - will be used on the type. - range_ The criteria to match the context's range. - range_subset If true, the criteria will match if it is a subset - of the context's range. - range_overlap If true, the criteria will match if it overlaps - any of the context's range. - range_superset If true, the criteria will match if it is a superset - of the context's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - filetype = None - fs = CriteriaDescriptor("fs_regex") - fs_regex = False - path = CriteriaDescriptor("path_regex") - path_regex = False - - def results(self): - """Generator which yields all matching genfscons.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("FS: {0.fs!r}, regex: {0.fs_regex}".format(self)) - self.log.debug("Path: {0.path!r}, regex: {0.path_regex}".format(self)) - self.log.debug("Filetype: {0.filetype!r}".format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for genfs in self.policy.genfscons(): - if self.fs and not self._match_regex( - genfs.fs, - self.fs, - self.fs_regex): - continue - - if self.path and not self._match_regex( - genfs.path, - self.path, - self.path_regex): - continue - - if self.filetype and not self.filetype == genfs.filetype: - continue - - if not self._match_context(genfs.context): - continue - - yield genfs diff --git a/lib/python2.7/site-packages/setoolsgui/setools/infoflow.py b/lib/python2.7/site-packages/setoolsgui/setools/infoflow.py deleted file mode 100644 index ea3ec32..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/infoflow.py +++ /dev/null @@ -1,403 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import itertools -import logging -from collections import namedtuple - -import networkx as nx -from networkx.exception import NetworkXError, NetworkXNoPath - -from .descriptors import EdgeAttrIntMax, EdgeAttrList - -__all__ = ['InfoFlowAnalysis'] - -# Return values for the analysis -# are in the following tuple format: -step_output = namedtuple("step", ["source", - "target", - "rules"]) - - -class InfoFlowAnalysis(object): - - """Information flow analysis.""" - - def __init__(self, policy, perm_map, min_weight=1, exclude=None): - """ - Parameters: - policy The policy to analyze. - perm_map The permission map or path to the permission map file. - minweight The minimum permission weight to include in the analysis. - (default is 1) - exclude The types excluded from the information flow analysis. - (default is none) - """ - self.log = logging.getLogger(self.__class__.__name__) - - self.policy = policy - - self.min_weight = min_weight - self.perm_map = perm_map - self.exclude = exclude - self.rebuildgraph = True - self.rebuildsubgraph = True - - self.G = nx.DiGraph() - self.subG = None - - @property - def min_weight(self): - return self._min_weight - - @min_weight.setter - def min_weight(self, weight): - if not 1 <= weight <= 10: - raise ValueError( - "Min information flow weight must be an integer 1-10.") - - self._min_weight = weight - self.rebuildsubgraph = True - - @property - def perm_map(self): - return self._perm_map - - @perm_map.setter - def perm_map(self, perm_map): - self._perm_map = perm_map - self.rebuildgraph = True - self.rebuildsubgraph = True - - @property - def exclude(self): - return self._exclude - - @exclude.setter - def exclude(self, types): - if types: - self._exclude = [self.policy.lookup_type(t) for t in types] - else: - self._exclude = [] - - self.rebuildsubgraph = True - - def shortest_path(self, source, target): - """ - Generator which yields one shortest path between the source - and target types (there may be more). - - Parameters: - source The source type. - target The target type. - - Yield: generator(steps) - - steps Yield: tuple(source, target, rules) - - source The source type for this step of the information flow. - target The target type for this step of the information flow. - rules The list of rules creating this information flow step. - """ - s = self.policy.lookup_type(source) - t = self.policy.lookup_type(target) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating one shortest path from {0} to {1}...".format(s, t)) - - try: - yield self.__generate_steps(nx.shortest_path(self.subG, s, t)) - except (NetworkXNoPath, NetworkXError): - # NetworkXError: the type is valid but not in graph, e.g. - # excluded or disconnected due to min weight - # NetworkXNoPath: no paths or the target type is - # not in the graph - pass - - def all_paths(self, source, target, maxlen=2): - """ - Generator which yields all paths between the source and target - up to the specified maximum path length. This algorithm - tends to get very expensive above 3-5 steps, depending - on the policy complexity. - - Parameters: - source The source type. - target The target type. - maxlen Maximum length of paths. - - Yield: generator(steps) - - steps Yield: tuple(source, target, rules) - - source The source type for this step of the information flow. - target The target type for this step of the information flow. - rules The list of rules creating this information flow step. - """ - if maxlen < 1: - raise ValueError("Maximum path length must be positive.") - - s = self.policy.lookup_type(source) - t = self.policy.lookup_type(target) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating all paths from {0} to {1}, max len {2}...".format(s, t, maxlen)) - - try: - for path in nx.all_simple_paths(self.subG, s, t, maxlen): - yield self.__generate_steps(path) - except (NetworkXNoPath, NetworkXError): - # NetworkXError: the type is valid but not in graph, e.g. - # excluded or disconnected due to min weight - # NetworkXNoPath: no paths or the target type is - # not in the graph - pass - - def all_shortest_paths(self, source, target): - """ - Generator which yields all shortest paths between the source - and target types. - - Parameters: - source The source type. - target The target type. - - Yield: generator(steps) - - steps Yield: tuple(source, target, rules) - - source The source type for this step of the information flow. - target The target type for this step of the information flow. - rules The list of rules creating this information flow step. - """ - s = self.policy.lookup_type(source) - t = self.policy.lookup_type(target) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating all shortest paths from {0} to {1}...".format(s, t)) - - try: - for path in nx.all_shortest_paths(self.subG, s, t): - yield self.__generate_steps(path) - except (NetworkXNoPath, NetworkXError, KeyError): - # NetworkXError: the type is valid but not in graph, e.g. - # excluded or disconnected due to min weight - # NetworkXNoPath: no paths or the target type is - # not in the graph - # KeyError: work around NetworkX bug - # when the source node is not in the graph - pass - - def infoflows(self, type_, out=True): - """ - Generator which yields all information flows in/out of a - specified source type. - - Parameters: - source The starting type. - - Keyword Parameters: - out If true, information flows out of the type will - be returned. If false, information flows in to the - type will be returned. Default is true. - - Yield: generator(steps) - - steps A generator that returns the tuple of - source, target, and rules for each - information flow. - """ - s = self.policy.lookup_type(type_) - - if self.rebuildsubgraph: - self._build_subgraph() - - self.log.info("Generating all infoflows out of {0}...".format(s)) - - if out: - flows = self.subG.out_edges_iter(s) - else: - flows = self.subG.in_edges_iter(s) - - try: - for source, target in flows: - edge = Edge(self.subG, source, target) - yield step_output(source, target, edge.rules) - except NetworkXError: - # NetworkXError: the type is valid but not in graph, e.g. - # excluded or disconnected due to min weight - pass - - def get_stats(self): # pragma: no cover - """ - Get the information flow graph statistics. - - Return: tuple(nodes, edges) - - nodes The number of nodes (types) in the graph. - edges The number of edges (information flows between types) - in the graph. - """ - return (self.G.number_of_nodes(), self.G.number_of_edges()) - - # - # Internal functions follow - # - - def __generate_steps(self, path): - """ - Generator which returns the source, target, and associated rules - for each information flow step. - - Parameter: - path A list of graph node names representing an information flow path. - - Yield: tuple(source, target, rules) - - source The source type for this step of the information flow. - target The target type for this step of the information flow. - rules The list of rules creating this information flow step. - """ - for s in range(1, len(path)): - edge = Edge(self.subG, path[s - 1], path[s]) - yield step_output(edge.source, edge.target, edge.rules) - - # - # - # Graph building functions - # - # - # 1. _build_graph determines the flow in each direction for each TE - # rule and then expands the rule. All information flows are - # included in this main graph: memory is traded off for efficiency - # as the main graph should only need to be rebuilt if permission - # weights change. - # 2. _build_subgraph derives a subgraph which removes all excluded - # types (nodes) and edges (information flows) which are below the - # minimum weight. This subgraph is rebuilt only if the main graph - # is rebuilt or the minimum weight or excluded types change. - - def _build_graph(self): - self.G.clear() - - self.perm_map.map_policy(self.policy) - - self.log.info("Building graph from {0}...".format(self.policy)) - - for rule in self.policy.terules(): - if rule.ruletype != "allow": - continue - - (rweight, wweight) = self.perm_map.rule_weight(rule) - - for s, t in itertools.product(rule.source.expand(), rule.target.expand()): - # only add flows if they actually flow - # in or out of the source type type - if s != t: - if wweight: - edge = Edge(self.G, s, t, create=True) - edge.rules.append(rule) - edge.weight = wweight - - if rweight: - edge = Edge(self.G, t, s, create=True) - edge.rules.append(rule) - edge.weight = rweight - - self.rebuildgraph = False - self.rebuildsubgraph = True - self.log.info("Completed building graph.") - - def _build_subgraph(self): - if self.rebuildgraph: - self._build_graph() - - self.log.info("Building subgraph...") - self.log.debug("Excluding {0!r}".format(self.exclude)) - self.log.debug("Min weight {0}".format(self.min_weight)) - - # delete excluded types from subgraph - nodes = [n for n in self.G.nodes() if n not in self.exclude] - self.subG = self.G.subgraph(nodes) - - # delete edges below minimum weight. - # no need if weight is 1, since that - # does not exclude any edges. - if self.min_weight > 1: - delete_list = [] - for s, t in self.subG.edges_iter(): - edge = Edge(self.subG, s, t) - if edge.weight < self.min_weight: - delete_list.append(edge) - - self.subG.remove_edges_from(delete_list) - - self.rebuildsubgraph = False - self.log.info("Completed building subgraph.") - - -class Edge(object): - - """ - A graph edge. Also used for returning information flow steps. - - Parameters: - source The source type of the edge. - target The target type of the edge. - - Keyword Parameters: - create (T/F) create the edge if it does not exist. - The default is False. - """ - - rules = EdgeAttrList('rules') - - # use capacity to store the info flow weight so - # we can use network flow algorithms naturally. - # The weight for each edge is 1 since each info - # flow step is no more costly than another - # (see below add_edge() call) - weight = EdgeAttrIntMax('capacity') - - def __init__(self, graph, source, target, create=False): - self.G = graph - self.source = source - self.target = target - - # a bit of a hack to make edges work - # in NetworkX functions that work on - # 2-tuples of (source, target) - # (see __getitem__ below) - self.st_tuple = (source, target) - - if not self.G.has_edge(source, target): - if create: - self.G.add_edge(source, target, weight=1) - self.rules = None - self.weight = None - else: - raise ValueError("Edge does not exist in graph") - - def __getitem__(self, key): - return self.st_tuple[key] diff --git a/lib/python2.7/site-packages/setoolsgui/setools/initsidquery.py b/lib/python2.7/site-packages/setoolsgui/setools/initsidquery.py deleted file mode 100644 index 1eb3790..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/initsidquery.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import compquery -from . import contextquery - - -class InitialSIDQuery(compquery.ComponentQuery, contextquery.ContextQuery): - - """ - Initial SID (Initial context) query. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The Initial SID name to match. - name_regex If true, regular expression matching - will be used on the Initial SID name. - user The criteria to match the context's user. - user_regex If true, regular expression matching - will be used on the user. - role The criteria to match the context's role. - role_regex If true, regular expression matching - will be used on the role. - type_ The criteria to match the context's type. - type_regex If true, regular expression matching - will be used on the type. - range_ The criteria to match the context's range. - range_subset If true, the criteria will match if it is a subset - of the context's range. - range_overlap If true, the criteria will match if it overlaps - any of the context's range. - range_superset If true, the criteria will match if it is a superset - of the context's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - def results(self): - """Generator which yields all matching initial SIDs.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for i in self.policy.initialsids(): - if not self._match_name(i): - continue - - if not self._match_context(i.context): - continue - - yield i diff --git a/lib/python2.7/site-packages/setoolsgui/setools/mixins.py b/lib/python2.7/site-packages/setoolsgui/setools/mixins.py deleted file mode 100644 index a31d420..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/mixins.py +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -# pylint: disable=attribute-defined-outside-init,no-member -import re - -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor - - -class MatchAlias(object): - - """Mixin for matching an object's aliases.""" - - alias = CriteriaDescriptor("alias_regex") - alias_regex = False - - def _match_alias(self, obj): - """ - Match the alias criteria - - Parameter: - obj An object with an alias generator method named "aliases" - """ - - if not self.alias: - # if there is no criteria, everything matches. - return True - - return self._match_in_set(obj.aliases(), self.alias, self.alias_regex) - - -class MatchObjClass(object): - - """Mixin for matching an object's class.""" - - tclass = CriteriaSetDescriptor("tclass_regex", "lookup_class") - tclass_regex = False - - def _match_object_class(self, obj): - """ - Match the object class criteria - - Parameter: - obj An object with an object class attribute named "tclass" - """ - - if not self.tclass: - # if there is no criteria, everything matches. - return True - elif self.tclass_regex: - return bool(self.tclass.search(str(obj.tclass))) - else: - return obj.tclass in self.tclass - - -class MatchPermission(object): - - """Mixin for matching an object's permissions.""" - - perms = CriteriaSetDescriptor("perms_regex") - perms_equal = False - perms_regex = False - - def _match_perms(self, obj): - """ - Match the permission criteria - - Parameter: - obj An object with a permission set class attribute named "perms" - """ - - if not self.perms: - # if there is no criteria, everything matches. - return True - - return self._match_regex_or_set(obj.perms, self.perms, self.perms_equal, self.perms_regex) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/mlsrulequery.py b/lib/python2.7/site-packages/setoolsgui/setools/mlsrulequery.py deleted file mode 100644 index 3a9e1bf..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/mlsrulequery.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import mixins, query -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor, RuletypeDescriptor - - -class MLSRuleQuery(mixins.MatchObjClass, query.PolicyQuery): - - """ - Query MLS rules. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - ruletype The list of rule type(s) to match. - source The name of the source type/attribute to match. - source_regex If true, regular expression matching will - be used on the source type/attribute. - target The name of the target type/attribute to match. - target_regex If true, regular expression matching will - be used on the target type/attribute. - tclass The object class(es) to match. - tclass_regex If true, use a regular expression for - matching the rule's object class. - """ - - ruletype = RuletypeDescriptor("validate_mls_ruletype") - source = CriteriaDescriptor("source_regex", "lookup_type_or_attr") - source_regex = False - target = CriteriaDescriptor("target_regex", "lookup_type_or_attr") - target_regex = False - tclass = CriteriaSetDescriptor("tclass_regex", "lookup_class") - tclass_regex = False - default = CriteriaDescriptor(lookup_function="lookup_range") - default_overlap = False - default_subset = False - default_superset = False - default_proper = False - - def results(self): - """Generator which yields all matching MLS rules.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Ruletypes: {0.ruletype}".format(self)) - self.log.debug("Source: {0.source!r}, regex: {0.source_regex}".format(self)) - self.log.debug("Target: {0.target!r}, regex: {0.target_regex}".format(self)) - self.log.debug("Class: {0.tclass!r}, regex: {0.tclass_regex}".format(self)) - self.log.debug("Default: {0.default!r}, overlap: {0.default_overlap}, " - "subset: {0.default_subset}, superset: {0.default_superset}, " - "proper: {0.default_proper}".format(self)) - - for rule in self.policy.mlsrules(): - # - # Matching on rule type - # - if self.ruletype: - if rule.ruletype not in self.ruletype: - continue - - # - # Matching on source type - # - if self.source and not self._match_regex( - rule.source, - self.source, - self.source_regex): - continue - - # - # Matching on target type - # - if self.target and not self._match_regex( - rule.target, - self.target, - self.target_regex): - continue - - # - # Matching on object class - # - if not self._match_object_class(rule): - continue - - # - # Matching on range - # - if self.default and not self._match_range( - rule.default, - self.default, - self.default_subset, - self.default_overlap, - self.default_superset, - self.default_proper): - continue - - # if we get here, we have matched all available criteria - yield rule diff --git a/lib/python2.7/site-packages/setoolsgui/setools/netifconquery.py b/lib/python2.7/site-packages/setoolsgui/setools/netifconquery.py deleted file mode 100644 index 30db977..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/netifconquery.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import compquery -from . import contextquery - - -class NetifconQuery(compquery.ComponentQuery, contextquery.ContextQuery): - - """ - Network interface context query. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The name of the network interface to match. - name_regex If true, regular expression matching will - be used for matching the name. - user The criteria to match the context's user. - user_regex If true, regular expression matching - will be used on the user. - role The criteria to match the context's role. - role_regex If true, regular expression matching - will be used on the role. - type_ The criteria to match the context's type. - type_regex If true, regular expression matching - will be used on the type. - range_ The criteria to match the context's range. - range_subset If true, the criteria will match if it is a subset - of the context's range. - range_overlap If true, the criteria will match if it overlaps - any of the context's range. - range_superset If true, the criteria will match if it is a superset - of the context's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - def results(self): - """Generator which yields all matching netifcons.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for netif in self.policy.netifcons(): - if self.name and not self._match_regex( - netif.netif, - self.name, - self.name_regex): - continue - - if not self._match_context(netif.context): - continue - - yield netif diff --git a/lib/python2.7/site-packages/setoolsgui/setools/nodeconquery.py b/lib/python2.7/site-packages/setoolsgui/setools/nodeconquery.py deleted file mode 100644 index eb21d81..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/nodeconquery.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -try: - import ipaddress -except ImportError: # pragma: no cover - pass - -import logging -from socket import AF_INET, AF_INET6 - -from . import contextquery - - -class NodeconQuery(contextquery.ContextQuery): - - """ - Query nodecon statements. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - network The IPv4/IPv6 address or IPv4/IPv6 network address - with netmask, e.g. 192.168.1.0/255.255.255.0 or - "192.168.1.0/24". - network_overlap If true, the net will match if it overlaps with - the nodecon's network instead of equality. - ip_version The IP version of the nodecon to match. (socket.AF_INET - for IPv4 or socket.AF_INET6 for IPv6) - user The criteria to match the context's user. - user_regex If true, regular expression matching - will be used on the user. - role The criteria to match the context's role. - role_regex If true, regular expression matching - will be used on the role. - type_ The criteria to match the context's type. - type_regex If true, regular expression matching - will be used on the type. - range_ The criteria to match the context's range. - range_subset If true, the criteria will match if it is a subset - of the context's range. - range_overlap If true, the criteria will match if it overlaps - any of the context's range. - range_superset If true, the criteria will match if it is a superset - of the context's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - _network = None - network_overlap = False - _ip_version = None - - @property - def ip_version(self): - return self._ip_version - - @ip_version.setter - def ip_version(self, value): - if value: - if not (value == AF_INET or value == AF_INET6): - raise ValueError( - "The address family must be {0} for IPv4 or {1} for IPv6.". - format(AF_INET, AF_INET6)) - - self._ip_version = value - else: - self._ip_version = None - - @property - def network(self): - return self._network - - @network.setter - def network(self, value): - if value: - try: - self._network = ipaddress.ip_network(value) - except NameError: # pragma: no cover - raise RuntimeError("Nodecon IP address/network functions require Python 3.3+.") - else: - self._network = None - - def results(self): - """Generator which yields all matching nodecons.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Network: {0.network!r}, overlap: {0.network_overlap}".format(self)) - self.log.debug("IP Version: {0.ip_version}".format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for nodecon in self.policy.nodecons(): - - if self.network: - try: - netmask = ipaddress.ip_address(nodecon.netmask) - except NameError: # pragma: no cover - # Should never actually hit this since the self.network - # setter raises the same exception. - raise RuntimeError("Nodecon IP address/network functions require Python 3.3+.") - - # Python 3.3's IPv6Network constructor does not support - # expanded netmasks, only CIDR numbers. Convert netmask - # into CIDR. - # This is Brian Kernighan's method for counting set bits. - # If the netmask happens to be invalid, this will - # not detect it. - CIDR = 0 - int_netmask = int(netmask) - while int_netmask: - int_netmask &= int_netmask - 1 - CIDR += 1 - - net = ipaddress.ip_network('{0}/{1}'.format(nodecon.address, CIDR)) - - if self.network_overlap: - if not self.network.overlaps(net): - continue - else: - if not net == self.network: - continue - - if self.ip_version and self.ip_version != nodecon.ip_version: - continue - - if not self._match_context(nodecon.context): - continue - - yield nodecon diff --git a/lib/python2.7/site-packages/setoolsgui/setools/objclassquery.py b/lib/python2.7/site-packages/setoolsgui/setools/objclassquery.py deleted file mode 100644 index 8f40df8..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/objclassquery.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import compquery -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor -from .policyrep.exception import NoCommon - - -class ObjClassQuery(compquery.ComponentQuery): - - """ - Query object classes. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The name of the object set to match. - name_regex If true, regular expression matching will - be used for matching the name. - common The name of the inherited common to match. - common_regex If true, regular expression matching will - be used for matching the common name. - perms The permissions to match. - perms_equal If true, only commons with permission sets - that are equal to the criteria will - match. Otherwise, any intersection - will match. - perms_regex If true, regular expression matching - will be used on the permission names instead - of set logic. - comparison will not be used. - perms_indirect If false, permissions inherited from a common - permission set not will be evaluated. Default - is true. - """ - - common = CriteriaDescriptor("common_regex", "lookup_common") - common_regex = False - perms = CriteriaSetDescriptor("perms_regex") - perms_equal = False - perms_indirect = True - perms_regex = False - - def results(self): - """Generator which yields all matching object classes.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Common: {0.common!r}, regex: {0.common_regex}".format(self)) - self.log.debug("Perms: {0.perms}, regex: {0.perms_regex}, " - "eq: {0.perms_equal}, indirect: {0.perms_indirect}".format(self)) - - for class_ in self.policy.classes(): - if not self._match_name(class_): - continue - - if self.common: - try: - if not self._match_regex( - class_.common, - self.common, - self.common_regex): - continue - except NoCommon: - continue - - if self.perms: - perms = class_.perms - - if self.perms_indirect: - try: - perms |= class_.common.perms - except NoCommon: - pass - - if not self._match_regex_or_set( - perms, - self.perms, - self.perms_equal, - self.perms_regex): - continue - - yield class_ diff --git a/lib/python2.7/site-packages/setoolsgui/setools/permmap.py b/lib/python2.7/site-packages/setoolsgui/setools/permmap.py deleted file mode 100644 index 54cd9f9..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/permmap.py +++ /dev/null @@ -1,363 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import sys -import logging -from errno import ENOENT - -from . import exception -from . import policyrep - - -class PermissionMap(object): - - """Permission Map for information flow analysis.""" - - valid_infoflow_directions = ["r", "w", "b", "n", "u"] - min_weight = 1 - max_weight = 10 - - def __init__(self, permmapfile=None): - """ - Parameter: - permmapfile The path to the permission map to load. - """ - self.log = logging.getLogger(self.__class__.__name__) - - if permmapfile: - self.load(permmapfile) - else: - for path in ["data/", sys.prefix + "/share/setools/"]: - try: - self.load(path + "perm_map") - break - except (IOError, OSError) as err: - if err.errno != ENOENT: - raise - else: - raise RuntimeError("Unable to load default permission map.") - - def load(self, permmapfile): - """ - Parameter: - permmapfile The path to the permission map to load. - """ - self.log.info("Opening permission map \"{0}\"".format(permmapfile)) - - # state machine - # 1 = read number of classes - # 2 = read class name and number of perms - # 3 = read perms - with open(permmapfile, "r") as mapfile: - class_count = 0 - num_classes = 0 - state = 1 - - self.permmap = dict() - - for line_num, line in enumerate(mapfile, start=1): - entry = line.split() - - if len(entry) == 0 or entry[0][0] == '#': - continue - - if state == 1: - try: - num_classes = int(entry[0]) - except ValueError: - raise exception.PermissionMapParseError( - "{0}:{1}:Invalid number of classes: {2}". - format(permmapfile, line_num, entry[0])) - - if num_classes < 1: - raise exception.PermissionMapParseError( - "{0}:{1}:Number of classes must be positive: {2}". - format(permmapfile, line_num, entry[0])) - - state = 2 - - elif state == 2: - if len(entry) != 3 or entry[0] != "class": - raise exception.PermissionMapParseError( - "{0}:{1}:Invalid class declaration: {2}". - format(permmapfile, line_num, entry)) - - class_name = str(entry[1]) - - try: - num_perms = int(entry[2]) - except ValueError: - raise exception.PermissionMapParseError( - "{0}:{1}:Invalid number of permissions: {2}". - format(permmapfile, line_num, entry[2])) - - if num_perms < 1: - raise exception.PermissionMapParseError( - "{0}:{1}:Number of permissions must be positive: {2}". - format(permmapfile, line_num, entry[2])) - - class_count += 1 - if class_count > num_classes: - raise exception.PermissionMapParseError( - "{0}:{1}:Extra class found: {2}". - format(permmapfile, line_num, class_name)) - - self.permmap[class_name] = dict() - perm_count = 0 - state = 3 - - elif state == 3: - perm_name = str(entry[0]) - - flow_direction = str(entry[1]) - if flow_direction not in self.valid_infoflow_directions: - raise exception.PermissionMapParseError( - "{0}:{1}:Invalid information flow direction: {2}". - format(permmapfile, line_num, entry[1])) - - try: - weight = int(entry[2]) - except ValueError: - raise exception.PermissionMapParseError( - "{0}:{1}:Invalid permission weight: {2}". - format(permmapfile, line_num, entry[2])) - - if not self.min_weight <= weight <= self.max_weight: - raise exception.PermissionMapParseError( - "{0}:{1}:Permission weight must be {3}-{4}: {2}". - format(permmapfile, line_num, entry[2], - self.min_weight, self.max_weight)) - - self.permmap[class_name][perm_name] = {'direction': flow_direction, - 'weight': weight, - 'enabled': True} - - perm_count += 1 - if perm_count >= num_perms: - state = 2 - - def exclude_class(self, class_): - """ - Exclude all permissions in an object class for calculating rule weights. - - Parameter: - class_ The object class to exclude. - - Exceptions: - UnmappedClass The specified object class is not mapped. - """ - - classname = str(class_) - - try: - for perm in self.permmap[classname]: - self.permmap[classname][perm]['enabled'] = False - except KeyError: - raise exception.UnmappedClass("{0} is not mapped.".format(classname)) - - def exclude_permission(self, class_, permission): - """ - Exclude a permission for calculating rule weights. - - Parameter: - class_ The object class of the permission. - permission The permission name to exclude. - - Exceptions: - UnmappedClass The specified object class is not mapped. - UnmappedPermission The specified permission is not mapped for the object class. - """ - classname = str(class_) - - if classname not in self.permmap: - raise exception.UnmappedClass("{0} is not mapped.".format(classname)) - - try: - self.permmap[classname][permission]['enabled'] = False - except KeyError: - raise exception.UnmappedPermission("{0}:{1} is not mapped.". - format(classname, permission)) - - def include_class(self, class_): - """ - Include all permissions in an object class for calculating rule weights. - - Parameter: - class_ The object class to include. - - Exceptions: - UnmappedClass The specified object class is not mapped. - """ - - classname = str(class_) - - try: - for perm in self.permmap[classname]: - self.permmap[classname][perm]['enabled'] = True - except KeyError: - raise exception.UnmappedClass("{0} is not mapped.".format(classname)) - - def include_permission(self, class_, permission): - """ - Include a permission for calculating rule weights. - - Parameter: - class_ The object class of the permission. - permission The permission name to include. - - Exceptions: - UnmappedClass The specified object class is not mapped. - UnmappedPermission The specified permission is not mapped for the object class. - """ - - classname = str(class_) - - if classname not in self.permmap: - raise exception.UnmappedClass("{0} is not mapped.".format(classname)) - - try: - self.permmap[classname][permission]['enabled'] = True - except KeyError: - raise exception.UnmappedPermission("{0}:{1} is not mapped.". - format(classname, permission)) - - def map_policy(self, policy): - """Create mappings for all classes and permissions in the specified policy.""" - for class_ in policy.classes(): - class_name = str(class_) - - if class_name not in self.permmap: - self.log.info("Adding unmapped class {0} from {1}".format(class_name, policy)) - self.permmap[class_name] = dict() - - perms = class_.perms - - try: - perms |= class_.common.perms - except policyrep.exception.NoCommon: - pass - - for perm_name in perms: - if perm_name not in self.permmap[class_name]: - self.log.info("Adding unmapped permission {0} in {1} from {2}". - format(perm_name, class_name, policy)) - self.permmap[class_name][perm_name] = {'direction': 'u', - 'weight': 1, - 'enabled': True} - - def rule_weight(self, rule): - """ - Get the type enforcement rule's information flow read and write weights. - - Parameter: - rule A type enforcement rule. - - Return: Tuple(read_weight, write_weight) - read_weight The type enforcement rule's read weight. - write_weight The type enforcement rule's write weight. - """ - - write_weight = 0 - read_weight = 0 - class_name = str(rule.tclass) - - if rule.ruletype != 'allow': - raise exception.RuleTypeError("{0} rules cannot be used for calculating a weight". - format(rule.ruletype)) - - if class_name not in self.permmap: - raise exception.UnmappedClass("{0} is not mapped.".format(class_name)) - - # iterate over the permissions and determine the - # weight of the rule in each direction. The result - # is the largest-weight permission in each direction - for perm_name in rule.perms: - try: - mapping = self.permmap[class_name][perm_name] - except KeyError: - raise exception.UnmappedPermission("{0}:{1} is not mapped.". - format(class_name, perm_name)) - - if not mapping['enabled']: - continue - - if mapping['direction'] == "r": - read_weight = max(read_weight, mapping['weight']) - elif mapping['direction'] == "w": - write_weight = max(write_weight, mapping['weight']) - elif mapping['direction'] == "b": - read_weight = max(read_weight, mapping['weight']) - write_weight = max(write_weight, mapping['weight']) - - return (read_weight, write_weight) - - def set_direction(self, class_, permission, direction): - """ - Set the information flow direction of a permission. - - Parameter: - class_ The object class of the permission. - permission The permission name. - direction The information flow direction the permission (r/w/b/n). - - Exceptions: - UnmappedClass The specified object class is not mapped. - UnmappedPermission The specified permission is not mapped for the object class. - """ - - if direction not in self.valid_infoflow_directions: - raise ValueError("Invalid information flow direction: {0}".format(direction)) - - classname = str(class_) - - if classname not in self.permmap: - raise exception.UnmappedClass("{0} is not mapped.".format(classname)) - - try: - self.permmap[classname][permission]['direction'] = direction - except KeyError: - raise exception.UnmappedPermission("{0}:{1} is not mapped.". - format(classname, permission)) - - def set_weight(self, class_, permission, weight): - """ - Set the weight of a permission. - - Parameter: - class_ The object class of the permission. - permission The permission name. - weight The weight of the permission (1-10). - - Exceptions: - UnmappedClass The specified object class is not mapped. - UnmappedPermission The specified permission is not mapped for the object class. - """ - - if not self.min_weight <= weight <= self.max_weight: - raise ValueError("Permission weights must be 1-10: {0}".format(weight)) - - classname = str(class_) - - if classname not in self.permmap: - raise exception.UnmappedClass("{0} is not mapped.".format(classname)) - - try: - self.permmap[classname][permission]['weight'] = weight - except KeyError: - raise exception.UnmappedPermission("{0}:{1} is not mapped.". - format(classname, permission)) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/polcapquery.py b/lib/python2.7/site-packages/setoolsgui/setools/polcapquery.py deleted file mode 100644 index e024b05..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/polcapquery.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import compquery - - -class PolCapQuery(compquery.ComponentQuery): - - """ - Query SELinux policy capabilities - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The name of the policy capability to match. - name_regex If true, regular expression matching will - be used for matching the name. - """ - - def results(self): - """Generator which yields all matching policy capabilities.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - - for cap in self.policy.polcaps(): - if not self._match_name(cap): - continue - - yield cap diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/__init__.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/__init__.py deleted file mode 100644 index b03e524..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/__init__.py +++ /dev/null @@ -1,568 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -# pylint: disable=too-many-public-methods -# -# Create a Python representation of the policy. -# The idea is that this is module provides convenient -# abstractions and methods for accessing the policy -# structures. -import logging -from itertools import chain -from errno import ENOENT - -try: - import selinux -except ImportError: - pass - -from . import qpol - -# The libqpol SWIG class is not quite natural for -# Python the policy is repeatedly referenced in the -# function calls, which makes sense for C code -# but not for python code, so each object keeps -# a reference to the policy for internal use. -# This also makes sense since an object would only -# be valid for the policy it comes from. - -# Exceptions -from . import exception - -# Components -from . import boolcond -from . import default -from . import mls -from . import objclass -from . import polcap -from . import role -from . import typeattr -from . import user - -# Rules -from . import mlsrule -from . import rbacrule -from . import terule - -# Constraints -from . import constraint - -# In-policy Labeling -from . import fscontext -from . import initsid -from . import netcontext - - -class SELinuxPolicy(object): - - """The complete SELinux policy.""" - - def __init__(self, policyfile=None): - """ - Parameter: - policyfile Path to a policy to open. - """ - - self.log = logging.getLogger(self.__class__.__name__) - self.policy = None - self.filename = None - - if policyfile: - self._load_policy(policyfile) - else: - try: - self._load_running_policy() - except NameError: - raise RuntimeError("Loading the running policy requires libselinux Python bindings") - - def __repr__(self): - return "<SELinuxPolicy(\"{0}\")>".format(self.filename) - - def __str__(self): - return self.filename - - def __deepcopy__(self, memo): - # shallow copy as all of the members are immutable - newobj = SELinuxPolicy.__new__(SELinuxPolicy) - newobj.policy = self.policy - newobj.filename = self.filename - memo[id(self)] = newobj - return newobj - - # - # Policy loading functions - # - - def _load_policy(self, filename): - """Load the specified policy.""" - self.log.info("Opening SELinux policy \"{0}\"".format(filename)) - - try: - self.policy = qpol.qpol_policy_factory(str(filename)) - except SyntaxError as err: - raise exception.InvalidPolicy("Error opening policy file \"{0}\": {1}". - format(filename, err)) - - self.log.info("Successfully opened SELinux policy \"{0}\"".format(filename)) - self.filename = filename - - @staticmethod - def _potential_policies(): - """Generate a list of potential policies to use.""" - # Start with binary policies in the standard location - base_policy_path = selinux.selinux_binary_policy_path() - for version in range(qpol.QPOL_POLICY_MAX_VERSION, qpol.QPOL_POLICY_MIN_VERSION-1, -1): - yield "{0}.{1}".format(base_policy_path, version) - - # Last chance, try selinuxfs. This is not first, to avoid - # holding kernel memory for a long time - if selinux.selinuxfs_exists(): - yield selinux.selinux_current_policy_path() - - def _load_running_policy(self): - """Try to load the current running policy.""" - self.log.info("Attempting to locate current running policy.") - - for filename in self._potential_policies(): - try: - self._load_policy(filename) - except OSError as err: - if err.errno != ENOENT: - raise - else: - break - else: - raise RuntimeError("Unable to locate an SELinux policy to load.") - - # - # Policy properties - # - @property - def handle_unknown(self): - """The handle unknown permissions setting (allow,deny,reject)""" - return self.policy.handle_unknown() - - @property - def mls(self): - """(T/F) The policy has MLS enabled.""" - return mls.enabled(self.policy) - - @property - def version(self): - """The policy database version (e.g. v29)""" - return self.policy.version() - - # - # Policy statistics - # - - @property - def allow_count(self): - """The number of (type) allow rules.""" - return self.policy.avrule_allow_count() - - @property - def auditallow_count(self): - """The number of auditallow rules.""" - return self.policy.avrule_auditallow_count() - - @property - def boolean_count(self): - """The number of Booleans.""" - return self.policy.bool_count() - - @property - def category_count(self): - """The number of categories.""" - return sum(1 for _ in self.categories()) - - @property - def class_count(self): - """The number of object classes.""" - return self.policy.class_count() - - @property - def common_count(self): - """The number of common permission sets.""" - return self.policy.common_count() - - @property - def conditional_count(self): - """The number of conditionals.""" - return self.policy.cond_count() - - @property - def constraint_count(self): - """The number of standard constraints.""" - return sum(1 for c in self.constraints() if c.ruletype == "constrain") - - @property - def dontaudit_count(self): - """The number of dontaudit rules.""" - return self.policy.avrule_dontaudit_count() - - @property - def fs_use_count(self): - """fs_use_* statements.""" - return self.policy.fs_use_count() - - @property - def genfscon_count(self): - """The number of genfscon statements.""" - return self.policy.genfscon_count() - - @property - def initialsids_count(self): - """The number of initial sid statements.""" - return self.policy.isid_count() - - @property - def level_count(self): - """The number of levels.""" - return sum(1 for _ in self.levels()) - - @property - def mlsconstraint_count(self): - """The number of MLS constraints.""" - return sum(1 for c in self.constraints() if c.ruletype == "mlsconstrain") - - @property - def mlsvalidatetrans_count(self): - """The number of MLS validatetrans.""" - return sum(1 for v in self.constraints() if v.ruletype == "mlsvalidatetrans") - - @property - def netifcon_count(self): - """The number of netifcon statements.""" - return self.policy.netifcon_count() - - @property - def neverallow_count(self): - """The number of neverallow rules.""" - return self.policy.avrule_neverallow_count() - - @property - def nodecon_count(self): - """The number of nodecon statements.""" - return self.policy.nodecon_count() - - @property - def permission_count(self): - """The number of permissions.""" - return sum(len(c.perms) for c in chain(self.commons(), self.classes())) - - @property - def permissives_count(self): - """The number of permissive types.""" - return self.policy.permissive_count() - - @property - def polcap_count(self): - """The number of policy capabilities.""" - return self.policy.polcap_count() - - @property - def portcon_count(self): - """The number of portcon statements.""" - return self.policy.portcon_count() - - @property - def range_transition_count(self): - """The number of range_transition rules.""" - return self.policy.range_trans_count() - - @property - def role_count(self): - """The number of roles.""" - return self.policy.role_count() - - @property - def role_allow_count(self): - """The number of (role) allow rules.""" - return self.policy.role_allow_count() - - @property - def role_transition_count(self): - """The number of role_transition rules.""" - return self.policy.role_trans_count() - - @property - def type_attribute_count(self): - """The number of (type) attributes.""" - return sum(1 for _ in self.typeattributes()) - - @property - def type_count(self): - """The number of types.""" - return sum(1 for _ in self.types()) - - @property - def type_change_count(self): - """The number of type_change rules.""" - return self.policy.terule_change_count() - - @property - def type_member_count(self): - """The number of type_member rules.""" - return self.policy.terule_member_count() - - @property - def type_transition_count(self): - """The number of type_transition rules.""" - return self.policy.terule_trans_count() + self.policy.filename_trans_count() - - @property - def user_count(self): - """The number of users.""" - return self.policy.user_count() - - @property - def validatetrans_count(self): - """The number of validatetrans.""" - return sum(1 for v in self.constraints() if v.ruletype == "validatetrans") - - # - # Policy components lookup functions - # - def lookup_boolean(self, name): - """Look up a Boolean.""" - return boolcond.boolean_factory(self.policy, name) - - def lookup_class(self, name): - """Look up an object class.""" - return objclass.class_factory(self.policy, name) - - def lookup_common(self, name): - """Look up a common permission set.""" - return objclass.common_factory(self.policy, name) - - def lookup_initialsid(self, name): - """Look up an initial sid.""" - return initsid.initialsid_factory(self.policy, name) - - def lookup_level(self, level): - """Look up a MLS level.""" - return mls.level_factory(self.policy, level) - - def lookup_sensitivity(self, name): - """Look up a MLS sensitivity by name.""" - return mls.sensitivity_factory(self.policy, name) - - def lookup_range(self, range_): - """Look up a MLS range.""" - return mls.range_factory(self.policy, range_) - - def lookup_role(self, name): - """Look up a role by name.""" - return role.role_factory(self.policy, name) - - def lookup_type(self, name): - """Look up a type by name.""" - return typeattr.type_factory(self.policy, name, deref=True) - - def lookup_type_or_attr(self, name): - """Look up a type or type attribute by name.""" - return typeattr.type_or_attr_factory(self.policy, name, deref=True) - - def lookup_typeattr(self, name): - """Look up a type attribute by name.""" - return typeattr.attribute_factory(self.policy, name) - - def lookup_user(self, name): - """Look up a user by name.""" - return user.user_factory(self.policy, name) - - # - # Policy components generators - # - - def bools(self): - """Generator which yields all Booleans.""" - for bool_ in self.policy.bool_iter(): - yield boolcond.boolean_factory(self.policy, bool_) - - def categories(self): - """Generator which yields all MLS categories.""" - for cat in self.policy.cat_iter(): - try: - yield mls.category_factory(self.policy, cat) - except TypeError: - # libqpol unfortunately iterates over aliases too - pass - - def classes(self): - """Generator which yields all object classes.""" - for class_ in self.policy.class_iter(): - yield objclass.class_factory(self.policy, class_) - - def commons(self): - """Generator which yields all commons.""" - for common in self.policy.common_iter(): - yield objclass.common_factory(self.policy, common) - - def defaults(self): - """Generator which yields all default_* statements.""" - for default_ in self.policy.default_iter(): - try: - for default_obj in default.default_factory(self.policy, default_): - yield default_obj - except exception.NoDefaults: - # qpol iterates over all classes. Handle case - # where a class has no default_* settings. - pass - - def levels(self): - """Generator which yields all level declarations.""" - for level in self.policy.level_iter(): - - try: - yield mls.level_decl_factory(self.policy, level) - except TypeError: - # libqpol unfortunately iterates over levels and sens aliases - pass - - def polcaps(self): - """Generator which yields all policy capabilities.""" - for cap in self.policy.polcap_iter(): - yield polcap.polcap_factory(self.policy, cap) - - def roles(self): - """Generator which yields all roles.""" - for role_ in self.policy.role_iter(): - yield role.role_factory(self.policy, role_) - - def sensitivities(self): - """Generator which yields all sensitivities.""" - # see mls.py for more info on why level_iter is used here. - for sens in self.policy.level_iter(): - try: - yield mls.sensitivity_factory(self.policy, sens) - except TypeError: - # libqpol unfortunately iterates over sens and aliases - pass - - def types(self): - """Generator which yields all types.""" - for type_ in self.policy.type_iter(): - try: - yield typeattr.type_factory(self.policy, type_) - except TypeError: - # libqpol unfortunately iterates over attributes and aliases - pass - - def typeattributes(self): - """Generator which yields all (type) attributes.""" - for type_ in self.policy.type_iter(): - try: - yield typeattr.attribute_factory(self.policy, type_) - except TypeError: - # libqpol unfortunately iterates over attributes and aliases - pass - - def users(self): - """Generator which yields all users.""" - for user_ in self.policy.user_iter(): - yield user.user_factory(self.policy, user_) - - # - # Policy rules generators - # - def mlsrules(self): - """Generator which yields all MLS rules.""" - for rule in self.policy.range_trans_iter(): - yield mlsrule.mls_rule_factory(self.policy, rule) - - def rbacrules(self): - """Generator which yields all RBAC rules.""" - for rule in chain(self.policy.role_allow_iter(), - self.policy.role_trans_iter()): - yield rbacrule.rbac_rule_factory(self.policy, rule) - - def terules(self): - """Generator which yields all type enforcement rules.""" - for rule in chain(self.policy.avrule_iter(), - self.policy.terule_iter(), - self.policy.filename_trans_iter()): - yield terule.te_rule_factory(self.policy, rule) - - # - # Policy rule type validators - # - @staticmethod - def validate_constraint_ruletype(types): - """Validate constraint types.""" - constraint.validate_ruletype(types) - - @staticmethod - def validate_mls_ruletype(types): - """Validate MLS rule types.""" - mlsrule.validate_ruletype(types) - - @staticmethod - def validate_rbac_ruletype(types): - """Validate RBAC rule types.""" - rbacrule.validate_ruletype(types) - - @staticmethod - def validate_te_ruletype(types): - """Validate type enforcement rule types.""" - terule.validate_ruletype(types) - - # - # Constraints generators - # - - def constraints(self): - """Generator which yields all constraints (regular and MLS).""" - for constraint_ in chain(self.policy.constraint_iter(), - self.policy.validatetrans_iter()): - - yield constraint.constraint_factory(self.policy, constraint_) - - # - # In-policy Labeling statement generators - # - def fs_uses(self): - """Generator which yields all fs_use_* statements.""" - for fs_use in self.policy.fs_use_iter(): - yield fscontext.fs_use_factory(self.policy, fs_use) - - def genfscons(self): - """Generator which yields all genfscon statements.""" - for fscon in self.policy.genfscon_iter(): - yield fscontext.genfscon_factory(self.policy, fscon) - - def initialsids(self): - """Generator which yields all initial SID statements.""" - for sid in self.policy.isid_iter(): - yield initsid.initialsid_factory(self.policy, sid) - - def netifcons(self): - """Generator which yields all netifcon statements.""" - for ifcon in self.policy.netifcon_iter(): - yield netcontext.netifcon_factory(self.policy, ifcon) - - def nodecons(self): - """Generator which yields all nodecon statements.""" - for node in self.policy.nodecon_iter(): - yield netcontext.nodecon_factory(self.policy, node) - - def portcons(self): - """Generator which yields all portcon statements.""" - for port in self.policy.portcon_iter(): - yield netcontext.portcon_factory(self.policy, port) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/_qpol.so b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/_qpol.so Binary files differdeleted file mode 100755 index aaccf28..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/_qpol.so +++ /dev/null diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/boolcond.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/boolcond.py deleted file mode 100644 index c3c0608..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/boolcond.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import symbol - - -def boolean_factory(policy, name): - """Factory function for creating Boolean statement objects.""" - - if isinstance(name, Boolean): - assert name.policy == policy - return name - elif isinstance(name, qpol.qpol_bool_t): - return Boolean(policy, name) - - try: - return Boolean(policy, qpol.qpol_bool_t(policy, str(name))) - except ValueError: - raise exception.InvalidBoolean("{0} is not a valid Boolean".format(name)) - - -def condexpr_factory(policy, name): - """Factory function for creating conditional expression objects.""" - - if not isinstance(name, qpol.qpol_cond_t): - raise TypeError("Conditional expressions cannot be looked up.") - - return ConditionalExpr(policy, name) - - -class Boolean(symbol.PolicySymbol): - - """A Boolean.""" - - @property - def state(self): - """The default state of the Boolean.""" - return bool(self.qpol_symbol.state(self.policy)) - - def statement(self): - """The policy statement.""" - return "bool {0} {1};".format(self, str(self.state).lower()) - - -class ConditionalExpr(symbol.PolicySymbol): - - """A conditional policy expression.""" - - _cond_expr_val_to_text = { - qpol.QPOL_COND_EXPR_NOT: "!", - qpol.QPOL_COND_EXPR_OR: "||", - qpol.QPOL_COND_EXPR_AND: "&&", - qpol.QPOL_COND_EXPR_XOR: "^", - qpol.QPOL_COND_EXPR_EQ: "==", - qpol.QPOL_COND_EXPR_NEQ: "!="} - - _cond_expr_val_to_precedence = { - qpol.QPOL_COND_EXPR_NOT: 5, - qpol.QPOL_COND_EXPR_OR: 1, - qpol.QPOL_COND_EXPR_AND: 3, - qpol.QPOL_COND_EXPR_XOR: 2, - qpol.QPOL_COND_EXPR_EQ: 4, - qpol.QPOL_COND_EXPR_NEQ: 4} - - def __contains__(self, other): - for expr_node in self.qpol_symbol.expr_node_iter(self.policy): - expr_node_type = expr_node.expr_type(self.policy) - - if expr_node_type == qpol.QPOL_COND_EXPR_BOOL and other == \ - boolean_factory(self.policy, expr_node.get_boolean(self.policy)): - return True - - return False - - def __str__(self): - # qpol representation is in postfix notation. This code - # converts it to infix notation. Parentheses are added - # to ensure correct expressions, though they may end up - # being overused. Set previous operator at start to the - # highest precedence (NOT) so if there is a single binary - # operator, no parentheses are output - stack = [] - prev_op_precedence = self._cond_expr_val_to_precedence[qpol.QPOL_COND_EXPR_NOT] - for expr_node in self.qpol_symbol.expr_node_iter(self.policy): - expr_node_type = expr_node.expr_type(self.policy) - - if expr_node_type == qpol.QPOL_COND_EXPR_BOOL: - # append the boolean name - nodebool = boolean_factory( - self.policy, expr_node.get_boolean(self.policy)) - stack.append(str(nodebool)) - elif expr_node_type == qpol.QPOL_COND_EXPR_NOT: # unary operator - operand = stack.pop() - operator = self._cond_expr_val_to_text[expr_node_type] - op_precedence = self._cond_expr_val_to_precedence[expr_node_type] - - # NOT is the highest precedence, so only need - # parentheses if the operand is a subexpression - if isinstance(operand, list): - subexpr = [operator, "(", operand, ")"] - else: - subexpr = [operator, operand] - - stack.append(subexpr) - prev_op_precedence = op_precedence - else: - operand1 = stack.pop() - operand2 = stack.pop() - operator = self._cond_expr_val_to_text[expr_node_type] - op_precedence = self._cond_expr_val_to_precedence[expr_node_type] - - if prev_op_precedence > op_precedence: - # if previous operator is of higher precedence - # no parentheses are needed. - subexpr = [operand1, operator, operand2] - else: - subexpr = ["(", operand1, operator, operand2, ")"] - - stack.append(subexpr) - prev_op_precedence = op_precedence - - return self.__unwind_subexpression(stack) - - def __unwind_subexpression(self, expr): - ret = [] - - # do a string.join on sublists (subexpressions) - for i in expr: - if isinstance(i, list): - ret.append(self.__unwind_subexpression(i)) - else: - ret.append(i) - - return ' '.join(ret) - - @property - def booleans(self): - """The set of Booleans in the expression.""" - bools = set() - - for expr_node in self.qpol_symbol.expr_node_iter(self.policy): - expr_node_type = expr_node.expr_type(self.policy) - - if expr_node_type == qpol.QPOL_COND_EXPR_BOOL: - bools.add(boolean_factory(self.policy, expr_node.get_boolean(self.policy))) - - return bools - - def statement(self): - raise exception.NoStatement diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/constraint.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/constraint.py deleted file mode 100644 index 9994c5b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/constraint.py +++ /dev/null @@ -1,297 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import role -from . import symbol -from . import objclass -from . import typeattr -from . import user - - -def _is_mls(policy, sym): - """Determine if this is a regular or MLS constraint/validatetrans.""" - # this can only be determined by inspecting the expression. - for expr_node in sym.expr_iter(policy): - sym_type = expr_node.sym_type(policy) - expr_type = expr_node.expr_type(policy) - - if expr_type == qpol.QPOL_CEXPR_TYPE_ATTR and sym_type >= qpol.QPOL_CEXPR_SYM_L1L2: - return True - - return False - - -def validate_ruletype(types): - """Validate constraint rule types.""" - for t in types: - if t not in ["constrain", "mlsconstrain", "validatetrans", "mlsvalidatetrans"]: - raise exception.InvalidConstraintType("{0} is not a valid constraint type.".format(t)) - - -def constraint_factory(policy, sym): - """Factory function for creating constraint objects.""" - - try: - if _is_mls(policy, sym): - if isinstance(sym, qpol.qpol_constraint_t): - return Constraint(policy, sym, "mlsconstrain") - else: - return Validatetrans(policy, sym, "mlsvalidatetrans") - else: - if isinstance(sym, qpol.qpol_constraint_t): - return Constraint(policy, sym, "constrain") - else: - return Validatetrans(policy, sym, "validatetrans") - - except AttributeError: - raise TypeError("Constraints cannot be looked-up.") - - -class BaseConstraint(symbol.PolicySymbol): - - """Base class for constraint rules.""" - - _expr_type_to_text = { - qpol.QPOL_CEXPR_TYPE_NOT: "not", - qpol.QPOL_CEXPR_TYPE_AND: "and", - qpol.QPOL_CEXPR_TYPE_OR: "\n\tor"} - - _expr_op_to_text = { - qpol.QPOL_CEXPR_OP_EQ: "==", - qpol.QPOL_CEXPR_OP_NEQ: "!=", - qpol.QPOL_CEXPR_OP_DOM: "dom", - qpol.QPOL_CEXPR_OP_DOMBY: "domby", - qpol.QPOL_CEXPR_OP_INCOMP: "incomp"} - - _sym_to_text = { - qpol.QPOL_CEXPR_SYM_USER: "u1", - qpol.QPOL_CEXPR_SYM_ROLE: "r1", - qpol.QPOL_CEXPR_SYM_TYPE: "t1", - qpol.QPOL_CEXPR_SYM_USER + qpol.QPOL_CEXPR_SYM_TARGET: "u2", - qpol.QPOL_CEXPR_SYM_ROLE + qpol.QPOL_CEXPR_SYM_TARGET: "r2", - qpol.QPOL_CEXPR_SYM_TYPE + qpol.QPOL_CEXPR_SYM_TARGET: "t2", - qpol.QPOL_CEXPR_SYM_USER + qpol.QPOL_CEXPR_SYM_XTARGET: "u3", - qpol.QPOL_CEXPR_SYM_ROLE + qpol.QPOL_CEXPR_SYM_XTARGET: "r3", - qpol.QPOL_CEXPR_SYM_TYPE + qpol.QPOL_CEXPR_SYM_XTARGET: "t3", - qpol.QPOL_CEXPR_SYM_L1L2: "l1", - qpol.QPOL_CEXPR_SYM_L1H2: "l1", - qpol.QPOL_CEXPR_SYM_H1L2: "h1", - qpol.QPOL_CEXPR_SYM_H1H2: "h1", - qpol.QPOL_CEXPR_SYM_L1H1: "l1", - qpol.QPOL_CEXPR_SYM_L2H2: "l2", - qpol.QPOL_CEXPR_SYM_L1L2 + qpol.QPOL_CEXPR_SYM_TARGET: "l2", - qpol.QPOL_CEXPR_SYM_L1H2 + qpol.QPOL_CEXPR_SYM_TARGET: "h2", - qpol.QPOL_CEXPR_SYM_H1L2 + qpol.QPOL_CEXPR_SYM_TARGET: "l2", - qpol.QPOL_CEXPR_SYM_H1H2 + qpol.QPOL_CEXPR_SYM_TARGET: "h2", - qpol.QPOL_CEXPR_SYM_L1H1 + qpol.QPOL_CEXPR_SYM_TARGET: "h1", - qpol.QPOL_CEXPR_SYM_L2H2 + qpol.QPOL_CEXPR_SYM_TARGET: "h2"} - - # Boolean operators - _expr_type_to_precedence = { - qpol.QPOL_CEXPR_TYPE_NOT: 3, - qpol.QPOL_CEXPR_TYPE_AND: 2, - qpol.QPOL_CEXPR_TYPE_OR: 1} - - # Logical operators have the same precedence - _logical_op_precedence = 4 - - def __init__(self, policy, qpol_symbol, ruletype): - symbol.PolicySymbol.__init__(self, policy, qpol_symbol) - self.ruletype = ruletype - - def __str__(self): - raise NotImplementedError - - def _build_expression(self): - # qpol representation is in postfix notation. This code - # converts it to infix notation. Parentheses are added - # to ensure correct expressions, though they may end up - # being overused. Set previous operator at start to the - # highest precedence (op) so if there is a single binary - # operator, no parentheses are output - - stack = [] - prev_op_precedence = self._logical_op_precedence - for expr_node in self.qpol_symbol.expr_iter(self.policy): - op = expr_node.op(self.policy) - sym_type = expr_node.sym_type(self.policy) - expr_type = expr_node.expr_type(self.policy) - - if expr_type == qpol.QPOL_CEXPR_TYPE_ATTR: - # logical operator with symbol (e.g. u1 == u2) - operand1 = self._sym_to_text[sym_type] - operand2 = self._sym_to_text[sym_type + qpol.QPOL_CEXPR_SYM_TARGET] - operator = self._expr_op_to_text[op] - - stack.append([operand1, operator, operand2]) - - prev_op_precedence = self._logical_op_precedence - elif expr_type == qpol.QPOL_CEXPR_TYPE_NAMES: - # logical operator with type or attribute list (e.g. t1 == { spam_t eggs_t }) - operand1 = self._sym_to_text[sym_type] - operator = self._expr_op_to_text[op] - - names = list(expr_node.names_iter(self.policy)) - - if not names: - operand2 = "<empty set>" - elif len(names) == 1: - operand2 = names[0] - else: - operand2 = "{{ {0} }}".format(' '.join(names)) - - stack.append([operand1, operator, operand2]) - - prev_op_precedence = self._logical_op_precedence - elif expr_type == qpol.QPOL_CEXPR_TYPE_NOT: - # unary operator (not) - operand = stack.pop() - operator = self._expr_type_to_text[expr_type] - - stack.append([operator, "(", operand, ")"]) - - prev_op_precedence = self._expr_type_to_precedence[expr_type] - else: - # binary operator (and/or) - operand1 = stack.pop() - operand2 = stack.pop() - operator = self._expr_type_to_text[expr_type] - op_precedence = self._expr_type_to_precedence[expr_type] - - # if previous operator is of higher precedence - # no parentheses are needed. - if op_precedence < prev_op_precedence: - stack.append([operand1, operator, operand2]) - else: - stack.append(["(", operand1, operator, operand2, ")"]) - - prev_op_precedence = op_precedence - - return self.__unwind_subexpression(stack) - - def _get_symbols(self, syms, factory): - """ - Internal generator for getting users/roles/types in a constraint - expression. Symbols will be yielded multiple times if they appear - in the expression multiple times. - - Parameters: - syms List of qpol symbol types. - factory The factory function related to these symbols. - """ - for expr_node in self.qpol_symbol.expr_iter(self.policy): - sym_type = expr_node.sym_type(self.policy) - expr_type = expr_node.expr_type(self.policy) - - if expr_type == qpol.QPOL_CEXPR_TYPE_NAMES and sym_type in syms: - for s in expr_node.names_iter(self.policy): - yield factory(self.policy, s) - - def __unwind_subexpression(self, expr): - ret = [] - - # do a string.join on sublists (subexpressions) - for i in expr: - if isinstance(i, list): - ret.append(self.__unwind_subexpression(i)) - else: - ret.append(i) - - return ' '.join(ret) - - # There is no levels function as specific - # levels cannot be used in expressions, only - # the l1, h1, etc. symbols - - @property - def roles(self): - """The roles used in the expression.""" - role_syms = [qpol.QPOL_CEXPR_SYM_ROLE, - qpol.QPOL_CEXPR_SYM_ROLE + qpol.QPOL_CEXPR_SYM_TARGET, - qpol.QPOL_CEXPR_SYM_ROLE + qpol.QPOL_CEXPR_SYM_XTARGET] - - return set(self._get_symbols(role_syms, role.role_factory)) - - @property - def perms(self): - raise NotImplementedError - - def statement(self): - return str(self) - - @property - def tclass(self): - """Object class for this constraint.""" - return objclass.class_factory(self.policy, self.qpol_symbol.object_class(self.policy)) - - @property - def types(self): - """The types and type attributes used in the expression.""" - type_syms = [qpol.QPOL_CEXPR_SYM_TYPE, - qpol.QPOL_CEXPR_SYM_TYPE + qpol.QPOL_CEXPR_SYM_TARGET, - qpol.QPOL_CEXPR_SYM_TYPE + qpol.QPOL_CEXPR_SYM_XTARGET] - - return set(self._get_symbols(type_syms, typeattr.type_or_attr_factory)) - - @property - def users(self): - """The users used in the expression.""" - user_syms = [qpol.QPOL_CEXPR_SYM_USER, - qpol.QPOL_CEXPR_SYM_USER + qpol.QPOL_CEXPR_SYM_TARGET, - qpol.QPOL_CEXPR_SYM_USER + qpol.QPOL_CEXPR_SYM_XTARGET] - - return set(self._get_symbols(user_syms, user.user_factory)) - - -class Constraint(BaseConstraint): - - """A constraint rule (constrain/mlsconstrain).""" - - def __str__(self): - rule_string = "{0.ruletype} {0.tclass} ".format(self) - - perms = self.perms - if len(perms) > 1: - rule_string += "{{ {0} }} (\n".format(' '.join(perms)) - else: - # convert to list since sets cannot be indexed - rule_string += "{0} (\n".format(list(perms)[0]) - - rule_string += "\t{0}\n);".format(self._build_expression()) - - return rule_string - - @property - def perms(self): - """The constraint's permission set.""" - return set(self.qpol_symbol.perm_iter(self.policy)) - - -class Validatetrans(BaseConstraint): - - """A validatetrans rule (validatetrans/mlsvalidatetrans).""" - - def __str__(self): - return "{0.ruletype} {0.tclass}\n\t{1}\n);".format(self, self._build_expression()) - - @property - def perms(self): - raise exception.ConstraintUseError("{0} rules do not have permissions.". - format(self.ruletype)) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/context.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/context.py deleted file mode 100644 index f2f3fc7..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/context.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import symbol -from . import user -from . import role -from . import typeattr -from . import mls - - -def context_factory(policy, name): - """Factory function for creating context objects.""" - - if not isinstance(name, qpol.qpol_context_t): - raise TypeError("Contexts cannot be looked-up.") - - return Context(policy, name) - - -class Context(symbol.PolicySymbol): - - """A SELinux security context/security attribute.""" - - def __str__(self): - try: - return "{0.user}:{0.role}:{0.type_}:{0.range_}".format(self) - except exception.MLSDisabled: - return "{0.user}:{0.role}:{0.type_}".format(self) - - @property - def user(self): - """The user portion of the context.""" - return user.user_factory(self.policy, self.qpol_symbol.user(self.policy)) - - @property - def role(self): - """The role portion of the context.""" - return role.role_factory(self.policy, self.qpol_symbol.role(self.policy)) - - @property - def type_(self): - """The type portion of the context.""" - return typeattr.type_factory(self.policy, self.qpol_symbol.type_(self.policy)) - - @property - def range_(self): - """The MLS range of the context.""" - return mls.range_factory(self.policy, self.qpol_symbol.range(self.policy)) - - def statement(self): - raise exception.NoStatement diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/default.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/default.py deleted file mode 100644 index 175b709..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/default.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import symbol -from . import objclass -from . import qpol - - -def default_factory(policy, sym): - """Factory generator for creating default_* statement objects.""" - - # The low level policy groups default_* settings by object class. - # Since each class can have up to four default_* statements, - # this factory function is a generator which yields up to - # four Default objects. - - if not isinstance(sym, qpol.qpol_default_object_t): - raise NotImplementedError - - # qpol will essentially iterate over all classes - # and emit None for classes that don't set a default - if not sym.object_class(policy): - raise exception.NoDefaults - - if sym.user_default(policy): - yield UserDefault(policy, sym) - - if sym.role_default(policy): - yield RoleDefault(policy, sym) - - if sym.type_default(policy): - yield TypeDefault(policy, sym) - - if sym.range_default(policy): - yield RangeDefault(policy, sym) - - -class Default(symbol.PolicySymbol): - - """Base class for default_* statements.""" - - def __str__(self): - raise NotImplementedError - - @property - def object_class(self): - """The object class.""" - return objclass.class_factory(self.policy, self.qpol_symbol.object_class(self.policy)) - - @property - def default(self): - raise NotImplementedError - - def statement(self): - return str(self) - - -class UserDefault(Default): - - """A default_user statement.""" - - def __str__(self): - return "default_user {0.object_class} {0.default};".format(self) - - @property - def default(self): - """The default user location (source/target).""" - return self.qpol_symbol.user_default(self.policy) - - -class RoleDefault(Default): - - """A default_role statement.""" - - def __str__(self): - return "default_role {0.object_class} {0.default};".format(self) - - @property - def default(self): - """The default role location (source/target).""" - return self.qpol_symbol.role_default(self.policy) - - -class TypeDefault(Default): - - """A default_type statement.""" - - def __str__(self): - return "default_type {0.object_class} {0.default};".format(self) - - @property - def default(self): - """The default type location (source/target).""" - return self.qpol_symbol.type_default(self.policy) - - -class RangeDefault(Default): - - """A default_range statement.""" - - def __str__(self): - return "default_range {0.object_class} {0.default} {0.default_range};".format(self) - - @property - def default(self): - """The default range location (source/target).""" - return self.qpol_symbol.range_default(self.policy).split()[0] - - @property - def default_range(self): - """The default range setting (low/high/low_high).""" - return self.qpol_symbol.range_default(self.policy).split()[1] diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/exception.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/exception.py deleted file mode 100644 index ce367c0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/exception.py +++ /dev/null @@ -1,248 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from ..exception import SEToolsException - -# -# Policyrep base exception -# - - -class PolicyrepException(SEToolsException): - - """Base class for all policyrep exceptions.""" - pass - - -# -# General Policyrep exceptions -# - - -class InvalidPolicy(SyntaxError, PolicyrepException): - - """Exception for invalid policy.""" - pass - - -class MLSDisabled(PolicyrepException): - - """ - Exception when MLS is disabled. - """ - pass - - -# -# Invalid component exceptions -# -class InvalidSymbol(ValueError, PolicyrepException): - - """ - Base class for invalid symbols. Typically this is attempting to - look up an object in the policy, but it does not exist. - """ - pass - - -class InvalidBoolean(InvalidSymbol): - - """Exception for invalid Booleans.""" - pass - - -class InvalidCategory(InvalidSymbol): - - """Exception for invalid MLS categories.""" - pass - - -class InvalidClass(InvalidSymbol): - - """Exception for invalid object classes.""" - pass - - -class InvalidCommon(InvalidSymbol): - - """Exception for invalid common permission sets.""" - pass - - -class InvalidInitialSid(InvalidSymbol): - - """Exception for invalid initial sids.""" - pass - - -class InvalidLevel(InvalidSymbol): - - """ - Exception for an invalid level. - """ - pass - - -class InvalidLevelDecl(InvalidSymbol): - - """ - Exception for an invalid level declaration. - """ - pass - - -class InvalidRange(InvalidSymbol): - - """ - Exception for an invalid range. - """ - pass - - -class InvalidRole(InvalidSymbol): - - """Exception for invalid roles.""" - pass - - -class InvalidSensitivity(InvalidSymbol): - - """ - Exception for an invalid sensitivity. - """ - pass - - -class InvalidType(InvalidSymbol): - - """Exception for invalid types and attributes.""" - pass - - -class InvalidUser(InvalidSymbol): - - """Exception for invalid users.""" - pass - -# -# Rule type exceptions -# - - -class InvalidRuleType(InvalidSymbol): - - """Exception for invalid rule types.""" - pass - - -class InvalidConstraintType(InvalidSymbol): - - """Exception for invalid constraint types.""" - # This is not a rule but is similar. - pass - - -class InvalidMLSRuleType(InvalidRuleType): - - """Exception for invalid MLS rule types.""" - pass - - -class InvalidRBACRuleType(InvalidRuleType): - - """Exception for invalid RBAC rule types.""" - pass - - -class InvalidTERuleType(InvalidRuleType): - - """Exception for invalid TE rule types.""" - pass - - -# -# Object use errors -# -class SymbolUseError(PolicyrepException): - - """ - Base class for incorrectly using an object. Typically this is - for classes with strong similarities, but with slight variances in - functionality, e.g. allow vs type_transition rules. - """ - pass - - -class RuleUseError(SymbolUseError): - - """ - Base class for incorrect parameters for a rule. For - example, trying to get the permissions of a rule that has no - permissions. - """ - pass - - -class ConstraintUseError(SymbolUseError): - - """Exception when getting permissions from a validatetrans.""" - pass - - -class NoStatement(SymbolUseError): - - """ - Exception for objects that have no inherent statement, such - as conditional expressions and MLS ranges. - """ - pass - - -# -# Other exceptions -# -class NoCommon(PolicyrepException): - - """ - Exception when a class does not inherit a common permission set. - """ - pass - - -class NoDefaults(InvalidSymbol): - - """Exception for classes that have no default_* statements.""" - pass - - -class RuleNotConditional(PolicyrepException): - - """ - Exception when getting the conditional expression for rules - that are unconditional (not conditional). - """ - pass - - -class TERuleNoFilename(PolicyrepException): - - """ - Exception when getting the file name of a - type_transition rule that has no file name. - """ - pass diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/fscontext.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/fscontext.py deleted file mode 100644 index a17b0bc..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/fscontext.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import stat - -from . import qpol -from . import symbol -from . import context - - -def fs_use_factory(policy, name): - """Factory function for creating fs_use_* objects.""" - - if not isinstance(name, qpol.qpol_fs_use_t): - raise TypeError("fs_use_* cannot be looked-up.") - - return FSUse(policy, name) - - -def genfscon_factory(policy, name): - """Factory function for creating genfscon objects.""" - - if not isinstance(name, qpol.qpol_genfscon_t): - raise TypeError("Genfscons cannot be looked-up.") - - return Genfscon(policy, name) - - -class FSContext(symbol.PolicySymbol): - - """Base class for in-policy labeling rules.""" - - def __str__(self): - raise NotImplementedError - - @property - def fs(self): - """The filesystem type for this statement.""" - return self.qpol_symbol.name(self.policy) - - @property - def context(self): - """The context for this statement.""" - return context.context_factory(self.policy, self.qpol_symbol.context(self.policy)) - - def statement(self): - return str(self) - - -class Genfscon(FSContext): - - """A genfscon statement.""" - - _filetype_to_text = { - 0: "", - stat.S_IFBLK: "-b", - stat.S_IFCHR: "-c", - stat.S_IFDIR: "-d", - stat.S_IFIFO: "-p", - stat.S_IFREG: "--", - stat.S_IFLNK: "-l", - stat.S_IFSOCK: "-s"} - - def __str__(self): - return "genfscon {0.fs} {0.path} {1} {0.context}".format( - self, self._filetype_to_text[self.filetype]) - - def __eq__(self, other): - # Libqpol allocates new C objects in the - # genfscons iterator, so pointer comparison - # in the PolicySymbol object doesn't work. - try: - return (self.fs == other.fs and - self.path == other.path and - self.filetype == other.filetype and - self.context == other.context) - except AttributeError: - return str(self) == str(other) - - @property - def filetype(self): - """The file type (e.g. stat.S_IFBLK) for this genfscon statement.""" - return self.qpol_symbol.object_class(self.policy) - - @property - def path(self): - """The path for this genfscon statement.""" - return self.qpol_symbol.path(self.policy) - - -class FSUse(FSContext): - - """A fs_use_* statement.""" - - # there are more rule types, but modern SELinux - # only supports these three. - _ruletype_to_text = { - qpol.QPOL_FS_USE_XATTR: 'fs_use_xattr', - qpol.QPOL_FS_USE_TRANS: 'fs_use_trans', - qpol.QPOL_FS_USE_TASK: 'fs_use_task'} - - def __str__(self): - return "{0.ruletype} {0.fs} {0.context};".format(self) - - @property - def ruletype(self): - """The rule type for this fs_use_* statement.""" - return self._ruletype_to_text[self.qpol_symbol.behavior(self.policy)] diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/initsid.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/initsid.py deleted file mode 100644 index 0197c74..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/initsid.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import symbol -from . import context - - -def initialsid_factory(policy, name): - """Factory function for creating initial sid objects.""" - - if isinstance(name, InitialSID): - assert name.policy == policy - return name - elif isinstance(name, qpol.qpol_isid_t): - return InitialSID(policy, name) - - try: - return InitialSID(policy, qpol.qpol_isid_t(policy, name)) - except ValueError: - raise exception.InvalidInitialSid("{0} is not a valid initial sid".format(name)) - - -class InitialSID(symbol.PolicySymbol): - - """An initial SID statement.""" - - @property - def context(self): - """The context for this initial SID.""" - return context.context_factory(self.policy, self.qpol_symbol.context(self.policy)) - - def statement(self): - return "sid {0} {0.context}".format(self) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/mls.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/mls.py deleted file mode 100644 index 2541704..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/mls.py +++ /dev/null @@ -1,463 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -# pylint: disable=protected-access -import itertools - -from . import exception -from . import qpol -from . import symbol - -# qpol does not expose an equivalent of a sensitivity declaration. -# qpol_level_t is equivalent to the level declaration: -# level s0:c0.c1023; - -# qpol_mls_level_t represents a level as used in contexts, -# such as range_transitions or labeling statements such as -# portcon and nodecon. - -# Here qpol_level_t is also used for MLSSensitivity -# since it has the sensitivity name, dominance, and there -# is a 1:1 correspondence between the sensitivity declarations -# and level declarations. - -# Hashing has to be handled below because the qpol references, -# normally used for a hash key, are not the same for multiple -# instances of the same object (except for level decl). - - -def enabled(policy): - """Determine if MLS is enabled.""" - return policy.capability(qpol.QPOL_CAP_MLS) - - -def category_factory(policy, sym): - """Factory function for creating MLS category objects.""" - - if not enabled(policy): - raise exception.MLSDisabled - - if isinstance(sym, Category): - assert sym.policy == policy - return sym - elif isinstance(sym, qpol.qpol_cat_t): - if sym.isalias(policy): - raise TypeError("{0} is an alias".format(sym.name(policy))) - - return Category(policy, sym) - - try: - return Category(policy, qpol.qpol_cat_t(policy, str(sym))) - except ValueError: - raise exception.InvalidCategory("{0} is not a valid category".format(sym)) - - -def sensitivity_factory(policy, sym): - """Factory function for creating MLS sensitivity objects.""" - - if not enabled(policy): - raise exception.MLSDisabled - - if isinstance(sym, Sensitivity): - assert sym.policy == policy - return sym - elif isinstance(sym, qpol.qpol_level_t): - if sym.isalias(policy): - raise TypeError("{0} is an alias".format(sym.name(policy))) - - return Sensitivity(policy, sym) - - try: - return Sensitivity(policy, qpol.qpol_level_t(policy, str(sym))) - except ValueError: - raise exception.InvalidSensitivity("{0} is not a valid sensitivity".format(sym)) - - -def level_factory(policy, sym): - """ - Factory function for creating MLS level objects (e.g. levels used - in contexts of labeling statements) - """ - - if not enabled(policy): - raise exception.MLSDisabled - - if isinstance(sym, Level): - assert sym.policy == policy - return sym - elif isinstance(sym, qpol.qpol_mls_level_t): - return Level(policy, sym) - - sens_split = str(sym).split(":") - - sens = sens_split[0] - try: - semantic_level = qpol.qpol_semantic_level_t(policy, sens) - except ValueError: - raise exception.InvalidLevel("{0} is invalid ({1} is not a valid sensitivity)". - format(sym, sens)) - - try: - cats = sens_split[1] - except IndexError: - pass - else: - for group in cats.split(","): - catrange = group.split(".") - - if len(catrange) == 2: - try: - semantic_level.add_cats(policy, catrange[0], catrange[1]) - except ValueError: - raise exception.InvalidLevel( - "{0} is invalid ({1} is not a valid category range)".format(sym, group)) - elif len(catrange) == 1: - try: - semantic_level.add_cats(policy, catrange[0], catrange[0]) - except ValueError: - raise exception.InvalidLevel("{0} is invalid ({1} is not a valid category)". - format(sym, group)) - else: - raise exception.InvalidLevel("{0} is invalid (level parsing error)".format(sym)) - - # convert to level object - try: - policy_level = qpol.qpol_mls_level_t(policy, semantic_level) - except ValueError: - raise exception.InvalidLevel( - "{0} is invalid (one or more categories are not associated with the sensitivity)". - format(sym)) - - return Level(policy, policy_level) - - -def level_decl_factory(policy, sym): - """ - Factory function for creating MLS level declaration objects. - (level statements) Lookups are only by sensitivity name. - """ - - if not enabled(policy): - raise exception.MLSDisabled - - if isinstance(sym, LevelDecl): - assert sym.policy == policy - return sym - elif isinstance(sym, qpol.qpol_level_t): - if sym.isalias(policy): - raise TypeError("{0} is an alias".format(sym.name(policy))) - - return LevelDecl(policy, sym) - - try: - return LevelDecl(policy, qpol.qpol_level_t(policy, str(sym))) - except ValueError: - raise exception.InvalidLevelDecl("{0} is not a valid sensitivity".format(sym)) - - -def range_factory(policy, sym): - """Factory function for creating MLS range objects.""" - - if not enabled(policy): - raise exception.MLSDisabled - - if isinstance(sym, Range): - assert sym.policy == policy - return sym - elif isinstance(sym, qpol.qpol_mls_range_t): - return Range(policy, sym) - - # build range: - levels = str(sym).split("-") - - # strip() levels to handle ranges with spaces in them, - # e.g. s0:c1 - s0:c0.c255 - try: - low = level_factory(policy, levels[0].strip()) - except exception.InvalidLevel as ex: - raise exception.InvalidRange("{0} is not a valid range ({1}).".format(sym, ex)) - - try: - high = level_factory(policy, levels[1].strip()) - except exception.InvalidLevel as ex: - raise exception.InvalidRange("{0} is not a valid range ({1}).".format(sym, ex)) - except IndexError: - high = low - - # convert to range object - try: - policy_range = qpol.qpol_mls_range_t(policy, low.qpol_symbol, high.qpol_symbol) - except ValueError: - raise exception.InvalidRange("{0} is not a valid range ({1} is not dominated by {2})". - format(sym, low, high)) - - return Range(policy, policy_range) - - -class BaseMLSComponent(symbol.PolicySymbol): - - """Base class for sensitivities and categories.""" - - @property - def _value(self): - """ - The value of the component. - - This is a low-level policy detail exposed for internal use only. - """ - return self.qpol_symbol.value(self.policy) - - def aliases(self): - """Generator that yields all aliases for this category.""" - - for alias in self.qpol_symbol.alias_iter(self.policy): - yield alias - - -class Category(BaseMLSComponent): - - """An MLS category.""" - - def statement(self): - aliases = list(self.aliases()) - stmt = "category {0}".format(self) - if aliases: - if len(aliases) > 1: - stmt += " alias {{ {0} }}".format(' '.join(aliases)) - else: - stmt += " alias {0}".format(aliases[0]) - stmt += ";" - return stmt - - -class Sensitivity(BaseMLSComponent): - - """An MLS sensitivity""" - - def __eq__(self, other): - try: - return self._value == other._value - except AttributeError: - return str(self) == str(other) - - def __ge__(self, other): - return self._value >= other._value - - def __gt__(self, other): - return self._value > other._value - - def __le__(self, other): - return self._value <= other._value - - def __lt__(self, other): - return self._value < other._value - - def statement(self): - aliases = list(self.aliases()) - stmt = "sensitivity {0}".format(self) - if aliases: - if len(aliases) > 1: - stmt += " alias {{ {0} }}".format(' '.join(aliases)) - else: - stmt += " alias {0}".format(aliases[0]) - stmt += ";" - return stmt - - -class BaseMLSLevel(symbol.PolicySymbol): - - """Base class for MLS levels.""" - - def __str__(self): - lvl = str(self.sensitivity) - - # sort by policy declaration order - cats = sorted(self.categories(), key=lambda k: k._value) - - if cats: - # generate short category notation - shortlist = [] - for _, i in itertools.groupby(cats, key=lambda k, - c=itertools.count(): k._value - next(c)): - group = list(i) - if len(group) > 1: - shortlist.append("{0}.{1}".format(group[0], group[-1])) - else: - shortlist.append(str(group[0])) - - lvl += ":" + ','.join(shortlist) - - return lvl - - @property - def sensitivity(self): - raise NotImplementedError - - def categories(self): - """ - Generator that yields all individual categories for this level. - All categories are yielded, not a compact notation such as - c0.c255 - """ - - for cat in self.qpol_symbol.cat_iter(self.policy): - yield category_factory(self.policy, cat) - - -class LevelDecl(BaseMLSLevel): - - """ - The declaration statement for MLS levels, e.g: - - level s7:c0.c1023; - """ - # below comparisons are only based on sensitivity - # dominance since, in this context, the allowable - # category set is being defined for the level. - # object type is asserted here because this cannot - # be compared to a Level instance. - - def __eq__(self, other): - assert not isinstance(other, Level), "Levels cannot be compared to level declarations" - - try: - return self.sensitivity == other.sensitivity - except AttributeError: - return str(self) == str(other) - - def __ge__(self, other): - assert not isinstance(other, Level), "Levels cannot be compared to level declarations" - return self.sensitivity >= other.sensitivity - - def __gt__(self, other): - assert not isinstance(other, Level), "Levels cannot be compared to level declarations" - return self.sensitivity > other.sensitivity - - def __le__(self, other): - assert not isinstance(other, Level), "Levels cannot be compared to level declarations" - return self.sensitivity <= other.sensitivity - - def __lt__(self, other): - assert not isinstance(other, Level), "Levels cannot be compared to level declarations" - return self.sensitivity < other.sensitivity - - @property - def sensitivity(self): - """The sensitivity of the level.""" - # since the qpol symbol for levels is also used for - # MLSSensitivity objects, use self's qpol symbol - return sensitivity_factory(self.policy, self.qpol_symbol) - - def statement(self): - return "level {0};".format(self) - - -class Level(BaseMLSLevel): - - """An MLS level used in contexts.""" - - def __hash__(self): - return hash(str(self)) - - def __eq__(self, other): - try: - othercats = set(other.categories()) - except AttributeError: - return str(self) == str(other) - else: - selfcats = set(self.categories()) - return self.sensitivity == other.sensitivity and selfcats == othercats - - def __ge__(self, other): - """Dom operator.""" - selfcats = set(self.categories()) - othercats = set(other.categories()) - return self.sensitivity >= other.sensitivity and selfcats >= othercats - - def __gt__(self, other): - selfcats = set(self.categories()) - othercats = set(other.categories()) - return ((self.sensitivity > other.sensitivity and selfcats >= othercats) or - (self.sensitivity >= other.sensitivity and selfcats > othercats)) - - def __le__(self, other): - """Domby operator.""" - selfcats = set(self.categories()) - othercats = set(other.categories()) - return self.sensitivity <= other.sensitivity and selfcats <= othercats - - def __lt__(self, other): - selfcats = set(self.categories()) - othercats = set(other.categories()) - return ((self.sensitivity < other.sensitivity and selfcats <= othercats) or - (self.sensitivity <= other.sensitivity and selfcats < othercats)) - - def __xor__(self, other): - """Incomp operator.""" - return not (self >= other or self <= other) - - @property - def sensitivity(self): - """The sensitivity of the level.""" - return sensitivity_factory(self.policy, self.qpol_symbol.sens_name(self.policy)) - - def statement(self): - raise exception.NoStatement - - -class Range(symbol.PolicySymbol): - - """An MLS range""" - - def __str__(self): - high = self.high - low = self.low - if high == low: - return str(low) - - return "{0} - {1}".format(low, high) - - def __hash__(self): - return hash(str(self)) - - def __eq__(self, other): - try: - return self.low == other.low and self.high == other.high - except AttributeError: - # remove all spaces in the string representations - # to handle cases where the other object does not - # have spaces around the '-' - other_str = str(other).replace(" ", "") - self_str = str(self).replace(" ", "") - return self_str == other_str - - def __contains__(self, other): - return self.low <= other <= self.high - - @property - def high(self): - """The high end/clearance level of this range.""" - return level_factory(self.policy, self.qpol_symbol.high_level(self.policy)) - - @property - def low(self): - """The low end/current level of this range.""" - return level_factory(self.policy, self.qpol_symbol.low_level(self.policy)) - - def statement(self): - raise exception.NoStatement diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/mlsrule.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/mlsrule.py deleted file mode 100644 index 5c91c59..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/mlsrule.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import rule -from . import typeattr -from . import mls - - -def mls_rule_factory(policy, symbol): - """Factory function for creating MLS rule objects.""" - if not isinstance(symbol, qpol.qpol_range_trans_t): - raise TypeError("MLS rules cannot be looked-up.") - - return MLSRule(policy, symbol) - - -def validate_ruletype(types): - """Validate MLS rule types.""" - for t in types: - if t not in ["range_transition"]: - raise exception.InvalidMLSRuleType("{0} is not a valid MLS rule type.".format(t)) - - -class MLSRule(rule.PolicyRule): - - """An MLS rule.""" - - def __str__(self): - # TODO: If we ever get more MLS rules, fix this format. - return "range_transition {0.source} {0.target}:{0.tclass} {0.default};".format(self) - - @property - def source(self): - """The rule's source type/attribute.""" - return typeattr.type_or_attr_factory(self.policy, self.qpol_symbol.source_type(self.policy)) - - @property - def target(self): - """The rule's target type/attribute.""" - return typeattr.type_or_attr_factory(self.policy, self.qpol_symbol.target_type(self.policy)) - - @property - def default(self): - """The rule's default range.""" - return mls.range_factory(self.policy, self.qpol_symbol.range(self.policy)) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/netcontext.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/netcontext.py deleted file mode 100644 index 5aeed5c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/netcontext.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import socket -from collections import namedtuple - -from . import qpol -from . import symbol -from . import context - -port_range = namedtuple("port_range", ["low", "high"]) - - -def netifcon_factory(policy, name): - """Factory function for creating netifcon objects.""" - - if not isinstance(name, qpol.qpol_netifcon_t): - raise NotImplementedError - - return Netifcon(policy, name) - - -def nodecon_factory(policy, name): - """Factory function for creating nodecon objects.""" - - if not isinstance(name, qpol.qpol_nodecon_t): - raise NotImplementedError - - return Nodecon(policy, name) - - -def portcon_factory(policy, name): - """Factory function for creating portcon objects.""" - - if not isinstance(name, qpol.qpol_portcon_t): - raise NotImplementedError - - return Portcon(policy, name) - - -class NetContext(symbol.PolicySymbol): - - """Base class for in-policy network labeling rules.""" - - def __str__(self): - raise NotImplementedError - - @property - def context(self): - """The context for this statement.""" - return context.context_factory(self.policy, self.qpol_symbol.context(self.policy)) - - def statement(self): - return str(self) - - -class Netifcon(NetContext): - - """A netifcon statement.""" - - def __str__(self): - return "netifcon {0.netif} {0.context} {0.packet}".format(self) - - @property - def netif(self): - """The network interface name.""" - return self.qpol_symbol.name(self.policy) - - @property - def context(self): - """The context for the interface.""" - return context.context_factory(self.policy, self.qpol_symbol.if_con(self.policy)) - - @property - def packet(self): - """The context for the packets.""" - return context.context_factory(self.policy, self.qpol_symbol.msg_con(self.policy)) - - -class Nodecon(NetContext): - - """A nodecon statement.""" - - def __str__(self): - return "nodecon {0.address} {0.netmask} {0.context}".format(self) - - def __eq__(self, other): - # Libqpol allocates new C objects in the - # nodecons iterator, so pointer comparison - # in the PolicySymbol object doesn't work. - try: - return (self.address == other.address and - self.netmask == other.netmask and - self.context == other.context) - except AttributeError: - return (str(self) == str(other)) - - @property - def ip_version(self): - """ - The IP version for the nodecon (socket.AF_INET or - socket.AF_INET6). - """ - return self.qpol_symbol.protocol(self.policy) - - @property - def address(self): - """The network address for the nodecon.""" - return self.qpol_symbol.addr(self.policy) - - @property - def netmask(self): - """The network mask for the nodecon.""" - return self.qpol_symbol.mask(self.policy) - - -class Portcon(NetContext): - - """A portcon statement.""" - - _proto_to_text = {socket.IPPROTO_TCP: 'tcp', - socket.IPPROTO_UDP: 'udp'} - - def __str__(self): - low, high = self.ports - proto = self._proto_to_text[self.protocol] - - if low == high: - return "portcon {0} {1} {2}".format(proto, low, self.context) - else: - return "portcon {0} {1}-{2} {3}".format(proto, low, high, self.context) - - @property - def protocol(self): - """ - The protocol number for the portcon (socket.IPPROTO_TCP - or socket.IPPROTO_UDP). - """ - return self.qpol_symbol.protocol(self.policy) - - @property - def ports(self): - """ - The port range for this portcon. - - Return: Tuple(low, high) - low The low port of the range. - high The high port of the range. - """ - low = self.qpol_symbol.low_port(self.policy) - high = self.qpol_symbol.high_port(self.policy) - return port_range(low, high) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/objclass.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/objclass.py deleted file mode 100644 index bf9a553..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/objclass.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import symbol -from . import qpol - - -def common_factory(policy, name): - """Factory function for creating common permission set objects.""" - - if isinstance(name, Common): - assert name.policy == policy - return name - elif isinstance(name, qpol.qpol_common_t): - return Common(policy, name) - - try: - return Common(policy, qpol.qpol_common_t(policy, str(name))) - except ValueError: - raise exception.InvalidCommon("{0} is not a valid common".format(name)) - - -def class_factory(policy, name): - """Factory function for creating object class objects.""" - - if isinstance(name, ObjClass): - assert name.policy == policy - return name - elif isinstance(name, qpol.qpol_class_t): - return ObjClass(policy, name) - - try: - return ObjClass(policy, qpol.qpol_class_t(policy, str(name))) - except ValueError: - raise exception.InvalidClass("{0} is not a valid object class".format(name)) - - -class Common(symbol.PolicySymbol): - - """A common permission set.""" - - def __contains__(self, other): - return other in self.perms - - @property - def perms(self): - """The list of the common's permissions.""" - return set(self.qpol_symbol.perm_iter(self.policy)) - - def statement(self): - return "common {0}\n{{\n\t{1}\n}}".format(self, '\n\t'.join(self.perms)) - - -class ObjClass(Common): - - """An object class.""" - - def __contains__(self, other): - try: - if other in self.common.perms: - return True - except exception.NoCommon: - pass - - return other in self.perms - - @property - def common(self): - """ - The common that the object class inherits. - - Exceptions: - NoCommon The object class does not inherit a common. - """ - - try: - return common_factory(self.policy, self.qpol_symbol.common(self.policy)) - except ValueError: - raise exception.NoCommon("{0} does not inherit a common.".format(self)) - - def statement(self): - stmt = "class {0}\n".format(self) - - try: - stmt += "inherits {0}\n".format(self.common) - except exception.NoCommon: - pass - - # a class that inherits may not have additional permissions - perms = self.perms - if len(perms) > 0: - stmt += "{{\n\t{0}\n}}".format('\n\t'.join(perms)) - - return stmt diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/polcap.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/polcap.py deleted file mode 100644 index 8ab164d..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/polcap.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import qpol -from . import symbol - - -def polcap_factory(policy, name): - """Factory function for creating policy capability objects.""" - - if isinstance(name, PolicyCapability): - assert name.policy == policy - return name - elif isinstance(name, qpol.qpol_polcap_t): - return PolicyCapability(policy, name) - else: - raise TypeError("Policy capabilities cannot be looked up.") - - -class PolicyCapability(symbol.PolicySymbol): - - """A policy capability.""" - - def statement(self): - return "policycap {0};".format(self) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/qpol.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/qpol.py deleted file mode 100644 index 97e602b..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/qpol.py +++ /dev/null @@ -1,1114 +0,0 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 2.0.11 -# -# Do not make changes to this file unless you know what you are doing--modify -# the SWIG interface file instead. - - - - - -from sys import version_info -if version_info >= (2,6,0): - def swig_import_helper(): - from os.path import dirname - import imp - fp = None - try: - fp, pathname, description = imp.find_module('_qpol', [dirname(__file__)]) - except ImportError: - import _qpol - return _qpol - if fp is not None: - try: - _mod = imp.load_module('_qpol', fp, pathname, description) - finally: - fp.close() - return _mod - _qpol = swig_import_helper() - del swig_import_helper -else: - import _qpol -del version_info -try: - _swig_property = property -except NameError: - pass # Python < 2.2 doesn't have 'property'. -def _swig_setattr_nondynamic(self,class_type,name,value,static=1): - if (name == "thisown"): return self.this.own(value) - if (name == "this"): - if type(value).__name__ == 'SwigPyObject': - self.__dict__[name] = value - return - method = class_type.__swig_setmethods__.get(name,None) - if method: return method(self,value) - if (not static): - self.__dict__[name] = value - else: - raise AttributeError("You cannot add attributes to %s" % self) - -def _swig_setattr(self,class_type,name,value): - return _swig_setattr_nondynamic(self,class_type,name,value,0) - -def _swig_getattr(self,class_type,name): - if (name == "thisown"): return self.this.own() - method = class_type.__swig_getmethods__.get(name,None) - if method: return method(self) - raise AttributeError(name) - -def _swig_repr(self): - try: strthis = "proxy of " + self.this.__repr__() - except: strthis = "" - return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) - -try: - _object = object - _newclass = 1 -except AttributeError: - class _object : pass - _newclass = 0 - - - -def to_str(*args): - return _qpol.to_str(*args) -to_str = _qpol.to_str -import logging -from functools import wraps - -def QpolGenerator(cast): - """ - A decorator which converts qpol iterators into Python generators. - - Qpol iterators use void* to be generic about their contents. - The purpose of the _from_void functions below is to wrap - the pointer casting, hence the "cast" variable name here. - - Decorator parameter: - cast A wrapper function which casts the qpol iterator return pointer - to the proper C data type pointer. The Python function - reference to the C Python extension is used, for example: - - @QpolGenerator(_qpol.qpol_type_from_void) - """ - - def decorate(func): - @wraps(func) - def wrapper(*args, **kwargs): - qpol_iter = func(*args) - while not qpol_iter.isend(): - yield cast(qpol_iter.item()) - qpol_iter.next_() - - return wrapper - return decorate - -def qpol_logger(level, msg): - """Log qpol messages via Python logging.""" - logging.getLogger("libqpol").debug(msg) - -def qpol_policy_factory(path): - """Factory function for qpol policy objects.""" - # The main purpose here is to hook in the - # above logger callback. - return qpol_policy_t(path, 0, qpol_logger) - -QPOL_POLICY_OPTION_NO_NEVERALLOWS = _qpol.QPOL_POLICY_OPTION_NO_NEVERALLOWS -QPOL_POLICY_OPTION_NO_RULES = _qpol.QPOL_POLICY_OPTION_NO_RULES -QPOL_POLICY_OPTION_MATCH_SYSTEM = _qpol.QPOL_POLICY_OPTION_MATCH_SYSTEM -QPOL_POLICY_MAX_VERSION = _qpol.QPOL_POLICY_MAX_VERSION -QPOL_POLICY_MIN_VERSION = _qpol.QPOL_POLICY_MIN_VERSION -class qpol_policy_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_policy_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_policy_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_policy_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_policy_t - __del__ = lambda self : None; - def version(self): return _qpol.qpol_policy_t_version(self) - def handle_unknown(self): return _qpol.qpol_policy_t_handle_unknown(self) - def capability(self, *args): return _qpol.qpol_policy_t_capability(self, *args) - @QpolGenerator(_qpol.qpol_type_from_void) - def type_iter(self): return _qpol.qpol_policy_t_type_iter(self) - def type_count(self): return _qpol.qpol_policy_t_type_count(self) - @QpolGenerator(_qpol.qpol_role_from_void) - def role_iter(self): return _qpol.qpol_policy_t_role_iter(self) - def role_count(self): return _qpol.qpol_policy_t_role_count(self) - @QpolGenerator(_qpol.qpol_level_from_void) - def level_iter(self): return _qpol.qpol_policy_t_level_iter(self) - def level_count(self): return _qpol.qpol_policy_t_level_count(self) - @QpolGenerator(_qpol.qpol_cat_from_void) - def cat_iter(self): return _qpol.qpol_policy_t_cat_iter(self) - def cat_count(self): return _qpol.qpol_policy_t_cat_count(self) - @QpolGenerator(_qpol.qpol_user_from_void) - def user_iter(self): return _qpol.qpol_policy_t_user_iter(self) - def user_count(self): return _qpol.qpol_policy_t_user_count(self) - @QpolGenerator(_qpol.qpol_bool_from_void) - def bool_iter(self): return _qpol.qpol_policy_t_bool_iter(self) - def bool_count(self): return _qpol.qpol_policy_t_bool_count(self) - @QpolGenerator(_qpol.qpol_class_from_void) - def class_iter(self, perm=None): return _qpol.qpol_policy_t_class_iter(self, perm) - def class_count(self): return _qpol.qpol_policy_t_class_count(self) - @QpolGenerator(_qpol.qpol_common_from_void) - def common_iter(self, perm=None): return _qpol.qpol_policy_t_common_iter(self, perm) - def common_count(self): return _qpol.qpol_policy_t_common_count(self) - @QpolGenerator(_qpol.qpol_fs_use_from_void) - def fs_use_iter(self): return _qpol.qpol_policy_t_fs_use_iter(self) - def fs_use_count(self): return _qpol.qpol_policy_t_fs_use_count(self) - @QpolGenerator(_qpol.qpol_genfscon_from_void) - def genfscon_iter(self): return _qpol.qpol_policy_t_genfscon_iter(self) - def genfscon_count(self): return _qpol.qpol_policy_t_genfscon_count(self) - @QpolGenerator(_qpol.qpol_isid_from_void) - def isid_iter(self): return _qpol.qpol_policy_t_isid_iter(self) - def isid_count(self): return _qpol.qpol_policy_t_isid_count(self) - @QpolGenerator(_qpol.qpol_netifcon_from_void) - def netifcon_iter(self): return _qpol.qpol_policy_t_netifcon_iter(self) - def netifcon_count(self): return _qpol.qpol_policy_t_netifcon_count(self) - @QpolGenerator(_qpol.qpol_nodecon_from_void) - def nodecon_iter(self): return _qpol.qpol_policy_t_nodecon_iter(self) - def nodecon_count(self): return _qpol.qpol_policy_t_nodecon_count(self) - @QpolGenerator(_qpol.qpol_portcon_from_void) - def portcon_iter(self): return _qpol.qpol_policy_t_portcon_iter(self) - def portcon_count(self): return _qpol.qpol_policy_t_portcon_count(self) - @QpolGenerator(_qpol.qpol_constraint_from_void) - def constraint_iter(self): return _qpol.qpol_policy_t_constraint_iter(self) - def constraint_count(self): return _qpol.qpol_policy_t_constraint_count(self) - @QpolGenerator(_qpol.qpol_validatetrans_from_void) - def validatetrans_iter(self): return _qpol.qpol_policy_t_validatetrans_iter(self) - def validatetrans_count(self): return _qpol.qpol_policy_t_validatetrans_count(self) - @QpolGenerator(_qpol.qpol_role_allow_from_void) - def role_allow_iter(self): return _qpol.qpol_policy_t_role_allow_iter(self) - def role_allow_count(self): return _qpol.qpol_policy_t_role_allow_count(self) - @QpolGenerator(_qpol.qpol_role_trans_from_void) - def role_trans_iter(self): return _qpol.qpol_policy_t_role_trans_iter(self) - def role_trans_count(self): return _qpol.qpol_policy_t_role_trans_count(self) - @QpolGenerator(_qpol.qpol_range_trans_from_void) - def range_trans_iter(self): return _qpol.qpol_policy_t_range_trans_iter(self) - def range_trans_count(self): return _qpol.qpol_policy_t_range_trans_count(self) - @QpolGenerator(_qpol.qpol_avrule_from_void) - def avrule_iter(self): return _qpol.qpol_policy_t_avrule_iter(self) - def avrule_allow_count(self): return _qpol.qpol_policy_t_avrule_allow_count(self) - def avrule_auditallow_count(self): return _qpol.qpol_policy_t_avrule_auditallow_count(self) - def avrule_neverallow_count(self): return _qpol.qpol_policy_t_avrule_neverallow_count(self) - def avrule_dontaudit_count(self): return _qpol.qpol_policy_t_avrule_dontaudit_count(self) - @QpolGenerator(_qpol.qpol_terule_from_void) - def terule_iter(self): return _qpol.qpol_policy_t_terule_iter(self) - def terule_trans_count(self): return _qpol.qpol_policy_t_terule_trans_count(self) - def terule_change_count(self): return _qpol.qpol_policy_t_terule_change_count(self) - def terule_member_count(self): return _qpol.qpol_policy_t_terule_member_count(self) - def cond_iter(self): return _qpol.qpol_policy_t_cond_iter(self) - def cond_count(self): return _qpol.qpol_policy_t_cond_count(self) - @QpolGenerator(_qpol.qpol_filename_trans_from_void) - def filename_trans_iter(self): return _qpol.qpol_policy_t_filename_trans_iter(self) - def filename_trans_count(self): return _qpol.qpol_policy_t_filename_trans_count(self) - @QpolGenerator(_qpol.qpol_type_from_void) - def permissive_iter(self): return _qpol.qpol_policy_t_permissive_iter(self) - def permissive_count(self): return _qpol.qpol_policy_t_permissive_count(self) - def typebounds_iter(self): return _qpol.qpol_policy_t_typebounds_iter(self) - def typebounds_count(self): return _qpol.qpol_policy_t_typebounds_count(self) - @QpolGenerator(_qpol.qpol_polcap_from_void) - def polcap_iter(self): return _qpol.qpol_policy_t_polcap_iter(self) - def polcap_count(self): return _qpol.qpol_policy_t_polcap_count(self) - @QpolGenerator(_qpol.qpol_default_object_from_void) - def default_iter(self): return _qpol.qpol_policy_t_default_iter(self) -qpol_policy_t_swigregister = _qpol.qpol_policy_t_swigregister -qpol_policy_t_swigregister(qpol_policy_t) - -QPOL_CAP_ATTRIB_NAMES = _qpol.QPOL_CAP_ATTRIB_NAMES -QPOL_CAP_SYN_RULES = _qpol.QPOL_CAP_SYN_RULES -QPOL_CAP_LINE_NUMBERS = _qpol.QPOL_CAP_LINE_NUMBERS -QPOL_CAP_CONDITIONALS = _qpol.QPOL_CAP_CONDITIONALS -QPOL_CAP_MLS = _qpol.QPOL_CAP_MLS -QPOL_CAP_MODULES = _qpol.QPOL_CAP_MODULES -QPOL_CAP_RULES_LOADED = _qpol.QPOL_CAP_RULES_LOADED -QPOL_CAP_SOURCE = _qpol.QPOL_CAP_SOURCE -QPOL_CAP_NEVERALLOW = _qpol.QPOL_CAP_NEVERALLOW -QPOL_CAP_POLCAPS = _qpol.QPOL_CAP_POLCAPS -QPOL_CAP_BOUNDS = _qpol.QPOL_CAP_BOUNDS -QPOL_CAP_DEFAULT_OBJECTS = _qpol.QPOL_CAP_DEFAULT_OBJECTS -QPOL_CAP_DEFAULT_TYPE = _qpol.QPOL_CAP_DEFAULT_TYPE -QPOL_CAP_PERMISSIVE = _qpol.QPOL_CAP_PERMISSIVE -QPOL_CAP_FILENAME_TRANS = _qpol.QPOL_CAP_FILENAME_TRANS -QPOL_CAP_ROLETRANS = _qpol.QPOL_CAP_ROLETRANS -class qpol_iterator_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_iterator_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_iterator_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_iterator_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_iterator_t - __del__ = lambda self : None; - def item(self): return _qpol.qpol_iterator_t_item(self) - def next_(self): return _qpol.qpol_iterator_t_next_(self) - def isend(self): return _qpol.qpol_iterator_t_isend(self) - def size(self): return _qpol.qpol_iterator_t_size(self) -qpol_iterator_t_swigregister = _qpol.qpol_iterator_t_swigregister -qpol_iterator_t_swigregister(qpol_iterator_t) - -class qpol_type_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_type_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_type_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_type_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_type_t - __del__ = lambda self : None; - def name(self, *args): return _qpol.qpol_type_t_name(self, *args) - def value(self, *args): return _qpol.qpol_type_t_value(self, *args) - def isalias(self, *args): return _qpol.qpol_type_t_isalias(self, *args) - def isattr(self, *args): return _qpol.qpol_type_t_isattr(self, *args) - def ispermissive(self, *args): return _qpol.qpol_type_t_ispermissive(self, *args) - @QpolGenerator(_qpol.qpol_type_from_void) - def type_iter(self, *args): return _qpol.qpol_type_t_type_iter(self, *args) - @QpolGenerator(_qpol.qpol_type_from_void) - def attr_iter(self, *args): return _qpol.qpol_type_t_attr_iter(self, *args) - @QpolGenerator(_qpol.to_str) - def alias_iter(self, *args): return _qpol.qpol_type_t_alias_iter(self, *args) -qpol_type_t_swigregister = _qpol.qpol_type_t_swigregister -qpol_type_t_swigregister(qpol_type_t) - - -def qpol_type_from_void(*args): - return _qpol.qpol_type_from_void(*args) -qpol_type_from_void = _qpol.qpol_type_from_void -class qpol_role_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_role_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_role_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_role_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_role_t - __del__ = lambda self : None; - def value(self, *args): return _qpol.qpol_role_t_value(self, *args) - def name(self, *args): return _qpol.qpol_role_t_name(self, *args) - @QpolGenerator(_qpol.qpol_type_from_void) - def type_iter(self, *args): return _qpol.qpol_role_t_type_iter(self, *args) - def dominate_iter(self, *args): return _qpol.qpol_role_t_dominate_iter(self, *args) -qpol_role_t_swigregister = _qpol.qpol_role_t_swigregister -qpol_role_t_swigregister(qpol_role_t) - - -def qpol_role_from_void(*args): - return _qpol.qpol_role_from_void(*args) -qpol_role_from_void = _qpol.qpol_role_from_void -class qpol_level_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_level_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_level_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_level_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_level_t - __del__ = lambda self : None; - def isalias(self, *args): return _qpol.qpol_level_t_isalias(self, *args) - def value(self, *args): return _qpol.qpol_level_t_value(self, *args) - def name(self, *args): return _qpol.qpol_level_t_name(self, *args) - @QpolGenerator(_qpol.qpol_cat_from_void) - def cat_iter(self, *args): return _qpol.qpol_level_t_cat_iter(self, *args) - @QpolGenerator(_qpol.to_str) - def alias_iter(self, *args): return _qpol.qpol_level_t_alias_iter(self, *args) -qpol_level_t_swigregister = _qpol.qpol_level_t_swigregister -qpol_level_t_swigregister(qpol_level_t) - - -def qpol_level_from_void(*args): - return _qpol.qpol_level_from_void(*args) -qpol_level_from_void = _qpol.qpol_level_from_void -class qpol_cat_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_cat_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_cat_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_cat_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_cat_t - __del__ = lambda self : None; - def isalias(self, *args): return _qpol.qpol_cat_t_isalias(self, *args) - def value(self, *args): return _qpol.qpol_cat_t_value(self, *args) - def name(self, *args): return _qpol.qpol_cat_t_name(self, *args) - @QpolGenerator(_qpol.to_str) - def alias_iter(self, *args): return _qpol.qpol_cat_t_alias_iter(self, *args) -qpol_cat_t_swigregister = _qpol.qpol_cat_t_swigregister -qpol_cat_t_swigregister(qpol_cat_t) - - -def qpol_cat_from_void(*args): - return _qpol.qpol_cat_from_void(*args) -qpol_cat_from_void = _qpol.qpol_cat_from_void -class qpol_mls_range_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_mls_range_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_mls_range_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_mls_range_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_mls_range_t - __del__ = lambda self : None; - def high_level(self, *args): return _qpol.qpol_mls_range_t_high_level(self, *args) - def low_level(self, *args): return _qpol.qpol_mls_range_t_low_level(self, *args) -qpol_mls_range_t_swigregister = _qpol.qpol_mls_range_t_swigregister -qpol_mls_range_t_swigregister(qpol_mls_range_t) - - -def qpol_mls_range_from_void(*args): - return _qpol.qpol_mls_range_from_void(*args) -qpol_mls_range_from_void = _qpol.qpol_mls_range_from_void -class qpol_semantic_level_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_semantic_level_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_semantic_level_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_semantic_level_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_semantic_level_t - __del__ = lambda self : None; - def add_cats(self, *args): return _qpol.qpol_semantic_level_t_add_cats(self, *args) -qpol_semantic_level_t_swigregister = _qpol.qpol_semantic_level_t_swigregister -qpol_semantic_level_t_swigregister(qpol_semantic_level_t) - -class qpol_mls_level_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_mls_level_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_mls_level_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_mls_level_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_mls_level_t - __del__ = lambda self : None; - def sens_name(self, *args): return _qpol.qpol_mls_level_t_sens_name(self, *args) - @QpolGenerator(_qpol.qpol_cat_from_void) - def cat_iter(self, *args): return _qpol.qpol_mls_level_t_cat_iter(self, *args) -qpol_mls_level_t_swigregister = _qpol.qpol_mls_level_t_swigregister -qpol_mls_level_t_swigregister(qpol_mls_level_t) - - -def qpol_mls_level_from_void(*args): - return _qpol.qpol_mls_level_from_void(*args) -qpol_mls_level_from_void = _qpol.qpol_mls_level_from_void -class qpol_user_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_user_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_user_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_user_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_user_t - __del__ = lambda self : None; - def value(self, *args): return _qpol.qpol_user_t_value(self, *args) - @QpolGenerator(_qpol.qpol_role_from_void) - def role_iter(self, *args): return _qpol.qpol_user_t_role_iter(self, *args) - def range(self, *args): return _qpol.qpol_user_t_range(self, *args) - def name(self, *args): return _qpol.qpol_user_t_name(self, *args) - def dfltlevel(self, *args): return _qpol.qpol_user_t_dfltlevel(self, *args) -qpol_user_t_swigregister = _qpol.qpol_user_t_swigregister -qpol_user_t_swigregister(qpol_user_t) - - -def qpol_user_from_void(*args): - return _qpol.qpol_user_from_void(*args) -qpol_user_from_void = _qpol.qpol_user_from_void -class qpol_bool_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_bool_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_bool_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_bool_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_bool_t - __del__ = lambda self : None; - def value(self, *args): return _qpol.qpol_bool_t_value(self, *args) - def state(self, *args): return _qpol.qpol_bool_t_state(self, *args) - def name(self, *args): return _qpol.qpol_bool_t_name(self, *args) -qpol_bool_t_swigregister = _qpol.qpol_bool_t_swigregister -qpol_bool_t_swigregister(qpol_bool_t) - - -def qpol_bool_from_void(*args): - return _qpol.qpol_bool_from_void(*args) -qpol_bool_from_void = _qpol.qpol_bool_from_void -class qpol_context_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_context_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_context_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_context_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_context_t - __del__ = lambda self : None; - def user(self, *args): return _qpol.qpol_context_t_user(self, *args) - def role(self, *args): return _qpol.qpol_context_t_role(self, *args) - def type_(self, *args): return _qpol.qpol_context_t_type_(self, *args) - def range(self, *args): return _qpol.qpol_context_t_range(self, *args) -qpol_context_t_swigregister = _qpol.qpol_context_t_swigregister -qpol_context_t_swigregister(qpol_context_t) - - -def qpol_context_from_void(*args): - return _qpol.qpol_context_from_void(*args) -qpol_context_from_void = _qpol.qpol_context_from_void -class qpol_class_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_class_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_class_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_class_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_class_t - __del__ = lambda self : None; - def value(self, *args): return _qpol.qpol_class_t_value(self, *args) - def common(self, *args): return _qpol.qpol_class_t_common(self, *args) - @QpolGenerator(_qpol.to_str) - def perm_iter(self, *args): return _qpol.qpol_class_t_perm_iter(self, *args) - @QpolGenerator(_qpol.qpol_constraint_from_void) - def constraint_iter(self, *args): return _qpol.qpol_class_t_constraint_iter(self, *args) - @QpolGenerator(_qpol.qpol_validatetrans_from_void) - def validatetrans_iter(self, *args): return _qpol.qpol_class_t_validatetrans_iter(self, *args) - def name(self, *args): return _qpol.qpol_class_t_name(self, *args) -qpol_class_t_swigregister = _qpol.qpol_class_t_swigregister -qpol_class_t_swigregister(qpol_class_t) - - -def qpol_class_from_void(*args): - return _qpol.qpol_class_from_void(*args) -qpol_class_from_void = _qpol.qpol_class_from_void -class qpol_common_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_common_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_common_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_common_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_common_t - __del__ = lambda self : None; - def value(self, *args): return _qpol.qpol_common_t_value(self, *args) - @QpolGenerator(_qpol.to_str) - def perm_iter(self, *args): return _qpol.qpol_common_t_perm_iter(self, *args) - def name(self, *args): return _qpol.qpol_common_t_name(self, *args) -qpol_common_t_swigregister = _qpol.qpol_common_t_swigregister -qpol_common_t_swigregister(qpol_common_t) - - -def qpol_common_from_void(*args): - return _qpol.qpol_common_from_void(*args) -qpol_common_from_void = _qpol.qpol_common_from_void -QPOL_FS_USE_XATTR = _qpol.QPOL_FS_USE_XATTR -QPOL_FS_USE_TRANS = _qpol.QPOL_FS_USE_TRANS -QPOL_FS_USE_TASK = _qpol.QPOL_FS_USE_TASK -QPOL_FS_USE_GENFS = _qpol.QPOL_FS_USE_GENFS -QPOL_FS_USE_NONE = _qpol.QPOL_FS_USE_NONE -QPOL_FS_USE_PSID = _qpol.QPOL_FS_USE_PSID -class qpol_fs_use_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_fs_use_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_fs_use_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_fs_use_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_fs_use_t - __del__ = lambda self : None; - def name(self, *args): return _qpol.qpol_fs_use_t_name(self, *args) - def behavior(self, *args): return _qpol.qpol_fs_use_t_behavior(self, *args) - def context(self, *args): return _qpol.qpol_fs_use_t_context(self, *args) -qpol_fs_use_t_swigregister = _qpol.qpol_fs_use_t_swigregister -qpol_fs_use_t_swigregister(qpol_fs_use_t) - - -def qpol_fs_use_from_void(*args): - return _qpol.qpol_fs_use_from_void(*args) -qpol_fs_use_from_void = _qpol.qpol_fs_use_from_void -QPOL_CLASS_ALL = _qpol.QPOL_CLASS_ALL -QPOL_CLASS_BLK_FILE = _qpol.QPOL_CLASS_BLK_FILE -QPOL_CLASS_CHR_FILE = _qpol.QPOL_CLASS_CHR_FILE -QPOL_CLASS_DIR = _qpol.QPOL_CLASS_DIR -QPOL_CLASS_FIFO_FILE = _qpol.QPOL_CLASS_FIFO_FILE -QPOL_CLASS_FILE = _qpol.QPOL_CLASS_FILE -QPOL_CLASS_LNK_FILE = _qpol.QPOL_CLASS_LNK_FILE -QPOL_CLASS_SOCK_FILE = _qpol.QPOL_CLASS_SOCK_FILE -class qpol_genfscon_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_genfscon_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_genfscon_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_genfscon_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_genfscon_t - __del__ = lambda self : None; - def name(self, *args): return _qpol.qpol_genfscon_t_name(self, *args) - def path(self, *args): return _qpol.qpol_genfscon_t_path(self, *args) - def object_class(self, *args): return _qpol.qpol_genfscon_t_object_class(self, *args) - def context(self, *args): return _qpol.qpol_genfscon_t_context(self, *args) -qpol_genfscon_t_swigregister = _qpol.qpol_genfscon_t_swigregister -qpol_genfscon_t_swigregister(qpol_genfscon_t) - - -def qpol_genfscon_from_void(*args): - return _qpol.qpol_genfscon_from_void(*args) -qpol_genfscon_from_void = _qpol.qpol_genfscon_from_void -class qpol_isid_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_isid_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_isid_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_isid_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_isid_t - __del__ = lambda self : None; - def name(self, *args): return _qpol.qpol_isid_t_name(self, *args) - def context(self, *args): return _qpol.qpol_isid_t_context(self, *args) -qpol_isid_t_swigregister = _qpol.qpol_isid_t_swigregister -qpol_isid_t_swigregister(qpol_isid_t) - - -def qpol_isid_from_void(*args): - return _qpol.qpol_isid_from_void(*args) -qpol_isid_from_void = _qpol.qpol_isid_from_void -class qpol_netifcon_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_netifcon_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_netifcon_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_netifcon_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_netifcon_t - __del__ = lambda self : None; - def name(self, *args): return _qpol.qpol_netifcon_t_name(self, *args) - def msg_con(self, *args): return _qpol.qpol_netifcon_t_msg_con(self, *args) - def if_con(self, *args): return _qpol.qpol_netifcon_t_if_con(self, *args) -qpol_netifcon_t_swigregister = _qpol.qpol_netifcon_t_swigregister -qpol_netifcon_t_swigregister(qpol_netifcon_t) - - -def qpol_netifcon_from_void(*args): - return _qpol.qpol_netifcon_from_void(*args) -qpol_netifcon_from_void = _qpol.qpol_netifcon_from_void -QPOL_IPV4 = _qpol.QPOL_IPV4 -QPOL_IPV6 = _qpol.QPOL_IPV6 -class qpol_nodecon_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_nodecon_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_nodecon_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_nodecon_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_nodecon_t - __del__ = lambda self : None; - def addr(self, *args): return _qpol.qpol_nodecon_t_addr(self, *args) - def mask(self, *args): return _qpol.qpol_nodecon_t_mask(self, *args) - def protocol(self, *args): return _qpol.qpol_nodecon_t_protocol(self, *args) - def context(self, *args): return _qpol.qpol_nodecon_t_context(self, *args) -qpol_nodecon_t_swigregister = _qpol.qpol_nodecon_t_swigregister -qpol_nodecon_t_swigregister(qpol_nodecon_t) - - -def qpol_nodecon_from_void(*args): - return _qpol.qpol_nodecon_from_void(*args) -qpol_nodecon_from_void = _qpol.qpol_nodecon_from_void -IPPROTO_TCP = _qpol.IPPROTO_TCP -IPPROTO_UDP = _qpol.IPPROTO_UDP -class qpol_portcon_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_portcon_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_portcon_t, name) - __repr__ = _swig_repr - def __init__(self, *args): - this = _qpol.new_qpol_portcon_t(*args) - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_portcon_t - __del__ = lambda self : None; - def low_port(self, *args): return _qpol.qpol_portcon_t_low_port(self, *args) - def high_port(self, *args): return _qpol.qpol_portcon_t_high_port(self, *args) - def protocol(self, *args): return _qpol.qpol_portcon_t_protocol(self, *args) - def context(self, *args): return _qpol.qpol_portcon_t_context(self, *args) -qpol_portcon_t_swigregister = _qpol.qpol_portcon_t_swigregister -qpol_portcon_t_swigregister(qpol_portcon_t) - - -def qpol_portcon_from_void(*args): - return _qpol.qpol_portcon_from_void(*args) -qpol_portcon_from_void = _qpol.qpol_portcon_from_void -class qpol_constraint_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_constraint_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_constraint_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_constraint_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_constraint_t - __del__ = lambda self : None; - def object_class(self, *args): return _qpol.qpol_constraint_t_object_class(self, *args) - @QpolGenerator(_qpol.to_str) - def perm_iter(self, *args): return _qpol.qpol_constraint_t_perm_iter(self, *args) - @QpolGenerator(_qpol.qpol_constraint_expr_node_from_void) - def expr_iter(self, *args): return _qpol.qpol_constraint_t_expr_iter(self, *args) -qpol_constraint_t_swigregister = _qpol.qpol_constraint_t_swigregister -qpol_constraint_t_swigregister(qpol_constraint_t) - - -def qpol_constraint_from_void(*args): - return _qpol.qpol_constraint_from_void(*args) -qpol_constraint_from_void = _qpol.qpol_constraint_from_void -class qpol_validatetrans_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_validatetrans_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_validatetrans_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_validatetrans_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_validatetrans_t - __del__ = lambda self : None; - def object_class(self, *args): return _qpol.qpol_validatetrans_t_object_class(self, *args) - @QpolGenerator(_qpol.qpol_constraint_expr_node_from_void) - def expr_iter(self, *args): return _qpol.qpol_validatetrans_t_expr_iter(self, *args) -qpol_validatetrans_t_swigregister = _qpol.qpol_validatetrans_t_swigregister -qpol_validatetrans_t_swigregister(qpol_validatetrans_t) - - -def qpol_validatetrans_from_void(*args): - return _qpol.qpol_validatetrans_from_void(*args) -qpol_validatetrans_from_void = _qpol.qpol_validatetrans_from_void -QPOL_CEXPR_TYPE_NOT = _qpol.QPOL_CEXPR_TYPE_NOT -QPOL_CEXPR_TYPE_AND = _qpol.QPOL_CEXPR_TYPE_AND -QPOL_CEXPR_TYPE_OR = _qpol.QPOL_CEXPR_TYPE_OR -QPOL_CEXPR_TYPE_ATTR = _qpol.QPOL_CEXPR_TYPE_ATTR -QPOL_CEXPR_TYPE_NAMES = _qpol.QPOL_CEXPR_TYPE_NAMES -QPOL_CEXPR_SYM_USER = _qpol.QPOL_CEXPR_SYM_USER -QPOL_CEXPR_SYM_ROLE = _qpol.QPOL_CEXPR_SYM_ROLE -QPOL_CEXPR_SYM_TYPE = _qpol.QPOL_CEXPR_SYM_TYPE -QPOL_CEXPR_SYM_TARGET = _qpol.QPOL_CEXPR_SYM_TARGET -QPOL_CEXPR_SYM_XTARGET = _qpol.QPOL_CEXPR_SYM_XTARGET -QPOL_CEXPR_SYM_L1L2 = _qpol.QPOL_CEXPR_SYM_L1L2 -QPOL_CEXPR_SYM_L1H2 = _qpol.QPOL_CEXPR_SYM_L1H2 -QPOL_CEXPR_SYM_H1L2 = _qpol.QPOL_CEXPR_SYM_H1L2 -QPOL_CEXPR_SYM_H1H2 = _qpol.QPOL_CEXPR_SYM_H1H2 -QPOL_CEXPR_SYM_L1H1 = _qpol.QPOL_CEXPR_SYM_L1H1 -QPOL_CEXPR_SYM_L2H2 = _qpol.QPOL_CEXPR_SYM_L2H2 -QPOL_CEXPR_OP_EQ = _qpol.QPOL_CEXPR_OP_EQ -QPOL_CEXPR_OP_NEQ = _qpol.QPOL_CEXPR_OP_NEQ -QPOL_CEXPR_OP_DOM = _qpol.QPOL_CEXPR_OP_DOM -QPOL_CEXPR_OP_DOMBY = _qpol.QPOL_CEXPR_OP_DOMBY -QPOL_CEXPR_OP_INCOMP = _qpol.QPOL_CEXPR_OP_INCOMP -class qpol_constraint_expr_node_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_constraint_expr_node_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_constraint_expr_node_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_constraint_expr_node_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_constraint_expr_node_t - __del__ = lambda self : None; - def expr_type(self, *args): return _qpol.qpol_constraint_expr_node_t_expr_type(self, *args) - def sym_type(self, *args): return _qpol.qpol_constraint_expr_node_t_sym_type(self, *args) - def op(self, *args): return _qpol.qpol_constraint_expr_node_t_op(self, *args) - @QpolGenerator(_qpol.to_str) - def names_iter(self, *args): return _qpol.qpol_constraint_expr_node_t_names_iter(self, *args) -qpol_constraint_expr_node_t_swigregister = _qpol.qpol_constraint_expr_node_t_swigregister -qpol_constraint_expr_node_t_swigregister(qpol_constraint_expr_node_t) - - -def qpol_constraint_expr_node_from_void(*args): - return _qpol.qpol_constraint_expr_node_from_void(*args) -qpol_constraint_expr_node_from_void = _qpol.qpol_constraint_expr_node_from_void -class qpol_role_allow_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_role_allow_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_role_allow_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_role_allow_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_role_allow_t - __del__ = lambda self : None; - def rule_type(self,policy): - return "allow" - - def source_role(self, *args): return _qpol.qpol_role_allow_t_source_role(self, *args) - def target_role(self, *args): return _qpol.qpol_role_allow_t_target_role(self, *args) -qpol_role_allow_t_swigregister = _qpol.qpol_role_allow_t_swigregister -qpol_role_allow_t_swigregister(qpol_role_allow_t) - - -def qpol_role_allow_from_void(*args): - return _qpol.qpol_role_allow_from_void(*args) -qpol_role_allow_from_void = _qpol.qpol_role_allow_from_void -class qpol_role_trans_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_role_trans_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_role_trans_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_role_trans_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_role_trans_t - __del__ = lambda self : None; - def rule_type(self,policy): - return "role_transition" - - def source_role(self, *args): return _qpol.qpol_role_trans_t_source_role(self, *args) - def target_type(self, *args): return _qpol.qpol_role_trans_t_target_type(self, *args) - def object_class(self, *args): return _qpol.qpol_role_trans_t_object_class(self, *args) - def default_role(self, *args): return _qpol.qpol_role_trans_t_default_role(self, *args) -qpol_role_trans_t_swigregister = _qpol.qpol_role_trans_t_swigregister -qpol_role_trans_t_swigregister(qpol_role_trans_t) - - -def qpol_role_trans_from_void(*args): - return _qpol.qpol_role_trans_from_void(*args) -qpol_role_trans_from_void = _qpol.qpol_role_trans_from_void -class qpol_range_trans_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_range_trans_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_range_trans_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_range_trans_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_range_trans_t - __del__ = lambda self : None; - def rule_type(self,policy): - return "range_transition" - - def source_type(self, *args): return _qpol.qpol_range_trans_t_source_type(self, *args) - def target_type(self, *args): return _qpol.qpol_range_trans_t_target_type(self, *args) - def object_class(self, *args): return _qpol.qpol_range_trans_t_object_class(self, *args) - def range(self, *args): return _qpol.qpol_range_trans_t_range(self, *args) -qpol_range_trans_t_swigregister = _qpol.qpol_range_trans_t_swigregister -qpol_range_trans_t_swigregister(qpol_range_trans_t) - - -def qpol_range_trans_from_void(*args): - return _qpol.qpol_range_trans_from_void(*args) -qpol_range_trans_from_void = _qpol.qpol_range_trans_from_void -QPOL_RULE_ALLOW = _qpol.QPOL_RULE_ALLOW -QPOL_RULE_NEVERALLOW = _qpol.QPOL_RULE_NEVERALLOW -QPOL_RULE_AUDITALLOW = _qpol.QPOL_RULE_AUDITALLOW -QPOL_RULE_DONTAUDIT = _qpol.QPOL_RULE_DONTAUDIT -class qpol_avrule_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_avrule_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_avrule_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_avrule_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_avrule_t - __del__ = lambda self : None; - def rule_type(self, *args): return _qpol.qpol_avrule_t_rule_type(self, *args) - def source_type(self, *args): return _qpol.qpol_avrule_t_source_type(self, *args) - def target_type(self, *args): return _qpol.qpol_avrule_t_target_type(self, *args) - def object_class(self, *args): return _qpol.qpol_avrule_t_object_class(self, *args) - @QpolGenerator(_qpol.to_str) - def perm_iter(self, *args): return _qpol.qpol_avrule_t_perm_iter(self, *args) - def cond(self, *args): return _qpol.qpol_avrule_t_cond(self, *args) - def is_enabled(self, *args): return _qpol.qpol_avrule_t_is_enabled(self, *args) - def which_list(self, *args): return _qpol.qpol_avrule_t_which_list(self, *args) - def syn_avrule_iter(self, *args): return _qpol.qpol_avrule_t_syn_avrule_iter(self, *args) -qpol_avrule_t_swigregister = _qpol.qpol_avrule_t_swigregister -qpol_avrule_t_swigregister(qpol_avrule_t) - - -def qpol_avrule_from_void(*args): - return _qpol.qpol_avrule_from_void(*args) -qpol_avrule_from_void = _qpol.qpol_avrule_from_void -QPOL_RULE_TYPE_TRANS = _qpol.QPOL_RULE_TYPE_TRANS -QPOL_RULE_TYPE_CHANGE = _qpol.QPOL_RULE_TYPE_CHANGE -QPOL_RULE_TYPE_MEMBER = _qpol.QPOL_RULE_TYPE_MEMBER -class qpol_terule_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_terule_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_terule_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_terule_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_terule_t - __del__ = lambda self : None; - def rule_type(self, *args): return _qpol.qpol_terule_t_rule_type(self, *args) - def source_type(self, *args): return _qpol.qpol_terule_t_source_type(self, *args) - def target_type(self, *args): return _qpol.qpol_terule_t_target_type(self, *args) - def object_class(self, *args): return _qpol.qpol_terule_t_object_class(self, *args) - def default_type(self, *args): return _qpol.qpol_terule_t_default_type(self, *args) - def cond(self, *args): return _qpol.qpol_terule_t_cond(self, *args) - def is_enabled(self, *args): return _qpol.qpol_terule_t_is_enabled(self, *args) - def which_list(self, *args): return _qpol.qpol_terule_t_which_list(self, *args) - def syn_terule_iter(self, *args): return _qpol.qpol_terule_t_syn_terule_iter(self, *args) -qpol_terule_t_swigregister = _qpol.qpol_terule_t_swigregister -qpol_terule_t_swigregister(qpol_terule_t) - - -def qpol_terule_from_void(*args): - return _qpol.qpol_terule_from_void(*args) -qpol_terule_from_void = _qpol.qpol_terule_from_void -class qpol_cond_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_cond_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_cond_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_cond_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_cond_t - __del__ = lambda self : None; - @QpolGenerator(_qpol.qpol_cond_expr_node_from_void) - def expr_node_iter(self, *args): return _qpol.qpol_cond_t_expr_node_iter(self, *args) - def av_true_iter(self, *args): return _qpol.qpol_cond_t_av_true_iter(self, *args) - def av_false_iter(self, *args): return _qpol.qpol_cond_t_av_false_iter(self, *args) - def te_true_iter(self, *args): return _qpol.qpol_cond_t_te_true_iter(self, *args) - def te_false_iter(self, *args): return _qpol.qpol_cond_t_te_false_iter(self, *args) - def evaluate(self, *args): return _qpol.qpol_cond_t_evaluate(self, *args) -qpol_cond_t_swigregister = _qpol.qpol_cond_t_swigregister -qpol_cond_t_swigregister(qpol_cond_t) - - -def qpol_cond_from_void(*args): - return _qpol.qpol_cond_from_void(*args) -qpol_cond_from_void = _qpol.qpol_cond_from_void -QPOL_COND_EXPR_BOOL = _qpol.QPOL_COND_EXPR_BOOL -QPOL_COND_EXPR_NOT = _qpol.QPOL_COND_EXPR_NOT -QPOL_COND_EXPR_OR = _qpol.QPOL_COND_EXPR_OR -QPOL_COND_EXPR_AND = _qpol.QPOL_COND_EXPR_AND -QPOL_COND_EXPR_XOR = _qpol.QPOL_COND_EXPR_XOR -QPOL_COND_EXPR_EQ = _qpol.QPOL_COND_EXPR_EQ -QPOL_COND_EXPR_NEQ = _qpol.QPOL_COND_EXPR_NEQ -class qpol_cond_expr_node_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_cond_expr_node_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_cond_expr_node_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_cond_expr_node_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_cond_expr_node_t - __del__ = lambda self : None; - def expr_type(self, *args): return _qpol.qpol_cond_expr_node_t_expr_type(self, *args) - def get_boolean(self, *args): return _qpol.qpol_cond_expr_node_t_get_boolean(self, *args) -qpol_cond_expr_node_t_swigregister = _qpol.qpol_cond_expr_node_t_swigregister -qpol_cond_expr_node_t_swigregister(qpol_cond_expr_node_t) - - -def qpol_cond_expr_node_from_void(*args): - return _qpol.qpol_cond_expr_node_from_void(*args) -qpol_cond_expr_node_from_void = _qpol.qpol_cond_expr_node_from_void -class qpol_filename_trans_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_filename_trans_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_filename_trans_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_filename_trans_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_filename_trans_t - __del__ = lambda self : None; - def rule_type(self,policy): - return "type_transition" - - def source_type(self, *args): return _qpol.qpol_filename_trans_t_source_type(self, *args) - def target_type(self, *args): return _qpol.qpol_filename_trans_t_target_type(self, *args) - def object_class(self, *args): return _qpol.qpol_filename_trans_t_object_class(self, *args) - def default_type(self, *args): return _qpol.qpol_filename_trans_t_default_type(self, *args) - def filename(self, *args): return _qpol.qpol_filename_trans_t_filename(self, *args) -qpol_filename_trans_t_swigregister = _qpol.qpol_filename_trans_t_swigregister -qpol_filename_trans_t_swigregister(qpol_filename_trans_t) - - -def qpol_filename_trans_from_void(*args): - return _qpol.qpol_filename_trans_from_void(*args) -qpol_filename_trans_from_void = _qpol.qpol_filename_trans_from_void -class qpol_polcap_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_polcap_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_polcap_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_polcap_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_polcap_t - __del__ = lambda self : None; - def name(self, *args): return _qpol.qpol_polcap_t_name(self, *args) -qpol_polcap_t_swigregister = _qpol.qpol_polcap_t_swigregister -qpol_polcap_t_swigregister(qpol_polcap_t) - - -def qpol_polcap_from_void(*args): - return _qpol.qpol_polcap_from_void(*args) -qpol_polcap_from_void = _qpol.qpol_polcap_from_void -class qpol_typebounds_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_typebounds_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_typebounds_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_typebounds_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_typebounds_t - __del__ = lambda self : None; - def parent_name(self, *args): return _qpol.qpol_typebounds_t_parent_name(self, *args) - def child_name(self, *args): return _qpol.qpol_typebounds_t_child_name(self, *args) -qpol_typebounds_t_swigregister = _qpol.qpol_typebounds_t_swigregister -qpol_typebounds_t_swigregister(qpol_typebounds_t) - - -def qpol_typebounds_from_void(*args): - return _qpol.qpol_typebounds_from_void(*args) -qpol_typebounds_from_void = _qpol.qpol_typebounds_from_void -class qpol_rolebounds_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_rolebounds_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_rolebounds_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_rolebounds_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_rolebounds_t - __del__ = lambda self : None; - def parent_name(self, *args): return _qpol.qpol_rolebounds_t_parent_name(self, *args) - def child_name(self, *args): return _qpol.qpol_rolebounds_t_child_name(self, *args) -qpol_rolebounds_t_swigregister = _qpol.qpol_rolebounds_t_swigregister -qpol_rolebounds_t_swigregister(qpol_rolebounds_t) - - -def qpol_rolebounds_from_void(*args): - return _qpol.qpol_rolebounds_from_void(*args) -qpol_rolebounds_from_void = _qpol.qpol_rolebounds_from_void -class qpol_userbounds_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_userbounds_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_userbounds_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_userbounds_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_userbounds_t - __del__ = lambda self : None; - def parent_name(self, *args): return _qpol.qpol_userbounds_t_parent_name(self, *args) - def child_name(self, *args): return _qpol.qpol_userbounds_t_child_name(self, *args) -qpol_userbounds_t_swigregister = _qpol.qpol_userbounds_t_swigregister -qpol_userbounds_t_swigregister(qpol_userbounds_t) - - -def qpol_userbounds_from_void(*args): - return _qpol.qpol_userbounds_from_void(*args) -qpol_userbounds_from_void = _qpol.qpol_userbounds_from_void -class qpol_default_object_t(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, qpol_default_object_t, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, qpol_default_object_t, name) - __repr__ = _swig_repr - def __init__(self): - this = _qpol.new_qpol_default_object_t() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _qpol.delete_qpol_default_object_t - __del__ = lambda self : None; - def object_class(self, *args): return _qpol.qpol_default_object_t_object_class(self, *args) - def user_default(self, *args): return _qpol.qpol_default_object_t_user_default(self, *args) - def role_default(self, *args): return _qpol.qpol_default_object_t_role_default(self, *args) - def type_default(self, *args): return _qpol.qpol_default_object_t_type_default(self, *args) - def range_default(self, *args): return _qpol.qpol_default_object_t_range_default(self, *args) -qpol_default_object_t_swigregister = _qpol.qpol_default_object_t_swigregister -qpol_default_object_t_swigregister(qpol_default_object_t) - - -def qpol_default_object_from_void(*args): - return _qpol.qpol_default_object_from_void(*args) -qpol_default_object_from_void = _qpol.qpol_default_object_from_void -# This file is compatible with both classic and new-style classes. - - diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/rbacrule.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/rbacrule.py deleted file mode 100644 index aa6a0d0..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/rbacrule.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import rule -from . import role -from . import typeattr - - -def rbac_rule_factory(policy, name): - """Factory function for creating RBAC rule objects.""" - - if isinstance(name, qpol.qpol_role_allow_t): - return RoleAllow(policy, name) - elif isinstance(name, qpol.qpol_role_trans_t): - return RoleTransition(policy, name) - else: - raise TypeError("RBAC rules cannot be looked up.") - - -def validate_ruletype(types): - """Validate RBAC rule types.""" - for t in types: - if t not in ["allow", "role_transition"]: - raise exception.InvalidRBACRuleType("{0} is not a valid RBAC rule type.".format(t)) - - -class RoleAllow(rule.PolicyRule): - - """A role allow rule.""" - - def __str__(self): - return "allow {0.source} {0.target};".format(self) - - @property - def source(self): - """The rule's source role.""" - return role.role_factory(self.policy, self.qpol_symbol.source_role(self.policy)) - - @property - def target(self): - """The rule's target role.""" - return role.role_factory(self.policy, self.qpol_symbol.target_role(self.policy)) - - @property - def tclass(self): - """The rule's object class.""" - raise exception.RuleUseError("Role allow rules do not have an object class.") - - @property - def default(self): - """The rule's default role.""" - raise exception.RuleUseError("Role allow rules do not have a default role.") - - -class RoleTransition(rule.PolicyRule): - - """A role_transition rule.""" - - def __str__(self): - return "role_transition {0.source} {0.target}:{0.tclass} {0.default};".format(self) - - @property - def source(self): - """The rule's source role.""" - return role.role_factory(self.policy, self.qpol_symbol.source_role(self.policy)) - - @property - def target(self): - """The rule's target type/attribute.""" - return typeattr.type_or_attr_factory(self.policy, self.qpol_symbol.target_type(self.policy)) - - @property - def default(self): - """The rule's default role.""" - return role.role_factory(self.policy, self.qpol_symbol.default_role(self.policy)) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/role.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/role.py deleted file mode 100644 index 1d9fbe1..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/role.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import symbol -from . import typeattr - - -def role_factory(qpol_policy, name): - """Factory function for creating Role objects.""" - - if isinstance(name, Role): - assert name.policy == qpol_policy - return name - elif isinstance(name, qpol.qpol_role_t): - return Role(qpol_policy, name) - - try: - return Role(qpol_policy, qpol.qpol_role_t(qpol_policy, str(name))) - except ValueError: - raise exception.InvalidRole("{0} is not a valid role".format(name)) - - -class BaseRole(symbol.PolicySymbol): - - """Role/role attribute base class.""" - - def expand(self): - raise NotImplementedError - - def types(self): - raise NotImplementedError - - -class Role(BaseRole): - - """A role.""" - - def expand(self): - """Generator that expands this into its member roles.""" - yield self - - def types(self): - """Generator which yields the role's set of types.""" - - for type_ in self.qpol_symbol.type_iter(self.policy): - yield typeattr.type_or_attr_factory(self.policy, type_) - - def statement(self): - types = list(str(t) for t in self.types()) - stmt = "role {0}".format(self) - if types: - if (len(types) > 1): - stmt += " types {{ {0} }}".format(' '.join(types)) - else: - stmt += " types {0}".format(types[0]) - stmt += ";" - return stmt - - -class RoleAttribute(BaseRole): - - """A role attribute.""" - - pass diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/rule.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/rule.py deleted file mode 100644 index 73fc812..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/rule.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import symbol -from . import objclass - - -class PolicyRule(symbol.PolicySymbol): - - """This is base class for policy rules.""" - - def __str__(self): - raise NotImplementedError - - @property - def ruletype(self): - """The rule type for the rule.""" - return self.qpol_symbol.rule_type(self.policy) - - @property - def source(self): - """ - The source for the rule. This should be overridden by - subclasses. - """ - raise NotImplementedError - - @property - def target(self): - """ - The target for the rule. This should be overridden by - subclasses. - """ - raise NotImplementedError - - @property - def tclass(self): - """The object class for the rule.""" - return objclass.class_factory(self.policy, self.qpol_symbol.object_class(self.policy)) - - @property - def default(self): - """ - The default for the rule. This should be overridden by - subclasses. - """ - raise NotImplementedError - - @property - def conditional(self): - """The conditional expression for this rule.""" - # Most rules cannot be conditional. - raise exception.RuleNotConditional - - def statement(self): - return str(self) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/symbol.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/symbol.py deleted file mode 100644 index 4712d7f..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/symbol.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# - - -class PolicySymbol(object): - - """This is a base class for all policy objects.""" - - def __init__(self, policy, qpol_symbol): - """ - Parameters: - policy The low-level policy object. - qpol_symbol The low-level policy symbol object. - """ - - assert qpol_symbol - - self.policy = policy - self.qpol_symbol = qpol_symbol - - def __str__(self): - return self.qpol_symbol.name(self.policy) - - def __hash__(self): - return hash(self.qpol_symbol.name(self.policy)) - - def __eq__(self, other): - try: - return self.qpol_symbol.this == other.qpol_symbol.this - except AttributeError: - return str(self) == str(other) - - def __ne__(self, other): - return not self == other - - def __lt__(self, other): - """Comparison used by Python sorting functions.""" - return str(self) < str(other) - - def __repr__(self): - return "<{0.__class__.__name__}(<qpol_policy_t id={1}>,\"{0}\")>".format( - self, id(self.policy)) - - def __deepcopy__(self, memo): - # shallow copy as all of the members are immutable - cls = self.__class__ - newobj = cls.__new__(cls) - newobj.policy = self.policy - newobj.qpol_symbol = self.qpol_symbol - memo[id(self)] = newobj - return newobj - - def statement(self): - """ - A rendering of the policy statement. This should be - overridden by subclasses. - """ - raise NotImplementedError diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/terule.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/terule.py deleted file mode 100644 index d8a9e94..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/terule.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import rule -from . import typeattr -from . import boolcond - - -def te_rule_factory(policy, symbol): - """Factory function for creating TE rule objects.""" - - if isinstance(symbol, qpol.qpol_avrule_t): - return AVRule(policy, symbol) - elif isinstance(symbol, (qpol.qpol_terule_t, qpol.qpol_filename_trans_t)): - return TERule(policy, symbol) - else: - raise TypeError("TE rules cannot be looked-up.") - - -def validate_ruletype(types): - """Validate TE Rule types.""" - for t in types: - if t not in ["allow", "auditallow", "dontaudit", "neverallow", - "type_transition", "type_member", "type_change"]: - raise exception.InvalidTERuleType("{0} is not a valid TE rule type.".format(t)) - - -class BaseTERule(rule.PolicyRule): - - """A type enforcement rule.""" - - @property - def source(self): - """The rule's source type/attribute.""" - return typeattr.type_or_attr_factory(self.policy, self.qpol_symbol.source_type(self.policy)) - - @property - def target(self): - """The rule's target type/attribute.""" - return typeattr.type_or_attr_factory(self.policy, self.qpol_symbol.target_type(self.policy)) - - @property - def filename(self): - raise NotImplementedError - - @property - def conditional(self): - """The rule's conditional expression.""" - try: - return boolcond.condexpr_factory(self.policy, self.qpol_symbol.cond(self.policy)) - except (AttributeError, ValueError): - # AttributeError: name filetrans rules cannot be conditional - # so no member function - # ValueError: The rule is not conditional - raise exception.RuleNotConditional - - -class AVRule(BaseTERule): - - """An access vector type enforcement rule.""" - - def __str__(self): - rule_string = "{0.ruletype} {0.source} {0.target}:{0.tclass} ".format( - self) - - perms = self.perms - - # allow/dontaudit/auditallow/neverallow rules - if len(perms) > 1: - rule_string += "{{ {0} }};".format(' '.join(perms)) - else: - # convert to list since sets cannot be indexed - rule_string += "{0};".format(list(perms)[0]) - - try: - rule_string += " [ {0} ]".format(self.conditional) - except exception.RuleNotConditional: - pass - - return rule_string - - @property - def perms(self): - """The rule's permission set.""" - return set(self.qpol_symbol.perm_iter(self.policy)) - - @property - def default(self): - """The rule's default type.""" - raise exception.RuleUseError("{0} rules do not have a default type.".format(self.ruletype)) - - @property - def filename(self): - raise exception.RuleUseError("{0} rules do not have file names".format(self.ruletype)) - - -class TERule(BaseTERule): - - """A type_* type enforcement rule.""" - - def __str__(self): - rule_string = "{0.ruletype} {0.source} {0.target}:{0.tclass} {0.default}".format(self) - - try: - rule_string += " \"{0}\";".format(self.filename) - except (exception.TERuleNoFilename, exception.RuleUseError): - # invalid use for type_change/member - rule_string += ";" - - try: - rule_string += " [ {0} ]".format(self.conditional) - except exception.RuleNotConditional: - pass - - return rule_string - - @property - def perms(self): - """The rule's permission set.""" - raise exception.RuleUseError( - "{0} rules do not have a permission set.".format(self.ruletype)) - - @property - def default(self): - """The rule's default type.""" - return typeattr.type_factory(self.policy, self.qpol_symbol.default_type(self.policy)) - - @property - def filename(self): - """The type_transition rule's file name.""" - try: - return self.qpol_symbol.filename(self.policy) - except AttributeError: - if self.ruletype == "type_transition": - raise exception.TERuleNoFilename - else: - raise exception.RuleUseError("{0} rules do not have file names". - format(self.ruletype)) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/typeattr.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/typeattr.py deleted file mode 100644 index a52c69a..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/typeattr.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import symbol - - -def _symbol_lookup(qpol_policy, name): - """Look up the low-level qpol policy reference""" - if isinstance(name, qpol.qpol_type_t): - return name - - try: - return qpol.qpol_type_t(qpol_policy, str(name)) - except ValueError: - raise exception.InvalidType("{0} is not a valid type/attribute".format(name)) - - -def attribute_factory(qpol_policy, name): - """Factory function for creating attribute objects.""" - - if isinstance(name, TypeAttribute): - assert name.policy == qpol_policy - return name - - qpol_symbol = _symbol_lookup(qpol_policy, name) - - if not qpol_symbol.isattr(qpol_policy): - raise TypeError("{0} is a type".format(qpol_symbol.name(qpol_policy))) - - return TypeAttribute(qpol_policy, qpol_symbol) - - -def type_factory(qpol_policy, name, deref=False): - """Factory function for creating type objects.""" - - if isinstance(name, Type): - assert name.policy == qpol_policy - return name - - qpol_symbol = _symbol_lookup(qpol_policy, name) - - if qpol_symbol.isattr(qpol_policy): - raise TypeError("{0} is an attribute".format(qpol_symbol.name(qpol_policy))) - elif qpol_symbol.isalias(qpol_policy) and not deref: - raise TypeError("{0} is an alias.".format(qpol_symbol.name(qpol_policy))) - - return Type(qpol_policy, qpol_symbol) - - -def type_or_attr_factory(qpol_policy, name, deref=False): - """Factory function for creating type or attribute objects.""" - - if isinstance(name, (Type, TypeAttribute)): - assert name.policy == qpol_policy - return name - - qpol_symbol = _symbol_lookup(qpol_policy, name) - - if qpol_symbol.isalias(qpol_policy) and not deref: - raise TypeError("{0} is an alias.".format(qpol_symbol.name(qpol_policy))) - - if qpol_symbol.isattr(qpol_policy): - return TypeAttribute(qpol_policy, qpol_symbol) - else: - return Type(qpol_policy, qpol_symbol) - - -class BaseType(symbol.PolicySymbol): - - """Type/attribute base class.""" - - @property - def ispermissive(self): - raise NotImplementedError - - def expand(self): - """Generator that expands this attribute into its member types.""" - raise NotImplementedError - - def attributes(self): - """Generator that yields all attributes for this type.""" - raise NotImplementedError - - def aliases(self): - """Generator that yields all aliases for this type.""" - raise NotImplementedError - - -class Type(BaseType): - - """A type.""" - - @property - def ispermissive(self): - """(T/F) the type is permissive.""" - return self.qpol_symbol.ispermissive(self.policy) - - def expand(self): - """Generator that expands this into its member types.""" - yield self - - def attributes(self): - """Generator that yields all attributes for this type.""" - for attr in self.qpol_symbol.attr_iter(self.policy): - yield attribute_factory(self.policy, attr) - - def aliases(self): - """Generator that yields all aliases for this type.""" - for alias in self.qpol_symbol.alias_iter(self.policy): - yield alias - - def statement(self): - attrs = list(self.attributes()) - aliases = list(self.aliases()) - stmt = "type {0}".format(self) - if aliases: - if len(aliases) > 1: - stmt += " alias {{ {0} }}".format(' '.join(aliases)) - else: - stmt += " alias {0}".format(aliases[0]) - for attr in attrs: - stmt += ", {0}".format(attr) - stmt += ";" - return stmt - - -class TypeAttribute(BaseType): - - """An attribute.""" - - def __contains__(self, other): - for type_ in self.expand(): - if other == type_: - return True - - return False - - def expand(self): - """Generator that expands this attribute into its member types.""" - for type_ in self.qpol_symbol.type_iter(self.policy): - yield type_factory(self.policy, type_) - - def attributes(self): - """Generator that yields all attributes for this type.""" - raise TypeError("{0} is an attribute, thus does not have attributes.".format(self)) - - def aliases(self): - """Generator that yields all aliases for this type.""" - raise TypeError("{0} is an attribute, thus does not have aliases.".format(self)) - - @property - def ispermissive(self): - """(T/F) the type is permissive.""" - raise TypeError("{0} is an attribute, thus cannot be permissive.".format(self)) - - def statement(self): - return "attribute {0};".format(self) diff --git a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/user.py b/lib/python2.7/site-packages/setoolsgui/setools/policyrep/user.py deleted file mode 100644 index 94f81bc..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/policyrep/user.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2014, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -from . import exception -from . import qpol -from . import role -from . import mls -from . import symbol - - -def user_factory(qpol_policy, name): - """Factory function for creating User objects.""" - - if isinstance(name, User): - assert name.policy == qpol_policy - return name - elif isinstance(name, qpol.qpol_user_t): - return User(qpol_policy, name) - - try: - return User(qpol_policy, qpol.qpol_user_t(qpol_policy, str(name))) - except ValueError: - raise exception.InvalidUser("{0} is not a valid user".format(name)) - - -class User(symbol.PolicySymbol): - - """A user.""" - - @property - def roles(self): - """The user's set of roles.""" - - roleset = set() - - for role_ in self.qpol_symbol.role_iter(self.policy): - item = role.role_factory(self.policy, role_) - - # object_r is implicitly added to all roles by the compiler. - # technically it is incorrect to skip it, but policy writers - # and analysts don't expect to see it in results, and it - # will confuse, especially for role set equality user queries. - if item != "object_r": - roleset.add(item) - - return roleset - - @property - def mls_level(self): - """The user's default MLS level.""" - return mls.level_factory(self.policy, self.qpol_symbol.dfltlevel(self.policy)) - - @property - def mls_range(self): - """The user's MLS range.""" - return mls.range_factory(self.policy, self.qpol_symbol.range(self.policy)) - - def statement(self): - roles = list(str(r) for r in self.roles) - stmt = "user {0} roles ".format(self) - if len(roles) > 1: - stmt += "{{ {0} }}".format(' '.join(roles)) - else: - stmt += roles[0] - - try: - stmt += " level {0.mls_level} range {0.mls_range};".format(self) - except exception.MLSDisabled: - stmt += ";" - - return stmt diff --git a/lib/python2.7/site-packages/setoolsgui/setools/portconquery.py b/lib/python2.7/site-packages/setoolsgui/setools/portconquery.py deleted file mode 100644 index 798a828..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/portconquery.py +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -from socket import IPPROTO_TCP, IPPROTO_UDP - -from . import contextquery -from .policyrep.netcontext import port_range - - -class PortconQuery(contextquery.ContextQuery): - - """ - Port context query. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - protocol The protocol to match (socket.IPPROTO_TCP for - TCP or socket.IPPROTO_UDP for UDP) - - ports A 2-tuple of the port range to match. (Set both to - the same value for a single port) - ports_subset If true, the criteria will match if it is a subset - of the portcon's range. - ports_overlap If true, the criteria will match if it overlaps - any of the portcon's range. - ports_superset If true, the criteria will match if it is a superset - of the portcon's range. - ports_proper If true, use proper superset/subset operations. - No effect if not using set operations. - - user The criteria to match the context's user. - user_regex If true, regular expression matching - will be used on the user. - - role The criteria to match the context's role. - role_regex If true, regular expression matching - will be used on the role. - - type_ The criteria to match the context's type. - type_regex If true, regular expression matching - will be used on the type. - - range_ The criteria to match the context's range. - range_subset If true, the criteria will match if it is a subset - of the context's range. - range_overlap If true, the criteria will match if it overlaps - any of the context's range. - range_superset If true, the criteria will match if it is a superset - of the context's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - _protocol = None - _ports = None - ports_subset = False - ports_overlap = False - ports_superset = False - ports_proper = False - - @property - def ports(self): - return self._ports - - @ports.setter - def ports(self, value): - pending_ports = port_range(*value) - - if all(pending_ports): - if pending_ports.low < 1 or pending_ports.high < 1: - raise ValueError("Port numbers must be positive: {0.low}-{0.high}". - format(pending_ports)) - - if pending_ports.low > pending_ports.high: - raise ValueError( - "The low port must be smaller than the high port: {0.low}-{0.high}". - format(pending_ports)) - - self._ports = pending_ports - else: - self._ports = None - - @property - def protocol(self): - return self._protocol - - @protocol.setter - def protocol(self, value): - if value: - if not (value == IPPROTO_TCP or value == IPPROTO_UDP): - raise ValueError( - "The protocol must be {0} for TCP or {1} for UDP.". - format(IPPROTO_TCP, IPPROTO_UDP)) - - self._protocol = value - else: - self._protocol = None - - def results(self): - """Generator which yields all matching portcons.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Ports: {0.ports}, overlap: {0.ports_overlap}, " - "subset: {0.ports_subset}, superset: {0.ports_superset}, " - "proper: {0.ports_proper}".format(self)) - self.log.debug("User: {0.user!r}, regex: {0.user_regex}".format(self)) - self.log.debug("Role: {0.role!r}, regex: {0.role_regex}".format(self)) - self.log.debug("Type: {0.type_!r}, regex: {0.type_regex}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for portcon in self.policy.portcons(): - - if self.ports and not self._match_range( - portcon.ports, - self.ports, - self.ports_subset, - self.ports_overlap, - self.ports_superset, - self.ports_proper): - continue - - if self.protocol and self.protocol != portcon.protocol: - continue - - if not self._match_context(portcon.context): - continue - - yield portcon diff --git a/lib/python2.7/site-packages/setoolsgui/setools/query.py b/lib/python2.7/site-packages/setoolsgui/setools/query.py deleted file mode 100644 index 358a095..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/query.py +++ /dev/null @@ -1,192 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - - -class PolicyQuery(object): - - """Base class for SELinux policy queries.""" - - def __init__(self, policy, **kwargs): - self.log = logging.getLogger(self.__class__.__name__) - - self.policy = policy - - # keys are sorted in reverse order so regex settings - # are set before the criteria, e.g. name_regex - # is set before name. This ensures correct behavior - # since the criteria descriptors are sensitve to - # regex settings. - for name in sorted(kwargs.keys(), reverse=True): - attr = getattr(self, name, None) # None is not callable - if callable(attr): - raise ValueError("Keyword parameter {0} conflicts with a callable.".format(name)) - - setattr(self, name, kwargs[name]) - - @staticmethod - def _match_regex(obj, criteria, regex): - """ - Match the object with optional regular expression. - - Parameters: - obj The object to match. - criteria The criteria to match. - regex If regular expression matching should be used. - """ - - if regex: - return bool(criteria.search(str(obj))) - else: - return obj == criteria - - @staticmethod - def _match_set(obj, criteria, equal): - """ - Match the object (a set) with optional set equality. - - Parameters: - obj The object to match. (a set) - criteria The criteria to match. (a set) - equal If set equality should be used. Otherwise - any set intersection will match. - """ - - if equal: - return obj == criteria - else: - return bool(obj.intersection(criteria)) - - @staticmethod - def _match_in_set(obj, criteria, regex): - """ - Match if the criteria is in the list, with optional - regular expression matching. - - Parameters: - obj The object to match. - criteria The criteria to match. - regex If regular expression matching should be used. - """ - - if regex: - return [m for m in obj if criteria.search(str(m))] - else: - return criteria in obj - - @staticmethod - def _match_indirect_regex(obj, criteria, indirect, regex): - """ - Match the object with optional regular expression and indirection. - - Parameters: - obj The object to match. - criteria The criteria to match. - regex If regular expression matching should be used. - indirect If object indirection should be used, e.g. - expanding an attribute. - """ - - if indirect: - return PolicyQuery._match_in_set((obj.expand()), criteria, regex) - else: - return PolicyQuery._match_regex(obj, criteria, regex) - - @staticmethod - def _match_regex_or_set(obj, criteria, equal, regex): - """ - Match the object (a set) with either set comparisons - (equality or intersection) or by regex matching of the - set members. Regular expression matching will override - the set equality option. - - Parameters: - obj The object to match. (a set) - criteria The criteria to match. - equal If set equality should be used. Otherwise - any set intersection will match. Ignored - if regular expression matching is used. - regex If regular expression matching should be used. - """ - - if regex: - return [m for m in obj if criteria.search(str(m))] - else: - return PolicyQuery._match_set(obj, set(criteria), equal) - - @staticmethod - def _match_range(obj, criteria, subset, overlap, superset, proper): - """ - Match ranges of objects. - - obj An object with attributes named "low" and "high", representing the range. - criteria An object with attributes named "low" and "high", representing the criteria. - subset If true, the criteria will match if it is a subset obj's range. - overlap If true, the criteria will match if it overlaps any of the obj's range. - superset If true, the criteria will match if it is a superset of the obj's range. - proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - if overlap: - return ((obj.low <= criteria.low <= obj.high) or ( - obj.low <= criteria.high <= obj.high) or ( - criteria.low <= obj.low and obj.high <= criteria.high)) - elif subset: - if proper: - return ((obj.low < criteria.low and criteria.high <= obj.high) or ( - obj.low <= criteria.low and criteria.high < obj.high)) - else: - return obj.low <= criteria.low and criteria.high <= obj.high - elif superset: - if proper: - return ((criteria.low < obj.low and obj.high <= criteria.high) or ( - criteria.low <= obj.low and obj.high < criteria.high)) - else: - return (criteria.low <= obj.low and obj.high <= criteria.high) - else: - return criteria.low == obj.low and obj.high == criteria.high - - @staticmethod - def _match_level(obj, criteria, dom, domby, incomp): - """ - Match the an MLS level. - - obj The level to match. - criteria The criteria to match. (a level) - dom If true, the criteria will match if it dominates obj. - domby If true, the criteria will match if it is dominated by obj. - incomp If true, the criteria will match if it is incomparable to obj. - """ - - if dom: - return (criteria >= obj) - elif domby: - return (criteria <= obj) - elif incomp: - return (criteria ^ obj) - else: - return (criteria == obj) - - def results(self): - """ - Generator which returns the matches for the query. This method - should be overridden by subclasses. - """ - raise NotImplementedError diff --git a/lib/python2.7/site-packages/setoolsgui/setools/rbacrulequery.py b/lib/python2.7/site-packages/setoolsgui/setools/rbacrulequery.py deleted file mode 100644 index 240b921..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/rbacrulequery.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import mixins, query -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor, RuletypeDescriptor -from .policyrep.exception import InvalidType, RuleUseError - - -class RBACRuleQuery(mixins.MatchObjClass, query.PolicyQuery): - - """ - Query the RBAC rules. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - ruletype The list of rule type(s) to match. - source The name of the source role/attribute to match. - source_indirect If true, members of an attribute will be - matched rather than the attribute itself. - source_regex If true, regular expression matching will - be used on the source role/attribute. - Obeys the source_indirect option. - target The name of the target role/attribute to match. - target_indirect If true, members of an attribute will be - matched rather than the attribute itself. - target_regex If true, regular expression matching will - be used on the target role/attribute. - Obeys target_indirect option. - tclass The object class(es) to match. - tclass_regex If true, use a regular expression for - matching the rule's object class. - default The name of the default role to match. - default_regex If true, regular expression matching will - be used on the default role. - """ - - ruletype = RuletypeDescriptor("validate_rbac_ruletype") - source = CriteriaDescriptor("source_regex", "lookup_role") - source_regex = False - source_indirect = True - _target = None - target_regex = False - target_indirect = True - tclass = CriteriaSetDescriptor("tclass_regex", "lookup_class") - tclass_regex = False - default = CriteriaDescriptor("default_regex", "lookup_role") - default_regex = False - - @property - def target(self): - return self._target - - @target.setter - def target(self, value): - if not value: - self._target = None - elif self.target_regex: - self._target = re.compile(value) - else: - try: - self._target = self.policy.lookup_type_or_attr(value) - except InvalidType: - self._target = self.policy.lookup_role(value) - - def results(self): - """Generator which yields all matching RBAC rules.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Ruletypes: {0.ruletype}".format(self)) - self.log.debug("Source: {0.source!r}, indirect: {0.source_indirect}, " - "regex: {0.source_regex}".format(self)) - self.log.debug("Target: {0.target!r}, indirect: {0.target_indirect}, " - "regex: {0.target_regex}".format(self)) - self.log.debug("Class: {0.tclass!r}, regex: {0.tclass_regex}".format(self)) - self.log.debug("Default: {0.default!r}, regex: {0.default_regex}".format(self)) - - for rule in self.policy.rbacrules(): - # - # Matching on rule type - # - if self.ruletype: - if rule.ruletype not in self.ruletype: - continue - - # - # Matching on source role - # - if self.source and not self._match_indirect_regex( - rule.source, - self.source, - self.source_indirect, - self.source_regex): - continue - - # - # Matching on target type (role_transition)/role(allow) - # - if self.target and not self._match_indirect_regex( - rule.target, - self.target, - self.target_indirect, - self.target_regex): - continue - - # - # Matching on object class - # - try: - if not self._match_object_class(rule): - continue - except RuleUseError: - continue - - # - # Matching on default role - # - if self.default: - try: - if not self._match_regex( - rule.default, - self.default, - self.default_regex): - continue - except RuleUseError: - continue - - # if we get here, we have matched all available criteria - yield rule diff --git a/lib/python2.7/site-packages/setoolsgui/setools/rolequery.py b/lib/python2.7/site-packages/setoolsgui/setools/rolequery.py deleted file mode 100644 index e95dfa6..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/rolequery.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import compquery -from .descriptors import CriteriaSetDescriptor - - -class RoleQuery(compquery.ComponentQuery): - - """ - Query SELinux policy roles. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The role name to match. - name_regex If true, regular expression matching - will be used on the role names. - types The type to match. - types_equal If true, only roles with type sets - that are equal to the criteria will - match. Otherwise, any intersection - will match. - types_regex If true, regular expression matching - will be used on the type names instead - of set logic. - """ - - types = CriteriaSetDescriptor("types_regex", "lookup_type") - types_equal = False - types_regex = False - - def results(self): - """Generator which yields all matching roles.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Types: {0.types!r}, regex: {0.types_regex}, " - "eq: {0.types_equal}".format(self)) - - for r in self.policy.roles(): - if r == "object_r": - # all types are implicitly added to object_r by the compiler. - # technically it is incorrect to skip it, but policy writers - # and analysts don't expect to see it in results, and it - # will confuse, especially for set equality type queries. - continue - - if not self._match_name(r): - continue - - if self.types and not self._match_regex_or_set( - set(r.types()), - self.types, - self.types_equal, - self.types_regex): - continue - - yield r diff --git a/lib/python2.7/site-packages/setoolsgui/setools/sensitivityquery.py b/lib/python2.7/site-packages/setoolsgui/setools/sensitivityquery.py deleted file mode 100644 index a102836..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/sensitivityquery.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging - -from . import compquery -from . import mixins -from .descriptors import CriteriaDescriptor - - -class SensitivityQuery(mixins.MatchAlias, compquery.ComponentQuery): - - """ - Query MLS Sensitivities - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The name of the category to match. - name_regex If true, regular expression matching will - be used for matching the name. - alias The alias name to match. - alias_regex If true, regular expression matching - will be used on the alias names. - sens The criteria to match the sensitivity by dominance. - sens_dom If true, the criteria will match if it dominates - the sensitivity. - sens_domby If true, the criteria will match if it is dominated - by the sensitivity. - """ - - sens = CriteriaDescriptor(lookup_function="lookup_sensitivity") - sens_dom = False - sens_domby = False - - def results(self): - """Generator which yields all matching sensitivities.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Alias: {0.alias}, regex: {0.alias_regex}".format(self)) - self.log.debug("Sens: {0.sens!r}, dom: {0.sens_dom}, domby: {0.sens_domby}".format(self)) - - for s in self.policy.sensitivities(): - if not self._match_name(s): - continue - - if not self._match_alias(s): - continue - - if self.sens and not self._match_level( - s, - self.sens, - self.sens_dom, - self.sens_domby, - False): - continue - - yield s diff --git a/lib/python2.7/site-packages/setoolsgui/setools/terulequery.py b/lib/python2.7/site-packages/setoolsgui/setools/terulequery.py deleted file mode 100644 index 7f3eccf..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/terulequery.py +++ /dev/null @@ -1,178 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import mixins, query -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor, RuletypeDescriptor -from .policyrep.exception import RuleUseError, RuleNotConditional - - -class TERuleQuery(mixins.MatchObjClass, mixins.MatchPermission, query.PolicyQuery): - - """ - Query the Type Enforcement rules. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - ruletype The list of rule type(s) to match. - source The name of the source type/attribute to match. - source_indirect If true, members of an attribute will be - matched rather than the attribute itself. - Default is true. - source_regex If true, regular expression matching will - be used on the source type/attribute. - Obeys the source_indirect option. - Default is false. - target The name of the target type/attribute to match. - target_indirect If true, members of an attribute will be - matched rather than the attribute itself. - Default is true. - target_regex If true, regular expression matching will - be used on the target type/attribute. - Obeys target_indirect option. - Default is false. - tclass The object class(es) to match. - tclass_regex If true, use a regular expression for - matching the rule's object class. - Default is false. - perms The set of permission(s) to match. - perms_equal If true, the permission set of the rule - must exactly match the permissions - criteria. If false, any set intersection - will match. - Default is false. - perms_regex If true, regular expression matching will be used - on the permission names instead of set logic. - default The name of the default type to match. - default_regex If true, regular expression matching will be - used on the default type. - Default is false. - boolean The set of boolean(s) to match. - boolean_regex If true, regular expression matching will be - used on the booleans. - Default is false. - boolean_equal If true, the booleans in the conditional - expression of the rule must exactly match the - criteria. If false, any set intersection - will match. Default is false. - """ - - ruletype = RuletypeDescriptor("validate_te_ruletype") - source = CriteriaDescriptor("source_regex", "lookup_type_or_attr") - source_regex = False - source_indirect = True - target = CriteriaDescriptor("target_regex", "lookup_type_or_attr") - target_regex = False - target_indirect = True - default = CriteriaDescriptor("default_regex", "lookup_type") - default_regex = False - boolean = CriteriaSetDescriptor("boolean_regex", "lookup_boolean") - boolean_regex = False - boolean_equal = False - - def results(self): - """Generator which yields all matching TE rules.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Ruletypes: {0.ruletype}".format(self)) - self.log.debug("Source: {0.source!r}, indirect: {0.source_indirect}, " - "regex: {0.source_regex}".format(self)) - self.log.debug("Target: {0.target!r}, indirect: {0.target_indirect}, " - "regex: {0.target_regex}".format(self)) - self.log.debug("Class: {0.tclass!r}, regex: {0.tclass_regex}".format(self)) - self.log.debug("Perms: {0.perms!r}, regex: {0.perms_regex}, eq: {0.perms_equal}". - format(self)) - self.log.debug("Default: {0.default!r}, regex: {0.default_regex}".format(self)) - self.log.debug("Boolean: {0.boolean!r}, eq: {0.boolean_equal}, " - "regex: {0.boolean_regex}".format(self)) - - for rule in self.policy.terules(): - # - # Matching on rule type - # - if self.ruletype: - if rule.ruletype not in self.ruletype: - continue - - # - # Matching on source type - # - if self.source and not self._match_indirect_regex( - rule.source, - self.source, - self.source_indirect, - self.source_regex): - continue - - # - # Matching on target type - # - if self.target and not self._match_indirect_regex( - rule.target, - self.target, - self.target_indirect, - self.target_regex): - continue - - # - # Matching on object class - # - if not self._match_object_class(rule): - continue - - # - # Matching on permission set - # - try: - if not self._match_perms(rule): - continue - except RuleUseError: - continue - - # - # Matching on default type - # - if self.default: - try: - if not self._match_regex( - rule.default, - self.default, - self.default_regex): - continue - except RuleUseError: - continue - - # - # Match on Boolean in conditional expression - # - if self.boolean: - try: - if not self._match_regex_or_set( - rule.conditional.booleans, - self.boolean, - self.boolean_equal, - self.boolean_regex): - continue - except RuleNotConditional: - continue - - # if we get here, we have matched all available criteria - yield rule diff --git a/lib/python2.7/site-packages/setoolsgui/setools/typeattrquery.py b/lib/python2.7/site-packages/setoolsgui/setools/typeattrquery.py deleted file mode 100644 index a91026c..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/typeattrquery.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import compquery -from .descriptors import CriteriaSetDescriptor - - -class TypeAttributeQuery(compquery.ComponentQuery): - - """ - Query SELinux policy type attributes. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The type name to match. - name_regex If true, regular expression matching - will be used on the type names. - types The type to match. - types_equal If true, only attributes with type sets - that are equal to the criteria will - match. Otherwise, any intersection - will match. - types_regex If true, regular expression matching - will be used on the type names instead - of set logic. - """ - - types = CriteriaSetDescriptor("types_regex", "lookup_type") - types_equal = False - types_regex = False - - def results(self): - """Generator which yields all matching types.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Types: {0.types!r}, regex: {0.types_regex}, " - "eq: {0.types_equal}".format(self)) - - for attr in self.policy.typeattributes(): - if not self._match_name(attr): - continue - - if self.types and not self._match_regex_or_set( - set(attr.expand()), - self.types, - self.types_equal, - self.types_regex): - continue - - yield attr diff --git a/lib/python2.7/site-packages/setoolsgui/setools/typequery.py b/lib/python2.7/site-packages/setoolsgui/setools/typequery.py deleted file mode 100644 index 6634f76..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/typequery.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import compquery -from . import mixins -from .descriptors import CriteriaSetDescriptor - - -class TypeQuery(mixins.MatchAlias, compquery.ComponentQuery): - - """ - Query SELinux policy types. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The type name to match. - name_regex If true, regular expression matching - will be used on the type names. - alias The alias name to match. - alias_regex If true, regular expression matching - will be used on the alias names. - attrs The attribute to match. - attrs_equal If true, only types with attribute sets - that are equal to the criteria will - match. Otherwise, any intersection - will match. - attrs_regex If true, regular expression matching - will be used on the attribute names instead - of set logic. - permissive The permissive state to match. If this - is None, the state is not matched. - """ - - attrs = CriteriaSetDescriptor("attrs_regex", "lookup_typeattr") - attrs_regex = False - attrs_equal = False - _permissive = None - - @property - def permissive(self): - return self._permissive - - @permissive.setter - def permissive(self, value): - if value is None: - self._permissive = None - else: - self._permissive = bool(value) - - def results(self): - """Generator which yields all matching types.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Alias: {0.alias}, regex: {0.alias_regex}".format(self)) - self.log.debug("Attrs: {0.attrs!r}, regex: {0.attrs_regex}, " - "eq: {0.attrs_equal}".format(self)) - self.log.debug("Permissive: {0.permissive}".format(self)) - - for t in self.policy.types(): - if not self._match_name(t): - continue - - if not self._match_alias(t): - continue - - if self.attrs and not self._match_regex_or_set( - set(t.attributes()), - self.attrs, - self.attrs_equal, - self.attrs_regex): - continue - - if self.permissive is not None and t.ispermissive != self.permissive: - continue - - yield t diff --git a/lib/python2.7/site-packages/setoolsgui/setools/userquery.py b/lib/python2.7/site-packages/setoolsgui/setools/userquery.py deleted file mode 100644 index 00910cf..0000000 --- a/lib/python2.7/site-packages/setoolsgui/setools/userquery.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright 2014-2015, Tresys Technology, LLC -# -# This file is part of SETools. -# -# SETools is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of -# the License, or (at your option) any later version. -# -# SETools is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SETools. If not, see -# <http://www.gnu.org/licenses/>. -# -import logging -import re - -from . import compquery -from .descriptors import CriteriaDescriptor, CriteriaSetDescriptor - - -class UserQuery(compquery.ComponentQuery): - - """ - Query SELinux policy users. - - Parameter: - policy The policy to query. - - Keyword Parameters/Class attributes: - name The user name to match. - name_regex If true, regular expression matching - will be used on the user names. - roles The attribute to match. - roles_equal If true, only types with role sets - that are equal to the criteria will - match. Otherwise, any intersection - will match. - roles_regex If true, regular expression matching - will be used on the role names instead - of set logic. - level The criteria to match the user's default level. - level_dom If true, the criteria will match if it dominates - the user's default level. - level_domby If true, the criteria will match if it is dominated - by the user's default level. - level_incomp If true, the criteria will match if it is incomparable - to the user's default level. - range_ The criteria to match the user's range. - range_subset If true, the criteria will match if it is a subset - of the user's range. - range_overlap If true, the criteria will match if it overlaps - any of the user's range. - range_superset If true, the criteria will match if it is a superset - of the user's range. - range_proper If true, use proper superset/subset operations. - No effect if not using set operations. - """ - - level = CriteriaDescriptor(lookup_function="lookup_level") - level_dom = False - level_domby = False - level_incomp = False - range_ = CriteriaDescriptor(lookup_function="lookup_range") - range_overlap = False - range_subset = False - range_superset = False - range_proper = False - roles = CriteriaSetDescriptor("roles_regex", "lookup_role") - roles_equal = False - roles_regex = False - - def results(self): - """Generator which yields all matching users.""" - self.log.info("Generating results from {0.policy}".format(self)) - self.log.debug("Name: {0.name!r}, regex: {0.name_regex}".format(self)) - self.log.debug("Roles: {0.roles!r}, regex: {0.roles_regex}, " - "eq: {0.roles_equal}".format(self)) - self.log.debug("Level: {0.level!r}, dom: {0.level_dom}, domby: {0.level_domby}, " - "incomp: {0.level_incomp}".format(self)) - self.log.debug("Range: {0.range_!r}, subset: {0.range_subset}, overlap: {0.range_overlap}, " - "superset: {0.range_superset}, proper: {0.range_proper}".format(self)) - - for user in self.policy.users(): - if not self._match_name(user): - continue - - if self.roles and not self._match_regex_or_set( - user.roles, - self.roles, - self.roles_equal, - self.roles_regex): - continue - - if self.level and not self._match_level( - user.mls_level, - self.level, - self.level_dom, - self.level_domby, - self.level_incomp): - continue - - if self.range_ and not self._match_range( - user.mls_range, - self.range_, - self.range_subset, - self.range_overlap, - self.range_superset, - self.range_proper): - continue - - yield user |