kececilayout 0.2.3__tar.gz → 0.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kececilayout-0.2.3/kececilayout.egg-info → kececilayout-0.2.5}/PKG-INFO +101 -10
- {kececilayout-0.2.3 → kececilayout-0.2.5}/README.md +100 -9
- kececilayout-0.2.5/kececilayout/__init__.py +76 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/kececilayout/_version.py +2 -1
- {kececilayout-0.2.3 → kececilayout-0.2.5}/kececilayout/kececi_layout.py +220 -108
- {kececilayout-0.2.3 → kececilayout-0.2.5/kececilayout.egg-info}/PKG-INFO +101 -10
- {kececilayout-0.2.3 → kececilayout-0.2.5}/setup.py +4 -3
- kececilayout-0.2.5/tests/test_sample.py +17 -0
- kececilayout-0.2.3/kececilayout/__init__.py +0 -37
- kececilayout-0.2.3/tests/test_sample.py +0 -2
- {kececilayout-0.2.3 → kececilayout-0.2.5}/LICENSE +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/MANIFEST.in +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/kececilayout.egg-info/SOURCES.txt +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/kececilayout.egg-info/dependency_links.txt +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/kececilayout.egg-info/requires.txt +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/kececilayout.egg-info/top_level.txt +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/pyproject.toml +0 -0
- {kececilayout-0.2.3 → kececilayout-0.2.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kececilayout
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.
|
|
5
5
|
Home-page: https://github.com/WhiteSymmetry/kececilayout
|
|
6
6
|
Author: Mehmet Keçeci
|
|
@@ -41,8 +41,11 @@ Dynamic: summary
|
|
|
41
41
|
[](https://badge.fury.io/py/kececilayout)
|
|
42
42
|
[](https://opensource.org/licenses/MIT)
|
|
43
43
|
|
|
44
|
-
[](https://doi.org/10.5281/zenodo.15313946)
|
|
45
45
|
[](https://doi.org/10.5281/zenodo.15314329)
|
|
46
|
+
[](https://doi.org/10.5281/zenodo.15353535)
|
|
47
|
+
|
|
48
|
+
[](https://doi.org/10.48546/workflowhub.datafile.17.1)
|
|
46
49
|
|
|
47
50
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
48
51
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
@@ -50,10 +53,61 @@ Dynamic: summary
|
|
|
50
53
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
51
54
|
|
|
52
55
|
[](https://opensource.org/)
|
|
53
|
-
[](https://kececilayout.readthedocs.io/en/latest)
|
|
54
57
|
|
|
55
58
|
[](https://www.bestpractices.dev/projects/10531)
|
|
56
59
|
|
|
60
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
|
|
61
|
+
[](https://codecov.io/gh/WhiteSymmetry/kececilayout)
|
|
62
|
+
[](https://kececilayout.readthedocs.io/en/latest/)
|
|
63
|
+
[](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
|
|
64
|
+
[](https://badge.fury.io/py/kececilayout)
|
|
65
|
+
[](https://pepy.tech/projects/kececilayout)
|
|
66
|
+
[](CODE_OF_CONDUCT.md)
|
|
67
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
|
|
68
|
+
[](https://github.com/astral-sh/ruff)
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
<p align="left">
|
|
73
|
+
<table>
|
|
74
|
+
<tr>
|
|
75
|
+
<td style="text-align: center;">PyPI</td>
|
|
76
|
+
<td style="text-align: center;">
|
|
77
|
+
<a href="https://pypi.org/project/kececilayout/">
|
|
78
|
+
<img src="https://badge.fury.io/py/kececilayout.svg" alt="PyPI version" height="18"/>
|
|
79
|
+
</a>
|
|
80
|
+
</td>
|
|
81
|
+
</tr>
|
|
82
|
+
<tr>
|
|
83
|
+
<td style="text-align: center;">Conda</td>
|
|
84
|
+
<td style="text-align: center;">
|
|
85
|
+
<a href="https://anaconda.org/bilgi/kececilayout">
|
|
86
|
+
<img src="https://anaconda.org/bilgi/kececilayout/badges/version.svg" alt="conda-forge version" height="18"/>
|
|
87
|
+
</a>
|
|
88
|
+
</td>
|
|
89
|
+
</tr>
|
|
90
|
+
<tr>
|
|
91
|
+
<td style="text-align: center;">DOI</td>
|
|
92
|
+
<td style="text-align: center;">
|
|
93
|
+
<a href="https://doi.org/10.5281/zenodo.15313946">
|
|
94
|
+
<img src="https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg" alt="DOI" height="18"/>
|
|
95
|
+
</a>
|
|
96
|
+
</td>
|
|
97
|
+
</tr>
|
|
98
|
+
<tr>
|
|
99
|
+
<td style="text-align: center;">License: MIT</td>
|
|
100
|
+
<td style="text-align: center;">
|
|
101
|
+
<a href="https://opensource.org/licenses/MIT">
|
|
102
|
+
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" height="18"/>
|
|
103
|
+
</a>
|
|
104
|
+
</td>
|
|
105
|
+
</tr>
|
|
106
|
+
</table>
|
|
107
|
+
</p>
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
57
111
|
**Kececi Layout (Keçeci Yerleşimi)**: A deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
|
|
58
112
|
|
|
59
113
|
*Python implementation of the Keçeci layout algorithm for graph visualization.*
|
|
@@ -684,15 +738,15 @@ If this library was useful to you in your research, please cite us. Following th
|
|
|
684
738
|
### BibTeX
|
|
685
739
|
|
|
686
740
|
```bibtex
|
|
687
|
-
@misc{
|
|
741
|
+
@misc{kececi_2025_15313946,
|
|
688
742
|
author = {Keçeci, Mehmet},
|
|
689
743
|
title = {kececilayout},
|
|
690
744
|
month = may,
|
|
691
745
|
year = 2025,
|
|
692
746
|
publisher = {PyPI, Anaconda, Github, Zenodo},
|
|
693
747
|
version = {0.2.0},
|
|
694
|
-
doi = {10.5281/zenodo.
|
|
695
|
-
url = {https://doi.org/10.5281/zenodo.
|
|
748
|
+
doi = {10.5281/zenodo.15313946},
|
|
749
|
+
url = {https://doi.org/10.5281/zenodo.15313946},
|
|
696
750
|
}
|
|
697
751
|
|
|
698
752
|
@misc{kececi_2025_15314329,
|
|
@@ -709,15 +763,52 @@ If this library was useful to you in your research, please cite us. Following th
|
|
|
709
763
|
### APA
|
|
710
764
|
|
|
711
765
|
```
|
|
712
|
-
Keçeci, M. (2025). kececilayout (0.2.0). PyPI, Anaconda, GitHub, Zenodo. https://doi.org/10.5281/zenodo.15313947
|
|
713
766
|
|
|
714
|
-
Keçeci, M. (2025). Keçeci Layout. https://doi.org/10.5281/zenodo.
|
|
767
|
+
Keçeci, M. (2025). The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16696713
|
|
768
|
+
|
|
769
|
+
Keçeci, M. (2025). The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16526798
|
|
770
|
+
|
|
771
|
+
Keçeci, M. (2025). Keçeci Deterministic Zigzag Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.31.1
|
|
772
|
+
|
|
773
|
+
Keçeci, M. (2025). Keçeci Zigzag Layout Algorithm. Authorea. https://doi.org/10.22541/au.175087581.16524538/v1
|
|
774
|
+
|
|
775
|
+
Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15792684
|
|
776
|
+
|
|
777
|
+
Keçeci, M. (2025). When Nodes Have an Order: The Keçeci Layout for Structured System Visualization. HAL open science. https://hal.science/hal-05143155; https://doi.org/10.13140/RG.2.2.19098.76484
|
|
778
|
+
|
|
779
|
+
Keçeci, M. (2025). The Keçeci Layout: A Cross-Disciplinary Graphical Framework for Structural Analysis of Ordered Systems. Authorea. https://doi.org/10.22541/au.175156702.26421899/v1
|
|
780
|
+
|
|
781
|
+
Keçeci, M. (2025). Beyond Traditional Diagrams: The Keçeci Layout for Structural Thinking. Knowledge Commons. https://doi.org/10.17613/v4w94-ak572
|
|
782
|
+
|
|
783
|
+
Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. figshare. Journal contribution. https://doi.org/10.6084/m9.figshare.29468135
|
|
784
|
+
|
|
785
|
+
Keçeci, M. (2025, July 3). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. OSF. https://doi.org/10.17605/OSF.IO/9HTG3
|
|
786
|
+
|
|
787
|
+
Keçeci, M. (2025). Beyond Topology: Deterministic and Order-Preserving Graph Visualization with the Keçeci Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.34.4
|
|
788
|
+
|
|
789
|
+
Keçeci, M. (2025). A Graph-Theoretic Perspective on the Keçeci Layout: Structuring Cross-Disciplinary Inquiry. Preprints. https://doi.org/10.20944/preprints202507.0589.v1
|
|
790
|
+
|
|
791
|
+
Keçeci, M. (2025). Keçeci Layout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15314328
|
|
792
|
+
|
|
793
|
+
Keçeci, M. (2025). kececilayout [Data set]. WorkflowHub. https://doi.org/10.48546/workflowhub.datafile.17.1
|
|
794
|
+
|
|
795
|
+
Keçeci, M. (2025, May 1). Kececilayout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15313946
|
|
796
|
+
|
|
715
797
|
```
|
|
716
798
|
|
|
717
799
|
### Chicago
|
|
718
800
|
|
|
719
801
|
```
|
|
720
|
-
Keçeci, Mehmet. “Kececilayout”. PyPI, Anaconda, GitHub, Zenodo, 01 May 2025. https://doi.org/10.5281/zenodo.15313947.
|
|
721
802
|
|
|
722
|
-
Keçeci, Mehmet.
|
|
803
|
+
Keçeci, Mehmet. The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16696713
|
|
804
|
+
|
|
805
|
+
Keçeci, Mehmet. The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16526798
|
|
806
|
+
|
|
807
|
+
Keçeci, Mehmet. kececilayout [Data set]. WorkflowHub, 2025. https://doi.org/10.48546/workflowhub.datafile.17.1
|
|
808
|
+
|
|
809
|
+
Keçeci, Mehmet. "Kececilayout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15313946.
|
|
810
|
+
|
|
811
|
+
Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15314329.
|
|
723
812
|
```
|
|
813
|
+
|
|
814
|
+
|
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
[](https://badge.fury.io/py/kececilayout)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
[](https://doi.org/10.5281/zenodo.15313946)
|
|
7
7
|
[](https://doi.org/10.5281/zenodo.15314329)
|
|
8
|
+
[](https://doi.org/10.5281/zenodo.15353535)
|
|
9
|
+
|
|
10
|
+
[](https://doi.org/10.48546/workflowhub.datafile.17.1)
|
|
8
11
|
|
|
9
12
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
10
13
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
@@ -12,10 +15,61 @@
|
|
|
12
15
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
13
16
|
|
|
14
17
|
[](https://opensource.org/)
|
|
15
|
-
[](https://kececilayout.readthedocs.io/en/latest)
|
|
16
19
|
|
|
17
20
|
[](https://www.bestpractices.dev/projects/10531)
|
|
18
21
|
|
|
22
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
|
|
23
|
+
[](https://codecov.io/gh/WhiteSymmetry/kececilayout)
|
|
24
|
+
[](https://kececilayout.readthedocs.io/en/latest/)
|
|
25
|
+
[](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
|
|
26
|
+
[](https://badge.fury.io/py/kececilayout)
|
|
27
|
+
[](https://pepy.tech/projects/kececilayout)
|
|
28
|
+
[](CODE_OF_CONDUCT.md)
|
|
29
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
|
|
30
|
+
[](https://github.com/astral-sh/ruff)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
<p align="left">
|
|
35
|
+
<table>
|
|
36
|
+
<tr>
|
|
37
|
+
<td style="text-align: center;">PyPI</td>
|
|
38
|
+
<td style="text-align: center;">
|
|
39
|
+
<a href="https://pypi.org/project/kececilayout/">
|
|
40
|
+
<img src="https://badge.fury.io/py/kececilayout.svg" alt="PyPI version" height="18"/>
|
|
41
|
+
</a>
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
44
|
+
<tr>
|
|
45
|
+
<td style="text-align: center;">Conda</td>
|
|
46
|
+
<td style="text-align: center;">
|
|
47
|
+
<a href="https://anaconda.org/bilgi/kececilayout">
|
|
48
|
+
<img src="https://anaconda.org/bilgi/kececilayout/badges/version.svg" alt="conda-forge version" height="18"/>
|
|
49
|
+
</a>
|
|
50
|
+
</td>
|
|
51
|
+
</tr>
|
|
52
|
+
<tr>
|
|
53
|
+
<td style="text-align: center;">DOI</td>
|
|
54
|
+
<td style="text-align: center;">
|
|
55
|
+
<a href="https://doi.org/10.5281/zenodo.15313946">
|
|
56
|
+
<img src="https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg" alt="DOI" height="18"/>
|
|
57
|
+
</a>
|
|
58
|
+
</td>
|
|
59
|
+
</tr>
|
|
60
|
+
<tr>
|
|
61
|
+
<td style="text-align: center;">License: MIT</td>
|
|
62
|
+
<td style="text-align: center;">
|
|
63
|
+
<a href="https://opensource.org/licenses/MIT">
|
|
64
|
+
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" height="18"/>
|
|
65
|
+
</a>
|
|
66
|
+
</td>
|
|
67
|
+
</tr>
|
|
68
|
+
</table>
|
|
69
|
+
</p>
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
19
73
|
**Kececi Layout (Keçeci Yerleşimi)**: A deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
|
|
20
74
|
|
|
21
75
|
*Python implementation of the Keçeci layout algorithm for graph visualization.*
|
|
@@ -646,15 +700,15 @@ If this library was useful to you in your research, please cite us. Following th
|
|
|
646
700
|
### BibTeX
|
|
647
701
|
|
|
648
702
|
```bibtex
|
|
649
|
-
@misc{
|
|
703
|
+
@misc{kececi_2025_15313946,
|
|
650
704
|
author = {Keçeci, Mehmet},
|
|
651
705
|
title = {kececilayout},
|
|
652
706
|
month = may,
|
|
653
707
|
year = 2025,
|
|
654
708
|
publisher = {PyPI, Anaconda, Github, Zenodo},
|
|
655
709
|
version = {0.2.0},
|
|
656
|
-
doi = {10.5281/zenodo.
|
|
657
|
-
url = {https://doi.org/10.5281/zenodo.
|
|
710
|
+
doi = {10.5281/zenodo.15313946},
|
|
711
|
+
url = {https://doi.org/10.5281/zenodo.15313946},
|
|
658
712
|
}
|
|
659
713
|
|
|
660
714
|
@misc{kececi_2025_15314329,
|
|
@@ -671,15 +725,52 @@ If this library was useful to you in your research, please cite us. Following th
|
|
|
671
725
|
### APA
|
|
672
726
|
|
|
673
727
|
```
|
|
674
|
-
Keçeci, M. (2025). kececilayout (0.2.0). PyPI, Anaconda, GitHub, Zenodo. https://doi.org/10.5281/zenodo.15313947
|
|
675
728
|
|
|
676
|
-
Keçeci, M. (2025). Keçeci Layout. https://doi.org/10.5281/zenodo.
|
|
729
|
+
Keçeci, M. (2025). The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16696713
|
|
730
|
+
|
|
731
|
+
Keçeci, M. (2025). The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16526798
|
|
732
|
+
|
|
733
|
+
Keçeci, M. (2025). Keçeci Deterministic Zigzag Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.31.1
|
|
734
|
+
|
|
735
|
+
Keçeci, M. (2025). Keçeci Zigzag Layout Algorithm. Authorea. https://doi.org/10.22541/au.175087581.16524538/v1
|
|
736
|
+
|
|
737
|
+
Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15792684
|
|
738
|
+
|
|
739
|
+
Keçeci, M. (2025). When Nodes Have an Order: The Keçeci Layout for Structured System Visualization. HAL open science. https://hal.science/hal-05143155; https://doi.org/10.13140/RG.2.2.19098.76484
|
|
740
|
+
|
|
741
|
+
Keçeci, M. (2025). The Keçeci Layout: A Cross-Disciplinary Graphical Framework for Structural Analysis of Ordered Systems. Authorea. https://doi.org/10.22541/au.175156702.26421899/v1
|
|
742
|
+
|
|
743
|
+
Keçeci, M. (2025). Beyond Traditional Diagrams: The Keçeci Layout for Structural Thinking. Knowledge Commons. https://doi.org/10.17613/v4w94-ak572
|
|
744
|
+
|
|
745
|
+
Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. figshare. Journal contribution. https://doi.org/10.6084/m9.figshare.29468135
|
|
746
|
+
|
|
747
|
+
Keçeci, M. (2025, July 3). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. OSF. https://doi.org/10.17605/OSF.IO/9HTG3
|
|
748
|
+
|
|
749
|
+
Keçeci, M. (2025). Beyond Topology: Deterministic and Order-Preserving Graph Visualization with the Keçeci Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.34.4
|
|
750
|
+
|
|
751
|
+
Keçeci, M. (2025). A Graph-Theoretic Perspective on the Keçeci Layout: Structuring Cross-Disciplinary Inquiry. Preprints. https://doi.org/10.20944/preprints202507.0589.v1
|
|
752
|
+
|
|
753
|
+
Keçeci, M. (2025). Keçeci Layout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15314328
|
|
754
|
+
|
|
755
|
+
Keçeci, M. (2025). kececilayout [Data set]. WorkflowHub. https://doi.org/10.48546/workflowhub.datafile.17.1
|
|
756
|
+
|
|
757
|
+
Keçeci, M. (2025, May 1). Kececilayout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15313946
|
|
758
|
+
|
|
677
759
|
```
|
|
678
760
|
|
|
679
761
|
### Chicago
|
|
680
762
|
|
|
681
763
|
```
|
|
682
|
-
Keçeci, Mehmet. “Kececilayout”. PyPI, Anaconda, GitHub, Zenodo, 01 May 2025. https://doi.org/10.5281/zenodo.15313947.
|
|
683
764
|
|
|
684
|
-
Keçeci, Mehmet.
|
|
765
|
+
Keçeci, Mehmet. The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16696713
|
|
766
|
+
|
|
767
|
+
Keçeci, Mehmet. The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16526798
|
|
768
|
+
|
|
769
|
+
Keçeci, Mehmet. kececilayout [Data set]. WorkflowHub, 2025. https://doi.org/10.48546/workflowhub.datafile.17.1
|
|
770
|
+
|
|
771
|
+
Keçeci, Mehmet. "Kececilayout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15313946.
|
|
772
|
+
|
|
773
|
+
Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15314329.
|
|
685
774
|
```
|
|
775
|
+
|
|
776
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# __init__.py
|
|
2
|
+
# Bu dosya paketin başlangıç noktası olarak çalışır.
|
|
3
|
+
# Alt modülleri yükler, sürüm bilgileri tanımlar ve geriye dönük uyumluluk için uyarılar sağlar.
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import importlib
|
|
7
|
+
import warnings
|
|
8
|
+
import os
|
|
9
|
+
# if os.getenv("DEVELOPMENT") == "true":
|
|
10
|
+
# importlib.reload(kececi_layout) # F821 undefined name 'kececi_layout'
|
|
11
|
+
|
|
12
|
+
# Dışa aktarılacak semboller listesi
|
|
13
|
+
__all__ = [
|
|
14
|
+
'kececi_layout_v4',
|
|
15
|
+
'kececi_layout',
|
|
16
|
+
'kececi_layout_v4_nx',
|
|
17
|
+
'kececi_layout_v4_networkx',
|
|
18
|
+
'kececi_layout_v4_ig',
|
|
19
|
+
'kececi_layout_v4_igraph',
|
|
20
|
+
'kececi_layout_v4_nk',
|
|
21
|
+
'kececi_layout_v4_networkit',
|
|
22
|
+
'kececi_layout_v4_gg',
|
|
23
|
+
'kececi_layout_v4_graphillion',
|
|
24
|
+
'kececi_layout_v4_rx',
|
|
25
|
+
'kececi_layout_v4_rustworkx',
|
|
26
|
+
'generate_random_rx_graph',
|
|
27
|
+
'kececi_layout_v4_pure',
|
|
28
|
+
'generate_random_graph',
|
|
29
|
+
'generate_random_graph_ig'
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
# Göreli modül içe aktarmaları
|
|
33
|
+
# F401 hatasını önlemek için sadece kullanacağınız şeyleri dışa aktarın
|
|
34
|
+
# Aksi halde linter'lar "imported but unused" uyarısı verir
|
|
35
|
+
try:
|
|
36
|
+
#from .kececi_layout import * # gerekirse burada belirli fonksiyonları seçmeli yapmak daha güvenlidir
|
|
37
|
+
#from . import kececi_layout # Modülün kendisine doğrudan erişim isteniyorsa
|
|
38
|
+
from .kececi_layout import (
|
|
39
|
+
kececi_layout_v4,
|
|
40
|
+
kececi_layout,
|
|
41
|
+
kececi_layout_v4_nx,
|
|
42
|
+
kececi_layout_v4_networkx,
|
|
43
|
+
kececi_layout_v4_ig,
|
|
44
|
+
kececi_layout_v4_igraph,
|
|
45
|
+
kececi_layout_v4_nk,
|
|
46
|
+
kececi_layout_v4_networkit,
|
|
47
|
+
kececi_layout_v4_gg,
|
|
48
|
+
kececi_layout_v4_graphillion,
|
|
49
|
+
kececi_layout_v4_rx,
|
|
50
|
+
kececi_layout_v4_rustworkx,
|
|
51
|
+
generate_random_rx_graph,
|
|
52
|
+
kececi_layout_v4_pure,
|
|
53
|
+
generate_random_graph,
|
|
54
|
+
generate_random_graph_ig
|
|
55
|
+
)
|
|
56
|
+
except ImportError as e:
|
|
57
|
+
warnings.warn(f"Gerekli modül yüklenemedi: {e}", ImportWarning)
|
|
58
|
+
|
|
59
|
+
# Eski bir fonksiyonun yer tutucusu - gelecekte kaldırılacak
|
|
60
|
+
def eski_fonksiyon():
|
|
61
|
+
"""
|
|
62
|
+
Kaldırılması planlanan eski bir fonksiyondur.
|
|
63
|
+
Lütfen alternatif fonksiyonları kullanın.
|
|
64
|
+
"""
|
|
65
|
+
warnings.warn(
|
|
66
|
+
"eski_fonksiyon() artık kullanılmamaktadır ve gelecekte kaldırılacaktır. "
|
|
67
|
+
"Lütfen yeni alternatif fonksiyonları kullanın. "
|
|
68
|
+
"Keçeci Layout; Python 3.7-3.14 sürümlerinde sorunsuz çalışmalıdır.",
|
|
69
|
+
category=DeprecationWarning,
|
|
70
|
+
stacklevel=2
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Paket sürüm numarası
|
|
74
|
+
__version__ = "0.2.5"
|
|
75
|
+
|
|
76
|
+
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# _version.py
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
3
|
+
__version__ = "0.2.5"
|
|
4
4
|
__license__ = "MIT"
|
|
5
5
|
__description__ = "A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern."
|
|
6
6
|
__author__ = "Mehmet Keçeci"
|
|
7
7
|
__url__ = "https://github.com/WhiteSymmetry/kececilayout"
|
|
8
8
|
__docs__ = "https://github.com/WhiteSymmetry/kececilayout" # Opsiyonel: Dokümantasyon linki
|
|
9
9
|
__dependencies__ = ["python>=3.9"] # Diğer bağımlılıkları da ekleyebilirsiniz
|
|
10
|
+
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# kececilayout/kececi_layout.py
|
|
2
|
+
|
|
2
3
|
import itertools # Graphillion için eklendi
|
|
3
4
|
import numpy as np # rustworkx
|
|
4
5
|
import math
|
|
@@ -107,11 +108,16 @@ def kececi_layout_v4(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
107
108
|
else:
|
|
108
109
|
# Desteklenmeyen tip veya kütüphane kurulu değilse
|
|
109
110
|
supported_types = []
|
|
110
|
-
if nx:
|
|
111
|
-
|
|
112
|
-
if
|
|
113
|
-
|
|
114
|
-
if
|
|
111
|
+
if nx:
|
|
112
|
+
supported_types.append("NetworkX")
|
|
113
|
+
if rx:
|
|
114
|
+
supported_types.append("Rustworkx")
|
|
115
|
+
if ig:
|
|
116
|
+
supported_types.append("igraph")
|
|
117
|
+
if nk:
|
|
118
|
+
supported_types.append("Networkit")
|
|
119
|
+
if gg:
|
|
120
|
+
supported_types.append("Graphillion.GraphSet")
|
|
115
121
|
raise TypeError(f"Unsupported graph type: {type(graph)}. Desteklenen türler: {', '.join(supported_types)}")
|
|
116
122
|
|
|
117
123
|
# ----- Buradan sonrası tüm kütüphaneler için ortak -----
|
|
@@ -140,16 +146,21 @@ def kececi_layout_v4(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
140
146
|
|
|
141
147
|
# 1. Ana eksen koordinatını hesapla
|
|
142
148
|
if primary_direction == 'top-down':
|
|
143
|
-
primary_coord = i * -primary_spacing;
|
|
149
|
+
primary_coord = i * -primary_spacing;
|
|
150
|
+
secondary_axis = 'x'
|
|
144
151
|
elif primary_direction == 'bottom-up':
|
|
145
|
-
primary_coord = i * primary_spacing;
|
|
152
|
+
primary_coord = i * primary_spacing;
|
|
153
|
+
secondary_axis = 'x'
|
|
146
154
|
elif primary_direction == 'left-to-right':
|
|
147
|
-
primary_coord = i * primary_spacing;
|
|
155
|
+
primary_coord = i * primary_spacing;
|
|
156
|
+
secondary_axis = 'y'
|
|
148
157
|
else: # right-to-left
|
|
149
|
-
primary_coord = i * -primary_spacing;
|
|
158
|
+
primary_coord = i * -primary_spacing;
|
|
159
|
+
secondary_axis = 'y'
|
|
150
160
|
|
|
151
161
|
# 2. Yan eksen ofsetini hesapla (zigzag)
|
|
152
|
-
if i == 0:
|
|
162
|
+
if i == 0:
|
|
163
|
+
secondary_offset_multiplier = 0.0
|
|
153
164
|
else:
|
|
154
165
|
start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
|
|
155
166
|
magnitude = math.ceil(i / 2.0)
|
|
@@ -158,8 +169,10 @@ def kececi_layout_v4(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
158
169
|
secondary_coord = secondary_offset_multiplier * secondary_spacing
|
|
159
170
|
|
|
160
171
|
# 3. (x, y) koordinatlarını ata
|
|
161
|
-
if secondary_axis == 'x':
|
|
162
|
-
|
|
172
|
+
if secondary_axis == 'x':
|
|
173
|
+
x, y = secondary_coord, primary_coord
|
|
174
|
+
else:
|
|
175
|
+
x, y = primary_coord, secondary_coord
|
|
163
176
|
|
|
164
177
|
# Sonuç sözlüğüne ekle
|
|
165
178
|
pos[node_id] = (x, y)
|
|
@@ -229,11 +242,16 @@ def kececi_layout(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
229
242
|
else:
|
|
230
243
|
# Desteklenmeyen tip veya kütüphane kurulu değilse
|
|
231
244
|
supported_types = []
|
|
232
|
-
if nx:
|
|
233
|
-
|
|
234
|
-
if
|
|
235
|
-
|
|
236
|
-
if
|
|
245
|
+
if nx:
|
|
246
|
+
supported_types.append("NetworkX")
|
|
247
|
+
if rx:
|
|
248
|
+
supported_types.append("Rustworkx")
|
|
249
|
+
if ig:
|
|
250
|
+
supported_types.append("igraph")
|
|
251
|
+
if nk:
|
|
252
|
+
supported_types.append("Networkit")
|
|
253
|
+
if gg:
|
|
254
|
+
supported_types.append("Graphillion.GraphSet")
|
|
237
255
|
raise TypeError(f"Unsupported graph type: {type(graph)}. Desteklenen türler: {', '.join(supported_types)}")
|
|
238
256
|
|
|
239
257
|
# ----- Buradan sonrası tüm kütüphaneler için ortak -----
|
|
@@ -262,16 +280,21 @@ def kececi_layout(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
262
280
|
|
|
263
281
|
# 1. Ana eksen koordinatını hesapla
|
|
264
282
|
if primary_direction == 'top-down':
|
|
265
|
-
primary_coord = i * -primary_spacing;
|
|
283
|
+
primary_coord = i * -primary_spacing;
|
|
284
|
+
secondary_axis = 'x'
|
|
266
285
|
elif primary_direction == 'bottom-up':
|
|
267
|
-
primary_coord = i * primary_spacing;
|
|
286
|
+
primary_coord = i * primary_spacing;
|
|
287
|
+
secondary_axis = 'x'
|
|
268
288
|
elif primary_direction == 'left-to-right':
|
|
269
|
-
primary_coord = i * primary_spacing;
|
|
289
|
+
primary_coord = i * primary_spacing;
|
|
290
|
+
secondary_axis = 'y'
|
|
270
291
|
else: # right-to-left
|
|
271
|
-
primary_coord = i * -primary_spacing;
|
|
292
|
+
primary_coord = i * -primary_spacing;
|
|
293
|
+
secondary_axis = 'y'
|
|
272
294
|
|
|
273
295
|
# 2. Yan eksen ofsetini hesapla (zigzag)
|
|
274
|
-
if i == 0:
|
|
296
|
+
if i == 0:
|
|
297
|
+
secondary_offset_multiplier = 0.0
|
|
275
298
|
else:
|
|
276
299
|
start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
|
|
277
300
|
magnitude = math.ceil(i / 2.0)
|
|
@@ -280,8 +303,10 @@ def kececi_layout(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
280
303
|
secondary_coord = secondary_offset_multiplier * secondary_spacing
|
|
281
304
|
|
|
282
305
|
# 3. (x, y) koordinatlarını ata
|
|
283
|
-
if secondary_axis == 'x':
|
|
284
|
-
|
|
306
|
+
if secondary_axis == 'x':
|
|
307
|
+
x, y = secondary_coord, primary_coord
|
|
308
|
+
else:
|
|
309
|
+
x, y = primary_coord, secondary_coord
|
|
285
310
|
|
|
286
311
|
# Sonuç sözlüğüne ekle
|
|
287
312
|
pos[node_id] = (x, y)
|
|
@@ -298,19 +323,26 @@ def kececi_layout_v4_nx(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
298
323
|
# NetworkX 2.x ve 3.x uyumluluğu için listeye çevirme
|
|
299
324
|
nodes = sorted(list(graph.nodes()))
|
|
300
325
|
num_nodes = len(nodes)
|
|
301
|
-
if num_nodes == 0:
|
|
326
|
+
if num_nodes == 0:
|
|
327
|
+
return {}
|
|
302
328
|
|
|
303
329
|
is_vertical = primary_direction in ['top-down', 'bottom-up']
|
|
304
330
|
is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
|
|
305
|
-
if not (is_vertical or is_horizontal):
|
|
306
|
-
|
|
307
|
-
if
|
|
331
|
+
if not (is_vertical or is_horizontal):
|
|
332
|
+
raise ValueError(f"Invalid primary_direction: {primary_direction}")
|
|
333
|
+
if is_vertical and secondary_start not in ['right', 'left']:
|
|
334
|
+
raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
|
|
335
|
+
if is_horizontal and secondary_start not in ['up', 'down']:
|
|
336
|
+
raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
|
|
308
337
|
|
|
309
338
|
for i, node_id in enumerate(nodes):
|
|
310
339
|
# 1. Ana Eksen Koordinatını Hesapla
|
|
311
|
-
if primary_direction == 'top-down':
|
|
312
|
-
|
|
313
|
-
elif primary_direction == '
|
|
340
|
+
if primary_direction == 'top-down':
|
|
341
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'x'
|
|
342
|
+
elif primary_direction == 'bottom-up':
|
|
343
|
+
primary_coord, secondary_axis = i * primary_spacing, 'x'
|
|
344
|
+
elif primary_direction == 'left-to-right':
|
|
345
|
+
primary_coord, secondary_axis = i * primary_spacing, 'y'
|
|
314
346
|
else: # right-to-left
|
|
315
347
|
primary_coord, secondary_axis = i * -primary_spacing, 'y'
|
|
316
348
|
|
|
@@ -344,19 +376,26 @@ def kececi_layout_v4_networkx(graph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
344
376
|
# NetworkX 2.x ve 3.x uyumluluğu için listeye çevirme
|
|
345
377
|
nodes = sorted(list(graph.nodes()))
|
|
346
378
|
num_nodes = len(nodes)
|
|
347
|
-
if num_nodes == 0:
|
|
379
|
+
if num_nodes == 0:
|
|
380
|
+
return {}
|
|
348
381
|
|
|
349
382
|
is_vertical = primary_direction in ['top-down', 'bottom-up']
|
|
350
383
|
is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
|
|
351
|
-
if not (is_vertical or is_horizontal):
|
|
352
|
-
|
|
353
|
-
if
|
|
384
|
+
if not (is_vertical or is_horizontal):
|
|
385
|
+
raise ValueError(f"Invalid primary_direction: {primary_direction}")
|
|
386
|
+
if is_vertical and secondary_start not in ['right', 'left']:
|
|
387
|
+
raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
|
|
388
|
+
if is_horizontal and secondary_start not in ['up', 'down']:
|
|
389
|
+
raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
|
|
354
390
|
|
|
355
391
|
for i, node_id in enumerate(nodes):
|
|
356
392
|
# 1. Ana Eksen Koordinatını Hesapla
|
|
357
|
-
if primary_direction == 'top-down':
|
|
358
|
-
|
|
359
|
-
elif primary_direction == '
|
|
393
|
+
if primary_direction == 'top-down':
|
|
394
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'x'
|
|
395
|
+
elif primary_direction == 'bottom-up':
|
|
396
|
+
primary_coord, secondary_axis = i * primary_spacing, 'x'
|
|
397
|
+
elif primary_direction == 'left-to-right':
|
|
398
|
+
primary_coord, secondary_axis = i * primary_spacing, 'y'
|
|
360
399
|
else: # right-to-left
|
|
361
400
|
primary_coord, secondary_axis = i * -primary_spacing, 'y'
|
|
362
401
|
|
|
@@ -740,15 +779,20 @@ def kececi_layout_v4_gg(graph_set: gg.GraphSet,
|
|
|
740
779
|
for i, node_id in enumerate(nodes):
|
|
741
780
|
# ... (Koordinat hesaplama kısmı aynı kalır) ...
|
|
742
781
|
if primary_direction == 'top-down':
|
|
743
|
-
primary_coord = i * -primary_spacing;
|
|
782
|
+
primary_coord = i * -primary_spacing;
|
|
783
|
+
secondary_axis = 'x'
|
|
744
784
|
elif primary_direction == 'bottom-up':
|
|
745
|
-
primary_coord = i * primary_spacing;
|
|
785
|
+
primary_coord = i * primary_spacing;
|
|
786
|
+
secondary_axis = 'x'
|
|
746
787
|
elif primary_direction == 'left-to-right':
|
|
747
|
-
primary_coord = i * primary_spacing;
|
|
788
|
+
primary_coord = i * primary_spacing;
|
|
789
|
+
secondary_axis = 'y'
|
|
748
790
|
else: # right-to-left
|
|
749
|
-
primary_coord = i * -primary_spacing;
|
|
791
|
+
primary_coord = i * -primary_spacing;
|
|
792
|
+
secondary_axis = 'y'
|
|
750
793
|
|
|
751
|
-
if i == 0:
|
|
794
|
+
if i == 0:
|
|
795
|
+
secondary_offset_multiplier = 0.0
|
|
752
796
|
else:
|
|
753
797
|
start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
|
|
754
798
|
magnitude = math.ceil(i / 2.0)
|
|
@@ -756,8 +800,10 @@ def kececi_layout_v4_gg(graph_set: gg.GraphSet,
|
|
|
756
800
|
secondary_offset_multiplier = start_mult * magnitude * side
|
|
757
801
|
secondary_coord = secondary_offset_multiplier * secondary_spacing
|
|
758
802
|
|
|
759
|
-
if secondary_axis == 'x':
|
|
760
|
-
|
|
803
|
+
if secondary_axis == 'x':
|
|
804
|
+
x, y = secondary_coord, primary_coord
|
|
805
|
+
else:
|
|
806
|
+
x, y = primary_coord, secondary_coord
|
|
761
807
|
pos[node_id] = (x, y)
|
|
762
808
|
|
|
763
809
|
return pos
|
|
@@ -801,15 +847,20 @@ def kececi_layout_v4_graphillion(graph_set: gg.GraphSet,
|
|
|
801
847
|
for i, node_id in enumerate(nodes):
|
|
802
848
|
# ... (Koordinat hesaplama kısmı aynı kalır) ...
|
|
803
849
|
if primary_direction == 'top-down':
|
|
804
|
-
primary_coord = i * -primary_spacing;
|
|
850
|
+
primary_coord = i * -primary_spacing;
|
|
851
|
+
secondary_axis = 'x'
|
|
805
852
|
elif primary_direction == 'bottom-up':
|
|
806
|
-
primary_coord = i * primary_spacing;
|
|
853
|
+
primary_coord = i * primary_spacing;
|
|
854
|
+
secondary_axis = 'x'
|
|
807
855
|
elif primary_direction == 'left-to-right':
|
|
808
|
-
primary_coord = i * primary_spacing;
|
|
856
|
+
primary_coord = i * primary_spacing;
|
|
857
|
+
secondary_axis = 'y'
|
|
809
858
|
else: # right-to-left
|
|
810
|
-
primary_coord = i * -primary_spacing;
|
|
859
|
+
primary_coord = i * -primary_spacing;
|
|
860
|
+
secondary_axis = 'y'
|
|
811
861
|
|
|
812
|
-
if i == 0:
|
|
862
|
+
if i == 0:
|
|
863
|
+
secondary_offset_multiplier = 0.0
|
|
813
864
|
else:
|
|
814
865
|
start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
|
|
815
866
|
magnitude = math.ceil(i / 2.0)
|
|
@@ -817,32 +868,44 @@ def kececi_layout_v4_graphillion(graph_set: gg.GraphSet,
|
|
|
817
868
|
secondary_offset_multiplier = start_mult * magnitude * side
|
|
818
869
|
secondary_coord = secondary_offset_multiplier * secondary_spacing
|
|
819
870
|
|
|
820
|
-
if secondary_axis == 'x':
|
|
821
|
-
|
|
871
|
+
if secondary_axis == 'x':
|
|
872
|
+
x, y = secondary_coord, primary_coord
|
|
873
|
+
else:
|
|
874
|
+
x, y = primary_coord, secondary_coord
|
|
822
875
|
pos[node_id] = (x, y)
|
|
823
876
|
|
|
824
877
|
return pos
|
|
825
878
|
|
|
826
|
-
def kececi_layout_v4_rx(graph:
|
|
879
|
+
def kececi_layout_v4_rx(graph:
|
|
880
|
+
rx.PyGraph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
827
881
|
primary_direction='top-down', secondary_start='right'):
|
|
828
882
|
pos = {}
|
|
829
883
|
nodes = sorted(graph.node_indices())
|
|
830
884
|
num_nodes = len(nodes)
|
|
831
|
-
if num_nodes == 0:
|
|
885
|
+
if num_nodes == 0:
|
|
886
|
+
return {}
|
|
832
887
|
|
|
833
888
|
is_vertical = primary_direction in ['top-down', 'bottom-up']
|
|
834
889
|
is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
|
|
835
|
-
if not (is_vertical or is_horizontal):
|
|
836
|
-
|
|
837
|
-
if
|
|
890
|
+
if not (is_vertical or is_horizontal):
|
|
891
|
+
raise ValueError(f"Invalid primary_direction: {primary_direction}")
|
|
892
|
+
if is_vertical and secondary_start not in ['right', 'left']:
|
|
893
|
+
raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
|
|
894
|
+
if is_horizontal and secondary_start not in ['up', 'down']:
|
|
895
|
+
raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
|
|
838
896
|
|
|
839
897
|
for i, node_index in enumerate(nodes):
|
|
840
|
-
if primary_direction == 'top-down':
|
|
841
|
-
|
|
842
|
-
elif primary_direction == '
|
|
843
|
-
|
|
898
|
+
if primary_direction == 'top-down':
|
|
899
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'x'
|
|
900
|
+
elif primary_direction == 'bottom-up':
|
|
901
|
+
primary_coord, secondary_axis = i * primary_spacing, 'x'
|
|
902
|
+
elif primary_direction == 'left-to-right':
|
|
903
|
+
primary_coord, secondary_axis = i * primary_spacing, 'y'
|
|
904
|
+
else:
|
|
905
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'y'
|
|
844
906
|
|
|
845
|
-
if i == 0:
|
|
907
|
+
if i == 0:
|
|
908
|
+
secondary_offset_multiplier = 0.0
|
|
846
909
|
else:
|
|
847
910
|
start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
|
|
848
911
|
magnitude = math.ceil(i / 2.0)
|
|
@@ -854,26 +917,36 @@ def kececi_layout_v4_rx(graph: rx.PyGraph, primary_spacing=1.0, secondary_spacin
|
|
|
854
917
|
pos[node_index] = np.array([x, y])
|
|
855
918
|
return pos
|
|
856
919
|
|
|
857
|
-
def kececi_layout_v4_rustworkx(graph:
|
|
920
|
+
def kececi_layout_v4_rustworkx(graph:
|
|
921
|
+
rx.PyGraph, primary_spacing=1.0, secondary_spacing=1.0,
|
|
858
922
|
primary_direction='top-down', secondary_start='right'):
|
|
859
923
|
pos = {}
|
|
860
924
|
nodes = sorted(graph.node_indices())
|
|
861
925
|
num_nodes = len(nodes)
|
|
862
|
-
if num_nodes == 0:
|
|
926
|
+
if num_nodes == 0:
|
|
927
|
+
return {}
|
|
863
928
|
|
|
864
929
|
is_vertical = primary_direction in ['top-down', 'bottom-up']
|
|
865
930
|
is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
|
|
866
|
-
if not (is_vertical or is_horizontal):
|
|
867
|
-
|
|
868
|
-
if
|
|
931
|
+
if not (is_vertical or is_horizontal):
|
|
932
|
+
raise ValueError(f"Invalid primary_direction: {primary_direction}")
|
|
933
|
+
if is_vertical and secondary_start not in ['right', 'left']:
|
|
934
|
+
raise ValueError(f"Invalid secondary_start for vertical: {secondary_start}")
|
|
935
|
+
if is_horizontal and secondary_start not in ['up', 'down']:
|
|
936
|
+
raise ValueError(f"Invalid secondary_start for horizontal: {secondary_start}")
|
|
869
937
|
|
|
870
938
|
for i, node_index in enumerate(nodes):
|
|
871
|
-
if primary_direction == 'top-down':
|
|
872
|
-
|
|
873
|
-
elif primary_direction == '
|
|
874
|
-
|
|
939
|
+
if primary_direction == 'top-down':
|
|
940
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'x'
|
|
941
|
+
elif primary_direction == 'bottom-up':
|
|
942
|
+
primary_coord, secondary_axis = i * primary_spacing, 'x'
|
|
943
|
+
elif primary_direction == 'left-to-right':
|
|
944
|
+
primary_coord, secondary_axis = i * primary_spacing, 'y'
|
|
945
|
+
else:
|
|
946
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'y'
|
|
875
947
|
|
|
876
|
-
if i == 0:
|
|
948
|
+
if i == 0:
|
|
949
|
+
secondary_offset_multiplier = 0.0
|
|
877
950
|
else:
|
|
878
951
|
start_mult = 1.0 if secondary_start in ['right', 'up'] else -1.0
|
|
879
952
|
magnitude = math.ceil(i / 2.0)
|
|
@@ -889,8 +962,10 @@ def kececi_layout_v4_rustworkx(graph: rx.PyGraph, primary_spacing=1.0, secondary
|
|
|
889
962
|
# Rastgele Graf Oluşturma Fonksiyonu (Rustworkx ile - Düzeltilmiş subgraph)
|
|
890
963
|
# =============================================================================
|
|
891
964
|
def generate_random_rx_graph(min_nodes=5, max_nodes=15, edge_prob_min=0.15, edge_prob_max=0.4):
|
|
892
|
-
if min_nodes < 2:
|
|
893
|
-
|
|
965
|
+
if min_nodes < 2:
|
|
966
|
+
min_nodes = 2
|
|
967
|
+
if max_nodes < min_nodes:
|
|
968
|
+
max_nodes = min_nodes
|
|
894
969
|
while True:
|
|
895
970
|
num_nodes_target = random.randint(min_nodes, max_nodes)
|
|
896
971
|
edge_probability = random.uniform(edge_prob_min, edge_prob_max)
|
|
@@ -901,22 +976,29 @@ def generate_random_rx_graph(min_nodes=5, max_nodes=15, edge_prob_min=0.15, edge
|
|
|
901
976
|
if random.random() < edge_probability:
|
|
902
977
|
G_candidate.add_edge(node_indices[i], node_indices[j], None)
|
|
903
978
|
|
|
904
|
-
if G_candidate.num_nodes() == 0:
|
|
905
|
-
|
|
979
|
+
if G_candidate.num_nodes() == 0:
|
|
980
|
+
continue
|
|
981
|
+
if num_nodes_target > 1 and G_candidate.num_edges() == 0:
|
|
982
|
+
continue
|
|
906
983
|
|
|
907
984
|
if not rx.is_connected(G_candidate):
|
|
908
985
|
components = rx.connected_components(G_candidate)
|
|
909
|
-
if not components:
|
|
986
|
+
if not components:
|
|
987
|
+
continue
|
|
910
988
|
largest_cc_nodes_indices = max(components, key=len, default=set())
|
|
911
|
-
if len(largest_cc_nodes_indices) < 2 and num_nodes_target >=2 :
|
|
912
|
-
|
|
989
|
+
if len(largest_cc_nodes_indices) < 2 and num_nodes_target >=2 :
|
|
990
|
+
continue
|
|
991
|
+
if not largest_cc_nodes_indices:
|
|
992
|
+
continue
|
|
913
993
|
# Set'i listeye çevirerek subgraph oluştur
|
|
914
994
|
G = G_candidate.subgraph(list(largest_cc_nodes_indices))
|
|
915
|
-
if G.num_nodes() == 0:
|
|
995
|
+
if G.num_nodes() == 0:
|
|
996
|
+
continue
|
|
916
997
|
else:
|
|
917
998
|
G = G_candidate
|
|
918
999
|
|
|
919
|
-
if G.num_nodes() >= 2:
|
|
1000
|
+
if G.num_nodes() >= 2:
|
|
1001
|
+
break
|
|
920
1002
|
print(f"Oluşturulan Rustworkx Graf: {G.num_nodes()} Düğüm, {G.num_edges()} Kenar (Başlangıç p={edge_probability:.3f})")
|
|
921
1003
|
return G
|
|
922
1004
|
|
|
@@ -938,20 +1020,28 @@ def kececi_layout_v4_pure(nodes, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
938
1020
|
sorted_nodes = list(nodes)
|
|
939
1021
|
|
|
940
1022
|
num_nodes = len(sorted_nodes)
|
|
941
|
-
if num_nodes == 0:
|
|
1023
|
+
if num_nodes == 0:
|
|
1024
|
+
return {}
|
|
942
1025
|
is_vertical = primary_direction in ['top-down', 'bottom-up']
|
|
943
1026
|
is_horizontal = primary_direction in ['left-to-right', 'right-to-left']
|
|
944
|
-
if not (is_vertical or is_horizontal):
|
|
945
|
-
|
|
946
|
-
if
|
|
1027
|
+
if not (is_vertical or is_horizontal):
|
|
1028
|
+
raise ValueError(f"Invalid primary_direction: {primary_direction}")
|
|
1029
|
+
if is_vertical and secondary_start not in ['right', 'left']:
|
|
1030
|
+
raise ValueError(f"Dikey yön için geçersiz secondary_start: {secondary_start}")
|
|
1031
|
+
if is_horizontal and secondary_start not in ['up', 'down']:
|
|
1032
|
+
raise ValueError(f"Yatay yön için geçersiz secondary_start: {secondary_start}")
|
|
947
1033
|
|
|
948
1034
|
for i, node_id in enumerate(sorted_nodes):
|
|
949
1035
|
primary_coord = 0.0
|
|
950
1036
|
secondary_axis = ''
|
|
951
|
-
if primary_direction == 'top-down':
|
|
952
|
-
|
|
953
|
-
elif primary_direction == '
|
|
954
|
-
|
|
1037
|
+
if primary_direction == 'top-down':
|
|
1038
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'x'
|
|
1039
|
+
elif primary_direction == 'bottom-up':
|
|
1040
|
+
primary_coord, secondary_axis = i * primary_spacing, 'x'
|
|
1041
|
+
elif primary_direction == 'left-to-right':
|
|
1042
|
+
primary_coord, secondary_axis = i * primary_spacing, 'y'
|
|
1043
|
+
else:
|
|
1044
|
+
primary_coord, secondary_axis = i * -primary_spacing, 'y'
|
|
955
1045
|
|
|
956
1046
|
secondary_offset_multiplier = 0.0
|
|
957
1047
|
if i > 0:
|
|
@@ -970,27 +1060,37 @@ def kececi_layout_v4_pure(nodes, primary_spacing=1.0, secondary_spacing=1.0,
|
|
|
970
1060
|
# =============================================================================
|
|
971
1061
|
def generate_random_graph(min_nodes=0, max_nodes=200, edge_prob_min=0.15, edge_prob_max=0.4):
|
|
972
1062
|
|
|
973
|
-
if min_nodes < 2:
|
|
974
|
-
|
|
1063
|
+
if min_nodes < 2:
|
|
1064
|
+
min_nodes = 2
|
|
1065
|
+
if max_nodes < min_nodes:
|
|
1066
|
+
max_nodes = min_nodes
|
|
975
1067
|
while True:
|
|
976
1068
|
num_nodes_target = random.randint(min_nodes, max_nodes)
|
|
977
1069
|
edge_probability = random.uniform(edge_prob_min, edge_prob_max)
|
|
978
1070
|
G_candidate = nx.gnp_random_graph(num_nodes_target, edge_probability, seed=None)
|
|
979
|
-
if G_candidate.number_of_nodes() == 0:
|
|
1071
|
+
if G_candidate.number_of_nodes() == 0:
|
|
1072
|
+
continue
|
|
980
1073
|
# Düzeltme: 0 kenarlı ama >1 düğümlü grafı da tekrar dene
|
|
981
|
-
if num_nodes_target > 1 and G_candidate.number_of_edges() == 0 :
|
|
1074
|
+
if num_nodes_target > 1 and G_candidate.number_of_edges() == 0 :
|
|
1075
|
+
continue
|
|
982
1076
|
|
|
983
1077
|
if not nx.is_connected(G_candidate):
|
|
984
1078
|
# Düzeltme: default=set() kullanmak yerine önce kontrol et
|
|
985
1079
|
connected_components = list(nx.connected_components(G_candidate))
|
|
986
|
-
if not connected_components:
|
|
1080
|
+
if not connected_components:
|
|
1081
|
+
continue # Bileşen yoksa tekrar dene
|
|
987
1082
|
largest_cc_nodes = max(connected_components, key=len)
|
|
988
|
-
if len(largest_cc_nodes) < 2 and num_nodes_target >=2 :
|
|
989
|
-
|
|
1083
|
+
if len(largest_cc_nodes) < 2 and num_nodes_target >=2 :
|
|
1084
|
+
continue
|
|
1085
|
+
if not largest_cc_nodes:
|
|
1086
|
+
continue # Bu aslında gereksiz ama garanti olsun
|
|
990
1087
|
G = G_candidate.subgraph(largest_cc_nodes).copy()
|
|
991
|
-
if G.number_of_nodes() == 0:
|
|
992
|
-
|
|
993
|
-
|
|
1088
|
+
if G.number_of_nodes() == 0:
|
|
1089
|
+
continue
|
|
1090
|
+
else:
|
|
1091
|
+
G = G_candidate
|
|
1092
|
+
if G.number_of_nodes() >= 2:
|
|
1093
|
+
break
|
|
994
1094
|
G = nx.convert_node_labels_to_integers(G, first_label=0)
|
|
995
1095
|
print(f"Oluşturulan Graf: {G.number_of_nodes()} Düğüm, {G.number_of_edges()} Kenar (Başlangıç p={edge_probability:.3f})")
|
|
996
1096
|
return G
|
|
@@ -998,24 +1098,36 @@ def generate_random_graph(min_nodes=0, max_nodes=200, edge_prob_min=0.15, edge_p
|
|
|
998
1098
|
def generate_random_graph_ig(min_nodes=0, max_nodes=200, edge_prob_min=0.15, edge_prob_max=0.4):
|
|
999
1099
|
"""igraph kullanarak rastgele bağlı bir graf oluşturur."""
|
|
1000
1100
|
|
|
1001
|
-
if min_nodes < 2:
|
|
1002
|
-
|
|
1101
|
+
if min_nodes < 2:
|
|
1102
|
+
min_nodes = 2
|
|
1103
|
+
if max_nodes < min_nodes:
|
|
1104
|
+
max_nodes = min_nodes
|
|
1003
1105
|
while True:
|
|
1004
1106
|
num_nodes_target = random.randint(min_nodes, max_nodes)
|
|
1005
1107
|
edge_probability = random.uniform(edge_prob_min, edge_prob_max)
|
|
1006
1108
|
g_candidate = ig.Graph.Erdos_Renyi(n=num_nodes_target, p=edge_probability, directed=False)
|
|
1007
|
-
if g_candidate.vcount() == 0:
|
|
1008
|
-
|
|
1109
|
+
if g_candidate.vcount() == 0:
|
|
1110
|
+
continue
|
|
1111
|
+
if num_nodes_target > 1 and g_candidate.ecount() == 0 :
|
|
1112
|
+
continue
|
|
1009
1113
|
if not g_candidate.is_connected(mode='weak'):
|
|
1010
1114
|
components = g_candidate.components(mode='weak')
|
|
1011
|
-
if not components or len(components) == 0:
|
|
1115
|
+
if not components or len(components) == 0:
|
|
1116
|
+
continue
|
|
1012
1117
|
largest_cc_subgraph = components.giant()
|
|
1013
|
-
if largest_cc_subgraph.vcount() < 2 and num_nodes_target >=2 :
|
|
1118
|
+
if largest_cc_subgraph.vcount() < 2 and num_nodes_target >=2 :
|
|
1119
|
+
continue
|
|
1014
1120
|
g = largest_cc_subgraph
|
|
1015
|
-
if g.vcount() == 0:
|
|
1016
|
-
|
|
1017
|
-
|
|
1121
|
+
if g.vcount() == 0:
|
|
1122
|
+
continue
|
|
1123
|
+
else:
|
|
1124
|
+
g = g_candidate
|
|
1125
|
+
if g.vcount() >= 2:
|
|
1126
|
+
break
|
|
1018
1127
|
print(f"Oluşturulan igraph Graf: {g.vcount()} Düğüm, {g.ecount()} Kenar (Başlangıç p={edge_probability:.3f})")
|
|
1019
1128
|
g.vs["label"] = [str(i) for i in range(g.vcount())]
|
|
1020
1129
|
g.vs["degree"] = g.degree()
|
|
1021
1130
|
return g
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kececilayout
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.
|
|
5
5
|
Home-page: https://github.com/WhiteSymmetry/kececilayout
|
|
6
6
|
Author: Mehmet Keçeci
|
|
@@ -41,8 +41,11 @@ Dynamic: summary
|
|
|
41
41
|
[](https://badge.fury.io/py/kececilayout)
|
|
42
42
|
[](https://opensource.org/licenses/MIT)
|
|
43
43
|
|
|
44
|
-
[](https://doi.org/10.5281/zenodo.15313946)
|
|
45
45
|
[](https://doi.org/10.5281/zenodo.15314329)
|
|
46
|
+
[](https://doi.org/10.5281/zenodo.15353535)
|
|
47
|
+
|
|
48
|
+
[](https://doi.org/10.48546/workflowhub.datafile.17.1)
|
|
46
49
|
|
|
47
50
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
48
51
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
@@ -50,10 +53,61 @@ Dynamic: summary
|
|
|
50
53
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
51
54
|
|
|
52
55
|
[](https://opensource.org/)
|
|
53
|
-
[](https://kececilayout.readthedocs.io/en/latest)
|
|
54
57
|
|
|
55
58
|
[](https://www.bestpractices.dev/projects/10531)
|
|
56
59
|
|
|
60
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
|
|
61
|
+
[](https://codecov.io/gh/WhiteSymmetry/kececilayout)
|
|
62
|
+
[](https://kececilayout.readthedocs.io/en/latest/)
|
|
63
|
+
[](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
|
|
64
|
+
[](https://badge.fury.io/py/kececilayout)
|
|
65
|
+
[](https://pepy.tech/projects/kececilayout)
|
|
66
|
+
[](CODE_OF_CONDUCT.md)
|
|
67
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
|
|
68
|
+
[](https://github.com/astral-sh/ruff)
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
<p align="left">
|
|
73
|
+
<table>
|
|
74
|
+
<tr>
|
|
75
|
+
<td style="text-align: center;">PyPI</td>
|
|
76
|
+
<td style="text-align: center;">
|
|
77
|
+
<a href="https://pypi.org/project/kececilayout/">
|
|
78
|
+
<img src="https://badge.fury.io/py/kececilayout.svg" alt="PyPI version" height="18"/>
|
|
79
|
+
</a>
|
|
80
|
+
</td>
|
|
81
|
+
</tr>
|
|
82
|
+
<tr>
|
|
83
|
+
<td style="text-align: center;">Conda</td>
|
|
84
|
+
<td style="text-align: center;">
|
|
85
|
+
<a href="https://anaconda.org/bilgi/kececilayout">
|
|
86
|
+
<img src="https://anaconda.org/bilgi/kececilayout/badges/version.svg" alt="conda-forge version" height="18"/>
|
|
87
|
+
</a>
|
|
88
|
+
</td>
|
|
89
|
+
</tr>
|
|
90
|
+
<tr>
|
|
91
|
+
<td style="text-align: center;">DOI</td>
|
|
92
|
+
<td style="text-align: center;">
|
|
93
|
+
<a href="https://doi.org/10.5281/zenodo.15313946">
|
|
94
|
+
<img src="https://zenodo.org/badge/DOI/10.5281/zenodo.15313946.svg" alt="DOI" height="18"/>
|
|
95
|
+
</a>
|
|
96
|
+
</td>
|
|
97
|
+
</tr>
|
|
98
|
+
<tr>
|
|
99
|
+
<td style="text-align: center;">License: MIT</td>
|
|
100
|
+
<td style="text-align: center;">
|
|
101
|
+
<a href="https://opensource.org/licenses/MIT">
|
|
102
|
+
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License" height="18"/>
|
|
103
|
+
</a>
|
|
104
|
+
</td>
|
|
105
|
+
</tr>
|
|
106
|
+
</table>
|
|
107
|
+
</p>
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
57
111
|
**Kececi Layout (Keçeci Yerleşimi)**: A deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
|
|
58
112
|
|
|
59
113
|
*Python implementation of the Keçeci layout algorithm for graph visualization.*
|
|
@@ -684,15 +738,15 @@ If this library was useful to you in your research, please cite us. Following th
|
|
|
684
738
|
### BibTeX
|
|
685
739
|
|
|
686
740
|
```bibtex
|
|
687
|
-
@misc{
|
|
741
|
+
@misc{kececi_2025_15313946,
|
|
688
742
|
author = {Keçeci, Mehmet},
|
|
689
743
|
title = {kececilayout},
|
|
690
744
|
month = may,
|
|
691
745
|
year = 2025,
|
|
692
746
|
publisher = {PyPI, Anaconda, Github, Zenodo},
|
|
693
747
|
version = {0.2.0},
|
|
694
|
-
doi = {10.5281/zenodo.
|
|
695
|
-
url = {https://doi.org/10.5281/zenodo.
|
|
748
|
+
doi = {10.5281/zenodo.15313946},
|
|
749
|
+
url = {https://doi.org/10.5281/zenodo.15313946},
|
|
696
750
|
}
|
|
697
751
|
|
|
698
752
|
@misc{kececi_2025_15314329,
|
|
@@ -709,15 +763,52 @@ If this library was useful to you in your research, please cite us. Following th
|
|
|
709
763
|
### APA
|
|
710
764
|
|
|
711
765
|
```
|
|
712
|
-
Keçeci, M. (2025). kececilayout (0.2.0). PyPI, Anaconda, GitHub, Zenodo. https://doi.org/10.5281/zenodo.15313947
|
|
713
766
|
|
|
714
|
-
Keçeci, M. (2025). Keçeci Layout. https://doi.org/10.5281/zenodo.
|
|
767
|
+
Keçeci, M. (2025). The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16696713
|
|
768
|
+
|
|
769
|
+
Keçeci, M. (2025). The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.16526798
|
|
770
|
+
|
|
771
|
+
Keçeci, M. (2025). Keçeci Deterministic Zigzag Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.31.1
|
|
772
|
+
|
|
773
|
+
Keçeci, M. (2025). Keçeci Zigzag Layout Algorithm. Authorea. https://doi.org/10.22541/au.175087581.16524538/v1
|
|
774
|
+
|
|
775
|
+
Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15792684
|
|
776
|
+
|
|
777
|
+
Keçeci, M. (2025). When Nodes Have an Order: The Keçeci Layout for Structured System Visualization. HAL open science. https://hal.science/hal-05143155; https://doi.org/10.13140/RG.2.2.19098.76484
|
|
778
|
+
|
|
779
|
+
Keçeci, M. (2025). The Keçeci Layout: A Cross-Disciplinary Graphical Framework for Structural Analysis of Ordered Systems. Authorea. https://doi.org/10.22541/au.175156702.26421899/v1
|
|
780
|
+
|
|
781
|
+
Keçeci, M. (2025). Beyond Traditional Diagrams: The Keçeci Layout for Structural Thinking. Knowledge Commons. https://doi.org/10.17613/v4w94-ak572
|
|
782
|
+
|
|
783
|
+
Keçeci, M. (2025). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. figshare. Journal contribution. https://doi.org/10.6084/m9.figshare.29468135
|
|
784
|
+
|
|
785
|
+
Keçeci, M. (2025, July 3). The Keçeci Layout: A Structural Approach for Interdisciplinary Scientific Analysis. OSF. https://doi.org/10.17605/OSF.IO/9HTG3
|
|
786
|
+
|
|
787
|
+
Keçeci, M. (2025). Beyond Topology: Deterministic and Order-Preserving Graph Visualization with the Keçeci Layout. WorkflowHub. https://doi.org/10.48546/workflowhub.document.34.4
|
|
788
|
+
|
|
789
|
+
Keçeci, M. (2025). A Graph-Theoretic Perspective on the Keçeci Layout: Structuring Cross-Disciplinary Inquiry. Preprints. https://doi.org/10.20944/preprints202507.0589.v1
|
|
790
|
+
|
|
791
|
+
Keçeci, M. (2025). Keçeci Layout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15314328
|
|
792
|
+
|
|
793
|
+
Keçeci, M. (2025). kececilayout [Data set]. WorkflowHub. https://doi.org/10.48546/workflowhub.datafile.17.1
|
|
794
|
+
|
|
795
|
+
Keçeci, M. (2025, May 1). Kececilayout. Open Science Articles (OSAs), Zenodo. https://doi.org/10.5281/zenodo.15313946
|
|
796
|
+
|
|
715
797
|
```
|
|
716
798
|
|
|
717
799
|
### Chicago
|
|
718
800
|
|
|
719
801
|
```
|
|
720
|
-
Keçeci, Mehmet. “Kececilayout”. PyPI, Anaconda, GitHub, Zenodo, 01 May 2025. https://doi.org/10.5281/zenodo.15313947.
|
|
721
802
|
|
|
722
|
-
Keçeci, Mehmet.
|
|
803
|
+
Keçeci, Mehmet. The Keçeci Layout: A Deterministic Visualisation Framework for the Structural Analysis of Ordered Systems in Chemistry and Environmental Science. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16696713
|
|
804
|
+
|
|
805
|
+
Keçeci, Mehmet. The Keçeci Layout: A Deterministic, Order-Preserving Visualization Algorithm for Structured Systems. Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.16526798
|
|
806
|
+
|
|
807
|
+
Keçeci, Mehmet. kececilayout [Data set]. WorkflowHub, 2025. https://doi.org/10.48546/workflowhub.datafile.17.1
|
|
808
|
+
|
|
809
|
+
Keçeci, Mehmet. "Kececilayout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15313946.
|
|
810
|
+
|
|
811
|
+
Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. https://doi.org/10.5281/zenodo.15314329.
|
|
723
812
|
```
|
|
813
|
+
|
|
814
|
+
|
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name="kececilayout",
|
|
5
|
-
version="0.2.
|
|
5
|
+
version="0.2.5",
|
|
6
6
|
description="A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.",
|
|
7
7
|
long_description=open("README.md").read(),
|
|
8
8
|
long_description_content_type="text/markdown",
|
|
@@ -20,7 +20,7 @@ setup(
|
|
|
20
20
|
"networkit",
|
|
21
21
|
"graphillion",
|
|
22
22
|
"pycairo" ,
|
|
23
|
-
"cairocffi"
|
|
23
|
+
"cairocffi"
|
|
24
24
|
],
|
|
25
25
|
extras_require={
|
|
26
26
|
|
|
@@ -28,8 +28,9 @@ setup(
|
|
|
28
28
|
classifiers=[
|
|
29
29
|
"Programming Language :: Python :: 3",
|
|
30
30
|
"License :: OSI Approved :: MIT License",
|
|
31
|
-
"Operating System :: OS Independent"
|
|
31
|
+
"Operating System :: OS Independent"
|
|
32
32
|
],
|
|
33
33
|
python_requires='>=3.9',
|
|
34
34
|
license="MIT",
|
|
35
35
|
)
|
|
36
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
def test_placeholder():
|
|
2
|
+
assert True
|
|
3
|
+
|
|
4
|
+
def add_numbers(a, b):
|
|
5
|
+
return a + b
|
|
6
|
+
|
|
7
|
+
def test_add_numbers():
|
|
8
|
+
result = add_numbers(2, 3)
|
|
9
|
+
assert result == 5, f"Expected 5, but got {result}"
|
|
10
|
+
|
|
11
|
+
result2 = add_numbers(-1, 4)
|
|
12
|
+
assert result2 == 3, f"Expected 3, but got {result2}"
|
|
13
|
+
|
|
14
|
+
result3 = add_numbers(0, 0)
|
|
15
|
+
assert result3 == 0, f"Expected 0, but got {result3}"
|
|
16
|
+
|
|
17
|
+
test_add_numbers()
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# __init__.py
|
|
2
|
-
# Bu dosya paketin başlangıç noktası olarak çalışır.
|
|
3
|
-
# Alt modülleri yükler, sürüm bilgileri tanımlar ve geriye dönük uyumluluk için uyarılar sağlar.
|
|
4
|
-
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
import importlib
|
|
7
|
-
import warnings
|
|
8
|
-
import os
|
|
9
|
-
# if os.getenv("DEVELOPMENT") == "true":
|
|
10
|
-
# importlib.reload(kececi_layout) # F821 undefined name 'kececi_layout'
|
|
11
|
-
|
|
12
|
-
# Göreli modül içe aktarmaları
|
|
13
|
-
# F401 hatasını önlemek için sadece kullanacağınız şeyleri dışa aktarın
|
|
14
|
-
# Aksi halde linter'lar "imported but unused" uyarısı verir
|
|
15
|
-
try:
|
|
16
|
-
from .kececi_layout import * # gerekirse burada belirli fonksiyonları seçmeli yapmak daha güvenlidir
|
|
17
|
-
from . import kececi_layout # Modülün kendisine doğrudan erişim isteniyorsa
|
|
18
|
-
except ImportError as e:
|
|
19
|
-
warnings.warn(f"Gerekli modül yüklenemedi: {e}", ImportWarning)
|
|
20
|
-
|
|
21
|
-
# Eski bir fonksiyonun yer tutucusu - gelecekte kaldırılacak
|
|
22
|
-
def eski_fonksiyon():
|
|
23
|
-
"""
|
|
24
|
-
Kaldırılması planlanan eski bir fonksiyondur.
|
|
25
|
-
Lütfen alternatif fonksiyonları kullanın.
|
|
26
|
-
"""
|
|
27
|
-
warnings.warn(
|
|
28
|
-
"eski_fonksiyon() artık kullanılmamaktadır ve gelecekte kaldırılacaktır. "
|
|
29
|
-
"Lütfen yeni alternatif fonksiyonları kullanın. "
|
|
30
|
-
"Keçeci Layout; Python 3.7-3.14 sürümlerinde sorunsuz çalışmalıdır.",
|
|
31
|
-
category=DeprecationWarning,
|
|
32
|
-
stacklevel=2
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
# Paket sürüm numarası
|
|
37
|
-
__version__ = "0.2.2"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|