Daniel@0: /* Part of DML (Digital Music Laboratory) Daniel@0: Copyright 2014-2015 Samer Abdallah, University of London Daniel@0: Daniel@0: This program is free software; you can redistribute it and/or Daniel@0: modify it under the terms of the GNU General Public License Daniel@0: as published by the Free Software Foundation; either version 2 Daniel@0: of the License, or (at your option) any later version. Daniel@0: Daniel@0: This program is distributed in the hope that it will be useful, Daniel@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Daniel@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Daniel@0: GNU General Public License for more details. Daniel@0: Daniel@0: You should have received a copy of the GNU General Public Daniel@0: License along with this library; if not, write to the Free Software Daniel@0: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Daniel@0: */ Daniel@0: Daniel@0: :- module(kern_analysis, []). Daniel@0: Daniel@0: :- use_module(library(kerndata)). Daniel@0: :- use_module(library(grammars)). Daniel@0: :- use_module(library(compression)). Daniel@0: :- use_module(library(swipe)). Daniel@0: Daniel@0: grammars:dataset_sequences(DS,Seqs) :- Daniel@0: kerndata:dataset_sequences(DS,Seqs). Daniel@0: Daniel@0: Daniel@0: Daniel@0: write_dataset_sequences(DS) :- Daniel@0: dataset_sequences(DS,SS), Daniel@0: with_stream_encoding(current_output,octet, Daniel@0: maplist(write_seq(notenums),SS)). Daniel@0: Daniel@0: write_dataset(Prep,DS) :- Daniel@0: dataset_sequences(DS,SS), Daniel@0: with_stream_encoding(current_output,octet, Daniel@0: maplist(write_seq(Prep),SS)). Daniel@0: Daniel@0: write_item(Prep,Item) :- Daniel@0: item_sequence(Item,Sequence), Daniel@0: write_seq(Prep,Sequence). Daniel@0: Daniel@0: write_seq(notenums,NS) :- Daniel@0: write_bytes(NS), Daniel@0: write_bytes([255]). Daniel@0: Daniel@0: write_seq(intervals,NS) :- Daniel@0: nth1(1,NS,N1), Daniel@0: nnums_ivals(NS,IS), Daniel@0: append(IS2,[end],IS), Daniel@0: maplist(plus(127),IS2,CS), Daniel@0: write_bytes([N1|CS]), Daniel@0: write_bytes([255]). Daniel@0: Daniel@0: ds_complexity(Method,Prep,DS,K) :- Daniel@0: complexity(Method, Daniel@0: write_dataset(Prep,DS), Daniel@0: K). Daniel@0: Daniel@0: ds_conditional_complexity(Method,Prep,Ref,DS,K) :- Daniel@0: conditional_complexity(Method, Daniel@0: write_dataset(Prep,Ref), Daniel@0: write_dataset(Prep,DS), Daniel@0: K). Daniel@0: Daniel@0: % ds_mutual_information(Method,Prep,DS1,DS2,I) :- Daniel@0: % mutual_information(Method, Daniel@0: % write_dataset(Prep,DS1), Daniel@0: % write_dataset(Prep,DS2), Daniel@0: % I). Daniel@0: Daniel@0: arg_min(K-Meth,Goal,KMin-Best) :- Daniel@0: aggregate_all(min(K,Meth),(Goal,Meth\=naive(_,_)),min(KMin,Best)). Daniel@0: Daniel@0: :- use_module(library(lambda)). Daniel@0: :- use_module(library(mlserver)). Daniel@0: :- use_module(library(uri)). Daniel@0: Daniel@0: exp(conditioning_scat(DS,Prep,Ref)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: findall([KMin,CKMin], Daniel@0: ( member(I,Items), Daniel@0: min_complexity(_,write_item(Prep,I),KMin), Daniel@0: min_conditional_complexity(_,write_dataset(Prep,Ref), Daniel@0: write_item(Prep,I),CKMin) Daniel@0: ), XX), Daniel@0: ??scat(transpose(arr(XX))), Daniel@0: ??xlabel(q(complexity)), Daniel@0: ??ylabel(q('conditional complexity')). Daniel@0: Daniel@0: exp(relative_erasure(DS,Prep)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: findall(CKRel, Daniel@0: ( select(I,Items,Rest), Daniel@0: min_complexity(_,write_item(Prep,I),KMin), Daniel@0: min_conditional_complexity(_,maplist(write_item(Prep),Rest), Daniel@0: write_item(Prep,I),CKMin), Daniel@0: CKRel is 1- CKMin/KMin Daniel@0: ), XX), Daniel@0: ??barh(XX), Daniel@0: ??xlabel(q('1 - relative erasure complexity')), Daniel@0: item_yticks(Items). Daniel@0: Daniel@0: exp(odd_one_out(Prep,DS,DS2,N)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: dataset_items(DS2,Items2), Daniel@0: nth1(N,Items2,OddBall), Daniel@0: AllItems=[OddBall|Items], Daniel@0: findall(CKRel, Daniel@0: ( select(I,AllItems,Rest), Daniel@0: min_complexity(_,write_item(Prep,I),KMin), Daniel@0: min_conditional_complexity(_,maplist(write_item(Prep),Rest), Daniel@0: write_item(Prep,I),CKMin), Daniel@0: CKRel is 1 - CKMin/KMin Daniel@0: ), XX), Daniel@0: ??barh(XX), Daniel@0: ??xlabel(q('1 - relative erasure complexity')), Daniel@0: item_yticks(AllItems). Daniel@0: Daniel@0: exp(erasure(DS,Prep)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: findall([KMin,CKMin], Daniel@0: ( select(I,Items,Rest), Daniel@0: min_complexity(_,write_item(Prep,I),KMin), Daniel@0: min_conditional_complexity(_,maplist(write_item(Prep),Rest), Daniel@0: write_item(Prep,I),CKMin) Daniel@0: ), XX), Daniel@0: ??barh(transpose(arr(XX))), Daniel@0: ??legend(cell([q(isolated),q(erasure)])), Daniel@0: ??xlabel(q(bits)), Daniel@0: item_yticks(Items). Daniel@0: Daniel@0: exp(compressibility(DS,Prep,Ref)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: findall([CKMin,KMin], Daniel@0: ( member(I,Items), Daniel@0: % complexity(id,write_item(Prep,I),L), Daniel@0: min_complexity(_,write_item(Prep,I),KMin), Daniel@0: min_conditional_complexity(_,write_dataset(Prep,Ref), Daniel@0: write_item(Prep,I),CKMin) Daniel@0: % arg_min(K-C, conditional_complexity(naive(C),write_dataset(Prep,Ref), Daniel@0: % write_item(Prep,I),K), NCK-_) Daniel@0: ), XX), Daniel@0: ??barh(transpose(arr(XX))), Daniel@0: item_yticks(Items), Daniel@0: ??xlabel(q(bits)), Daniel@0: ??legend(cell([q('delta compressed'),q(compressed)])). Daniel@0: Daniel@0: exp(info_density(DS,Prep,Ref)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: findall([H,HRef], Daniel@0: ( member(I,Items), Daniel@0: item_sequence(I,Pitches), Daniel@0: length(Pitches,L), Daniel@0: min_complexity(_,write_item(Prep,I),KMin), Daniel@0: min_conditional_complexity(_,write_dataset(Prep,Ref), Daniel@0: write_item(Prep,I),CKMin), Daniel@0: H is KMin/L, Daniel@0: HRef is CKMin/L Daniel@0: ), XX), Daniel@0: ??barh(transpose(arr(XX))), Daniel@0: ??legend(cell([q(isolated),q(conditional)])), Daniel@0: ??xlabel(q('bits per note')), Daniel@0: item_yticks(Items). Daniel@0: Daniel@0: exp(ds_similarity_matrix(Prep,Meth,Datasets)) :- Daniel@0: ncd_matrix(ncd(Meth), write_dataset(Prep), Datasets, Matrix), Daniel@0: ncd_image(Matrix), Daniel@0: yticks(Datasets). Daniel@0: Daniel@0: exp(similarity_matrix(Prep,Meth,DS)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: ncd_matrix(ncd(Meth), write_item(Prep), Items, Matrix), Daniel@0: ncd_image(Matrix), Daniel@0: item_yticks(Items). Daniel@0: Daniel@0: exp(conditional_similarity_matrix(Prep,Method,DS,Ref)) :- Daniel@0: dataset_items(DS,Items), Daniel@0: ncd_matrix(conditional_ncd(Method,write_dataset(Prep,Ref)), write_item(Prep), Items, Matrix), Daniel@0: ncd_image(Matrix), Daniel@0: item_yticks(Items). Daniel@0: Daniel@0: exp(ds_conditional_similarity_matrix(Prep,Method,Datasets,Ref)) :- Daniel@0: ncd_matrix(conditional_ncd(Method,write_dataset(Prep,Ref)), write_dataset(Prep), Datasets, Matrix), Daniel@0: ncd_image(Matrix), Daniel@0: yticks(Datasets). Daniel@0: Daniel@0: ncd_image(Matrix) :- ??imagesc(1-arr(Matrix)), ??colorbar. Daniel@0: Daniel@0: ncd_matrix(Sim,Writer,Items,Matrix) :- Daniel@0: length(Items,N), Daniel@0: numlist(1,N,IX), Daniel@0: maplist(ncd_matrix_column(Sim,Writer,Items,IX),IX,Matrix). Daniel@0: Daniel@0: ncd_matrix_column(Sim,Writer,Items,JX,I,Column) :- Daniel@0: maplist(ncd_matrix_entry(Sim,Writer,Items,I),JX,Column). Daniel@0: Daniel@0: ncd_matrix_entry(Sim,Writer,Items,I,J,D) :- Daniel@0: ( I=J -> D=nan Daniel@0: ; nth1(I,Items,XI), Daniel@0: nth1(J,Items,XJ), Daniel@0: call(Sim, call(Writer,XI), call(Writer,XJ), D) Daniel@0: ). Daniel@0: Daniel@0: item_yticks(Items) :- Daniel@0: length(Items,NumItems), Daniel@0: maplist(item_label,Items,Labels), Daniel@0: ??yticks(1:NumItems,cell(Labels)). Daniel@0: Daniel@0: item_label(Item,q(Name)) :- Daniel@0: item_uri(Item,URI), Daniel@0: uri_components(URI,Components), Daniel@0: uri_data(path,Components,Path), Daniel@0: directory_file_path(_,File,Path), Daniel@0: file_name_extension(Name,_,File). Daniel@0: Daniel@0: printfig(W,H,Name) :- Daniel@0: format(atom(Path),'/Users/samer/pubs/asymmus/workshop/figs/~w.eps',[Name]), Daniel@0: format(atom(Cmd),'epstopdf ~w',[Path]), Daniel@0: ??fsetup(W,H,q(centimeters)), Daniel@0: ??print(q('-depsc2'),q(Path)), Daniel@0: shell(Cmd). Daniel@0: Daniel@0: plot_method_rankings :- Daniel@0: setof( r(MeanRank,Method,Ranks), Daniel@0: ( compression:method_rankings(Method,Ranks), Daniel@0: mean_list(Ranks,MeanRank)), Daniel@0: Results), Daniel@0: ??newplot, Daniel@0: ??hold(q(on)), Daniel@0: forall( nth1(I,Results,r(_,_,Ranks)), Daniel@0: ??plot(Ranks,I+0.7*(rand(size(Ranks))-0.5),q('.'))), Daniel@0: ??hold(q(off)), Daniel@0: maplist(result_method,Results,Methods), Daniel@0: yticks(Methods). Daniel@0: Daniel@0: result_method(r(_,Method,_),Method). Daniel@0: Daniel@0: yticks(Terms) :- Daniel@0: length(Terms,N), Daniel@0: maplist(term_label,Terms,Labels), Daniel@0: ??yticks(1:N,cell(Labels)). Daniel@0: Daniel@0: term_label(Term,q(Label)) :- format(atom(Label),'~w',[Term]). Daniel@0: Daniel@0: Daniel@0: mean_list(L,Mean) :- Daniel@0: length(L,N), Daniel@0: sumlist(L,Sum), Daniel@0: Mean is Sum/N. Daniel@0: Daniel@0: Daniel@0: % pairwise(DS,Matrix) :- Daniel@0: % dataset_items(DS,Items), Daniel@0: % maplist(\I1^maplist(\I2^conditional_complexity( Daniel@0: Daniel@0: Daniel@0: % rnd_state(T) :- get_rnd_state(S), rnd_state_term(S,T). Daniel@0: Daniel@0: % with_sample(T,RV,Pred) :- Daniel@0: % rnd_state_term(S1,T), Daniel@0: % sample(RV,X,S1,S2), Daniel@0: % set_rnd_state(S2), Daniel@0: % call(Pred,X). Daniel@0: