/*****************************************************************
 * test drive some varieties of chains, and their optimal
 * partitions.
 *****************************************************************/
#include "chain.h"
#include <stdio.h>
#include <string.h>
#include <math.h>

void partitionCheck(chain *c, componentNode *partitionList,
                    double standardMin) {
  double calculatedMin= c->partitionTally(partitionList);
  
  if (fabs (calculatedMin - standardMin) < doubleFudge) {
    printf("Minimal partition\n");
  }
  else {
    printf("Not minimal partition\n");
  }
}

int main(void) {
  char chainType[80+1];
  int linkNum;
  link *linkList;
  double standardMin;

  // read in chain data
  scanf("%80s", chainType);
  printf("Chain type: %s\t", chainType);
  scanf("%d", &linkNum);
  linkList= new link[linkNum];
  for (int i= 0; i != linkNum; i++) {
    scanf("%lf", &linkList[i].x);
    scanf("%lf", &linkList[i].y);
  }
  scanf("%lf", &standardMin);

  if (strcmp(chainType, "polygon") == 0) {
    vertexChain vc(linkList, linkNum);
    partitionCheck(&vc, vc.minPartition(linkNum),
                   standardMin);
  }
  else if (strcmp(chainType, "matrix") == 0) {
    matrixChain mc(linkList, linkNum);
    partitionCheck(&mc, mc.minPartition(linkNum),
                   standardMin);
  }
  else if (strcmp(chainType, "bst") == 0) {
    bstChain bc(linkList, linkNum);
    partitionCheck(&bc, bc.minPartition(linkNum),
                   standardMin);
  }
  else {
    printf("Unknown chain type.\n");
  }

  delete []linkList;
  linkList= NULL;

  return 0;
}
