//dataset can have class attribute
        public Agnes(HashSet <double[]> dataSet, bool hasClass)
        {
            _clusters      = new Clusters();
            _patternMatrix = new PatternMatrix();

            if (hasClass)
            {
                foreach (var item in dataSet)
                {
                    _pattern    = new Pattern();
                    _pattern.Id = _patternIndex;
                    _pattern.AddAttributes(item);
                    _pattern.RemoveAttributeAt(_pattern.GetDimension() - 1);                  //remove class atribute from attribute collection
                    _pattern.ClassAttribute = Convert.ToInt32(item[_pattern.GetDimension()]); //move class atribute to pattern.ClassAttribute (used for external validation indexes rand and jaccard)
                    _patternMatrix.AddPattern(_pattern);
                    _patternIndex++;
                }
            }
            else
            {
                foreach (var item in dataSet)
                {
                    _pattern    = new Pattern();
                    _pattern.Id = _patternIndex;
                    _pattern.AddAttributes(item);
                    _patternMatrix.AddPattern(_pattern);
                    _patternIndex++;
                }
            }
        }
        // dataset has no class attribute
        public Agnes(HashSet <double[]> dataSet)
        {
            _clusters      = new Clusters();
            _patternMatrix = new PatternMatrix();

            foreach (var item in dataSet)
            {
                _pattern    = new Pattern();
                _pattern.Id = _patternIndex;
                _pattern.AddAttributes(item);
                _patternMatrix.AddPattern(_pattern);
                _patternIndex++;
            }
        }