double v(double m, double phi, double v_0, double mu, double k, double l_0)
{
	/* Calculates the velocity at a point given the velocity d_phi away 
	   from the point we care about. Derivation explained in lab report. 
	*/ 
	return sqrt(((2*r*d_phi)/m)*(wt(m,phi)-Fst(phi,k,l_0)-mu*wn(m,phi)
	       -mu*Fsn(phi,k,l_0)+((mu*m*pow(v_0,2))/(r))
		   +(m*pow(v_0,2)/(2*r*d_phi))));
}
bool UnitTests::SharedSeqs()
{
	std::vector< std::vector<double> > dissMatrix;

	// unweighted MRCA (= MRCA restricted Soergel)
	DiversityCalculator uMRCA("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Soergel", 1000, false, false, true, false, false);
	uMRCA.Dissimilarity("../unit-tests/temp", "UPGMA");

	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 8.0/13.0))
		return false;
	if(!Compare(dissMatrix[2][0], 8.0/13.0))
		return false;
	if(!Compare(dissMatrix[2][1], 2.0/6.0))
		return false;

	// unweighted Tamas coefficient
	DiversityCalculator uTC("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Tamas coefficient", 1000, false, false, false, false, false);
	uTC.Dissimilarity("../unit-tests/temp", "UPGMA");

	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 8.0/13.0))
		return false;
	if(!Compare(dissMatrix[2][0], 8.0/13.0))
		return false;
	if(!Compare(dissMatrix[2][1], 2.0/13.0))
		return false;

	// unweighted Soergel
	DiversityCalculator uSoergel("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Soergel", 1000, false, false, false, false, false);
	uSoergel.Dissimilarity("../unit-tests/temp", "UPGMA");

	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 8.0/13.0))
		return false;
	if(!Compare(dissMatrix[2][0], 8.0/13.0))
		return false;
	if(!Compare(dissMatrix[2][1], 2.0/9.0))
		return false;

	// unweighted Canberra
	DiversityCalculator uCanberra("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Canberra", 1000, false, false, false, false, false);
	uCanberra.Dissimilarity("../unit-tests/temp", "UPGMA");

	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 8.0))
		return false;
	if(!Compare(dissMatrix[2][0], 8.0))
		return false;
	if(!Compare(dissMatrix[2][1], 2.0))
		return false;

	// weighted Soergel
	DiversityCalculator Soergel("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Soergel", 1000, true, false, false, false, false);
	Soergel.Dissimilarity("../unit-tests/temp", "UPGMA");

	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 0.55))
		return false;
	if(!Compare(dissMatrix[2][0], 0.615385))
		return false;
	if(!Compare(dissMatrix[2][1], 0.16981))
		return false;

	// weighted Bray-Curtis
	DiversityCalculator BC("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Bray-Curtis", 1000, true, false, false, false, false);
	BC.Dissimilarity("../unit-tests/temp", "UPGMA");

	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 0.37931000))
		return false;
	if(!Compare(dissMatrix[2][0], 0.444440))
		return false;
	if(!Compare(dissMatrix[2][1], 0.092783500))
		return false;

	// weighted Fst
	DiversityCalculator Fst("../unit-tests/SharedSeqs.env", "../unit-tests/SharedSeqs.tre", "Fst", 1000, true, false, false, false, false);
	Fst.Dissimilarity("../unit-tests/temp", "UPGMA");
	
	ReadDissMatrix("../unit-tests/temp.diss", dissMatrix);
	if(!Compare(dissMatrix[1][0], 0.139560))
		return false;
	if(!Compare(dissMatrix[2][0], 0.18378390))
		return false;
	if(!Compare(dissMatrix[2][1], 0.043478190))
		return false;

	return true;
}