// This file is a part of Framsticks SDK. http://www.framsticks.com/ // Copyright (C) 1999-2020 Maciej Komosinski and Szymon Ulatowski. // See LICENSE.txt for details. #include "simil-measure.h" #include #include #include #define FIELDSTRUCT SimilMeasure static ParamEntry simil_measure_paramtab[] = { { "Similarity", 1, 2, "SimilMeasure", "Evaluates morphological dissimilarity. More information:\nhttp://www.framsticks.com/bib/Komosinski-et-al-2001\nhttp://www.framsticks.com/bib/Komosinski-and-Kubiak-2011\nhttp://www.framsticks.com/bib/Komosinski-2016\nhttps://doi.org/10.1007/978-3-030-16692-2_8", }, { "type", 0, 0, "Type of similarity measure", "d 0 2 1 ~Graph greedy (vertex degree order and greedy matching)~Graph optimal (flexible criteria order and optimal matching)~Descriptor distribution (EMD on a histogram of descriptor values)", FIELD(type), "", }, { "evaluateDistance", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "Evaluate model dissimilarity", "p f(oGeno,oGeno)", PROCEDURE(p_evaldistance), "Calculates dissimilarity between two models created from Geno objects.", }, { 0, }, }; #undef FIELDSTRUCT SimilMeasure::SimilMeasure() : localpar(simil_measure_paramtab, this) { localpar.setDefault(); } SimilMeasureBase *SimilMeasure::currentMeasure() { SimilMeasureBase *measures[] = { &simil_measure_greedy,&simil_measure_hungarian,&simil_measure_distribution }; if (type >= 0 && type <= (int)std::size(measures)) return measures[type]; logPrintf("SimilarityMeasure", "currentMeasure", LOG_ERROR, "Measure type '%d' not supported", type); return nullptr; } double SimilMeasure::evaluateDistance(const Geno* G0, const Geno* G1) { SimilMeasureBase *measure = currentMeasure(); if (measure) return measure->evaluateDistance(G0, G1); return -1; } void SimilMeasure::p_evaldistance(ExtValue *args, ExtValue *ret) { Geno *g1 = GenoObj::fromObject(args[1]); Geno *g2 = GenoObj::fromObject(args[0]); if ((!g1) || (!g2)) ret->setEmpty(); else ret->setDouble(evaluateDistance(g1, g2)); }