diff --git a/avida-core/source/actions/PopulationActions.cc b/avida-core/source/actions/PopulationActions.cc index d8c29d8c2..f3e1dddbc 100644 --- a/avida-core/source/actions/PopulationActions.cc +++ b/avida-core/source/actions/PopulationActions.cc @@ -3900,6 +3900,25 @@ class cActionCopyDeme : public cAction }; +class cActionReplicateDeme : public cAction +{ +private: + int m_id; +public: + cActionReplicateDeme(cWorld* world, const cString& args, Feedback&) : cAction(world, args), m_id(0) { + cString largs(args); + if (largs.GetSize()) m_id = largs.PopWord().AsInt(); + } + + static const cString GetDescription() { return "Arguments: "; } + + void Process(cAvidaContext& ctx) { + cDeme& deme = m_world->GetPopulation().GetDeme(m_id); + m_world->GetPopulation().ReplicateDeme(deme, ctx); + } +}; + + class cActionNewTrial : public cAction { private: @@ -5757,6 +5776,7 @@ void RegisterPopulationActions(cActionLibrary* action_lib) action_lib->Register("DivideDemes"); action_lib->Register("ResetDemes"); action_lib->Register("CopyDeme"); + action_lib->Register("ReplicateDeme"); action_lib->Register("MixPopulation"); action_lib->Register("DecayPoints"); diff --git a/avida-core/source/actions/SaveLoadActions.cc b/avida-core/source/actions/SaveLoadActions.cc index 4b84e4273..3dfee1bd8 100644 --- a/avida-core/source/actions/SaveLoadActions.cc +++ b/avida-core/source/actions/SaveLoadActions.cc @@ -36,6 +36,7 @@ #include "cWorld.h" #include +#include #include @@ -234,23 +235,15 @@ class cActionLoadGermlines : public cAction { private: cString m_filename; + bool m_verbose; public: cActionLoadGermlines(cWorld* world, const cString& args, Feedback& feedback) - : cAction(world, args), m_filename("") + : cAction(world, args), m_filename(""), m_verbose(false) { - cArgSchema schema(':','='); - - // String Entries - schema.AddEntry("filename", 0, "detailgermlines"); - - cArgContainer* argc = cArgContainer::Load(args, schema, feedback); - - if (argc) { - m_filename = argc->GetString(0); - } - - delete argc; + cString largs(args); + if (largs.GetSize()) m_filename = largs.PopWord(); + if (largs.GetSize()) m_verbose = largs.PopWord().AsInt(); } static const cString GetDescription() { return "Arguments: [string filename='detailgermlines']"; } @@ -262,19 +255,49 @@ class cActionLoadGermlines : public cAction ctx.Driver().Feedback() ); assert(input_file.WasOpened()); + if (m_verbose) printf( + "LoadGermlines input file %s has %d lines.\n", + (const char*)m_filename, + input_file.GetNumLines() + ); for (int line_id = 0; line_id < input_file.GetNumLines(); line_id++) { auto file_props = input_file.GetLineAsDict(line_id); const int deme_id = Apto::StrAs(file_props->Get("deme_id")); - const auto genome_sequence = Apto::StrAs(file_props->Get("sequence")); + const auto genome_sequence = file_props->Get("sequence"); + if (m_verbose) printf( + "LoadGermlines adding sequence %s to deme %d germline...\n", + (const char*)genome_sequence, + deme_id + ); HashPropertyMap seq_props; const cInstSet& is = m_world->GetHardwareManager().GetDefaultInstSet(); cHardwareManager::SetupPropertyMap(seq_props, (const char*)is.GetInstSetName()); + if (m_verbose) printf( + "LoadGermlines hardware type is %d and instruction set is %s.\n", + is.GetHardwareType(), + (const char*)is.GetInstSetName() + ); + Genome genome(is.GetHardwareType(), seq_props, GeneticRepresentationPtr(new InstructionSequence((const char*)genome_sequence))); + if (m_verbose) printf( + "Loaded Genome string representation is `%s`.\n", + (const char*)genome.AsString() + ); auto& germline = m_world->GetPopulation().GetDeme(deme_id).GetGermline(); + if (m_verbose) printf( + "LoadGermlines deme %d germline size before add was %d.\n", + deme_id, + germline.Size() + ); germline.Add(genome); + if (m_verbose) printf( + "LoadGermlines deme %d germline size after add is %d.\n", + deme_id, + germline.Size() + ); } } }; diff --git a/avida-core/tests/demes_loadgermlines/config/events.cfg b/avida-core/tests/demes_loadgermlines/config/events.cfg index 40551d60f..40af3102d 100644 --- a/avida-core/tests/demes_loadgermlines/config/events.cfg +++ b/avida-core/tests/demes_loadgermlines/config/events.cfg @@ -1,5 +1,7 @@ i InjectSequence ycdBCiEdimFjfCDaknmsAjemEEcgccgssmhEEcsdseDcAcBcggclEEcDEgcvrsAmlzessjhcdcggkhamtmciEEvjDdhjidzoAyndvmEdbgznjDmcjohohooayaxdyalbcekzebjcogEtjgjacblDvubADnslyyocgsAcjCbobffhmvnnAdbDfkmxcagBFfndytqhutjdzfdjsnflfoqCwcvhsjcvbmlsqcjrgyiDivvnFhrArcsmifbClvluDqmCBbtiDhiEfACcarpEczijdljujACbfzuDEFyaqqekizDosbbzjgmpczypqvcrGxab 101 -i LoadGermlines filename=detailgermlines-500.sgerm +i LoadGermlines detailgermlines-500.sgerm + +u 5 ReplicateDeme 1 u 10 SavePopulation filename=out u 10 SaveGermlines filename=out diff --git a/avida-core/tests/demes_loadgermlines/expected/data/deme_replication.dat b/avida-core/tests/demes_loadgermlines/expected/data/deme_replication.dat new file mode 100644 index 000000000..fcf473520 --- /dev/null +++ b/avida-core/tests/demes_loadgermlines/expected/data/deme_replication.dat @@ -0,0 +1 @@ +5,1,0 diff --git a/avida-core/tests/demes_loadgermlines/expected/data/injectlog.dat b/avida-core/tests/demes_loadgermlines/expected/data/injectlog.dat new file mode 100644 index 000000000..c4648f141 --- /dev/null +++ b/avida-core/tests/demes_loadgermlines/expected/data/injectlog.dat @@ -0,0 +1,7 @@ +# 1: Update +# 2: Organism ID +# 3: Deme ID +# 4: Facing + +5 1 1 3 +5 2 0 3 diff --git a/avida-core/tests/demes_loadgermlines/expected/data/out-10.spop b/avida-core/tests/demes_loadgermlines/expected/data/out-10.spop index 9aded7587..dbbeaeb07 100644 --- a/avida-core/tests/demes_loadgermlines/expected/data/out-10.spop +++ b/avida-core/tests/demes_loadgermlines/expected/data/out-10.spop @@ -23,4 +23,4 @@ # 19: Gestation (CPU) Cycle Offsets # 20: Lineage Label -1 div:ext (none) (none) 1 1 320 0 0 0 0 -1 -1 0 2 transsmt ycdBCiEdimFjfCDaknmsAjemEEcgccgssmhEEcsdseDcAcBcggclEEcDEgcvrsAmlzessjhcdcggkhamtmciEEvjDdhjidzoAyndvmEdbgznjDmcjohohooayaxdyalbcekzebjcogEtjgjacblDvubADnslyyocgsAcjCbobffhmvnnAdbDfkmxcagBFfndytqhutjdzfdjsnflfoqCwcvhsjcvbmlsqcjrgyiDivvnFhrArcsmifbClvluDqmCBbtiDhiEfACcarpEczijdljujACbfzuDEFyaqqekizDosbbzjgmpczypqvcrGxab 101 0 0 +2 dup:int germline (none) 2 2 320 0 0 0 0 6 -1 0 2 transsmt ycdBCiEdimFjfCDaknmsAjemEEcgccgssmhEEcsdseDcAcBcggclEEcDEgcvrsAmlzessjhcdcggkhamtmciEEvjDdhjidzoAyndvmEdbgznjDmcjohohooayaxdyalbcekzebjcogEtjgjacblDvubADnslyyocgsAcjCbobffhmvnnAdbDfkmxcagBFfndytqhutjdzfdjsnflfoqCwcvhsjcvbmlsqcjrgyiDivvnFhrArcsmifbClvluDqmCBbtiDhiEfACcarpEczijdljujACbfzuDEFyaqqekizDosbbzjgmpczypqvcrGxab 50,150 0,0 0,0