/*****************************************************************
 * 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;
}

