shesha-geometry 0.1.0__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.
- shesha_geometry-0.1.0/LICENSE +21 -0
- shesha_geometry-0.1.0/PKG-INFO +396 -0
- shesha_geometry-0.1.0/README.md +363 -0
- shesha_geometry-0.1.0/examples/tutorial.py +336 -0
- shesha_geometry-0.1.0/pyproject.toml +80 -0
- shesha_geometry-0.1.0/setup.cfg +4 -0
- shesha_geometry-0.1.0/shesha/__init__.py +59 -0
- shesha_geometry-0.1.0/shesha/bio.py +315 -0
- shesha_geometry-0.1.0/shesha/core.py +648 -0
- shesha_geometry-0.1.0/shesha_geometry.egg-info/PKG-INFO +396 -0
- shesha_geometry-0.1.0/shesha_geometry.egg-info/SOURCES.txt +16 -0
- shesha_geometry-0.1.0/shesha_geometry.egg-info/dependency_links.txt +1 -0
- shesha_geometry-0.1.0/shesha_geometry.egg-info/requires.txt +9 -0
- shesha_geometry-0.1.0/shesha_geometry.egg-info/top_level.txt +6 -0
- shesha_geometry-0.1.0/tests/__init__.py +1 -0
- shesha_geometry-0.1.0/tests/test_bio.py +49 -0
- shesha_geometry-0.1.0/tests/test_core.py +164 -0
- shesha_geometry-0.1.0/tests/test_crispr.py +191 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Prashant C. Raju
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: shesha-geometry
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Self-consistency metrics for representational stability analysis
|
|
5
|
+
Author-email: Prashant Raju <rajuprashant@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/prashantcraju/shesha
|
|
8
|
+
Project-URL: Documentation, https://github.com/prashantcraju/shesha#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/prashantcraju/shesha
|
|
10
|
+
Project-URL: Issues, https://github.com/prashantcraju/shesha/issues
|
|
11
|
+
Keywords: representation learning,neural networks,geometric stability,geometric analysis,manifold analysis,latent space,single-cell,crispr,perturb-seq,anndata,functional genomics,phenotypic stability,computational biology,scanpy,llm alignment,concept drift,model steering,ai safety,constitutional ai,perturbation analysis
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering
|
|
22
|
+
Requires-Python: >=3.8
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: numpy>=1.20
|
|
26
|
+
Requires-Dist: scipy>=1.7
|
|
27
|
+
Requires-Dist: anndata>=0.8
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
31
|
+
Requires-Dist: black; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff; extra == "dev"
|
|
33
|
+
|
|
34
|
+
[](https://doi.org/10.5281/zenodo.18227453)
|
|
35
|
+
<p align="center">
|
|
36
|
+
<img src="https://i.imgur.com/oJ5YhBo.jpg" alt="Shesha Logo" width="300">
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
# Shesha
|
|
40
|
+
|
|
41
|
+
Self-consistency metrics for representational stability analysis.
|
|
42
|
+
|
|
43
|
+
Shesha measures the geometric stability of high-dimensional representations by quantifying the self-consistency of their pairwise distance structure (RDMs) under controlled internal perturbations.
|
|
44
|
+
|
|
45
|
+
## Installation
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pip install shesha-geometry
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import numpy as np
|
|
55
|
+
import shesha
|
|
56
|
+
|
|
57
|
+
# Your embeddings: (n_samples, n_features)
|
|
58
|
+
X = np.random.randn(500, 768)
|
|
59
|
+
|
|
60
|
+
# Feature-split stability (unsupervised)
|
|
61
|
+
stability = shesha.feature_split(X, n_splits=30, seed=320)
|
|
62
|
+
print(f"Feature-split stability: {stability:.3f}")
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
With labels:
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
y = np.random.randint(0, 10, 500)
|
|
69
|
+
alignment = shesha.supervised_alignment(X, y)
|
|
70
|
+
print(f"Supervised alignment: {alignment:.3f}")
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Measuring drift between representations:
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
X_before = np.random.randn(100, 256)
|
|
77
|
+
X_after = X_before + np.random.randn(100, 256) * 0.3 # Add noise
|
|
78
|
+
|
|
79
|
+
# Compare before/after fine-tuning
|
|
80
|
+
similarity = shesha.rdm_similarity(X_before, X_after)
|
|
81
|
+
drift = shesha.rdm_drift(X_before, X_after)
|
|
82
|
+
print(f"RDM similarity: {similarity:.3f}, drift: {drift:.3f}")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
## Variants
|
|
87
|
+
|
|
88
|
+
### Unsupervised (no labels required)
|
|
89
|
+
|
|
90
|
+
**`feature_split(X, n_splits=30, metric='cosine', seed=None)`**
|
|
91
|
+
|
|
92
|
+
Correlates RDMs from random feature partitions. Use for internal consistency and drift detection.
|
|
93
|
+
|
|
94
|
+
**`sample_split(X, n_splits=30, subsample_fraction=0.4, seed=None)`**
|
|
95
|
+
|
|
96
|
+
Correlates RDMs from bootstrap samples. Use for robustness to sampling.
|
|
97
|
+
|
|
98
|
+
**`anchor_stability(X, n_splits=30, n_anchors=100, seed=None)`**
|
|
99
|
+
|
|
100
|
+
Distance profile consistency from fixed anchors. Use for large-scale stability.
|
|
101
|
+
|
|
102
|
+
### Supervised (labels required)
|
|
103
|
+
|
|
104
|
+
**`variance_ratio(X, y)`**
|
|
105
|
+
|
|
106
|
+
Between-class / total variance. Use for quick separability check.
|
|
107
|
+
|
|
108
|
+
**`supervised_alignment(X, y, metric='correlation', seed=None)`**
|
|
109
|
+
|
|
110
|
+
Correlation with ideal label RDM. Use for task alignment.
|
|
111
|
+
|
|
112
|
+
### Drift Metrics (comparing two representations)
|
|
113
|
+
|
|
114
|
+
**`rdm_similarity(X, Y, method='spearman', metric='cosine')`**
|
|
115
|
+
|
|
116
|
+
RDM correlation between two representations. Use for comparing models or tracking changes.
|
|
117
|
+
|
|
118
|
+
**`rdm_drift(X, Y, method='spearman', metric='cosine')`**
|
|
119
|
+
|
|
120
|
+
Representational drift (1 - similarity). Use for quantifying how much geometry has changed.
|
|
121
|
+
|
|
122
|
+
## Examples
|
|
123
|
+
|
|
124
|
+
### Comparing model stability
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
import numpy as np
|
|
128
|
+
import shesha
|
|
129
|
+
|
|
130
|
+
# Example embeddings from two different models
|
|
131
|
+
embeddings_a = np.random.randn(500, 768) # Model A embeddings
|
|
132
|
+
embeddings_b = np.random.randn(500, 768) # Model B embeddings
|
|
133
|
+
|
|
134
|
+
models = {'model_a': embeddings_a, 'model_b': embeddings_b}
|
|
135
|
+
|
|
136
|
+
for name, X in models.items():
|
|
137
|
+
fs = shesha.feature_split(X, seed=320)
|
|
138
|
+
print(f"{name}: {fs:.3f}")
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Monitoring fine-tuning drift
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
import shesha
|
|
145
|
+
|
|
146
|
+
X_initial = model.encode(data)
|
|
147
|
+
|
|
148
|
+
for epoch in range(10):
|
|
149
|
+
train_one_epoch(model)
|
|
150
|
+
X_current = model.encode(data)
|
|
151
|
+
|
|
152
|
+
# Internal stability
|
|
153
|
+
stability = shesha.feature_split(X_current, seed=320)
|
|
154
|
+
|
|
155
|
+
# Drift from initial
|
|
156
|
+
drift = shesha.rdm_drift(X_initial, X_current)
|
|
157
|
+
|
|
158
|
+
print(f"Epoch {epoch}: stability={stability:.3f}, drift={drift:.3f}")
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Comparing two models
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
import shesha
|
|
165
|
+
|
|
166
|
+
X_model1 = model1.encode(data)
|
|
167
|
+
X_model2 = model2.encode(data)
|
|
168
|
+
|
|
169
|
+
# How similar are their geometric structures?
|
|
170
|
+
similarity = shesha.rdm_similarity(X_model1, X_model2)
|
|
171
|
+
print(f"Model similarity: {similarity:.3f}")
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Analyzing single-cell perturbations
|
|
175
|
+
|
|
176
|
+
Measure the geometric consistency of CRISPR/drug screens directly from `AnnData` objects:
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
import numpy as np
|
|
180
|
+
from shesha.bio import compute_stability, compute_magnitude
|
|
181
|
+
from anndata import AnnData
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# 1. Setup mock single-cell data (1000 cells, 50 PCA features)
|
|
185
|
+
n_cells = 1000
|
|
186
|
+
n_genes = 2000 # Original feature space (genes)
|
|
187
|
+
n_pcs = 50
|
|
188
|
+
|
|
189
|
+
# Create a mock AnnData object
|
|
190
|
+
# Note: Shesha works best on PCA coordinates (latent space), not raw counts
|
|
191
|
+
adata = AnnData(X=np.random.randn(n_cells, n_genes)) # Raw counts (unused)
|
|
192
|
+
adata.obsm['X_pca'] = np.random.randn(n_cells, n_pcs) # PCA embeddings
|
|
193
|
+
adata.obs['guide_id'] = ['NT'] * 800 + ['KLF1'] * 200 # Metadata
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# Create a proxy for PCA coordinates (Recommended for robust geometry)
|
|
197
|
+
adata_pca = AnnData(X=adata.obsm['X_pca'], obs=adata.obs)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
# Compute Stability (Consistency of the phenotype)
|
|
201
|
+
stability = compute_stability(
|
|
202
|
+
adata_pca,
|
|
203
|
+
perturbation_key='guide_id',
|
|
204
|
+
control_label='NT',
|
|
205
|
+
metric='cosine'
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Compute Magnitude (Strength of the phenotype)
|
|
209
|
+
magnitude = compute_magnitude(
|
|
210
|
+
adata_pca,
|
|
211
|
+
perturbation_key='guide_id',
|
|
212
|
+
control_label='NT',
|
|
213
|
+
metric='euclidean'
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
print(f"KLF1 Stability: {stability['KLF1']:.3f}") # e.g., 0.85 (High = Consistent)
|
|
217
|
+
print(f"KLF1 Magnitude: {magnitude['KLF1']:.3f}") # e.g., 2.40 (High = Strong)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
## API Reference
|
|
222
|
+
|
|
223
|
+
### `shesha.feature_split(X, n_splits=30, metric='cosine', seed=None, max_samples=1600)`
|
|
224
|
+
|
|
225
|
+
Measures internal geometric consistency by correlating RDMs computed from random, disjoint subsets of feature dimensions.
|
|
226
|
+
|
|
227
|
+
**Parameters:**
|
|
228
|
+
- `X` - array of shape (n_samples, n_features)
|
|
229
|
+
- `n_splits` - number of random partitions to average
|
|
230
|
+
- `metric` - 'cosine' or 'correlation'
|
|
231
|
+
- `seed` - random seed for reproducibility
|
|
232
|
+
- `max_samples` - subsample if exceeded
|
|
233
|
+
|
|
234
|
+
**Returns:** float in [-1, 1], higher = more stable
|
|
235
|
+
|
|
236
|
+
### `shesha.sample_split(X, n_splits=30, subsample_fraction=0.4, metric='cosine', seed=None, max_samples=1500)`
|
|
237
|
+
|
|
238
|
+
Measures robustness to input variation via bootstrap resampling.
|
|
239
|
+
|
|
240
|
+
**Parameters:**
|
|
241
|
+
- `X` - array of shape (n_samples, n_features)
|
|
242
|
+
- `n_splits` - number of bootstrap iterations
|
|
243
|
+
- `subsample_fraction` - fraction of samples per bootstrap
|
|
244
|
+
- `metric` - 'cosine' or 'correlation'
|
|
245
|
+
- `seed` - random seed for reproducibility
|
|
246
|
+
- `max_samples` - subsample if exceeded
|
|
247
|
+
|
|
248
|
+
**Returns:** float in [-1, 1], higher = more stable
|
|
249
|
+
|
|
250
|
+
### `shesha.anchor_stability(X, n_splits=30, n_anchors=100, n_per_split=200, metric='cosine', rank_normalize=True, seed=None, max_samples=1500)`
|
|
251
|
+
|
|
252
|
+
Measures stability of distance profiles from fixed anchor points.
|
|
253
|
+
|
|
254
|
+
**Parameters:**
|
|
255
|
+
- `X` - array of shape (n_samples, n_features)
|
|
256
|
+
- `n_splits` - number of random splits
|
|
257
|
+
- `n_anchors` - number of fixed anchor points
|
|
258
|
+
- `n_per_split` - samples per split
|
|
259
|
+
- `metric` - 'cosine' or 'euclidean'
|
|
260
|
+
- `rank_normalize` - rank-normalize distances within each anchor
|
|
261
|
+
- `seed` - random seed for reproducibility
|
|
262
|
+
- `max_samples` - subsample if exceeded
|
|
263
|
+
|
|
264
|
+
**Returns:** float in [-1, 1], higher = more stable
|
|
265
|
+
|
|
266
|
+
### `shesha.variance_ratio(X, y)`
|
|
267
|
+
|
|
268
|
+
Ratio of between-class to total variance.
|
|
269
|
+
|
|
270
|
+
**Parameters:**
|
|
271
|
+
- `X` - array of shape (n_samples, n_features)
|
|
272
|
+
- `y` - array of shape (n_samples,) with class labels
|
|
273
|
+
|
|
274
|
+
**Returns:** float in [0, 1], higher = better class separation
|
|
275
|
+
|
|
276
|
+
### `shesha.supervised_alignment(X, y, metric='correlation', seed=None, max_samples=300)`
|
|
277
|
+
|
|
278
|
+
Spearman correlation between model RDM and ideal label-based RDM.
|
|
279
|
+
|
|
280
|
+
**Parameters:**
|
|
281
|
+
- `X` - array of shape (n_samples, n_features)
|
|
282
|
+
- `y` - array of shape (n_samples,) with class labels
|
|
283
|
+
- `metric` - 'cosine' or 'correlation'
|
|
284
|
+
- `seed` - random seed for reproducibility
|
|
285
|
+
- `max_samples` - subsample if exceeded (RDM is O(n^2))
|
|
286
|
+
|
|
287
|
+
**Returns:** float in [-1, 1], higher = better task alignment
|
|
288
|
+
|
|
289
|
+
### `shesha.rdm_similarity(X, Y, method='spearman', metric='cosine')`
|
|
290
|
+
|
|
291
|
+
Computes RDM correlation between two representations. Useful for comparing models, tracking drift during training, or measuring the effect of interventions.
|
|
292
|
+
|
|
293
|
+
**Parameters:**
|
|
294
|
+
- `X` - array of shape (n_samples, n_features_x), first representation
|
|
295
|
+
- `Y` - array of shape (n_samples, n_features_y), second representation (same n_samples)
|
|
296
|
+
- `method` - 'spearman' (rank-based, default) or 'pearson' (linear)
|
|
297
|
+
- `metric` - 'cosine', 'correlation', or 'euclidean'
|
|
298
|
+
|
|
299
|
+
**Returns:** float in [-1, 1], higher = more similar geometric structure
|
|
300
|
+
|
|
301
|
+
### `shesha.rdm_drift(X, Y, method='spearman', metric='cosine')`
|
|
302
|
+
|
|
303
|
+
Computes representational drift as 1 - rdm_similarity. Useful for quantifying how much a representation has changed.
|
|
304
|
+
|
|
305
|
+
**Parameters:**
|
|
306
|
+
- `X` - array of shape (n_samples, n_features_x), baseline representation
|
|
307
|
+
- `Y` - array of shape (n_samples, n_features_y), comparison representation
|
|
308
|
+
- `method` - 'spearman' (rank-based, default) or 'pearson' (linear)
|
|
309
|
+
- `metric` - 'cosine', 'correlation', or 'euclidean'
|
|
310
|
+
|
|
311
|
+
**Returns:** float in [0, 2], where 0 = identical, 1 = uncorrelated, 2 = inverted
|
|
312
|
+
|
|
313
|
+
## Biological Perturbation Analysis
|
|
314
|
+
|
|
315
|
+
The `shesha.bio` module provides metrics for single-cell perturbation experiments (e.g., Perturb-seq, CRISPR screens).
|
|
316
|
+
|
|
317
|
+
### `shesha.bio.perturbation_stability(X_control, X_perturbed, metric='cosine', seed=None, max_samples=1000)`
|
|
318
|
+
|
|
319
|
+
Measures consistency of perturbation effects across samples. High values indicate coherent, reproducible perturbation effects.
|
|
320
|
+
|
|
321
|
+
**Parameters:**
|
|
322
|
+
- `X_control` - array of shape (n_control, n_features), control population
|
|
323
|
+
- `X_perturbed` - array of shape (n_perturbed, n_features), perturbed population
|
|
324
|
+
- `metric` - 'cosine' (default) or 'euclidean'
|
|
325
|
+
- `seed` - random seed for reproducibility
|
|
326
|
+
- `max_samples` - subsample perturbed population if exceeded
|
|
327
|
+
|
|
328
|
+
**Returns:** float in [-1, 1], higher = more consistent perturbation
|
|
329
|
+
|
|
330
|
+
### `shesha.bio.perturbation_effect_size(X_control, X_perturbed)`
|
|
331
|
+
|
|
332
|
+
Cohen's d-like effect size measuring magnitude of perturbation shift.
|
|
333
|
+
|
|
334
|
+
**Parameters:**
|
|
335
|
+
- `X_control` - array of shape (n_control, n_features)
|
|
336
|
+
- `X_perturbed` - array of shape (n_perturbed, n_features)
|
|
337
|
+
|
|
338
|
+
**Returns:** float >= 0, higher = larger perturbation effect
|
|
339
|
+
|
|
340
|
+
### Scanpy / AnnData Integration
|
|
341
|
+
|
|
342
|
+
For single-cell analysis, Shesha provides high-level wrappers that work directly with `AnnData` objects.
|
|
343
|
+
|
|
344
|
+
### `shesha.bio.compute_stability(adata, perturbation_key, control_label, layer=None, metric='cosine')`
|
|
345
|
+
|
|
346
|
+
Computes the geometric stability for every perturbation in the dataset.
|
|
347
|
+
|
|
348
|
+
**Parameters:**
|
|
349
|
+
- `adata` - AnnData object.
|
|
350
|
+
- `perturbation_key` - Column in `adata.obs` identifying the perturbation (e.g., `'guide_id'`).
|
|
351
|
+
- `control_label` - The label in that column representing control cells (e.g., `'NT'`).
|
|
352
|
+
- `layer` - (Optional) Layer to use (e.g., `'pca'`). If None, uses `.X`.
|
|
353
|
+
- `metric` - `'cosine'` (default) or `'euclidean'`.
|
|
354
|
+
|
|
355
|
+
**Returns:** Dictionary `{perturbation_name: stability_score}`.
|
|
356
|
+
|
|
357
|
+
### `shesha.bio.compute_magnitude(adata, perturbation_key, control_label, layer=None, metric='euclidean')`
|
|
358
|
+
|
|
359
|
+
Computes the magnitude (effect size) for every perturbation.
|
|
360
|
+
|
|
361
|
+
**Parameters:**
|
|
362
|
+
- `adata` - AnnData object.
|
|
363
|
+
- `metric` - `'euclidean'` (default, raw distance) or `'cohen'` (standardized effect size).
|
|
364
|
+
|
|
365
|
+
**Returns:** Dictionary `{perturbation_name: magnitude_score}`.
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
## Citation
|
|
369
|
+
|
|
370
|
+
If you use `shesha-geometry`, please cite:
|
|
371
|
+
```bibtex
|
|
372
|
+
@software{shesha2026,
|
|
373
|
+
title = {Shesha: Self-consistency Metrics for Representational Stability},
|
|
374
|
+
author = {Prashant C. Raju},
|
|
375
|
+
year = {2026},
|
|
376
|
+
url = {https://github.com/prashantcraju/shesha},
|
|
377
|
+
publisher = {Zenodo},
|
|
378
|
+
doi = {10.5281/zenodo.18227454},
|
|
379
|
+
note = {Python package version 0.1.0}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
@article{raju2026geometric,
|
|
383
|
+
title={Geometric Stability: The Missing Axis of Representations},
|
|
384
|
+
author={Prashant C. Raju},
|
|
385
|
+
journal={arXiv},
|
|
386
|
+
year={2026}
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## License
|
|
391
|
+
|
|
392
|
+
MIT
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
<sub>Logo generated by [Nano Banana Pro](https://nanobananapro.com)</sub>
|