Skip to content

Commit f1fd19e

Browse files
authored
Gh 147 - Serialization Format V6 - Serialized v9.0.0
* GH-147 - Serialization V6 - Serialized version 9.0.0 - changed the format so that the humans are separated from the nodes to reduce memory usage - simulation, nodes, and human collections are explicitly managed - each object can have its own compression type * Update tests & sync'd serialization helper tests with emod-api
1 parent 8bbb0d0 commit f1fd19e

File tree

27 files changed

+2342
-574
lines changed

27 files changed

+2342
-574
lines changed

Eradication/Node.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2697,7 +2697,11 @@ namespace Kernel
26972697

26982698
if ( node.serializationFlags.test( SerializationFlags::Population ) )
26992699
{
2700-
ar.labelElement("individualHumans" ) & node.individualHumans;
2700+
// --------------------------------------------------------
2701+
// --- handling humans within the SerializedPopulation code
2702+
// --------------------------------------------------------
2703+
//ar.labelElement("individualHumans" ) & node.individualHumans;
2704+
27012705
ar.labelElement("home_individual_ids") & node.home_individual_ids;
27022706
}
27032707

Eradication/Node.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,21 @@ namespace Kernel
2929
class SimulationConfig;
3030
class RANDOMBASE;
3131
struct INodeEventContext;
32-
//typedef
3332
class NodeEventContextHost;
3433
struct ISimulation;
3534
struct IMigrationInfoFactory;
35+
class Node;
36+
struct IIndividualHuman;
37+
}
38+
39+
namespace SerializedState
40+
{
41+
void AddHumans( Kernel::Node* pNode,
42+
const std::vector<Kernel::IIndividualHuman*>& rHumanCollection );
43+
}
3644

45+
namespace Kernel
46+
{
3747
class IDMAPI Node : public INodeContext, public JsonConfigurable
3848
{
3949
GET_SCHEMA_STATIC_WRAPPER(Node)
@@ -46,6 +56,9 @@ namespace Kernel
4656
friend class ::ReportVector;
4757
friend class ::DemographicsReport;
4858

59+
friend void SerializedState::AddHumans( Kernel::Node* pNode,
60+
const std::vector<Kernel::IIndividualHuman*>& rHumanCollection );
61+
4962
public:
5063
static Node *CreateNode(ISimulationContext *_parent_sim, ExternalNodeId_t externalNodeId, suids::suid node_suid);
5164

Eradication/SerializationParameters.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ END_QUERY_INTERFACE_BODY(SerializationParameters)
1616

1717
SerializationParameters* SerializationParameters::p_instance = nullptr;
1818

19+
// --------------------------------------------------------------------------------
20+
// --- I'm setting this to 2000 because:
21+
// --- A) A lot of scenarios have a population of 1000 +/1 a few.
22+
// --- These scenarios don't usually have memory issues, so we want
23+
// --- to only have one human colleciton per node.
24+
// --- B) Python Post Processing - In a test scenario with three nodes of
25+
// --- 10K, 11K, 12K people, it took 60 minutes vs 24 minutes in a test that
26+
// --- replaced the genomes. The old version used 22GB of memory. The new
27+
// --- version with a max of 1000 peaked at 9.2GB. When we switched to 2000,
28+
// --- we got a peak of 11.3 GB and took 73 minutes. Hmm.
29+
// --------------------------------------------------------------------------------
30+
#define DEFAULT_MAX_HUMANS_PER_COLLECTION (2000)
1931

2032
SerializationParameters::SerializationParameters()
2133
: m_serializationReadMask( 0 )
@@ -29,6 +41,7 @@ SerializationParameters::SerializationParameters()
2941
, m_serialization_time_steps()
3042
, m_serialization_times()
3143
, m_supportedFlags( SerializationBitMask_t{}.set( SerializationFlags::LarvalHabitats ) )
44+
, m_MaxHumansPerCollection( DEFAULT_MAX_HUMANS_PER_COLLECTION )
3245
{ }
3346

3447

@@ -65,6 +78,11 @@ std::string SerializationParameters::GetSerializedPopulationFilename() const
6578
return population_filename;
6679
}
6780

81+
int32_t SerializationParameters::GetMaxHumansPerCollection() const
82+
{
83+
return m_MaxHumansPerCollection;
84+
}
85+
6886
std::deque<int32_t> SerializationParameters::GetSerializedTimeSteps( int32_t steps ) const
6987
{
7088
float start_time = GET_CONFIGURABLE( SimulationConfig )->starttime;
@@ -228,6 +246,16 @@ bool SerializationParameters::Configure( const Configuration * inputJson )
228246
initConfig( "Serialization_Precision", m_serialization_precision, inputJson, MetadataDescriptor::Enum( "Serialization_Precision", Serialization_Precision_DESC_TEXT, MDD_ENUM_ARGS( SerializationPrecision ) ), "Serialized_Population_Writing_Type", "TIMESTEP,TIME" );
229247
initConfigTypeMap( "Serialization_Mask_Node_Write", ( uint32_t* )&m_serializationWriteMask, SerializationMask_Node_Write_DESC_TEXT, 0, UINT32_MAX, 0, "Serialized_Population_Writing_Type","TIME,TIMESTEP" );
230248

249+
if( JsonConfigurable::_dryrun || inputJson->Exist( "Serialization_Max_Humans_Per_Collection" ) )
250+
{
251+
initConfigTypeMap( "Serialization_Max_Humans_Per_Collection",
252+
&m_MaxHumansPerCollection,
253+
Serialization_Max_Humans_Per_Collection_DESC_TEXT,
254+
5, INT32_MAX, DEFAULT_MAX_HUMANS_PER_COLLECTION,
255+
"Serialized_Population_Writing_Type",
256+
"TIME,TIMESTEP" );
257+
}
258+
231259
// Read serialized population
232260
initConfig( "Serialized_Population_Reading_Type", m_serialization_read_type, inputJson, MetadataDescriptor::Enum( "Serialized_Population_Reading_Type", Serialized_Population_Reading_Type_DESC_TEXT, MDD_ENUM_ARGS( SerializationTypeRead ) ) );
233261
initConfigTypeMap( "Serialization_Mask_Node_Read", ( uint32_t* )&m_serializationReadMask, SerializationMask_Node_Read_DESC_TEXT, 0, UINT32_MAX, 0, "Serialized_Population_Reading_Type", "READ" );

Eradication/SerializationParameters.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ GET_SCHEMA_STATIC_WRAPPER( SerializationParameters )
5353
bool GetCreateRngFromSerializedData() const;
5454
std::string GetSerializedPopulationPath() const;
5555
std::string GetSerializedPopulationFilename() const;
56+
int32_t GetMaxHumansPerCollection() const;
5657

5758
private:
5859
SerializationParameters( const SerializationParameters& ) = delete;
@@ -72,4 +73,5 @@ GET_SCHEMA_STATIC_WRAPPER( SerializationParameters )
7273
std::vector<float> m_serialization_times;
7374
static SerializationParameters* p_instance;
7475
SerializationBitMask_t m_supportedFlags;
76+
int32_t m_MaxHumansPerCollection;
7577
};

0 commit comments

Comments
 (0)