#include "node.h"

Node::Node(float p, int idd){
  id = idd;
  float f = (float)rand()/(float)RAND_MAX;
  cooperator = p > f;
}

void Node::add_neighbor(Node* neighbor){
  neighbors.push_back(neighbor);
}

double Node::compute_payoff(float b, float s){
  float res = 0.;
  for(auto node : neighbors){
    if(!cooperator){
      if(node->cooperator)
        res += b;
    }else{
      if(node->cooperator)
        res += (b-1);
      else
        res -= 1;
    }
  }
  return exp(res*s); //TODO here constant
}

void Node::change(bool newType){
  cooperator = newType;
}

void Node::print(){
  cout<<"vertex "<<id<<" "<<cooperator<<endl;
  cout<<"  neighbors:";
  for(auto nei : neighbors){
    cout<<nei->id<<" "<<nei->cooperator<<", ";
  }
  cout<<endl;

}


StarNode::StarNode(float p, int idd, bool isc):Node(p,idd){
  is_center = isc;
}


double StarNode::compute_payoff(float b, float s){
  float res = 0.;
  for(auto node : neighbors){
    if(!cooperator){
      if(node->cooperator)
        res += b;
    }else{
      if(node->cooperator)
        res += (b-1);
      else
        res -= 1;
    }
  }
  return exp(res*s); //TODO here constant
}


