<commit_before>require "modai_prct11/version"
require "racional"

module ModaiPrct11

$tope = 9999999999.9
  
# Clase abstracta para herencia común de matrices densa y dispersa
class MatrizAbstracta

end

# Clase de Matriz densa
class MatrizDensa < MatrizAbstracta

	# Inicialización
	def initialize(matriz)

		@matriz = matriz
		@filas = matriz[0].size
		@columnas = matriz[0].size

	end

	attr_reader :matriz, :filas, :columnas

	# Convertimos a string
	def to_s

		fil = 0
		print "["
		while fil < filas

			col = 0					
			while col < columnas

				print "#{matriz[fil][col].to_s}"
				if (col + 1) < columnas then print ", " end
				col += 1

			end

			if (fil + 1) < filas then print ", " end
			fil += 1

		end
		print "]"

	end

	#  Matriz en punto flotante
	def to_f

                flotante = Array.new(matriz.size - 1)
                for i in 0...matriz.size
                        flotante[i] = Array.new(matriz[i].size - 1)
                        for j in 0...matriz[i].size
                                flotante[i][j] = (matriz[i][j]).to_f
                        end
                end
                MatrizDensa.new(flotante)

	end

	# Suma de matrices
	def +(o)

		suma = Array.new(matriz.size - 1)
#		for i in 0...matriz.size
		0.upto(matriz.size - 1) do |i|
		   	suma[i] = Array.new(matriz[i].size - 1)
#			for j in 0...matriz[i].size
			0.upto(matriz[i].size - 1) do |j|
				suma[i][j] = matriz[i][j] + o.matriz[i][j]
			end
		end
		MatrizDensa.new(suma)

	end

        # Suma de matrices densa con dispersa (sobreescribimos el operador / como prueba)
        def /(o)

                suma = Array.new(matriz.size - 1)
#		for i in 0...matriz.size
		0.upto(matriz.size - 1) do |i|
                        suma[i] = Array.new(matriz[i].size - 1)
#			for j in 0...matriz[i].size
			0.upto(matriz[i].size - 1) do |j|
			
				suma[i][j] = matriz[i][j]
					
				# comprobamos el hash
	                        if (o.matriz[i] != nil)
					
					# hay datos en el has para la columna
					if o.matriz[i].has_key?(j)						
                                		suma[i][j] = matriz[i][j] + o.matriz[i][j]
					end
					
				end

                        end
                end
                MatrizDensa.new(suma)

        end


	# Resta de matrices
	def -(o)

                resta = Array.new(matriz.size - 1)
#		for i in 0...matriz.size
		0.upto(matriz.size - 1) do |i|
			resta[i] = Array.new(matriz[i].size - 1)
#			for j in 0...matriz[i].size
			0.upto(matriz[i].size - 1) do |j|
				resta[i][j] = matriz[i][j] - o.matriz[i][j]
			end
                end
                MatrizDensa.new(resta)

	end

	# Multiplicación de matrices
	def *(o)

		prod = Array.new(matriz.size - 1,0)
#		for i in 0...matriz[0].size 
		0.upto(matriz[0].size - 1) do |i|
			prod[i] = Array.new(o.matriz.size,0)
#			for j in 0...o.matriz.size
			0.upto(o.matriz.size - 1) do |j|
#				for pos in 0...matriz.size
				0.upto(matriz.size - 1) do |pos|
					prod[i][j] = prod[i][j] + (matriz[i][pos] * o.matriz[pos][j])
				end
			end
		end
		MatrizDensa.new(prod)

	end

	# Máximo de matriz
	def max

		maximo = 0.to_f
		for i in 0...matriz.size
			for j in 0...matriz[i].size
				if matriz[i][j].to_f > maximo
					maximo = matriz[i][j].to_f
				end
			end
		end
		maximo

	end

	# Minimo de matriz
	def min

		minimo = $tope
		for i in 0...matriz.size
			for j in 0...matriz[i].size
				if matriz[i][j].to_f < minimo
					minimo = matriz[i][j].to_f
				end
			end
		end
		minimo

	end

	# Añadimos el coerce
	def coerce(other)
		return self, other
 	end

end

# Clase de Matriz dispersa
class MatrizDispersa < MatrizAbstracta

	# Inicialización
        def initialize(matriz)

                @matriz = matriz
                @filas = matriz.size
                @columnas = matriz.size

	end

	attr_reader :matriz, :filas, :columnas

	# Convertimos a string
	def to_s

                fil = 0
                print "["
                while fil < filas

			col = 0
			while col < columnas

                       		# Hay datos en la fila
                       		if matriz[fil] != nil

					if matriz[fil].has_key?(col)
						print "#{matriz[fil][col].to_s}"
                                        else
                                        	print "0"
					end 
				else
                                        print "0"
				end

	                       	if (col + 1) < columnas then print ", " end
        	                col += 1

			end


                        if (fil + 1) < filas then print ", " end
                        fil += 1

                end
                print "]"

	end

	#  Matriz en punto flotante
	def to_f

                flotante = Array.new(matriz.size - 1)
                for i in 0...matriz.size
			# Hay datos en la fila
                        if matriz[i] != nil
				
                        	flotante[i] = Hash.new()
                                matriz[i].each do |key, value|
					flotante[i][key] = matriz[i][key].to_f
                                end
			
			end

                end
                MatrizDispersa.new(flotante)

	end

	# Suma de matrices
	def +(o)

                suma = Array.new(matriz.size - 1)
                for i in 0...matriz.size
                      
			# creamos el hash
			if (matriz[i] != nil or o.matriz[i] != nil)

				suma[i] = Hash.new()
		
				case true

					# Los dos tienen hash
					when (matriz[i] != nil and o.matriz[i] != nil)
				
						# cogemos matriz como base para la suma
						suma[i] = matriz[i]

						o.matriz[i].each do |key, value|
				
							if suma[i].has_key?(key)
		                                        	suma[i][key] = suma[i][key] + o.matriz[i][key]
                		                        else
                                		                suma[i][key] = o.matriz[i][key]
		                                        end

                                		end

					# matriz tiene hash
					when matriz[i] != nil
						suma[i] = matriz[i]						
	
					# o hash
					when o.matriz[i] != nil
						suma[i] = o.matriz[i]


				end
			
			end

                end
                MatrizDispersa.new(suma)

	end

	# Resta de matrices
	def -(o)

                resta = Array.new(matriz.size - 1)
                for i in 0...matriz.size

                        # creamos el hash
                        if (matriz[i] != nil or o.matriz[i] != nil)

                                resta[i] = Hash.new()
                                        
                                case true

                                        # Los dos tienen hash
                                        when (matriz[i] != nil and o.matriz[i] != nil)
                                
                                                # cogemos matriz como base para la resta
                                                resta[i] = matriz[i]

                                                o.matriz[i].each do |key, value|
                                
                                                        if resta[i].has_key?(key)
                                                                resta[i][key] = resta[i][key] - o.matriz[i][key]
                                                        else
                                                                resta[i][key] = o.matriz[i][key] * -1
                                                        end

                                                end

                                        # matriz tiene hash
                                        when matriz[i] != nil
                                                resta[i] = matriz[i]                                             
        
                                        # o hash
                                        when o.matriz[i] != nil
						resta[i] = o.matriz[i]
						resta[i].each do |key, value|
							resta[i][key] =  resta[i][key] * -1
                                                end

                                end
                        
                        end

                end
                MatrizDispersa.new(resta)

	end

=begin
	# Multiplicación de matrices
	def *(o)

                prod = Array.new(matriz.size - 1,0)
                for i in 0...matriz.size

			if (o.matriz[i] != nil)

				aux = 0
				for j in 0...o.matriz.size

					if (matriz[j] != nil)

						if matriz[j].has_key?(i)

							# No existe hash en la fila
							if prod[j] != nil
								prod[j] = Hash.new()
							end

							aux = aux + (o.matriz[i][j] * matriz[j][i])	

						end<commit_msg>modificamos suma, resta y producto con times<commit_after>require "modai_prct11/version"
require "racional"

module ModaiPrct11

$tope = 9999999999.9
  
# Clase abstracta para herencia común de matrices densa y dispersa
class MatrizAbstracta

end

# Clase de Matriz densa
class MatrizDensa < MatrizAbstracta

	# Inicialización
	def initialize(matriz)

		@matriz = matriz
		@filas = matriz[0].size
		@columnas = matriz[0].size

	end

	attr_reader :matriz, :filas, :columnas

	# Convertimos a string
	def to_s

		fil = 0
		print "["
		while fil < filas

			col = 0					
			while col < columnas

				print "#{matriz[fil][col].to_s}"
				if (col + 1) < columnas then print ", " end
				col += 1

			end

			if (fil + 1) < filas then print ", " end
			fil += 1

		end
		print "]"

	end

	#  Matriz en punto flotante
	def to_f

                flotante = Array.new(matriz.size - 1)
                for i in 0...matriz.size
                        flotante[i] = Array.new(matriz[i].size - 1)
                        for j in 0...matriz[i].size
                                flotante[i][j] = (matriz[i][j]).to_f
                        end
                end
                MatrizDensa.new(flotante)

	end

	# Suma de matrices
	def +(o)

		suma = Array.new(matriz.size - 1)
#		for i in 0...matriz.size
		0.upto(matriz.size - 1) do |i|
		   	suma[i] = Array.new(matriz[i].size - 1)
#			for j in 0...matriz[i].size
			0.upto(matriz[i].size - 1) do |j|
				suma[i][j] = matriz[i][j] + o.matriz[i][j]
			end
		end
		MatrizDensa.new(suma)

	end

        # Suma de matrices densa con dispersa (sobreescribimos el operador / como prueba)
        def /(o)

                suma = Array.new(matriz.size - 1)
#		for i in 0...matriz.size
		0.upto(matriz.size - 1) do |i|
                        suma[i] = Array.new(matriz[i].size - 1)
#			for j in 0...matriz[i].size
			0.upto(matriz[i].size - 1) do |j|
			
				suma[i][j] = matriz[i][j]
					
				# comprobamos el hash
	                        if (o.matriz[i] != nil)
					
					# hay datos en el has para la columna
					if o.matriz[i].has_key?(j)						
                                		suma[i][j] = matriz[i][j] + o.matriz[i][j]
					end
					
				end

                        end
                end
                MatrizDensa.new(suma)

        end


	# Resta de matrices
	def -(o)

                resta = Array.new(matriz.size - 1)
#		for i in 0...matriz.size
		0.upto(matriz.size - 1) do |i|
			resta[i] = Array.new(matriz[i].size - 1)
#			for j in 0...matriz[i].size
			0.upto(matriz[i].size - 1) do |j|
				resta[i][j] = matriz[i][j] - o.matriz[i][j]
			end
                end
                MatrizDensa.new(resta)

	end

	# Multiplicación de matrices
	def *(o)

		prod = Array.new(matriz.size - 1,0)
#		for i in 0...matriz[0].size 
		0.upto(matriz[0].size - 1) do |i|
			prod[i] = Array.new(o.matriz.size,0)
#			for j in 0...o.matriz.size
			0.upto(o.matriz.size - 1) do |j|
#				for pos in 0...matriz.size
				0.upto(matriz.size - 1) do |pos|
					prod[i][j] = prod[i][j] + (matriz[i][pos] * o.matriz[pos][j])
				end
			end
		end
		MatrizDensa.new(prod)

	end

	# Máximo de matriz
	def max

		maximo = 0.to_f
		for i in 0...matriz.size
			for j in 0...matriz[i].size
				if matriz[i][j].to_f > maximo
					maximo = matriz[i][j].to_f
				end
			end
		end
		maximo

	end

	# Minimo de matriz
	def min

		minimo = $tope
		for i in 0...matriz.size
			for j in 0...matriz[i].size
				if matriz[i][j].to_f < minimo
					minimo = matriz[i][j].to_f
				end
			end
		end
		minimo

	end

	# Añadimos el coerce
	def coerce(other)
		return self, other
 	end

end

# Clase de Matriz dispersa
class MatrizDispersa < MatrizAbstracta

	# Inicialización
        def initialize(matriz)

                @matriz = matriz
                @filas = matriz.size
                @columnas = matriz.size

	end

	attr_reader :matriz, :filas, :columnas

	# Convertimos a string
	def to_s

                fil = 0
                print "["
                while fil < filas

			col = 0
			while col < columnas

                       		# Hay datos en la fila
                       		if matriz[fil] != nil

					if matriz[fil].has_key?(col)
						print "#{matriz[fil][col].to_s}"
                                        else
                                        	print "0"
					end 
				else
                                        print "0"
				end

	                       	if (col + 1) < columnas then print ", " end
        	                col += 1

			end


                        if (fil + 1) < filas then print ", " end
                        fil += 1

                end
                print "]"

	end

	#  Matriz en punto flotante
	def to_f

                flotante = Array.new(matriz.size - 1)
                for i in 0...matriz.size
			# Hay datos en la fila
                        if matriz[i] != nil
				
                        	flotante[i] = Hash.new()
                                matriz[i].each do |key, value|
					flotante[i][key] = matriz[i][key].to_f
                                end
			
			end

                end
                MatrizDispersa.new(flotante)

	end

	# Suma de matrices
	def +(o)

                suma = Array.new(matriz.size - 1)
#                for i in 0...matriz.size
		i = 0
                (matriz.size - 1).times do
                      
			# creamos el hash
			if (matriz[i] != nil or o.matriz[i] != nil)

				suma[i] = Hash.new()
		
				case true

					# Los dos tienen hash
					when (matriz[i] != nil and o.matriz[i] != nil)
				
						# cogemos matriz como base para la suma
						suma[i] = matriz[i]

						o.matriz[i].each do |key, value|
				
							if suma[i].has_key?(key)
		                                        	suma[i][key] = suma[i][key] + o.matriz[i][key]
                		                        else
                                		                suma[i][key] = o.matriz[i][key]
		                                        end

                                		end

					# matriz tiene hash
					when matriz[i] != nil
						suma[i] = matriz[i]						
	
					# o hash
					when o.matriz[i] != nil
						suma[i] = o.matriz[i]


				end
			
			end

			i += 1

                end
                MatrizDispersa.new(suma)

	end

	# Resta de matrices
	def -(o)

                resta = Array.new(matriz.size - 1)
#                for i in 0...matriz.size
		i = 0
                (matriz.size - 1).times do

                        # creamos el hash
                        if (matriz[i] != nil or o.matriz[i] != nil)

                                resta[i] = Hash.new()
                                        
                                case true

                                        # Los dos tienen hash
                                        when (matriz[i] != nil and o.matriz[i] != nil)
                                
                                                # cogemos matriz como base para la resta
                                                resta[i] = matriz[i]

                                                o.matriz[i].each do |key, value|
                                
                                                        if resta[i].has_key?(key)
                                                                resta[i][key] = resta[i][key] - o.matriz[i][key]
                                                        else
                                                                resta[i][key] = o.matriz[i][key] * -1
                                                        end

                                                end

                                        # matriz tiene hash
                                        when matriz[i] != nil
                                                resta[i] = matriz[i]                                             
        
                                        # o hash
                                        when o.matriz[i] != nil
						resta[i] = o.matriz[i]
						resta[i].each do |key, value|
							resta[i][key] =  resta[i][key] * -1
                                                end

                                end
                        
                        end

			i += 1

                end
                MatrizDispersa.new(resta)

	end

=begin
	# Multiplicación de matrices
	def *(o)

                prod = Array.new(matriz.size - 1,0)
                for i in 0...matriz.size

			if (o.matriz[i] != nil)

				aux = 0
				for j in 0...o.matriz.size

					if (matriz[j] != nil)

						if matriz[j].has_key?(i)

							# No existe hash en la fila
							if prod[j] != nil
								prod[j] = Hash.new()
							end

							aux = aux + (o.matriz[i][j] * matriz[j][i])	

						end
{'fraction_non_alphanumeric': 0.10601586474436918, 'fraction_numerical': 0.010885299056221412, 'mean_word_length': 1.012349994174531, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 92, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2714697', 'n_tokens_mistral': 6621, 'n_tokens_neox': 5434, 'n_words': 1345}