3#include "Array/ArrayList.h"
5#include <thrust/sort.h>
10 template<typename TDataType>
11 EdgeSet<TDataType>::EdgeSet()
15 template<typename TDataType>
16 EdgeSet<TDataType>::~EdgeSet()
22 __global__ void K_CountNumber(
24 DArray<TopologyModule::Edge> edges)
26 int eId = threadIdx.x + (blockIdx.x * blockDim.x);
27 if (eId >= edges.size()) return;
29 TopologyModule::Edge edge = edges[eId];
31 atomicAdd(&(num[edge[0]]), 1);
32 atomicAdd(&(num[edge[1]]), 1);
35 __global__ void K_StoreIds(
37 DArray<TopologyModule::Edge> edges)
39 int eId = threadIdx.x + (blockIdx.x * blockDim.x);
40 if (eId >= edges.size()) return;
42 TopologyModule::Edge edge = edges[eId];
46 ids[v0].atomicInsert(v1);
47 ids[v1].atomicInsert(v0);
50 template<typename TDataType>
51 void EdgeSet<TDataType>::requestPointNeighbors(DArrayList<int>& lists)
53 if (this->mCoords.isEmpty())
57 counts.resize(this->mCoords.size());
60 cuExecute(mEdges.size(),
67 cuExecute(mEdges.size(),
75 template<typename TDataType>
76 void EdgeSet<TDataType>::copyFrom(EdgeSet<TDataType>& edgeSet)
78 mEdges.resize(edgeSet.mEdges.size());
79 mEdges.assign(edgeSet.mEdges);
81 mVer2Edge.assign(edgeSet.mVer2Edge);
83 PointSet<TDataType>::copyFrom(edgeSet);
86 template<typename TDataType>
87 void EdgeSet<TDataType>::setEdges(std::vector<Edge>& edges)
94 template<typename TDataType>
95 void EdgeSet<TDataType>::setEdges(DArray<Edge>& edges)
97 mEdges.resize(edges.size());
100 this->tagAsChanged();
103 template<typename Edge>
104 __global__ void ES_CountEdges(
105 DArray<uint> counter,
108 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
109 if (tId >= edges.size()) return;
113 atomicAdd(&counter[t[0]], 1);
114 atomicAdd(&counter[t[1]], 1);
117 template<typename Edge>
118 __global__ void ES_SetupEdgeIds(
119 DArrayList<int> edgeIds,
122 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
123 if (tId >= edges.size()) return;
127 edgeIds[t[0]].atomicInsert(tId);
128 edgeIds[t[1]].atomicInsert(tId);
131 template<typename TDataType>
132 void EdgeSet<TDataType>::updateTopology()
136 //Update the vertex to edge mapping
137 DArray<uint> counter;
138 counter.resize(this->mCoords.size());
141 cuExecute(mEdges.size(),
146 mVer2Edge.resize(counter);
149 cuExecute(mEdges.size(),
156 PointSet<TDataType>::updateTopology();
159 template<typename TDataType>
160 bool EdgeSet<TDataType>::isEmpty()
162 return mEdges.size() == 0 && PointSet<TDataType>::isEmpty();
165 template<typename TDataType>
166 void EdgeSet<TDataType>::clear()
171 PointSet<TDataType>::clear();
174 DEFINE_CLASS(EdgeSet);