Time_RCD / models /DADA.py
Oliver Le
Initial commit
d03866e
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import math
import tqdm
import os
from transformers import AutoTokenizer
from typing import Optional, Tuple
# Add debugging prints to understand the import issue
import sys
# print(f"Python path: {sys.path}")
# print(f"Current working directory: {os.getcwd()}")
# print(f"Current file location: {__file__}")
# print(f"Current file directory: {os.path.dirname(__file__)}")
#
# # Check if the utils directory exists
# utils_path = os.path.join(os.path.basename(os.path.dirname(__file__)), "utils")
# print(f"Utils path: {utils_path}")
# print(f"Utils directory exists: {os.path.exists(utils_path)}")
# print(f"Utils directory contents: {os.listdir(utils_path) if os.path.exists(utils_path) else 'Directory not found'}")
#
# # Check if dataset.py exists
# dataset_path = os.path.join(utils_path, "dataset.py")
# print(f"Dataset file path: {dataset_path}")
# print(f"Dataset file exists: {os.path.exists(dataset_path)}")
# Try different import approaches
os.chdir("/home/lihaoyang/Huawei/TSB-AD/TSB_AD")
try:
from utils.dataset import ReconstructDataset
print("Relative import successful")
except ImportError as e:
print(f"Relative import failed: {e}")
# Try absolute import
try:
from TSB_AD.utils.dataset import ReconstructDataset
print("Absolute import successful")
except ImportError as e2:
print(f"Absolute import failed: {e2}")
# Try adding parent directory to path
try:
parent_dir = os.path.dirname(os.path.dirname(__file__))
if parent_dir not in sys.path:
sys.path.insert(0, parent_dir)
from utils.dataset import ReconstructDataset
print("Import with modified path successful")
except ImportError as e3:
print(f"Import with modified path failed: {e3}")
from .base import BaseDetector
# ...existing code...
class DADA(BaseDetector):
def __init__(self, device, args=None, win_size=64, batch_size=32):
self.win_size = win_size
self.batch_size = batch_size
self.device = torch.device(f'cuda:{device}' if torch.cuda.is_available() else 'cpu')
self.model = self._build_model().to(self.device)
def _build_model(self):
from transformers import AutoModel, AutoConfig
import os
# Try multiple possible paths
possible_paths = [
os.environ.get("DADA_MODEL_PATH"), # Environment variable
"/home/lihaoyang/Huawei/DADA/DADA/", # Original Linux path
"./DADA", # Relative path
"DADA" # Hugging Face model name
]
for path in possible_paths:
if path is None:
continue
try:
# Try loading config first
config = AutoConfig.from_pretrained(path, trust_remote_code=True)
model = AutoModel.from_pretrained(path, config=config, trust_remote_code=True)
print(f"Successfully loaded DADA model from: {path}")
return model
except Exception as e:
print(f"Failed to load from {path}: {e}")
continue
raise ValueError("DADA model not found. Please set DADA_MODEL_PATH environment variable or ensure the model is available at one of the expected locations.")
# def _acquire_device(self):
# if True:
# os.environ["CUDA_VISIBLE_DEVICES"] = str(
# self.args.gpu) if not self.args.use_multi_gpu else self.args.devices
# device = torch.device('cuda:{}'.format(self.args.gpu))
# print('Use GPU: cuda:{}'.format(self.args.gpu))
# else:
# device = torch.device('cpu')
# print('Use CPU')
# return device
def decision_function(self, x: torch.Tensor) -> torch.Tensor:
pass
def fit(self, data: torch.Tensor, labels: Optional[torch.Tensor] = None) -> None:
pass
def zero_shot(self, data):
test_loader = DataLoader(
dataset= ReconstructDataset(data, window_size=self.win_size, stride=self.win_size, normalize=True),
batch_size=self.batch_size,
shuffle=False)
loop = tqdm.tqdm(enumerate(test_loader),total=len(test_loader),leave=True)
test_scores = []
test_labels = []
self.model.eval()
self.model.to(self.device)
with torch.no_grad():
for i, (batch_x, batch_y) in loop:
batch_x = batch_x.float().to(self.device)
score = self.model.infer(batch_x, norm=0)
score = score.detach().cpu().numpy()
test_scores.append(score)
test_labels.append(batch_y)
test_scores = np.concatenate(test_scores, axis=0).reshape(-1, 1)
test_labels = np.concatenate(test_labels, axis=0).reshape(-1, 1)
print("Test scores shape:", test_scores.shape)
print("Test labels shape:", test_labels.shape)
return test_scores.reshape(-1)