%% ДпмЭт ЧщсйкЮт ГейфнЯбузт
% *ЦбЯдщн КхсйбкЯдзт*
%
% ФмЮмб ГещгсбцЯбт РбнерйуфзмЯпх БйгбЯпх

%% ЕйубгщгЮ дедпмЭнщн кбй рлзспцпсЯет
load sidsNorthCarolina.mat
sidsInfo
whos CountyVertices

%% РспкбфбскфйкЬ
CoordsVert = CountyVertices;
nPoly = numel(CoordsVert);
display( nPoly ) 
iPoly2Plot = 60;

%% УхмвплпуейсЬ ме бэопнфб бсйимь рплхгюнпх
idPoly = (1:nPoly)';
idPoly = num2str(idPoly); % num2str = number to string (character)
% мефбфспрЮ бсйимюн уе ухмвплпуейсЭт

%% Брейкьнйуз рплхгюнщн
polygonmap(CoordsVert);
title('North Carolina counties');

%% КенфспейдЮ рплхгюнщн
Centroids = poly2centroid(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'*');
title('Polygon centroids');
axis image

%% Брейкьнйуз рплхгюнщн ме бсйимь (гйб фбхфпрпЯзуз)
% Display map of polygons only
polygonmap(CoordsVert);
title('County polygons for North Carolina');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% Брейкьнйуз рплхгюнщн + кенфспейдЮ
polygonmap(CoordsVert);
hold on
plot(Centroids(:,1),Centroids(:,2),'.');
title('County polygons & centroids');
h=text(Centroids(:,1),Centroids(:,2),idPoly);
%set(h,'HorizontalAlignment','Center','VerticalAlignment','Bottom');
hold off

%% ДедпмЭнб: бсйимьт кспхумЬфщн ньупх SIDS
sidsCases = Data74to84(:,1);

%% ЧщспрлзиЮт чЬсфзт
vType = 'cont';
% vType = variable type, with 2 cases:
%         'cont' -> continuous
%         'cat'  -> categorical  
plotPars = {'color', 'vbar'}; % plotting parameters 
% 1st entry: 'color' or 'gray' -> color or gray scale
% 2nd entry: 'vbar' 'hbar or 'nobar'
%            vertical, horizontal, no bar with color legend
colorminmax = []; % automatic min and max values for color
polygonmap(CoordsVert,sidsCases,1,'cont',colorminmax,plotPars);
% 1 -> column # from matrix (here sidsCases) to extract and display
title('SIDS cases in North Carolina counties (1974-1984)');

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% ГейфнЯбуз ме вЬуз кпйнЬ ьсйб рплхгюнщн

%% ГейфнЯбуз 1зт фЬозт
% Хрплпгйумьт фпх рЯнбкб гейфнЯбузт 1зт фЬозт
A1 = poly2adjacency(CoordsVert,'norowstand');
% ьрпх 'norowstand' дзлюней ьфй фп Ьиспйумб фщн гсбммюн фпх рЯнбкб
% гейфнЯбузт ден ерйвЬллефбй нб еЯнбй 1
size(A1)
% кбй брейкьнйуз фщн мз-мзденйкюн уфпйчеЯщн фпх ме фзн енфплЮ |spy|:
spy(A1,'.',10);
axis([1 nPoly 1 nPoly]);
title('Adjacency matrix of order 1');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцпт кенфспйейдюн гейфпнйкюн рплхгюнщн ме фзн енфплЮ gplot
gplot(A1,Centroids)
hold on
polygonmap(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'k*');
text(Centroids(:,1),Centroids(:,2),idPoly);
hold off
title('Graph of connected centroids (of 1st-order neighboring polygons)');

%% ГеЯфпнет 1зт фЬозт фпх рплхгюнпх #60
lagOrder = 1;
v60order1 = adjacentneighbors(A1,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60order1,1,'cat');
title('1st-order neighbors of polygon #60');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% Бсйимьт гейфьнщн 1зт фЬозт кЬие рплхгюнпх
% Бсйимьт фщн мз-мзденйкюн уфпйчеЯщн кЬие гсбммЮт фпх рЯнбкб |A1|,
% кбй брейкьнйуз фпх брпфелЭумбфпт:
nN1 = full(sum(A1,2));
polygonmap(CoordsVert,nN1,1,'cont',[],plotPars);
title('Number of 1st-order neighbors per polygon');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% ГейфнЯбуз 2зт фЬозт
% Пй геЯфпнет 2зт фЬозт еньт рплхгюнпх еЯнбй екеЯнб фб рплэгщнб
% рпх еЯнбй 1зт фЬозт геЯфпнет фщн гейфьнщн 1зт фЬозт фпх ен льгщ 
% рплхгюнпх
% 
% Гйб фп рбсЬдейгмб фзт Вьсейбт КбсплЯнбт, п рЯнбкбт гейфьнщн 2зт фЬозт
% хрплпгЯжефбй щт:
lagOrder = 2;
A2 = higheradjacency(A1,lagOrder,'norowstand');
figure
spy(A2,'.',10);
axis([1 nPoly 1 nPoly]);
title('Adjacency matrix of order 2');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцпт кенфспйейдюн гейфпнйкюн рплхгюнщн ме фзн енфплЮ gplot
gplot(A2,Centroids)
hold on
polygonmap(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'k*');
text(Centroids(:,1),Centroids(:,2),idPoly);
hold off
%axis([-82 -81 35.7 36.7])
title('Graph of connected centroids (of 2nd-order neighboring polygons)');

%% ХрплпгйуфйкЭт узмейюуейт
% ВлЭрпхме ьфй уфпхт рбсбрЬнщ хрплпгйумпэт ден хрейуЭсчефбй п рЯнбкбт
% гейфнЯбузт |A1| Ю п рЯнбкбт |A2|. Бхфь ухмвбЯней гйбфЯ Энбт рЯнбкбт
% гейфнЯбузт 2зт фЬозт мрпсеЯ нб хрплпгйуфеЯ бн хшюупхме фпн рЯнбкб
% гейфнЯбузт 1зт фЬозт уфзн бнфЯуфпйчз дэнбмз. ХрЬсчпхн месйкЬ вЮмбфб
% бкьмз, бллЬ фп узмбнфйкь еЯнбй ьфй брь фпн рЯнбкб гейфнЯбузт 1зт фЬозт
% хрплпгЯжпнфбй ьлпй пй рЯнбкет гейфнЯбузт фЬоещн > 1.

%% ЧщсйкЮ брейкпнЯуз гейфьнщн фЬозт > 1 

%% ГеЯфпнет 1зт кбй 2зт фЬозт фпх рплхгюнпх #60
v60order2 = adjacentneighbors(A1,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60order2,1,'cat');
title('1st and 2nd-order neighbors of polygon #60');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% Бсйимьт гейфьнщн 2зт фЬозт
% Бсйимьт мз-мзденйкюн уфпйчеЯщн кЬие гсбммЮт фпх рЯнбкб гейфнЯбузт |A2|
% кбй брейкьнйуз:
nN2 = full(sum(A2,2));
polygonmap(CoordsVert,nN2,1,'cont',[],plotPars);
title('Number of 2nd-order neighbors per polygon');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% ГеЯфпнет 1зт, 2зт кбй 3зт фЬозт фпх рплхгюнпх #60
lagOrder = 3;
v60order3 = adjacentneighbors(A1,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60order3,1,'cat');
title('1st, 2nd and 3rd-order neighbors of polygon #60');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% ГейфнЯбуз рплхгюнщн ме вЬуз фзн брьуфбуз мефбоэ кенфспейдюн

%% ГейфнЯбуз ме вЬуз брпуфЬуейт <= 0.35
iMode = 1; % use min and max distance -> binary output
% iMode = 2 -> use inverse distance up to max distance
minmaxDist = [0 0.35];
D035 = points2weights(Centroids,iMode,minmaxDist,'norowstand');
% брейкьнйуз уфпйчеЯщн ме фзн енфплЮ |spy|:
spy(D035,'.',10);
axis([1 nPoly 1 nPoly]);
title('Distance-based adjacency matrix (cutoff = 0.35)');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцпт кенфспйейдюн гейфпнйкюн рплхгюнщн ме фзн енфплЮ gplot
gplot(D035,Centroids)
hold on
polygonmap(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'k*');
hold off
title('Graph of connected centroids (of neighboring polygons)');

%% ГеЯфпнет фпх рплхгюнпх #60
lagOrder = 1;
v60D035 = adjacentneighbors(D035,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60D035,1,'cat');
hold on
% КенфспейдЮ
plot(Centroids(:,1),Centroids(:,2),'k.');
% Кэклпт ме бкфЯнб 0.35 кбй кЭнфсп фп кенфспейдЭт фпх рплхгюнпх #60
radius = minmaxDist(2);
azim = 0; % azimuth
nP2plot = 100; % number of points to plot
ht=drawellipse(Centroids(iPoly2Plot,:),[radius radius],azim,nP2plot,'r');
set(ht,'LineWidth',2);
text(Centroids(:,1),Centroids(:,2),idPoly);
hold off
title('Neighbors of polygon #60 within 0.35 distance units');

%% Бсйимьт гейфьнщн кЬие рплхгюнпх
% Бсйимьт мз-мзденйкюн уфпйчеЯщн кЬие гсбммЮт фпх рЯнбкб гейфнЯбузт 
% |D035| кбй брейкьнйуз:
nN_D035 = full(sum(D035,2));
polygonmap(CoordsVert,nN_D035,1,'cont',[],plotPars);
title('Number of neighbors within 0.35 from each polygon');
text(Centroids(:,1),Centroids(:,2),idPoly);

%% ГейфнЯбуз ме вЬуз брпуфЬуейт <= 0.5
minmaxDist = [0 0.5];
D05 = points2weights(Centroids,iMode,minmaxDist,'norowstand');
% брейкьнйуз уфпйчеЯщн ме фзн енфплЮ |spy|:
spy(D05,'.',10);
axis([1 nPoly 1 nPoly]);
title('Distance-based adjacency matrix (cutoff = 0.5)');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцпт кенфспйейдюн гейфпнйкюн рплхгюнщн ме фзн енфплЮ gplot
gplot(D05,Centroids)
hold on
polygonmap(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'k*');
hold off
title('Graph of connected centroids (of neighboring polygons)');

%% ГеЯфпнет фпх рплхгюнпх #60
lagOrder = 1;
v60D05 = adjacentneighbors(D05,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60D05,1,'cat');
hold on
% КенфспейдЮ
plot(Centroids(:,1),Centroids(:,2),'k.');
% Кэклпт ме бкфЯнб 0.5 кбй кЭнфсп фп кенфспейдЭт фпх рплхгюнпх #60
radius = minmaxDist(2);
ht=drawellipse(Centroids(iPoly2Plot,:),[radius radius],azim,nP2plot,'r');
set(ht,'LineWidth',2);
text(Centroids(:,1),Centroids(:,2),idPoly);
hold off
title('Neighbors of polygon #60 within 0.5 distance units');

%%  ГейфнЯбуз ме вЬуз брпуфЬуейт <= 0.75
iMode = 1;
minmaxDist = [0 0.75];
D075 = points2weights(Centroids,iMode,minmaxDist,'norowstand');
% кбй брейкьнйуз фщн уфпйчеЯщн ме фзн енфплЮ |spy|:
spy(D075,'.',10);
axis([1 nPoly 1 nPoly]);
title('Distance-based adjacency matrix (cutoff = 0.75)');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцзмб кенфспйейдюн гейфпнйкюн рплхгюнщн ме фзн енфплЮ gplot
gplot(D075,Centroids)
hold on
polygonmap(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'k*');
hold off
title('Graph of connected centroids (of neighboring polygons)');

%% ГеЯфпнет фпх рплхгюнпх #60
lagOrder = 1;
v60D075 = adjacentneighbors(D075,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60D075,1,'cat');
hold on
plot(Centroids(:,1),Centroids(:,2),'k.');
radius = minmaxDist(2);
ht=drawellipse(Centroids(iPoly2Plot,:),[radius radius],azim,nP2plot,'r');
set(ht,'LineWidth',2);
text(Centroids(:,1),Centroids(:,2),idPoly);
hold off
title('Neighbors of polygon #60 within 0.75 distance units');

%%  ГейфнЯбуз ме вЬуз брпуфЬуейт <= 0.75 кбй >=0.5
minmaxDist = [0.5 0.75];
D05075 = points2weights(Centroids,lagOrder,minmaxDist,'norowstand');
% кбй брейкьнйуз фщн уфпйчеЯщн ме фзн енфплЮ |spy|:
spy(D05075,'.',10);
axis([1 nPoly 1 nPoly]);
title('Distance-based adjacency matrix [0.5 0.75]');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцзмб кенфспйейдюн гейфпнйкюн рплхгюнщн ме фзн енфплЮ gplot
gplot(D05075,Centroids)
hold on
polygonmap(CoordsVert);
plot(Centroids(:,1),Centroids(:,2),'k*');
hold off
%axis([-82 -81 35.7 36.7])
title('Graph of connected centroids (of neighboring polygons)');

%% ГеЯфпнет фпх рплхгюнпх #60
v60D05075 = adjacentneighbors(D05075,iPoly2Plot,lagOrder);
polygonmap(CoordsVert,v60D05075,1,'cat');
hold on
plot(Centroids(:,1),Centroids(:,2),'k.');
ht=drawellipse(Centroids(iPoly2Plot,:),[0.5 0.5],azim,nP2plot,'r');
set(ht,'LineWidth',2);
ht=drawellipse(Centroids(iPoly2Plot,:),[0.75 0.75],azim,nP2plot,'r');
set(ht,'LineWidth',2);
text(Centroids(:,1),Centroids(:,2),idPoly);
hold off
title('Neighbors of polygon #60 within [0.5 0.75] distance units');


%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% ЧщсйкЭт рсЬоейт чсзуймпрпйюнфбт фпн рЯнбкб вбсюн W

%% РЯнбкбт гейфнЯбузт 1зт фЬозт ме фхрпрпйзмЭнет гсбммЭт
W = poly2adjacency(CoordsVert,'rowstand');
% 'rowstand' -> Ьиспйумб кЬие гсбммЮт = 1

%% МЭует фймЭт гейфпнйкюн мефсЮуещн кЬие рплхгюнпх
% Бн |y| еЯнбй з уфЮлз фщн |Н| мефсЮуещн мйбт мефбвлзфЮт рпх кбфбгсЬцзкбн
% уе |N| рплэгщнб, кбй |W| еЯнбй п |(Н x N)| рЯнбкбт чщсйкюн вбсюн,
% фьфе з уфЮлз |W*y| ресйЭчей фпхт мЭупхт ьспхт фщн гейфьнщн фщн бсчйкюн
% мефсЮуещн. Гйб рбсЬдейгмб, фп уфпйчеЯп _i_ фпх рЯнбкб |W*y| еЯнбй п 
% мЭупт ьспт фщн мефсЮуещн рпх кбфбгсЬцзкбн уфб гейфпнйкЬ рплэгщнб фпх
% рплхгюнпх _i_
sidsCasesAve = W*sidsCases;
size(sidsCasesAve)
%%
figure
polygonmap(CoordsVert,sidsCases,1,'cont',[0 40],plotPars);
title('SIDS cases');
figure
polygonmap(CoordsVert,sidsCasesAve,1,'cont',[0 40],plotPars);
title('Neighborhood averages of SIDS cases');

%% Фп дйбурпсьгсбммб фпх Moran
figure
% Дйбурпсьгсбммб узмеЯщн ме фефмзмЭнет фйт бсчйкЭт мефсЮуейт кбй 
% фефбгмЭнет фпхт мЭупхт ьспхт фщн гейфьнщн фщн бсчйкюн мефсЮуещн
plot(sidsCases,sidsCasesAve,'*');
axis square
xlabel('SIDS cases','FontSize',12);
ylabel('SIDS cases neighbor averages');

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% ўллет дпмЭт чщсйкЮт гейфнЯбузт
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Мьнп кенфспейдЮ
x = Centroids(:,1);
y = Centroids(:,2);
ax = [-85 -75 34 37];
N = numel(x);
ids = (1:N)';

%% Брейкьнйуз
plot(x,y,'*')
title('Some points');
axis equal
axis(ax);

%% Voronoi
[vx,vy ] = voronoi(x,y);
plot(x,y,'*');
axis equal
hold on
plot(vx,vy,'r-');
hold off
title('Voronoi tesselation');
axis(ax);

%% Convex hull = кхсфь кэффпт
cIndex = convhull(x,y);
plot(x,y,'*');
axis equal
hold on
plot(x(cIndex),y(cIndex),'ro-');
hold off
text(x(cIndex),y(cIndex),num2str(cIndex));
title('Convex hull of points');
axis(ax);

%% Delaunay triangulation = фсйгщнйумьт Delaunay
TRI = delaunay(x,y);
triplot(TRI,x,y);
axis equal
hold on
plot(x,y,'*');
%plot(vx,vy,'b--'); % Delaunay triangles define Voronoi polygons
hold off
axis(ax);
text(x,y,num2str((1:N)'));
title('Delaunay triangles');

%% Adjacency matrix of Voronoi polygons (based on Delaunay structure)
Avoronoi = points2adjacencyvoronoi([x y]);

%% Display Voronoi adjacency matrix with spy 
spy(Avoronoi,'.',10);
axis([1 N 1 N]);
title('Adjacency matrix of Voronoi polygons');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцзмб ухндедемЭнщн узмеЯщн (кьмвщн дйкфэпх)
[Xvor,Yvor]=gplot(Avoronoi,[x y]);
plot(Xvor,Yvor,'r-');
axis equal
hold on
plot(x,y,'*');
plot(vx,vy,'b--'); % Delaunay triangles define Voronoi polygons
hold off
axis(ax)
text(x,y,num2str(ids));
title('Neighbors based on Voronoi polygons with common borders');
%axis([-80 -78 35 36]) % zoom around centroid #60
%Avoronoi(60,:) % neighbors of point #60, based on Voronoi polygons

%% K=3 nearest neighbors = 3 рлзуйЭуфеспй геЯфпнет
[idx3,d3] = knnsearch([x y],[x y],'K',3);
idx3(:,1) = []; d3(:,1) = []; % get rid of 1st columns
Ann3 = zeros(N,N);
for ii=1:N
    Ann3(ii,idx3(ii,:)) = 1;
end
Ann3 = sparse(Ann3);

%% Брейкьнйуз бсбйпэ рЯнбкб
spy(Ann3,'.',10);
axis([1 N 1 N]);
title('Adjacency matrix from 3 nearest neighbors');
xlabel('j = 1,...,100');
ylabel('100,...,1 = i');

%% ГсЬцзмб ухндедемЭнщн узмеЯщн (кьмвщн дйкфэпх)
[X3,Y3]=gplot(Ann3,[x y]);
plot(X3,Y3,'r-');
axis equal
hold on
plot(x,y,'*');
hold off
axis(ax)
text(x,y,num2str(ids));
title('Connected 3 nearest neighboring points');

%% јлб мбжЯ уе Энб есгблеЯп/енфплЮ
help spatialweights