1+ from fastapi import APIRouter , HTTPException , BackgroundTasks
2+ from pydantic import BaseModel
3+ from typing import List , Optional
4+ import logging
5+ import uuid
6+
7+ router = APIRouter ()
8+ logger = logging .getLogger (__name__ )
9+
10+
11+ class ScheduleId (BaseModel ):
12+ requestId : str
13+
14+ # FourierMMD
15+ class FourierMMDParameters (BaseModel ):
16+ nWindow : Optional [int ] = None
17+ nTest : Optional [int ] = None
18+ nMode : Optional [int ] = None
19+ randomSeed : Optional [int ] = None
20+ sig : Optional [float ] = None
21+ deltaStat : Optional [bool ] = None
22+ epsilon : Optional [float ] = None
23+
24+
25+ class FourierMMDFitting (BaseModel ):
26+ randomSeed : Optional [int ] = None
27+ deltaStat : Optional [bool ] = None
28+ nMode : Optional [int ] = None
29+ scale : Optional [List [float ]] = None
30+ aRef : Optional [List [float ]] = None
31+ meanMMD : Optional [float ] = None
32+ stdMMD : Optional [float ] = None
33+
34+
35+ class FourierMMDMetricRequest (BaseModel ):
36+ modelId : str
37+ requestName : Optional [str ] = None
38+ metricName : Optional [str ] = None
39+ batchSize : Optional [int ] = 100
40+ thresholdDelta : Optional [float ] = None
41+ referenceTag : Optional [str ] = None
42+ fitColumns : List [str ] = []
43+ parameters : Optional [FourierMMDParameters ] = None
44+ gamma : Optional [float ] = None
45+ fitting : Optional [FourierMMDFitting ] = None
46+
47+
48+ @router .post ("/metrics/drift/fouriermmd" )
49+ async def compute_fouriermmd (request : FourierMMDMetricRequest ):
50+ """Compute the current value of FourierMMD metric."""
51+ try :
52+ logger .info (f"Computing FourierMMD for model: { request .modelId } " )
53+ # TODO: Implement
54+ return {"status" : "success" , "value" : 0.5 }
55+ except Exception as e :
56+ logger .error (f"Error computing FourierMMD: { str (e )} " )
57+ raise HTTPException (status_code = 500 , detail = f"Error computing metric: { str (e )} " )
58+
59+
60+ @router .get ("/metrics/drift/fouriermmd/definition" )
61+ async def get_fouriermmd_definition ():
62+ """Provide a general definition of FourierMMD metric."""
63+ return {
64+ "name" : "FourierMMD Drift" ,
65+ "description" : "Description" ,
66+ }
67+
68+
69+ @router .post ("/metrics/drift/fouriermmd/request" )
70+ async def schedule_fouriermmd (
71+ request : FourierMMDMetricRequest , background_tasks : BackgroundTasks
72+ ):
73+ """Schedule a recurring computation of FourierMMD metric."""
74+ request_id = str (uuid .uuid4 ())
75+ logger .info (f"Scheduling FourierMMD computation with ID: { request_id } " )
76+ # TODO: Implement
77+ return {"requestId" : request_id }
78+
79+
80+ @router .delete ("/metrics/drift/fouriermmd/request" )
81+ async def delete_fouriermmd_schedule (schedule : ScheduleId ):
82+ """Delete a recurring computation of FourierMMD metric."""
83+ logger .info (f"Deleting FourierMMD schedule: { schedule .requestId } " )
84+ # TODO: Implement
85+ return {"status" : "success" , "message" : f"Schedule { schedule .requestId } deleted" }
86+
87+
88+ @router .get ("/metrics/drift/fouriermmd/requests" )
89+ async def list_fouriermmd_requests ():
90+ """List the currently scheduled computations of FourierMMD metric."""
91+ # TODO: Implement
92+ return {"requests" : []}
0 commit comments