#include "linearalgebra.h"
-/* references used to make this command: "Nonmetric Multidimensional Scalling: A Numerical Method"
- by J. B. Kruskal Psychometrika - Vol 29, No. 2 June 1964 */
+/*
+ Translated from the nmds.R code written by Sarah Goslee using,
+
+ # Non-metric multidimensional scaling function
+ # using the majorization algorithm from
+ # Borg & Groenen 1997, Modern Multidimensional Scaling.
+ #
+
+ # also referenced (Kruskal 1964)
+
+ */
/*****************************************************************/
class NMDSCommand : public Command {
public:
NMDSCommand(string);
NMDSCommand();
- ~NMDSCommand();
- vector<string> getRequiredParameters();
- vector<string> getValidParameters();
- vector<string> getRequiredFiles();
- map<string, vector<string> > getOutputFiles() { return outputTypes; }
- int execute();
- void help();
+ ~NMDSCommand(){}
+
+ vector<string> setParameters();
+ string getCommandName() { return "nmds"; }
+ string getCommandCategory() { return "Hypothesis Testing"; }
+
+ string getHelpString();
+ string getOutputPattern(string);
+ string getCitation() { return "Borg, Groenen (1997). Non-metric multidimensional scaling function using the majorization algorithm, in Modern Multidimensional Scaling. Ed. T.F. Cox and M.A.A. Cox. Chapman and Hall. \nhttp://www.mothur.org/wiki/Nmds"; }
+ string getDescription() { return "nmds"; }
+
+ int execute();
+ void help() { m->mothurOut(getHelpString()); }
private:
bool abort;
string phylipfile, outputDir, axesfile;
- int dimension, maxIters;
- double step, cutoff;
+ int maxdim, mindim, maxIters, iters;
+ double epsilon;
vector<string> outputNames;
- map<string, vector<string> > outputTypes;
LinearAlgebra linearCalc;
- vector< vector<double> > generateStartingConfiguration(int); //pass in numNames, return axes
- int normalizeConfiguration(vector< vector<double> >&, int);
- vector<seqDist> satisfyMonotonicity(vector<seqDist>);
- double calculateStress(vector<seqDist>&, vector<seqDist>&, double&);
- vector< vector<double> > calculateStressGradientVector(vector<seqDist>&, vector<seqDist>&, double, double, vector< vector<double> >&);
- double calculateMagnitude(vector< vector<double> >&);
- double calculateStep(vector< vector<double> >&, vector< vector<double> >&, vector<double>&);
- vector< vector<double> > calculateNewConfiguration(double, vector< vector<double> >&, vector< vector<double> >&);
+ vector< vector<double> > nmdsCalc(vector< vector<double> >&, vector< vector<double> >&, double&);
+ vector< vector<double> > getConfiguration(vector< vector<double> >&, int);
+ vector< vector<double> > generateStartingConfiguration(int, int); //pass in numNames, return axes
+ int normalizeConfiguration(vector< vector<double> >&, int, int);
+ double calculateStress(vector< vector<double> >&, vector< vector<double> >&);
vector< vector<double> > readAxes(vector<string>);
- int output(string, string, vector< vector<double> >&, vector<double>&, vector<string>&);
+ int output(vector< vector<double> >&, vector<string>&, ofstream&);
};
/*****************************************************************/