Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
ac10788
add sphere tab an split_pane
Vlad-Kor Oct 9, 2025
e30cca6
basic vtk sphere test
Vlad-Kor Oct 10, 2025
05eeeaf
added plotly sphere plot and rendering of samples (points)
Vlad-Kor Oct 10, 2025
f7c0e15
added random sampling for sphere and plugin based sampler loading
Vlad-Kor Oct 13, 2025
cd65714
added basic torus rendering and dummy torus distribution
Vlad-Kor Oct 14, 2025
d19837e
added random sampling for torus
Vlad-Kor Oct 14, 2025
e4d126c
refractor rendering of sphere and torus into common 3dRenderer
Vlad-Kor Oct 15, 2025
9c1db4b
added von mises fisher (via scypy)
Vlad-Kor Oct 15, 2025
0bbd8de
fix docker
Vlad-Kor Oct 15, 2025
9204c41
refractored code so that distributions can have multiple sampling met…
Vlad-Kor Oct 16, 2025
c05b6b6
make slider allow drag updates
Vlad-Kor Oct 16, 2025
21735ce
comment out sphere_vtk test for now
Vlad-Kor Oct 16, 2025
6843efd
added density function rendering for sphere
Vlad-Kor Oct 16, 2025
0913cf6
fix trisurf crash
Vlad-Kor Oct 17, 2025
ad6b1f9
bup Werkzeug version
Vlad-Kor Oct 17, 2025
f4e5f04
performance improvements: introduce patched updates and vectorized ca…
Vlad-Kor Oct 20, 2025
1b88e61
use poetry for dependecies
Vlad-Kor Oct 20, 2025
ff57bcd
added docker compose and end-to-end testcases
Vlad-Kor Oct 20, 2025
094ef66
fix outdated comment
Vlad-Kor Oct 20, 2025
6b19253
add github action test workflow
Vlad-Kor Oct 21, 2025
7d3eadf
update doc and lower thread count
Vlad-Kor Oct 21, 2025
ecc2eaf
new server ips
Vlad-Kor Oct 21, 2025
d2d2b1c
added a bunch of distributions from sphstat
Vlad-Kor Oct 22, 2025
293b102
fix patch
Vlad-Kor Oct 23, 2025
be275ba
add pyRecEst as dependency
Vlad-Kor Oct 23, 2025
4bb9628
pyRecEst: use tag instead of commit hash
Vlad-Kor Oct 23, 2025
da5f4b9
update poetry.lock
Vlad-Kor Oct 24, 2025
0bf2105
fix legend
Vlad-Kor Oct 24, 2025
6f3b4e9
update requirements.txt and remove readme.txt because it is outdated
Vlad-Kor Oct 24, 2025
d53cee8
add fibonachi latice to uniform and mises fischer
Vlad-Kor Oct 24, 2025
793388a
use new fibonacci latices for mesh generation
Vlad-Kor Oct 24, 2025
c1d5927
changed slider opt amount
Vlad-Kor Oct 24, 2025
2b3c977
add norming for von miser
Vlad-Kor Oct 27, 2025
a6f0e06
addaptive sample marker size
Vlad-Kor Oct 27, 2025
ebbfed6
black border around samples
Vlad-Kor Oct 27, 2025
423108e
fix passing config the wrong way
Vlad-Kor Oct 27, 2025
7f4f5b6
fixed distributions and other minor changes
Vlad-Kor Oct 28, 2025
a42ffff
finally fix css
Vlad-Kor Oct 29, 2025
0b7dedc
put legend inside plot area
Vlad-Kor Oct 29, 2025
871a6d5
simplify kent parameters
Vlad-Kor Oct 29, 2025
301f005
added bingham pdf
Vlad-Kor Oct 29, 2025
8227e7b
added watson and scaling
Vlad-Kor Oct 29, 2025
79881b3
begin implementation of kent pdf
Vlad-Kor Oct 29, 2025
4a9edb2
add fibonacci to watson
Vlad-Kor Oct 30, 2025
30f11f1
added mode switching to torus
Vlad-Kor Oct 31, 2025
3f545fe
add basic samples plotting in torus 2d
Vlad-Kor Oct 31, 2025
57b4f81
remove weird buttons on 2d plot
Vlad-Kor Oct 31, 2025
bceb41d
added logslider for sample and mises kappa
Vlad-Kor Nov 3, 2025
1bf1c3e
make sample size be affected by device pixel ratio
Vlad-Kor Nov 3, 2025
5eb8c7b
fix kent
Vlad-Kor Nov 5, 2025
bdbd8d4
change resolution ob 3d objects
Vlad-Kor Nov 5, 2025
07a5f02
add aditional method for watson fibonachi computation via inverse ode
Vlad-Kor Nov 7, 2025
a9508fc
add benchmark of different methods
Vlad-Kor Nov 10, 2025
2ffe8d6
added doc how to run
Vlad-Kor Nov 10, 2025
80436c4
fix bug
Vlad-Kor Nov 10, 2025
1eced99
adjust values
Vlad-Kor Nov 10, 2025
ff4243f
add plot title
Vlad-Kor Nov 10, 2025
981786f
fix bug in fibonachi event thingy
Vlad-Kor Nov 10, 2025
df26c58
fix duplicate benchmark names
Vlad-Kor Nov 11, 2025
2bdd4ff
fix more duplicate titles
Vlad-Kor Nov 11, 2025
0334155
abstrct 2dplotsettings
Vlad-Kor Nov 11, 2025
44040aa
added locking aspect ratio
Vlad-Kor Nov 11, 2025
9e7c817
implement periodicity
Vlad-Kor Nov 11, 2025
676f166
fix benchmark label bug
Vlad-Kor Nov 11, 2025
63ec3c0
output image instead of opening browser
Vlad-Kor Nov 11, 2025
43f4d8a
write html as fallback
Vlad-Kor Nov 11, 2025
853cdb9
choose better strat based on benchmarks
Vlad-Kor Nov 13, 2025
1ddcc9e
fix error due to orjson being pulled in
Vlad-Kor Nov 13, 2025
710b1c8
increasy accuracy of the inverse interpolation method
Vlad-Kor Nov 13, 2025
3711bc4
add how to tune before benchmark
Vlad-Kor Nov 13, 2025
13cd7c0
adjust titles
Vlad-Kor Nov 13, 2025
5e2f41f
also add in corners for 2d periodicity
Vlad-Kor Nov 13, 2025
40e3dec
fix avoid importing the benchmarks automaticaly
Vlad-Kor Nov 13, 2025
9741567
introduce cylinder manifold
Vlad-Kor Nov 17, 2025
f76d95d
added fibonacci kronecker to cylinder
Vlad-Kor Nov 17, 2025
9221818
added fibonacci rank 1 lattice
Vlad-Kor Nov 17, 2025
7ae8560
add mesh to cylinder
Vlad-Kor Nov 17, 2025
95bec19
added mesh to torus
Vlad-Kor Nov 18, 2025
9a18162
fix initial marker size
Vlad-Kor Nov 19, 2025
5383d33
added the ability to dynamically render markdown
Vlad-Kor Nov 20, 2025
7a0814d
add "warning" css for blockquote
Vlad-Kor Nov 20, 2025
c97b3cb
add kronecker to torus with warning
Vlad-Kor Nov 20, 2025
831a754
update gitigonre
Vlad-Kor Nov 24, 2025
bb86744
implement partially wraped random sampling
Vlad-Kor Nov 24, 2025
9e987d5
added pdf to partially wraped
Vlad-Kor Nov 24, 2025
cce154f
implement wrapped gauss on torus
Vlad-Kor Nov 24, 2025
aeaf2d5
implement pdf for wrapped gaussian
Vlad-Kor Nov 24, 2025
71138ff
added heatmap to 2d plot
Vlad-Kor Nov 24, 2025
b74661e
add cartesian grid for uniform
Vlad-Kor Nov 25, 2025
ddf5258
allow singular in wrapped and partially wrapped
Vlad-Kor Nov 25, 2025
f18b844
added von mises cartesian
Vlad-Kor Nov 25, 2025
96afec4
added cartesian watson
Vlad-Kor Nov 25, 2025
e6e9c94
use rank-1 fib for torus mesh
Vlad-Kor Nov 26, 2025
82c5c9c
added fibonachi for wrapped gaussian
Vlad-Kor Nov 26, 2025
2af57b4
added slider manual input
Vlad-Kor Nov 26, 2025
e6b71f2
added manual input to every samplecount slider
Vlad-Kor Nov 26, 2025
aaa5b1d
fix bugs with manual input
Vlad-Kor Nov 26, 2025
f471254
make cylinder flat at the top
Vlad-Kor Nov 27, 2025
029ccb9
bump export image res
Vlad-Kor Nov 27, 2025
80c833b
fixed view moving on update
Vlad-Kor Nov 27, 2025
068a867
added pi slider
Vlad-Kor Nov 27, 2025
8dc7e5b
added mean for partialy warpped and wrapped
Vlad-Kor Nov 27, 2025
76e9856
added more fib and cartesian to pwn and wn
Vlad-Kor Nov 28, 2025
d32c33b
fix objects not being completely stateless
Vlad-Kor Dec 1, 2025
8804441
removed warning from external library by switching own fork
Vlad-Kor Dec 1, 2025
3801824
changed wrong name
Vlad-Kor Dec 2, 2025
af4102e
make images even larger
Vlad-Kor Dec 2, 2025
d284cba
adjust grid to 0-1 instead of 0-2pi
Vlad-Kor Dec 3, 2025
4a9ac73
changed comment about samples overlapping
Vlad-Kor Dec 3, 2025
ba2535b
added new layout to gaus1d gaus2d and conditional
Vlad-Kor Dec 4, 2025
ab3b1c7
use newton for erfi_inf
Vlad-Kor Dec 5, 2025
34f6544
improve mobile support
Vlad-Kor Dec 5, 2025
1ea16a6
Fib-Kronecker: start counting at 1 on golden ratio axis
Vlad-Kor Dec 8, 2025
aa143cd
Fibonacci-Rank-1: remove first index, sample at 0
Vlad-Kor Dec 8, 2025
3e8fa45
export as jpeg
Vlad-Kor Dec 8, 2025
f4ba904
added crash resistance for dynamic module loading
Vlad-Kor Dec 8, 2025
841f852
added logarithmix plots in benchmark results
Vlad-Kor Dec 8, 2025
4665e76
rename renderer and add abstract renderer Class
Vlad-Kor Dec 8, 2025
b8486b6
refractor gaus1d
Vlad-Kor Dec 8, 2025
3392247
move gaus1d info into md file
Vlad-Kor Dec 8, 2025
ef602fa
refractor gauss2d
Vlad-Kor Dec 8, 2025
b5962f3
refractored conditional
Vlad-Kor Dec 8, 2025
ef889fc
update requirements.txt
Vlad-Kor Dec 8, 2025
a24984a
added favicon.ico
Vlad-Kor Dec 8, 2025
5d179a1
update comment
Vlad-Kor Dec 8, 2025
90b66c5
fix artefact
Vlad-Kor Dec 11, 2025
b8fd9d5
added angle to gaus2d
Vlad-Kor Dec 17, 2025
e84e5ce
added deterministic gauss library
Vlad-Kor Dec 18, 2025
d2aa33b
added frolov to pwn
Vlad-Kor Dec 18, 2025
ffbaff6
added frolov to wn
Vlad-Kor Dec 18, 2025
3c8a992
fix wrap on wm
Vlad-Kor Dec 18, 2025
34ab8e9
changed the changelog
Vlad-Kor Jan 11, 2026
387df92
changed color scheme
Vlad-Kor Jan 11, 2026
60dcd09
change colorscale again for more contrast
Vlad-Kor Jan 13, 2026
3e944e6
added fibonacci frolov
Vlad-Kor Jan 13, 2026
fdcde6e
added frolov to gaus2d
Vlad-Kor Jan 13, 2026
5491ec6
bump library version
Vlad-Kor Jan 13, 2026
628976f
update lib
Vlad-Kor Jan 14, 2026
0dedf27
add cholesky/eigen switch back to frolov samples
Vlad-Kor Jan 14, 2026
8c37a08
dont do covariance correction on frolov
Vlad-Kor Jan 14, 2026
0a97ab8
fixed manual input on multi-worker systems
Vlad-Kor Jan 15, 2026
1182d12
added fibonacci-rank-1 to watson
Vlad-Kor Jan 21, 2026
d331d7e
benchmark: changed how plotting works
Vlad-Kor Jan 22, 2026
53dde86
fix bug where watson_random returns 2L samples instead of L
Vlad-Kor Jan 22, 2026
becafb5
fixed json serialization
Vlad-Kor Jan 25, 2026
4d6d704
benchmark: added way to plot from json directly
Vlad-Kor Jan 27, 2026
26bfbeb
changed how plots look
Vlad-Kor Jan 27, 2026
a185083
minor change to benchmark plots
Vlad-Kor Jan 27, 2026
62f0ef7
update libs
Vlad-Kor Feb 5, 2026
0d9aa95
pin poetry version in docker
Vlad-Kor Feb 5, 2026
abcf0f5
update requirements.txt
Vlad-Kor Feb 25, 2026
0f994b2
also test main and staging
Vlad-Kor Feb 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/test_only.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name : Tests
on:
push:
branches:
- vlad/devel
- main
- staging
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Build Docker Image
run: docker compose --profile test build tests
- name: Run Tests
run: docker compose --profile test run --rm tests
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,7 @@ cython_debug/
#.idea/

#.kate-swp

.vscode/
time_taken_for_various*

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# web-app
- Currently served at: http://193.196.39.120:8080
- Test server: http://193.196.39.193:8080
- Test server: http://193.196.39.84:8080
49 changes: 35 additions & 14 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,49 @@
import dash_bootstrap_components as dbc

# Usage Locally:
# $ python app.py
# $ poetry run python app.py

# select theme
# https://dash-bootstrap-components.opensource.faculty.ai/docs/themes/
external_stylesheets = [dbc.themes.CERULEAN] # CERULEAN, DARKLY, PULSE

server = flask.Flask(__name__)

app = Dash(__name__, external_stylesheets=external_stylesheets, server=server, use_pages=True) # , suppress_callback_exceptions=True
app = Dash(
__name__,
external_stylesheets=external_stylesheets,
server=server,
use_pages=True,
serve_locally=True,
suppress_callback_exceptions=True # this is needed because renderer generate callbacks dynamically with per instance uuids
)

app.layout = dbc.Container([
html.H1('ISAS Interactive'),
dbc.Nav([
dbc.NavLink(html.Div(f"{page['name'].lower()}"), href=page["relative_path"], active="exact")
for page in dash.page_registry.values()
], pills=True, className='bg-light'),
html.P(),
dash.page_container
], fluid=True)
html.H1('ISAS Interactive',
style={
"caretColor": "transparent",
"userSelect": "none"
}
),
dbc.Nav([
dbc.NavLink(
html.Div(
f"{page['name'].lower()}"),
href=page["relative_path"],
active="exact",
className='rounded-3'
)
for page in dash.page_registry.values()
], pills=True, className='bg-light rounded-3'),
html.P(),
html.Div(dash.page_container, className="flex-grow-1 d-flex flex-column", id="outer-page-container", style={'minHeight': '0'})
],
fluid=True,
className="vh-100 d-flex flex-column"
)

if __name__ == '__main__':
# processes=6, threaded=False,
app.run(debug=True, threaded=True, host='0.0.0.0', port='8080')
# app.run(debug=True, processes=6, threaded=False, host='0.0.0.0', port='8080')
# app.run(debug=True)
# processes=6, threaded=False,
app.run(debug=True, threaded=True, host='0.0.0.0', port='8080')
# app.run(debug=True, processes=6, threaded=False, host='0.0.0.0', port='8080')
# app.run(debug=True)
23 changes: 23 additions & 0 deletions assets/blockquote.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/* Danger / error-style blockquote inside dcc.Markdown */
blockquote {
border-left: 4px solid #e53935;
background-color: #ffebee;
padding: 1rem 1.25rem 1rem 2.7rem;
margin: 1rem 0;
color: #b71c1c;
border-radius: 6px;
position: relative;
}

/* Warning icon */
blockquote::before {
content: "⚠";
position: absolute;
left: 0.9rem;
top: 0.9rem;
font-size: 1.1rem;
}

blockquote p {
margin: 0;
}
7 changes: 7 additions & 0 deletions assets/dpr.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
window.dash_clientside = Object.assign({}, window.dash_clientside, {
utils: {
getDevicePixelRatio: function(_) {
return window.devicePixelRatio || 1;
}
}
});
Binary file added assets/favicon.ico
Binary file not shown.
45 changes: 45 additions & 0 deletions assets/full_page.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/* Dash puts pages inside 2 divs that are not styleable otherwise */
#outer-page-container > * { /* this is the empty div dash puts pages inside */
flex-grow: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
#_pages_content {
flex-grow: 1;
display: flex;
flex-direction: column;
min-height: 0;
}


#panelgroup-parent-container {
min-height: 0;
}

.split-pane-group {
height: 100%;
}

@media (min-width: 768px) {
.split-pane-handle {
cursor: col-resize;
}
}

/* < md: "mobile" layout */
@media (max-width: 767.98px) {
.split-pane-group {
flex-direction: column !important;
}


.split-pane-left .bg-light {
max-height: 40vh;
overflow-y: auto;
}

.split-pane-handle {
display: none !important; /* no resize on mobile */
}
}
46 changes: 41 additions & 5 deletions assets/tooltip.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,44 @@
window.dccFunctions = window.dccFunctions || {};
window.dccFunctions.trafo_L = function(value) {
if (value < Math.log10(1.25)) {
return 0;
} else {
return Math.round(Math.pow(10, value));
}
if (value < Math.log10(1.25)) {
return 0;
} else {
return Math.round(Math.pow(10, value));
}
}
window.dccFunctions.transform_log_nice = function(value) {
let x = Math.pow(10, value);
// same as transform_up in log_slider.py
if (x == 0){
return 0;
}
const sign = Math.sign(x);
x = Math.abs(x);

let step = Math.pow(10, Math.floor(Math.log10(x))) / 10;
let nice_value = sign * Math.round(x / step) * step;
nice_value = Number(nice_value.toFixed(4));
return nice_value;
}

window.dccFunctions.transform_fib = function(value) {
function fibonacci(n) {
return n < 1 ? 0
: n <= 2 ? 1
: fibonacci(n - 1) + fibonacci(n - 2)
}
return fibonacci(value);
}

window.dccFunctions.transform_fib_m1 = function(value) {
function fibonacci(n) {
return n < 1 ? 0
: n <= 2 ? 1
: fibonacci(n - 1) + fibonacci(n - 2)
}
return fibonacci(value) - 1;
}

window.dccFunctions.transform_square = function(value) {
return value * value;
}
Empty file added components/__init__.py
Empty file.
8 changes: 8 additions & 0 deletions components/label.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from dash import html

# wrapps component in a label
def Label(label, component):
return html.Div([
html.Label(label),
component,
])
48 changes: 48 additions & 0 deletions components/popup_box.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import dash_bootstrap_components as dbc
from dash import Dash, html, dcc, Input, Output, callback, State

def PopupBox(id, label, title, children):
@callback(
Output(f"modal-{label}-{id}", "is_open"),
Input(f"popup-box-{label}-{id}", "n_clicks"),
Input(f"close-{label}-{id}", "n_clicks"),
State(f"modal-{label}-{id}", "is_open"),
)
def toggle_modal(n1, n2, is_open):
if n1 or n2:
return not is_open
return is_open


button = html.Div(
children=[
dbc.Button(label, id=f"popup-box-{label}-{id}", n_clicks=0)
],
style={
"caretColor": "transparent",
"userSelect": "none"
}
)

modal = dbc.Modal(
id=f"modal-{label}-{id}",
is_open=False,
children=[
html.Div(
children=[dbc.ModalHeader(dbc.ModalTitle(title), close_button=True)],
style={
"caretColor": "transparent",
"userSelect": "none"
}
),
dbc.ModalBody(children),
dbc.ModalFooter(
dbc.Button("Close", id=f"close-{label}-{id}", n_clicks=0)
),
],
size="xl",
centered=True,
scrollable=True,
)
return button, modal

52 changes: 52 additions & 0 deletions components/split_pane.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from dash import html
from dash_resizable_panels import PanelGroup, Panel, PanelResizeHandle
import dash_bootstrap_components as dbc



def SplitPane(children1, children2, default_size):
return html.Div([
PanelGroup(
id='panel-group',
children=[
Panel(
id='left-sidebar',
className="split-pane-left",
minSizePercentage=15,
defaultSizePercentage=default_size,
children=[
html.Div(
children1,
className="bg-light h-100 w-100 rounded-3 p-3 pb-5", style={'overflowY': 'scroll', 'overflowX': 'hidden', 'minHeight': '0'},
)
],
),
PanelResizeHandle(
id='resize-handle',
className="split-pane-handle",
style={
"flex": "0 0 20px",
"margin": "0 -10px",
"background": "transparent",
"cursor": "col-resize",
"userSelect": "none",
"position": "relative",
"zIndex": 2,
},
),
Panel(
id='plot-panel',
className="split-pane-right",
minSizePercentage=15,
children=children2,
)
],
direction='horizontal',
className='split-pane-group w-100 px-0 pb-2',
style={'minHeight': '0'}
)
],
className='px-0 flex-grow-1 d-flex flex-column',
id='pangelgroup-parent-container',
style={'minHeight': '0'}
)
16 changes: 16 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
services:
web:
build:
context: .
target: prod
image: web_app:latest
ports:
- "8080:8080"
restart: unless-stopped

tests:
build:
context: .
target: tests
image: web_app:tests
profiles: ["test"]
24 changes: 18 additions & 6 deletions dockerfile
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
FROM python:3.10.12
FROM python:3.10.12 AS base

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt

RUN pip install --upgrade pip
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
ARG POETRY_VERSION=2.3.1
RUN pip install --no-cache-dir "poetry==${POETRY_VERSION}"
COPY pyproject.toml poetry.lock /code/
RUN poetry sync --no-root --without dev

COPY ./app.py /code/app.py
COPY ./assets /code/assets
COPY ./pages /code/pages
COPY ./util /code/util
COPY ./components /code/components
COPY ./renderer /code/renderer
COPY ./model /code/model


FROM base AS tests
RUN apt-get update && apt-get install -y chromium chromium-driver
RUN poetry sync --no-root --with dev
COPY ./tests /code/tests
CMD ["poetry", "run", "pytest", "--headless"]

CMD ["python","app.py"]
FROM base AS prod
CMD ["poetry", "run", "gunicorn", "--workers", "1", "--bind", "0.0.0.0:8080", "app:server"]
Empty file added model/__init__.py
Empty file.
Empty file added model/cylinder/__init__.py
Empty file.
Loading