Program Listing for File population.h¶
↰ Return to documentation for file (/home/docs/checkouts/readthedocs.org/user_builds/libsonata-test/checkouts/latest/include/bbp/sonata/population.h
)
/*************************************************************************
* Copyright (C) 2018-2020 Blue Brain Project
*
* This file is part of 'libsonata', distributed under the terms
* of the GNU Lesser General Public License version 3.
*
* See top-level COPYING.LESSER and COPYING files for details.
*************************************************************************/
#pragma once
#include "common.h"
#include <cstdint>
#include <memory> // std::shared_ptr, std::unique_ptr
#include <set>
#include <string>
#include <utility> // std::move
#include <vector>
namespace bbp {
namespace sonata {
//--------------------------------------------------------------------------------------------------
class SONATA_API Selection
{
public:
using Value = uint64_t;
using Values = std::vector<Value>;
using Range = std::pair<Value, Value>;
using Ranges = std::vector<Range>;
explicit Selection(Ranges&& ranges);
explicit Selection(const Ranges& ranges);
template <typename Iterator>
static Selection fromValues(Iterator first, Iterator last);
static Selection fromValues(const Values& values);
const Ranges& ranges() const;
Values flatten() const;
size_t flatSize() const;
bool empty() const;
private:
const Ranges ranges_;
};
bool SONATA_API operator==(const Selection&, const Selection&);
bool SONATA_API operator!=(const Selection&, const Selection&);
Selection SONATA_API operator&(const Selection&, const Selection&);
Selection SONATA_API operator|(const Selection&, const Selection&);
template <typename Iterator>
Selection Selection::fromValues(Iterator first, Iterator last) {
Selection::Ranges ranges;
Selection::Range range{0, 0};
while (first != last) {
const auto v = *first;
if (v == range.second) {
++range.second;
} else {
if (range.first < range.second) {
ranges.push_back(range);
}
range.first = v;
range.second = v + 1;
}
++first;
}
if (range.first < range.second) {
ranges.push_back(range);
}
return Selection(std::move(ranges));
}
//--------------------------------------------------------------------------------------------------
class SONATA_API Population
{
public:
std::string name() const;
uint64_t size() const;
Selection selectAll() const;
const std::set<std::string>& attributeNames() const;
const std::set<std::string>& enumerationNames() const;
template <typename T>
std::vector<T> getAttribute(const std::string& name, const Selection& selection) const;
template <typename T>
std::vector<T> getAttribute(const std::string& name,
const Selection& selection,
const T& defaultValue) const;
template <typename T>
std::vector<T> getEnumeration(const std::string& name, const Selection& selection) const;
std::vector<std::string> enumerationValues(const std::string& name) const;
std::string _attributeDataType(const std::string& name,
bool translate_enumeration = false) const;
const std::set<std::string>& dynamicsAttributeNames() const;
template <typename T>
std::vector<T> getDynamicsAttribute(const std::string& name, const Selection& selection) const;
template <typename T>
std::vector<T> getDynamicsAttribute(const std::string& name,
const Selection& selection,
const T& defaultValue) const;
std::string _dynamicsAttributeDataType(const std::string& name) const;
protected:
Population(const std::string& h5FilePath,
const std::string& csvFilePath,
const std::string& name,
const std::string& prefix);
Population(const Population&) = delete;
Population(Population&&) noexcept;
virtual ~Population() noexcept;
struct Impl;
std::unique_ptr<Impl> impl_;
};
template <>
std::vector<std::string> Population::getAttribute<std::string>(const std::string& name,
const Selection& selection) const;
//--------------------------------------------------------------------------------------------------
template <typename Population>
class SONATA_API PopulationStorage
{
public:
PopulationStorage(const std::string& h5FilePath, const std::string& csvFilePath = "");
PopulationStorage(const PopulationStorage&) = delete;
PopulationStorage(PopulationStorage&&) noexcept;
~PopulationStorage() noexcept;
std::set<std::string> populationNames() const;
std::shared_ptr<Population> openPopulation(const std::string& name) const;
protected:
struct Impl;
std::unique_ptr<Impl> impl_;
};
//--------------------------------------------------------------------------------------------------
} // namespace sonata
} // namespace bbp