// a header file for kohonen and embedding // Copyright (C) 2011-2022 Tehora and Zeno Rogue, see 'hyper.cpp' for details #ifndef _KOHONEN_H_ #define _KOHONEN_H_ #include "../rogueviz.h" namespace rogueviz { namespace kohonen { typedef vector kohvec; static constexpr flagtype KS_ROGUEVIZ = 1; static constexpr flagtype KS_NEURONS = 2; static constexpr flagtype KS_DISPERSION = 4; static constexpr flagtype KS_SAMPLES = 8; static constexpr flagtype KS_NEURONS_INI = 16; extern flagtype state; extern map sample_vdata_id; extern int tmax; extern int samples; extern int t, tmax, lpct, cells; extern int gaussian; extern int krad, kqty, kohrestrict; extern int qpct; extern int columns; extern double dispersion_end_at; extern int dispersion_count; extern double learning_factor, distmul; extern double ttpower; extern int min_group, max_group, columns; extern bool dispersion_long; struct neuron { kohvec net; cell *where; double udist; int lpbak; color_t col; int allsamples, drawn_samples, csample, bestsample, max_group_here; int debug; neuron() { drawn_samples = allsamples = bestsample = 0; max_group_here = max_group; debug = 0; } }; struct sample { kohvec val; string name; }; inline void alloc(kohvec& k) { k.resize(columns); } extern kohvec weights; extern vector data; extern vector samples_to_show; extern vector net; extern vector colnames; extern vector sample_sequence; void initialize_neurons(); void initialize_neurons_initial(); void initialize_dispersion(); void initialize_samples_to_show(); void clear(); void create_neurons(); void analyze(); void step(); void initialize_rv(); void set_neuron_initial(); bool finished(); vector gen_neuron_cells(); neuron& winner(int id); double vdot(const kohvec& a, const kohvec& b); void vshift(kohvec& a, const kohvec& b, ld i); double vnorm(kohvec& a, kohvec& b); } namespace embeddings { ld gaussian_random(); using kohonen::columns; using kohonen::kohvec; using kohonen::alloc; enum embedding_type { eProjection, eNatural, eLandscape, eSignpost, eHypersian }; extern embedding_type etype; void mark_signposts(bool full, const vector& ac); void mark_signposts_subg(int a, int b, const vector& ac); void generate_rug(int i, bool close); void init_landscape(int dimensions); void init_landscape_det(const vector& ac); extern map rug_coordinates; extern void get_coordinates(kohvec& v, cell *c, cell *c0); extern vector signposts; extern map delta_at; } namespace voronoi { struct manifold { int N; /* the number of tiles */ int T; /* the number of triangles */ /* triangles between three adjacent tiles. triangles[i] are the tiles of triangle i */ vector> triangles; /* triangles_of_tile[t] is ids of triangles which contain t */ vector> triangles_of_tile; map, vector> triangles_of_edge; void generate_data(); }; inline string debug_str; manifold build_manifold(const vector& cells); vector > compute_voronoi_edges(manifold& m); } namespace measures { struct manidata { int size; vector > distances; vector > edges; }; static constexpr int MCOUNT = 12; extern vector catnames; vector> recreate_topology(const vector& mapp, const vector >& edges); vector> build_distance_matrix(int N, const vector>& vedges); ld evaluate_measure(manidata& emb, manidata& orig, vector& mapp, vector >& vor_edges, vector>& edo_recreated, int k); } static constexpr string som_test_dir = "results/"; } #endif