#!/usr/bin/ruby

P=2

ANZAHL=20400
SPALTEN=44

class Datensatz

	def initialize(string)
		@row = string.split(/,/)
		@row.collect! { |x| x.to_f }
	end

	def distance(datensatz)
		raise ArgumentError unless datensatz.is_a?(Datensatz)
		maximum = get_maximum(datensatz)
		#puts "maximum ist #{maximum}"
		distanz=0

		@row.each_index { |i|
			break if i==SPALTEN-1
			temp = (@row[i]/maximum)-(datensatz.row[i]/maximum)
			#betrag nehmen
			temp *= -1 if temp < 0

			distanz += temp**P
		}

		return Math.sqrt(distanz)
		
	end

	def get_maximum(datensatz)
		max=0
		@row.each_index { |i|
			max=@row[i] if @row[i]>max	
			max=datensatz.row[i] if datensatz.row[i]>max	
		}
		return max.to_f
	end

	def to_s
		return @row.join(",")
	end

	attr_reader :row
end



Daten = Array.new

c = 0
f = File.new("Datensatz-mit-Krankheit.csv","r")
f.each_line { |line|
	c+=1
	next if c==1
	break if c>ANZAHL+1
	Daten << Datensatz.new(line)
}
f.close

anzsteps=(ANZAHL*ANZAHL)/2-ANZAHL
percent = anzsteps/100.0

puts "#{Daten.size} Datensätze gelesen"
puts "Insgesamt #{anzsteps} Berechnungen notwendig"
puts "1 % davon sind #{percent}"

vorher=Time.now.to_i

s=0

for i in 0..Daten.size-1 do
	for j in i+1..Daten.size-1 do
		d = Daten[i].distance(Daten[j])
		s+=1
		#puts "distanz zwischen #{i},#{j}: #{d.to_f} "
		if ((s/percent).to_i) == s/percent then
			puts "#{s/percent.to_i} % fertig"
			puts "i:#{i} j:#{j}"
		end


	end
end

nachher=Time.now.to_i

puts "took #{nachher-vorher} seconds"

