<commit_before># coding: utf-8
# = matriz.rb

# == Construcción de una gema.
#  -> Se pretende construir una gema que contenga los principales métodos para matrices densas y dispersas siguiendo la filosofía de la programación funcional.
#  -> Utilización de la gema Rdoc para generar documentación.
#

module Operatoria
     
   #Funcion que asigna un valor k a una posicion i,j dentro de la matriz
   def []=(i, j, k)
      matriz[i][j] = k
   end
  
    #Sobrecargado el + para poder sumar 2 matrices
   def +(other)
      raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
      sum = Matriz.new(matriz) #inicializas el vector sum con el primer con el primer
       0.upto(filas-1) do |i|
          0.upto(columnas-1) do |j|
            sum.matriz[i][j] = self.matriz[i][j] + other.matriz[i][j]
         end
      end
      return sum #devuelve un tipo array modificando el objeto m1 si se hace m3=m1+m2 -> Se necesita q sea tipo Matriz
   end
   
   #Sobrecargado el - para poder restar 2 matrices
   def -(other)
      raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
      resta = Matriz.new(matriz)
      0.upto(filas-1) do |i|
         0.upto(columnas-1) do |j|
            resta.matriz[i][j] = self.matriz[i][j] - other.matriz[i][j]
         end
      end
      return resta #devuelve un tipo matriz modificando el objeto m1 si se hace m3=m1+m2
   end
   

   def Producto_escalar (other)
      mul = Matriz.new(matriz)
      self.filas.times do |i|
         self.columnas.times do |j|
            mul.matriz[i][j] = self.matriz[i][j] * other
         end
      end
      return mul
   end
   
   #Para comprobar que dos matrices son equivalentes,primero se comprueba sus dimensiones. Si tienen las mismas dimensiones se comprueba que el valor de ambas matrices sean iguales en las mismas posiciones,si esto es así se devuelve true,false en otro caso.
   def ==(other)
      dev=true
      if ((self.filas.size==other.filas.size) && (self.columnas.size==other.columnas.size))
         self.filas.times do |i|
            self.columnas.times do |j|
               if (self.matriz[i][j] != other.matriz[i][j])
         dev=false
         else
         end
         end
         end
      else
         dev=false
      end
      return dev
   end
   
   
   #Realiza el opuesto de una matriz
   def -@
   op = Matriz.new(matriz)
      self.filas.times do |i|                 
         self.columnas.times do |j|
            op.matriz[i][j] = -self.matriz[i][j]
         end
      end
      return op
   
   end
   
   #Dos matrices son multiplicables si el numero de columnas de A coincide con el numero de filas de B
   def * (other)
      raise ArgumentError, "La longitud de las matrices no coincide." unless @columnas == other.filas
      elemento = Array.new
      acumulado = 0
      self.filas.times do |i|
         elemento_fila = Array.new
         other.columnas.times do |j|
            acumulado = 0
            self.columnas.times do |k|
               suma = @matriz[i][k] * other.matriz[k][j]
               acumulado = suma + acumulado
            end
            elemento_fila << acumulado
         end
         elemento << elemento_fila
      end
      Matriz.new(elemento)
   end
end
  
# ===Clase Matriz
#
#   Es la clase base de nuestra aplicación,en ella se definen los principales métodos para operar con matrices(mediante el modulo operatoria).
#    
class Matriz
   require "./racional.rb" #definicion de la clase racional
   
   include Operatoria
   #atributos de la clase
   attr_accessor :matriz, :filas, :columnas
   
   def initialize(matriz)
      @matriz = Array.new(matriz)
      @filas = matriz.size
      @columnas = matriz[0].size
      @n_elementos= (matriz.size * matriz[0].size)*0.6
       n_ceros=0
      filas.times do |i|
         columnas.times do |j|
         if (matriz[i][j]==0)<commit_msg>añadiendo tarea para el dsl<commit_after># coding: utf-8
# = matriz.rb

# == Construcción de una gema.
#  -> Se pretende construir una gema que contenga los principales métodos para matrices densas y dispersas siguiendo la filosofía de la programación funcional.
#  -> Utilización de la gema Rdoc para generar documentación.
#

module Operatoria
     
   #Funcion que asigna un valor k a una posicion i,j dentro de la matriz
   def []=(i, j, k)
      matriz[i][j] = k
   end
  
    #Sobrecargado el + para poder sumar 2 matrices
   def +(other)
      raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
      sum = Matriz.new(matriz) #inicializas el vector sum con el primer con el primer
       0.upto(filas-1) do |i|
          0.upto(columnas-1) do |j|
            sum.matriz[i][j] = self.matriz[i][j] + other.matriz[i][j]
         end
      end
      return sum #devuelve un tipo array modificando el objeto m1 si se hace m3=m1+m2 -> Se necesita q sea tipo Matriz
   end
   
   #Sobrecargado el - para poder restar 2 matrices
   def -(other)
      raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
      resta = Matriz.new(matriz)
      0.upto(filas-1) do |i|
         0.upto(columnas-1) do |j|
            resta.matriz[i][j] = self.matriz[i][j] - other.matriz[i][j]
         end
      end
      return resta #devuelve un tipo matriz modificando el objeto m1 si se hace m3=m1+m2
   end
   

   def Producto_escalar (other)
      mul = Matriz.new(matriz)
      self.filas.times do |i|
         self.columnas.times do |j|
            mul.matriz[i][j] = self.matriz[i][j] * other
         end
      end
      return mul
   end
   
   #Para comprobar que dos matrices son equivalentes,primero se comprueba sus dimensiones. Si tienen las mismas dimensiones se comprueba que el valor de ambas matrices sean iguales en las mismas posiciones,si esto es así se devuelve true,false en otro caso.
   def ==(other)
      dev=true
      if ((self.filas.size==other.filas.size) && (self.columnas.size==other.columnas.size))
         self.filas.times do |i|
            self.columnas.times do |j|
               if (self.matriz[i][j] != other.matriz[i][j])
         dev=false
         else
         end
         end
         end
      else
         dev=false
      end
      return dev
   end
   
   
   #Realiza el opuesto de una matriz
   def -@
   op = Matriz.new(matriz)
      self.filas.times do |i|                 
         self.columnas.times do |j|
            op.matriz[i][j] = -self.matriz[i][j]
         end
      end
      return op
   
   end
   
   #Dos matrices son multiplicables si el numero de columnas de A coincide con el numero de filas de B
   def * (other)
      raise ArgumentError, "La longitud de las matrices no coincide." unless @columnas == other.filas
      elemento = Array.new
      acumulado = 0
      self.filas.times do |i|
         elemento_fila = Array.new
         other.columnas.times do |j|
            acumulado = 0
            self.columnas.times do |k|
               suma = @matriz[i][k] * other.matriz[k][j]
               acumulado = suma + acumulado
            end
            elemento_fila << acumulado
         end
         elemento << elemento_fila
      end
      Matriz.new(elemento)
   end
end
  
# ===Clase Matriz
#
#   Es la clase base de nuestra aplicación,en ella se definen los principales métodos para operar con matrices(mediante el modulo operatoria).
#    
class Matriz
   require "./lib/racional.rb" #definicion de la clase racional
   
   include Operatoria
   #atributos de la clase
   attr_accessor :matriz, :filas, :columnas
   
   def initialize(matriz)
      @matriz = Array.new(matriz)
      @filas = matriz.size
      @columnas = matriz[0].size
      @n_elementos= (matriz.size * matriz[0].size)*0.6
       n_ceros=0
      filas.times do |i|
         columnas.times do |j|
         if (matriz[i][j]==0)
{'fraction_non_alphanumeric': 0.093125, 'fraction_numerical': 0.00675, 'mean_word_length': 2.159952606635071, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2301790', 'n_tokens_mistral': 2723, 'n_tokens_neox': 2693, 'n_words': 827}