Skip to content

network/result_aggregation.cpp

Swarm response aggregation implementation. More...

Namespaces

Name
sgns
sgns::neoswarm
sgns::neoswarm::network

Detailed Description

Swarm response aggregation implementation.

Date: 2026-05-06

Source code

#include "result_aggregation.hpp"
#include "common/logging.hpp"

namespace sgns::neoswarm::network
{
    namespace
    {
        auto AggregationLogger()
        {
            return neoswarm::CreateLogger( "ResultAggregation" );
        }
    } // namespace

    ResultAggregation::ResultAggregation()
        : m_cfg( {} )
    {
    }
    ResultAggregation::ResultAggregation( Config cfg )
        : m_cfg( std::move( cfg ) )
    {
    }

    // -----------------------------------------------------------------------
    // Submit
    // -----------------------------------------------------------------------
    void ResultAggregation::Submit( const NodeOutput& output )
    {
        std::lock_guard<std::mutex> lock( m_mutex );
        if ( results_.size() >= m_cfg.max_responses_ )
        {
            return;
        }
        results_.push_back( output );
        AggregationLogger()->debug( "Received from {} ({}/{})", output.m_nodeId, results_.size(), m_cfg.max_responses_ );
        if ( results_.size() >= m_cfg.min_responses_ )
        {
            done_ = true;
            cv_.notify_all();
        }
    }

    // -----------------------------------------------------------------------
    // Collect
    // -----------------------------------------------------------------------
    outcome::result<std::vector<NodeOutput>> ResultAggregation::Collect()
    {
        std::unique_lock<std::mutex> lock( m_mutex );
        bool timed_out =
            !cv_.wait_for( lock, m_cfg.m_timeout, [this] { return done_ || results_.size() >= m_cfg.max_responses_; } );

        if ( timed_out && results_.empty() )
        {
            return outcome::failure( Error::BroadcastTimeout );
        }

        AggregationLogger()->info( "Collected {} responses (timeout={})", results_.size(), timed_out ? "yes" : "no" );
        return outcome::success( results_ );
    }

    // -----------------------------------------------------------------------
    // Reset
    // -----------------------------------------------------------------------
    void ResultAggregation::Reset()
    {
        std::lock_guard<std::mutex> lock( m_mutex );
        results_.clear();
        done_ = false;
    }

    // -----------------------------------------------------------------------
    // ResponseCount
    // -----------------------------------------------------------------------
    size_t ResultAggregation::ResponseCount() const
    {
        std::lock_guard<std::mutex> lock( m_mutex );
        return results_.size();
    }

} // namespace sgns::neoswarm::network

Updated on 2026-07-25 at 22:56:57 +0000