You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
9.9 KiB
370 lines
9.9 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2004-2005, Andrew Hinton
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
#include "simmodel.h"
|
|
#include "simstate.h"
|
|
#include "simutil.h"
|
|
#include "simiohandler.h"
|
|
#include <cstdio>
|
|
#include <string>
|
|
#ifdef _WIN32
|
|
#include <io.h>
|
|
#else
|
|
#include <unistd.h>
|
|
#endif
|
|
#include <stdio.h>
|
|
#include <iostream>
|
|
|
|
using std::string;
|
|
using std::cout;
|
|
using std::endl;
|
|
|
|
|
|
//=============================================================================
|
|
// Description
|
|
//=============================================================================
|
|
|
|
/*
|
|
* This interface is for the the current state space. It simply
|
|
* maintains an array of values of the current set of variables.
|
|
* Each variable, whether boolean or int is stored as an int and can be
|
|
* accessed by using the globally accessible state_variables array or by
|
|
* the set of convienience methods.
|
|
*/
|
|
|
|
|
|
//=============================================================================
|
|
// Class Definitions
|
|
//=============================================================================
|
|
|
|
/*
|
|
* CPathState
|
|
* ==========
|
|
*
|
|
* States of the model will have information associated with them according
|
|
* to different executions of the system. The CPathState class stores this
|
|
* information including:
|
|
* The copy of the variables for that state
|
|
* The index of the choice made to get out of that state
|
|
* The probability of the choice made to get out of that state
|
|
* The time spent in that state
|
|
* The instant state costs of that state
|
|
* The costs accumulated in that state (for real time models)
|
|
* The costs of the transition out of that state
|
|
* The costs of the path so far up until that state
|
|
*/
|
|
|
|
/*
|
|
* Constructs the state according with no_state_variables storage spaces
|
|
* choice_made is initially PATH_NO_CHOICE_MADE (no choice made yet)
|
|
*/
|
|
CPathState::CPathState()
|
|
{
|
|
this->variables = new int[no_state_variables];
|
|
this->choice_made = PATH_NO_CHOICE_MADE;
|
|
//Initially fill with undefined data
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
{
|
|
variables[i] = UNDEFINED_INT;
|
|
}
|
|
this->time_spent_in_state = 0.0;
|
|
this->cumulative_time_spent_in_state = 0.0;
|
|
this->time_known = false;
|
|
this->state_cost = new double[no_reward_structs];
|
|
this->state_instant_cost = new double[no_reward_structs];
|
|
this->transition_cost = new double[no_reward_structs];
|
|
|
|
this->cumulative_state_cost = new double[no_reward_structs];
|
|
this->cumulative_transition_cost = new double[no_reward_structs];
|
|
|
|
for(int i = 0; i < no_reward_structs; i++)
|
|
{
|
|
this->state_cost[i] = 0.0;
|
|
this->state_instant_cost[i] = 0.0;
|
|
this->transition_cost[i] = 0.0;
|
|
|
|
this->cumulative_state_cost[i] = 0.0;
|
|
this->cumulative_transition_cost[i] = 0.0;
|
|
}
|
|
|
|
this->probability = 0.0;
|
|
}
|
|
|
|
/*
|
|
* Destructor removes the variables array.
|
|
*/
|
|
CPathState::~CPathState()
|
|
{
|
|
if(variables != NULL) delete[] variables;
|
|
if(state_cost != NULL) delete[] state_cost;
|
|
if(state_instant_cost != NULL) delete[] state_instant_cost;
|
|
if(transition_cost != NULL) delete[] transition_cost;
|
|
|
|
if(cumulative_state_cost != NULL) delete[] cumulative_state_cost;
|
|
if(cumulative_transition_cost != NULL) delete[] cumulative_transition_cost;
|
|
}
|
|
|
|
/*
|
|
* Set this state to match a copy of state_variables.
|
|
*/
|
|
void CPathState::Make_This_Current_State()
|
|
{
|
|
//std::cout << "Called Make_This_Current_State()" << std::endl;
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
variables[i] = state_variables[i];
|
|
this->time_spent_in_state = 0.0;
|
|
this->cumulative_time_spent_in_state = 0.0;
|
|
this->time_known = false;
|
|
|
|
for(int i = 0; i < no_reward_structs; i++) {
|
|
this->state_cost[i] = 0.0;
|
|
this->state_instant_cost[i] = 0.0;
|
|
this->cumulative_state_cost[i] = 0.0;
|
|
this->cumulative_transition_cost[i] = 0.0;
|
|
this->transition_cost[i] = 0.0;
|
|
}
|
|
this->probability = 0.0;
|
|
}
|
|
|
|
/*
|
|
* Set state_variables to match a copy of variables.
|
|
*/
|
|
void CPathState::Make_Current_State_This()
|
|
{
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
state_variables[i] = variables[i];
|
|
}
|
|
|
|
/*
|
|
* Returns a string representation of this path state.
|
|
*/
|
|
string CPathState::To_String()
|
|
{
|
|
string returner = "";
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
{
|
|
returner += Int_To_String(variables[i]);
|
|
returner += "\t";
|
|
}
|
|
if(time_known)
|
|
{
|
|
returner += "t = "+Double_To_String(this->time_spent_in_state);
|
|
returner += "\tsc = [";
|
|
for (int i=0; i < no_reward_structs; i++) returner += " "+Double_To_String(this->state_cost[i]);
|
|
returner += " ]";
|
|
returner += "\ttc = [";
|
|
for (int i=0; i < no_reward_structs; i++) returner += " "+Double_To_String(this->transition_cost[i]);
|
|
returner += " ]";
|
|
}
|
|
return returner;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
// Globals
|
|
//=============================================================================
|
|
|
|
//State space
|
|
int * state_variables = NULL; //pointer to the state space array
|
|
int no_state_variables = 0; //size of the state space
|
|
|
|
//=============================================================================
|
|
// Functions
|
|
//=============================================================================
|
|
|
|
/*
|
|
* If state_variables has been allocated previously, this function removes it
|
|
* from memory.
|
|
*/
|
|
void Deallocate_State_Space()
|
|
{
|
|
if(state_variables != NULL)
|
|
{
|
|
delete[] state_variables;
|
|
state_variables = NULL;
|
|
}
|
|
no_state_variables = 0;
|
|
}
|
|
|
|
/*
|
|
* Allocates memory for an integer array of size no_variables, this array is
|
|
* then pointed to by state_variables and no_state_variables is set to
|
|
* no_variables.
|
|
*
|
|
* throws an exception for out of memory
|
|
*/
|
|
void Allocate_State_Space(int no_variables)
|
|
{
|
|
no_state_variables = no_variables;
|
|
|
|
//Allocate state space
|
|
state_variables = new int [no_state_variables];
|
|
|
|
if(state_variables == NULL)
|
|
{
|
|
Report_Error("Simulator engine ran out of memory when allocating state space.");
|
|
throw "out of memory exception simstate.cc 001";
|
|
}
|
|
|
|
//Initially all values are undefined
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
{
|
|
state_variables[i] = UNDEFINED_INT;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Sets state_variables[index] to value.
|
|
*
|
|
* throws an exception if index is out of range
|
|
*/
|
|
void Set_State_Variable(int index, int value)
|
|
{
|
|
if(index >= no_state_variables)
|
|
{
|
|
Report_Error("Unexpected Error: Attempt to update variable that is out of range.");
|
|
throw "array access exception simstate.cc 002";
|
|
}
|
|
else
|
|
{
|
|
state_variables[index] = value;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Copies the values pointed to by variables into state_variables.
|
|
*
|
|
* throws an exception is variables is NULL.
|
|
*/
|
|
void Set_State_Space(int* variables)
|
|
{
|
|
if(variables == NULL)
|
|
{
|
|
Report_Error("Unexpected Error: Attempt to update variables with null value.");
|
|
throw "null pointer exception simstate.cc 003";
|
|
}
|
|
else
|
|
{
|
|
Copy_Int_Array(variables, state_variables, no_state_variables);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Returns the value of state_variables[index].
|
|
*
|
|
* throws an exception if index is out of range.
|
|
*/
|
|
int Get_State_Variable_Value(int index)
|
|
{
|
|
if(index >= no_state_variables)
|
|
{
|
|
Report_Error("Unexpected Error: Attempt to access variable that is out of range.");
|
|
throw "array access exception simstate.cc 004";
|
|
}
|
|
else
|
|
{
|
|
return state_variables[index];
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Returns the size of the state space, i.e. no_state_variables.
|
|
*/
|
|
int Get_Num_State_Variables()
|
|
{
|
|
return no_state_variables;
|
|
}
|
|
|
|
//=============================================================================
|
|
// Helper Functions
|
|
//=============================================================================
|
|
|
|
string State_Variables_To_String()
|
|
{
|
|
string vars = "";
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
{
|
|
vars += Int_To_String(i) + "\t" + Int_To_String(state_variables[i]) + "\n";
|
|
}
|
|
return vars;
|
|
}
|
|
|
|
//==============================================================================
|
|
// IO Functions
|
|
//==============================================================================
|
|
|
|
void Write_State_Space(int fd)
|
|
{
|
|
char buf_str[256];
|
|
Write_Length_And_String("ss", fd);
|
|
//write the number of variables
|
|
write(fd, &no_state_variables, sizeof(int));
|
|
|
|
//write each variable value
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
{
|
|
write(fd, &state_variables[i], sizeof(int));
|
|
}
|
|
|
|
//terminate state space output with null byte
|
|
write(fd, "\0", 1);
|
|
}
|
|
|
|
void Read_State_Space(int fd)
|
|
{
|
|
char str_buf[256];
|
|
//cout <<"Attempting to read state space" << endl;
|
|
int int_buf;
|
|
//read state space header
|
|
read(fd, &int_buf, sizeof(int));
|
|
read(fd, &str_buf, int_buf+1);
|
|
if(strcmp(str_buf, "ss") != 0)
|
|
{
|
|
throw "Error when importing binary file: state space header not found";
|
|
}
|
|
|
|
//read the number of variables and allocate state space
|
|
read(fd, &int_buf, sizeof(int));
|
|
Allocate_State_Space(int_buf);
|
|
|
|
//cout << "there were " << int_buf << " variables." << endl;
|
|
|
|
//read variable values
|
|
|
|
for(int i = 0; i < no_state_variables; i++)
|
|
{
|
|
read(fd, &int_buf, sizeof(int));
|
|
Set_State_Variable(i, int_buf);
|
|
//cout << int_buf << ", ";
|
|
}
|
|
//cout<<endl;
|
|
|
|
//read off null byte
|
|
read(fd, str_buf, 1);
|
|
if(strcmp(str_buf, "") != 0)
|
|
{
|
|
throw "Error when importing binary file: state space not terminated correctly";
|
|
}
|
|
//cout << "Successfully loaded state space" << endl;
|
|
|
|
|
|
}
|