Program Listing for File get_fraction_nulliparous.hpp

Return to documentation for file (include/dish2/introspection/get_fraction_nulliparous.hpp)

#pragma once
#ifndef DISH2_INTROSPECTION_GET_FRACTION_NULLIPAROUS_HPP_INCLUDE
#define DISH2_INTROSPECTION_GET_FRACTION_NULLIPAROUS_HPP_INCLUDE

#include <algorithm>
#include <limits>

#include "../../../third-party/conduit/include/uitsl/polyfill/identity.hpp"

#include "../cell/cardinal_iterators/SpawnCountWrapper.hpp"
#include "../world/iterators/LiveCellIterator.hpp"
#include "../world/iterators/WorldIteratorAbridger.hpp"
#include "../world/ThreadWorld.hpp"

#include "count_live_cells.hpp"
#include "no_live_cells.hpp"

namespace dish2 {

template< typename Spec >
double get_fraction_nulliparous(
  const dish2::ThreadWorld<Spec>& world
) {

  const auto& population = world.population;

  using lcit_t = dish2::LiveCellIterator<Spec>;

  using iterator_t = dish2::WorldIteratorAbridger<
    lcit_t,
    dish2::SpawnCountWrapper<Spec>
  >;

  if ( dish2::no_live_cells<Spec>( world ) ) {
    return std::numeric_limits<double>::quiet_NaN();
  } else return std::count_if(
    iterator_t( lcit_t::make_begin( population ) ),
    iterator_t( lcit_t::make_end( population ) ),
    []( const auto& spawn_count ){ return spawn_count.Get() == 0; }
  ) / static_cast< double >( dish2::count_live_cells<Spec>( world ) );

}

} // namespace dish2

#endif // #ifndef DISH2_INTROSPECTION_GET_FRACTION_NULLIPAROUS_HPP_INCLUDE