[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