def compute_distance(self, a, b):
        if a in self.intonationmap:
            # print " -hit a"
            adata = self.intonationmap[a]
        else:
            try:
                adata = util.docserver_get_json(a, "normalisedpitch", "normalisedhistogram")
            except util.NoFileException:
                print "can't find recording %s in docserver" % a
                return None
            self.intonationmap[a] = adata
        if b in self.intonationmap:
            # print " -hit b"
            bdata = self.intonationmap[b]
        else:
            try:
                bdata = util.docserver_get_json(b, "normalisedpitch", "normalisedhistogram")
            except util.NoFileException:
                print "can't find recording %s in docserver" % b
                return None
            self.intonationmap[b] = bdata

        if (a, b) in self.distancemap:
            # print " -hit d-ab"
            distance = self.distancemap[(a, b)]
        elif (b, a) in self.distancemap:
            # print " -hit d-ba"
            distance = self.distancemap[(b, a)]
        else:
            distance = recording.kldiv(adata, bdata)
            self.distancemap[(a, b)] = distance
        return distance
    def compute_similarity(self, raag, raagprofile, otherraags, module):
        rid = raag.pk
        dirname = self.dirname % module
        try:
            os.makedirs(dirname)
        except OSError:
            pass
        sims = []
        for oraag, oprofile in otherraags.items():
            oid = oraag.pk

            if (rid, oid) in self.distancemap:
                # print " -hit d-ab"
                distance = self.distancemap[(rid, oid)]
            elif (oid, rid) in self.distancemap:
                # print " -hit d-ba"
                distance = self.distancemap[(oid, rid)]
            else:
                distance = recording.kldiv(raagprofile, oprofile)
                self.distancemap[(rid, oid)] = distance
            print("distance between %s-%s is %s" % (rid, oid, distance))

            if distance:
                sims.append((oid, distance))
        sims = [(i[0], round(i[1], 2)) for i in sims
                if not decimal.Decimal(i[1]).is_nan()]
        sims = sorted(sims, key=lambda a: a[1])
        name = os.path.join(dirname, "%s.json" % rid)
        ret = {"rid": rid, "similar": sims}
        json.dump(ret, open(name, "wb"), indent=2)
Exemple #3
0
    def compute_similarity(self, raag, raagprofile, otherraags, module):
        rid = raag.pk
        dirname = self.dirname % module
        try:
            os.makedirs(dirname)
        except OSError:
            pass
        sims = []
        for oraag, oprofile in otherraags.items():
            oid = oraag.pk

            if (rid, oid) in self.distancemap:
                # print " -hit d-ab"
                distance = self.distancemap[(rid, oid)]
            elif (oid, rid) in self.distancemap:
                # print " -hit d-ba"
                distance = self.distancemap[(oid, rid)]
            else:
                distance = recording.kldiv(raagprofile, oprofile)
                self.distancemap[(rid, oid)] = distance
            print "distance between %s-%s is %s" % (rid, oid, distance)

            if distance:
                sims.append((oid, distance))
        sims = [ (i[0], round(i[1], 2)) for i in sims if not decimal.Decimal(i[1]).is_nan() ]
        sims = sorted(sims, key=lambda a: a[1])
        name = os.path.join(dirname, "%s.json" % rid)
        ret = {"rid": rid, "similar": sims}
        json.dump(ret, open(name, "wb"), indent=2)
    def compute_distance(self, a, b):
        if a in self.intonationmap:
            # print " -hit a"
            adata = self.intonationmap[a]
        else:
            try:
                adata = util.docserver_get_json(a, "normalisedpitch",
                                                "normalisedhistogram")
            except util.NoFileException:
                print "can't find recording %s in docserver" % a
                self.intonationmap[a] = None
                return None
            self.intonationmap[a] = adata
        if b in self.intonationmap:
            # print " -hit b"
            bdata = self.intonationmap[b]
        else:
            try:
                bdata = util.docserver_get_json(b, "normalisedpitch",
                                                "normalisedhistogram")
            except util.NoFileException:
                print "can't find recording %s in docserver" % b
                return None
                self.intonationmap[b] = None
            self.intonationmap[b] = bdata

        if adata is None or bdata is None:
            return None

        if (a, b) in self.distancemap:
            # print " -hit d-ab"
            distance = self.distancemap[(a, b)]
        elif (b, a) in self.distancemap:
            # print " -hit d-ba"
            distance = self.distancemap[(b, a)]
        else:
            distance = recording.kldiv(adata, bdata)
            self.distancemap[(a, b)] = distance
        return distance