// SPDX-License-Identifier: GPL-3.0-or-later#include<dlib/clustering.h>#include"nml.h"#include<random>#include"ad_charts.h"typedefstruct{calculated_number_t*training_cns;calculated_number_t*scratch_training_cns;std::vector<DSample>training_samples;}nml_tls_data_t;staticthread_localnml_tls_data_ttls_data;/* * Functions to convert enums to strings*/staticconstchar*nml_machine_learning_status_to_string(enumnml_machine_learning_statusmls){switch(mls){caseMACHINE_LEARNING_STATUS_ENABLED:return"enabled";caseMACHINE_LEARNING_STATUS_DISABLED_DUE_TO_EXCLUDED_CHART:return"disabled-sp";default:return"unknown";}}staticconstchar*nml_metric_type_to_string(enumnml_metric_typemt){switch(mt){caseMETRIC_TYPE_CONSTANT:return"constant";caseMETRIC_TYPE_VARIABLE:return"variable";default:return"unknown";}}staticconstchar*nml_training_status_to_string(enumnml_training_statusts){switch(ts){caseTRAINING_STATUS_PENDING_WITH_MODEL:return"pending-with-model";caseTRAINING_STATUS_PENDING_WITHOUT_MODEL:return"pending-without-model";caseTRAINING_STATUS_TRAINED:return"trained";caseTRAINING_STATUS_UNTRAINED:return"untrained";default:return"unknown";}}staticconstchar*nml_training_result_to_string(enumnml_training_resulttr){switch(tr){caseTRAINING_RESULT_OK:return"ok";caseTRAINING_RESULT_INVALID_QUERY_TIME_RANGE:return"invalid-query";caseTRAINING_RESULT_NOT_ENOUGH_COLLECTED_VALUES:return"missing-values";caseTRAINING_RESULT_NULL_ACQUIRED_DIMENSION:return"null-acquired-dim";caseTRAINING_RESULT_CHART_UNDER_REPLICATION:return"chart-under-replication";default:return"unknown";}}/* * Features*/// subtract elements that are `diff_n` positions apartstaticvoidnml_features_diff(nml_features_t*features){if(features->diff_n==0)return;for(size_tidx=0;idx!=(features->src_n-features->diff_n);idx++){size_thigh=(features->src_n-1)-idx;size_tlow=high-features->diff_n;features->dst[low]=features->src[high]-features->src[low];}size_tn=features->src_n-features->diff_n;memcpy(features->src,features->dst,n*sizeof(calculated_number_t));for(size_tidx=features->src_n-features->diff_n;idx!=features->src_n;idx++)