mirror of
https://github.com/gonum/gonum.git
synced 2025-09-27 03:26:04 +08:00

Changes made in dsp/fourier/internal/fftpack break the formatting used there, so these are reverted. There will be complaints in CI. [git-generate] gofmt -w . go generate gonum.org/v1/gonum/blas go generate gonum.org/v1/gonum/blas/gonum go generate gonum.org/v1/gonum/unit go generate gonum.org/v1/gonum/unit/constant go generate gonum.org/v1/gonum/graph/formats/dot go generate gonum.org/v1/gonum/graph/formats/rdf go generate gonum.org/v1/gonum/stat/card git checkout -- dsp/fourier/internal/fftpack
227 lines
4.6 KiB
Go
227 lines
4.6 KiB
Go
// Copyright ©2014 The Gonum Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package set
|
|
|
|
import "gonum.org/v1/gonum/graph"
|
|
|
|
// Ints is a set of int identifiers.
|
|
type Ints map[int]struct{}
|
|
|
|
// The simple accessor methods for Ints are provided to allow ease of
|
|
// implementation change should the need arise.
|
|
|
|
// Add inserts an element into the set.
|
|
func (s Ints) Add(e int) {
|
|
s[e] = struct{}{}
|
|
}
|
|
|
|
// Has reports the existence of the element in the set.
|
|
func (s Ints) Has(e int) bool {
|
|
_, ok := s[e]
|
|
return ok
|
|
}
|
|
|
|
// Remove deletes the specified element from the set.
|
|
func (s Ints) Remove(e int) {
|
|
delete(s, e)
|
|
}
|
|
|
|
// Count reports the number of elements stored in the set.
|
|
func (s Ints) Count() int {
|
|
return len(s)
|
|
}
|
|
|
|
// IntsEqual reports set equality between the parameters. Sets are equal if
|
|
// and only if they have the same elements.
|
|
func IntsEqual(a, b Ints) bool {
|
|
if intsSame(a, b) {
|
|
return true
|
|
}
|
|
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for e := range a {
|
|
if _, ok := b[e]; !ok {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// Int64s is a set of int64 identifiers.
|
|
type Int64s map[int64]struct{}
|
|
|
|
// The simple accessor methods for Ints are provided to allow ease of
|
|
// implementation change should the need arise.
|
|
|
|
// Add inserts an element into the set.
|
|
func (s Int64s) Add(e int64) {
|
|
s[e] = struct{}{}
|
|
}
|
|
|
|
// Has reports the existence of the element in the set.
|
|
func (s Int64s) Has(e int64) bool {
|
|
_, ok := s[e]
|
|
return ok
|
|
}
|
|
|
|
// Remove deletes the specified element from the set.
|
|
func (s Int64s) Remove(e int64) {
|
|
delete(s, e)
|
|
}
|
|
|
|
// Count reports the number of elements stored in the set.
|
|
func (s Int64s) Count() int {
|
|
return len(s)
|
|
}
|
|
|
|
// Int64sEqual reports set equality between the parameters. Sets are equal if
|
|
// and only if they have the same elements.
|
|
func Int64sEqual(a, b Int64s) bool {
|
|
if int64sSame(a, b) {
|
|
return true
|
|
}
|
|
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for e := range a {
|
|
if _, ok := b[e]; !ok {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// Nodes is a set of nodes keyed in their integer identifiers.
|
|
type Nodes map[int64]graph.Node
|
|
|
|
// NewNodes returns a new Nodes.
|
|
func NewNodes() Nodes {
|
|
return make(Nodes)
|
|
}
|
|
|
|
// NewNodes returns a new Nodes with the given size hint, n.
|
|
func NewNodesSize(n int) Nodes {
|
|
return make(Nodes, n)
|
|
}
|
|
|
|
// The simple accessor methods for Nodes are provided to allow ease of
|
|
// implementation change should the need arise.
|
|
|
|
// Add inserts an element into the set.
|
|
func (s Nodes) Add(n graph.Node) {
|
|
s[n.ID()] = n
|
|
}
|
|
|
|
// Remove deletes the specified element from the set.
|
|
func (s Nodes) Remove(e graph.Node) {
|
|
delete(s, e.ID())
|
|
}
|
|
|
|
// Count returns the number of element in the set.
|
|
func (s Nodes) Count() int {
|
|
return len(s)
|
|
}
|
|
|
|
// Has reports the existence of the elements in the set.
|
|
func (s Nodes) Has(n graph.Node) bool {
|
|
_, ok := s[n.ID()]
|
|
return ok
|
|
}
|
|
|
|
// CloneNodes returns a clone of src.
|
|
func CloneNodes(src Nodes) Nodes {
|
|
dst := make(Nodes, len(src))
|
|
for e, n := range src {
|
|
dst[e] = n
|
|
}
|
|
return dst
|
|
}
|
|
|
|
// Equal reports set equality between the parameters. Sets are equal if
|
|
// and only if they have the same elements.
|
|
func Equal(a, b Nodes) bool {
|
|
if same(a, b) {
|
|
return true
|
|
}
|
|
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for e := range a {
|
|
if _, ok := b[e]; !ok {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// UnionOfNodes returns the union of a and b.
|
|
//
|
|
// The union of two sets, a and b, is the set containing all the
|
|
// elements of each, for instance:
|
|
//
|
|
// {a,b,c} UNION {d,e,f} = {a,b,c,d,e,f}
|
|
//
|
|
// Since sets may not have repetition, unions of two sets that overlap
|
|
// do not contain repeat elements, that is:
|
|
//
|
|
// {a,b,c} UNION {b,c,d} = {a,b,c,d}
|
|
func UnionOfNodes(a, b Nodes) Nodes {
|
|
if same(a, b) {
|
|
return CloneNodes(a)
|
|
}
|
|
|
|
dst := make(Nodes)
|
|
for e, n := range a {
|
|
dst[e] = n
|
|
}
|
|
for e, n := range b {
|
|
dst[e] = n
|
|
}
|
|
|
|
return dst
|
|
}
|
|
|
|
// IntersectionOfNodes returns the intersection of a and b.
|
|
//
|
|
// The intersection of two sets, a and b, is the set containing all
|
|
// the elements shared between the two sets, for instance:
|
|
//
|
|
// {a,b,c} INTERSECT {b,c,d} = {b,c}
|
|
//
|
|
// The intersection between a set and itself is itself, and thus
|
|
// effectively a copy operation:
|
|
//
|
|
// {a,b,c} INTERSECT {a,b,c} = {a,b,c}
|
|
//
|
|
// The intersection between two sets that share no elements is the empty
|
|
// set:
|
|
//
|
|
// {a,b,c} INTERSECT {d,e,f} = {}
|
|
func IntersectionOfNodes(a, b Nodes) Nodes {
|
|
if same(a, b) {
|
|
return CloneNodes(a)
|
|
}
|
|
dst := make(Nodes)
|
|
if len(a) > len(b) {
|
|
a, b = b, a
|
|
}
|
|
for e, n := range a {
|
|
if _, ok := b[e]; ok {
|
|
dst[e] = n
|
|
}
|
|
}
|
|
return dst
|
|
}
|