marcellorusso commited on
Commit
00e5cc8
·
verified ·
1 Parent(s): 506bcca

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) == 4
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] == 512 # ResNet18
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 2048-dim embeddings."""
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] == 2048
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
+ );