beaver-db 0.19.2__tar.gz → 0.20.1__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.
Potentially problematic release.
This version of beaver-db might be problematic. Click here for more details.
- {beaver_db-0.19.2 → beaver_db-0.20.1}/PKG-INFO +1 -1
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/__init__.py +1 -1
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/blobs.py +36 -1
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/collections.py +39 -3
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/core.py +4 -4
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/dicts.py +36 -3
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/lists.py +37 -3
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/locks.py +20 -7
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/queues.py +38 -3
- beaver_db-0.20.1/docs/.gitignore +2 -0
- beaver_db-0.20.1/docs/.quarto/cites/index.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/dev-architecture.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/dev-concurrency.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/dev-contributing.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/dev-search.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/guide-collections.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/guide-concurrency.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/guide-deployment.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/guide-dicts-blobs.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/guide-lists-queues.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/guide-realtime.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/index.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/idx/quickstart.qmd.json +1 -0
- beaver_db-0.20.1/docs/.quarto/project-cache/08c652dc55400ed7625e092b14557eff +399 -0
- beaver_db-0.20.1/docs/.quarto/project-cache/78e7cce51608b23bc20ef50628d80ee9 +461 -0
- beaver_db-0.20.1/docs/.quarto/project-cache/deno-kv-file +0 -0
- beaver_db-0.20.1/docs/.quarto/project-cache/efb0c620c38ca7c31075f463c90f647b +461 -0
- beaver_db-0.20.1/docs/.quarto/xref/1e84074e +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/41b07c8e +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/4a9bbebe +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/57337df9 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/674e8fe6 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/6a721ef9 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/807a23ea +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/9c486562 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/INDEX +47 -0
- beaver_db-0.20.1/docs/.quarto/xref/b2f009dd +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/c40f73a8 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/cf0735bd +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/d7f66f00 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/f22e8d4c +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/f9d58622 +1 -0
- beaver_db-0.20.1/docs/.quarto/xref/fa9f9ca6 +1 -0
- beaver_db-0.20.1/docs/_book/dev-architecture.html +870 -0
- beaver_db-0.20.1/docs/_book/dev-concurrency.html +687 -0
- beaver_db-0.20.1/docs/_book/dev-contributing.html +675 -0
- beaver_db-0.20.1/docs/_book/dev-search.html +681 -0
- beaver_db-0.20.1/docs/_book/guide-collections.html +877 -0
- beaver_db-0.20.1/docs/_book/guide-concurrency.html +863 -0
- beaver_db-0.20.1/docs/_book/guide-deployment.html +869 -0
- beaver_db-0.20.1/docs/_book/guide-dicts-blobs.html +682 -0
- beaver_db-0.20.1/docs/_book/guide-lists-queues.html +865 -0
- beaver_db-0.20.1/docs/_book/guide-realtime.html +865 -0
- beaver_db-0.20.1/docs/_book/index.html +928 -0
- beaver_db-0.20.1/docs/_book/quickstart.html +795 -0
- beaver_db-0.20.1/docs/_book/search.json +200 -0
- beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-5d653dd4d7566aed16f42eb06e547978.min.css +12 -0
- beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-dark-5cc7fd2e95cc32b4ed915ed1d7e2d366.min.css +12 -0
- beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-icons.css +2078 -0
- beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-icons.woff +0 -0
- beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap.min.js +7 -0
- beaver_db-0.20.1/docs/_book/site_libs/clipboard/clipboard.min.js +7 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/anchor.min.js +9 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/popper.min.js +6 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/quarto-syntax-highlighting-dark-2b3e328b71be8d25427581baeb23079b.css +219 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/quarto-syntax-highlighting-de070a7b0ab54f8780927367ac907214.css +236 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/quarto.js +845 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/tabsets/tabsets.js +95 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/tippy.css +1 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-html/tippy.umd.min.js +2 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-nav/quarto-nav.js +325 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-search/autocomplete.umd.js +3 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-search/fuse.min.js +9 -0
- beaver_db-0.20.1/docs/_book/site_libs/quarto-search/quarto-search.js +1290 -0
- beaver_db-0.20.1/docs/_quarto.yml +64 -0
- beaver_db-0.20.1/docs/cover.png +0 -0
- beaver_db-0.20.1/docs/dev-architecture.qmd +15 -0
- beaver_db-0.20.1/docs/dev-concurrency.qmd +15 -0
- beaver_db-0.20.1/docs/dev-contributing.qmd +9 -0
- beaver_db-0.20.1/docs/dev-search.qmd +11 -0
- beaver_db-0.20.1/docs/guide-collections.qmd +20 -0
- beaver_db-0.20.1/docs/guide-concurrency.qmd +10 -0
- beaver_db-0.20.1/docs/guide-deployment.qmd +14 -0
- beaver_db-0.20.1/docs/guide-dicts-blobs.qmd +12 -0
- beaver_db-0.20.1/docs/guide-lists-queues.qmd +12 -0
- beaver_db-0.20.1/docs/guide-realtime.qmd +12 -0
- beaver_db-0.20.1/docs/index.qmd +89 -0
- beaver_db-0.20.1/docs/logo.png +0 -0
- beaver_db-0.20.1/docs/quickstart.qmd +120 -0
- beaver_db-0.20.1/issues/closed/10-expose-dblock-functionality-on-all-high-level-data-managers.md +86 -0
- beaver_db-0.20.1/issues/closed/11-a-new-issue-for-gabriel.md +8 -0
- beaver_db-0.20.1/logo.png +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/pyproject.toml +1 -1
- {beaver_db-0.19.2 → beaver_db-0.20.1}/.dockerignore +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/.gitignore +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/.python-version +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/LICENSE +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/README.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/channels.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/cli.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/logs.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/server.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/types.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/vectors.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/design.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/dockerfile +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1/docs/_book}/logo.png +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/async_pubsub.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/blobs.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/cache.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/fts.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/fuzzy.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/general_test.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/graph.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/kvstore.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/list.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/locks.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/logs.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/pqueue.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/producer_consumer.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/publisher.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/pubsub.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/rerank.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/stress_vectors.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/subscriber.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/textual_chat.css +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/textual_chat.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/type_hints.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/vector.py +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/2-comprehensive-async-wrappers.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/6-drop-in-replacement-for-beaver-rest-server-client.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/7-replace-faiss-with-simpler-linear-numpy-vectorial-search.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/9-type-safe-wrappers-based-on-pydantic-compatible-models.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/closed/1-refactor-vector-store-to-use-faiss.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/closed/5-add-dblock-for-inter-process-synchronization.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/closed/8-first-class-synchronization-primitive.md +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/makefile +0 -0
- {beaver_db-0.19.2 → beaver_db-0.20.1}/uv.lock +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sqlite3
|
|
3
3
|
from typing import Any, Dict, Iterator, NamedTuple, Optional, Type, TypeVar
|
|
4
|
-
|
|
5
4
|
from .types import JsonSerializable, IDatabase
|
|
5
|
+
from .locks import LockManager
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class Blob[M](NamedTuple):
|
|
@@ -16,10 +16,13 @@ class Blob[M](NamedTuple):
|
|
|
16
16
|
class BlobManager[M]:
|
|
17
17
|
"""A wrapper providing a Pythonic interface to a blob store in the database."""
|
|
18
18
|
|
|
19
|
+
# In beaver/blobs.py, inside class BlobManager[M]:
|
|
19
20
|
def __init__(self, name: str, db: IDatabase, model: Type[M] | None = None):
|
|
20
21
|
self._name = name
|
|
21
22
|
self._db = db
|
|
22
23
|
self._model = model
|
|
24
|
+
lock_name = f"__lock__blob__{name}"
|
|
25
|
+
self._lock = LockManager(db, lock_name)
|
|
23
26
|
|
|
24
27
|
def _serialize(self, value: M) -> str | None:
|
|
25
28
|
"""Serializes the given value to a JSON string."""
|
|
@@ -135,3 +138,35 @@ class BlobManager[M]:
|
|
|
135
138
|
|
|
136
139
|
def __repr__(self) -> str:
|
|
137
140
|
return f"BlobManager(name='{self._name}')"
|
|
141
|
+
|
|
142
|
+
def acquire(
|
|
143
|
+
self,
|
|
144
|
+
timeout: Optional[float] = None,
|
|
145
|
+
lock_ttl: Optional[float] = None,
|
|
146
|
+
poll_interval: Optional[float] = None,
|
|
147
|
+
) -> "BlobManager[M]":
|
|
148
|
+
"""
|
|
149
|
+
Acquires an inter-process lock on this blob store, blocking until acquired.
|
|
150
|
+
|
|
151
|
+
Parameters override the default settings of the underlying LockManager.
|
|
152
|
+
"""
|
|
153
|
+
self._lock.acquire(
|
|
154
|
+
timeout=timeout,
|
|
155
|
+
lock_ttl=lock_ttl,
|
|
156
|
+
poll_interval=poll_interval
|
|
157
|
+
)
|
|
158
|
+
return self
|
|
159
|
+
|
|
160
|
+
def release(self):
|
|
161
|
+
"""
|
|
162
|
+
Releases the inter-process lock on this blob store.
|
|
163
|
+
"""
|
|
164
|
+
self._lock.release()
|
|
165
|
+
|
|
166
|
+
def __enter__(self) -> "BlobManager[M]":
|
|
167
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
168
|
+
return self.acquire()
|
|
169
|
+
|
|
170
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
171
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
172
|
+
self.release()
|
|
@@ -3,15 +3,16 @@ import sqlite3
|
|
|
3
3
|
import threading
|
|
4
4
|
import uuid
|
|
5
5
|
from enum import Enum
|
|
6
|
-
from typing import Any, Iterator, List, Literal, Tuple, Type, TypeVar
|
|
6
|
+
from typing import Any, Iterator, List, Literal, Tuple, Type, TypeVar, Optional
|
|
7
7
|
from .types import Model, stub, IDatabase
|
|
8
|
+
from .locks import LockManager
|
|
8
9
|
|
|
9
10
|
try:
|
|
10
11
|
import numpy as np
|
|
11
12
|
from .vectors import VectorIndex
|
|
12
13
|
except ImportError:
|
|
13
|
-
np = stub("This feature requires to install beaver-db[
|
|
14
|
-
VectorIndex = stub("This feature requires to install beaver-db[
|
|
14
|
+
np = stub("This feature requires to install beaver-db[vector]")()
|
|
15
|
+
VectorIndex = stub("This feature requires to install beaver-db[vector]")
|
|
15
16
|
|
|
16
17
|
# --- Fuzzy Search Helper Functions ---
|
|
17
18
|
|
|
@@ -135,6 +136,9 @@ class CollectionManager[D: Document]:
|
|
|
135
136
|
self._compaction_lock = threading.Lock()
|
|
136
137
|
self._compaction_thread: threading.Thread | None = None
|
|
137
138
|
|
|
139
|
+
lock_name = f"__lock__collection__{name}"
|
|
140
|
+
self._lock = LockManager(db, lock_name)
|
|
141
|
+
|
|
138
142
|
def _flatten_metadata(self, metadata: dict, prefix: str = "") -> dict[str, Any]:
|
|
139
143
|
"""Flattens a nested dictionary for indexing."""
|
|
140
144
|
flat_dict = {}
|
|
@@ -643,6 +647,38 @@ class CollectionManager[D: Document]:
|
|
|
643
647
|
cursor.close()
|
|
644
648
|
return count
|
|
645
649
|
|
|
650
|
+
def acquire(
|
|
651
|
+
self,
|
|
652
|
+
timeout: Optional[float] = None,
|
|
653
|
+
lock_ttl: Optional[float] = None,
|
|
654
|
+
poll_interval: Optional[float] = None,
|
|
655
|
+
) -> "CollectionManager[D]":
|
|
656
|
+
"""
|
|
657
|
+
Acquires an inter-process lock on this collection, blocking until acquired.
|
|
658
|
+
This guarantees exclusive access for multi-step atomic operations
|
|
659
|
+
(e.g., index + connect).
|
|
660
|
+
|
|
661
|
+
Parameters override the default settings of the underlying LockManager.
|
|
662
|
+
"""
|
|
663
|
+
self._lock.acquire(
|
|
664
|
+
timeout=timeout, lock_ttl=lock_ttl, poll_interval=poll_interval
|
|
665
|
+
)
|
|
666
|
+
return self
|
|
667
|
+
|
|
668
|
+
def release(self):
|
|
669
|
+
"""
|
|
670
|
+
Releases the inter-process lock on this collection.
|
|
671
|
+
"""
|
|
672
|
+
self._lock.release()
|
|
673
|
+
|
|
674
|
+
def __enter__(self) -> "CollectionManager[D]":
|
|
675
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
676
|
+
return self.acquire()
|
|
677
|
+
|
|
678
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
679
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
680
|
+
self.release()
|
|
681
|
+
|
|
646
682
|
|
|
647
683
|
def rerank[D: Document](
|
|
648
684
|
*results: list[D], weights: list[float] | None = None, k: int = 60
|
|
@@ -167,7 +167,7 @@ class BeaverDB:
|
|
|
167
167
|
"""Creates the table to store the serialized base ANN index."""
|
|
168
168
|
self.connection.execute(
|
|
169
169
|
"""
|
|
170
|
-
CREATE TABLE IF NOT EXISTS
|
|
170
|
+
CREATE TABLE IF NOT EXISTS beaver_ann_indexes (
|
|
171
171
|
collection_name TEXT PRIMARY KEY,
|
|
172
172
|
index_data BLOB,
|
|
173
173
|
base_index_version INTEGER NOT NULL DEFAULT 0
|
|
@@ -179,7 +179,7 @@ class BeaverDB:
|
|
|
179
179
|
"""Creates the log for new vector additions."""
|
|
180
180
|
self.connection.execute(
|
|
181
181
|
"""
|
|
182
|
-
CREATE TABLE IF NOT EXISTS
|
|
182
|
+
CREATE TABLE IF NOT EXISTS beaver_ann_pending_log (
|
|
183
183
|
collection_name TEXT NOT NULL,
|
|
184
184
|
str_id TEXT NOT NULL,
|
|
185
185
|
PRIMARY KEY (collection_name, str_id)
|
|
@@ -191,7 +191,7 @@ class BeaverDB:
|
|
|
191
191
|
"""Creates the log for vector deletions (tombstones)."""
|
|
192
192
|
self.connection.execute(
|
|
193
193
|
"""
|
|
194
|
-
CREATE TABLE IF NOT EXISTS
|
|
194
|
+
CREATE TABLE IF NOT EXISTS beaver_ann_deletions_log (
|
|
195
195
|
collection_name TEXT NOT NULL,
|
|
196
196
|
int_id INTEGER NOT NULL,
|
|
197
197
|
PRIMARY KEY (collection_name, int_id)
|
|
@@ -203,7 +203,7 @@ class BeaverDB:
|
|
|
203
203
|
"""Creates the table to map string IDs to integer IDs for Faiss."""
|
|
204
204
|
self.connection.execute(
|
|
205
205
|
"""
|
|
206
|
-
CREATE TABLE IF NOT EXISTS
|
|
206
|
+
CREATE TABLE IF NOT EXISTS beaver_ann_id_mapping (
|
|
207
207
|
collection_name TEXT NOT NULL,
|
|
208
208
|
str_id TEXT NOT NULL,
|
|
209
209
|
int_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sqlite3
|
|
3
3
|
import time
|
|
4
|
-
from typing import Any, Iterator, Tuple, Type
|
|
5
|
-
|
|
4
|
+
from typing import Any, Iterator, Tuple, Type, Optional
|
|
6
5
|
from .types import JsonSerializable, IDatabase
|
|
6
|
+
from .locks import LockManager
|
|
7
7
|
|
|
8
8
|
class DictManager[T]:
|
|
9
9
|
"""A wrapper providing a Pythonic interface to a dictionary in the database."""
|
|
@@ -12,6 +12,8 @@ class DictManager[T]:
|
|
|
12
12
|
self._name = name
|
|
13
13
|
self._db = db
|
|
14
14
|
self._model = model
|
|
15
|
+
lock_name = f"__lock__dict__{name}"
|
|
16
|
+
self._lock = LockManager(db, lock_name)
|
|
15
17
|
|
|
16
18
|
def _serialize(self, value: T) -> str:
|
|
17
19
|
"""Serializes the given value to a JSON string."""
|
|
@@ -147,4 +149,35 @@ class DictManager[T]:
|
|
|
147
149
|
cursor.close()
|
|
148
150
|
|
|
149
151
|
def __repr__(self) -> str:
|
|
150
|
-
return f"DictManager(name='{self._name}')"
|
|
152
|
+
return f"DictManager(name='{self._name}')"
|
|
153
|
+
|
|
154
|
+
def acquire(
|
|
155
|
+
self,
|
|
156
|
+
timeout: Optional[float] = None,
|
|
157
|
+
lock_ttl: Optional[float] = None,
|
|
158
|
+
poll_interval: Optional[float] = None,
|
|
159
|
+
) -> "DictManager[T]":
|
|
160
|
+
"""
|
|
161
|
+
Acquires an inter-process lock on this dictionary, blocking until acquired.
|
|
162
|
+
Parameters override the default settings of the underlying LockManager.
|
|
163
|
+
"""
|
|
164
|
+
self._lock.acquire(
|
|
165
|
+
timeout=timeout,
|
|
166
|
+
lock_ttl=lock_ttl,
|
|
167
|
+
poll_interval=poll_interval
|
|
168
|
+
)
|
|
169
|
+
return self
|
|
170
|
+
|
|
171
|
+
def release(self):
|
|
172
|
+
"""
|
|
173
|
+
Releases the inter-process lock on this dictionary.
|
|
174
|
+
"""
|
|
175
|
+
self._lock.release()
|
|
176
|
+
|
|
177
|
+
def __enter__(self) -> "DictManager[T]":
|
|
178
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
179
|
+
return self.acquire()
|
|
180
|
+
|
|
181
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
182
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
183
|
+
self.release()
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sqlite3
|
|
3
|
-
from typing import Any, Iterator, Type, Union
|
|
4
|
-
|
|
3
|
+
from typing import Any, Iterator, Type, Union, Optional
|
|
5
4
|
from .types import JsonSerializable, IDatabase
|
|
5
|
+
from .locks import LockManager
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class ListManager[T]:
|
|
@@ -12,6 +12,8 @@ class ListManager[T]:
|
|
|
12
12
|
self._name = name
|
|
13
13
|
self._db = db
|
|
14
14
|
self._model = model
|
|
15
|
+
lock_name = f"__lock__list__{name}"
|
|
16
|
+
self._lock = LockManager(db, lock_name)
|
|
15
17
|
|
|
16
18
|
def _serialize(self, value: T) -> str:
|
|
17
19
|
"""Serializes the given value to a JSON string."""
|
|
@@ -261,4 +263,36 @@ class ListManager[T]:
|
|
|
261
263
|
cursor.execute(
|
|
262
264
|
"DELETE FROM beaver_lists WHERE rowid = ?", (rowid_to_delete,)
|
|
263
265
|
)
|
|
264
|
-
return self._deserialize(value_to_return)
|
|
266
|
+
return self._deserialize(value_to_return)
|
|
267
|
+
|
|
268
|
+
def acquire(
|
|
269
|
+
self,
|
|
270
|
+
timeout: Optional[float] = None,
|
|
271
|
+
lock_ttl: Optional[float] = None,
|
|
272
|
+
poll_interval: Optional[float] = None,
|
|
273
|
+
) -> "ListManager[T]":
|
|
274
|
+
"""
|
|
275
|
+
Acquires an inter-process lock on this list, blocking until acquired.
|
|
276
|
+
|
|
277
|
+
Parameters override the default settings of the underlying LockManager.
|
|
278
|
+
"""
|
|
279
|
+
self._lock.acquire(
|
|
280
|
+
timeout=timeout,
|
|
281
|
+
lock_ttl=lock_ttl,
|
|
282
|
+
poll_interval=poll_interval
|
|
283
|
+
)
|
|
284
|
+
return self
|
|
285
|
+
|
|
286
|
+
def release(self):
|
|
287
|
+
"""
|
|
288
|
+
Releases the inter-process lock on this list, allowing the next waiting process access.
|
|
289
|
+
"""
|
|
290
|
+
self._lock.release()
|
|
291
|
+
|
|
292
|
+
def __enter__(self) -> "ListManager[T]":
|
|
293
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
294
|
+
return self.acquire()
|
|
295
|
+
|
|
296
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
297
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
298
|
+
self.release()
|
|
@@ -55,7 +55,11 @@ class LockManager:
|
|
|
55
55
|
self._waiter_id = f"pid:{os.getpid()}:id:{uuid.uuid4()}"
|
|
56
56
|
self._acquired = False # State to track if this instance holds the lock
|
|
57
57
|
|
|
58
|
-
def acquire(self
|
|
58
|
+
def acquire(self,
|
|
59
|
+
timeout: float|None = None,
|
|
60
|
+
lock_ttl: float |None = None,
|
|
61
|
+
poll_interval: float |None = None,
|
|
62
|
+
) -> "LockManager":
|
|
59
63
|
"""
|
|
60
64
|
Blocks until the lock is acquired or the timeout expires.
|
|
61
65
|
|
|
@@ -66,9 +70,18 @@ class LockManager:
|
|
|
66
70
|
# This instance already holds the lock
|
|
67
71
|
return self
|
|
68
72
|
|
|
73
|
+
if timeout is None:
|
|
74
|
+
timeout = self._timeout
|
|
75
|
+
|
|
76
|
+
if lock_ttl is None:
|
|
77
|
+
lock_ttl = self._lock_ttl
|
|
78
|
+
|
|
79
|
+
if poll_interval is None:
|
|
80
|
+
poll_interval = self._poll_interval
|
|
81
|
+
|
|
69
82
|
start_time = time.time()
|
|
70
83
|
requested_at = time.time()
|
|
71
|
-
expires_at = requested_at +
|
|
84
|
+
expires_at = requested_at + lock_ttl
|
|
72
85
|
|
|
73
86
|
conn = self._db.connection
|
|
74
87
|
|
|
@@ -113,19 +126,19 @@ class LockManager:
|
|
|
113
126
|
return self
|
|
114
127
|
|
|
115
128
|
# 5. Check for timeout
|
|
116
|
-
if
|
|
117
|
-
if (time.time() - start_time) >
|
|
129
|
+
if timeout is not None:
|
|
130
|
+
if (time.time() - start_time) > timeout:
|
|
118
131
|
# We timed out. Remove ourselves from the queue and raise.
|
|
119
132
|
self._release_from_queue()
|
|
120
133
|
raise TimeoutError(
|
|
121
|
-
f"Failed to acquire lock '{self._lock_name}' within {
|
|
134
|
+
f"Failed to acquire lock '{self._lock_name}' within {timeout}s."
|
|
122
135
|
)
|
|
123
136
|
|
|
124
137
|
# 6. Wait politely before polling again
|
|
125
138
|
# Add +/- 10% jitter to the poll interval to avoid thundering herd
|
|
126
|
-
jitter =
|
|
139
|
+
jitter = poll_interval * 0.1
|
|
127
140
|
sleep_time = random.uniform(
|
|
128
|
-
|
|
141
|
+
poll_interval - jitter, poll_interval + jitter
|
|
129
142
|
)
|
|
130
143
|
time.sleep(sleep_time)
|
|
131
144
|
|
|
@@ -2,10 +2,9 @@ import asyncio
|
|
|
2
2
|
import json
|
|
3
3
|
import sqlite3
|
|
4
4
|
import time
|
|
5
|
-
from typing import Any, Literal, NamedTuple, Type, overload
|
|
6
|
-
|
|
5
|
+
from typing import Any, Literal, NamedTuple, Type, overload, Optional
|
|
7
6
|
from .types import JsonSerializable, IDatabase
|
|
8
|
-
|
|
7
|
+
from .locks import LockManager
|
|
9
8
|
|
|
10
9
|
class QueueItem[T](NamedTuple):
|
|
11
10
|
"""A data class representing a single item retrieved from the queue."""
|
|
@@ -54,6 +53,8 @@ class QueueManager[T]:
|
|
|
54
53
|
self._name = name
|
|
55
54
|
self._db = db
|
|
56
55
|
self._model = model
|
|
56
|
+
lock_name = f"__lock__queue__{name}"
|
|
57
|
+
self._lock = LockManager(db, lock_name)
|
|
57
58
|
|
|
58
59
|
def _serialize(self, value: T) -> str:
|
|
59
60
|
"""Serializes the given value to a JSON string."""
|
|
@@ -184,3 +185,37 @@ class QueueManager[T]:
|
|
|
184
185
|
|
|
185
186
|
def __repr__(self) -> str:
|
|
186
187
|
return f"QueueManager(name='{self._name}')"
|
|
188
|
+
|
|
189
|
+
def acquire(
|
|
190
|
+
self,
|
|
191
|
+
timeout: Optional[float] = None,
|
|
192
|
+
lock_ttl: Optional[float] = None,
|
|
193
|
+
poll_interval: Optional[float] = None,
|
|
194
|
+
) -> "QueueManager[T]":
|
|
195
|
+
"""
|
|
196
|
+
Acquires an inter-process lock on this queue, blocking until acquired.
|
|
197
|
+
This ensures that a sequence of operations (e.g., batch-getting tasks)
|
|
198
|
+
is performed atomically without interruption from other processes.
|
|
199
|
+
|
|
200
|
+
Parameters override the default settings of the underlying LockManager.
|
|
201
|
+
"""
|
|
202
|
+
self._lock.acquire(
|
|
203
|
+
timeout=timeout,
|
|
204
|
+
lock_ttl=lock_ttl,
|
|
205
|
+
poll_interval=poll_interval
|
|
206
|
+
)
|
|
207
|
+
return self
|
|
208
|
+
|
|
209
|
+
def release(self):
|
|
210
|
+
"""
|
|
211
|
+
Releases the inter-process lock on this queue.
|
|
212
|
+
"""
|
|
213
|
+
self._lock.release()
|
|
214
|
+
|
|
215
|
+
def __enter__(self) -> "QueueManager[T]":
|
|
216
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
217
|
+
return self.acquire()
|
|
218
|
+
|
|
219
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
220
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
221
|
+
self.release()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"dev-architecture.qmd":[],"dev-concurrency.qmd":[],"dev-contributing.qmd":[],"dev-search.qmd":[],"guide-collections.qmd":[],"guide-concurrency.qmd":[],"guide-deployment.qmd":[],"guide-dicts-blobs.qmd":[],"guide-lists-queues.qmd":[],"guide-realtime.qmd":[],"index.qmd":[],"intro.qmd":["knuth84"],"quickstart.qmd":[],"references.qmd":[],"summary.qmd":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"title":"Core Architecture & Design","markdown":{"headingText":"Core Architecture & Design","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **9.1. Guiding Principles (Developer Focus)**\n * A deeper dive into the \"Why\" from `design.md`.\n * Standard SQLite Compatibility as a \"no-magic\" rule.\n * Convention over Configuration.\n* **9.2. The Manager Delegation Pattern**\n * How `BeaverDB` acts as a factory.\n * How managers (e.g., `DictManager`) are initialized with a reference to the core `BeaverDB` connection pool.\n * How all tables are prefixed with `beaver_` to avoid user-space conflicts.\n* **9.3. Type-Safe Models (`beaver.Model`)**\n * Using the `model=...` parameter for automatic serialization and deserialization.\n * Inheriting from `beaver.Model` for a lightweight, Pydantic-compatible solution.\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-architecture.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-architecture.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"title":"Concurrency Model","markdown":{"headingText":"Concurrency Model","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **10.1. Thread Safety (`threading.local`)**\n * How BeaverDB provides a unique `sqlite3.Connection` for *every thread*.\n * Why this is the key to preventing thread-related errors.\n * Enabling WAL (Write-Ahead Logging) for concurrent reads.\n* **10.2. Inter-Process Locking (The Implementation)**\n * How `db.lock()` works under the hood.\n * The `beaver_lock_waiters` table as a fair (FIFO) queue.\n * The `expires_at` column as a deadlock-prevention (TTL) mechanism.\n* **10.3. The Asynchronous `.as_async()` Pattern**\n * How the `Async...Manager` wrappers are implemented.\n * Using `asyncio.to_thread` to run blocking I/O without blocking the event loop.\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-concurrency.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-concurrency.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"title":"Future Roadmap & Contributing","markdown":{"headingText":"Future Roadmap & Contributing","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **12.1. The Future of BeaverDB**\n * The `BeaverClient` as a drop-in network client.\n * Replacing `faiss` with a simpler, pure-`numpy` linear search.\n* **12.2. How to Contribute**\n * (Standard contribution guidelines, linking to Makefile, etc.)\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-contributing.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-contributing.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"title":"Search Architecture","markdown":{"headingText":"Search Architecture","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **11.1. Vector Search (ANN) Internals**\n * The \"Hybrid Index System\": Base Index and Delta Index.\n * **Crash-Safe Logging:** How additions and deletions are written to SQLite logs (`_beaver_ann_...` tables).\n * **Background Compaction:** The `compact()` process.\n* **11.2. Text Search (FTS & Fuzzy) Internals**\n * **FTS:** How `beaver_fts_index` is a `fts5` virtual table.\n * **Fuzzy Search:** How BeaverDB builds a custom trigram index (`beaver_trigrams` table) and uses Levenshtein distance.\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-search.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-search.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
|