*! version 2.0 März 15, 2016 @ 18:12:06
*! Add file with MDS Predictions to SQ-data
* ukohler@uni-potsdam.de

*1.0 Initial version
*2.0 We now use entire distance matrix

program sqmdsadd
version 10

	syntax using  [, keep(varlist) ]

	// Shrink the Data to the dimensions of SQdist and save necessary files
	_sqdata

	// Merge file
	merge _Category `using'
	assert _merge == 3
	drop _merge Category

	// Adds results to origional data
	capture	_sqmdsreturn `keep'

	if _rc {
		use _Sqorig, replace
		di as text "Group results could not be merged to sequence data"
		di as text "Returned to original sequence data"
	}
end

program _sqdata
	quietly {

		save _Sqorig, replace
		capture keep `_dta[SQomsample]'
		if "`_dta[SQomsubseq]'" != "" drop `_dta[SQomsubseq]'

		// Drop Sequences with Gaps
		tempvar lcensor rcensor gap
		by `_dta[SQiis]' (`_dta[SQtis]'), sort: gen `lcensor' = sum(!mi(`_dta[SQis]'))
		by `_dta[SQiis]' (`_dta[SQtis]'): gen `rcensor' = sum(mi(`_dta[SQis]'))
		by `_dta[SQiis]' (`_dta[SQtis]'): ///
		  replace `rcensor' = ((_N-_n) == (`rcensor'[_N]-`rcensor'[_n])) & mi(`_dta[SQis]')
		by `_dta[SQiis]' (`_dta[SQtis]'): ///
		  gen `gap' = sum(mi(`_dta[SQis]') & `lcensor' & !`rcensor')
		by `_dta[SQiis]' (`_dta[SQtis]'): ///
		  drop if `gap'[_N]>0
		drop `lcensor' `rcensor' `gap'

		//One-to-one mapping of sequences to the alphabet 1,2,..,n
		//Condition: no raw distance
		if "`_dta[SQomsubcost]'" != "rawdistance" {
			tempvar newalph
			gen `newalph'= .
			levelsof `_dta[SQis]', local(Element)

			local newelement 1

			foreach l of local Element{
				replace `newalph' = `newelement++' if `_dta[SQis]'== `l'
			}
			replace `_dta[SQis]' = `newalph'
		}

		// Reshape Wide
		keep `_dta[SQis]' `_dta[SQiis]' `_dta[SQtis]'
		reshape wide `_dta[SQis]', i(`_dta[SQiis]') j(`_dta[SQtis]')
		unab varlist: `_dta[SQis]'*
		noi describe

		// Store a copy (for -_sqmdsreturn-)
		by `varlist' `_dta[SQiis]', sort: gen _Category = 1 if _n==1
		drop `varlist'
		replace _Category = sum(_Category)
		label var _Category "key for -sqclusterdata, return-"
		sort _Category
		save _Sqdata, replace

		// Keep one Sequence of each type
		// by _Category: keep if _n==1
		// sort _Category
		// save _SQrows, replace
	}

end

program define _sqmdsreturn
	syntax [varlist]
	tempfile mds
	noi d

	quietly {
		keep _Category `varlist'
		sort _Category
		save `mds'

		use _Sqdata, clear
		sort _Category
		merge _Category using `mds'
		assert _merge ==3
		drop _merge
		erase _Sqdata.dta

		keep `_dta[SQiis]' `varlist'
		sort `_dta[SQiis]'
		save `mds', replace

		use _Sqorig, clear
		sort `_dta[SQiis]'
		merge `_dta[SQiis]' using `mds'
		assert _merge!=2
		drop _merge _Category
		erase _Sqorig.dta
	}

end