Spaces:
Sleeping
Sleeping
Sync from GitHub: 4efcd94
Browse files
backend/tests/test_cli/test_experiments.py
CHANGED
|
@@ -15,7 +15,7 @@ class TestCLI:
|
|
| 15 |
|
| 16 |
def test_experiments_defined(self):
|
| 17 |
"""Test that only valid experiments are defined."""
|
| 18 |
-
assert len(EXPERIMENTS) ==
|
| 19 |
assert all(i in EXPERIMENTS for i in [6, 7, 8, 9])
|
| 20 |
|
| 21 |
def test_experiment_structure(self):
|
|
|
|
| 15 |
|
| 16 |
def test_experiments_defined(self):
|
| 17 |
"""Test that only valid experiments are defined."""
|
| 18 |
+
assert len(EXPERIMENTS) == 5
|
| 19 |
assert all(i in EXPERIMENTS for i in [6, 7, 8, 9])
|
| 20 |
|
| 21 |
def test_experiment_structure(self):
|
backend/tests/test_core/test_models.py
CHANGED
|
@@ -66,9 +66,8 @@ class TestResNetClassifier:
|
|
| 66 |
x = x.to(device)
|
| 67 |
embeddings = model.get_embeddings(x)
|
| 68 |
|
| 69 |
-
# ResNet18: 512 features, ResNet50: 2048 features
|
| 70 |
assert embeddings.shape[0] == x.shape[0]
|
| 71 |
-
assert embeddings.shape[1] ==
|
| 72 |
break
|
| 73 |
|
| 74 |
def test_resnet_model_name(self):
|
|
@@ -109,12 +108,12 @@ class TestResNetClassifier:
|
|
| 109 |
assert torch.allclose(param1, param2), f"Parameters {name1} differ"
|
| 110 |
|
| 111 |
def test_resnet50_embedding_dimension(self, tiny_dataloader, device):
|
| 112 |
-
"""ResNet50 should produce
|
| 113 |
config = ResNetConfig(variant="resnet50", num_classes=2, pretrained=False)
|
| 114 |
model = ResNetClassifier(config).to(device)
|
| 115 |
|
| 116 |
for x, _, _ in tiny_dataloader:
|
| 117 |
x = x.to(device)
|
| 118 |
embeddings = model.get_embeddings(x)
|
| 119 |
-
assert embeddings.shape[1] ==
|
| 120 |
break
|
|
|
|
| 66 |
x = x.to(device)
|
| 67 |
embeddings = model.get_embeddings(x)
|
| 68 |
|
|
|
|
| 69 |
assert embeddings.shape[0] == x.shape[0]
|
| 70 |
+
assert embeddings.shape[1] == model.embedding_dim
|
| 71 |
break
|
| 72 |
|
| 73 |
def test_resnet_model_name(self):
|
|
|
|
| 108 |
assert torch.allclose(param1, param2), f"Parameters {name1} differ"
|
| 109 |
|
| 110 |
def test_resnet50_embedding_dimension(self, tiny_dataloader, device):
|
| 111 |
+
"""ResNet50 should produce embedding_dim-dim embeddings."""
|
| 112 |
config = ResNetConfig(variant="resnet50", num_classes=2, pretrained=False)
|
| 113 |
model = ResNetClassifier(config).to(device)
|
| 114 |
|
| 115 |
for x, _, _ in tiny_dataloader:
|
| 116 |
x = x.to(device)
|
| 117 |
embeddings = model.get_embeddings(x)
|
| 118 |
+
assert embeddings.shape[1] == model.embedding_dim
|
| 119 |
break
|
frontend/src/stores/useAppStore.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// frontend/src/stores/useAppStore.ts
|
| 2 |
+
|
| 3 |
+
import { create } from "zustand";
|
| 4 |
+
import { persist } from "zustand/middleware";
|
| 5 |
+
import type { AuthUser } from "../lib/types";
|
| 6 |
+
|
| 7 |
+
type Theme = "light" | "dark";
|
| 8 |
+
|
| 9 |
+
function getSystemTheme(): Theme {
|
| 10 |
+
if (typeof window === "undefined") return "light";
|
| 11 |
+
return window.matchMedia("(prefers-color-scheme: dark)").matches
|
| 12 |
+
? "dark"
|
| 13 |
+
: "light";
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
function applyTheme(theme: Theme) {
|
| 17 |
+
document.documentElement.classList.toggle("dark", theme === "dark");
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
interface AppState {
|
| 21 |
+
theme: Theme;
|
| 22 |
+
sidebarOpen: boolean;
|
| 23 |
+
token: string | null;
|
| 24 |
+
user: AuthUser | null;
|
| 25 |
+
toggleTheme: () => void;
|
| 26 |
+
setSidebarOpen: (open: boolean) => void;
|
| 27 |
+
toggleSidebar: () => void;
|
| 28 |
+
setAuth: (token: string, user: AuthUser) => void;
|
| 29 |
+
logout: () => void;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
export const useAppStore = create<AppState>()(
|
| 33 |
+
persist(
|
| 34 |
+
(set, get) => ({
|
| 35 |
+
theme: getSystemTheme(),
|
| 36 |
+
sidebarOpen: false,
|
| 37 |
+
token: null,
|
| 38 |
+
user: null,
|
| 39 |
+
|
| 40 |
+
toggleTheme: () => {
|
| 41 |
+
const next = get().theme === "dark" ? "light" : "dark";
|
| 42 |
+
applyTheme(next);
|
| 43 |
+
set({ theme: next });
|
| 44 |
+
},
|
| 45 |
+
|
| 46 |
+
setSidebarOpen: (open) => set({ sidebarOpen: open }),
|
| 47 |
+
|
| 48 |
+
toggleSidebar: () => set({ sidebarOpen: !get().sidebarOpen }),
|
| 49 |
+
|
| 50 |
+
setAuth: (token: string, user: AuthUser) => set({ token, user }),
|
| 51 |
+
|
| 52 |
+
logout: () => set({ token: null, user: null }),
|
| 53 |
+
}),
|
| 54 |
+
{
|
| 55 |
+
name: "orchid-app-store",
|
| 56 |
+
partialize: (state) => ({
|
| 57 |
+
theme: state.theme,
|
| 58 |
+
token: state.token,
|
| 59 |
+
user: state.user,
|
| 60 |
+
}),
|
| 61 |
+
onRehydrateStorage: () => (state) => {
|
| 62 |
+
if (state) applyTheme(state.theme);
|
| 63 |
+
},
|
| 64 |
+
}
|
| 65 |
+
)
|
| 66 |
+
);
|