Изменение размера двоичного файла в формате (размер, индексы)? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть мирады 1D двоичных файлов (представленные в виде битовых индексов), которые я хочу иметь возможность уменьшать и увеличивать размеры детерминистически и в то же время хочу максимально использовать ловкость / разрешение доступных битов. Что это значит, так это убедиться, что я использую биты справедливо, т.е. стараюсь не использовать несколько битов, игнорируя их neibohrs.

Представление двоичного файла выглядит так: (size, [ b1, b2, b3, ... bn]) , fe

  (100, [5,7,15,35,55]) : size of the binary is 100 bits, where bits 5,7,15,35,55 are set to 1

Теперь задача состоит в том, чтобы изменить размер двоичного файла. Существует 4 возможных режима:

  #no bits resize, just multiply by ratio
  1. Change virtual size from 100 to 200
  2. Change virtual size from 100 to 50

  #change number of bits, and also resize 
  3. Change number of bit indexes from 10 to 20
  4. Change number of bit indexes from 10 to 5

, где вы можете комбинировать 1 или 2 с 3 или 4. Результат изменения размера должен быть детерминированным c в обоих направлениях.

Что я До сих пор считалась следующая функция изменения размера для случаев 1 и 2:

size = 100; new_size = 200
bits = np.random.randint(0,size, 10, dtype=np.uint16)
print bits
size_ratio = size/float(new_size)
print size_ratio
res = np.round(bits * size_ratio).astype(np.uint16)
res[res > new_size] = 0
print  res

, и для 3,4 просто идея использовать что-то подобное для масштабирования:

 res = np.round(np.random.uniform((ary-1) * spa_ratio, ary * spa_ratio)).astype(np.uint16)

для этого нужно «масштабировать / прогнозировать в диапазоне» (upscale), скажем, что spa_ratio равно 3, тогда

1 =>  1 to 3
2 =>  3 to 6
3 =>  6 to 9 
.....

Проблема заключается в том, как генерировать несколько значений ... например, если число битов 10 и масштабировать до 20, я, вероятно, могу назвать это дважды (не сработает, потому что это будет «предсказывать» чаще одно и то же значение в диапазоне). А также, что, если мне нужно сделать 10 => 15, тогда spa_ratio = 1.5!? т. е. генерировать 1 с половиной бита ...

Помимо этого вопроса мне также необходимо добиться согласованного увеличения и уменьшения одинаковых значений. Каким-то образом приходится делать мемоизацию не только в одном направлении, но и в обоих направлениях (то есть, если я увеличу двоичный файл в следующем раунде, когда мне придется уменьшить это значение повторно)

 010  ==> 0110  remember
 0110 ==> 010  reuse

Ввод известен и когда я изменяю размер и позже изменяю размер, я должен получить то же значение (небольшая ошибка в порядке, ~ 10%)

У меня могут быть случаи изменения размера цепочки:

 010 => 0110 => 0010100   forward
 0010100 => 0110 => 010   backward

Вы не должны давать мне полный ответ. Советы и идеи по части вопросов тоже в порядке.

...