<commit_before># -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import sys
import re
import math
import itertools
import binascii
from collections import deque
from PIL import Image
from StringIO import StringIO
import time
import a_star
import communication
import heapq
import gui

VERSION = "新しいグラフ構造でシンプルなMD(deepcopyしない版)"
TO_COMMUNICATION = True #Trueのときは自鯖の回答サーバー、FalseのときはlocalhostのProconSimpleServerと通信します。
IMAGE_WINDOW = True
NO_POST = False

def split(img, columns, rows):
    images = []
    # shapeで画像サイズを取れるが、[高さ, 幅, 3]の順番になっているので注意
    fullWidth = img.shape[1]
    fullHeight = img.shape[0]
    splitWidth = fullWidth / columns
    splitHeight = fullHeight / rows
    for i in range(columns):
      column = []
      for j in range(rows):
        left = splitWidth * i
        right = left + splitWidth
        top = splitHeight * j
        bottom = top + splitHeight
        # 画像を切り出す
        # これは画像をコピーしないため高速
        # ただし、切り出した画像に書き込むと元画像にも書き込まれるので注意
        # [y, x] の順番なので注意
        splitImage = img[top:bottom, left:right]
        column.append(splitImage)
      images.append(column)
    return images

# 画像の辺を比較する
# flag=Trueの場合、aの右にbを置く
# flag=Falseの場合、aの下にbを置く
def compare(imgA, imgB, flag):
    width = imgA.shape[1]
    height = imgA.shape[0]
    if flag:
      # 横に比較する場合
      lineA = imgA[0:height, width - 1]
      lineB = imgB[0:height, 0]
    else:
      # 縦に比較する場合
      lineA = imgA[height - 1, 0:width]
      lineB = imgB[0, 0:width]
    # 配列の各ピクセルに対して、差の二乗を3色分足し合わせてルートを計算し、配列全体の合計を計算する。
    difference = np.sum(np.sqrt(np.sum((lineA-lineB)*(lineA-lineB), axis=1)))
    return difference / len(lineA)

def findRightBottom(resultW, resultH):
    lst = []
    for k, v in resultW.items():
      minValueW = min(v, key=lambda a: a[1])[1]
      minValueH = min(resultH[k], key=lambda a: a[1])[1]
      lst.append((k, minValueW * minValueH))
    lst.sort(key=lambda a: a[1])
    lst.reverse()
    return lst


def createArray(width, height):
    array = []
    for x in range(width):
      column = []
      for y in range(height):
        column.append(None)
      array.append(column)
    return array

# [left, right, top, bottom]
# -1は範囲外
# Noneは未設定
def getNeighbours(x, y, array):
    width = len(array)
    height = len(array[0])
    result = [-1, -1, -1, -1]
    if x - 1 >= 0:
      result[0] = array[x - 1][y]
    if x + 1 < width:
      result[1] = array[x + 1][y]
    if y - 1 >= 0:
      result[2] = array[x][y - 1]
    if y + 1 < height:
      result[3] = array[x][y + 1]
    return result

def average(xs):
    return sum(xs) / len(xs)

def addpos(a, b):
  return (a[0] + b[0], a[1] + b[1])

# 画像を並び替える
def sortImages2(resultAToBWidth, resultBToAWidth, resultAToBHeight, resultBToAHeight, startList, array):
  tables = [(resultAToBWidth, (1, 0)), (resultBToAWidth, (-1, 0)), (resultAToBHeight, (0, 1)), (resultBToAHeight, (0, -1))]
  queue = []
  # (類似度, 注目している画像, 現在座標)
  heapq.heappush(queue, (0.0, (0, 0), (0, 0)))
  used = set()  # 使用した画像
  imgs = {}
  while len(queue) != 0:
    # 一番類似しているものから取り出す
    value, img, pos = heapq.heappop(queue)
    # すでに使った画像は使わない
    if img in used:
      continue
    # usedに追加
    used.add(img)
    print (value, img, pos)
    imgs[pos] = img
    # 隣をqueueに入れる
    for table, direction in tables:
      heapq.heappush(queue, (table[img][0][1], table[img][0][0], addpos(pos, direction)))
  # 座標をシフトする
  print imgs
  minX = min(imgs.keys(), key=lambda a: a[0])[0]
  minY = min(imgs.keys(), key=lambda a: a[1])[1]
  print "minX=%d, minY=%d" % (minX, minY)
  out = [] # はみ出し画像
  for k, v in imgs.items():
    x = k[0] - minX
    y = k[1] - minY
    if x >= len(array[0]) or y >= len(array):
      # はみ出し
      out.append(v)
    else:
      array[x][y] = v
  # はみ出している画像は適当に欠けているところに入れる
  for i in range(len(array)):
    for j in range(len(array[0])):
      if array[i][j] == None:
        array[i][j] = out.pop()
  return array

# MARK: main

if len(sys.argv) < 2:
  print "引数が間違っておるぞ!"
  sys.exit(1)
time_start = time.clock()
# 分割数の読み込み
# 100という数字は決め打ち!すばらしい!

# 引数パース
options = set()
for arg in sys.argv[2:]:
  options.add(arg)

if "-p" in options:
  TO_COMMUNICATION = False
  print "communication with Proocn Simple Server at localhost"
else:
  TO_COMMUNICATION = True
  print "communication with sp2lc.salesio-sp.ac.jp/procon.php"
if "-n" in options:<commit_msg>だいたい解決したが畳などで不安定<commit_after># -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import sys
import re
import math
import itertools
import binascii
from collections import deque
from PIL import Image
from StringIO import StringIO
import time
import a_star
import communication
import heapq
import gui

VERSION = "新しいグラフ構造でシンプルなMD(deepcopyしない版)"
TO_COMMUNICATION = True #Trueのときは自鯖の回答サーバー、FalseのときはlocalhostのProconSimpleServerと通信します。
IMAGE_WINDOW = True
NO_POST = False

def split(img, columns, rows):
    images = []
    # shapeで画像サイズを取れるが、[高さ, 幅, 3]の順番になっているので注意
    fullWidth = img.shape[1]
    fullHeight = img.shape[0]
    splitWidth = fullWidth / columns
    splitHeight = fullHeight / rows
    for i in range(columns):
      column = []
      for j in range(rows):
        left = splitWidth * i
        right = left + splitWidth
        top = splitHeight * j
        bottom = top + splitHeight
        # 画像を切り出す
        # これは画像をコピーしないため高速
        # ただし、切り出した画像に書き込むと元画像にも書き込まれるので注意
        # [y, x] の順番なので注意
        splitImage = img[top:bottom, left:right]
        column.append(splitImage)
      images.append(column)
    return images

# 画像の辺を比較する
# flag=Trueの場合、aの右にbを置く
# flag=Falseの場合、aの下にbを置く
def compare(imgA, imgB, flag):
    width = imgA.shape[1]
    height = imgA.shape[0]
    if flag:
      # 横に比較する場合
      lineA = imgA[0:height, width - 1]
      lineB = imgB[0:height, 0]
    else:
      # 縦に比較する場合
      lineA = imgA[height - 1, 0:width]
      lineB = imgB[0, 0:width]
    # 配列の各ピクセルに対して、差の二乗を3色分足し合わせてルートを計算し、配列全体の合計を計算する。
    difference = np.sum(np.sqrt(np.sum((lineA-lineB)*(lineA-lineB), axis=1)))
    return difference / len(lineA)

def findRightBottom(resultW, resultH):
    lst = []
    for k, v in resultW.items():
      minValueW = min(v, key=lambda a: a[1])[1]
      minValueH = min(resultH[k], key=lambda a: a[1])[1]
      lst.append((k, minValueW * minValueH))
    lst.sort(key=lambda a: a[1])
    lst.reverse()
    return lst


def createArray(width, height):
    array = []
    for x in range(width):
      column = []
      for y in range(height):
        column.append(None)
      array.append(column)
    return array

# [left, right, top, bottom]
# -1は範囲外
# Noneは未設定
def getNeighbours(x, y, array):
    width = len(array)
    height = len(array[0])
    result = [-1, -1, -1, -1]
    if x - 1 >= 0:
      result[0] = array[x - 1][y]
    if x + 1 < width:
      result[1] = array[x + 1][y]
    if y - 1 >= 0:
      result[2] = array[x][y - 1]
    if y + 1 < height:
      result[3] = array[x][y + 1]
    return result

def average(xs):
    return sum(xs) / len(xs)

def addpos(a, b):
  return (a[0] + b[0], a[1] + b[1])

# 画像を並び替える
def sortImages2(resultAToBWidth, resultBToAWidth, resultAToBHeight, resultBToAHeight, startList, array):
  tables = [(resultAToBWidth, (1, 0)), (resultBToAWidth, (-1, 0)), (resultAToBHeight, (0, 1)), (resultBToAHeight, (0, -1))]
  queue = []
  # (類似度, 注目している画像, 現在座標)
  heapq.heappush(queue, (0.0, (0, 0), (0, 0)))
  used = set((0, 0))  # 使用した画像
  imgs = {}
  imgs[(0, 0)] = (0, 0)
  while len(queue) != 0:
    # 一番類似しているものから取り出す
    value, img, pos = heapq.heappop(queue)
    # すでに使った画像は使わない
    if img in used:
      continue
    # 終了条件
    if len(imgs) == len(array) * len(array[0]):
      print "finish!"
      break
    # usedに追加
    used.add(img)
    print (value, img, pos)
    imgs[pos] = img
    # 隣をqueueに入れる
    for table, direction in tables:
      for new_img in table[img]:
        heapq.heappush(queue, (new_img[1], new_img[0], addpos(pos, direction)))
  # 座標をシフトする
  print imgs
  minX = min(imgs.keys(), key=lambda a: a[0])[0]
  minY = min(imgs.keys(), key=lambda a: a[1])[1]
  print "minX=%d, minY=%d" % (minX, minY)
  #out = [] # はみ出し画像
  all_imgs = set([(x, y) for x in range(len(array)) for y in range(len(array[0]))])
  used_imgs = set()
  for k, v in imgs.items():
    x = k[0] - minX
    y = k[1] - minY
    if x >= len(array) or y >= len(array[0]):
      # はみ出し
      #out.append(v)
      print "out"
      print "%s %s" % ((x, y), v)
    else:
      array[x][y] = v
      used_imgs.add(v)
  print array
  # はみ出している画像は適当に欠けているところに入れる
  out = all_imgs - used_imgs
  print out
  for i in range(len(array)):
    for j in range(len(array[0])):
      if array[i][j] == None:
        array[i][j] = out.pop()
  return array

# MARK: main

if len(sys.argv) < 2:
  print "引数が間違っておるぞ!"
  sys.exit(1)
time_start = time.clock()
# 分割数の読み込み
# 100という数字は決め打ち!すばらしい!

# 引数パース
options = set()
for arg in sys.argv[2:]:
  options.add(arg)

if "-p" in options:
  TO_COMMUNICATION = False
  print "communication with Proocn Simple Server at localhost"
else:
  TO_COMMUNICATION = True
  print "communication with sp2lc.salesio-sp.ac.jp/procon.php"
if "-n" in options:
{'fraction_non_alphanumeric': 0.14088487879117295, 'fraction_numerical': 0.01804543972170888, 'mean_word_length': 2.9383561643835616, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 11, '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': '2024578', 'n_tokens_mistral': 4146, 'n_tokens_neox': 4045, 'n_words': 891}