Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion Simulator/Connections/Neuro/ConnStatic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,31 @@ void ConnStatic::printParameters() const
void ConnStatic::registerHistoryVariables()
{
// Register the following variables to be recorded
// Note: There may be potential duplicate weight, source, destination vertices
Recorder &recorder = Simulator::getInstance().getModel().getRecorder();
recorder.registerVariable("weight", WCurrentEpoch_, Recorder::UpdatedType::DYNAMIC);
recorder.registerVariable("sourceVertex", sourceVertexIndexCurrentEpoch_,
Recorder::UpdatedType::DYNAMIC);
recorder.registerVariable("destinationVertex", destVertexIndexCurrentEpoch_,
Recorder::UpdatedType::DYNAMIC);
}

bool ConnStatic::updateConnections()
{
Comment on lines +104 to +105

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In particular, see my questions attached to the UpdateConnections() method. A unit test should be able to verify that the ConnStatic data members are indeed copies of those from the Edge class.

AllEdges &edges = getEdges();
const vector<unsigned char> &inUse = edges.getInUse();
const vector<BGFLOAT> &weights = edges.getWeights();
const vector<int> &sourceVertices = edges.getSourceVertexIndices();
const vector<int> &destVertices = edges.getDestVertexIndices();

// Copy one value per active edge into parallel recorder vectors.
// weight/source/destination entries at the same index describe the same edge.
for (BGSIZE iEdg = 0; iEdg < inUse.size(); iEdg++) {
if (inUse[iEdg]) {
WCurrentEpoch_.push_back(weights[iEdg]);
sourceVertexIndexCurrentEpoch_.push_back(sourceVertices[iEdg]);
destVertexIndexCurrentEpoch_.push_back(destVertices[iEdg]);
Comment on lines +116 to +118

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two questions:

  1. Why not record the originals in the Edge class?
  2. Alternatively, if it is desirable to copy them to ConnStatic each epoch, I think it will be necessary to first clear the three ConnStatic data members before starting the copy.

Use the CoPilot unit test skill to generate unit tests for this. It should catch the case where these aren't cleared and so aren't copies. Actually, can't you just use the assignment operator, std::copy(), or `vector::assign()?

}
}

return false;
}
Comment on lines +104 to +123

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a comment to indicate that this doesn't ensure data consistency between GPU and CPU. Currently, there is no GPU STDP implementation.

3 changes: 3 additions & 0 deletions Simulator/Connections/Neuro/ConnStatic.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ class ConnStatic : public Connections {
/// Registers history variables for recording during simulation
virtual void registerHistoryVariables() override;

/// Populates edge history variables for recording during the current epoch.
virtual bool updateConnections() override;

/// Get array of vertex weights
const vector<BGFLOAT> &getWCurrentEpoch() const
{
Expand Down
26 changes: 25 additions & 1 deletion Simulator/Edges/AllEdges.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,30 @@ class AllEdges {
/// Populate a edge index map.
virtual void createEdgeIndexMap(EdgeIndexMap &edgeIndexMap);

/// Get array of source vertex indices.
const vector<int> &getSourceVertexIndices() const
{
return sourceVertexIndex_;
}

/// Get array of destination vertex indices.
const vector<int> &getDestVertexIndices() const
{
return destVertexIndex_;
}

/// Get array of edge weights.
const vector<BGFLOAT> &getWeights() const
{
return W_;
}

/// Get array of active edge flags.
const vector<unsigned char> &getInUse() const
{
return inUse_;
}

/// Cereal serialization method
template <class Archive> void serialize(Archive &archive);

Expand Down Expand Up @@ -253,4 +277,4 @@ template <class Archive> void AllEdges::serialize(Archive &archive)
cereal::make_nvp("totalEdgeCount", totalEdgeCount_),
cereal::make_nvp("maxEdgesPerVertex", maxEdgesPerVertex_),
cereal::make_nvp("countVertices", countVertices_));
}
}
Loading