<commit_before># модель - цепочка диспозиций построенная для какого-либо объекта
class Chain < ActiveRecord::Base

  # константа в кторой хранятся названия планет, соответствующие им префиксы в модели цепочки
  # и символ которым они кодируются в специальном шрифте 'astro'
  PLANETS=[ {:planet_name=>'Солнце', :planet_prefix=>'sun', :planet_symbol=>'Q'},
            {:planet_name=>'Луна', :planet_prefix=>'moo', :planet_symbol=>'R'},
            {:planet_name=>'Меркурий', :planet_prefix=>'mer', :planet_symbol=>'S'},
            {:planet_name=>'Венера', :planet_prefix=>'ven', :planet_symbol=>'T'},
            {:planet_name=>'Марс', :planet_prefix=>'mar', :planet_symbol=>'U'},
            {:planet_name=>'Юпитер', :planet_prefix=>'jup', :planet_symbol=>'V'},
            {:planet_name=>'Сатурн', :planet_prefix=>'sat', :planet_symbol=>'W'},
            {:planet_name=>'Уран', :planet_prefix=>'ura', :planet_symbol=>'X'},
            {:planet_name=>'Нептун', :planet_prefix=>'nep', :planet_symbol=>'Y'},
            {:planet_name=>'Плутон', :planet_prefix=>'plu', :planet_symbol=>'Z'}
            ].freeze

  # константа с символами оконечных планет
  ENDERS=['&lt;','&gt;','d','e'].freeze

  belongs_to :astro_object

  # метод, визуализирующий цепочку в виде графа с помощью библиотеки GraphWiz. принимает имя файла в который будет производится визуализация
  def graph_create(image_name)

    # создается объект-направленный граф
    g = GraphViz::new( "G", "rankdir" => direction, :use => visualization )
    graph_nodes=[]
    
    # если цепочка строится по септенеру, количество планет ограничивается семью. иначе - девять
    if septener
      nodes_count=6
    else
      nodes_count=9
    end

    # в зависимости от выбранного стиля визуализации центров, определяется цвет рамки, выделяющей центры,
    # и цвет элементов находящихся в центрах
    if center_style=="frame"
      frame_color="red"
      element_color="black"
    else
      frame_color="white"
      element_color="red"
    end

    # параметры цепочки просматриваеюся, и в графе создается необходимое количество кластеров
    0.upto nodes_count do |i|
      pl_center=eval("#{PLANETS[i][:planet_prefix]}_center")
      if pl_center>0 
        instance_variable_set("@c#{pl_center}", g.add_graph("cluster#{pl_center}"))
        eval("@c#{pl_center}")["color"]=frame_color
      end 
    end

    # проходим цикл по всем планетам для формирования узлов графа
    0.upto nodes_count do |i|
      # для планеты вытаскиваем префикс, символ в шрифте, вес в графе и признак ретроградности
      pl_prefix=PLANETS[i][:planet_prefix]
      pl_symbol=PLANETS[i][:planet_symbol]
      pl_weigth=eval("#{pl_prefix}_weigth")
      pl_retro=eval("#{pl_prefix}_retro")

      # формируем строку, которая в описании узла-планеты в графе отвечает за вес
      if pl_weigth==nil
        pl_weigth_string=''
      else
        pl_weigth_string="<font color='forestgreen' point-size='20'>#{pl_weigth}</font>"
      end

      # формируем строку, которая в описании узла-планеты в графе отвечает за ретроградность
      if pl_retro
        pl_retro_string="<font color='black' point-size='20'>N</font>"
      else
        pl_retro_string=''
      end

      # узнаем, принадлежит ли планета к какому-либо кластеру и добавляем узел-планету к соответствующему кластеру
      pl_center=eval("#{pl_prefix}_center")
      case pl_center
      when 0
        graph_nodes[i]=g.add_nodes(pl_prefix, :label=>"<<font face='astro-semibold' point-size='25'>#{pl_symbol}#{pl_weigth_string}#{pl_retro_string}</font>>")
      when 1..6
        graph_nodes[i]=eval("@c#{pl_center}").add_nodes(pl_prefix, :label=>"<<font face='astro-semibold' point-size='25'>#{pl_symbol}#{pl_weigth_string}#{pl_retro_string}</font>>", :color=>element_color)
      end
    end

    # добавляем конечную планету
    if end_planet>100
      graph_nodes[nodes_count+1]=g.add_nodes('ender', :label=>"<<font face='astro-semibold' point-size='25'>#{ENDERS[end_planet-101]}</font>>")
    end

    # снова проходим по всем планетам для создания связей между узлами графа
    0.upto nodes_count do |i|
      # определяем с какой планетой связана планета
      pl_relation=eval("#{PLANETS[i][:planet_prefix]}_relation")
      # если связь есть, то создаем
      if eval("#{PLANETS[i][:planet_prefix]}_center")>0
        edge_color=element_color
      else
        edge_color="black"
      end
      # создание связи к обычной планете
      g.add_edges(graph_nodes[i], graph_nodes[pl_relation], :color=>edge_color, :len=>"1.2") if pl_relation<100
      # создание свзяи к конеченой планете
      g.add_edges(graph_nodes[i], graph_nodes[nodes_count+1], :color=>edge_color, :len=>"1.2") if pl_relation>100
    end
    
    # собственно визуализация графа в файл<commit_msg>show a cluster for the end planet<commit_after># модель - цепочка диспозиций построенная для какого-либо объекта
class Chain < ActiveRecord::Base

  # константа в кторой хранятся названия планет, соответствующие им префиксы в модели цепочки
  # и символ которым они кодируются в специальном шрифте 'astro'
  PLANETS=[ {:planet_name=>'Солнце', :planet_prefix=>'sun', :planet_symbol=>'Q'},
            {:planet_name=>'Луна', :planet_prefix=>'moo', :planet_symbol=>'R'},
            {:planet_name=>'Меркурий', :planet_prefix=>'mer', :planet_symbol=>'S'},
            {:planet_name=>'Венера', :planet_prefix=>'ven', :planet_symbol=>'T'},
            {:planet_name=>'Марс', :planet_prefix=>'mar', :planet_symbol=>'U'},
            {:planet_name=>'Юпитер', :planet_prefix=>'jup', :planet_symbol=>'V'},
            {:planet_name=>'Сатурн', :planet_prefix=>'sat', :planet_symbol=>'W'},
            {:planet_name=>'Уран', :planet_prefix=>'ura', :planet_symbol=>'X'},
            {:planet_name=>'Нептун', :planet_prefix=>'nep', :planet_symbol=>'Y'},
            {:planet_name=>'Плутон', :planet_prefix=>'plu', :planet_symbol=>'Z'}
            ].freeze

  # константа с символами оконечных планет
  ENDERS=['&lt;','&gt;','d','e'].freeze

  belongs_to :astro_object

  # метод, визуализирующий цепочку в виде графа с помощью библиотеки GraphWiz. принимает имя файла в который будет производится визуализация
  def graph_create(image_name)

    # создается объект-направленный граф
    g = GraphViz::new( "G", "rankdir" => direction, :use => visualization )
    graph_nodes=[]
    
    # если цепочка строится по септенеру, количество планет ограничивается семью. иначе - девять
    if septener
      nodes_count=6
    else
      nodes_count=9
    end

    # в зависимости от выбранного стиля визуализации центров, определяется цвет рамки, выделяющей центры,
    # и цвет элементов находящихся в центрах
    if center_style=="frame"
      frame_color="red"
      element_color="black"
    else
      frame_color="white"
      element_color="red"
    end

    # параметры цепочки просматриваеюся, и в графе создается необходимое количество кластеров
    0.upto nodes_count do |i|
      pl_center=eval("#{PLANETS[i][:planet_prefix]}_center")
      if pl_center>0 
        instance_variable_set("@c#{pl_center}", g.add_graph("cluster#{pl_center}"))
        eval("@c#{pl_center}")["color"]=frame_color
      end 
    end
    if end_center>0
      instance_variable_set("@c#{end_center}", g.add_graph("cluster#{end_center}"))
      eval("@c#{end_center}")["color"]=frame_color
    end

    # проходим цикл по всем планетам для формирования узлов графа
    0.upto nodes_count do |i|
      # для планеты вытаскиваем префикс, символ в шрифте, вес в графе и признак ретроградности
      pl_prefix=PLANETS[i][:planet_prefix]
      pl_symbol=PLANETS[i][:planet_symbol]
      pl_weigth=eval("#{pl_prefix}_weigth")
      pl_retro=eval("#{pl_prefix}_retro")

      # формируем строку, которая в описании узла-планеты в графе отвечает за вес
      if pl_weigth==nil
        pl_weigth_string=''
      else
        pl_weigth_string="<font color='forestgreen' point-size='20'>#{pl_weigth}</font>"
      end

      # формируем строку, которая в описании узла-планеты в графе отвечает за ретроградность
      if pl_retro
        pl_retro_string="<font color='black' point-size='20'>N</font>"
      else
        pl_retro_string=''
      end

      # узнаем, принадлежит ли планета к какому-либо кластеру и добавляем узел-планету к соответствующему кластеру
      pl_center=eval("#{pl_prefix}_center")
      case pl_center
      when 0
        graph_nodes[i]=g.add_nodes(pl_prefix, :label=>"<<font face='astro-semibold' point-size='25'>#{pl_symbol}#{pl_weigth_string}#{pl_retro_string}</font>>")
      when 1..6
        graph_nodes[i]=eval("@c#{pl_center}").add_nodes(pl_prefix, :label=>"<<font face='astro-semibold' point-size='25'>#{pl_symbol}#{pl_weigth_string}#{pl_retro_string}</font>>", :color=>element_color)
      end
    end

    # добавляем конечную планету
    if end_planet>100
      case end_center
      when 0
        graph_nodes[nodes_count+1]=g.add_nodes('ender', :label=>"<<font face='astro-semibold' point-size='25'>#{ENDERS[end_planet-101]}</font>>")
      when 1..6
        graph_nodes[nodes_count+1]=eval("@c#{end_center}").add_nodes('ender', :label=>"<<font face='astro-semibold' point-size='25'>#{ENDERS[end_planet-101]}</font>>", :color=>element_color)
      end
    end

    # снова проходим по всем планетам для создания связей между узлами графа
    0.upto nodes_count do |i|
      # определяем с какой планетой связана планета
      pl_relation=eval("#{PLANETS[i][:planet_prefix]}_relation")
      # если связь есть, то создаем
      if eval("#{PLANETS[i][:planet_prefix]}_center")>0
        edge_color=element_color
      else
        edge_color="black"
      end
      # создание связи к обычной планете
      g.add_edges(graph_nodes[i], graph_nodes[pl_relation], :color=>edge_color, :len=>"1.2") if pl_relation<100
      # создание свзяи к конечной планете
      g.add_edges(graph_nodes[i], graph_nodes[nodes_count+1], :color=>edge_color, :len=>"1.2") if pl_relation>100
    end
    
    # собственно визуализация графа в файл
{'fraction_non_alphanumeric': 0.13576423576423577, 'fraction_numerical': 0.008591408591408592, 'mean_word_length': 3.895354523227384, 'pattern_counts': {'":': 0, '<': 36, '<?xml version=': 0, '>': 123, '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': '2837801', 'n_tokens_mistral': 3885, 'n_tokens_neox': 4211, 'n_words': 699}