text: /****
  DIAMOND protein aligner
  Copyright (C) 2013-2017 Benjamin Buchfink <buchfink@gmail.com>
  
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as
  published by the Free Software Foundation, either version 3 of the
  License, or (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.
  
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  ****/
  
  #include "../basic/config.h"
  #include "log_stream.h"
  #include "complexity_filter.h"
  #include "util.h"
  
  Message_stream message_stream;
  Message_stream verbose_stream (false);
  Message_stream log_stream (false);
  tthread::mutex Message_stream::mtx;
  
  const Complexity_filter Complexity_filter::instance;
  TLS_PTR vector<Ptr_wrapper_base*> *TLS::ptr_;
  
  #ifndef _MSC_VER
  const char dir_separator = '/';
  #else
  const char dir_separator = '\\';
  #endif
  
  string extract_dir(const string & s)
  {
  	return s.find_last_of(dir_separator) == string::npos ? "" : s.substr(0, s.find_last_of(dir_separator));
  }
  
  Sd::Sd(const vector<Sd> &groups):
  	A(0),
  	Q(0),
  	k(0)
  {
  	for (unsigned i = 0; i < groups.size(); ++i) {
  		k += groups[i].k;
  		A += groups[i].A * groups[i].k;
  		Q += groups[i].Q;
  	}
  	A /= k;
  	for (unsigned i = 0; i < groups.size(); ++i)
  		Q += (groups[i].A - A)*(groups[i].A - A)*groups[i].k;
  }