From 153ad7fe3f2b412f4927e1c5b6007c58cc7d07df Mon Sep 17 00:00:00 2001 From: marteresagh Date: Sat, 20 Apr 2019 18:47:16 +0200 Subject: [PATCH 01/10] graph_img --- docs/src/images/dependency_graph.png | Bin 0 -> 60304 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/images/dependency_graph.png diff --git a/docs/src/images/dependency_graph.png b/docs/src/images/dependency_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7bafb21d7b0868e22a8ed6c623dea15da4aa998e GIT binary patch literal 60304 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 H%j^Fi+Ux$d literal 0 HcmV?d00001 From a68c2b4e94cde008a41c67672c9a75dd121d4752 Mon Sep 17 00:00:00 2001 From: marteresagh Date: Sat, 20 Apr 2019 18:48:41 +0200 Subject: [PATCH 02/10] documentation --- docs/src/arrangement.md | 99 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git a/docs/src/arrangement.md b/docs/src/arrangement.md index 528460ef..41bd8266 100644 --- a/docs/src/arrangement.md +++ b/docs/src/arrangement.md @@ -9,12 +9,25 @@ This operation can be seen as a boolean union of two cellular complexes. Here an ![10 x 10 Cube](./images/cube10x10.jpg) > **Figure 1:** Arrangement of ``2000=2\times10\times10\times10`` cubes +## Graph of recall functions +A graph is an ordered pair ``G(V,E)`` comprising a set ``V`` of vertices, nodes or points together with a set ``E`` of edges, arcs or lines, which are ``2``-elements subsets of ``V``. In this case, ``V`` is the set of functions of this sub-module and let ``v1``, ``v2`` be elements of ``V``, then ``e=v1v2`` ``\in`` ``E`` if ``v1`` calls ``v2``. +In the following graph the functions are arranged in colored boxes: +![dependency graph](./images/dependency_graph.png) +- yellow boxes is for `spatial_arrangement` +- red boxes is for `planar_arrangement` +- green boxes is for `minimal_cycles` +- blue boxes is for `dimension_travel` + +Functions in darker boxes are declared only in the local scope of its father. + ## API -Every function strictly relative to the arrangement has been collected in the `Lar.Arrangement` sub-module but the two main functions are accessible directly from the `LinearAlgebraicRepresentation` namespace. +Every functions strictly relative to the arrangement has been collected in the `Lar.Arrangement` sub-module but the two main functions are accessible directly from the `LinearAlgebraicRepresentation` namespace. + !!! warning `Lar.Arrangement` is the only place in `LinearAlgebraicRepresentation` where `Point` matrices store points per row and not per column as described in the documentation of `Lar.Points` + ```@docs Lar.spatial_arrangement Lar.planar_arrangement @@ -47,14 +60,14 @@ the spatial index: it is a mapping ``\mathcal{I}(\sigma)`` from a cell where the ``box`` function provides the axis aligned bounding box (AABB) of a cell [fig. 2, c, ``\sigma`` in red and ``\mathcal{I}(\sigma)`` in blue]. The spatial arrangement calculation is speeded up by storing the AABBs as dimensional wise intervals -into an interval tree \cite{interval_trees}. +into an interval tree ``\cite{interval_trees}``. Now for each cell ``\sigma`` we transform ``\sigma \cup \mathcal{I}(\sigma)`` -in a way that ``\sigma`` lays on the ``x_3=0`` plane [fig. 2, d] and we find the intersections -of the ``\mathcal{I}(\sigma)`` cells with ``x_3=0`` plane. So we have a "soup" +in a way that ``\sigma`` lays on the ``x_3=0`` plane [fig. 2, d] and we find the intersections +of the ``\mathcal{I}(\sigma)`` cells with ``x_3=0`` plane. So we have a "soup" of 1-cells in ``\mathbb{E}^2`` [fig. 2, e], and we fragment each 1-cell with every other cell obtaining a valid 1-skeleton [fig. 2, f]. From this data it is possible to build the 2-cells using the ALGORITHM 1 -presented and explored by Paoluzzi et al. \cite{Paoluzzi} +presented and explored by Paoluzzi et al. ``\cite{Paoluzzi}`` [fig. 2, g, exploded]. The procedure to fragment 1-cells on a plane and return a 2-complex is called *planar arrangement*. When the planar arrangement is complete, fragmented ``\sigma`` can be transformed back to its original position @@ -97,4 +110,78 @@ cell 2 has cell 1 as an hole]. !!! note A 2-cell with a non-intersecting shell can be trivially defined as a "face with holes"; the correct definition is that it cannot - be shrunk to the dimension of a point. \ No newline at end of file + be shrunk to the dimension of a point. + +## Main Interface + +### Dimension travel + +### Minimal cycles + +```@docs +Lar.Arrangement.minimal_2cycles +``` + +```@docs +Lar.Arrangement.minimal_3cycles +``` + +### Planar arrangement + +```@docs +Lar.Arrangement.intersect_edges +``` + +```@docs +Lar.Arrangement.frag_edge +``` + +```@docs +Lar.Arrangement.merge_vertices! +``` + +```@docs +Lar.Arrangement.biconnected_components +``` + +```@docs +Lar.Arrangement.get_external_cycle +``` + +```@docs +Lar.Arrangement.pre_containment_test +``` + +```@docs +Lar.Arrangement.prune_containment_graph +``` + +```@docs +Lar.Arrangement.transitive_reduction! +``` + +```@docs +Lar.Arrangement.componentgraph +``` + +```@docs +Lar.Arrangement.cell_merging +``` + +```@docs +Lar.Arrangement.cleandecomposition +``` + +```@docs +Lar.Arrangement.planar_arrangement_1 +``` + +```@docs +Lar.Arrangement.planar_arrangement_2 +``` + +### Spatial arrangement + + + + From f8715d8c1577ac39d393bc466233e79c848a5a4f Mon Sep 17 00:00:00 2001 From: marteresagh Date: Sat, 20 Apr 2019 18:50:15 +0200 Subject: [PATCH 03/10] Add docstrings --- src/arrangement/minimal_cycles.jl | 13 +- src/arrangement/planar_arrangement.jl | 164 ++++++++++++++++++++++++++ 2 files changed, 176 insertions(+), 1 deletion(-) diff --git a/src/arrangement/minimal_cycles.jl b/src/arrangement/minimal_cycles.jl index 6ff94735..ce57cc0d 100644 --- a/src/arrangement/minimal_cycles.jl +++ b/src/arrangement/minimal_cycles.jl @@ -1,5 +1,11 @@ Lar = LinearAlgebraicRepresentation +""" + minimal_2cycles(V::Lar.Points, EV::Lar.ChainOp) + +Return all cycles of a 2D graph define by its vertices and edges. + +""" function minimal_2cycles(V::Lar.Points, EV::Lar.ChainOp) function edge_angle(v::Int, e::Int) @@ -14,12 +20,17 @@ function minimal_2cycles(V::Lar.Points, EV::Lar.ChainOp) EV[i, j] = -1 end VE = convert(Lar.ChainOp, SparseArrays.transpose(EV)) - +@show V +@show VE EF = Lar.Arrangement.minimal_cycles(edge_angle)(V, VE) return convert(Lar.ChainOp, SparseArrays.transpose(EF)) end +""" + minimal_3cycles(V::Lar.Points, EV::Lar.ChainOp, FE::Lar.ChainOp) + +""" function minimal_3cycles(V::Lar.Points, EV::Lar.ChainOp, FE::Lar.ChainOp) triangulated_faces = Array{Any, 1}(undef, FE.m) diff --git a/src/arrangement/planar_arrangement.jl b/src/arrangement/planar_arrangement.jl index ddcf7790..594b33ce 100644 --- a/src/arrangement/planar_arrangement.jl +++ b/src/arrangement/planar_arrangement.jl @@ -13,6 +13,42 @@ function frag_edge_channel(in_chan, out_chan, V, EV, bigPI) end end + +""" + frag_edge(V::Lar.Points, EV::Lar.ChainOp, edge_idx::Int, bigPI) + +Return vertices and edges after intersection. +# Example +```julia +julia> V = [ 0 0; 1 1; 1 0; 0 1]; + +julia> EV = Int8[ 1 1 0 0; + 0 0 1 1; + ]; + +julia> EV = sparse(EV); + +julia> model = (convert(Lar.Points,V'),Lar.cop2lar(EV)); + +julia> bigPI = Lar.spaceindex(model::Lar.LAR); + +julia> Lar.Arrangement.frag_edge(V, EV, 1, bigPI) +([0.0 0.0; 1.0 1.0; 0.5 0.5], + [1, 1] = 1 + [2, 2] = 1 + [1, 3] = 1 + [2, 3] = 1) + +julia> Lar.Arrangement.frag_edge(V, EV, 2, bigPI) +([1.0 0.0; 0.0 1.0; 0.5 0.5], + [1, 1] = 1 + [2, 2] = 1 + [1, 3] = 1 + [2, 3] = 1) + + +``` +""" function frag_edge(V::Lar.Points, EV::Lar.ChainOp, edge_idx::Int, bigPI) alphas = Dict{Float64, Int}() edge = EV[edge_idx, :] @@ -39,6 +75,27 @@ function frag_edge(V::Lar.Points, EV::Lar.ChainOp, edge_idx::Int, bigPI) return verts, ev end + +""" + intersect_edges(V::Lar.Points, edge1::Lar.Cell, edge2::Lar.Cell) + +Intersection of two edges. Return, if exist, points of intersection and parameter. + +# Example +```julia +julia> V=[0 0 ; 1 1; 1/2 0; 1/2 1]; + +julia> EV = SparseArrays.sparse(Array{Int8, 2}([ + [1 1 0 0] #1->1,2 + [0 0 1 1] #2->3,4 + ])); + +julia> Lar.Arrangement.intersect_edges(V, EV[1, :], EV[2, :]) +1-element Array{Tuple{Array{T,2} where T,Float64},1}: + ([0.5 0.5], 0.5) + +``` +""" function intersect_edges(V::Lar.Points, edge1::Lar.Cell, edge2::Lar.Cell) err = 10e-8 @@ -83,6 +140,36 @@ function intersect_edges(V::Lar.Points, edge1::Lar.Cell, edge2::Lar.Cell) return ret end +""" + merge_vertices!(V::Lar.Points, EV::Lar.ChainOp, edge_map, err=1e-4) + +If two or more vertices are very close, return one vertex and right edges. + +# Example +```julia +julia> p0 = 1e-2; + +julia> pm = 1-p0; + +julia> pp = 1+p0; + +julia> V = [ p0 p0; p0 -p0; + pp pm; pp pp + ]; + +julia> EV = Int8[1 0 1 0 ; + 0 1 0 1 ; + 1 0 0 1 ; + 0 1 1 0 ]; + +julia> EV = sparse(EV); + +julia> Lar.Arrangement.merge_vertices!(V, EV, [],1e-1) +([0.01 0.01; 1.01 0.99], + [1, 1] = 1 + [1, 2] = 1) +``` +""" function merge_vertices!(V::Lar.Points, EV::Lar.ChainOp, edge_map, err=1e-4) vertsnum = size(V, 1) edgenum = size(EV, 1) @@ -144,6 +231,29 @@ function merge_vertices!(V::Lar.Points, EV::Lar.ChainOp, edge_map, err=1e-4) return Lar.Points(nV), nEV end +""" + biconnected_components(EV::Lar.ChainOp) + +Find the biconnected components of a graph define by his edges. A biconnected component is a maximal biconnected subgraph. A biconnected graph has no **articulation vertices**. + +# Example +```julia +julia> EV = Int8[1 1 0 0 0 0; + 0 1 1 0 0 0; + 1 0 1 0 0 0; + 1 0 0 0 1 0; + 0 0 0 1 1 0; + 0 0 0 1 0 1; + 0 0 0 0 1 1] ; + +julia> EV = sparse(EV); + +julia> bc = Lar.Arrangement.biconnected_components(EV) +2-element Array{Array{Int64,1},1}: + [3, 2, 1] + [7, 6, 5] +``` +""" function biconnected_components(EV::Lar.ChainOp) ps = Array{Tuple{Int, Int, Int}, 1}() es = Array{Tuple{Int, Int}, 1}() @@ -240,6 +350,11 @@ function biconnected_components(EV::Lar.ChainOp) return bicon_comps end +""" + get_external_cycle(V::Lar.Points, EV::Lar.ChainOp, FE::Lar.ChainOp) + +Get the face's index of external cell in FE. +""" function get_external_cycle(V::Lar.Points, EV::Lar.ChainOp, FE::Lar.ChainOp) FV = abs.(FE)*EV vs = sparsevec(mapslices(sum, abs.(EV), dims=1)').nzind @@ -272,6 +387,13 @@ function get_external_cycle(V::Lar.Points, EV::Lar.ChainOp, FE::Lar.ChainOp) end end end + +""" + pre_containment_test(bboxes) + +Return containment graph. An element **(i,j)** is **1** if the **i-th** cell is contained in the **boundary box** of the **j-th** cell. + +""" function pre_containment_test(bboxes) n = length(bboxes) containment_graph = spzeros(Int8, n, n) @@ -286,6 +408,12 @@ function pre_containment_test(bboxes) return containment_graph end + +""" + prune_containment_graph(n, V, EVs, shells, graph) + +Check if the origin point of a cell is inside the face area of other cell in the graph. +""" function prune_containment_graph(n, V, EVs, shells, graph) for i in 1:n @@ -309,6 +437,27 @@ function prune_containment_graph(n, V, EVs, shells, graph) end return graph end + +""" + transitive_reduction!(graph) + +Remove elements from containment graph that can be compute for transitivity. + +# Example +```julia +julia> graph = [0 1 1 1 ; 0 0 1 1 ; 0 0 0 1 ; 0 0 0 0 ]; + +julia> Lar.Arrangement.transitive_reduction!(graph) + +julia> graph +4×4 Array{Int64,2}: + 0 1 0 0 + 0 0 1 0 + 0 0 0 1 + 0 0 0 0 + +``` +""" function transitive_reduction!(graph) n = size(graph, 1) for j in 1:n @@ -324,6 +473,12 @@ function transitive_reduction!(graph) end end +""" + cell_merging(n, containment_graph, V, EVs, boundaries, shells, shell_bboxes) + +Merge all cells. + +""" function cell_merging(n, containment_graph, V, EVs, boundaries, shells, shell_bboxes) function bboxes(V::Lar.Points, indexes::Lar.ChainOp) boxes = Array{Tuple{Any, Any}}(undef, indexes.n) @@ -379,7 +534,11 @@ function cell_merging(n, containment_graph, V, EVs, boundaries, shells, shell_bb return EV, FE end +""" + componentgraph(V, copEV, bicon_comps) +Return some properties of a graph, in order: `n`, `containment_graph`, `V`, `EVs`, `boundaries`, `shells`, `shell_bboxes`. +""" function componentgraph(V, copEV, bicon_comps) # arrangement of isolated components @@ -425,7 +584,12 @@ function componentgraph(V, copEV, bicon_comps) return n, containment_graph, V, EVs, boundaries, shells, shell_bboxes end +""" + cleandecomposition(V, copEV, sigma) + +Delete edges outside sigma area. +""" function cleandecomposition(V, copEV, sigma) # Deletes edges outside sigma area todel = [] From 24460f55ac1cbf4afb1e3cc044c188c9ec91f84a Mon Sep 17 00:00:00 2001 From: marteresagh Date: Sat, 20 Apr 2019 18:51:22 +0200 Subject: [PATCH 04/10] my test of planar arrangement --- test/planar_arr_mytest.jl | 176 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 test/planar_arr_mytest.jl diff --git a/test/planar_arr_mytest.jl b/test/planar_arr_mytest.jl new file mode 100644 index 00000000..1660fd24 --- /dev/null +++ b/test/planar_arr_mytest.jl @@ -0,0 +1,176 @@ +using Test +using LinearAlgebraicRepresentation +Lar = LinearAlgebraicRepresentation +using Plasm,SparseArrays + +@testset "frag_edge" begin + V = [ 3 1; 6 8;2 -2;9 6;1 6;10 1] + + EV = Int8[ 1 1 0 0 0 0 ; + 0 0 1 1 0 0 ; + 0 0 0 0 1 1 ] + EV = sparse(EV) + edgenum = size(EV, 1) + rV = Lar.Points(zeros(0, 2)) + rEV = SparseArrays.spzeros(Int8, 0, 0) + model = (convert(Lar.Points,V'),Lar.cop2lar(EV)) + bigPI = Lar.spaceindex(model::Lar.LAR) + for i in 1:edgenum + v, ev = Lar.Arrangement.frag_edge(V, EV, i, bigPI) + rV, rEV = Lar.skel_merge(rV, rEV, v, ev) # block diagonal ... + end + + @test Lar.cop2lar(rEV) == [[1,3],[2,3],[4,6],[5,6],[7,10],[9,10],[8,9]] +end + + +@testset "merge_vertices!" begin + p0 = 1e-2 + pm = 1-p0 + pp = 1+p0 + V = [ p0 p0; p0 -p0; pp pm; pp pp] + EV = Int8[1 0 1 0 ; + 0 1 0 1 ; + 1 0 0 1 ; + 0 1 1 0 ] + EV = sparse(EV) + V, EV = Lar.Arrangement.merge_vertices!(V, EV, [],1e-1) + @test size(V,1)==2 + @test size(EV,1)==1 +end + + +@testset "biconnected_components" begin + @testset "Cycle graph" begin + EV = Int8[1 1 0 0; + 0 1 1 0; + 0 0 1 1; + 1 0 0 1] + EV = sparse(EV) + + bc = Lar.Arrangement.biconnected_components(EV) + @test size(bc,1)==1 + end + + @testset "Graph with 2 biconnected components" begin + EV = Int8[1 1 0 0 0 0; + 0 1 1 0 0 0; + 1 0 1 0 0 0; + 1 0 0 0 1 0; + 0 0 0 1 1 0; + 0 0 0 1 0 1; + 0 0 0 0 1 1] ; + EV = sparse(EV); + + bc = Lar.Arrangement.biconnected_components(EV) + @test size(bc,1)==2 + end +end + + +@testset "get_external_cycle" begin + @testset "Example 1" begin + + V = [ 0 0; 1 0;2 0;2 1;1 1;0 1] + + EV = Int8[-1 1 0 0 0 0 ; + 0 -1 1 0 0 0 ; + 0 0 -1 1 0 0 ; + 0 0 0 -1 1 0 ; + 0 0 0 0 -1 1 ; + 1 0 0 0 0 -1 ; + 0 -1 0 0 1 0 + ] + EV = sparse(EV) + + FE = Int8[ 1 1 1 1 1 1 0; + 1 0 0 0 1 1 -1; + 0 1 1 1 0 0 -1] + FE = sparse(FE) + @test Lar.Arrangement.get_external_cycle(V, EV, FE) == 1 + end + + @testset "Example 2" begin + + V = [ 0 0; 2 0; 2 2; 0 2; + 1 0; 3 0; 3 3; 1 2] + + EV = Int8[-1 1 0 0 0 0 0 0; + 0 -1 1 0 0 0 0 0; + 0 0 -1 1 0 0 0 0; + -1 0 0 1 0 0 0 0; + 0 0 0 0 -1 1 0 0; + 0 0 0 0 0 -1 1 0; + 0 0 0 0 0 0 -1 1; + 0 0 0 0 -1 0 0 1; + ] + EV = sparse(EV) + + FE = Int8[-1 -1 -1 1 0 0 0 0; + 0 0 0 0 -1 -1 -1 1; + 0 0 0 1 -1 -1 -1 0] + FE = sparse(FE) + @test Lar.Arrangement.get_external_cycle(V, EV, FE) == 3 + end + +end + + + +@testset "Containment graph" begin + @testset "pre_containment" begin + + V = [ 0 0; 2 0; 0 2; 3/2 3/2; 1/2 3/2;1/2 1/2 ; 3/2 1/2] + + EV = Int8[ -1 1 0 0 0 0 0; + 0 -1 1 0 0 0 0; + -1 0 1 0 0 0 0] + + EV1=Int8[ 0 0 0 -1 1 0 0; + 0 0 0 0 -1 1 0; + 0 0 0 0 0 -1 1; + 0 0 0 -1 0 0 1 + ] + EVs = map(sparse, [EV, EV1]) + + shell1=Int8[-1 -1 1] + shell2=Int8[-1 -1 -1 1] + shells = map(sparsevec, [shell1, shell2]) + + shell_bboxes = [] + n = 2 + for i in 1:n + vs_indexes = (abs.(EVs[i]')*abs.(shells[i])).nzind + push!(shell_bboxes, Lar.bbox(V[vs_indexes, :])) + end + + graph = Lar.Arrangement.pre_containment_test(shell_bboxes) + @test graph == [0 0;1 0]; + + graph = Lar.Arrangement.prune_containment_graph(n, V, EVs, shells, graph) + @test graph == [0 0;0 0] + end + + @testset "transitive_reduction" begin + + graph = [0 1 1 1 ; 0 0 1 1 ; 0 0 0 1 ; 0 0 0 0 ] + Lar.Arrangement.transitive_reduction!(graph) + @test graph == [0 1 0 0 ; 0 0 1 0; 0 0 0 1 ; 0 0 0 0 ] + end + +end + + +@testset "Planar Arrangement" begin + + V = [ 0 0; 1 0; 1 1; 0 1; 2 1] + + EV=[[1,2],[2,3],[3,4],[1,4],[3,5]] + + cop_EV = Lar.coboundary_0(EV::Lar.Cells) + cop_EW = convert(Lar.ChainOp, cop_EV) + + V, copEV, copFE = Lar.Arrangement.planar_arrangement(V::Lar.Points, cop_EW::Lar.ChainOp) + + @test Lar.cop2lar(copEV)==[[1,2],[2,3],[3,4],[1,4]] +end From 56bb1ca855fa88e4c0e6810d2282726167399c6c Mon Sep 17 00:00:00 2001 From: marteresagh Date: Sat, 20 Apr 2019 19:02:24 +0200 Subject: [PATCH 05/10] my link to the documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b19e81aa..4c96c120 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ add("LinearAlgebraicRepresentation") ## Documentation -Go to [the documentation page](https://cvdlab.github.io/LinearAlgebraicRepresentation.jl/) +Go to [the documentation page](https://marteresagh.github.io/LinearAlgebraicRepresentation.jl/) ## Authors * [Giulio Martella](https://github.com/giuliom95) From ef7ec03bbba9e1805090300b9d1d1ab77c865a1e Mon Sep 17 00:00:00 2001 From: marteresagh Date: Tue, 23 Apr 2019 09:06:35 +0200 Subject: [PATCH 06/10] update my test --- test/planar_arr_mytest.jl | 74 +++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/test/planar_arr_mytest.jl b/test/planar_arr_mytest.jl index 1660fd24..2deb6c57 100644 --- a/test/planar_arr_mytest.jl +++ b/test/planar_arr_mytest.jl @@ -3,6 +3,20 @@ using LinearAlgebraicRepresentation Lar = LinearAlgebraicRepresentation using Plasm,SparseArrays + +@testset "intersect edges" begin + V=[0 0 ; 1 1; 1/2 0; 1/2 1]; + EV = SparseArrays.sparse(Array{Int8, 2}([ + [1 1 0 0] #1->1,2 + [0 0 1 1] #2->3,4 + ])); + + W=Lar.Arrangement.intersect_edges(V, EV[1, :], EV[2, :]) + @test W[1][1]==[0.5 0.5] + @test W[1][2]==0.5 + +end + @testset "frag_edge" begin V = [ 3 1; 6 8;2 -2;9 6;1 6;10 1] @@ -17,7 +31,7 @@ using Plasm,SparseArrays bigPI = Lar.spaceindex(model::Lar.LAR) for i in 1:edgenum v, ev = Lar.Arrangement.frag_edge(V, EV, i, bigPI) - rV, rEV = Lar.skel_merge(rV, rEV, v, ev) # block diagonal ... + rV, rEV = Lar.skel_merge(rV, rEV, v, ev) end @test Lar.cop2lar(rEV) == [[1,3],[2,3],[4,6],[5,6],[7,10],[9,10],[8,9]] @@ -25,18 +39,28 @@ end @testset "merge_vertices!" begin - p0 = 1e-2 - pm = 1-p0 - pp = 1+p0 - V = [ p0 p0; p0 -p0; pp pm; pp pp] - EV = Int8[1 0 1 0 ; - 0 1 0 1 ; - 1 0 0 1 ; - 0 1 1 0 ] - EV = sparse(EV) - V, EV = Lar.Arrangement.merge_vertices!(V, EV, [],1e-1) - @test size(V,1)==2 - @test size(EV,1)==1 + + @testset "close vertices" begin + V = [ 0.01 0.01; 0.01 -0.01; 1.01 0.99; 1.01 1.01] + EV = Int8[1 0 1 0 ; + 0 1 0 1 ; + 1 0 0 1 ; + 0 1 1 0 ] + EV = sparse(EV) + V, EV = Lar.Arrangement.merge_vertices!(V, EV, [],1e-1) + @test size(V,1)==2 + @test size(EV,1)==1 + end + + @testset "double vertices" begin + V=[0 0; 0 0; 1 1; 1 1; 2 2 ;2 2] + EV=Int8[1 0 1 0; + 0 1 0 1] + EV = sparse(EV) + V, EV = Lar.Arrangement.merge_vertices!(V, EV, []) + @test size(V,1)==3 + @test size(EV,1)==1 + end end @@ -118,7 +142,7 @@ end @testset "Containment graph" begin - @testset "pre_containment" begin + @testset "pre_containment and prune_containment" begin V = [ 0 0; 2 0; 0 2; 3/2 3/2; 1/2 3/2;1/2 1/2 ; 3/2 1/2] @@ -160,6 +184,28 @@ end end +@testset "component graph" begin + + V = [ 0 0; 2 0; 0 1; 3/2 1/2; 3/2 1/2; 1/2 3/2; 3/2 3/2] + + EV = Int8[ 1 1 0 0 0 0 0; + 0 1 1 0 0 0 0; + 1 0 1 0 0 0 0; + 0 0 0 1 1 0 0; + 0 0 0 0 1 0 1; + 0 0 0 0 0 1 1; + 0 0 0 1 0 1 0 + ] + EV = sparse(EV) + + bc = Lar.Arrangement.biconnected_components(EV) + + n, containment_graph, V, EVs, boundaries, shells, shell_bboxes=Lar.Arrangement.componentgraph(V, EV, bc) + + @test n==2 + @test boundaries==[[1 1 -1 -1],[1 1 -1]] + @test shell_bboxes==[([0.5 0.5], [1.5 1.5]), ([0.0 0.0], [2.0 1.0])] +end @testset "Planar Arrangement" begin From d1edb57535f08f38ae4b05fae9abacd8ef9922a8 Mon Sep 17 00:00:00 2001 From: marteresagh Date: Tue, 23 Apr 2019 09:07:33 +0200 Subject: [PATCH 07/10] update docstrings --- src/arrangement/planar_arrangement.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/arrangement/planar_arrangement.jl b/src/arrangement/planar_arrangement.jl index 594b33ce..47f0af98 100644 --- a/src/arrangement/planar_arrangement.jl +++ b/src/arrangement/planar_arrangement.jl @@ -234,7 +234,7 @@ end """ biconnected_components(EV::Lar.ChainOp) -Find the biconnected components of a graph define by his edges. A biconnected component is a maximal biconnected subgraph. A biconnected graph has no **articulation vertices**. +Find the biconnected components of a graph define by its edges. A biconnected component is a maximal biconnected subgraph. A biconnected graph has no **articulation vertices**. # Example ```julia @@ -587,7 +587,7 @@ end """ cleandecomposition(V, copEV, sigma) -Delete edges outside sigma area. +Delete edges outside sigma area and remove dangling edges in 3D arrangement. """ function cleandecomposition(V, copEV, sigma) @@ -742,7 +742,7 @@ function planar_arrangement_2(V, copEV, bicon_comps, # Topological Gift Wrapping n, containment_graph, V, EVs, boundaries, shells, shell_bboxes = - componentgraph(V, copEV, bicon_comps) + Lar.Arrangement.componentgraph(V, copEV, bicon_comps) @show containment_graph # only in the context of 3D arrangement if sigma.n > 0 From 21841ebee82a4aad110081973ff37d5e35038b88 Mon Sep 17 00:00:00 2001 From: marteresagh Date: Tue, 23 Apr 2019 09:11:10 +0200 Subject: [PATCH 08/10] graph_img From 843bd96d4e2ac850c80cbb5b6868a7e028996f0a Mon Sep 17 00:00:00 2001 From: marteresagh Date: Tue, 23 Apr 2019 09:11:57 +0200 Subject: [PATCH 09/10] documentation From 00c84d9cdbaeda812d038e0561c67994ff5b04af Mon Sep 17 00:00:00 2001 From: marteresagh Date: Tue, 23 Apr 2019 10:59:15 +0200 Subject: [PATCH 10/10] update --- docs/src/arrangement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/arrangement.md b/docs/src/arrangement.md index 41bd8266..ee9aeeeb 100644 --- a/docs/src/arrangement.md +++ b/docs/src/arrangement.md @@ -22,7 +22,7 @@ Functions in darker boxes are declared only in the local scope of its father. ## API -Every functions strictly relative to the arrangement has been collected in the `Lar.Arrangement` sub-module but the two main functions are accessible directly from the `LinearAlgebraicRepresentation` namespace. +Every function strictly relative to the arrangement has been collected in the `Lar.Arrangement` sub-module but the two main functions are accessible directly from the `LinearAlgebraicRepresentation` namespace. !!! warning `Lar.Arrangement` is the only place in `LinearAlgebraicRepresentation` where `Point` matrices store points per row and not per column as described in the documentation of `Lar.Points`