[avida-cvs] avida(1) CVS commits: /current/source/main environment.cc
bdbaer
avida-cvs at alife.org
Tue Jul 15 17:40:49 PDT 2003
bdbaer Tue Jul 15 09:40:49 2003 EDT
Added files: (Branch: 1)
/avida/current/source/main environment.cc
Log:
Correct minor logical error.
-------------- next part --------------
Index: avida/current/source/main/environment.cc
+++ avida/current/source/main/environment.cc
//////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1993 - 2001 California Institute of Technology //
// //
// Read the COPYING and README files, or contact 'avida at alife.org', //
// before continuing. SOME RESTRICTIONS MAY APPLY TO USE OF THIS FILE. //
//////////////////////////////////////////////////////////////////////////////
#include "environment.hh"
#include "../tools/string_util.hh"
bool cEnvironment::ParseSetting(cString entry, cString & var_name,
cString & var_value, const cString & var_type)
{
// Make sure we have an actual entry to parse.
if (entry.GetSize() == 0) {
cerr << "Error: Empty setting to parse in " << var_type << endl;
return false;
}
// Collect the values...
var_name = entry.Pop('=');
var_value = entry;
// Make sure we have both a name and a value...
if (var_name.GetSize() == 0) {
cerr << "Error: No variable povided to set to '" << var_value
<< "' in " << var_type << endl;
return false;
}
if (var_value.GetSize() == 0) {
cerr << "Error: No value given for '" << var_name
<< "' in " << var_type << endl;
return false;
}
// Make the names case insensitive.
var_name.ToLower();
return true;
}
bool cEnvironment::AssertInputInt(const cString & input,
const cString & name,
const cString & type)
{
if (input.IsNumeric() == false) {
cerr << "Error: In " << type << "," << name << " set to non-integer."
<< endl;
return false;
}
return true;
}
bool cEnvironment::AssertInputDouble(const cString & input,
const cString & name,
const cString & type)
{
if (input.IsNumber() == false) {
cerr << "Error: In " << type << "," << name << " set to non-number."
<< endl;
return false;
}
return true;
}
bool cEnvironment::AssertInputValid(void * input,
const cString & name,
const cString & type)
{
if (input == NULL) {
cerr << "Error: In " << type << "," << name << " not found."
<< endl;
return false;
}
return true;
}
bool cEnvironment::LoadReactionProcess(cReaction * reaction, cString desc)
{
cReactionProcess * new_process = reaction->AddProcess();
// Loop through all entries in description.
while (desc.GetSize() > 0) {
// Entries are divided by colons.
cString var_entry = desc.Pop(':');
cString var_name;
cString var_value;
const cString var_type =
cStringUtil::Stringf("reaction '%s' process", reaction->GetName()());
// Parse this entry.
if (!ParseSetting(var_entry, var_name, var_value, var_type)) return false;
// Now that we know we have a variable name and its value, set it!
if (var_name == "resource") {
cResource * test_resource = resource_lib.GetResource(var_value);
if (!AssertInputValid(test_resource, "resource", var_type)) return false;
new_process->SetResource(test_resource);
}
else if (var_name == "value") {
if (!AssertInputDouble(var_value, "value", var_type)) return false;
new_process->SetValue(var_value.AsDouble());
}
else if (var_name == "type") {
if (var_value=="add") new_process->SetType(REACTION_PROCTYPE_ADD);
else if (var_value=="mult") new_process->SetType(REACTION_PROCTYPE_MULT);
else if (var_value=="pow") new_process->SetType(REACTION_PROCTYPE_POW);
else {
cerr << "Unknown reaction process type '" << var_value
<< "' found in '" << reaction->GetName() << "'." << endl;
return false;
}
}
else if (var_name == "max") {
if (!AssertInputDouble(var_value, "max", var_type)) return false;
new_process->SetMaxNumber(var_value.AsDouble());
}
else if (var_name == "min") {
if (!AssertInputDouble(var_value, "min", var_type)) return false;
new_process->SetMinNumber(var_value.AsDouble());
}
else if (var_name == "frac") {
if (!AssertInputDouble(var_value, "frac", var_type)) return false;
new_process->SetMaxFraction(var_value.AsDouble());
}
else if (var_name == "product") {
cResource * test_resource = resource_lib.GetResource(var_value);
if (!AssertInputValid(test_resource, "product", var_type)) return false;
new_process->SetProduct(test_resource);
}
else if (var_name == "conversion") {
if (!AssertInputDouble(var_value, "conversion", var_type)) return false;
new_process->SetConversion(var_value.AsDouble());
}
else {
cerr << "Error: Unknown process variable '" << var_name
<< "' in reaction '" << reaction->GetName() << "'" << endl;
return false;
}
}
return true;
}
bool cEnvironment::LoadReactionRequisite(cReaction * reaction, cString desc)
{
cReactionRequisite * new_requisite = reaction->AddRequisite();
// Loop through all entries in description.
while (desc.GetSize() > 0) {
// Entries are divided by colons.
cString var_entry = desc.Pop(':');
cString var_name;
cString var_value;
const cString var_type =
cStringUtil::Stringf("reaction '%s' requisite", reaction->GetName()());
// Parse this entry.
if (!ParseSetting(var_entry, var_name, var_value, var_type)) return false;
// Now that we know we have a variable name and its value, set it!
if (var_name == "reaction") {
cReaction * test_reaction = reaction_lib.GetReaction(var_value);
if (!AssertInputValid(test_reaction, "reaction", var_type)) return false;
new_requisite->AddReaction(test_reaction);
}
else if (var_name == "noreaction") {
cReaction * test_reaction = reaction_lib.GetReaction(var_value);
if (!AssertInputValid(test_reaction,"noreaction",var_type)) return false;
new_requisite->AddNoReaction(test_reaction);
}
else if (var_name == "min_count") {
if (!AssertInputInt(var_value, "min_count", var_type)) return false;
new_requisite->SetMinTaskCount(var_value.AsInt());
}
else if (var_name == "max_count") {
if (!AssertInputInt(var_value, "max_count", var_type)) return false;
new_requisite->SetMaxTaskCount(var_value.AsInt());
}
else {
cerr << "Error: Unknown requisite variable '" << var_name
<< "' in reaction '" << reaction->GetName() << "'" << endl;
return false;
}
}
return true;
}
bool cEnvironment::LoadResource(cString desc)
{
if (desc.GetSize() == 0) {
cerr << "Warning: Resource line with no resources listed." << endl;
return false;
}
while (desc.GetSize() > 0) {
cString name = desc.PopWord();
resource_lib.AddResource(name);
}
return true;
}
bool cEnvironment::LoadReaction(cString desc)
{
if (desc.CountNumWords() < 2) {
cerr << "Error: Each reaction must include at least name and trigger."
<< endl;
return false;
}
const cString name = desc.PopWord();
const cString trigger = desc.PopWord();
cReaction * new_reaction = reaction_lib.AddReaction(name);
// task_lib.AddTask(trigger);
while (desc.GetSize()) {
cString desc_entry = desc.PopWord(); // Get the next argument
cString entry_type = desc_entry.Pop(':'); // Determine argument type
entry_type.ToLower(); // Make case insensitive.
//
if (entry_type == "process") {
if ( !LoadReactionProcess(new_reaction, desc_entry) ) return false;
}
else if (entry_type == "requisite") {
if ( !LoadReactionRequisite(new_reaction, desc_entry) ) return false;
}
else {
cerr << "Unknown entry type '" << entry_type
<< "' in reaction '" << name << "'"
<< endl;
return false;
}
}
}
bool cEnvironment::Load(const cString & filename)
{
cInitFile infile(filename);
if (infile.Good() == false) {
cerr << "Error: Failed to load task library '" << filename << "'." << endl;
return false;
}
infile.Load();
infile.Close();
infile.Compress();
while( infile.GetNumLines() ){
cString line = infile.RemoveLine(); // Load next line from file.
cString type = line.PopWord(); // Determine type of this entry.
type.ToLower(); // Make type case insensitive.
if (type == "resource") LoadResource(line);
else if (type == "reaction") LoadReaction(line);
else {
cerr << "Error: Unknown environment keyword '" << type << "." << endl;
return false;
}
}
return true;
}
double cEnvironment::TestInput(tBuffer<int> & inputs, tBuffer<int> & outputs,
tArray<int> & task_count, tArray<int> & resource_count,
const double in_bonus) const
{
// Stub...
return 0.0;
}
double cEnvironment::TestOutput(tBuffer<int> & inputs, tBuffer<int> & outputs,
tArray<int> & task_count, tArray<int> & resource_count,
const double in_bonus) const
{
// Stub...
return 0.0;
}
More information about the Avida-cvs
mailing list