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.
169 lines
4.7 KiB
169 lines
4.7 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2013-
|
|
// Authors:
|
|
// * Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of Oxford)
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// 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
|
|
//
|
|
//==============================================================================
|
|
|
|
package param;
|
|
|
|
/**
|
|
* Reward structure for parametric model.
|
|
* We only consider rewards assigned to a certain nondeterministic choice,
|
|
* because for the properties we consider, state rewards can be stored
|
|
* as equivalent choice rewards.
|
|
*
|
|
* @author Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of Oxford)
|
|
*/
|
|
final class ParamRewardStruct {
|
|
/** rewards for all choices */
|
|
Function[] rewards;
|
|
/** function factory the functions used for rewards belong to */
|
|
FunctionFactory factory;
|
|
|
|
/**
|
|
* Constructs a new reward structure for with given number of choices.
|
|
* Initially, all rewards will be zero.
|
|
*
|
|
* @param factory function factory to use
|
|
* @param numChoices number of different rewards
|
|
*/
|
|
ParamRewardStruct(FunctionFactory factory, int numChoices)
|
|
{
|
|
this.rewards = new Function[numChoices];
|
|
this.factory = factory;
|
|
for (int choice = 0; choice < numChoices; choice++) {
|
|
rewards[choice] = factory.getZero();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Constructs a new reward structure which is the copy of another one.
|
|
*
|
|
* @param other original to construct copy of
|
|
*/
|
|
ParamRewardStruct(ParamRewardStruct other)
|
|
{
|
|
this.rewards = new Function[other.rewards.length];
|
|
for (int choice = 0; choice < other.rewards.length; choice++) {
|
|
this.rewards[choice] = other.rewards[choice];
|
|
}
|
|
this.factory = other.factory;
|
|
}
|
|
|
|
/**
|
|
* Instantiate reward structure at a given point.
|
|
* That is, a reward structure is computed in which the corresponding
|
|
* values have been inserted for each parameter, and which is thus
|
|
* nonparametric.
|
|
*
|
|
* @param point instantiate for these parameter values
|
|
* @return non-parametric reward structure instantiated at given point
|
|
*/
|
|
ParamRewardStruct instantiate(Point point)
|
|
{
|
|
ParamRewardStruct result = new ParamRewardStruct(factory, rewards.length);
|
|
for (int choice = 0; choice < rewards.length; choice++) {
|
|
result.rewards[choice] = factory.fromBigRational(this.rewards[choice].evaluate(point));
|
|
}
|
|
result.factory = this.factory;
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Set reward for given choice.
|
|
*
|
|
* @param choice choice to set reward for
|
|
* @param reward reward to set
|
|
*/
|
|
void setReward(int choice, Function reward)
|
|
{
|
|
rewards[choice] = reward;
|
|
}
|
|
|
|
/**
|
|
* Add reward to given choice.
|
|
*
|
|
* @param choice choice to add reward to
|
|
* @param reward reward to add to existing reward for choice
|
|
*/
|
|
void addReward(int choice, Function reward)
|
|
{
|
|
rewards[choice] = rewards[choice].add(reward);
|
|
}
|
|
|
|
/**
|
|
* Get reward for given choice.
|
|
*
|
|
* @param choice choice to get reward of
|
|
* @return reward for given choice
|
|
*/
|
|
Function getReward(int choice)
|
|
{
|
|
return rewards[choice];
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
StringBuffer result = new StringBuffer();
|
|
for (int state = 0; state < rewards.length; state++) {
|
|
result.append(state);
|
|
result.append(": ");
|
|
result.append(rewards[state]);
|
|
result.append("\n");
|
|
}
|
|
return result.toString();
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
if (!(obj instanceof ParamRewardStruct)) {
|
|
return false;
|
|
}
|
|
ParamRewardStruct other = (ParamRewardStruct) obj;
|
|
if (!this.factory.equals(other.factory)) {
|
|
return false;
|
|
}
|
|
if (this.rewards.length != other.rewards.length) {
|
|
return false;
|
|
}
|
|
for (int choice = 0; choice < rewards.length; choice++) {
|
|
if (!this.rewards[choice].equals(other.rewards[choice])) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
int hash = 0;
|
|
|
|
hash = factory.hashCode();
|
|
for (int choice = 0; choice < rewards.length; choice++) {
|
|
hash = rewards[choice].hashCode() + (hash << 6) + (hash << 16) - hash;
|
|
}
|
|
|
|
return hash;
|
|
}
|
|
}
|