добавление bench_time и рефакторинг генетического алгоритма
This commit is contained in:
258
MyLibs/Inc/bench_time.h
Normal file
258
MyLibs/Inc/bench_time.h
Normal file
@@ -0,0 +1,258 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file bench_time.h
|
||||
* @brief Заголовочный файл для измерения времени между событиями
|
||||
******************************************************************************
|
||||
* @addtogroup BENCH_TIME Time measurement
|
||||
* @ingroup MYLIBS_DEFINES
|
||||
* @brief Библиотека для измерения времени/тиков между событиями
|
||||
* @details
|
||||
Поддерживает:
|
||||
- Многоканальные измерения (несколько независимых таймеров)
|
||||
- Платформонезависимый интерфейс
|
||||
- Измерение в тиках или временных единицах
|
||||
- Статистику измерений (мин/макс/среднее)
|
||||
- Настраиваемый размер тиков для каждого канала
|
||||
|
||||
Параметры для конфигурации:
|
||||
- @ref BENCH_TIME_ENABLE - Включить бенч времени
|
||||
- @ref BENCH_TIME_MAX_CHANNELS - Максимальное количество каналов измерения (по умолчанию 8)
|
||||
|
||||
@par Пример использования:
|
||||
@code
|
||||
#include "bench_time.h"
|
||||
|
||||
// Инициализация
|
||||
BenchTime_Init();
|
||||
|
||||
// Измерение с SysTick
|
||||
BenchTime_Start(0, HAL_GetTick, 0xFFFFFFFF);
|
||||
some_function();
|
||||
uint32_t time = BenchTime_End(0, HAL_GetTick);
|
||||
|
||||
// Измерение с TIM2 (16-бит)
|
||||
BenchTime_Start(1, TIM2->CNT, 0xFFFF);
|
||||
fast_function();
|
||||
uint32_t time2 = BenchTime_End(1, TIM2->CNT);
|
||||
|
||||
// Измерение с DWT цикловым счетчиком
|
||||
BenchTime_Start(2, DWT->CYCCNT, 0xFFFFFFFF);
|
||||
critical_function();
|
||||
uint32_t cycles = BenchTime_End(2, DWT->CYCCNT);
|
||||
|
||||
// Многоканальное измерение
|
||||
BenchTime_Start(0, HAL_GetTick, 1000); // общее время
|
||||
BenchTime_Start(1, TIM3->CNT, 500); // часть 1
|
||||
|
||||
// ... код 1
|
||||
|
||||
uint32_t part1 = BenchTime_End(1, TIM3->CNT);
|
||||
BenchTime_Start(2, TIM4->CNT, 200); // часть 2
|
||||
|
||||
// ... код 2
|
||||
|
||||
uint32_t part2 = BenchTime_End(2, TIM4->CNT);
|
||||
uint32_t total = BenchTime_End(0, HAL_GetTick); // общее время
|
||||
|
||||
// Статистика
|
||||
uint32_t min_time = BenchTime_GetMin(0);
|
||||
uint32_t max_time = BenchTime_GetMax(0);
|
||||
uint32_t avg_time = BenchTime_GetAverage(0);
|
||||
uint32_t count = BenchTime_GetCount(0);
|
||||
@endcode
|
||||
* @{
|
||||
*****************************************************************************/
|
||||
#ifndef __BENCH_TIME_H_
|
||||
#define __BENCH_TIME_H_
|
||||
|
||||
#include "mylibs_defs.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef BENCH_TIME_ENABLE
|
||||
|
||||
// Конфигурация библиотеки
|
||||
#ifndef BENCH_TIME_MAX_CHANNELS
|
||||
#define BENCH_TIME_MAX_CHANNELS 8 ///< Максимальное количество каналов измерения
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Структура статистики измерений
|
||||
*/
|
||||
typedef struct {
|
||||
uint32_t min_ticks; ///< Минимальное время в тиках
|
||||
uint32_t max_ticks; ///< Максимальное время в тиках
|
||||
uint32_t total_ticks; ///< Суммарное время в тиках
|
||||
uint32_t count; ///< Количество измерений
|
||||
uint32_t last_ticks; ///< Последнее измеренное время
|
||||
} BenchTimeStats_t;
|
||||
|
||||
/**
|
||||
* @brief Структура канала измерения
|
||||
*/
|
||||
typedef struct {
|
||||
uint32_t start_tick; ///< Время старта в тиках
|
||||
uint32_t tick_period; ///< Период тиков для переполнения
|
||||
uint32_t is_running; ///< Флаг активного измерения
|
||||
BenchTimeStats_t stats; ///< Статистика измерений
|
||||
} BenchTimeChannel_t;
|
||||
|
||||
/**
|
||||
* @brief Основная структура менеджера измерений
|
||||
*/
|
||||
typedef struct {
|
||||
BenchTimeChannel_t channels[BENCH_TIME_MAX_CHANNELS]; ///< Каналы измерения
|
||||
} BenchTime_t;
|
||||
|
||||
static BenchTime_t hbt = {0}; ///< Внутренний экземпляр
|
||||
|
||||
/**
|
||||
* @brief Инициализация системы измерения времени
|
||||
*/
|
||||
static inline void BenchTime_Init(void) {
|
||||
for (int i = 0; i < BENCH_TIME_MAX_CHANNELS; i++) {
|
||||
hbt.channels[i].start_tick = 0;
|
||||
hbt.channels[i].tick_period = 0xFFFFFFFF;
|
||||
hbt.channels[i].is_running = 0;
|
||||
hbt.channels[i].stats.min_ticks = 0xFFFFFFFF;
|
||||
hbt.channels[i].stats.max_ticks = 0;
|
||||
hbt.channels[i].stats.total_ticks = 0;
|
||||
hbt.channels[i].stats.count = 0;
|
||||
hbt.channels[i].stats.last_ticks = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Начало измерения на указанном канале
|
||||
* @param channel Номер канала (0..BENCH_TIME_MAX_CHANNELS-1)
|
||||
* @param ticks Источник тиков (например: HAL_GetTick(), TIM2->CNT, DWT->CYCCNT)
|
||||
* @param tick_period Период тиков для переполнения
|
||||
* @return 1 - успех, 0 - ошибка
|
||||
*/
|
||||
static inline uint32_t BenchTime_Start(uint8_t channel, uint32_t ticks, uint32_t tick_period) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
if (hbt.channels[channel].is_running) return 0;
|
||||
|
||||
hbt.channels[channel].start_tick = ticks;
|
||||
hbt.channels[channel].tick_period = tick_period;
|
||||
hbt.channels[channel].is_running = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Окончание измерения на указанном канале
|
||||
* @param channel Номер канала (0..BENCH_TIME_MAX_CHANNELS-1)
|
||||
* @param ticks Источник тиков (должен быть тот же что в Start)
|
||||
* @return Измеренное время в тиках, 0 - в случае ошибки
|
||||
*/
|
||||
static inline uint32_t BenchTime_End(uint8_t channel, uint32_t ticks) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
if (!hbt.channels[channel].is_running) return 0;
|
||||
|
||||
uint32_t end_tick = ticks;
|
||||
uint32_t start_tick = hbt.channels[channel].start_tick;
|
||||
uint32_t tick_period = hbt.channels[channel].tick_period;
|
||||
uint32_t elapsed_ticks;
|
||||
|
||||
if (end_tick >= start_tick) {
|
||||
elapsed_ticks = end_tick - start_tick;
|
||||
} else {
|
||||
elapsed_ticks = (tick_period - start_tick) + end_tick + 1;
|
||||
}
|
||||
|
||||
if (elapsed_ticks > tick_period) {
|
||||
elapsed_ticks = tick_period;
|
||||
}
|
||||
|
||||
hbt.channels[channel].is_running = 0;
|
||||
|
||||
// Обновление статистики
|
||||
BenchTimeStats_t* stats = &hbt.channels[channel].stats;
|
||||
stats->last_ticks = elapsed_ticks;
|
||||
|
||||
if (elapsed_ticks < stats->min_ticks) {
|
||||
stats->min_ticks = elapsed_ticks;
|
||||
}
|
||||
|
||||
if (elapsed_ticks > stats->max_ticks) {
|
||||
stats->max_ticks = elapsed_ticks;
|
||||
}
|
||||
|
||||
stats->total_ticks += elapsed_ticks;
|
||||
stats->count++;
|
||||
|
||||
return elapsed_ticks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получение минимального времени измерения
|
||||
*/
|
||||
static inline uint32_t BenchTime_GetMin(uint8_t channel) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
return hbt.channels[channel].stats.min_ticks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получение максимального времени измерения
|
||||
*/
|
||||
static inline uint32_t BenchTime_GetMax(uint8_t channel) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
return hbt.channels[channel].stats.max_ticks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получение среднего времени измерения
|
||||
*/
|
||||
static inline uint32_t BenchTime_GetAverage(uint8_t channel) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
BenchTimeStats_t* stats = &hbt.channels[channel].stats;
|
||||
if (stats->count == 0) return 0;
|
||||
return stats->total_ticks / stats->count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получение количества измерений
|
||||
*/
|
||||
static inline uint32_t BenchTime_GetCount(uint8_t channel) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
return hbt.channels[channel].stats.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получение последнего измеренного времени
|
||||
*/
|
||||
static inline uint32_t BenchTime_GetLast(uint8_t channel) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
return hbt.channels[channel].stats.last_ticks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Сброс статистики для канала
|
||||
*/
|
||||
static inline void BenchTime_ResetStats(uint8_t channel) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return;
|
||||
BenchTimeStats_t* stats = &hbt.channels[channel].stats;
|
||||
stats->min_ticks = 0xFFFFFFFF;
|
||||
stats->max_ticks = 0;
|
||||
stats->total_ticks = 0;
|
||||
stats->count = 0;
|
||||
stats->last_ticks = 0;
|
||||
}
|
||||
#else //BENCH_TIME_ENABLE
|
||||
|
||||
#define BenchTime_Init()
|
||||
#define BenchTime_Start(channel, ticks, tick_period) 0
|
||||
#define BenchTime_End(channel, ticks) 0
|
||||
#define BenchTime_GetMin(channel) 0
|
||||
#define BenchTime_GetMax(channel) 0
|
||||
#define BenchTime_GetAverage(channel) 0
|
||||
#define BenchTime_GetCount(channel) 0
|
||||
#define BenchTime_GetLast(channel) 0
|
||||
#define BenchTime_ResetStats(channel)
|
||||
|
||||
#endif //BENCH_TIME_ENABLE
|
||||
|
||||
#endif // __BENCH_TIME_H_
|
||||
|
||||
/** BENCH_TIME
|
||||
* @}
|
||||
*/
|
||||
@@ -1,9 +1,9 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file evolve_optimizer.h
|
||||
* @file gen_optimizer.h
|
||||
* @brief Заголовочный файл для адаптивного подбора параметров
|
||||
******************************************************************************
|
||||
* @addtogroup EVOLVE_OPTIMIZER Evolve optimizer
|
||||
* @addtogroup GEN_OPTIMIZER Genetic optimizer
|
||||
* @ingroup MYLIBS_DEFINES
|
||||
* @brief Библиотека для эволюционного подбора параметров
|
||||
* @details
|
||||
@@ -15,24 +15,24 @@
|
||||
|
||||
|
||||
Параметры для конфигурации:
|
||||
- @ref ENABLE_EVOLVE_OPTIMIZATION - Включить оптимизацию параметров
|
||||
Если библиотека отключена @ref ENABLE_EVOLVE_OPTIMIZATION, то вставляются
|
||||
- @ref GEN_OPTIMIZATION_ENABLE - Включить оптимизацию параметров
|
||||
Если библиотека отключена @ref GEN_OPTIMIZATION_ENABLE, то вставляются
|
||||
заглушки, никак не влияющие на параметры и остальную программу
|
||||
- @ref EVOLVE_MAX_PARAMS - Максимальное количество параметров
|
||||
- @ref EVOLVE_MAX_CANDIDATES - Максимальное количество кандидатов для обучения
|
||||
- (опционально) @ref EVOLVE_MUTATION_MIN_PCT - Минимальная мутация в процентах от Loss (по умолчанию 10%)
|
||||
- (опционально) @ref EVOLVE_MUTATION_MAX_PCT - Максимальная мутация в процентах от Loss (по умолчанию 100%)
|
||||
- @ref GEN_MAX_PARAMS - Максимальное количество параметров
|
||||
- @ref GEN_MAX_CANDIDATES - Максимальное количество кандидатов для обучения
|
||||
- (опционально) @ref GEN_MUTATION_MIN_PCT - Минимальная мутация в процентах от Loss (по умолчанию 10%)
|
||||
- (опционально) @ref GEN_MUTATION_MAX_PCT - Максимальная мутация в процентах от Loss (по умолчанию 100%)
|
||||
- (опционально) @ref ELOVLE_N_ELITE_CANDIDATE - Количество кандидатов, которые проходят в поколение без изменений
|
||||
|
||||
@par Пример использования:
|
||||
@code
|
||||
#include "evolve_optimizer.h"
|
||||
#include "gen_optimizer.h"
|
||||
#define N_PARAMS 4
|
||||
#define N_CANDIDATES 100
|
||||
#define N_BEST 10
|
||||
#define MUTATION 0.1f
|
||||
float params[N_PARAMS];
|
||||
EvolveOptimizer_t optimizer;
|
||||
GenOptimizer_t optimizer;
|
||||
|
||||
// Формирование параметров
|
||||
uint16_t param_u16 = 800;
|
||||
@@ -45,11 +45,11 @@ params[2] = PARAM_SCALE(param_u8, 10.0f, 100.0f);
|
||||
params[3] = PARAM_SCALE(param_i16, 500.0f, 5000.0f);
|
||||
|
||||
// Инициалиазция
|
||||
EvolveOptimizer_Init(&optimizer, N_PARAMS, N_CANDIDATES, N_BEST, MUTATION, params);
|
||||
GenOptimizer_Init(&optimizer, N_PARAMS, N_CANDIDATES, N_BEST, MUTATION, params);
|
||||
|
||||
// Шаг эволюции
|
||||
float loss = calc_loss(); // расчет эффективности параметров (от 0 до 1)
|
||||
EvolveOptimizer_Step(&optimizer, params, loss);
|
||||
GenOptimizer_Step(&optimizer, params, loss);
|
||||
|
||||
// Взятие следующих для эволюции параметров
|
||||
param_u16 = PARAM_UNSCALE(params[0], 0.0f, 1000.0f);
|
||||
@@ -59,14 +59,14 @@ param_i16 = PARAM_UNSCALE(params[3], 500.0f, 5000.0f);
|
||||
@endcode
|
||||
* @{
|
||||
*****************************************************************************/
|
||||
#ifndef __EVOLVE_OPTIMIZER_H_
|
||||
#define __EVOLVE_OPTIMIZER_H_
|
||||
#ifndef __GEN_OPTIMIZER_H_
|
||||
#define __GEN_OPTIMIZER_H_
|
||||
|
||||
#include "mylibs_defs.h"
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef ENABLE_EVOLVE_OPTIMIZATION
|
||||
#ifdef GEN_OPTIMIZATION_ENABLE
|
||||
/**
|
||||
* @brief Линейное масштабирование x из диапазона [min_val, max_val] в диапазон [0, 1)
|
||||
*/
|
||||
@@ -85,11 +85,11 @@ param_i16 = PARAM_UNSCALE(params[3], 500.0f, 5000.0f);
|
||||
|
||||
|
||||
|
||||
#ifndef EVOLVE_MUTATION_MIN_PCT
|
||||
#define EVOLVE_MUTATION_MIN_PCT 10 ///< Минимальная мутация (в процентах от Loss)
|
||||
#ifndef GEN_MUTATION_MIN_PCT
|
||||
#define GEN_MUTATION_MIN_PCT 10 ///< Минимальная мутация (в процентах от Loss)
|
||||
#endif
|
||||
#ifndef EVOLVE_MUTATION_MAX_PCT
|
||||
#define EVOLVE_MUTATION_MAX_PCT 100 ///< Максимальная мутация (в процентах от Loss)
|
||||
#ifndef GEN_MUTATION_MAX_PCT
|
||||
#define GEN_MUTATION_MAX_PCT 100 ///< Максимальная мутация (в процентах от Loss)
|
||||
#endif
|
||||
#ifndef ELOVLE_N_ELITE_CANDIDATE
|
||||
#define ELOVLE_N_ELITE_CANDIDATE 2 ///< Количество кандидатов, которые проходят в поколение без изменений (по умолчанию 2)
|
||||
@@ -113,19 +113,19 @@ typedef struct {
|
||||
//INTERNAL
|
||||
float gen_mut; ///< Амплитуда мутации у текущей популяции
|
||||
|
||||
float loss[EVOLVE_MAX_CANDIDATES]; ///< Loss для каждого кандидата
|
||||
float candidates[EVOLVE_MAX_CANDIDATES][EVOLVE_MAX_PARAMS]; ///< Параметры кандидатов
|
||||
uint16_t sorted_idx[EVOLVE_MAX_CANDIDATES]; ///< Индексы отсортированных кандидатов
|
||||
} EvolveOptimizer_t;
|
||||
float loss[GEN_MAX_CANDIDATES]; ///< Loss для каждого кандидата
|
||||
float candidates[GEN_MAX_CANDIDATES][GEN_MAX_PARAMS]; ///< Параметры кандидатов
|
||||
uint16_t sorted_idx[GEN_MAX_CANDIDATES]; ///< Индексы отсортированных кандидатов
|
||||
} GenOptimizer_t;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @cond EVOLVE_INTERNAL
|
||||
* @cond GEN_INTERNAL
|
||||
*/
|
||||
|
||||
// Вспомогательный указатель для сортировки
|
||||
static EvolveOptimizer_t *g_sort_opt; // глобальный указатель на текущий оптимизатор
|
||||
static GenOptimizer_t *g_sort_opt; // глобальный указатель на текущий оптимизатор
|
||||
|
||||
// функция условия сортировки
|
||||
static int cmp_idx(const void *a, const void *b) {
|
||||
@@ -152,7 +152,7 @@ static int cmp_idx(const void *a, const void *b) {
|
||||
* @return 0 — если окей,
|
||||
* -1 — если ошибка
|
||||
*/
|
||||
__STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t* opt,
|
||||
static int GenOptimizer_Init(GenOptimizer_t* opt,
|
||||
uint16_t n_params,
|
||||
uint16_t n_cand,
|
||||
uint16_t n_best,
|
||||
@@ -162,15 +162,15 @@ __STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t* opt,
|
||||
if((opt == NULL) || (start_params == NULL))
|
||||
return -1;
|
||||
|
||||
if(n_params > EVOLVE_MAX_PARAMS)
|
||||
if(n_params > GEN_MAX_PARAMS)
|
||||
return -1;
|
||||
opt->n_params = n_params;
|
||||
|
||||
if(n_cand > EVOLVE_MAX_CANDIDATES)
|
||||
if(n_cand > GEN_MAX_CANDIDATES)
|
||||
return -1;
|
||||
opt->n_cand = n_cand;
|
||||
|
||||
if(n_best > EVOLVE_MAX_CANDIDATES/2)
|
||||
if(n_best > GEN_MAX_CANDIDATES/2)
|
||||
return -1;
|
||||
opt->n_best = n_best;
|
||||
|
||||
@@ -222,7 +222,7 @@ __STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t* opt,
|
||||
* @note Функция использует глобальную внутреннюю переменную для сортировки.
|
||||
* Надо убедится что только один экземпляр функции запущен в момент времени
|
||||
*/
|
||||
__STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t* opt,
|
||||
static int GenOptimizer_Step(GenOptimizer_t* opt,
|
||||
float* params,
|
||||
float loss)
|
||||
{
|
||||
@@ -230,15 +230,15 @@ __STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t* opt,
|
||||
return -1;
|
||||
|
||||
uint16_t n_params = opt->n_params;
|
||||
if(n_params > EVOLVE_MAX_PARAMS)
|
||||
if(n_params > GEN_MAX_PARAMS)
|
||||
return -1;
|
||||
|
||||
uint16_t n_cand = opt->n_cand;
|
||||
if(n_cand > EVOLVE_MAX_CANDIDATES)
|
||||
if(n_cand > GEN_MAX_CANDIDATES)
|
||||
return -1;
|
||||
|
||||
uint16_t n_best = opt->n_best;
|
||||
if(n_best > EVOLVE_MAX_CANDIDATES/2)
|
||||
if(n_best > GEN_MAX_CANDIDATES/2)
|
||||
return -1;
|
||||
|
||||
float mut = opt->mutation_amp;
|
||||
@@ -280,8 +280,8 @@ __STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t* opt,
|
||||
if(opt->stability < 0.0f) opt->stability = 0.0f;
|
||||
if(opt->stability > 1.0f) opt->stability = 1.0f;
|
||||
|
||||
float mut_pct = EVOLVE_MUTATION_MIN_PCT +
|
||||
(EVOLVE_MUTATION_MAX_PCT - EVOLVE_MUTATION_MIN_PCT) * loss_ratio;
|
||||
float mut_pct = GEN_MUTATION_MIN_PCT +
|
||||
(GEN_MUTATION_MAX_PCT - GEN_MUTATION_MIN_PCT) * loss_ratio;
|
||||
float adaptive_mut = mut * (mut_pct / 100.0f);
|
||||
if (adaptive_mut < 0.0001f) adaptive_mut = 0.0001f;
|
||||
opt->gen_mut = adaptive_mut;
|
||||
@@ -315,7 +315,7 @@ __STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t* opt,
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else // ENABLE_EVOLVE_OPTIMIZATION
|
||||
#else // GEN_OPTIMIZATION_ENABLE
|
||||
//заглушки
|
||||
typedef struct {
|
||||
uint16_t n_params;
|
||||
@@ -324,15 +324,15 @@ typedef struct {
|
||||
float mutation_amp;
|
||||
float loss[0];
|
||||
float candidates[0][0];
|
||||
} EvolveOptimizer_t;
|
||||
#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, mutation_amp, start_params)
|
||||
#define EvolveOptimizer_Step(opt, params, LossFunc)
|
||||
} GenOptimizer_t;
|
||||
#define GenOptimizer_Init(opt, n_params, n_cand, n_best, mutation_amp, start_params)
|
||||
#define GenOptimizer_Step(opt, params, LossFunc)
|
||||
#define PARAM_SCALE(x, min_val, max_val) (x)
|
||||
#define PARAM_UNSCALE(val, min_val, max_val) (val)
|
||||
#endif // ENABLE_EVOLVE_OPTIMIZATION
|
||||
#endif // GEN_OPTIMIZATION_ENABLE
|
||||
|
||||
#endif // __EVOLVE_OPTIMIZER_H_
|
||||
#endif // __GEN_OPTIMIZER_H_
|
||||
|
||||
/** EVOLVE_OPTIMIZER
|
||||
/** GEN_OPTIMIZER
|
||||
* @}
|
||||
*/
|
||||
@@ -55,21 +55,38 @@
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup EVOLVE_CONFIG Evolve configs
|
||||
* @addtogroup GEN_CONFIG Genetic configs
|
||||
* @ingroup MYLIBS_CONFIG
|
||||
* @brief Конфигурация однослойного персептрона и алгоритма обучения
|
||||
* @brief Конфигурация генетического алгоритма обучения
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define ENABLE_EVOLVE_OPTIMIZATION ///< Включить оптимизацию параметров
|
||||
#define EVOLVE_MAX_PARAMS 20 ///< Максимальное количество параметров
|
||||
#define EVOLVE_MAX_CANDIDATES 100 ///< Максимальное количество кандидатов для обучения
|
||||
#define GEN_OPTIMIZATION_ENABLE ///< Включить оптимизацию параметров
|
||||
#define GEN_MAX_PARAMS 20 ///< Максимальное количество параметров
|
||||
#define GEN_MAX_CANDIDATES 100 ///< Максимальное количество кандидатов для обучения
|
||||
|
||||
/** EVOLVE_CONFIG
|
||||
/** GEN_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup GEN_CONFIG Genetic configs
|
||||
* @ingroup MYLIBS_CONFIG
|
||||
* @brief Конфигурация генетического алгоритма обучения
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
#define BENCH_TIME_ENABLE ///< Включить бенч времени
|
||||
#define BENCH_TIME_MAX_CHANNELS 16 ///< Максимальное количество каналов измерения
|
||||
|
||||
/** GEN_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup LIBS_CONFIG Libraries configs
|
||||
* @ingroup MYLIBS_CONFIG
|
||||
@@ -79,7 +96,7 @@
|
||||
|
||||
#define local_time() uwTick ///< Локальное время
|
||||
|
||||
#define INCLUDE_EVOLVE_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
|
||||
#define INCLUDE_GEN_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
|
||||
#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями
|
||||
#define INCLUDE_TRACKERS_LIB ///< Подключить библиотеку с трекерами
|
||||
#define INCLUDE_TRACE_LIB ///< Подключить библиотеку с трейсами
|
||||
|
||||
@@ -79,8 +79,8 @@
|
||||
#define HF_HandleFault(...)
|
||||
#endif
|
||||
|
||||
#ifdef INCLUDE_EVOLVE_OPTIMIZER
|
||||
#include "evolve_optimizer.h"
|
||||
#ifdef INCLUDE_GEN_OPTIMIZER
|
||||
#include "gen_optimizer.h"
|
||||
#else
|
||||
typedef struct {
|
||||
uint16_t n_params;
|
||||
@@ -89,13 +89,29 @@ typedef struct {
|
||||
uint16_t iq_mutation;
|
||||
int32_t loss[0];
|
||||
int32_t candidates[0][0];
|
||||
} EvolveOptimizer_t;
|
||||
#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, iq_mutation, start_params)
|
||||
#define EvolveOptimizer_Step(opt, params, LossFunc)
|
||||
} GenOptimizer_t;
|
||||
#define GenOptimizer_Init(opt, n_params, n_cand, n_best, iq_mutation, start_params)
|
||||
#define GenOptimizer_Step(opt, params, LossFunc)
|
||||
#define PARAM_SCALE_Q16(x, min_val, max_val) (x)
|
||||
#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) (q16_val)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef INCLUDE_BENCH_TEST
|
||||
#include "bench_time.h"
|
||||
#else //BENCH_TIME_ENABLE
|
||||
#define BenchTime_Init()
|
||||
#define BenchTime_Start(channel, ticks, tick_period) 0
|
||||
#define BenchTime_End(channel, ticks) 0
|
||||
#define BenchTime_GetMin(channel) 0
|
||||
#define BenchTime_GetMax(channel) 0
|
||||
#define BenchTime_GetAverage(channel) 0
|
||||
#define BenchTime_GetCount(channel) 0
|
||||
#define BenchTime_GetLast(channel) 0
|
||||
#define BenchTime_ResetStats(channel)
|
||||
#endif //BENCH_TIME_ENABLE
|
||||
|
||||
#ifdef INCLUDE_GENERAL_PERIPH_LIBS
|
||||
|
||||
#include "__general_flash.h"
|
||||
|
||||
Reference in New Issue
Block a user