7 #include "imstkPbdConstraintContainer.h" 8 #include "imstkGraph.h" 10 #include <unordered_map> 38 auto removeConstraintFunc = [&](std::shared_ptr<PbdConstraint> constraint)
42 if (pid.first == bodyId && vertices->find(pid.second) != vertices->end())
57 pc.erase(std::remove_if(pc.begin(), pc.end(), removeConstraintFunc), pc.end());
63 PbdConstraintContainer::iterator
72 PbdConstraintContainer::const_iterator
85 std::vector<std::shared_ptr<PbdConstraint>>& allConstraints =
m_constraints;
89 std::unordered_map<size_t, std::vector<size_t>> vertexConstraints;
90 for (
size_t constrIdx = 0; constrIdx < allConstraints.size(); ++constrIdx)
92 const auto& constr = allConstraints[constrIdx];
93 for (
const auto& vIds : constr->getParticles())
95 vertexConstraints[vIds.second].push_back(constrIdx);
101 Graph constraintGraph(allConstraints.size());
102 for (
const auto& kv : vertexConstraints)
104 const auto& constraints = kv.second;
105 for (
size_t i = 0; i < constraints.size(); ++i)
107 for (
size_t j = i + 1; j < constraints.size(); ++j)
109 constraintGraph.
addEdge(constraints[i], constraints[j]);
113 vertexConstraints.clear();
116 const auto coloring = constraintGraph.doColoring(Graph::ColoringMethod::WelshPowell);
118 const auto& partitionIndices = coloring.first;
119 const auto numPartitions = coloring.second;
120 assert(partitionIndices.size() == allConstraints.size());
123 partitionedConstraints.resize(0);
124 partitionedConstraints.resize(static_cast<size_t>(numPartitions));
126 for (
size_t constrIdx = 0; constrIdx < partitionIndices.size(); ++constrIdx)
128 const auto partitionIdx = partitionIndices[constrIdx];
129 partitionedConstraints[partitionIdx].push_back(allConstraints[constrIdx]);
135 allConstraints.resize(0);
136 for (
const auto& constraints : partitionedConstraints)
138 if (constraints.size() < partitionedThreshold)
140 for (
size_t constrIdx = 0; constrIdx < constraints.size(); ++constrIdx)
142 allConstraints.push_back(std::move(constraints[constrIdx]));
149 for (
size_t readIdx = 0; readIdx < partitionedConstraints.size(); ++readIdx)
151 if (partitionedConstraints[readIdx].size() >= partitionedThreshold)
153 if (readIdx != writeIdx)
155 partitionedConstraints[writeIdx] = std::move(partitionedConstraints[readIdx]);
160 partitionedConstraints.resize(writeIdx);
void unlock()
End a thread-safe region.
std::vector< std::shared_ptr< PbdConstraint > > m_constraints
Not partitioned constraints.
std::pair< int, int > PbdParticleId
Index pair that refers to a particle in a PbdState. Index 0 is the body id, Index 1 is the particle i...
std::vector< std::vector< std::shared_ptr< PbdConstraint > > > m_partitionedConstraints
Partitioned pbd constraints.
virtual iterator eraseConstraint(iterator iter)
Removes a constraint from the system by iterator, thread safe.
ParallelUtils::SpinLock m_constraintLock
Used to deal with concurrent addition/removal of constraints.
void lock()
Start a thread-safe region, where only one thread can execute at a time until a call to the unlock fu...
class to represent a graph object
virtual void removeConstraints(std::shared_ptr< std::unordered_set< size_t >> vertices, const int bodyId)
Removes all constraints associated with vertex ids.
virtual void removeConstraint(std::shared_ptr< PbdConstraint > constraint)
Linear searches for and removes a constraint from the system, thread safe.
virtual void addConstraint(std::shared_ptr< PbdConstraint > constraint)
Adds a constraint to the system, thread safe.
void addEdge(const size_t v, const size_t w)
Add edge to the graph.
void partitionConstraints(const int partitionThreshold)
Partitions pbd constraints into separate vectors via graph coloring.