Skip to content

Commit

Permalink
Finalize
Browse files Browse the repository at this point in the history
  • Loading branch information
annndruha committed Dec 29, 2023
1 parent ee9f5c6 commit 2b0f409
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 66 deletions.
54 changes: 54 additions & 0 deletions docs/3_Generate_dataset.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# 3. Создание датасета

### 3.1 Intro

Датасет представляет собой набор файлов организованный следующим образом:

* `dataset` - базовая папка (уже существует в проекте)
* `measurement_variant_1` - Вариант настройки измерителя (определённая частота, напряжение и т.д.)
* `X` - папка относящаяся к конкретному классу (Описание классов в пункте 2)
* `N.cir` - файл схемы с определенными параметрами
* `N.png` - ВАХ схемы, с указанием параметров измерения и класса схемы
* `N.uzf` - EPCore формат хранящий настройки измерения и кривую ВАХ
* `N2.cir` - другие параметры элементов в схеме того же класса с теми же настройками измерителя


### 3.2 Создание датасета

* Активировать виртуальное окружение (с установленными `requirements.dev`)
* Из корня проекта в консоли запустить модуль:

```commandline
python -m generate_dataset --image
```

* При отсутствии флага --image изображения ВАХ генерироваться не будут

### 3.3 Настройки генерации

Удалите прошлый датасет руками, если он вам не понравился.

Чтобы настроить параметры генерации и сгенерировать снова существует два файла:

* `measurement_settings.json` - Варианты настроек измерителя, для которых нужно сгенерировать датасет. (**In development**: пока что не все настройки как-то влияют на генерацию, нужно доделать)
* `parameters_variations.json` - Описание перебора параметров компонентов
* Пример: для резистора R существует один параметр измеряемый в cir_unit, который нужно перебрать в экспоненциальном интервале от 1 до 100000000 создав 10 точек.
* Пример2: для диода D существует 4 параметра (всего их больше), которые следует перебрать, и все они вручную заданные константы. Из-за особенностей многопараметрических элементов, диод записан несколько иначе, чем резистор. В диоде `cir_unit=null`, но есть не нулевой `cir_key`. Если требуется добавить в этот файл новый элемент у которого требуется изменять параметры, то смотрите в `.cir`-файл, если у элемента есть собственная DMOD (DeviceModel) `cir_key` - это параметры этой DeviceModel.

### 3.4 Как генерируется датасет

Берутся все классы схем и все настройки измерений.

Для каждого класса `ParametersChanger` определяет какие элементы существуют в этой схеме и в каких интервалах их нужно перебрать. Генерируются все возможные комбинации параметров элементов (например если два резистора по 10 точек, то это 100 сочетаний) и записываются в `changer.circuits`

После чего с помощью `changer.dump_circuits_on_disk()` все комбинации параметров сохраняются на диск в виде новых `.cir`-файлов в папку датасета.

Далее `SimulatorIVC` генерирует для конкретной схемы с определенными параметрами и настройками вольт-амперную характеристику. (Схема circuit берётся из оперативки: `changer.circuits`)

ВАХ записывается на диск методом `simulator.save_ivc(...)` в формате `uzf` (зипованный json)

Если выставлен флаг `--image`, то так же сохраняется ВАХ в формате png

Алгоритм переходит к следующему классу.

Когда все классы готовы, алгоритм переходит к следующим настройкам измерения.
12 changes: 8 additions & 4 deletions generate_dataset/__main__.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import logging
import argparse

from generate_dataset.validate_circuit_classes import validate_circuit_classes
from generate_dataset.dataset_generator import generate_dataset

logging.basicConfig(format="%(asctime)s %(message)s", datefmt="[%Y-%m-%d %H:%M:%S]", level=logging.INFO)

if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate dataset from `circuit classes` to `dataset` folder")
parser = argparse.ArgumentParser(description="Generate dataset from `circuit_classes` to `dataset` folder")
parser.add_argument('-i', "--image", action="store_true", help="Add IVC-png-image to each dataset file")
args = parser.parse_args()

validate_circuit_classes()
if args.image is None:
pass
if args.image:
logging.info('Generating dataset with images...')
generate_dataset(save_png=True)
else:
pass
logging.info('Generating dataset...')
generate_dataset(save_png=False)
58 changes: 0 additions & 58 deletions generate_dataset/cir_parser.py

This file was deleted.

8 changes: 4 additions & 4 deletions generate_dataset/dataset_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@


def generate_dataset(save_png=False):
# # Example how to create .cir-files for one circuit class
# changer = ParametersChanger('circuit_classes\\DR_R\\DR_R.cir', GENERATE_SETTINGS_PATH)
# changer.generate_circuits()
# path = os.path.join('dataset', 'measurement_default', 'DR')
Expand Down Expand Up @@ -37,8 +38,7 @@ def generate_dataset(save_png=False):
cname = os.path.join(path, f'{i}.uzf')
simulator.save_ivc(circuit, analysis, cname)

pname = os.path.join(path, f'{i}.png')
simulator.save_plot(circuit, analysis, pname, png_path)
if save_png:
pname = os.path.join(path, f'{i}.png')
simulator.save_plot(circuit, analysis, pname, png_path)


generate_dataset(save_png=True)
1 change: 1 addition & 0 deletions generate_dataset/simulate_ivc.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ def save_plot(self, circuit, analysis, path, png_path, plot_measurements_setting

plt.savefig(path, dpi=100)
plt.clf()
plt.close('all')

@staticmethod
def add_noise(analysis, SNR=40):
Expand Down

0 comments on commit 2b0f409

Please sign in to comment.