From 06d89969d505cb838bd507c40295cb55b4b0fa64 Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Mon, 4 May 2026 09:59:31 +0200 Subject: [PATCH 01/16] tinyimagenet started loading --- setup.txt | 1 + tiny_image_net.py | 99 +++++++++++++++++++++++ train_4_optimizers.py | 178 ------------------------------------------ 3 files changed, 100 insertions(+), 178 deletions(-) create mode 100644 tiny_image_net.py delete mode 100644 train_4_optimizers.py diff --git a/setup.txt b/setup.txt index d541823..2e71dc5 100644 --- a/setup.txt +++ b/setup.txt @@ -5,5 +5,6 @@ srun -p h200fast --gres=gpu:1 --pty bash -i ml load Python/3.13.1-GCCcore-14.2.0 ml load GCCcore/14.2.0 ml load PyTorch/2.10.0-foss-2025a-CUDA-12.8.0 +ml load torchvision/0.22.1-foss-2025a-CUDA-12.8.0 source env_humancompatible/bin/activate \ No newline at end of file diff --git a/tiny_image_net.py b/tiny_image_net.py new file mode 100644 index 0000000..063e067 --- /dev/null +++ b/tiny_image_net.py @@ -0,0 +1,99 @@ +import matplotlib.pyplot as plt +import logging +logging.basicConfig(level=logging.INFO) +from pathlib import Path +from tinyimagenet import TinyImageNet +from torchvision import transforms as T +from torch.utils.data import DataLoader +from torchvision import models +from torch import nn +from fairret.statistic import PositiveRate, TruePositiveRate, FalsePositiveRate, PositivePredictiveValue, FalseOmissionRate +from fairret.loss import NormLoss +from humancompatible.train.fairness.utils import BalancedBatchSampler +import torch + +def train_tinyimagenet(): + + # define batch size here + train_batch_size=128 + batch_size = 256 + + # define the path here + dataset_path="~/.torchvision/tinyimagenet/" + + + # define transforms function + normalize_transform = T.Compose([ T.ToTensor(), + T.Normalize(mean=TinyImageNet.mean, + std=TinyImageNet.std), + # Converting cropped images to tensors + ]) + train_transform = T.Compose([ T.Resize(256), # Resize images to 256 x 256 + T.CenterCrop(224), # Center crop image + T.RandomHorizontalFlip(), + normalize_transform + + ]) + + + # load the data + train = TinyImageNet(Path(dataset_path),split="train",transform=train_transform,imagenet_idx=True) + val = TinyImageNet(Path(dataset_path),split="val",transform=normalize_transform,imagenet_idx=True) + test = TinyImageNet(Path(dataset_path),split="test",transform=normalize_transform,imagenet_idx=True) + print(f'Dataset has {len(train.classes)} classes. Sample classes: {train.classes[:5]}') + + # create dataloaders + datasets = {"train": train,"val": val, "test": test} + loaders = {} + + + for name, dataset in datasets.items(): + print(f"Dataset size: {len(dataset)}") + + # create balanced batch sampler for training + X = torch.stack([item[0] for item in dataset]) + targets = torch.tensor([item[1] for item in dataset]) + + # create onehot vectors + groups_onehot = torch.eye(200)[targets] + + # create a train dataset + dataset_torch = torch.utils.data.TensorDataset(X, groups_onehot, targets) + + # create the balanced dataloader + sampler = BalancedBatchSampler( + group_onehot=groups_onehot, batch_size=batch_size, drop_last=True + ) + loader_balanced = torch.utils.data.DataLoader(dataset_torch, batch_sampler=sampler, num_workers=10) + loader_unbalanced = torch.utils.data.DataLoader(dataset_torch, batch_size=batch_size, shuffle=True, num_workers=10) + + # save the lodaers + loaders[name] = loader_unbalanced + loaders[name+"_balanced"] = loader_balanced + + # create fair dataloaders + + # test the models + model = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT) + for name,dataloader in [ ('train',loaders['train_balanced']),('val',loaders['val_balanced']),('test',loaders['test_balanced']) ]: + correct =0 + total = 0 + for (x,y, sens) in dataloader: + + print(x, y, sens) + exit() + + pred = model(x) + pred = pred.argmax(axis=1) + total +=x.shape[0] + correct += (y==pred).sum() + + print(x, y, pred) + + exit() + accuracy = correct/total + print(f'Accuracy for {name}: {accuracy}') + + +if __name__ == "__main__": + train_tinyimagenet() \ No newline at end of file diff --git a/train_4_optimizers.py b/train_4_optimizers.py deleted file mode 100644 index 1e9b684..0000000 --- a/train_4_optimizers.py +++ /dev/null @@ -1,178 +0,0 @@ -"""Minimal constrained neural network training with 4 optimizers.""" -import torch -import torch.nn as nn -from torch.utils.data import TensorDataset, DataLoader -from folktables import ACSDataSource, generate_categories, ACSIncome -from sklearn.preprocessing import StandardScaler -from sklearn.model_selection import train_test_split - -# Import optimizers -from humancompatible.train.optim import SSG -from humancompatible.train.dual_optim import ALM, PBM, MoreauEnvelope - -# Setup -torch.manual_seed(0) -device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') -print(f"Using device: {device}") - -# Load folktables data -data_source = ACSDataSource(survey_year="2018", horizon="1-Year", survey="person") -acs_data = data_source.get_data(states=["VA"], download=True) -definition_df = data_source.get_definitions(download=True) -categories = generate_categories( - features=ACSIncome.features, definition_df=definition_df -) -df_feat, df_labels, _ = ACSIncome.df_to_pandas( - acs_data, categories=categories, dummies=True -) - -sens_cols = ["SEX_Female", "SEX_Male"] -features = df_feat.drop(columns=sens_cols).to_numpy(dtype="float") -groups = df_feat[sens_cols].to_numpy(dtype="float") -labels = df_labels.to_numpy(dtype="float") - -# Split and scale -X_train, X_test, y_train, y_test, groups_train, groups_test = train_test_split( - features, labels, groups, test_size=0.2, random_state=42 -) -X_train, X_val, y_train, y_val, groups_train, groups_val = train_test_split( - X_train, y_train, groups_train, test_size=0.25, random_state=42 -) - -scaler = StandardScaler() -X_train = scaler.fit_transform(X_train) -X_val = scaler.transform(X_val) - -# Convert to tensors and move to device -X_train = torch.tensor(X_train, dtype=torch.float32).to(device) -y_train = torch.tensor(y_train, dtype=torch.float32).to(device) -groups_train = torch.tensor(groups_train, dtype=torch.float32).to(device) - -# Create dataloader -dataset = TensorDataset(X_train, groups_train, y_train) -loader = DataLoader(dataset, batch_size=16, shuffle=False) - -def create_model(): - """Simple neural network.""" - return nn.Sequential( - nn.Linear(X_train.shape[1], 32), - nn.ReLU(), - nn.Linear(32, 1), - ).to(device) - -criterion = nn.BCEWithLogitsLoss() - -def get_constraint(model, groups): - """Constraint: positive rate difference between groups.""" - group_preds = [[] for _ in range(groups.shape[1])] - for i in range(groups.shape[1]): - group_preds[i] = (torch.sigmoid(model(X_train)) * groups[:, i].unsqueeze(1)).mean() - - # Return max difference in positive rates across groups - rates = torch.stack(group_preds) - return (rates.max() - rates.min()) - -# ============ 1. ADAM (unconstrained) ============ -# print("\n=== 1. ADAM ===") -# model = create_model() -# opt = torch.optim.Adam(model.parameters(), lr=0.001) - -# for epoch in range(3): -# losses = [] -# constraints = [] -# for batch_x, batch_groups, batch_y in loader: -# batch_x, batch_groups, batch_y = batch_x.to(device), batch_groups.to(device), batch_y.to(device) -# output = model(batch_x) -# loss = criterion(output, batch_y) -# loss.backward() -# opt.step() -# opt.zero_grad() -# losses.append(loss.item()) - -# constraint = get_constraint(model, groups_train).to(device) -# constraints.append(constraint.item()) -# print(f"Epoch {epoch}: loss={sum(losses)/len(losses):.4f}, constraint={constraint:.4f}") - -# # ============ 2. ALM (Augmented Lagrangian) ============ -# print("\n=== 2. ALM ===") -# model = create_model() -# opt = MoreauEnvelope(torch.optim.Adam(model.parameters(), lr=0.01)) -# dual = ALM(m=1, lr=0.01, momentum=0.5, device=device) -# if hasattr(dual, 'to'): -# dual = dual.to(device) - -# for epoch in range(3): -# losses = [] -# for batch_x, batch_groups, batch_y in loader: -# batch_x, batch_groups, batch_y = batch_x.to(device), batch_groups.to(device), batch_y.to(device) -# output = model(batch_x) -# loss = criterion(output, batch_y) -# constraint = get_constraint(model, groups_train).to(device) - -# lagrangian = dual.forward_update(loss, constraint.unsqueeze(0)) -# lagrangian.backward() -# opt.step() -# opt.zero_grad() -# losses.append(loss.item()) - -# constraint = get_constraint(model, groups_train).to(device) -# print(f"Epoch {epoch}: loss={sum(losses)/len(losses):.4f}, constraint={constraint:.4f}") - -# # ============ 3. PBM (Penalty-Barrier Method) ============ -# print("\n=== 3. PBM ===") -# model = create_model() -# opt = MoreauEnvelope(torch.optim.Adam(model.parameters(), lr=0.001)) -# dual = PBM(m=1, penalty_update='dimin_adapt', gamma=0.7, -# init_duals=0.001, init_penalties=1., penalty_range=(0.01, 1.), -# dual_range=(0.01, 100.), device=device) -# if hasattr(dual, 'to'): -# dual = dual.to(device) - -# for epoch in range(3): -# losses = [] -# for batch_x, batch_groups, batch_y in loader: -# batch_x, batch_groups, batch_y = batch_x.to(device), batch_groups.to(device), batch_y.to(device) -# output = model(batch_x) -# loss = criterion(output, batch_y) -# constraint = get_constraint(model, groups_train).to(device) - -# lagrangian = dual.forward_update(loss, constraint.unsqueeze(0)) -# lagrangian.backward() -# opt.step() -# opt.zero_grad() -# losses.append(loss.item()) - -# constraint = get_constraint(model, groups_train).to(device) -# print(f"Epoch {epoch}: loss={sum(losses)/len(losses):.4f}, constraint={constraint:.4f}") - -# ============ 4. SSW (Switching Subgradient) ============ -print("\n=== 4. SSW ===") -model = create_model() -opt = torch.optim.Adam(model.parameters(), lr=0.001) -opt2 = torch.optim.Adam(model.parameters(), lr=0.001) - -for epoch in range(3): - losses = [] - for batch_x, batch_groups, batch_y in loader: - batch_x, batch_groups, batch_y = batch_x.to(device), batch_groups.to(device), batch_y.to(device) - output = model(batch_x) - loss = criterion(output, batch_y) - constraint = get_constraint(model, groups_train).to(device) - - if constraint.item() > 0: - constraint.backward() - opt2.step() - losses.append(loss.item()) - opt2.zero_grad() - else: - loss.backward() - opt.step() # No constraint violation, so pass 0 to update - losses.append(loss.item()) - opt.zero_grad() - - losses.append(loss.item()) - - constraint = get_constraint(model, groups_train).to(device) - print(f"Epoch {epoch}: loss={sum(losses)/len(losses):.4f}, constraint={constraint:.4f}") - -print("\n✓ Complete") From 41b52555eb1eaf80c0af61a4c19783b83a496563 Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Mon, 4 May 2026 12:58:23 +0200 Subject: [PATCH 02/16] tiny image data works with adam now --- tiny_image_net.py | 283 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 242 insertions(+), 41 deletions(-) diff --git a/tiny_image_net.py b/tiny_image_net.py index 063e067..84109fb 100644 --- a/tiny_image_net.py +++ b/tiny_image_net.py @@ -11,12 +11,49 @@ from fairret.loss import NormLoss from humancompatible.train.fairness.utils import BalancedBatchSampler import torch +from tqdm import tqdm +import os +from typing import Callable, Any, Dict +from dataclasses import dataclass +import torch +import fairret + + +def dataset_to_tensors(dataset, batch_size=512, num_workers=8): + """Fast parallel loading of an entire dataset into tensors.""" + loader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=False, + num_workers=num_workers, + pin_memory=True, + ) + all_X, all_targets = [], [] + for X_batch, target_batch in tqdm(loader, desc="Loading dataset into tensors", total=len(loader)): + all_X.append(X_batch) + all_targets.append(target_batch) + return torch.cat(all_X, dim=0), torch.cat(all_targets, dim=0) + + +def load_or_cache(dataset, cache_path, batch_size=512, num_workers=8): + """Load tensors from cache if available, otherwise build and save.""" + if os.path.exists(cache_path): + print(f"Loading cache from {cache_path}...") + data = torch.load(cache_path, weights_only=True) + return data["X"], data["targets"] + + print(f"Building cache → {cache_path} (one-time cost)...") + X, targets = dataset_to_tensors(dataset, batch_size=batch_size, num_workers=num_workers) + torch.save({"X": X, "targets": targets}, cache_path) + print(f"Cache saved ({X.nbytes / 1e9:.2f} GB)") + return X, targets + + def train_tinyimagenet(): # define batch size here - train_batch_size=128 - batch_size = 256 + batch_size = 400 # define the path here dataset_path="~/.torchvision/tinyimagenet/" @@ -36,63 +73,227 @@ def train_tinyimagenet(): ]) - # load the data - train = TinyImageNet(Path(dataset_path),split="train",transform=train_transform,imagenet_idx=True) - val = TinyImageNet(Path(dataset_path),split="val",transform=normalize_transform,imagenet_idx=True) - test = TinyImageNet(Path(dataset_path),split="test",transform=normalize_transform,imagenet_idx=True) - print(f'Dataset has {len(train.classes)} classes. Sample classes: {train.classes[:5]}') - - # create dataloaders - datasets = {"train": train,"val": val, "test": test} - loaders = {} + # --- Load datasets --- + train = TinyImageNet(Path(dataset_path), split="train", transform=train_transform, imagenet_idx=False) + val = TinyImageNet(Path(dataset_path), split="val", transform=normalize_transform, imagenet_idx=False) + test = TinyImageNet(Path(dataset_path), split="test", transform=normalize_transform, imagenet_idx=False) + print(f"Dataset has {len(train.classes)} classes. Sample classes: {train.classes[:5]}") + class_to_idx = train.class_to_idx + def remap_targets(dataset, targets): + return torch.tensor([class_to_idx[dataset.classes[t]] for t in targets]) + # datasets = {"train": train, "val": val, "test": test} + datasets = {"val": val} + + # --- Build loaders --- + loaders = {} for name, dataset in datasets.items(): - print(f"Dataset size: {len(dataset)}") + print(f"\nDataset: {name} | Size: {len(dataset)}") - # create balanced batch sampler for training - X = torch.stack([item[0] for item in dataset]) - targets = torch.tensor([item[1] for item in dataset]) + X, targets = load_or_cache(dataset, cache_path=f"./data/cache_{name}.pt") + print(f" X: {X.shape}, targets: {targets.shape}") - # create onehot vectors + # onehot groups groups_onehot = torch.eye(200)[targets] - - # create a train dataset + dataset_torch = torch.utils.data.TensorDataset(X, groups_onehot, targets) - - # create the balanced dataloader + + print(targets.sum()) sampler = BalancedBatchSampler( group_onehot=groups_onehot, batch_size=batch_size, drop_last=True ) - loader_balanced = torch.utils.data.DataLoader(dataset_torch, batch_sampler=sampler, num_workers=10) - loader_unbalanced = torch.utils.data.DataLoader(dataset_torch, batch_size=batch_size, shuffle=True, num_workers=10) - - # save the lodaers - loaders[name] = loader_unbalanced - loaders[name+"_balanced"] = loader_balanced + loaders[name] = torch.utils.data.DataLoader( + dataset_torch, batch_size=batch_size, shuffle=True, num_workers=4 + ) + loaders[name + "_balanced"] = torch.utils.data.DataLoader( + dataset_torch, batch_sampler=sampler, num_workers=4 + ) + print(f" Loaders created: '{name}' and '{name}_balanced'") # create fair dataloaders - # test the models - model = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT) - for name,dataloader in [ ('train',loaders['train_balanced']),('val',loaders['val_balanced']),('test',loaders['test_balanced']) ]: - correct =0 - total = 0 - for (x,y, sens) in dataloader: + # ----- Build model, criterion, optimizer ----- + device = torch.device("cuda") + lr = 1e-3 + epochs = 10 + loader_name = "val_balanced" + + + # ----- Unconstrained Optimization Adam ----- + constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + model = build_model().to(device) + criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints + optimizer = torch.optim.Adam(model.parameters(), lr=lr) + scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) + + history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} + + for epoch in range(1, epochs + 1): + train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], criterion, optimizer, device, train=True) + val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], criterion, optimizer, device, train=False) + # scheduler.step() + + history["train_loss"].append(train_loss) + history["train_acc"].append(train_acc) + history["val_loss"].append(val_loss) + history["val_acc"].append(val_acc) + history["max_constr"].append(max_constr) + print(f"Epoch {epoch:>3}/{epochs} | " + f"train loss {train_loss:.4f} acc {train_acc:.3f} | " + f"val loss {val_loss:.4f} acc {val_acc:.3f}" + f" | max constraint {max_constr:.4f}") + + + + + # ----- SPMB Optimization ----- + constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + model = build_model().to(device) + criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints + optimizer = torch.optim.Adam(model.parameters(), lr=lr) + # dual_optim = + # scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) + + history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} + + for epoch in range(1, epochs + 1): + train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], criterion, optimizer, device, train=True) + val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], criterion, optimizer, device, train=False) + # scheduler.step() + + history["train_loss"].append(train_loss) + history["train_acc"].append(train_acc) + history["val_loss"].append(val_loss) + history["val_acc"].append(val_acc) + history["max_constr"].append(max_constr) + print(f"Epoch {epoch:>3}/{epochs} | " + f"train loss {train_loss:.4f} acc {train_acc:.3f} | " + f"val loss {val_loss:.4f} acc {val_acc:.3f}" + f" | max constraint {max_constr:.4f}") + - print(x, y, sens) - exit() +def build_model(num_classes=200): + """EfficientNet-B0 from scratch (no pretrained weights).""" + model = models.efficientnet_b0(weights=None) + # Replace classifier head for 200-class TinyImageNet + in_features = model.classifier[1].in_features + model.classifier[1] = nn.Linear(in_features, num_classes) + return model + +def run_epoch(model, loader, criterion, optimizer, device, train=True): + model.train() if train else model.eval() + total_loss, correct, total = 0.0, 0, 0 + constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + + ctx = torch.enable_grad() if train else torch.no_grad() + with ctx: + for x, sens, y in tqdm(loader, desc="train" if train else "eval", leave=False): + x, sens, y = x.to(device), sens.to(device), y.to(device) + + if train: + optimizer.zero_grad() + pred = model(x) - pred = pred.argmax(axis=1) - total +=x.shape[0] - correct += (y==pred).sum() + loss = criterion(pred, y) + + # calculate the constraints + constraints = constraint_type.compute_constraints(None, pred, sens, None, loss=loss) + max_constr = constraints.max().item() + + if train: + loss.mean().backward() # Aggregate loss for backward pass + optimizer.step() + + total_loss += loss.mean().item() * x.size(0) + correct += (pred.argmax(1) == y).sum().item() + total += x.size(0) + + return total_loss / total, correct / total, max_constr + + + + + + + +def positive_rate_per_group(out_batch, batch_sens, prob_f=torch.nn.functional.sigmoid): + """ + Calculates the positive rate vector based on the given outputs of the model for the given groups. + + """ + if prob_f is None: + preds = out_batch + else: + preds = prob_f( out_batch ) + pr = PositiveRate() + probs_per_group = pr(preds, batch_sens) + + return probs_per_group + +def posrate_per_group(model, out, batch_sens, batch_labels): + pos_rate_pergroup = positive_rate_per_group(out, batch_sens) + constraints = ((pos_rate_pergroup.unsqueeze(1) - pos_rate_pergroup.unsqueeze(0)).to(torch.float)) + mask = ~torch.eye(batch_sens.shape[-1], dtype=torch.bool) + constraints = constraints[mask] + + return constraints + +def posrate_fairret_constraint(model, out, batch_sens, batch_labels): + statistic = PositiveRate() + fair_criterion = NormLoss(statistic=statistic) + + return fair_criterion(out, batch_sens).unsqueeze(0) + +def weight_constraint(model, out, batch_sens, batch_labels): + norms = [] + for param in model.parameters(): + norm = torch.linalg.norm(param) + norms.append(norm.unsqueeze(0)) + + return torch.concat(norms) + + +@dataclass +class ConstraintMetadata: + """This class is a wrapper for fairness constraints; + it contains the function that computes the constraint + and a function that computes the number of constraints given the number of protected groups + (for example, if the constraint calculates a metric for each pair of groups,`m`would be`n_groups`* (`n_groups` - 1)).""" + fn: Callable[[Any, torch.Tensor, torch.Tensor, torch.Tensor], torch.Tensor] + m_fn: Callable[[int], int] + +class LossPairwise(ConstraintMetadata): + """Wrapper class for a fairness constraint that enforces equal loss across groups. + The constraint is computed as the pairwise difference between the losses for each group.""" + def __init__(self, loss: Callable = None, abs_diff: bool = False): + """ + Args: + loss (Callable): A function that computes the loss for each sample in the batch; must be **unaggregated** (i.e., reduction='none') + If not provided, the constraint will expect the loss to be precomputed and passed as an argument to the compute_constraints function. + """ + super().__init__( + fn=self.compute_constraints, + m_fn=lambda n_groups: n_groups * (n_groups - 1) if not self.abs_diff else n_groups * (n_groups - 1) // 2 + ) + self.abs_diff = abs_diff + if self.abs_diff: + raise NotImplementedError("abs_diff=True is not implemented yet.") + self.loss = loss + + def compute_constraints(self, model, batch_out, batch_sens, batch_labels, loss = None): + if loss is None: + loss = self.loss(batch_out, batch_labels) - print(x, y, pred) + per_group_losses = _get_normalized_per_group_losses(loss, batch_sens).squeeze() + constraints = ((per_group_losses.unsqueeze(1) - per_group_losses.unsqueeze(0))) + mask = ~torch.eye(batch_sens.shape[-1], dtype=torch.bool) + constraints = constraints[mask] + return constraints - exit() - accuracy = correct/total - print(f'Accuracy for {name}: {accuracy}') +def _get_normalized_per_group_losses(loss, sens_onehot): + return loss.unsqueeze(0) @ sens_onehot / sens_onehot.sum(dim=0) if __name__ == "__main__": From bd8e4b3924de0a65ef48ae65acc49339dae7fa3b Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Mon, 4 May 2026 17:24:15 +0200 Subject: [PATCH 03/16] tiny image works now --- tiny_image_net.py | 169 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 125 insertions(+), 44 deletions(-) diff --git a/tiny_image_net.py b/tiny_image_net.py index 84109fb..c110638 100644 --- a/tiny_image_net.py +++ b/tiny_image_net.py @@ -17,6 +17,7 @@ from dataclasses import dataclass import torch import fairret +from humancompatible.train.dual_optim import ALM, MoreauEnvelope, PBM def dataset_to_tensors(dataset, batch_size=512, num_workers=8): @@ -53,7 +54,7 @@ def load_or_cache(dataset, cache_path, batch_size=512, num_workers=8): def train_tinyimagenet(): # define batch size here - batch_size = 400 + batch_size = 1200 # define the path here dataset_path="~/.torchvision/tinyimagenet/" @@ -115,53 +116,76 @@ def remap_targets(dataset, targets): # ----- Build model, criterion, optimizer ----- device = torch.device("cuda") - lr = 1e-3 - epochs = 10 + epochs = 50 loader_name = "val_balanced" # ----- Unconstrained Optimization Adam ----- - constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) - model = build_model().to(device) - criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints - optimizer = torch.optim.Adam(model.parameters(), lr=lr) - scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) + # constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + # model = build_model().to(device) + # criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints + # optimizer = torch.optim.Adam(model.parameters(), lr=0.001) - history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} + # history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} - for epoch in range(1, epochs + 1): - train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], criterion, optimizer, device, train=True) - val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], criterion, optimizer, device, train=False) - # scheduler.step() + # for epoch in range(1, epochs + 1): + # train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], + # criterion, optimizer, device, + # train=True) + # val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], + # criterion, optimizer, device, + # train=False) + # # scheduler.step() - history["train_loss"].append(train_loss) - history["train_acc"].append(train_acc) - history["val_loss"].append(val_loss) - history["val_acc"].append(val_acc) - history["max_constr"].append(max_constr) - print(f"Epoch {epoch:>3}/{epochs} | " - f"train loss {train_loss:.4f} acc {train_acc:.3f} | " - f"val loss {val_loss:.4f} acc {val_acc:.3f}" - f" | max constraint {max_constr:.4f}") + # history["train_loss"].append(train_loss) + # history["train_acc"].append(train_acc) + # history["val_loss"].append(val_loss) + # history["val_acc"].append(val_acc) + # history["max_constr"].append(max_constr) + # print(f"Epoch {epoch:>3}/{epochs} | " + # f"train loss {train_loss:.4f} acc {train_acc:.3f} | " + # f"val loss {val_loss:.4f} acc {val_acc:.3f}" + # f" | max constraint {max_constr:.4f}") - - # ----- SPMB Optimization ----- constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) model = build_model().to(device) criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints - optimizer = torch.optim.Adam(model.parameters(), lr=lr) - # dual_optim = - # scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) + + # Define data and optimizers + optimizer = MoreauEnvelope(torch.optim.Adam(model.parameters(), lr=0.002), mu=2.0) + + dual = PBM( + m=39800, + # penalty_update='dimin', + # penalty_update='dimin_adapt', + penalty_update='const', + pbf = 'quadratic_reciprocal', + gamma=0.95, + init_duals=0.00001, + init_penalties=1., + penalty_range=(0.5, 1.), + penalty_mult=0.99, + dual_range=(0.000001, 100.), + delta=1.0, + device=device + ) history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} for epoch in range(1, epochs + 1): - train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], criterion, optimizer, device, train=True) - val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], criterion, optimizer, device, train=False) + train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], + criterion, optimizer, device, + train=True, dual=dual) + val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], + criterion, optimizer, device, + train=False, dual=dual) # scheduler.step() - + + # print numer of duals smaller than 1e-5 and larger than 100 + print('small duals', (dual.duals <= 1e-5).sum().item()) + print('large duals', (dual.duals >= 100.).sum().item()) history["train_loss"].append(train_loss) history["train_acc"].append(train_acc) history["val_loss"].append(val_loss) @@ -171,6 +195,44 @@ def remap_targets(dataset, targets): f"train loss {train_loss:.4f} acc {train_acc:.3f} | " f"val loss {val_loss:.4f} acc {val_acc:.3f}" f" | max constraint {max_constr:.4f}") + + + # ----- SSLALM Optimization ----- + # constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + # model = build_model().to(device) + # criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints + + # # Define data and optimizers + # optimizer = MoreauEnvelope(torch.optim.Adam(model.parameters(), lr=0.005), mu=2.0) + + # dual = ALM( + # m=39800, + # lr=0.1, + # momentum=0.5, + # # penalty_update='dimin', + # device=device + # ) + + # history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} + + # for epoch in range(1, epochs + 1): + # train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], + # criterion, optimizer, device, + # train=True, dual=dual) + # val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], + # criterion, optimizer, device, + # train=False, dual=dual) + # # scheduler.step() + + # history["train_loss"].append(train_loss) + # history["train_acc"].append(train_acc) + # history["val_loss"].append(val_loss) + # history["val_acc"].append(val_acc) + # history["max_constr"].append(max_constr) + # print(f"Epoch {epoch:>3}/{epochs} | " + # f"train loss {train_loss:.4f} acc {train_acc:.3f} | " + # f"val loss {val_loss:.4f} acc {val_acc:.3f}" + # f" | max constraint {max_constr:.4f}") def build_model(num_classes=200): @@ -182,10 +244,11 @@ def build_model(num_classes=200): return model -def run_epoch(model, loader, criterion, optimizer, device, train=True): +def run_epoch(model, loader, criterion, optimizer, device, train=True, dual=None): model.train() if train else model.eval() - total_loss, correct, total = 0.0, 0, 0 + total_loss, correct, total, total_constr = 0.0, 0, 0, 0.0 constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + threshold = 0.1 # Example threshold for constraint violation ctx = torch.enable_grad() if train else torch.no_grad() with ctx: @@ -194,23 +257,41 @@ def run_epoch(model, loader, criterion, optimizer, device, train=True): if train: optimizer.zero_grad() - - pred = model(x) - loss = criterion(pred, y) - - # calculate the constraints - constraints = constraint_type.compute_constraints(None, pred, sens, None, loss=loss) - max_constr = constraints.max().item() - if train: - loss.mean().backward() # Aggregate loss for backward pass - optimizer.step() + if dual is None: + pred = model(x) + loss = criterion(pred, y) + # calculate the constraints + constraints = constraint_type.compute_constraints(None, None, sens, None, loss=loss) + constraints = constraints - threshold + max_constr = constraints.max().item() + + if train: + loss.mean().backward() # Aggregate loss for backward pass + optimizer.step() + + + elif dual is not None: + pred = model(x) + loss = criterion(pred, y) + constraints = constraint_type.compute_constraints(None, None, sens, None, loss=loss) + constraints = constraints - threshold + max_constr = constraints.max().item() + + # compute the lagrangian value + lagrangian = dual.forward_update(loss.mean(), constraints) + + if train: + lagrangian.backward() + optimizer.step() + optimizer.zero_grad() total_loss += loss.mean().item() * x.size(0) correct += (pred.argmax(1) == y).sum().item() total += x.size(0) - - return total_loss / total, correct / total, max_constr + total_constr += max_constr + + return total_loss / total, correct / total, total_constr / len(loader) From 1fcb6af1a280bba4dba2203f9218b3b83dec9fe0 Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Mon, 4 May 2026 17:47:26 +0200 Subject: [PATCH 04/16] pbm now ignores veeeery small lambdas --- .gitignore | 1 + logs/simulator/err_simulator.out | 18 ++++++++++++++++++ logs/simulator/exdbn_simulator.stdout | 17 +++++++++++++++++ run.batch | 12 +++++++----- setup.txt | 12 +++++++++--- src/humancompatible/train/dual_optim/pbm.py | 9 +++++++-- 6 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 logs/simulator/err_simulator.out create mode 100644 logs/simulator/exdbn_simulator.stdout diff --git a/.gitignore b/.gitignore index a6272e4..8f0bd26 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ requirements_rci.txt benchmark/results benchmark/cache benchmark/data +data/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/logs/simulator/err_simulator.out b/logs/simulator/err_simulator.out new file mode 100644 index 0000000..f9e9ace --- /dev/null +++ b/logs/simulator/err_simulator.out @@ -0,0 +1,18 @@ +/mnt/appl/software/PyTorch/2.7.1-foss-2025a-CUDA-12.8.0/lib/python3.13/site-packages/torch/utils/data/dataloader.py:626: UserWarning: This DataLoader will create 4 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary. + warnings.warn( + train: 0%| | 0/25 [00:00 + train_tinyimagenet() + ~~~~~~~~~~~~~~~~~~^^ + File "/home/bosakad1/humancompatible-train/tiny_image_net.py", line 177, in train_tinyimagenet + train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], + ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + criterion, optimizer, device, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + train=True, dual=dual) + ^^^^^^^^^^^^^^^^^^^^^^ + File "/home/bosakad1/humancompatible-train/tiny_image_net.py", line 239, in run_epoch + lagrangian = dual.forward_update(loss.mean(), constraints.unsqueeze(0)) + File "/home/bosakad1/humancompatible-train/src/humancompatible/train/dual_optim/pbm.py", line 249, in forward_update + cdivp = group_constraints.div(penalties) +RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! diff --git a/logs/simulator/exdbn_simulator.stdout b/logs/simulator/exdbn_simulator.stdout new file mode 100644 index 0000000..6f24714 --- /dev/null +++ b/logs/simulator/exdbn_simulator.stdout @@ -0,0 +1,17 @@ +Dataset has 200 classes. Sample classes: ['n01443537', 'n01629819', 'n01641577', 'n01644900', 'n01698640'] + +Dataset: val | Size: 10000 +Loading cache from ./data/cache_val.pt... + X: torch.Size([10000, 3, 64, 64]), targets: torch.Size([10000]) +tensor(995000) + Loaders created: 'val' and 'val_balanced' +Epoch 1/10 | train loss 5.3459 acc 0.007 | val loss 5.3013 acc 0.005 | max constraint 0.3071 +Epoch 2/10 | train loss 5.2444 acc 0.012 | val loss 5.3078 acc 0.005 | max constraint 0.6606 +Epoch 3/10 | train loss 5.1482 acc 0.016 | val loss 5.2965 acc 0.005 | max constraint 1.6579 +Epoch 4/10 | train loss 4.9798 acc 0.028 | val loss 4.7633 acc 0.043 | max constraint 3.8804 +Epoch 5/10 | train loss 4.7372 acc 0.047 | val loss 4.3450 acc 0.090 | max constraint 9.3368 +Epoch 6/10 | train loss 4.4343 acc 0.079 | val loss 3.9285 acc 0.152 | max constraint 5.1328 +Epoch 7/10 | train loss 4.1320 acc 0.121 | val loss 3.5667 acc 0.219 | max constraint 5.3288 +Epoch 8/10 | train loss 3.7321 acc 0.179 | val loss 2.9391 acc 0.317 | max constraint 5.8890 +Epoch 9/10 | train loss 3.3022 acc 0.248 | val loss 2.3792 acc 0.451 | max constraint 6.3630 +Epoch 10/10 | train loss 2.7599 acc 0.359 | val loss 1.7547 acc 0.586 | max constraint 6.0408 diff --git a/run.batch b/run.batch index 6426706..d945c2e 100644 --- a/run.batch +++ b/run.batch @@ -1,18 +1,20 @@ #!/bin/sh #SBATCH --time=4:00:00 -#SBATCH --partition=h200fast +#SBATCH --partition=amdgpufast #SBATCH --nodes=1 -#SBATCH --mem=100G +#SBATCH --mem=150G #SBATCH --gres=gpu:1 #SBATCH --cpus-per-task=1 -#SBATCH --out=./logs/simulator/exdbn_simulator.stdout -#SBATCH --err=./logs/simulator/err_simulator.out +#SBATCH --out=./logs/simulator/output_tiny.stdout +#SBATCH --err=./logs/simulator/err_tiny.out #SBATCH --mail-user=bosakad1@fel.cvut.cz #SBATCH --mail-type=ALL #SBATCH --job-name=humancompatible ml load Python/3.13.1-GCCcore-14.2.0 ml load GCCcore/14.2.0 +ml load PyTorch/2.7.1-foss-2025a-CUDA-12.8.0 +ml load torchvision/0.22.1-foss-2025a-CUDA-12.8.0 source env_humancompatible/bin/activate -python3 train_4_optimizers.py +python3 tiny_image_net.py diff --git a/setup.txt b/setup.txt index 2e71dc5..4fad533 100644 --- a/setup.txt +++ b/setup.txt @@ -1,10 +1,16 @@ srun -p gpufast --gres=gpu:1 --pty bash -i -srun -p h200fast --gres=gpu:1 --pty bash -i +srun -p h200fast --mem=150GB --gres=gpu:1 --pty bash -i ml load Python/3.13.1-GCCcore-14.2.0 ml load GCCcore/14.2.0 -ml load PyTorch/2.10.0-foss-2025a-CUDA-12.8.0 +ml load PyTorch/2.7.1-foss-2025a-CUDA-12.8.0 ml load torchvision/0.22.1-foss-2025a-CUDA-12.8.0 -source env_humancompatible/bin/activate \ No newline at end of file +source env_humancompatible/bin/activate + + + + +# old +ml load PyTorch/2.10.0-foss-2025a-CUDA-12.8.0 \ No newline at end of file diff --git a/src/humancompatible/train/dual_optim/pbm.py b/src/humancompatible/train/dual_optim/pbm.py index 6ee38ec..3af6cb8 100644 --- a/src/humancompatible/train/dual_optim/pbm.py +++ b/src/humancompatible/train/dual_optim/pbm.py @@ -170,7 +170,6 @@ def add_constraint_group( :type primal_update_process_length: int """ - params, settings_dict = self._init_constraint_group(m, penalty_mult, penalty_update, delta, pbf, init_duals, init_penalties, momentum, self.dual_range, self.penalty_range, primal_update_process_length) param_group_dict = {"params": params, **settings_dict} self.add_param_group(param_group_dict) @@ -255,8 +254,14 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: cdivp = group_constraints.div(penalties) pbf_val = penalty_barrier_funcs[pbf]['f'](cdivp) - lagrangian.add_(duals.mul(penalties) @ pbf_val) + # change duals to 0 for them < 1e-4, but do not overwrite the actual duals to keep the momentum working + active = duals >= 1e-5 + if active.any(): + lagrangian.add_(duals[active].mul(penalties[active]) @ pbf_val[active]) + + # lagrangian.add_(duals.mul(penalties) @ pbf_val) + # update the iter self.iter = (self.iter + 1) % primal_update_process_length From fa4e36abb4bb4b247457d80338bbc7c2698b6a9b Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Mon, 4 May 2026 23:42:44 +0200 Subject: [PATCH 05/16] helmholtz PINN implemented --- PDEs/AL-PINNs | 1 + PDEs/Helmholtz/Helmholtz.py | 260 ++++++++++++++++++++ PDEs/Helmholtz/Helmholtz_AL-PINNs.py | 143 +++++++++++ PDEs/Helmholtz/Helmholtz_test | Bin 0 -> 133279 bytes PDEs/Helmholtz/networks.py | 99 ++++++++ PDEs/Helmholtz/results.png | Bin 0 -> 85773 bytes src/humancompatible/train/dual_optim/pbm.py | 2 - tiny_image_net.py | 84 ++++--- 8 files changed, 547 insertions(+), 42 deletions(-) create mode 160000 PDEs/AL-PINNs create mode 100644 PDEs/Helmholtz/Helmholtz.py create mode 100644 PDEs/Helmholtz/Helmholtz_AL-PINNs.py create mode 100644 PDEs/Helmholtz/Helmholtz_test create mode 100644 PDEs/Helmholtz/networks.py create mode 100644 PDEs/Helmholtz/results.png diff --git a/PDEs/AL-PINNs b/PDEs/AL-PINNs new file mode 160000 index 0000000..df4378c --- /dev/null +++ b/PDEs/AL-PINNs @@ -0,0 +1 @@ +Subproject commit df4378cb7688d9a6e7ee8d97850e7a92fbbe0192 diff --git a/PDEs/Helmholtz/Helmholtz.py b/PDEs/Helmholtz/Helmholtz.py new file mode 100644 index 0000000..031ec86 --- /dev/null +++ b/PDEs/Helmholtz/Helmholtz.py @@ -0,0 +1,260 @@ +from tqdm import tqdm +import pickle as pkl +import numpy as np +import copy +import sys +import argparse +import torch +from torch.autograd import Variable +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset +from humancompatible.train.dual_optim import ALM, MoreauEnvelope, PBM + +from networks import set_model, u_Net_shallow_wide, u_Net_shallow_wide_resnet, u_Net_deep_narrow, u_Net_deep_narrow_resnet + +# Equation parameter +k, a1, a2 = 1, 1, 4 + +def q(data) : + x, y = data[:,0].view(-1,1), data[:,1].view(-1,1) + return -((a1*np.pi)**2)*torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) \ + -((a2*np.pi)**2)*torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) \ + +(k**2)*torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) + +def analytic(data) : + x, y = data[:,0].view(-1,1), data[:,1].view(-1,1) + return torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) + +def calculate_derivative(y, x) : + return torch.autograd.grad(y, x, create_graph=True,\ + grad_outputs=torch.ones(y.size()).to(device))[0] + + +def calculate_all_partial(u, x) : + del_u = calculate_derivative(u, x) + u_x, u_y = del_u[:,0], del_u[:,1] + u_xx = calculate_derivative(u_x, x)[:,0] + u_yy = calculate_derivative(u_y, x)[:,1] + return u_xx.view(-1,1), u_yy.view(-1,1) + + +def train(u_model, beta, trainloader, bdry_data, val_test, optimizer, loss_f, dual_opt=None) : + loss_list, loss_list1, loss_list2, val_list, test_list = [], [], [], [], [] + X_bdry, u_bdry = bdry_data + X_val, y_val, X_test, y_test = val_test + + for i, (data,) in enumerate(trainloader) : + u_model.train() + optimizer.zero_grad() + X_v = Variable(data, requires_grad=True).to(device) + output = u_model(X_v) + output_bdry = u_model(X_bdry) + + u_xx, u_yy = calculate_all_partial(output, X_v) + loss1 = loss_f(u_xx + u_yy + (k**2)*output - q(X_v), torch.zeros_like(output)) + constraint = loss_f(output_bdry, torch.zeros_like(output_bdry)) + + # adam optimizer + if dual_opt is None : + loss = loss1 + beta*constraint + loss.backward() + optimizer.step() + + elif dual_opt is not None: + threshold = 0.01 + constraint = constraint - threshold + + # compute the lagrangian value + lagrangian = dual_opt.forward_update(loss1, constraint.unsqueeze(0)) + lagrangian.backward() + optimizer.step() + optimizer.zero_grad() + + + u_model.eval() + val_err = torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item() + test_err = torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item() + + loss_list.append((loss1+constraint).item()) + loss_list1.append(loss1.item()) + loss_list2.append(constraint.item()) + val_list.append(val_err) + test_list.append(test_err) + + return np.mean(loss_list), np.mean(loss_list1), np.mean(loss_list2), np.mean(val_list), np.mean(test_list) + + +def main_function(model_name, beta, lr, EPOCH, device) : + + # Dataset Creation + xmin, xmax = -1,1 + ymin, ymax = -1,1 + Nx, Ny = 51, 51 + X_train = torch.FloatTensor(np.mgrid[xmin:xmax:51j, ymin:ymax:51j].reshape(2, -1).T).to(device) + + # Boundary Conditions + X_bdry = X_train[(X_train[:,0]==xmin) + (X_train[:,0]==xmax) + (X_train[:,1]==ymin) + (X_train[:,1]==ymax)] + u_bdry = torch.zeros_like(X_bdry[:,0]).to(device).view(-1,1) + + X_test, y_test, X_val, y_val= torch.load('./PDEs/Helmholtz/Helmholtz_test', map_location=device) + + # Make dataloader + data_train = TensorDataset(X_train) + train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) + + # train + torch.manual_seed(0) + total_loss, test_errs, val_errs, constraints = [], [], [], [] + u_model = set_model(model_name, device) + optimizer=torch.optim.Adam([{'params': u_model.parameters()}], lr=lr) + best_model = copy.deepcopy(u_model) + + # unconstrained ADAM + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + bdry_data=[X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss()) + + val_errs.append(val_err) + test_errs.append(test_err) + total_loss.append(loss) + constraints.append(loss2) + + #Print Log + if t%100 == 0 : + print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + (t, EPOCH, loss, loss1, loss2, val_err, test_err)) + + if np.argmin(val_errs) == t : + best_model = copy.deepcopy(u_model) + + + # SPBM + torch.manual_seed(0) + total_loss_spbm, test_errs_spbm, val_errs_spbm, constraints_spbm = [], [], [], [] + u_model = set_model(model_name, device) + + # Define data and optimizers + optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=lr), mu=2.0) + + dual = PBM( + m=1, + # penalty_update='dimin', + # penalty_update='dimin_adapt', + penalty_update='const', + pbf = 'quadratic_logarithmic', + gamma=0.1, + init_duals=0.01, + init_penalties=1., + penalty_range=(0.5, 1.), + penalty_mult=0.99, + dual_range=(0.01, 100.), + delta=1.0, + device=device + ) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + bdry_data=[X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss(), + dual_opt=dual) + + val_errs_spbm.append(val_err) + test_errs_spbm.append(test_err) + total_loss_spbm.append(loss) + constraints_spbm.append(loss2) + + #Print Log + if t%100 == 0 : + print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + (t, EPOCH, loss, loss1, loss2, val_err, test_err)) + + if np.argmin(val_errs_spbm) == t : + best_model = copy.deepcopy(u_model) + + # ALM + torch.manual_seed(0) + total_loss_alm, test_errs_alm, val_errs_alm, constraints_alm = [], [], [], [] + u_model = set_model(model_name, device) + + # Define data and optimizers + optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=lr), mu=2.0) + + dual = ALM( + m=1, + lr=0.1, + momentum=0.5, + device=device + ) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + bdry_data=[X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss(), + dual_opt=dual) + + val_errs_alm.append(val_err) + test_errs_alm.append(test_err) + total_loss_alm.append(loss) + constraints_alm.append(loss2) + + #Print Log + if t%100 == 0 : + print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + (t, EPOCH, loss, loss1, loss2, val_err, test_err)) + + if np.argmin(val_errs_spbm) == t : + best_model = copy.deepcopy(u_model) + + + # plot the resultsimport matplotlib.pyplot as plt + import matplotlib.pyplot as plt + fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # wider figure + + axes[0].plot(total_loss, label='Adam') + axes[0].plot(total_loss_spbm, label='SPBM') + axes[0].plot(total_loss_alm, label='ALM') + axes[0].set_xlabel('Epoch') + axes[0].set_ylabel('Train Total Loss') + axes[0].legend() + + axes[1].plot(test_errs, label='Adam') + axes[1].plot(test_errs_spbm, label='SPBM') + axes[1].plot(test_errs_alm, label='ALM') + axes[1].set_xlabel('Epoch') + axes[1].set_ylabel('Test Error') + axes[1].legend() + + axes[2].plot(constraints, label='Adam') + axes[2].plot(constraints_spbm, label='SPBM') + axes[2].plot(constraints_alm, label='ALM') + axes[2].set_xlabel('Epoch') + axes[2].set_ylabel('Boundary Constraint Violation') + axes[2].legend() + + plt.tight_layout(pad=2.0) # extra padding between subplots + plt.savefig('./PDEs/Helmholtz/results.png', bbox_inches='tight') + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--model', default='deep_narrow', help='Specify the model. Choose one of [deep_narrow, shallow_wide, deep_narrow_resent, shallow_wide_resnet].') + parser.add_argument('--beta', default=1, type=float, help='Penalty parameter beta') + parser.add_argument('--lr', default=1e-4, type=float, help='Learning rate') + parser.add_argument('--EPOCH', default=4000, type=int, help='Number of training EPOCH') + parser.add_argument('--ordinal', default=0, type=int, help='Specify the cuda device ordinal.') + args = parser.parse_args() + + device = torch.device("cuda:{}".format(args.ordinal) if torch.cuda.is_available() else "cpu") + + main_function(args.model, args.beta, args.lr, args.EPOCH, device) + \ No newline at end of file diff --git a/PDEs/Helmholtz/Helmholtz_AL-PINNs.py b/PDEs/Helmholtz/Helmholtz_AL-PINNs.py new file mode 100644 index 0000000..41c3e15 --- /dev/null +++ b/PDEs/Helmholtz/Helmholtz_AL-PINNs.py @@ -0,0 +1,143 @@ +from tqdm import tqdm +import pickle as pkl +import numpy as np +import copy +import argparse +import sys +sys.path.append("..") + +import torch +from torch.autograd import Variable +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset + +from networks import set_model, u_Net_shallow_wide, u_Net_shallow_wide_resnet, u_Net_deep_narrow, u_Net_deep_narrow_resnet + +# Equation parameter +k, a1, a2 = 1, 1, 4 + +def q(data) : + x, y = data[:,0].view(-1,1), data[:,1].view(-1,1) + return -((a1*np.pi)**2)*torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) \ + -((a2*np.pi)**2)*torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) \ + +(k**2)*torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) + +def analytic(data) : + x, y = data[:,0].view(-1,1), data[:,1].view(-1,1) + return torch.sin(a1*np.pi*x)*torch.sin(a2*np.pi*y) + +def calculate_derivative(y, x) : + return torch.autograd.grad(y, x, create_graph=True,\ + grad_outputs=torch.ones(y.size()).to(device))[0] + + +def calculate_all_partial(u, x) : + del_u = calculate_derivative(u, x) + u_x, u_y = del_u[:,0], del_u[:,1] + u_xx = calculate_derivative(u_x, x)[:,0] + u_yy = calculate_derivative(u_y, x)[:,1] + return u_xx.view(-1,1), u_yy.view(-1,1) + + + +def train(u_model, beta, lbd, trainloader, bdry_data, val_test, optimizer, loss_f) : + loss_list, loss_list1, loss_list2, val_list, test_list = [], [], [], [], [] + X_bdry, u_bdry = bdry_data + X_val, y_val, X_test, y_test = val_test + + for i, (data,) in enumerate(trainloader) : + u_model.train() + optimizer.zero_grad() + X_v = Variable(data, requires_grad=True).to(device) + output = u_model(X_v) + output_bdry = u_model(X_bdry) + + u_xx, u_yy = calculate_all_partial(output, X_v) + loss1 = loss_f(u_xx + u_yy + (k**2)*output - q(X_v), torch.zeros_like(output)) + loss2 = loss_f(output_bdry, torch.zeros_like(output_bdry)) + + loss = loss1 + beta*loss2 + (lbd*output_bdry.view(-1)).mean() + loss.backward() + lbd.grad *= -1 + + optimizer.step() + + u_model.eval() + val_err = torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item() + test_err = torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item() + + loss_list.append((loss1+loss2).item()) + loss_list1.append(loss1.item()) + loss_list2.append(loss2.item()) + val_list.append(val_err) + test_list.append(test_err) + + return np.mean(loss_list), np.mean(loss_list1), np.mean(loss_list2), np.mean(val_list), np.mean(test_list) + + +def main_function(model_name, beta, lr, lbd_lr, EPOCH, device) : + + # Dataset Creation + xmin, xmax = -1,1 + ymin, ymax = -1,1 + Nx, Ny = 51, 51 + X_train = torch.FloatTensor(np.mgrid[xmin:xmax:51j, ymin:ymax:51j].reshape(2, -1).T).to(device) + + # Boundary Conditions + X_bdry = X_train[(X_train[:,0]==xmin) + (X_train[:,0]==xmax) + (X_train[:,1]==ymin) + (X_train[:,1]==ymax)] + u_bdry = torch.zeros_like(X_bdry[:,0]).to(device).view(-1,1) + + X_test, y_test, X_val, y_val= torch.load('Helmholtz_test', map_location=device) + + # Make dataloader + data_train = TensorDataset(X_train) + train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) + + # train + total_loss, test_errs, val_errs = [], [], [] + u_model = set_model(model_name, device) + lbd = Variable(torch.FloatTensor([0]*X_bdry.size()[0]).to(device), requires_grad=True) + + optimizer=torch.optim.Adam([{'params': u_model.parameters()}, {'params': lbd, 'lr':lbd_lr}], lr=lr) + best_model = copy.deepcopy(u_model) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, val_err, test_err = train(u_model, beta, lbd, trainloader=train_loader,\ + bdry_data=[X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss()) + + val_errs.append(val_err) + test_errs.append(test_err) + total_loss.append(loss) + +# # Print Log +# if t%100 == 0 : +# print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ +# (t, EPOCH, loss, loss1, loss2, val_err, test_err)) + + if np.argmin(val_errs) == t : + best_model = copy.deepcopy(u_model) + + return best_model, total_loss, val_errs, test_errs + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--model', default='deep_narrow', help='Specify the model. Choose one of [deep_narrow, shallow_wide, deep_narrow_resent, shallow_wide_resnet].') + parser.add_argument('--beta', default=1000, type=float, help='Penalty parameter beta') + parser.add_argument('--lr', default=1e-3, type=float, help='Learning rate') + parser.add_argument('--lbd_lr', default=1, type=float, help='Learning rate for lambda') + parser.add_argument('--EPOCH', default=10000, type=int, help='Number of training EPOCH') + parser.add_argument('--ordinal', default=0, type=int, help='Specify the cuda device ordinal.') + args = parser.parse_args() + + device = torch.device("cuda:{}".format(args.ordinal) if torch.cuda.is_available() else "cpu") + + best_model, total_loss, val_errs, test_errs = main_function(args.model, args.beta, args.lr, args.lbd_lr, args.EPOCH, device) + print('Best Test Error : ', test_errs[np.argmin(val_errs)]) + \ No newline at end of file diff --git a/PDEs/Helmholtz/Helmholtz_test b/PDEs/Helmholtz/Helmholtz_test new file mode 100644 index 0000000000000000000000000000000000000000..a572d0570931afea69e1c30c413ac2c0f3ce0065 GIT binary patch literal 133279 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

-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�F|B-Yu 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

Md}2eV~!8=C84fGQihfc}qcG`&>?6;IYe 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 mF-QC^Y{hf2&&-1?b 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 LA{C0{OoILwwM%^t literal 0 HcmV?d00001 diff --git a/src/humancompatible/train/dual_optim/pbm.py b/src/humancompatible/train/dual_optim/pbm.py index 3af6cb8..146ca20 100644 --- a/src/humancompatible/train/dual_optim/pbm.py +++ b/src/humancompatible/train/dual_optim/pbm.py @@ -259,8 +259,6 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: active = duals >= 1e-5 if active.any(): lagrangian.add_(duals[active].mul(penalties[active]) @ pbf_val[active]) - - # lagrangian.add_(duals.mul(penalties) @ pbf_val) # update the iter self.iter = (self.iter + 1) % primal_update_process_length diff --git a/tiny_image_net.py b/tiny_image_net.py index c110638..8d44e1b 100644 --- a/tiny_image_net.py +++ b/tiny_image_net.py @@ -73,34 +73,38 @@ def train_tinyimagenet(): ]) - # --- Load datasets --- train = TinyImageNet(Path(dataset_path), split="train", transform=train_transform, imagenet_idx=False) - val = TinyImageNet(Path(dataset_path), split="val", transform=normalize_transform, imagenet_idx=False) - test = TinyImageNet(Path(dataset_path), split="test", transform=normalize_transform, imagenet_idx=False) + val_full = TinyImageNet(Path(dataset_path), split="val", transform=normalize_transform, imagenet_idx=False) + print(f"Dataset has {len(train.classes)} classes. Sample classes: {train.classes[:5]}") + + # --- Cache and split val into val/test --- + X_val_full, targets_val_full = load_or_cache(val_full, cache_path="./data/cache_val.pt") - class_to_idx = train.class_to_idx - def remap_targets(dataset, targets): - return torch.tensor([class_to_idx[dataset.classes[t]] for t in targets]) + n = len(X_val_full) + idx = torch.randperm(n, generator=torch.Generator().manual_seed(42)) + split = n // 2 + val_idx, test_idx = idx[:split], idx[split:] + + raw_splits = { + "train": load_or_cache(train, cache_path="./data/cache_train.pt"), + "val": (X_val_full[val_idx], targets_val_full[val_idx]), + "test": (X_val_full[test_idx], targets_val_full[test_idx]), + } - # datasets = {"train": train, "val": val, "test": test} - datasets = {"val": val} - # --- Build loaders --- loaders = {} - for name, dataset in datasets.items(): - print(f"\nDataset: {name} | Size: {len(dataset)}") - - X, targets = load_or_cache(dataset, cache_path=f"./data/cache_{name}.pt") + for name, (X, targets) in raw_splits.items(): + print(f"\nDataset: {name} | Size: {len(X)}") print(f" X: {X.shape}, targets: {targets.shape}") - # onehot groups groups_onehot = torch.eye(200)[targets] - dataset_torch = torch.utils.data.TensorDataset(X, groups_onehot, targets) - - print(targets.sum()) + + group_counts = torch.bincount(targets, minlength=200) + print("Samples per group:", group_counts) + sampler = BalancedBatchSampler( group_onehot=groups_onehot, batch_size=batch_size, drop_last=True ) @@ -116,36 +120,36 @@ def remap_targets(dataset, targets): # ----- Build model, criterion, optimizer ----- device = torch.device("cuda") - epochs = 50 + epochs = 5 loader_name = "val_balanced" # ----- Unconstrained Optimization Adam ----- - # constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) - # model = build_model().to(device) - # criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints - # optimizer = torch.optim.Adam(model.parameters(), lr=0.001) + constraint_type = LossPairwise(loss=nn.CrossEntropyLoss(reduction='none')) + model = build_model().to(device) + criterion = nn.CrossEntropyLoss(reduction='none') # Unaggregated loss for fairness constraints + optimizer = torch.optim.Adam(model.parameters(), lr=0.001) - # history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} + history = {"train_loss": [], "train_acc": [], "val_loss": [], "val_acc": [], "max_constr": []} - # for epoch in range(1, epochs + 1): - # train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], - # criterion, optimizer, device, - # train=True) - # val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], - # criterion, optimizer, device, - # train=False) - # # scheduler.step() + for epoch in range(1, epochs + 1): + train_loss, train_acc, max_constr = run_epoch(model, loaders[loader_name], + criterion, optimizer, device, + train=True) + val_loss, val_acc, max_constr = run_epoch(model, loaders["val_balanced"], + criterion, optimizer, device, + train=False) + # scheduler.step() - # history["train_loss"].append(train_loss) - # history["train_acc"].append(train_acc) - # history["val_loss"].append(val_loss) - # history["val_acc"].append(val_acc) - # history["max_constr"].append(max_constr) - # print(f"Epoch {epoch:>3}/{epochs} | " - # f"train loss {train_loss:.4f} acc {train_acc:.3f} | " - # f"val loss {val_loss:.4f} acc {val_acc:.3f}" - # f" | max constraint {max_constr:.4f}") + history["train_loss"].append(train_loss) + history["train_acc"].append(train_acc) + history["val_loss"].append(val_loss) + history["val_acc"].append(val_acc) + history["max_constr"].append(max_constr) + print(f"Epoch {epoch:>3}/{epochs} | " + f"train loss {train_loss:.4f} acc {train_acc:.3f} | " + f"val loss {val_loss:.4f} acc {val_acc:.3f}" + f" | max constraint {max_constr:.4f}") # ----- SPMB Optimization ----- From 7a744c6848d96444f7eaa3f3dfafb8e62ac1ceab Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Tue, 5 May 2026 10:56:02 +0200 Subject: [PATCH 06/16] viscous burgers PDE implemented --- PDEs/Helmholtz/Helmholtz.py | 1 + PDEs/Viscous_Burgers/Burgers_test | Bin 0 -> 133279 bytes PDEs/Viscous_Burgers/Viscous_Burgers.py | 270 ++++++++++++++++++ .../Viscous_Burgers_AL-PINNs.py | 146 ++++++++++ PDEs/Viscous_Burgers/networks.py | 99 +++++++ PDEs/Viscous_Burgers/results.png | Bin 0 -> 108917 bytes 6 files changed, 516 insertions(+) create mode 100644 PDEs/Viscous_Burgers/Burgers_test create mode 100644 PDEs/Viscous_Burgers/Viscous_Burgers.py create mode 100644 PDEs/Viscous_Burgers/Viscous_Burgers_AL-PINNs.py create mode 100644 PDEs/Viscous_Burgers/networks.py create mode 100644 PDEs/Viscous_Burgers/results.png diff --git a/PDEs/Helmholtz/Helmholtz.py b/PDEs/Helmholtz/Helmholtz.py index 031ec86..f62806d 100644 --- a/PDEs/Helmholtz/Helmholtz.py +++ b/PDEs/Helmholtz/Helmholtz.py @@ -61,6 +61,7 @@ def train(u_model, beta, trainloader, bdry_data, val_test, optimizer, loss_f, du loss = loss1 + beta*constraint loss.backward() optimizer.step() + optimizer.zero_grad() elif dual_opt is not None: threshold = 0.01 diff --git a/PDEs/Viscous_Burgers/Burgers_test b/PDEs/Viscous_Burgers/Burgers_test new file mode 100644 index 0000000000000000000000000000000000000000..68aeba6dc7084f0c458ee70dd1e49aa6002c4e23 GIT binary patch literal 133279 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%0AX< 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 Y{r^8td%24I*XE)Eq5}VH|G&5WU&j=m=l}o! literal 0 HcmV?d00001 diff --git a/PDEs/Viscous_Burgers/Viscous_Burgers.py b/PDEs/Viscous_Burgers/Viscous_Burgers.py new file mode 100644 index 0000000..6b1f614 --- /dev/null +++ b/PDEs/Viscous_Burgers/Viscous_Burgers.py @@ -0,0 +1,270 @@ +from tqdm import tqdm +import pickle as pkl +import numpy as np +import copy +import argparse +import sys +sys.path.append("..") + +import torch +from torch.autograd import Variable +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset +from humancompatible.train.dual_optim import ALM, MoreauEnvelope, PBM + +from networks import set_model, u_Net_shallow_wide, u_Net_shallow_wide_resnet, u_Net_deep_narrow, u_Net_deep_narrow_resnet + +# Equation parameter + +nu = 0.01/np.pi + +def calculate_derivative(y, x) : + return torch.autograd.grad(y, x, create_graph=True,\ + grad_outputs=torch.ones(y.size()).to(device))[0] + +def calculate_all_partial(u, x) : + del_u = calculate_derivative(u, x) + u_t, u_x = del_u[:,0], del_u[:,1] + u_xx = calculate_derivative(u_x, x)[:,1] + return u_t.view(-1,1), u_x.view(-1,1), u_xx.view(-1,1) + + +def train(u_model, beta, trainloader, ini_bdry_data, val_test, optimizer, loss_f, dual_opt=None) : + loss_list, loss_list1, loss_list2, loss_list3, val_list, test_list = [], [], [], [], [], [] + X_ini, u_ini, X_bdry, u_bdry = ini_bdry_data + X_val, y_val, X_test, y_test = val_test + + for i, (data,) in enumerate(trainloader) : + u_model.train() + optimizer.zero_grad() + X_v = Variable(data, requires_grad=True).to(device) + output = u_model(X_v) + output_ini = u_model(X_ini) + output_bdry = u_model(X_bdry) + + u_t, u_x, u_xx = calculate_all_partial(output, X_v) + loss1 = loss_f(u_t + output*u_x - nu*u_xx, torch.zeros_like(u_t)) + loss2 = loss_f(output_ini-u_ini, torch.zeros_like(output_ini)) + loss3 = loss_f(output_bdry, torch.zeros_like(output_bdry)) + + # unconstrained Adam + if dual_opt is None : + loss = loss1 + beta*loss2 + beta*loss3 + loss.backward() + optimizer.step() + optimizer.zero_grad() + + elif dual_opt is not None: + threshold = 1e-4 + constraints = torch.stack([loss2, loss3], dim=0) + constraints = constraints - threshold + + # compute the lagrangian value + lagrangian = dual_opt.forward_update(loss1, constraints) + lagrangian.backward() + optimizer.step() + optimizer.zero_grad() + + u_model.eval() + val_err = torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item() + test_err = torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item() + + loss_list.append((loss1+loss2+loss3).item()) + loss_list1.append(loss1.item()) + loss_list2.append(loss2.item()) + loss_list3.append(loss3.item()) + val_list.append(val_err) + test_list.append(test_err) + + return np.mean(loss_list), np.mean(loss_list1), np.mean(loss_list2),\ + np.mean(loss_list3), np.mean(val_list), np.mean(test_list) + + +def main_function(model_name, beta, lr, EPOCH, device) : + + # Dataset Creation + tmin, tmax = 0, 1 + xmin, xmax = -1,1 + Ns, Nx = 51, 51 + X_train = torch.FloatTensor(np.mgrid[tmin:tmax:51j, xmin:xmax:51j].reshape(2, -1).T).to(device) + + # Initial Conditions + X_ini = X_train[X_train[:,0]==tmin] + u_ini = -torch.sin(np.pi*X_ini[:,1].view(-1,1)) + + # Boundary Conditions + X_bdry = X_train[(X_train[:,1]==xmin) + (X_train[:,1]==xmax)] + u_bdry = torch.zeros_like(X_bdry[:,0]).to(device).view(-1,1) + + # Validation & Test Set + X_test, y_test, X_val, y_val= torch.load('./PDEs/Viscous_Burgers/Burgers_test', map_location=device) + + # Make dataloader + data_train = TensorDataset(X_train) + train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) + + # train + torch.manual_seed(0) + total_loss, test_errs, val_errs, constraints = [], [], [], [] + u_model = set_model(model_name, device) + optimizer=torch.optim.Adam([{'params': u_model.parameters()}], lr=lr) + best_model = copy.deepcopy(u_model) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, loss3, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + ini_bdry_data=[X_ini, u_ini, X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss(), + dual_opt=None) + + # val_errs.append(torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item()) + # test_errs.append(torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item()) + # total_loss.append(loss) + + val_errs.append(val_err) + test_errs.append(test_err) + total_loss.append(loss) + constraints.append([loss2, loss3]) # append both costraint + + # Print Log + if t%100 == 0 : + print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + (t, EPOCH, loss, loss1, loss2+loss3, val_err, test_err)) + + if np.argmin(val_errs) == t : + best_model = copy.deepcopy(u_model) + + + + # SPBM + torch.manual_seed(0) + total_loss_spbm, test_errs_spbm, val_errs_spbm, constraints_spbm = [], [], [], [] + u_model = set_model(model_name, device) + + # Define data and optimizers + optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=0.005), mu=2.0) + + dual = PBM( + m=2, + # penalty_update='dimin', + # penalty_update='dimin_adapt', + penalty_update='const', + pbf = 'quadratic_logarithmic', + gamma=0.9, + init_duals=0.01, + init_penalties=1., + penalty_range=(0.5, 1.), + penalty_mult=0.99, + dual_range=(0.01, 100.), + delta=1.0, + device=device + ) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, loss3, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + ini_bdry_data=[X_ini, u_ini, X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss(), + dual_opt=dual) + + val_errs_spbm.append(val_err) + test_errs_spbm.append(test_err) + total_loss_spbm.append(loss) + constraints_spbm.append([loss2, loss3]) + + #Print Log + if t%100 == 0 : + print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + (t, EPOCH, loss, loss1, loss2+loss3, val_err, test_err)) + + if np.argmin(val_errs_spbm) == t : + best_model = copy.deepcopy(u_model) + + # ALM + torch.manual_seed(0) + total_loss_alm, test_errs_alm, val_errs_alm, constraints_alm = [], [], [], [] + u_model = set_model(model_name, device) + + # Define data and optimizers + optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=0.005), mu=2.0) + + dual = ALM( + m=2, + lr=0.1, + momentum=0.5, + device=device + ) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, loss3, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + ini_bdry_data=[X_ini, u_ini, X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss(), + dual_opt=dual) + + val_errs_alm.append(val_err) + test_errs_alm.append(test_err) + total_loss_alm.append(loss) + constraints_alm.append([loss2, loss3]) + + #Print Log + if t%100 == 0 : + print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + (t, EPOCH, loss, loss1, loss2+loss3, val_err, test_err)) + + if np.argmin(val_errs_alm) == t : + best_model = copy.deepcopy(u_model) + + + # plot the resultsimport matplotlib.pyplot as plt + import matplotlib.pyplot as plt + fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # wider figure + + axes[0].plot(total_loss, label='Adam') + axes[0].plot(total_loss_spbm, label='SPBM') + axes[0].plot(total_loss_alm, label='ALM') + axes[0].set_xlabel('Epoch') + axes[0].set_ylabel('Train Total Loss') + axes[0].legend() + + axes[1].plot(test_errs, label='Adam') + axes[1].plot(test_errs_spbm, label='SPBM') + axes[1].plot(test_errs_alm, label='ALM') + axes[1].set_xlabel('Epoch') + axes[1].set_ylabel('Test Error') + axes[1].legend() + + # plot both constraints + methods shuold have the same color but dashed vs solid + axes[2].plot([c[0] for c in constraints], label='Adam - Initial Condition', linestyle='--', color='blue') + axes[2].plot([c[1] for c in constraints], label='Adam - Boundary Condition', linestyle='-', color='blue') + axes[2].plot([c[0] for c in constraints_spbm], label='SPBM - Initial Condition', linestyle='--', color='green') + axes[2].plot([c[1] for c in constraints_spbm], label='SPBM - Boundary Condition', linestyle='-', color='green') + axes[2].plot([c[0] for c in constraints_alm], label='ALM - Initial Condition', linestyle='--', color='red') + axes[2].plot([c[1] for c in constraints_alm], label='ALM - Boundary Condition', linestyle='-', color='red') + axes[2].set_xlabel('Epoch') + axes[2].set_ylabel('Constraint Violation') + axes[2].legend() + + plt.tight_layout(pad=2.0) # extra padding between subplots + plt.savefig('./PDEs/Viscous_Burgers/results.png', bbox_inches='tight') + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--model', default='deep_narrow', help='Specify the model. Choose one of [deep_narrow, shallow_wide, deep_narrow_resent, shallow_wide_resnet].') + parser.add_argument('--beta', default=1, type=float, help='Penalty parameter beta') + parser.add_argument('--lr', default=1e-3, type=float, help='Learning rate') + parser.add_argument('--EPOCH', default=1000, type=int, help='Number of training EPOCH') + parser.add_argument('--ordinal', default=0, type=int, help='Specify the cuda device ordinal.') + args = parser.parse_args() + + device = torch.device("cuda:{}".format(args.ordinal) if torch.cuda.is_available() else "cpu") + + main_function(args.model, args.beta, args.lr, args.EPOCH, device) + \ No newline at end of file diff --git a/PDEs/Viscous_Burgers/Viscous_Burgers_AL-PINNs.py b/PDEs/Viscous_Burgers/Viscous_Burgers_AL-PINNs.py new file mode 100644 index 0000000..17488ba --- /dev/null +++ b/PDEs/Viscous_Burgers/Viscous_Burgers_AL-PINNs.py @@ -0,0 +1,146 @@ +from tqdm import tqdm +import pickle as pkl +import numpy as np +import copy +import argparse +import sys +sys.path.append("..") + +import torch +from torch.autograd import Variable +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset + +from networks import set_model, u_Net_shallow_wide, u_Net_shallow_wide_resnet, u_Net_deep_narrow, u_Net_deep_narrow_resnet + +# Equation parameter + +nu = 0.01/np.pi + +def calculate_derivative(y, x) : + return torch.autograd.grad(y, x, create_graph=True,\ + grad_outputs=torch.ones(y.size()).to(device))[0] + +def calculate_all_partial(u, x) : + del_u = calculate_derivative(u, x) + u_t, u_x = del_u[:,0], del_u[:,1] + u_xx = calculate_derivative(u_x, x)[:,1] + return u_t.view(-1,1), u_x.view(-1,1), u_xx.view(-1,1) + + +def train(u_model, lbd1, lbd2, beta, trainloader, ini_bdry_data, val_test, optimizer, loss_f) : + loss_list, loss_list1, loss_list2, loss_list3, val_list, test_list = [], [], [], [], [], [] + X_ini, u_ini, X_bdry, u_bdry = ini_bdry_data + X_val, y_val, X_test, y_test = val_test + + for i, (data,) in enumerate(trainloader) : + u_model.train() + optimizer.zero_grad() + X_v = Variable(data, requires_grad=True).to(device) + output = u_model(X_v) + output_ini = u_model(X_ini) + output_bdry = u_model(X_bdry) + + u_t, u_x, u_xx = calculate_all_partial(output, X_v) + loss1 = loss_f(u_t + output*u_x - nu*u_xx, torch.zeros_like(u_t)) + loss2 = loss_f(output_ini-u_ini, torch.zeros_like(output_ini)) + loss3 = loss_f(output_bdry, torch.zeros_like(output_bdry)) + + loss = loss1 +\ + beta*loss2 + (lbd1*(output_ini-u_ini).view(-1)).mean() +\ + beta*loss3 + (lbd2*output_bdry.view(-1)).mean() + + loss.backward() + lbd1.grad *= -1 + lbd2.grad *= -1 + + optimizer.step() + + u_model.eval() + val_err = torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item() + test_err = torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item() + + loss_list.append((loss1+loss2).item()) + loss_list1.append(loss1.item()) + loss_list2.append(loss2.item()) + loss_list3.append(loss3.item()) + val_list.append(val_err) + test_list.append(test_err) + + return np.mean(loss_list), np.mean(loss_list1), np.mean(loss_list2),\ + np.mean(loss_list3), np.mean(val_list), np.mean(test_list) + + +def main_function(model_name, beta, lr, lbd_lr, EPOCH, device) : + + # Dataset Creation + tmin, tmax = 0, 1 + xmin, xmax = -1,1 + Ns, Nx = 51, 51 + X_train = torch.FloatTensor(np.mgrid[tmin:tmax:51j, xmin:xmax:51j].reshape(2, -1).T).to(device) + + # Initial Conditions + X_ini = X_train[X_train[:,0]==tmin] + u_ini = -torch.sin(np.pi*X_ini[:,1].view(-1,1)) + + # Boundary Conditions + X_bdry = X_train[(X_train[:,1]==xmin) + (X_train[:,1]==xmax)] + u_bdry = torch.zeros_like(X_bdry[:,0]).to(device).view(-1,1) + + # Validation & Test Set + X_test, y_test, X_val, y_val= torch.load('Burgers_test', map_location=device) + + # Make dataloader + data_train = TensorDataset(X_train) + train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) + + # train + total_loss, test_errs, val_errs = [], [], [] + u_model = set_model(model_name, device) + lbd1 = Variable(torch.FloatTensor([0]*X_ini.size()[0]).to(device), requires_grad=True)# + lbd2 = Variable(torch.FloatTensor([0]*X_bdry.size()[0]).to(device), requires_grad=True)# + + optimizer=torch.optim.Adam([{'params': u_model.parameters()}, {'params': lbd1, 'lr':lbd_lr}, \ + {'params': lbd2, 'lr':lbd_lr}], lr=lr) + best_model = copy.deepcopy(u_model) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, loss3, val_err, test_err = train(u_model, lbd1, lbd2, beta, trainloader=train_loader,\ + ini_bdry_data=[X_ini, u_ini, X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss()) + + val_errs.append(torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item()) + test_errs.append(torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item()) + total_loss.append(loss) + +# # Print Log +# if t%100 == 0 : +# print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ +# (t, EPOCH, loss, loss1, loss2+loss3, val_err, test_err)) + + if np.argmin(val_errs) == t : + best_model = copy.deepcopy(u_model) + + return best_model, total_loss, val_errs, test_errs + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--model', default='deep_narrow', help='Specify the model. Choose one of [deep_narrow, shallow_wide, deep_narrow_resent, shallow_wide_resnet].') + parser.add_argument('--beta', default=1, type=float, help='Penalty parameter beta') + parser.add_argument('--lr', default=1e-4, type=float, help='Learning rate') + parser.add_argument('--lbd_lr', default=1e-4, type=float, help='Learning rate for lambda') + parser.add_argument('--EPOCH', default=10000, type=int, help='Number of training EPOCH') + parser.add_argument('--ordinal', default=0, type=int, help='Specify the cuda device ordinal.') + args = parser.parse_args() + + device = torch.device("cuda:{}".format(args.ordinal) if torch.cuda.is_available() else "cpu") + + best_model, total_loss, val_errs, test_errs = main_function(args.model, args.beta, args.lr, args.lbd_lr, args.EPOCH, device) + print('Best Test Error : ', test_errs[np.argmin(val_errs)]) + \ No newline at end of file diff --git a/PDEs/Viscous_Burgers/networks.py b/PDEs/Viscous_Burgers/networks.py new file mode 100644 index 0000000..0ccef8b --- /dev/null +++ b/PDEs/Viscous_Burgers/networks.py @@ -0,0 +1,99 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +def set_model(model, device) : + if model =='deep_narrow_resnet' : + u_model = u_Net_deep_narrow_resnet().to(device) + elif model == 'shallow_wide_resnet' : + u_model = u_Net_shallow_wide_resnet().to(device) + elif model == 'deep_narrow' : + u_model = u_Net_deep_narrow().to(device) + elif model == 'shallow_wide' : + u_model = u_Net_shallow_wide().to(device) + return u_model + +class u_Net_shallow_wide(nn.Module): + def __init__(self): + super(u_Net_shallow_wide, self).__init__() + self.fc1 = nn.Linear(2, 256) + self.fc2 = nn.Linear(256, 256) +# self.fc3 = nn.Linear(256, 256) +# self.fc4 = nn.Linear(256, 256) + self.fc5 = nn.Linear(256, 1) + self.act1 = nn.Tanh() + def forward(self, x): + x = self.act1(self.fc1(x)) + x = self.act1(self.fc2(x)) +# x = self.act1(self.fc3(x)) +# x = self.act1(self.fc4(x)) + x = self.fc5(x) + return x + + +class u_Net_shallow_wide_resnet(nn.Module): + def __init__(self): + super(u_Net_shallow_wide_resnet, self).__init__() + self.fc1 = nn.Linear(2, 256) + self.fc2 = nn.Linear(256, 256) +# self.fc3 = nn.Linear(256, 256) +# self.fc4 = nn.Linear(256, 256) + self.fc5 = nn.Linear(256, 1) + self.act1 = nn.Tanh() + def forward(self, x): + x = self.act1(self.fc1(x)) + x = self.act1(self.fc2(x))+x +# x = self.act1(self.fc3(x))+x +# x = self.act1(self.fc4(x))+x + x = self.fc5(x) + return x + +class u_Net_deep_narrow(nn.Module): + def __init__(self): + super(u_Net_deep_narrow, self).__init__() + self.fc1 = nn.Linear(2, 64) + self.fc2 = nn.Linear(64, 64) + self.fc3 = nn.Linear(64, 64) + self.fc4 = nn.Linear(64, 64) + self.fc5 = nn.Linear(64, 64) + self.fc6 = nn.Linear(64, 64) + self.fc7 = nn.Linear(64, 64) + self.fc8 = nn.Linear(64, 64) + self.fc9 = nn.Linear(64, 1) + self.act1 = nn.Tanh() + def forward(self, x): + x = self.act1(self.fc1(x)) + x = self.act1(self.fc2(x)) + x = self.act1(self.fc3(x)) + x = self.act1(self.fc4(x)) + x = self.act1(self.fc5(x)) + x = self.act1(self.fc6(x)) + x = self.act1(self.fc7(x)) + x = self.act1(self.fc8(x)) + x = self.fc9(x) + return x + +class u_Net_deep_narrow_resnet(nn.Module): + def __init__(self): + super(u_Net_deep_narrow_resnet, self).__init__() + self.fc1 = nn.Linear(2, 64) + self.fc2 = nn.Linear(64, 64) + self.fc3 = nn.Linear(64, 64) + self.fc4 = nn.Linear(64, 64) + self.fc5 = nn.Linear(64, 64) + self.fc6 = nn.Linear(64, 64) + self.fc7 = nn.Linear(64, 64) + self.fc8 = nn.Linear(64, 64) + self.fc9 = nn.Linear(64, 1) + self.act1 = nn.Tanh() + def forward(self, x): + x = self.act1(self.fc1(x)) + x = self.act1(self.fc2(x))+x + x = self.act1(self.fc3(x))+x + x = self.act1(self.fc4(x))+x + x = self.act1(self.fc5(x))+x + x = self.act1(self.fc6(x))+x + x = self.act1(self.fc7(x))+x + x = self.act1(self.fc8(x))+x + x = self.fc9(x) + return x \ No newline at end of file diff --git a/PDEs/Viscous_Burgers/results.png b/PDEs/Viscous_Burgers/results.png new file mode 100644 index 0000000000000000000000000000000000000000..9a49386c0a1d0bc46f73e0f8ad3fa5dd2eef15b7 GIT binary patch literal 108917 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%0D9g0y2}%HD4` z+y2(61Tn#}s#C~2ecfZT&5g;>VBAzEuLMg~b?dcNtiBEj{cID8SyyFrN-f$M01R5z zeWiF4JoUT9t#V)xim{sT{4Nx*d7((xWuOP~=~e>mGuzOx z-Y24aE#_2QPZ8Zgg8B2npYFtx2b*#UBTuE0j1>$aU*0Wh4jg`{Wms#E=T0kv#WYg~j!<^oR}Ff~B%y`Q zZncBypYby;7IG7S0FLy1h8H~kS|t%Dl<(N6q=bR$3-W9rbHS82g#tyjTZPm9smXBP z1#4+bXO&IAA&!ZIWrmlX@if2t>4m0fE>hcyDAY;MN(*&4P^0PAQg@O2u2EOZX?8-TVu10i^}B_@8AYhj#HuI90pFA)vba^H`3Wj8+I z6wK86dy*yl$v`Zj9qE4+$`m94Wlx96o|Q?>JO!&P|v! z=odX&<0_F1(x?31^22;Jevd0Fg^Ef|+x$xQJPEKvxqExW&Eo!8(7}?hx6^F8@vZxm zHTvXzm?bZ{_d^yzPkH%=yxVOQ>d?{ZIh)hAN(yh@F)t(>tA4A;6q7d2C9%oru6*Ca zwL8W*zRDD>X+X1usXEiqK?741KlXiFqL6~*3C~;EkG?qKuRPFq0 zM*z|`D*Tcc+^;Y!6$^UEcO9*bgZRK>#=h>HoKv3+U(-eSU0}V6h(93g?3nHiJqZVz z(Ma2(%hbQ5js0X4 zYrJGLcz|AvHix`zJx@%!&_4ph^JfSCFEO$Ou^3-E*^ah#~7#7Fo zx~Ze>De&%^2v;q$W*v-gBZgpZpR4b0pi+%+4@254v?art@cZr56sU39#2B!?O2cMu zB+nNvT4p@i@T)EacT>^mR2i5NX;(FPr26G@yJ0r@Q=?D#z+sg^n?jl-*G*!2*6Pce zK4f|dZx!Jey8%v+MWGr)LWTTRRCKwZphWyS#uj?N|EbUY^uudIq zGyKYc9rf;uVhkhz=xH}rVxEdDUSf%HxN^i_gm-3N4vnKy?(#K@y zlf%GZ?X;%$Vr1%}#`!M4HAG4Jw!8I{hpDrBlQ0=j+Z}f?<}|Q1F7k$HM!0M)^QV~p z{367a!^@9ypy-Ps!6s$?vAgL_s|5e6dLfge(nHj8K2^@!FmMK_qw#q4*59>vhU%JQRC~GD(;)Qq_w;5#Zuq-+N88cXqMki=`I z*%|+aUVbC}@Asi}-Pvi*)8d+?)G>?AK7qd&YQJaFb;cv+*naI&BqGH^rot+Z}&GQWF00dI2evvj`7zfVVCj<6|Hts{|@@YI1 zw6ZxELzFTklaD-6sa~XW2VoBoPI+V6ZEspG*fXayhD};aiJNb%(Psz1TkY&=l6Jrt zeEZW}$s@sBjvN9h)iPu?roI;nihYTWUNPF!6NeToXU(2u<$)(&51xN7&~$Ese&>Xn zNo!253UlsVOT3;>Z^qtJ6n-OM@U0l;cy9)WYjl!&WUy7#ELg!e2l?u52(H^fz4JVz zq226_l;h@@Eq~=fcm2lhFT83u0LX6&0>l%_s&p;uwOzRZ`(o_GHa_ z#Liao%mE{;M<&J-H8b23oY;V2ydi)Ol6xikE98DVB>c#L%D>ur`ZG7hHkhgDuC$RD z{pWBVEs8yUNYMHnD_?Q!*hj+JHTJ*cTj0gAj9cwHkA^=xQy{F|C)2g!_GBKF@RqPCU^AS&7WM*V`2x@xj`#;dr%`^#}tu z1(TyZ)-^kh)1tt}te$5G=8T)J_<;{nYd-U4%0DM^WG!JgveJ&Y2?y}&=-)<3k`Brb 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 literal 0 HcmV?d00001 From 3762f6e6be24ecdcb75b3c11f23f76f04726c9c6 Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Tue, 5 May 2026 15:20:38 +0200 Subject: [PATCH 07/16] klein-gordon first implementation --- PDEs/Helmholtz/Helmholtz.py | 2 +- PDEs/Klein-Gordon/Klein-Gordon_AL-PINNs.py | 175 ++++++++++++ PDEs/Klein-Gordon/Klein-Gordon_test | Bin 0 -> 133279 bytes PDEs/Klein-Gordon/Klein_Gordon.py | 292 +++++++++++++++++++++ PDEs/Klein-Gordon/networks.py | 99 +++++++ 5 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 PDEs/Klein-Gordon/Klein-Gordon_AL-PINNs.py create mode 100644 PDEs/Klein-Gordon/Klein-Gordon_test create mode 100644 PDEs/Klein-Gordon/Klein_Gordon.py create mode 100644 PDEs/Klein-Gordon/networks.py diff --git a/PDEs/Helmholtz/Helmholtz.py b/PDEs/Helmholtz/Helmholtz.py index f62806d..e14ab0a 100644 --- a/PDEs/Helmholtz/Helmholtz.py +++ b/PDEs/Helmholtz/Helmholtz.py @@ -84,7 +84,7 @@ def train(u_model, beta, trainloader, bdry_data, val_test, optimizer, loss_f, du val_list.append(val_err) test_list.append(test_err) - return np.mean(loss_list), np.mean(loss_list1), np.mean(loss_list2), np.mean(val_list), np.mean(test_list) + def main_function(model_name, beta, lr, EPOCH, device) : diff --git a/PDEs/Klein-Gordon/Klein-Gordon_AL-PINNs.py b/PDEs/Klein-Gordon/Klein-Gordon_AL-PINNs.py new file mode 100644 index 0000000..9fabcf5 --- /dev/null +++ b/PDEs/Klein-Gordon/Klein-Gordon_AL-PINNs.py @@ -0,0 +1,175 @@ +from tqdm import tqdm +import pickle as pkl +import numpy as np +import copy +import argparse +import sys +sys.path.append("..") + +import torch +from torch.autograd import Variable +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset + +from networks import set_model, u_Net_shallow_wide, u_Net_shallow_wide_resnet, u_Net_deep_narrow, u_Net_deep_narrow_resnet + +# Equation parameter + +k=3 +alpha, delta, gamma = -1, 0, 1 + +def analytic(bdry) : + t, x = bdry[:,0].view(-1,1), bdry[:,1].view(-1,1) + return x*torch.cos(5*np.pi*t) + ((x*t)**3) + +def u_tt(data) : + t, x = data[:,0].view(-1,1), data[:,1].view(-1,1) + return -((5*np.pi)**2)*x*torch.cos(5*np.pi*t) + 6*(x**3)*t + +def u_xx(data) : + t, x = data[:,0].view(-1,1), data[:,1].view(-1,1) + return 6*x*(t**3) + +def u3(data) : + t, x = data[:,0].view(-1,1), data[:,1].view(-1,1) + return (x*torch.cos(5*np.pi*t) + ((x*t)**3))**3 + +def u(data) : + t, x = data[:,0].view(-1,1), data[:,1].view(-1,1) + return x*torch.cos(5*np.pi*t) + ((x*t)**3) + +def f(data) : + return u_tt(data) + alpha*u_xx(data) + delta*u(data) + gamma*u3(data) + +def calculate_derivative(y, x) : + return torch.autograd.grad(y, x, create_graph=True,\ + grad_outputs=torch.ones(y.size()).to(device))[0] + +def calculate_all_partial(u, x) : + del_u = calculate_derivative(u, x) + u_t, u_x = del_u[:,0], del_u[:,1] + u_tt = calculate_derivative(u_t, x)[:,0] + u_xx = calculate_derivative(u_x, x)[:,1] + return u_tt.view(-1,1), u_xx.view(-1,1) + +def train(u_model, lbd1, lbd2, lbd3, beta, trainloader, ini_bdry_data, val_test, optimizer, loss_f) : + loss_list, loss_list1, loss_list2, loss_list3, loss_list4, val_list, test_list = [], [], [], [], [], [], [] + X_ini, u_ini, u_ini_t, X_bdry, u_bdry = ini_bdry_data + X_val, y_val, X_test, y_test = val_test + + for i, (data,) in enumerate(trainloader) : + u_model.train() + optimizer.zero_grad() + X_v = Variable(data, requires_grad=True).to(device) + output = u_model(X_v) + output_ini = u_model(X_ini) + output_ini_t = calculate_derivative(output_ini, X_ini)[:,0].view(-1,1) + output_bdry = u_model(X_bdry) + + u_tt, u_xx = calculate_all_partial(output, X_v) + loss1 = loss_f(u_tt + alpha*u_xx + delta*output + gamma*(output**k) - f(X_v), torch.zeros_like(output)) + loss2 = loss_f(output_ini, u_ini) + loss3 = loss_f(output_ini_t, u_ini_t) + loss4 = loss_f(output_bdry, u_bdry) + + loss = loss1 + beta*loss2 + (lbd1*(output_ini-u_ini).view(-1)).mean() +\ + beta*loss3 + (lbd2*output_ini_t.view(-1)).mean() +\ + beta*loss4 + (lbd3*(output_bdry-u_bdry).view(-1)).mean() + + loss.backward() + + lbd1.grad *= -1 + lbd2.grad *= -1 + lbd3.grad *= -1 + optimizer.step() + + u_model.eval() + val_err = torch.linalg.norm((u_model(X_val) - y_val),2).item() / torch.linalg.norm(y_val,2).item() + test_err = torch.linalg.norm((u_model(X_test) - y_test),2).item() / torch.linalg.norm(y_test,2).item() + + loss_list.append((loss1+loss2+loss3+loss4).item()) + loss_list1.append(loss1.item()) + loss_list2.append(loss2.item()) + loss_list3.append(loss3.item()) + loss_list4.append(loss4.item()) + val_list.append(val_err) + test_list.append(test_err) + + return np.mean(loss_list), np.mean(loss_list1), np.mean(loss_list2),\ + np.mean(loss_list3), np.mean(loss_list4), np.mean(val_list), np.mean(test_list) + + +def main_function(model_name, beta, lr, lbd_lr, EPOCH, device) : + print(model_name, beta, lr, lbd_lr, EPOCH, device) + # Dataset Creation + tmin, tmax = 0,1 + xmin, xmax = 0,1 + Nt, Nx = 51, 51 + X_train = torch.FloatTensor(np.mgrid[tmin:tmax:51j, xmin:xmax:51j].reshape(2, -1).T).to(device) + + # Initial Conditions + X_ini = Variable(X_train[X_train[:,0]==tmin].to(device), requires_grad=True) + u_ini = X_ini.detach()[:,1].view(-1,1) + u_ini_t = torch.zeros_like(u_ini) + + # Boundary Conditions + X_bdry = X_train[(X_train[:,1]==xmin) + (X_train[:,1]==xmax)] + u_bdry = analytic(X_bdry) + + # Validation & Test Set + X_test, y_test, X_val, y_val= torch.load('Klein-Gordon_test', map_location=device) + + # Make dataloader + data_train = TensorDataset(X_train) + train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) + + # train + total_loss, test_errs, val_errs = [], [], [] + u_model = set_model(model_name, device) + lbd1 = Variable(torch.FloatTensor([0]*X_ini.size()[0]).to(device), requires_grad=True)# + lbd2 = Variable(torch.FloatTensor([0]*X_ini.size()[0]).to(device), requires_grad=True)# + lbd3 = Variable(torch.FloatTensor([0]*X_bdry.size()[0]).to(device), requires_grad=True)# + + optimizer=torch.optim.Adam([{'params': u_model.parameters()}, {'params': lbd1, 'lr':lbd_lr}, \ + {'params': lbd2, 'lr':lbd_lr}, {'params': lbd3, 'lr':lbd_lr}], lr=lr) + best_model = copy.deepcopy(u_model) + + for t in tqdm(range(0, EPOCH)) : + + loss, loss1, loss2, loss3, loss4, val_err, test_err = train(u_model, lbd1, lbd2, lbd3, beta, trainloader=train_loader,\ + ini_bdry_data=[X_ini, u_ini, u_ini_t, X_bdry, u_bdry],\ + val_test = [X_val, y_val, X_test, y_test],\ + optimizer=optimizer, loss_f=nn.MSELoss()) + + val_errs.append(val_err) + test_errs.append(test_err) + total_loss.append(loss) + +# # Print Log +# if t%100 == 0 : +# print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ +# (t, EPOCH, loss, loss1, loss2+loss3+loss4, val_err, test_err)) + + if np.argmin(val_errs) == t : + best_model = copy.deepcopy(u_model) + + return best_model, total_loss, val_errs, test_errs + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--model', default='deep_narrow', help='Specify the model. Choose one of [deep_narrow, shallow_wide, deep_narrow_resent, shallow_wide_resnet].') + parser.add_argument('--beta', default=500, type=float, help='Penalty parameter beta') + parser.add_argument('--lr', default=1e-3, type=float, help='Learning rate') + parser.add_argument('--lbd_lr', default=1e-1, type=float, help='Learning rate for lambda') + parser.add_argument('--EPOCH', default=10000, type=int, help='Number of training EPOCH') + parser.add_argument('--ordinal', default=0, type=int, help='Specify the cuda device ordinal.') + args = parser.parse_args() + + device = torch.device("cuda:{}".format(args.ordinal) if torch.cuda.is_available() else "cpu") + + best_model, total_loss, val_errs, test_errs = main_function(args.model, args.beta, args.lr, args.lbd_lr, args.EPOCH, device) + print('Best Test Error : ', test_errs[np.argmin(val_errs)]) \ No newline at end of file diff --git a/PDEs/Klein-Gordon/Klein-Gordon_test b/PDEs/Klein-Gordon/Klein-Gordon_test new file mode 100644 index 0000000000000000000000000000000000000000..ba065276a91bded96b55ffc891d738561316a0f9 GIT binary patch literal 133279 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 Date: Tue, 5 May 2026 17:30:31 +0200 Subject: [PATCH 08/16] klein gordan finished --- PDEs/Helmholtz/Helmholtz.py | 11 +++- PDEs/Klein-Gordon/Klein_Gordon.py | 84 +++++++++++------------- PDEs/Klein-Gordon/results.png | Bin 0 -> 98949 bytes PDEs/Viscous_Burgers/Viscous_Burgers.py | 15 +++-- setup.txt | 2 - 5 files changed, 59 insertions(+), 53 deletions(-) create mode 100644 PDEs/Klein-Gordon/results.png diff --git a/PDEs/Helmholtz/Helmholtz.py b/PDEs/Helmholtz/Helmholtz.py index e14ab0a..8f66813 100644 --- a/PDEs/Helmholtz/Helmholtz.py +++ b/PDEs/Helmholtz/Helmholtz.py @@ -100,7 +100,16 @@ def main_function(model_name, beta, lr, EPOCH, device) : u_bdry = torch.zeros_like(X_bdry[:,0]).to(device).view(-1,1) X_test, y_test, X_val, y_val= torch.load('./PDEs/Helmholtz/Helmholtz_test', map_location=device) - + + # take 1000 samples from the validation set + idx = np.random.choice(X_val.shape[0], 1000, replace=False) + X_val = X_val[idx] + y_val = y_val[idx] + + print(X_train.shape) + print(X_val.shape) + exit() + # Make dataloader data_train = TensorDataset(X_train) train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) diff --git a/PDEs/Klein-Gordon/Klein_Gordon.py b/PDEs/Klein-Gordon/Klein_Gordon.py index 2e8320c..d5919ca 100644 --- a/PDEs/Klein-Gordon/Klein_Gordon.py +++ b/PDEs/Klein-Gordon/Klein_Gordon.py @@ -13,6 +13,8 @@ import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset +from humancompatible.train.dual_optim import ALM, MoreauEnvelope, PBM + from networks import set_model, u_Net_shallow_wide, u_Net_shallow_wide_resnet, u_Net_deep_narrow, u_Net_deep_narrow_resnet # Equation parameter @@ -80,7 +82,7 @@ def train(u_model, beta, trainloader, ini_bdry_data, val_test, optimizer, loss_f loss.backward() optimizer.step() elif dual_opt is not None: - threshold = 1e-4 + threshold = 0.1 constraints = torch.stack([loss2, loss3, loss4], dim=0) constraints = constraints - threshold @@ -114,9 +116,6 @@ def main_function(model_name, beta, lr, EPOCH, device) : Nt, Nx = 51, 51 X_train = torch.FloatTensor(np.mgrid[tmin:tmax:51j, xmin:xmax:51j].reshape(2, -1).T).to(device) - print(X_train.shape) - exit() - # Initial Conditions X_ini = Variable(X_train[X_train[:,0]==tmin].to(device), requires_grad=True) u_ini = X_ini.detach()[:,1].view(-1,1) @@ -128,7 +127,12 @@ def main_function(model_name, beta, lr, EPOCH, device) : # Validation & Test Set X_test, y_test, X_val, y_val= torch.load('./PDEs/Klein-Gordon/Klein-Gordon_test', map_location=device) - + + # take 1000 samples from the validation set + idx = np.random.choice(X_val.shape[0], 1000, replace=False) + X_val = X_val[idx] + y_val = y_val[idx] + # Make dataloader data_train = TensorDataset(X_train) train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) @@ -140,25 +144,22 @@ def main_function(model_name, beta, lr, EPOCH, device) : optimizer=torch.optim.Adam([{'params': u_model.parameters()}], lr=lr) best_model = copy.deepcopy(u_model) - for t in tqdm(range(0, EPOCH)) : + # for t in tqdm(range(0, EPOCH)) : - loss, loss1, loss2, loss3, loss4, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ - ini_bdry_data=[X_ini, u_ini, u_ini_t, X_bdry, u_bdry],\ - val_test = [X_val, y_val, X_test, y_test],\ - optimizer=optimizer, loss_f=nn.MSELoss()) + # loss, loss1, loss2, loss3, loss4, val_err, test_err = train(u_model, beta, trainloader=train_loader,\ + # ini_bdry_data=[X_ini, u_ini, u_ini_t, X_bdry, u_bdry],\ + # val_test = [X_val, y_val, X_test, y_test],\ + # optimizer=optimizer, loss_f=nn.MSELoss()) - val_errs.append(val_err) - test_errs.append(test_err) - total_loss.append(loss) - constraints.append([loss2, loss3, loss4]) # append both costraint + # val_errs.append(val_err) + # test_errs.append(test_err) + # total_loss.append(loss) + # constraints.append([loss2, loss3, loss4]) # append both costraint - # Print Log - if t%100 == 0 : - print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ - (t, EPOCH, loss, loss1, loss2+loss3+loss4, val_err, test_err)) - - if np.argmin(val_errs) == t : - best_model = copy.deepcopy(u_model) + # # Print Log + # if t%100 == 0 : + # print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ + # (t, EPOCH, loss, loss1, loss2+loss3+loss4, val_err, test_err)) # SPBM @@ -167,7 +168,7 @@ def main_function(model_name, beta, lr, EPOCH, device) : u_model = set_model(model_name, device) # Define data and optimizers - optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=0.005), mu=2.0) + optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=0.001), mu=0.1) dual = PBM( m=3, @@ -180,7 +181,7 @@ def main_function(model_name, beta, lr, EPOCH, device) : init_penalties=1., penalty_range=(0.5, 1.), penalty_mult=0.99, - dual_range=(0.01, 100.), + dual_range=(0.1, 100.), delta=1.0, device=device ) @@ -192,8 +193,8 @@ def main_function(model_name, beta, lr, EPOCH, device) : val_test = [X_val, y_val, X_test, y_test],\ optimizer=optimizer, loss_f=nn.MSELoss(), dual_opt=dual) - val_spbm.append(val_err) - test_spbm.append(test_err) + val_errs_spbm.append(val_err) + test_errs_spbm.append(test_err) total_loss_spbm.append(loss) constraints_spbm.append([loss2, loss3, loss4]) # append both costraint @@ -201,9 +202,6 @@ def main_function(model_name, beta, lr, EPOCH, device) : if t%100 == 0 : print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ (t, EPOCH, loss, loss1, loss2+loss3+loss4, val_err, test_err)) - - if np.argmin(val_errs) == t : - best_model = copy.deepcopy(u_model) # ALM torch.manual_seed(0) @@ -226,8 +224,8 @@ def main_function(model_name, beta, lr, EPOCH, device) : val_test = [X_val, y_val, X_test, y_test],\ optimizer=optimizer, loss_f=nn.MSELoss(), dual_opt=dual) - val_alm.append(val_err) - test_alm.append(test_err) + val_errs_alm.append(val_err) + test_errs_alm.append(test_err) total_loss_alm.append(loss) constraints_alm.append([loss2, loss3, loss4]) # append both costraint @@ -236,10 +234,6 @@ def main_function(model_name, beta, lr, EPOCH, device) : print("%s/%s | loss: %06.6f | loss_f: %06.6f | loss_u: %06.6f | val error : %06.6f | test error : %06.6f " % \ (t, EPOCH, loss, loss1, loss2+loss3+loss4, val_err, test_err)) - if np.argmin(val_errs) == t : - best_model = copy.deepcopy(u_model) - - # plot the resultsimport matplotlib.pyplot as plt import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # wider figure @@ -261,13 +255,13 @@ def main_function(model_name, beta, lr, EPOCH, device) : # plot both constraints + methods shuold have the same color but dashed vs solid axes[2].plot([c[0] for c in constraints], label='Adam - Initial Condition - Zero Order', linestyle='--', color='blue') axes[2].plot([c[1] for c in constraints], label='Adam - Initial Condition - First Order', linestyle='-', color='blue') - axes[2].plot([c[2] for c in constraints], label='Adam - Boundary Condition', linestyle='.', color='blue') - axes[2].plot([c[0] for c in constraints_spbm], label='SPBM - Initial Condition - Zero Order', linestyle='--', color='green') - axes[2].plot([c[1] for c in constraints_spbm], label='SPBM - Initial Condition - First Order', linestyle='-', color='green') - axes[2].plot([c[2] for c in constraints_spbm], label='SPBM - Boundary Condition', linestyle='.', color='green') - axes[2].plot([c[0] for c in constraints_alm], label='ALM - Initial Condition - Zero Order', linestyle='--', color='red') - axes[2].plot([c[1] for c in constraints_alm], label='ALM - Initial Condition - First Order', linestyle='-', color='red') - axes[2].plot([c[2] for c in constraints_alm], label='ALM - Boundary Condition', linestyle='.', color='red') + axes[2].plot([c[2] for c in constraints], label='Adam - Boundary Condition', linestyle=':', color='blue') + axes[2].plot([c[0] for c in constraints_spbm], label='SPBM - Initial Condition - Zero Order', linestyle='--', color='orange') + axes[2].plot([c[1] for c in constraints_spbm], label='SPBM - Initial Condition - First Order', linestyle='-', color='orange') + axes[2].plot([c[2] for c in constraints_spbm], label='SPBM - Boundary Condition', linestyle=':', color='orange') + axes[2].plot([c[0] for c in constraints_alm], label='ALM - Initial Condition - Zero Order', linestyle='--', color='green') + axes[2].plot([c[1] for c in constraints_alm], label='ALM - Initial Condition - First Order', linestyle='-', color='green') + axes[2].plot([c[2] for c in constraints_alm], label='ALM - Boundary Condition', linestyle=':', color='green') axes[2].set_xlabel('Epoch') axes[2].set_ylabel('Constraint Violation') axes[2].legend() @@ -281,12 +275,12 @@ def main_function(model_name, beta, lr, EPOCH, device) : parser = argparse.ArgumentParser() parser.add_argument('--model', default='deep_narrow', help='Specify the model. Choose one of [deep_narrow, shallow_wide, deep_narrow_resent, shallow_wide_resnet].') parser.add_argument('--beta', default=1, type=float, help='Penalty parameter beta') - parser.add_argument('--lr', default=1e-3, type=float, help='Learning rate') - parser.add_argument('--EPOCH', default=100, type=int, help='Number of training EPOCH') + parser.add_argument('--lr', default=1e-1, type=float, help='Learning rate') + parser.add_argument('--EPOCH', default=2000, type=int, help='Number of training EPOCH') parser.add_argument('--ordinal', default=0, type=int, help='Specify the cuda device ordinal.') args = parser.parse_args() device = 'cuda' - best_model, total_loss, val_errs, test_errs = main_function(args.model, args.beta, args.lr, args.EPOCH, device) - print('Best Test Error : ', test_errs[np.argmin(val_errs)]) + main_function(args.model, args.beta, args.lr, args.EPOCH, device) + \ No newline at end of file diff --git a/PDEs/Klein-Gordon/results.png b/PDEs/Klein-Gordon/results.png new file mode 100644 index 0000000000000000000000000000000000000000..8e56dd57c1819d790735c101daaa2d865a1af254 GIT binary patch literal 98949 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 literal 0 HcmV?d00001 diff --git a/PDEs/Viscous_Burgers/Viscous_Burgers.py b/PDEs/Viscous_Burgers/Viscous_Burgers.py index 6b1f614..4c97b23 100644 --- a/PDEs/Viscous_Burgers/Viscous_Burgers.py +++ b/PDEs/Viscous_Burgers/Viscous_Burgers.py @@ -100,7 +100,12 @@ def main_function(model_name, beta, lr, EPOCH, device) : # Validation & Test Set X_test, y_test, X_val, y_val= torch.load('./PDEs/Viscous_Burgers/Burgers_test', map_location=device) - + + # take 1000 samples from the validation set + idx = np.random.choice(X_val.shape[0], 1000, replace=False) + X_val = X_val[idx] + y_val = y_val[idx] + # Make dataloader data_train = TensorDataset(X_train) train_loader = DataLoader(data_train, batch_size=10000, shuffle=False) @@ -242,10 +247,10 @@ def main_function(model_name, beta, lr, EPOCH, device) : # plot both constraints + methods shuold have the same color but dashed vs solid axes[2].plot([c[0] for c in constraints], label='Adam - Initial Condition', linestyle='--', color='blue') axes[2].plot([c[1] for c in constraints], label='Adam - Boundary Condition', linestyle='-', color='blue') - axes[2].plot([c[0] for c in constraints_spbm], label='SPBM - Initial Condition', linestyle='--', color='green') - axes[2].plot([c[1] for c in constraints_spbm], label='SPBM - Boundary Condition', linestyle='-', color='green') - axes[2].plot([c[0] for c in constraints_alm], label='ALM - Initial Condition', linestyle='--', color='red') - axes[2].plot([c[1] for c in constraints_alm], label='ALM - Boundary Condition', linestyle='-', color='red') + axes[2].plot([c[0] for c in constraints_spbm], label='SPBM - Initial Condition', linestyle='--', color='orange') + axes[2].plot([c[1] for c in constraints_spbm], label='SPBM - Boundary Condition', linestyle='-', color='orange') + axes[2].plot([c[0] for c in constraints_alm], label='ALM - Initial Condition', linestyle='--', color='green') + axes[2].plot([c[1] for c in constraints_alm], label='ALM - Boundary Condition', linestyle='-', color='green') axes[2].set_xlabel('Epoch') axes[2].set_ylabel('Constraint Violation') axes[2].legend() diff --git a/setup.txt b/setup.txt index 4fad533..19ebf38 100644 --- a/setup.txt +++ b/setup.txt @@ -10,7 +10,5 @@ ml load torchvision/0.22.1-foss-2025a-CUDA-12.8.0 source env_humancompatible/bin/activate - - # old ml load PyTorch/2.10.0-foss-2025a-CUDA-12.8.0 \ No newline at end of file From a7b169866f2c420ca4e58c34bc3d0a818932f4f7 Mon Sep 17 00:00:00 2001 From: bosakad1 Date: Wed, 6 May 2026 15:59:09 +0200 Subject: [PATCH 09/16] demo balls now work with the new implementation + has bigger font --- PDEs/Klein-Gordon/Klein_Gordon.py | 6 +- PDEs/Klein-Gordon/results.png | Bin 98949 -> 98835 bytes benchmark/demo_balls.py | 114 +++++++++++++++++++----------- logs/simulator/demo_balls_pbm.pdf | Bin 0 -> 185959 bytes 4 files changed, 76 insertions(+), 44 deletions(-) create mode 100644 logs/simulator/demo_balls_pbm.pdf diff --git a/PDEs/Klein-Gordon/Klein_Gordon.py b/PDEs/Klein-Gordon/Klein_Gordon.py index d5919ca..3453977 100644 --- a/PDEs/Klein-Gordon/Klein_Gordon.py +++ b/PDEs/Klein-Gordon/Klein_Gordon.py @@ -168,7 +168,7 @@ def main_function(model_name, beta, lr, EPOCH, device) : u_model = set_model(model_name, device) # Define data and optimizers - optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=0.001), mu=0.1) + optimizer = MoreauEnvelope(torch.optim.Adam([{'params': u_model.parameters()}], lr=0.0005), mu=0.1) dual = PBM( m=3, @@ -176,8 +176,8 @@ def main_function(model_name, beta, lr, EPOCH, device) : # penalty_update='dimin_adapt', penalty_update='const', pbf = 'quadratic_logarithmic', - gamma=0.9, - init_duals=0.01, + gamma=0.1, + init_duals=0.1, init_penalties=1., penalty_range=(0.5, 1.), penalty_mult=0.99, diff --git a/PDEs/Klein-Gordon/results.png b/PDEs/Klein-Gordon/results.png index 8e56dd57c1819d790735c101daaa2d865a1af254..cd0f28316adf4d9a1cd71242a38f8b58b223e981 100644 GIT binary patch literal 98835 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 diff --git a/benchmark/demo_balls.py b/benchmark/demo_balls.py index 42d196f..91a2c5f 100644 --- a/benchmark/demo_balls.py +++ b/benchmark/demo_balls.py @@ -1,3 +1,5 @@ +from sched import scheduler + from matplotlib.patches import Circle import torch from humancompatible.train.optim.PBM import PBM @@ -5,20 +7,22 @@ import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable +from humancompatible.train.dual_optim import ALM, MoreauEnvelope, PBM torch.manual_seed(1) np.random.seed(1) -def plot_balls_trajectory(trajectories, names): - """ - trajectory: array-like of shape (N, 2), where each row is [x, y] - """ +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.patches import Circle +from mpl_toolkits.axes_grid1 import make_axes_locatable +def plot_balls_trajectory(trajectories, names): fig, ax = plt.subplots(figsize=(24, 16)) # Feasible regions: unit balls ball_centers = [(-2, 0), (2, 0)] radius = np.sqrt(0.99) - labels = [r"$\mathbb{E}[g_1(x,y,\xi)] \leq 0 $", r"$\mathbb{E}[g_2(x,y,\xi)] \leq 0$"] + labels = [r"$\mathbb{E}[g(x,\xi)] \leq 0$", r"$\mathbb{E}[g(x,\xi)] \leq 0$"] # Heatmap for x^2 + y^2 x = np.linspace(-4, 4, 100) @@ -26,23 +30,22 @@ def plot_balls_trajectory(trajectories, names): X, Y = np.meshgrid(x, y) Z = X**2 + Y**2 - + # Draw balls for center, label in zip(ball_centers, labels): ball = Circle( center, radius=radius, facecolor="lightgray", edgecolor="black", - linewidth=1.5, + linewidth=6, # Thickest practical line alpha=0.6, zorder=1, ) ax.add_patch(ball) - # Label inside the ball ax.text( center[0], center[1], label, - fontsize=18, + fontsize=40, # Very large font fontweight='bold', color='black', ha='center', @@ -50,16 +53,16 @@ def plot_balls_trajectory(trajectories, names): zorder=5 ) + # Plot trajectories for i, traj in enumerate(trajectories): traj = np.asarray(traj) - - # Trajectory ax.plot( traj[:, 0], traj[:, 1], - linewidth=2.0, + linewidth=6, # Thickest practical line zorder=3, - alpha=1.0 + alpha=1.0, + color= 'c' if i == 0 else ('orange' if i == 1 else ('tab:green' if i == 2 else 'red')) ) # Emphasize x_0 and x_n @@ -68,66 +71,77 @@ def plot_balls_trajectory(trajectories, names): ax.scatter( x0[0], x0[1], - s=80, + s=400, # Very large marker marker="o", facecolor="white", edgecolor="black", - linewidth=2, + linewidth=4, # Thick edge zorder=4, ) ax.scatter( xn[0], xn[1], - s=60, + s=300, # Very large marker marker="s", facecolor="black", edgecolor="black", zorder=4, ) + + # Labels for x_0 and x_n x_n = [ r"$x_{\rho=0}^n$", r"$x_{\rho=1}^n$", r"$x_{\rho=2.5}^n$", r"$x_{SPBM}^n$", ] - # Labels for x_0 and x_n ax.annotate( r"$x^0$", xy=(x0[0], x0[1]), - xytext=(6, 8), + xytext=(15, 15), # Adjusted offset textcoords="offset points", - fontsize=22, + fontsize=40, # Very large font zorder=5, ) + ax.annotate( x_n[i], xy=(xn[0], xn[1]), - # xytext=(8 if i==1 or i == 3 else -36, -12), - xytext=(8 if i==1 or i == 3 else -45, -15), + xytext=(-25, -50) if i == 0 else ((10, 40) if i == 1 else ((30, -70) if i == 2 else (-80, 150))), textcoords="offset points", - fontsize=22, + fontsize=55, # Very large font zorder=5, + color= 'c' if i == 0 else ('orange' if i == 1 else ('tab:green' if i == 2 else 'red')) ) # Formatting ax.set_aspect("equal", adjustable="box") - ax.set_xlabel(r"$x$", fontsize=12) - ax.set_ylabel(r"$y$", fontsize=12) - ax.grid(True, linestyle=":", linewidth=0.8, alpha=0.7) + ax.set_xlabel(r"$x_1$", fontsize=40) # Very large font + ax.set_ylabel(r"$x_2$", fontsize=40) # Very large font + ax.grid(True, linestyle=":", linewidth=2, alpha=0.7) # Thicker grid ax.set_xlim(-3.2, 3.2) ax.set_ylim(-1.8, 1.8) - - - contour = ax.contourf(X, Y, Z, levels=100, cmap='viridis', alpha=0.5, zorder=0) + ax.tick_params(axis='both', which='major', labelsize=32) # Large tick fonts + + # Contour/heatmap + contour = ax.contourf( + X, Y, Z, + levels=100, + cmap='viridis', + alpha=0.6, # More opaque + zorder=0 + ) divider = make_axes_locatable(ax) - cax = divider.append_axes("right", size="3%", pad=0.08) - + cax = divider.append_axes("right", size="5%", pad=0.1) # Wider colorbar cbar = fig.colorbar(contour, cax=cax) - cbar.set_label(r"$x^2 + y^2$", fontsize=14) + cbar.set_label(r"$||x||^2$", fontsize=40) # Very large font + cbar.ax.tick_params(labelsize=32) # Large colorbar tick fonts + # Save with highest practical DPI fig.savefig( "./demo_balls_pbm.pdf", bbox_inches="tight", - pad_inches=0.05 + pad_inches=0.1, + dpi=100 # Highest practical DPI ) @@ -214,7 +228,24 @@ def run_sgd(rho: float): xy[0] = 0 xy[1] = 1 -pbm = PBM([xy], m=1, lr=0.01, dual_bounds=(1e-3, 1e3), penalty_update_m='CONST', epoch_len=2, mu=0, opt_method="Adam") +# Define data and optimizers +optimizer = MoreauEnvelope(torch.optim.SGD([xy], lr=0.01), mu=0.0) +scheduler = torch.optim.lr_scheduler.LambdaLR( + optimizer, + lr_lambda=lambda step: 0.99 ** step +) + +dual = PBM( + m=1, + penalty_update='const', + pbf = 'quadratic_logarithmic', + gamma=0.0, + init_duals=0.1, + init_penalties=1., + penalty_range=(0.5, 1.), + penalty_mult=0.99, + dual_range=(0.1, 10.) +) iters = 200 @@ -231,20 +262,21 @@ def run_sgd(rho: float): r = np.random.uniform() minibatch = samples[ - 0 if r > 0.5 else 1 + 1 if r > 0.5 else 0 ] c = balls(xy, minibatch) - - pbm.dual_step(0, c) - dual_log.append(pbm._dual_vars.detach().numpy().copy().item()) - obj = parabola(xy) + + # compute the lagrangian value + lagrangian = dual.forward_update(obj, c) + lagrangian.backward() + optimizer.step() + optimizer.zero_grad() - pbm.step(obj) - for gr in pbm.param_groups: - gr['lr'] *= 0.99 + scheduler.step() + dual_log.append(dual.duals.detach().numpy().copy().item()) con_log.append(c.detach().numpy().copy().item()) diff --git a/logs/simulator/demo_balls_pbm.pdf b/logs/simulator/demo_balls_pbm.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d39fe7207245743ac1ae0b89080d57110bf2d175 GIT binary patch literal 185959 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%0A;b9Ov$5;A+p(F~Atu(x% zM=}qf4}aE6>;n%At9A3E7(`(QuIv5%1BUt9oPDywTvKKGCx#NsX=TKBR}3YrJwAG` zym0nUM<=Hj3Jn`Y^t!!bC^tgz8nvLbr z!tn%6mYSz@vN%f;I9GE?8wJ0~Ln#_@mSxA3)O7B#lFZIsS<>IRj|ocIw$_fLZ2Xd8 zPg7BH@@ZU37B4W(gJtb|`Bsd78?aI-m=>>;7G`=+#MW`YcBRM+QjFI3)S|Y2mlnZw9JFYz0$q zsD4g=LhxFeD2mclD=-8y2qml&T{&b zcG}dgwq^DK?gV~{}^r+6b(;FTH! zAfg#(s%%v=W=Gl5bjW+~jM^Bxmg+L*k7>kNip$4} zm&7L93g3soF(9 zu_1E;6-Y8?+p-;59S&2OtI1(4bM-k2X0BEP%?ONC6Fk`rj>(yu$1yx}vpMExZca;5 z=Uz5M(cJkCK$@1q0ZW1x)ht^qk)`EgxipPeAd{y3Vi+BsH4UkwyaaDG%MfCw9V_;> z>V`O*K0rz$;xQb}CXi6AxQIt`w4C7Cw4x&(&#|1-Lu$cDL3CPQ5(jMMCm;Dj;+{ewwHBz*Nhuvlc%_9#iN>@nDZ!f-F(ua1 zlBa}*vplMCq?A(s`3yGwld-7*%9@a`2`QV9wF!xvkh=-#8<4>PNE~s;38$QJ%?Ssc zaMKBA9bnlB#hp;!2_>FTm>7nc zkr)_^iSd{il8I577?_E%nHZjd5SsX-iEoo~k5#=hPz(thAh$0$Mb|VUPBxR2% z1ro(WlG;d?CrN@PQ3553rbL;QEXB#jisl%o1lQfrFxPC*bV2uS@!a4JevB~hy=gB5kNlF(L^ z=89roQT{6nhJ6+oi-KfP!YpZ?MUk|msupF~qHtT3dW+(4QBE!h&;`M|sBf3_@RELB zklRb@d`ZnOi2o(6z@#mhvYGhEEOsbSo#WJa0 zCY8*jsu@%`KdW{MdUeNwCQua?kjkGU_IiU?(~rMAB+wZLH*QW*W~7?yUcjGM1L=WaM505{7_y-_c355Ju6d#2a!g zyS~-HHIg#p(!^8cvUK zFJh`N*-HtDVFB>MZ7<9>lIixB)mHqhUKaSQ-bA1f_RJah+dE=GaK&PM`!`7fVnZOk z0UI*uCFlsV=!sQ;-BoeJkC~qd3`b2I3C26^N`_i|35G zb)zncHLe6AtLErYi`j?|_Qu%g_Z@iY(qEhXL9>t#wCmu)HAW!`(o=4uGwml9ARi~1U=@9hy7yaP|5 zyLt)O4yy007^;f3T^JEwJEq971}vy_o@Z3B2@6GHPA*l8IT>BU99-mKX^_h6_~XIP z(x?{02SWtgP?WiN9ZUS|MX*7yYnZL~(WqRXt6{vpr(sFvcRBWCj)Or}=CC=kWe&3= zVdk_ra%N7WrA9LCiocnQ#8EtRQ90^oEjn)vY`!cHTS>6v!=apIG5mgHFp<#LBZ~7{YRXcBM=1&s0Ai*mIiPX0HW5frYm;Pt>7EA zJSLvrs%eU!)asi=5)KO$c%~HhBv3JIt$;tZawu_-78+;NWYF3fV`&XjLo%s&Y5*to zQH}Scnrh+Uti4J!sg>G)K7(=p1mNyxkZ*tlCjfDP8wYT5!ZHWwb3#fdWOYJfC**cO zdM9LfM3N`uc>t;>TzkU7C)|9(*(Y57XB7Wu#DC%k1UA8E?m^-zL~cW%LL}xyVp=3- zMq+Y&=6yt#NMMyD7D{BT1eQx6#Y7HG;M^pRPUQ4_W&j1gP~sOwKGH|>QerwKW>g?j zCEiu$X(e9QXC7FfjU|>@Vx@iNuqDP@V8|s#U1Z<|!d~F_B|c!}4+g$r;wMHvW8gm~ zzGUQAex_q4_GV&xCU$6IlP30QVygyrYhuG@_H1C=26ArV@+R(Y;tD5japEE;?sDQf zCvJ4&QU~sJ;%Y~3cjAI4?s(#wCvJM;vM26);>ss(ec<9J?tbL@CvAYFC6KfSl2$>` zHb`0sQ9B`NEhKG*q~(ybACgu?(v}EX6iK@xYF#94jHIQJv^SDgN09aiLLf;uB!d_sl_OB9HSk}^qyCW_WXnVT$(lcaQ__)e7T$pSw~5-5rY zW!a%9R1~C*q8L(^Pl|#|QK2bHIzN0_$n45E`K|0a4hR( zEL!=NleK6JobdgeGD|9Z&k5N z8}p{?@zX;dytloIXPDh1wH#@~{RUPwM5n!!#9>%z;;x4tq4;GnxQ%+=eVtnAa2d5I zZlGht)!32yH|Y2r-%ouJ$1e|W(yw+^>-}~=NWfSodUpB)erv2x6z4E#JU4wp@h0LC zSz^Gh{ywXm4b6q;R}_E6=mr~$b#wP{;=ea;l;r^i4IO_3Rz#k-54{o4ERDfNak_#p zJ}6)CMpfS&|4#CmJ9c6qm-Pc5X~ag?LX&N=g9K9>cM~4{jW2Eww6#K*nR6fp`61WO z2y#97j0$1iMijDNRm1m=d50Y*m#J3(^ZrnHs3_r4+`!ac<3u)(`(SJ^ zDK}f}8bBWO^PPo@5^x?opatW9J|QZii&y5sA9(6aJ(^)xzkS9AfGimY;;z=JuQ$QJdu!FdFmk#_hdz0 z*VCK%fh8fDBT_P`Iffl<}EeYRT2_;3GYo{cebG4Q9bgs{m z(7sXB<1`JToy+nsnep5(1;{+NSOGG>_oV0XvWa1CVc@oFVx?cZ-fIP7CrWi;T9#6e z5U?~+0So*{FV?HnJf^uTRT3#wuw0B4eQ(92mO{)l!liU0brlxov07ef*EIB{JTyH+ zDJZ>N348GfPTPyZJ$+B9Sxs+Ms$T+&-VhSqtlJllSisCu{=$N!$y=(=wL+bGX)E|y z>8+8{w(ffg1ia8FrM;68bbt1%1R7q*oE1e*3iju9dKBYzQmI#B+K-h|I36Ssmx|P5 zUB2s~ub9f}wpu^E`#{$`mCPBiX?a=0yC=tAT7f@fTVUxd%iTSAbbzwJpE(ux`hZmw z|IAt&LYU+7I2O4Q-k7W2!`_QA!HKahQ8NE?KigwpHGkRgYS_D$1EA<=YU#r1CLO0p?l(P!qp79Kr$(SXCTnzutlPG+mUWKrvaX$U7u7C}!!+By z)INd2oz?QS$6B?$n99*KJxBO&wpE&}W{e+v9xI*&HceTm-nOk3*t9f#)jjY~)V>~A zP6amI=&P4LL`M`hExl>=SUl2|UUVz6P&_jB#M0Qx!FUR5Rwv4yJDyF^GH+UQJ>MT> ztwyi^*v@)b>VyVZAaHEk1FWsMY0|RRzW+G96;>6)%$U`C`pampcg9zS4G;jc20sTT z4^zGI%v-}4unfdZs_?`fK<_z@&(mmZ=LuE|OiMZPZf7g7@$^=Y_jZ^`o=%F7u>g_R zv4)O%H1EzLZNma8At*z4#5deL7PG?N;N@=Iw*aT9b8uk!6ycE_PWI-xYlRNT>jxgz zO5DxsNN6u?DhE!>bpuYzeGE7)&o$t*yr(7`@?Dml$T(;=Bg1Cdj|{V=OEN8%U&%CD zLMGEL`I{^fhe6Fn<*=!_2pwi6aBa;%Wsw_NYwigLea$`OAhEgU98@;Dh zutJYG5C=w1hvNWCfnaOtNgSF3I0axSwJq_N1_Pb$)zPE^>(pACxNnC@3v5)2c@iF2 z@lVmJS}c_CLraSahSf@>L^oQvlwimJ!83N!qNs*i3X+z{OzN!`$j$1k#C=-JwNsvF zY^BHLUC&984h&w>O13)~$$v?0;WVfYi~ zKTre`qaY9v5?>+l8xkKP@h1}BBJwjn(m4|QBauZCwCNXsq zu_y3=5^pHbj1ns;vY0-To)SkYa;g#s>my?;@w*})Eb+$@-z?D6KC{^p`z^EO61y(5 z@e+IQGutn*13$9~6ZZi{n-hh0qBKtw^NI35Q7|Y<3?)sXC}NaUkD^Rc6jq8-Oi{ck$~`50s4OV; zS%E4kR%MB+D2kP3w4(44u_REI6wR^(S`oq@^3AcRvgD23g-E0vsfRgTQc*BmS&i9E6TPsv-vo z%jM(*ie7;opBkT zdRLmJU7q7HZ^FwbX8J@d{+pZoXuY2LLJ$F_X)DKJw;?UQ4+@yfV&kjsS1+>UY#p8V zF-+Ta5+(uPgFpuNINMR6-6#2~->90o_z-j73tNl4d~@8%Y0?tEW(FIqM|+Oqu*86V zcz=#u!GrdAS4r*K!S_u#)4USu+f`)3IE9%afmn%H#pW~yQ(3c`0bNJ3rjrdM$|s2mVS7v zlM!k04b#7^7dcGuV=tIC>s;F)pP2i3&L!%6CHGh2bD6lF!(fje`WL&)tgyRB#9Sa* zI)4DcB|aF-Y^Vv0fC3&Ej%;;Nl)+QuK^DE90ih^u?&ocP2Qx5K8$!>D1LvB+{It8` zz(?f8tifU6+h~>@3>Mza64wb98+q#fVkZzq3>T4QB$=5T#yaD9;zyFCO5{%|1pZAXc^c^KZoWnaT|9&~h!b3965f6`qZ zH4h-M=011^M#&tw8AwgqYOWzacy1!M@?7To$)5Vii+Zv&Kdq!!b1X_iHb;-8Sa_&y z?Pa`6ZZ~JBWP@`~OZxa;0woQdYo;WwbCs1;SCHo?ozi)|ZZ+3&$(rZFFM0OdDkWuq z@2!&Ke{aQ66F`hRuRc4s)C%4^y+FUGY49q=v?X5EP;@yy1|xhwd{i-4UO5r_R%$I$ z?>GkpX|E=5~iYTk3jT?tI(5_AYrmdVq#4gfJ`1AM)#6-iaK7;M zT$W5|Cjje3Q`S^yr~DJb>k@Nc{P6p!YHDqtz#_PkW%Yobcf?fpA1#7|>|3P0BLR?( z0=GEszL&##{JQij>^?MhE8)83xzhKr_mn<~e3rIbbQH8bqoW4fj==7u41kTYc6oGC z6m_JNNb}aQ-`FiO*t&q1bdgB&$`%#I1$N-(sk07SpUp8{vkgfDjO}(dU*g(((=E~Z zu_?BdRt z!?6t926yM$vDj#*T|>aJmD8vREGC$g8h09fDGpr2wO2TPuqa{p^MQ+|d|APtj{+^$ z=2h_LJmi!svhWR=Aarc|tK!T%!x`k86=zNnx{G0p2f@6)BVgYOXL6_H6lNXIb^JM2 z^MYY3Vfo&N$lCe?nS(`6Nr%03FnAq_($1EIA%En$A%)~VhAfij8WL%~rU94cS2@sW zj)I}j=b%~MC4=m!^f@VxN}rSH=<_-0iawu9#PUp8QkIx1=6&X|vS2Okl?86Nwz(f1 z9yj-o!|CRBv%Folr=#-bb~bR|d-FRKaM}uo4hphes}y339GW<7mmwJiQmADUF^vwC zoTk))m4bZKLXMbf$8Ap2ZZOa339Patp2JE};%TgQr4V+lbxlX+pw{X43>zyLRV}?u zujjt*UCYq#$dF zt)yZrp_n1b6?QbM!HPPP+OfoiQfQVaQmfJubZQM-VpOeoOGvBbafyJnm@e_Mmfj`2 z) zx=6@!>XyTU!K5F8xM!sv}$0j~);@^Je>n470<^w1GaNrv!esbb7C;oHfO9y^+ z;$tWNcH(;{et6=ONB()>t0#VY;=?EYeB#?DetzKdC;orb3rP9`Nsl1u7bLxdq>qsF z6q5cz(rZZi4oMFp=tm^IiKtJJ^emG8MbgVi`Wi`(Bk6Y}y^kOd64XSJ`bbnON$Ms^ z4JE0k1hti<&JxvJlKM+hi%IG-NsT6{*95hjq>husbdvT?(&|atK1mBGX$J+Vp`=Wd zl#GJ%QItyhi?~vhV~PS!QSvE@L`7MtC`6T%tD@9Z6vv8kT2X*2N_It&uP6%^g~YP- zSP(0V@@82OEla2+&9x-b7G>SC5Zq_sxF|H2rRkEGU6jAef_YJ5FN*R-8NVd_7o`HT zxL}kci~@##kvxndi9uE|3Nc3M#w7Nb)FHE+WE7x`l9f^9^0O#r6w%DGn@OlM2zy2y z&?FohrADJRX%sUJ>ZeIAH43c$MUpj%xF*%tC=(lnWup{r6t9hPw@Dv2>FGuR-YD4{ zMSi0!aMBS@y2DYZI7k~OE##=3oV1pMG;LkJd?GGmO`et1V3+6c=}ly?=Ob}><(k6|BQ*7E zgM(NK>4IVJ+MavM{PGaE&LGH_2v5yI3iB`lI{hbXU11r_bw+oz^E5DDtc^zOn+|+n ztKj9GHy{h1CgtX-A--u&a*FruIqqO5GzqbhEmqB1kfndePInur1eq#E5Ky?<7moqi z{alBOA{p%&J{|&r7d>0qrqk}+JQ9jW6}`+986b-{I?Sw*fsN&Hz7AE|X#JQSso{a) zJPDLttJ;rQ+J^(YzfL0>hizOuMWS#7#G2zjmxk$kK^qDG+OD4*f$2#Q)Ub&3%3?5{ zSQ_8lfoaW&14e8Hr(WEGAo~d&#Ngf!H+WFpP9Bs{T+eWzY>QWCHC--Sxg*|u{Xob7 zLZVjOA&Goc$*AsAq5zg+I!wb0`O4kah>&m>&541*SP1zyr>-#zc3D5Se!LP4xLoAg z_gzQ=$QChq*V!sb0KN;Go=ECK26$umdGzAi&+ovF2eurfe;1AbLqT|!BK3pF5#iiQ zs(p>SW)Qlu`MSJc=@^96aR7}+a6G$=u}ls5cmN6(CYF=Oh%hPeF?WqLY2$kzO%0Dt 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 Date: Fri, 22 May 2026 11:28:32 +0200 Subject: [PATCH 10/16] benchmark update --- benchmark/_data_sources.py | 247 +++++----- benchmark/burgers_burgers/multirun.yaml | 208 ++++++++ benchmark/burgers_burgers__/multirun.yaml | 208 ++++++++ benchmark/cifar100_dutch/adam_config.yaml | 2 + benchmark/cifar100_dutch/alm_max_config.yaml | 2 + benchmark/cifar100_dutch/multirun.yaml | 240 ++++++++++ .../cifar100_dutch/pbm_dimin_config.yaml | 2 + benchmark/cifar100_dutch/ssg_config.yaml | 2 + benchmark/cifar10_dutch/adam_config.yaml | 5 + benchmark/cifar10_dutch/alm_max_config.yaml | 76 +++ benchmark/cifar10_dutch/alm_slack_config.yaml | 49 ++ benchmark/cifar10_dutch/multirun.yaml | 214 +++++++++ benchmark/cifar10_dutch/pbm_adapt_config.yaml | 121 +++++ benchmark/cifar10_dutch/pbm_dimin_config.yaml | 66 +++ benchmark/conf/data/x.yaml | 1 + .../launcher/configured_submitit_slurm.yaml | 15 + benchmark/conf/task/cifar100_loss.yaml | 42 ++ benchmark/conf/task/cifar10_acc_pair.yaml | 41 -- benchmark/conf/task/cifar10_loss.yaml | 63 ++- .../conf/task/dutch_positive_rate_pair.yaml | 34 +- .../task/folktables_positive_rate_pair.yaml | 33 +- .../task/folktables_positive_rate_vec.yaml | 53 ++- benchmark/conf/task/tinyimage.yaml | 42 ++ benchmark/conf/task/weight.yaml | 6 +- benchmark/constraint_meta.py | 18 +- benchmark/demo_balls.py | 265 ----------- benchmark/dutch_cifar10/pbm_adapt_config.yaml | 241 ++++++++++ benchmark/dutch_cifar10/pbm_dimin_config.yaml | 326 +++++++++++++ .../adam_config.yaml | 5 + .../alm_max_config.yaml | 76 +++ .../alm_slack_config.yaml | 49 ++ .../multirun.yaml | 216 +++++++++ .../pbm_adapt_config.yaml | 121 +++++ .../pbm_dimin_config.yaml | 101 ++++ .../ssg_config.yaml | 17 + .../adam_config.yaml | 5 + .../alm_max_config.yaml | 76 +++ .../alm_slack_config.yaml | 49 ++ .../multirun.yaml | 221 +++++++++ .../pbm_adapt_config.yaml | 141 ++++++ .../pbm_dimin_config.yaml | 101 ++++ .../ssg_config.yaml | 17 + .../adam_config.yaml | 5 + .../alm_max_config.yaml | 49 ++ .../alm_slack_config.yaml | 49 ++ .../multirun.yaml | 249 ++++++++++ .../pbm_adapt_config.yaml | 81 ++++ .../pbm_dimin_config.yaml | 101 ++++ .../ssg_config.yaml | 17 + benchmark/helmholtz_helmholtz/multirun.yaml | 208 ++++++++ benchmark/pbm_dimin_config.yaml | 326 +++++++++++++ benchmark/plotting.py | 445 +++++++++++------- benchmark/run_benchmark.py | 87 +++- benchmark/run_gridsearch.py | 92 +++- .../tinyimagenet_folktables/adam_config.yaml | 2 + .../alm_max_config.yaml | 2 + .../tinyimagenet_folktables/multirun.yaml | 218 +++++++++ .../pbm_dimin_config.yaml | 3 + benchmark/utils.py | 131 +++++- 59 files changed, 5134 insertions(+), 748 deletions(-) create mode 100644 benchmark/burgers_burgers/multirun.yaml create mode 100644 benchmark/burgers_burgers__/multirun.yaml create mode 100644 benchmark/cifar100_dutch/adam_config.yaml create mode 100644 benchmark/cifar100_dutch/alm_max_config.yaml create mode 100644 benchmark/cifar100_dutch/multirun.yaml create mode 100644 benchmark/cifar100_dutch/pbm_dimin_config.yaml create mode 100644 benchmark/cifar100_dutch/ssg_config.yaml create mode 100644 benchmark/cifar10_dutch/adam_config.yaml create mode 100644 benchmark/cifar10_dutch/alm_max_config.yaml create mode 100644 benchmark/cifar10_dutch/alm_slack_config.yaml create mode 100644 benchmark/cifar10_dutch/multirun.yaml create mode 100644 benchmark/cifar10_dutch/pbm_adapt_config.yaml create mode 100644 benchmark/cifar10_dutch/pbm_dimin_config.yaml create mode 100644 benchmark/conf/data/x.yaml create mode 100644 benchmark/conf/hydra/launcher/configured_submitit_slurm.yaml create mode 100644 benchmark/conf/task/cifar100_loss.yaml delete mode 100644 benchmark/conf/task/cifar10_acc_pair.yaml create mode 100644 benchmark/conf/task/tinyimage.yaml delete mode 100644 benchmark/demo_balls.py create mode 100644 benchmark/dutch_cifar10/pbm_adapt_config.yaml create mode 100644 benchmark/dutch_cifar10/pbm_dimin_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/adam_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/multirun.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/adam_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/multirun.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml create mode 100644 benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/adam_config.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/alm_max_config.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/multirun.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml create mode 100644 benchmark/equalized_odds_vec_folktables/ssg_config.yaml create mode 100644 benchmark/helmholtz_helmholtz/multirun.yaml create mode 100644 benchmark/pbm_dimin_config.yaml create mode 100644 benchmark/tinyimagenet_folktables/adam_config.yaml create mode 100644 benchmark/tinyimagenet_folktables/alm_max_config.yaml create mode 100644 benchmark/tinyimagenet_folktables/multirun.yaml create mode 100644 benchmark/tinyimagenet_folktables/pbm_dimin_config.yaml diff --git a/benchmark/_data_sources.py b/benchmark/_data_sources.py index dcfef0f..117d83d 100644 --- a/benchmark/_data_sources.py +++ b/benchmark/_data_sources.py @@ -6,8 +6,6 @@ from sklearn.model_selection import train_test_split from humancompatible.train.fairness.utils import BalancedBatchSampler from itertools import product -import torchvision -from torchvision import transforms import itertools @@ -39,7 +37,7 @@ def comb_cat_dummies(df): -def load_data_norm(batch_size=64): +def load_data_norm(batch_size=64, device='cpu'): # load folktables data data_source = ACSDataSource(survey_year="2018", horizon="1-Year", survey="person") @@ -74,19 +72,19 @@ def load_data_norm(batch_size=64): X_test = scaler.transform(X_test) # make into a pytorch dataset, remove the sensitive attribute - features_train = torch.tensor(X_train) - labels_train = torch.tensor(y_train) - sens_train = torch.tensor(groups_train) + features_train = torch.tensor(X_train).to(device) + labels_train = torch.tensor(y_train).to(device) + sens_train = torch.tensor(groups_train).to(device) # make into a pytorch dataset, remove the sensitive attribute - features_val = torch.tensor(X_val) - labels_val = torch.tensor(y_val) - sens_val = torch.tensor(groups_val) + features_val = torch.tensor(X_val).to(device) + labels_val = torch.tensor(y_val).to(device) + sens_val = torch.tensor(groups_val).to(device) # make into a pytorch dataset, remove the sensitive attribute - features_test = torch.tensor(X_test) - labels_test = torch.tensor(y_test) - sens_test = torch.tensor(groups_test) + features_test = torch.tensor(X_test).to(device) + labels_test = torch.tensor(y_test).to(device) + sens_test = torch.tensor(groups_test).to(device) # set the same seed for fair comparisons torch.manual_seed(0) @@ -104,7 +102,7 @@ def load_data_norm(batch_size=64): return (dataloader_train, dataloader_val, dataloader_test), (features_train, sens_train, labels_train), (features_val, sens_val, labels_val), (features_test, sens_test, labels_test) -def load_data_FT(batch_size, device, sens_attrs, states, group_size_threshold = 0, sens_groups = None, extend_groups = False): +def load_data_FT(batch_size, device, sens_attrs, states=['VA'], group_size_threshold = 0, sens_groups = None, extend_groups = False, dtype=torch.float32): # load folktables data data_source = ACSDataSource(survey_year="2018", horizon="1-Year", survey="person") ACSProblem = BasicProblem( @@ -125,6 +123,10 @@ def load_data_FT(batch_size, device, sens_attrs, states, group_size_threshold = acs_data, categories=categories, dummies=True ) + if 'MAR' in sens_attrs: + df_sens['MAR_2'] = df_sens['MAR_2'] + df_sens['MAR_4'] + df_sens['MAR_5'] + df_sens.drop(['MAR_4', 'MAR_5'], inplace=True, axis='columns') + # df_sens_onehot = comb_cat_dummies(df_sens) if sens_groups else df_sens df_sens_onehot = comb_cat_dummies(df_sens) if len(sens_attrs) > 1 else df_sens @@ -170,21 +172,21 @@ def load_data_FT(batch_size, device, sens_attrs, states, group_size_threshold = print(f"{df_sens_onehot.columns[idx]}, : {(groups[:, idx] == 1).sum()}") # make into a pytorch dataset, remove the sensitive attribute - features_train = torch.tensor(X_train).to(torch.float32) - labels_train = torch.tensor(y_train).to(torch.float32) - sens_train = torch.tensor(groups_train).to(torch.float32) + features_train = torch.tensor(X_train).to(dtype) + labels_train = torch.tensor(y_train).to(dtype) + sens_train = torch.tensor(groups_train).to(dtype) dataset_train = torch.utils.data.TensorDataset(features_train, labels_train) # make into a pytorch dataset, remove the sensitive attribute - features_val = torch.tensor(X_val).to(torch.float32) - labels_val = torch.tensor(y_val).to(torch.float32) - sens_val = torch.tensor(groups_val).to(torch.float32) + features_val = torch.tensor(X_val).to(dtype) + labels_val = torch.tensor(y_val).to(dtype) + sens_val = torch.tensor(groups_val).to(dtype) dataset_val = torch.utils.data.TensorDataset(features_val, labels_val) # make into a pytorch dataset, remove the sensitive attribute - features_test = torch.tensor(X_test).to(torch.float32) - labels_test = torch.tensor(y_test).to(torch.float32) - sens_test = torch.tensor(groups_test).to(torch.float32) + features_test = torch.tensor(X_test).to(dtype) + labels_test = torch.tensor(y_test).to(dtype) + sens_test = torch.tensor(groups_test).to(dtype) dataset_test = torch.utils.data.TensorDataset(features_test, labels_test) # get the dataset @@ -211,8 +213,7 @@ def load_data_FT(batch_size, device, sens_attrs, states, group_size_threshold = - -def load_data_FT_prod(batch_size, device='cpu'): +def load_data_FT_prod(batch_size, device='cpu', extend_groups = False): # load folktables data data_source = ACSDataSource(survey_year="2018", horizon="1-Year", survey="person") @@ -286,21 +287,21 @@ def load_data_FT_prod(batch_size, device='cpu'): print(f"{group_dict[idx]}, : {(groups_onehot[:, idx] == 1).sum()}") # make into a pytorch dataset, remove the sensitive attribute - features_train = torch.tensor(X_train).to(torch.float32) - labels_train = torch.tensor(y_train).to(torch.float32) - sens_train = torch.tensor(groups_train).to(torch.float32) + features_train = torch.tensor(X_train).to(torch.float32).to(device) + labels_train = torch.tensor(y_train).to(torch.float32).to(device) + sens_train = torch.tensor(groups_train).to(torch.float32).to(device) dataset_train = torch.utils.data.TensorDataset(features_train, labels_train) # make into a pytorch dataset, remove the sensitive attribute - features_val = torch.tensor(X_val).to(torch.float32) - labels_val = torch.tensor(y_val).to(torch.float32) - sens_val = torch.tensor(groups_val).to(torch.float32) + features_val = torch.tensor(X_val).to(torch.float32).to(device) + labels_val = torch.tensor(y_val).to(torch.float32).to(device) + sens_val = torch.tensor(groups_val).to(torch.float32).to(device) dataset_val = torch.utils.data.TensorDataset(features_val, labels_val) # make into a pytorch dataset, remove the sensitive attribute - features_test = torch.tensor(X_test).to(torch.float32) - labels_test = torch.tensor(y_test).to(torch.float32) - sens_test = torch.tensor(groups_test).to(torch.float32) + features_test = torch.tensor(X_test).to(torch.float32).to(device) + labels_test = torch.tensor(y_test).to(torch.float32).to(device) + sens_test = torch.tensor(groups_test).to(torch.float32).to(device) dataset_test = torch.utils.data.TensorDataset(features_test, labels_test) # set the same seed for fair comparisons @@ -313,13 +314,13 @@ def load_data_FT_prod(batch_size, device='cpu'): # create a balanced sampling - needed for an unbiased gradient sampler = BalancedBatchSampler( - group_onehot=sens_train, batch_size=batch_size, drop_last=True + group_onehot=sens_train, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) sampler_val = BalancedBatchSampler( - group_onehot=sens_val, batch_size=batch_size, drop_last=True + group_onehot=sens_val, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) sampler_test = BalancedBatchSampler( - group_onehot=sens_test, batch_size=batch_size, drop_last=True + group_onehot=sens_test, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) # create a dataloader from the sampler @@ -331,7 +332,7 @@ def load_data_FT_prod(batch_size, device='cpu'): -def load_data_FT_vec(batch_size, attr = "SEX", device='cpu'): +def load_data_FT_vec(batch_size, device='cpu', attr = "SEX", extend_groups = False): # load folktables data data_source = ACSDataSource(survey_year="2018", horizon="1-Year", survey="person") @@ -369,22 +370,22 @@ def load_data_FT_vec(batch_size, attr = "SEX", device='cpu'): X_test = scaler.transform(X_test) # make into a pytorch dataset, remove the sensitive attribute - features_train = torch.tensor(X_train) - labels_train = torch.tensor(y_train) - sens_train = torch.tensor(groups_train) + features_train = torch.tensor(X_train).to(device) + labels_train = torch.tensor(y_train).to(device) + sens_train = torch.tensor(groups_train).to(device) dataset_train = torch.utils.data.TensorDataset(features_train, labels_train) # make into a pytorch dataset, remove the sensitive attribute - features_val = torch.tensor(X_val) - labels_val = torch.tensor(y_val) - sens_val = torch.tensor(groups_val) + features_val = torch.tensor(X_val).to(device) + labels_val = torch.tensor(y_val).to(device) + sens_val = torch.tensor(groups_val).to(device) dataset_val = torch.utils.data.TensorDataset(features_val, labels_val) # make into a pytorch dataset, remove the sensitive attribute - features_test = torch.tensor(X_test) - labels_test = torch.tensor(y_test) - sens_test = torch.tensor(groups_test) - dataset_test = torch.utils.data.TensorDataset(features_test, labels_test) + features_test = torch.tensor(X_test).to(device) + labels_test = torch.tensor(y_test).to(device) + sens_test = torch.tensor(groups_test).to(device) + dataset_test = torch.utils.data.TensorDataset(features_test, sens_test, labels_test) # set the same seed for fair comparisons torch.manual_seed(0) @@ -396,13 +397,13 @@ def load_data_FT_vec(batch_size, attr = "SEX", device='cpu'): # create a balanced sampling - needed for an unbiased gradient sampler = BalancedBatchSampler( - group_onehot=sens_train, batch_size=batch_size, drop_last=True + group_onehot=sens_train, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) sampler_val = BalancedBatchSampler( - group_onehot=sens_val, batch_size=batch_size, drop_last=True + group_onehot=sens_val, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) sampler_test = BalancedBatchSampler( - group_onehot=sens_test, batch_size=batch_size, drop_last=True + group_onehot=sens_test, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) # create a dataloader from the sampler @@ -413,45 +414,45 @@ def load_data_FT_vec(batch_size, attr = "SEX", device='cpu'): return (dataloader_train, dataloader_val, dataloader_test), (features_train, sens_train, labels_train), (features_val, sens_val, labels_val), (features_test, sens_test, labels_test) -def load_data_DUTCH(batch_size): +def load_data_DUTCH(batch_size, device='cpu', extend_groups = False): # Get the data with a validation split X_train, X_val, X_test, y_train, y_val, y_test, groups_train, groups_val, groups_test, group_names_dict = get_data_dutch( test_size=0.4, seed_n=42, drop_small_groups=True, print_stats=True ) # Convert training data to PyTorch tensors - features_train = torch.tensor(X_train).to(torch.float32) - labels_train = torch.tensor(y_train.to_numpy()).reshape((-1, 1)).to(torch.float32) - sens_train = torch.tensor(groups_train).to(torch.float32) + features_train = torch.tensor(X_train).to(torch.float32).to(device) + labels_train = torch.tensor(y_train.to_numpy()).reshape((-1, 1)).to(torch.float32).to(device) + sens_train = torch.tensor(groups_train).to(torch.float32).to(device) dataset_train = torch.utils.data.TensorDataset(features_train, sens_train, labels_train) # Convert validation data to PyTorch tensors - features_val = torch.tensor(X_val).to(torch.float32) - labels_val = torch.tensor(y_val).reshape((-1, 1)).to(torch.float32) - sens_val = torch.tensor(groups_val).to(torch.float32) + features_val = torch.tensor(X_val).to(torch.float32).to(device) + labels_val = torch.tensor(y_val).reshape((-1, 1)).to(torch.float32).to(device) + sens_val = torch.tensor(groups_val).to(torch.float32).to(device) dataset_val = torch.utils.data.TensorDataset(features_val, sens_val, labels_val) # Convert test data to PyTorch tensors - features_test = torch.tensor(X_test).to(torch.float32) - labels_test = torch.tensor(y_test.to_numpy()).reshape((-1, 1)).to(torch.float32) - sens_test = torch.tensor(groups_test).to(torch.float32) + features_test = torch.tensor(X_test).to(torch.float32).to(device) + labels_test = torch.tensor(y_test.to_numpy()).reshape((-1, 1)).to(torch.float32).to(device) + sens_test = torch.tensor(groups_test).to(torch.float32).to(device) dataset_test = torch.utils.data.TensorDataset(features_test, sens_test, labels_test) # Create balanced samplers sampler_train = BalancedBatchSampler( - group_onehot=sens_train, batch_size=batch_size, drop_last=True#, extend_groups=list(range(sens_train.shape[1])) + group_onehot=sens_train, batch_size=batch_size, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) sampler_val = BalancedBatchSampler( - group_onehot=sens_val, batch_size=252*4, drop_last=True#, extend_groups=list(range(sens_train.shape[1])) + group_onehot=sens_val, batch_size=252*4, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) sampler_test = BalancedBatchSampler( - group_onehot=sens_test, batch_size=252*4, drop_last=True#, extend_groups=list(range(sens_train.shape[1])) + group_onehot=sens_test, batch_size=252*4, drop_last=True, extend_groups=list(range(sens_train.shape[1])) if extend_groups else None ) # Create dataloaders - dataloader_train = torch.utils.data.DataLoader(dataset_train, batch_sampler=sampler_train, num_workers=8) - dataloader_val = torch.utils.data.DataLoader(dataset_val, batch_sampler=sampler_val, num_workers=8) - dataloader_test = torch.utils.data.DataLoader(dataset_test, batch_sampler=sampler_test, num_workers=8) + dataloader_train = torch.utils.data.DataLoader(dataset_train, batch_sampler=sampler_train) + dataloader_val = torch.utils.data.DataLoader(dataset_val, batch_sampler=sampler_val) + dataloader_test = torch.utils.data.DataLoader(dataset_test, batch_sampler=sampler_test) return (dataloader_train, dataloader_val, dataloader_test), (features_train, sens_train, labels_train), (features_val, sens_val, labels_val), (features_test, sens_test, labels_test) @@ -549,7 +550,10 @@ def get_data_dutch(test_size=0.2, seed_n = 42, drop_small_groups=True, print_sta -def load_data_cifar10(balanced=False): +def load_data_cifar10(balanced=False, device='cpu'): + + import torchvision + from torchvision import transforms # load the data transform = transforms.Compose( @@ -566,6 +570,7 @@ def load_data_cifar10(balanced=False): # make some parameters global global classes + print(device) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') @@ -579,60 +584,69 @@ def load_data_cifar10(balanced=False): print(class_ind) # load all data and create a balanced sampler - X = torch.stack([item[0] for item in trainset]) - targets = torch.tensor([item[1] for item in trainset]) + X = torch.stack([item[0] for item in trainset]).to(device) + targets = torch.tensor([item[1] for item in trainset]).to(device) # create onehot vectors - groups_onehot = torch.eye(10)[targets] + groups_onehot = torch.eye(10)[targets].to(device) # create a train dataset dataset_train = torch.utils.data.TensorDataset(X, groups_onehot, targets) - # create the balanced dataloader - sampler = BalancedBatchSampler( - group_onehot=groups_onehot, batch_size=batch_size, drop_last=True - ) if balanced: - trainloader = torch.utils.data.DataLoader(dataset_train, batch_sampler=sampler, num_workers=10) + sampler = BalancedBatchSampler(group_onehot=groups_onehot, batch_size=batch_size, drop_last=True) + trainloader = torch.utils.data.DataLoader(dataset_train, batch_sampler=sampler) else: - trainloader = torch.utils.data.DataLoader(dataset_train, batch_size=batch_size, num_workers=10) + trainloader = torch.utils.data.DataLoader(dataset_train, batch_size=batch_size) # load all data and create a balanced sampler - X_test = torch.stack([item[0] for item in testset]) - targets_test = torch.tensor([item[1] for item in testset]) + X_test = torch.stack([item[0] for item in testset]).to(device) + targets_test = torch.tensor([item[1] for item in testset]).to(device) # create onehot vectors - groups_onehot_test = torch.eye(10)[targets_test] + groups_onehot_test = torch.eye(10)[targets_test].to(device) # split test / val X_test, X_val, targets_test, targets_val, groups_onehot_test, groups_onehot_val = \ train_test_split(X_test, targets_test, groups_onehot_test, test_size=0.5, random_state=42) - # create a train dataset - dataset_test = torch.utils.data.TensorDataset(X_test, groups_onehot_test, targets_test) + dataset_val = torch.utils.data.TensorDataset(X_val, groups_onehot_val, targets_val) - # create the balanced dataloader - sampler = BalancedBatchSampler( - group_onehot=groups_onehot_test, batch_size=batch_size, drop_last=True - ) + global valloader + if balanced: + # create the balanced dataloader + sampler = BalancedBatchSampler( + group_onehot=groups_onehot_val, batch_size=batch_size, drop_last=True + ) + valloader = torch.utils.data.DataLoader(dataset_val, batch_sampler=sampler) + else: + valloader = torch.utils.data.DataLoader(dataset_val, batch_size=batch_size) - global testloader + dataset_test = torch.utils.data.TensorDataset(X_test, groups_onehot_test, targets_test) + + global testloader if balanced: - testloader = torch.utils.data.DataLoader(dataset_test, batch_sampler=sampler, num_workers=10) - else: - testloader = torch.utils.data.DataLoader(dataset_test, batch_size=batch_size, num_workers=10) + # create the balanced dataloader + sampler = BalancedBatchSampler( + group_onehot=groups_onehot_test, batch_size=batch_size, drop_last=True + ) + testloader = torch.utils.data.DataLoader(dataset_test, batch_sampler=sampler) + else: + testloader = torch.utils.data.DataLoader(dataset_test, batch_size=batch_size) # clean the memory of redundant variables del X, targets, groups_onehot del X_test, targets_test, groups_onehot_test + return trainloader, valloader, testloader, classes, class_ind - return trainloader, testloader, classes, class_ind +def load_data_cifar100(balanced=False, device='cpu'): -def load_data_cifar100(balanced=False): + import torchvision + from torchvision import transforms # load the data transform = transforms.Compose( @@ -672,50 +686,63 @@ def load_data_cifar100(balanced=False): print(class_ind) # load all data and create a balanced sampler - X = torch.stack([item[0] for item in trainset]) - targets = torch.tensor([item[1] for item in trainset]) + X = torch.stack([item[0] for item in trainset]).to(device) + targets = torch.tensor([item[1] for item in trainset]).to(device) # create onehot vectors - groups_onehot = torch.eye(100)[targets] + groups_onehot = torch.eye(100)[targets].to(device) # create a train dataset dataset_train = torch.utils.data.TensorDataset(X, groups_onehot, targets) - # create the balanced dataloader - sampler = BalancedBatchSampler( - group_onehot=groups_onehot, batch_size=batch_size, drop_last=True - ) if balanced: - trainloader = torch.utils.data.DataLoader(dataset_train, batch_sampler=sampler, num_workers=1) + # create the balanced dataloader + sampler = BalancedBatchSampler( + group_onehot=groups_onehot, batch_size=batch_size, drop_last=True + ) + trainloader = torch.utils.data.DataLoader(dataset_train, batch_sampler=sampler) else: - trainloader = torch.utils.data.DataLoader(dataset_train, batch_size=batch_size, num_workers=1) + trainloader = torch.utils.data.DataLoader(dataset_train, batch_size=batch_size) # load all data and create a balanced sampler - X_test = torch.stack([item[0] for item in testset]) - targets_test = torch.tensor([item[1] for item in testset]) + X_test = torch.stack([item[0] for item in testset]).to(device) + targets_test = torch.tensor([item[1] for item in testset]).to(device) # create onehot vectors - groups_onehot_test = torch.eye(100)[targets_test] + groups_onehot_test = torch.eye(100)[targets_test].to(device) # split test / val X_test, X_val, targets_test, targets_val, groups_onehot_test, groups_onehot_val = \ train_test_split(X_test, targets_test, groups_onehot_test, test_size=0.5, random_state=42) + # create a train dataset + dataset_val = torch.utils.data.TensorDataset(X_val, groups_onehot_val, targets_val) + + global valloader + if balanced: + # create the balanced dataloader + sampler = BalancedBatchSampler( + group_onehot=groups_onehot_val, batch_size=batch_size, drop_last=True + ) + valloader = torch.utils.data.DataLoader(dataset_val, batch_sampler=sampler) + else: + valloader = torch.utils.data.DataLoader(dataset_val, batch_size=batch_size) + # create a train dataset dataset_test = torch.utils.data.TensorDataset(X_test, groups_onehot_test, targets_test) - # create the balanced dataloader - sampler = BalancedBatchSampler( - group_onehot=groups_onehot_test, batch_size=batch_size, drop_last=True - ) global testloader if balanced: - testloader = torch.utils.data.DataLoader(dataset_test, batch_sampler=sampler, num_workers=1) + # create the balanced dataloader + sampler = BalancedBatchSampler( + group_onehot=groups_onehot_test, batch_size=batch_size, drop_last=True + ) + testloader = torch.utils.data.DataLoader(dataset_test, batch_sampler=sampler) else: - testloader = torch.utils.data.DataLoader(dataset_test, batch_size=batch_size, num_workers=1) + testloader = torch.utils.data.DataLoader(dataset_test, batch_size=batch_size) # clean the memory of redundant variables del X, targets, groups_onehot del X_test, targets_test, groups_onehot_test - return trainloader, testloader, classes, class_ind \ No newline at end of file + return trainloader, valloader, testloader, classes, class_ind \ No newline at end of file diff --git a/benchmark/burgers_burgers/multirun.yaml b/benchmark/burgers_burgers/multirun.yaml new file mode 100644 index 0000000..97107bd --- /dev/null +++ b/benchmark/burgers_burgers/multirun.yaml @@ -0,0 +1,208 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: h200fast,amdgpufast + qos: null + comment: null + constraint: null + exclude: null + gres: gpu=1 + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 10G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 99 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=alm + - algorithm.primal__lr=0.0005,0.001 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.005,0.01,0.05 + - algorithm.dual__penalty=0.,1. + - algorithm.moreau__mu=1. + - seed=0,1 + - task=burgers + - data=burgers + - model=deep_narrow + - +algorithm.beta=1 + job: + name: PDE_Viscous_Burgers + chdir: false + override_dirname: +algorithm.beta=1,+algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.005,0.01,0.05,algorithm.dual__penalty=0.,1.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0005,0.001,algorithm=alm,data=burgers,model=deep_narrow,seed=0,1,task=burgers + id: ??? + num: ??? + config_name: helmholtz + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: alm + data: burgers + task: burgers + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amdgpu + hydra/output: default + verbose: false +task: + task: burgers +data: + name: burgers +algorithm: + algorithm: alm + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__penalty: 0., 1., 2. + moreau__mu: 1.0 + primal__weight_decay: 0.01 + beta: 1 +n_epochs: 5000 +seed: 0 +model: deep_narrow diff --git a/benchmark/burgers_burgers__/multirun.yaml b/benchmark/burgers_burgers__/multirun.yaml new file mode 100644 index 0000000..f00c430 --- /dev/null +++ b/benchmark/burgers_burgers__/multirun.yaml @@ -0,0 +1,208 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: h200fast,amdgpufast + qos: null + comment: null + constraint: null + exclude: null + gres: gpu=1 + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 10G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 99 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=alm + - algorithm.primal__lr=0.0005,0.001 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.0005,0.001 + - algorithm.dual__penalty=0.,1. + - algorithm.moreau__mu=1. + - seed=0,1 + - task=burgers + - data=burgers + - model=deep_narrow + - +algorithm.beta=1 + job: + name: PDE_Viscous_Burgers + chdir: false + override_dirname: +algorithm.beta=1,+algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0005,0.001,algorithm.dual__penalty=0.,1.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0005,0.001,algorithm=alm,data=burgers,model=deep_narrow,seed=0,1,task=burgers + id: ??? + num: ??? + config_name: helmholtz + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: alm + data: burgers + task: burgers + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amdgpu + hydra/output: default + verbose: false +task: + task: burgers +data: + name: burgers +algorithm: + algorithm: alm + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__penalty: 0., 1., 2. + moreau__mu: 1.0 + primal__weight_decay: 0.01 + beta: 1 +n_epochs: 10000 +seed: 0 +model: deep_narrow diff --git a/benchmark/cifar100_dutch/adam_config.yaml b/benchmark/cifar100_dutch/adam_config.yaml new file mode 100644 index 0000000..5ad545a --- /dev/null +++ b/benchmark/cifar100_dutch/adam_config.yaml @@ -0,0 +1,2 @@ +,algorithm,primal__lr,primal__weight_decay +7c3fe4eff95d,adam,0.0001,0.01 diff --git a/benchmark/cifar100_dutch/alm_max_config.yaml b/benchmark/cifar100_dutch/alm_max_config.yaml new file mode 100644 index 0000000..2cce36e --- /dev/null +++ b/benchmark/cifar100_dutch/alm_max_config.yaml @@ -0,0 +1,2 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 diff --git a/benchmark/cifar100_dutch/multirun.yaml b/benchmark/cifar100_dutch/multirun.yaml new file mode 100644 index 0000000..6f6fd5d --- /dev/null +++ b/benchmark/cifar100_dutch/multirun.yaml @@ -0,0 +1,240 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: h200fast + qos: null + comment: null + constraint: null + exclude: null + gres: gpu=1 + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 20G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 85 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=ssg + - algorithm.primal__lr=0.002 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.002 + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=cifar100_loss + - data=dutch + - use_test=true + - n_epochs=30 + job: + name: run_single_experiment + chdir: false + override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.002,algorithm.moreau__mu=1.,algorithm.primal__lr=0.002,algorithm=ssg,data=dutch,n_epochs=30,seed=0,1,2,task=cifar100_loss,use_test=true + id: ??? + num: ??? + config_name: experiment + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: ssg + data: dutch + task: cifar100_loss + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_h200 + hydra/output: default + verbose: false +task: + task: cifar100 + batch_size: 400 + constraint: + name: LossPairwise + bound: 0.1 + loss: CrossEntropyLoss + algorithms: none + pbm_params: + primal__lr: 0.05 + dual__penalty_mult: 1.0 + dual__penalty_update: dimin + dual__penalty_range: + - 0.1 + - 10.0 + dual__pbf: quadratic_logarithmic + dual__gamma: 0.2 + dual_delta: 1.0 + moreau__mu: 0.0 + alm_params: + primal__lr: 0.01 + dual__lr: 0.001 + dual__penalty: 0.0 + dual__momentum: 0.0 + moreau__mu: 0.0 + adam_params: + lr: 0.01 + hydra: + run: + dir: . + job: + chdir: false +data: + name: dutch + kwargs: + sens_attrs: + - AGE + - SEX + extend_groups: false +algorithm: + algorithm: ssg + primal__lr: 0.002 + dual__lr: 0.002 + moreau__mu: 1.0 + primal__weight_decay: 0.01 +n_epochs: 30 +seed: 0 +use_test: true diff --git a/benchmark/cifar100_dutch/pbm_dimin_config.yaml b/benchmark/cifar100_dutch/pbm_dimin_config.yaml new file mode 100644 index 0000000..2bd3c0c --- /dev/null +++ b/benchmark/cifar100_dutch/pbm_dimin_config.yaml @@ -0,0 +1,2 @@ +,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay +c4052e989d6c,pbm_dimin,0.002,1.0,const,quadratic_reciprocal,0.9500000000000001,1.0,1.0,0.01 diff --git a/benchmark/cifar100_dutch/ssg_config.yaml b/benchmark/cifar100_dutch/ssg_config.yaml new file mode 100644 index 0000000..758e11b --- /dev/null +++ b/benchmark/cifar100_dutch/ssg_config.yaml @@ -0,0 +1,2 @@ +,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay +028daf5cba49,ssg,0.002,0.002,1.0,0.01 diff --git a/benchmark/cifar10_dutch/adam_config.yaml b/benchmark/cifar10_dutch/adam_config.yaml new file mode 100644 index 0000000..ec1cbaa --- /dev/null +++ b/benchmark/cifar10_dutch/adam_config.yaml @@ -0,0 +1,5 @@ +,algorithm,primal__lr,primal__weight_decay +320c69024dbe,adam,0.0005,0.01 +7c3fe4eff95d,adam,0.0001,0.01 +28191679ac49,adam,0.005,0.01 +cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/cifar10_dutch/alm_max_config.yaml b/benchmark/cifar10_dutch/alm_max_config.yaml new file mode 100644 index 0000000..7528ebe --- /dev/null +++ b/benchmark/cifar10_dutch/alm_max_config.yaml @@ -0,0 +1,76 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +ae1f543f9f8b,alm_max,0.001,0.002,1.0,1.0,0.01 +a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 +ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 +e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 +2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 +f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 +b9ea0c071737,alm_max,0.002,0.002,1.0,1.0,0.01 +a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 +e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 +77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 +f24ef0214d90,alm_max,0.0001,0.002,1.0,1.0,0.01 +8df8dd2f3cfc,alm_max,0.0005,0.002,2.0,1.0,0.01 +7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 +1dc3ca37b989,alm_max,0.0005,0.002,0.0,1.0,0.01 +8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 +7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 +72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 +a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 +58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 +934004fb2498,alm_max,0.0001,0.002,2.0,1.0,0.01 +c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 +cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 +6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 +a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 +3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 +44d7d36e411e,alm_max,0.0005,0.002,1.0,1.0,0.01 +c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 +30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 +f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 +b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 +d310040b890f,alm_max,0.002,0.001,0.0,1.0,0.01 +295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 +a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 +2e8c67ef953b,alm_max,0.001,0.002,2.0,1.0,0.01 +199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 +f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 +d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 +cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 +ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 +16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 +36e233f0a98b,alm_max,0.001,0.002,0.0,1.0,0.01 +e6546be05ab0,alm_max,0.005,0.002,2.0,1.0,0.01 +a27958b6f9f2,alm_max,0.0001,0.002,0.0,1.0,0.01 +9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 +f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 +4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 +81ece7ef23c6,alm_max,0.002,0.0005,1.0,1.0,0.01 +0eaf19039256,alm_max,0.002,0.005,0.0,1.0,0.01 +27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 +4a0cb304fe9c,alm_max,0.002,0.0001,1.0,1.0,0.01 +8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 +d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 +a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 +dc16bc324021,alm_max,0.002,0.002,2.0,1.0,0.01 +3b817f73f60b,alm_max,0.005,0.002,1.0,1.0,0.01 +d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 +90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 +69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 +06b8db61a8e6,alm_max,0.002,0.001,2.0,1.0,0.01 +f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 +ff2474672e82,alm_max,0.002,0.0005,0.0,1.0,0.01 +446799210d39,alm_max,0.002,0.001,1.0,1.0,0.01 +93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 +65a4b39a2a78,alm_max,0.002,0.0001,2.0,1.0,0.01 +72d30a3226a1,alm_max,0.002,0.005,1.0,1.0,0.01 +ee4295850776,alm_max,0.002,0.005,2.0,1.0,0.01 +923b7ed4eddf,alm_max,0.005,0.002,0.0,1.0,0.01 +bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 +a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 +5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 +6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 +6e9dbf3d08d4,alm_max,0.002,0.0005,2.0,1.0,0.01 +a44b5e13d05e,alm_max,0.002,0.002,0.0,1.0,0.01 +d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 +e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/cifar10_dutch/alm_slack_config.yaml b/benchmark/cifar10_dutch/alm_slack_config.yaml new file mode 100644 index 0000000..dd18915 --- /dev/null +++ b/benchmark/cifar10_dutch/alm_slack_config.yaml @@ -0,0 +1,49 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 +cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 +566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 +7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 +cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 +572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 +ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 +5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 +f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 +ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 +f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 +36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 +dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 +cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 +a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 +18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 +3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 +d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 +5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 +43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 +cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 +d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 +ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 +17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 +9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 +7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 +79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 +0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 +80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 +933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 +ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 +7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 +39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 +38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 +4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 +93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 +d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 +5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 +c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 +cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 +927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 +d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 +f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 +4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 +bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 +776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 +76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 +5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/cifar10_dutch/multirun.yaml b/benchmark/cifar10_dutch/multirun.yaml new file mode 100644 index 0000000..e4f5068 --- /dev/null +++ b/benchmark/cifar10_dutch/multirun.yaml @@ -0,0 +1,214 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: h200fast,amdgpufast + qos: null + comment: null + constraint: null + exclude: null + gres: gpu=1 + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 16G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 100 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=alm_slack + - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.0001,0.0005,0.001,0.005 + - algorithm.dual__penalty=0.,1.,2. + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=cifar10_loss + - data=dutch + job: + name: run_single_experiment + chdir: false + override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0001,0.0005,0.001,0.005,algorithm.dual__penalty=0.,1.,2.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=alm_slack,data=dutch,seed=0,1,2,task=cifar10_loss + id: ??? + num: ??? + config_name: experiment + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: alm_slack + data: dutch + task: cifar10_loss + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amdgpu + hydra/output: default + verbose: false +task: + task: cifar10 + batch_size: 120 + constraint: + name: LossPairwise + bound: 0.1 + loss: CrossEntropyLoss +data: + name: dutch + kwargs: + sens_attrs: + - AGE + - SEX + extend_groups: false +algorithm: + algorithm: alm_slack + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__penalty: 0., 1., 2. + moreau__mu: 1.0 + primal__weight_decay: 0.01 +n_epochs: 10 +seed: 0 diff --git a/benchmark/cifar10_dutch/pbm_adapt_config.yaml b/benchmark/cifar10_dutch/pbm_adapt_config.yaml new file mode 100644 index 0000000..9b0abf1 --- /dev/null +++ b/benchmark/cifar10_dutch/pbm_adapt_config.yaml @@ -0,0 +1,121 @@ +,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult +be22673a4486,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +e68f152b3331,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +54782fa0b5be,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +7929ffa54302,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +5454fa0b8dfe,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +787248ddc490,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +34aaea793403,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +40a4f7489252,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +ce18010adc70,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +cb027db34245,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +036fddf6b004,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +56109b6b2c6d,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +6262fba9720e,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +eebb07ce6841,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +8f579ef22b71,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +a259b37ddeda,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +a98bbe9fe4c4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +641bf5324616,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +4b1cc8ace568,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +3b80a4d05983,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +8e93af2b6e10,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +ae23b284968c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +22fe22c8d318,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +45937e86c6d4,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +61275eea06ec,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +701efae4fb2d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +a53875bd2360,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +714d3c06c0cd,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +a2e6fb502c81,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +9a86344143c1,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +a5d64f3884d6,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +c1703366481e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +956bc43e4dbc,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +5a72c3d47280,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +370b7e556bd2,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +17324bd6bf5f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +765205ddc668,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +11ad72fe9245,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +359d8f81b334,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +a7c22ee50994,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +f0182669cf79,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +d78182d64690,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +d8236456c992,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +6dfee9171ed6,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +23ae18d8aa4c,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +5a7fd986583c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +88499dcda38b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +5ddd9bca044f,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +b8aab754f18a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +feba85d80f18,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +2de391a3c15a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +8fbd1e9d1d22,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +09a26f048887,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +abffec495d1d,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +d7daabcecba7,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +6fb0f9b45bf2,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +9840de24187c,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +68ca6ca4e4ca,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +6c301438dddc,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +78d878c0791f,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +05ba3627ccb3,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +72730f6d2b3b,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +ca4dbdd3121e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +297de22117f8,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +5e92ae0310f8,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +7588d622a66e,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +4f69717a956c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +4ddc9fc8f90b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +2ef950c7e893,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +803c34c411f7,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +86aa35732504,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +2cb0d01a4caf,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +5e352d823d03,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +3a2c5d68f9c9,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +e277a7ffc241,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +4d0366836a1e,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +b82eef34fbb4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +e62105ff5d13,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +a0d22d602bbc,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +8d8c71b368a0,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +e0433040efe7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +cf58ba368994,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +574a9166bd29,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +be62778a9ca9,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +254327f25d9c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +eb3d60b97504,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +0b015280585a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +1132d01718da,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +a03c1afbf6b0,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +c1fe769cd2f3,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +db82422300c8,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +5787d71dba2b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +ae2b5242bc9f,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +693cc15909e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +114fcb802009,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +2eef423358c7,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +2fe8b30d8c7b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +d33e4820759d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +26287d2c1840,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +75ca213ffdee,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +51a224528840,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +82f85c3d620c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +d7714e56603a,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +5cd4332fca7f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +9b18daf6739a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +2dee840e47b2,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +324c1c7c5122,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +bfef4e1d0b38,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +ba1412aa3f3e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +4d3b0f64b188,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +66a27189f839,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +e0309aeff930,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +8efd6c89829d,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +483f821172e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +bb689b61126b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +d312728bea17,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +9f730d2f9c51,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +d2e20d508ec9,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +14751917cef7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +8e44e3c80150,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 diff --git a/benchmark/cifar10_dutch/pbm_dimin_config.yaml b/benchmark/cifar10_dutch/pbm_dimin_config.yaml new file mode 100644 index 0000000..e74e4ba --- /dev/null +++ b/benchmark/cifar10_dutch/pbm_dimin_config.yaml @@ -0,0 +1,66 @@ +,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult +33f86cab0e57,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +89b5ce6d6d7a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +8c98f03fa96c,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +dd7dae189ccd,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +542a5c095d8e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +f3f3e6bb5179,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +5dd16d0f7161,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +da4482befb05,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +af57034056aa,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +60378e00db57,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +ee83de5b1ed7,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +bac17bf5e28b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +1915944bebcf,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +367de72fd7d1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +baf6df00a0b2,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +5a1425e4371c,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +c95503db821a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +25dcd5fc8b5f,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +4237647ff3e2,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +215cbcfbbe09,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +4f6b2f4fb35b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +fe09fa177a62,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 +aa994a62bfcd,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +76e29f650c23,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 +6ee602b0b379,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +d15a8d88da05,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +468fbdc62bce,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +70003c4ff93a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +88bd1e17b3f5,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +770606c6ac2e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +0f2ee65a529b,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +5504ba84986e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +19ad254eda3e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +92829d64d095,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +a07f83ed3d8d,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +255cc4dcbf03,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +d771390ba1f2,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +50d4e5f04ebc,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +daf430a68d46,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +caa474dcb3ad,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +e594a5a9a0b5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +ed5494e02ba3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +f24b5ab860d5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +70272b387a7a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +eef0cbd9b0b0,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +ef2c82bb15b4,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +4ea098c06991,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +10b73abd8531,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +ec212dfc2b40,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +47d235ed3f77,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +b293e4bb9152,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +4f524281a401,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +001e1bc318a3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +216139882c44,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +9c17a194e128,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +d77a15603099,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +d7a566f04535,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +82a618ec5f28,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +211adebc0707,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +169d61f3e6e1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +bbd851e5ebac,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +326adb6144e3,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +fbb3d9bd637e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +a5b9d0ccda9e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +91b533921e28,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 diff --git a/benchmark/conf/data/x.yaml b/benchmark/conf/data/x.yaml new file mode 100644 index 0000000..59a03ce --- /dev/null +++ b/benchmark/conf/data/x.yaml @@ -0,0 +1 @@ +name: income \ No newline at end of file diff --git a/benchmark/conf/hydra/launcher/configured_submitit_slurm.yaml b/benchmark/conf/hydra/launcher/configured_submitit_slurm.yaml new file mode 100644 index 0000000..e6a024b --- /dev/null +++ b/benchmark/conf/hydra/launcher/configured_submitit_slurm.yaml @@ -0,0 +1,15 @@ +defaults: +# - override hydra/launcher: submitit_slurm + - submitit_slurm + +#hydra: +# launcher: +#mem_gb: 32 # configuration used with slurm launcher +#tasks_per_node: 60 +mem_per_cpu: 16G +cpus_per_task: 4 +#mem_gb: 32 +partition: amd +timeout_min: 1440 +#array_parallelism: 50 + diff --git a/benchmark/conf/task/cifar100_loss.yaml b/benchmark/conf/task/cifar100_loss.yaml new file mode 100644 index 0000000..684da55 --- /dev/null +++ b/benchmark/conf/task/cifar100_loss.yaml @@ -0,0 +1,42 @@ +task: cifar100 +batch_size: 400 + +# TODO: rework to list (constraints: [(name: ...), (name: ...), ...]) +constraint: + name: LossPairwise + bound: 0.1 + loss: CrossEntropyLoss + +algorithms: none + +# pbm_params: +# primal__lr: 0.005 +# dual__penalty_mult: 0.9999 +# dual__penalty_update: dimin #aimd +# dual__penalty_range: [1e-1, 10.] +# dual__pbf: quadratic_logarithmic +# dual__gamma: 0.1 +# dual_delta: 1.0 +# moreau__mu: 2.0 + +# alm_params: +# primal__lr: 0.005 +# dual__lr: 0.001 +# dual__penalty: 0.0 +# dual__momentum: 0. +# moreau__mu: 2.0 + +# ssg_params: +# primal__lr: 0.01 +# dual__lr: 0.001 +# moreau__mu: 0.0 + +# adam_params: +# lr: 0.01 +# # penalty: 0.5 + +hydra: + run: + dir: . + job: + chdir: false diff --git a/benchmark/conf/task/cifar10_acc_pair.yaml b/benchmark/conf/task/cifar10_acc_pair.yaml deleted file mode 100644 index c5e481c..0000000 --- a/benchmark/conf/task/cifar10_acc_pair.yaml +++ /dev/null @@ -1,41 +0,0 @@ -task: cifar10 -batch_size: 120 - -# TODO: rework to list (constraints: [(name: ...), (name: ...), ...]) -constraint: - name: FairretPairwise - bound: 0.1 - statistic: Accuracy - kwargs: - uses_labels: true - -pbm_params: - primal__lr: 0.05 - dual__penalty_mult: 0.1 - dual__penalty_update: dimin_adapt #aimd - dual__penalty_range: [1e-1, 100] - dual__pbf: quadratic_logarithmic - dual__gamma: 0.1 - moreau__mu: 2.0 - -alm_params: - primal__lr: 0.001 - dual__lr: 0.05 - dual__penalty: 0.0 - dual__momentum: 0.0 - moreau__mu: 0.0 - -ssg_params: - primal__lr: 0.01 - dual__lr: 0.001 - moreau__mu: 0.0 - -adam_params: - lr: 0.01 - penalty: 0.5 - -hydra: - run: - dir: . - job: - chdir: false diff --git a/benchmark/conf/task/cifar10_loss.yaml b/benchmark/conf/task/cifar10_loss.yaml index a9fe984..61ff317 100644 --- a/benchmark/conf/task/cifar10_loss.yaml +++ b/benchmark/conf/task/cifar10_loss.yaml @@ -7,31 +7,54 @@ constraint: bound: 0.1 loss: CrossEntropyLoss -pbm_params: - primal__lr: 0.01 - dual__penalty_mult: 0.1 - dual__penalty_update: dimin_adapt #aimd - dual__penalty_range: [1e-1, 100] - dual__pbf: quadratic_logarithmic - dual__gamma: 0.1 - dual_delta: 0.5 - moreau__mu: 2.0 - -alm_params: - primal__lr: 0.001 - dual__lr: 0.05 - dual__penalty: 0.0 - dual__momentum: 0.0 - moreau__mu: 0.0 +# pbm_params: +# primal__lr: 0.005 +# dual__penalty_mult: 0.1 +# dual__penalty_update: dimin_adapt #aimd +# dual__penalty_range: [1e-1, 100.] +# dual__pbf: quadratic_logarithmic +# dual__gamma: 0.5 +# dual_delta: 0.1 +# moreau__mu: 2.0 + +# pbm_params: +# primal__lr: 0.0005 +# dual__penalty_mult: 0.9 +# dual__penalty_update: dimin_adapt #aimd +# dual__penalty_range: [1e-1, 1.] +# dual__pbf: quadratic_logarithmic +# dual__gamma: 0.9 +# dual_delta: 1.0 +# moreau__mu: 2.0 + +# pbm_params: +# primal__lr: 0.001 +# dual__penalty_mult: 0.99 +# dual__penalty_update: const #aimd +# dual__penalty_range: [1e-1, 1.] +# dual__pbf: quadratic_reciprocal +# dual__gamma: 0.9 +# dual_delta: 1.0 +# moreau__mu: 1.0 +# +primal__weight_decay: 0.01 + +# alm_params: +# primal__lr: 0.001 +# dual__lr: 0.001 +# dual__penalty: 0.0 +# moreau__mu: 1.0 +# +primal__weight_decay: 0.01 ssg_params: primal__lr: 0.01 dual__lr: 0.001 - moreau__mu: 0.0 + moreau__mu: 1.0 + +primal__weight_decay: 0.01 -adam_params: - lr: 0.01 - penalty: 0.5 +# adam_params: +# lr: 0.001 +# +primal__weight_decay: 0.01 +# # penalty: 0.5 hydra: run: diff --git a/benchmark/conf/task/dutch_positive_rate_pair.yaml b/benchmark/conf/task/dutch_positive_rate_pair.yaml index 8aaa667..8abdb1a 100644 --- a/benchmark/conf/task/dutch_positive_rate_pair.yaml +++ b/benchmark/conf/task/dutch_positive_rate_pair.yaml @@ -1,5 +1,7 @@ task: equalized_odds_pairwise +seed: 0 + batch_size: 72 # TODO: rework to list (constraints: [(name: ...), (name: ...), ...]) @@ -11,32 +13,32 @@ constraint: uses_labels: false pbm_params: - primal__lr: 0.01 - dual__penalty_mult: 0.1 - dual__penalty_update: dimin_adapt #aimd + primal__lr: 0.005 + primal__weight_decay: 0.01 + dual__penalty_mult: 0.8 + dual__penalty_update: dimin_adapt dual__penalty_range: [1e-1, 1.] - # dual__init_duals: 1e-4 dual__pbf: quadratic_logarithmic - dual__gamma: 0.9 + dual__gamma: 0.5 dual__delta: 1.0 - moreau__mu: 2.0 - + moreau__mu: 1.0 alm_params: - primal__lr: 0.005 - dual__lr: 0.01 + primal__lr: 0.001 + primal__weight_decay: 0.01 + dual__lr: 0.005 dual__penalty: 0.0 - dual__momentum: 0.5 - moreau__mu: 2.0 + moreau__mu: 1.0 ssg_params: - primal__lr: 0.001 - dual__lr: 0.001 - moreau__mu: 2.0 + primal__lr: 0.005 + primal__weight_decay: 0.01 + dual__lr: 0.005 + moreau__mu: 1.0 adam_params: - lr: 0.01 - penalty: 0.5 + lr: 0.0001 + weight_decay: 0.01 hydra: run: diff --git a/benchmark/conf/task/folktables_positive_rate_pair.yaml b/benchmark/conf/task/folktables_positive_rate_pair.yaml index 2ac3d48..9ce8daf 100644 --- a/benchmark/conf/task/folktables_positive_rate_pair.yaml +++ b/benchmark/conf/task/folktables_positive_rate_pair.yaml @@ -1,5 +1,5 @@ task: equalized_odds_pairwise -batch_size: 40 +batch_size: 30 # TODO: rework to list (constraints: [(name: ...), (name: ...), ...]) constraint: @@ -10,30 +10,33 @@ constraint: uses_labels: false pbm_params: - primal__lr: 0.01 - dual__penalty_mult: 0.5 + primal__lr: 0.0005 + primal__weight_decay: 0.01 + dual__penalty_mult: 0.999 dual__penalty_update: dimin_adapt #aimd dual__penalty_range: [1e-1, 1.] dual__pbf: quadratic_logarithmic - dual__gamma: 0.5 - dual__delta: 0.9 - moreau__mu: 2.0 + dual__gamma: 0.9 + dual__delta: 1.0 + moreau__mu: 1.0 + alm_params: - primal__lr: 0.05 - dual__lr: 0.05 + primal__lr: 0.0001 + primal__weight_decay: 0.01 + dual__lr: 0.005 dual__penalty: 0.0 - dual__momentum: 0.1 - moreau__mu: 2.0 + moreau__mu: 1.0 ssg_params: - primal__lr: 0.01 - dual__lr: 0.001 - moreau__mu: 0.0 + primal__lr: 0.001 + primal__weight_decay: 0.01 + dual__lr: 0.0001 + moreau__mu: 1.0 adam_params: - lr: 0.01 - # penalty: 0.5 + primal__lr: 0.0001 + primal__weight_decay: 0.01 hydra: run: diff --git a/benchmark/conf/task/folktables_positive_rate_vec.yaml b/benchmark/conf/task/folktables_positive_rate_vec.yaml index de6ec59..dd20e43 100644 --- a/benchmark/conf/task/folktables_positive_rate_vec.yaml +++ b/benchmark/conf/task/folktables_positive_rate_vec.yaml @@ -8,32 +8,37 @@ constraint: bound: 0.2 loss: NormLoss statistic: PositiveRate - constraint_kwargs: + kwargs: uses_labels: false -pbm_params: - primal__lr: 0.001 - dual__p_mult: 0.9 - dual__penalty_update: dimin_adapt - dual__pbf: quadratic_logarithmic - dual__gamma: 0.1 - moreau__mu: 2.0 - -alm_params: - primal__lr: 0.001 - dual__lr: 0.001 - dual__penalty: 0. - dual__momentum: 0. - moreau__mu: 0.5 - -ssg_params: - primal__lr: 0.05 - dual__lr: 0.01 - moreau__mu: 0.0 - -adam_params: - lr: 0.001 - penalty: 0.5 +# pbm_params: +# primal__lr: 0.001 +# +primal__weight_decay: 0.01 +# dual__penalty_mult: 0.999 +# dual__penalty_update: dimin_adapt #aimd +# dual__penalty_range: [1e-1, 1] +# dual__pbf: quadratic_logarithmic +# dual__gamma: 0.1 +# moreau__mu: 1.0 + + +# alm_params: +# primal__lr: 0.0001 +# +primal__weight_decay: 0.01 +# dual__lr: 0.001 +# dual__penalty: 1.0 +# moreau__mu: 1.0 + +# ssg_params: +# primal__lr: 0.001 +# +primal__weight_decay: 0.01 +# dual__lr: 0.0005 +# moreau__mu: 1.0 + +# adam_params: +# lr: 0.001 +# +primal__weight_decay: 0.01 +# penalty: 0.5 hydra: run: diff --git a/benchmark/conf/task/tinyimage.yaml b/benchmark/conf/task/tinyimage.yaml new file mode 100644 index 0000000..89e5f0b --- /dev/null +++ b/benchmark/conf/task/tinyimage.yaml @@ -0,0 +1,42 @@ +task: tinyimage +batch_size: 400 + +# TODO: rework to list (constraints: [(name: ...), (name: ...), ...]) +constraint: + name: LossPairwise + bound: 0.1 + loss: CrossEntropyLoss + +algorithms: none + +# pbm_params: +# primal__lr: 0.005 +# dual__penalty_mult: 0.9999 +# dual__penalty_update: dimin #aimd +# dual__penalty_range: [1e-1, 10.] +# dual__pbf: quadratic_logarithmic +# dual__gamma: 0.1 +# dual_delta: 1.0 +# moreau__mu: 2.0 + +# alm_params: +# primal__lr: 0.005 +# dual__lr: 0.001 +# dual__penalty: 0.0 +# dual__momentum: 0. +# moreau__mu: 2.0 + +# ssg_params: +# primal__lr: 0.01 +# dual__lr: 0.001 +# moreau__mu: 0.0 + +# adam_params: +# lr: 0.01 +# # penalty: 0.5 + +hydra: + run: + dir: . + job: + chdir: false diff --git a/benchmark/conf/task/weight.yaml b/benchmark/conf/task/weight.yaml index 2860d28..079e0b4 100644 --- a/benchmark/conf/task/weight.yaml +++ b/benchmark/conf/task/weight.yaml @@ -3,12 +3,12 @@ batch_size: 80 pbm_params: - primal__lr: 0.005 + primal__lr: 0.001 dual__penalty_mult: 0.1 dual__penalty_update: dimin_adapt #aimd - dual__penalty_range: [1e-1, 10] + dual__penalty_range: [1e-1, 1] dual__pbf: quadratic_logarithmic - dual__gamma: 0.0 + dual__gamma: 0.95 moreau__mu: 2.0 alm_params: diff --git a/benchmark/constraint_meta.py b/benchmark/constraint_meta.py index 3d3699a..8684c1a 100644 --- a/benchmark/constraint_meta.py +++ b/benchmark/constraint_meta.py @@ -23,7 +23,7 @@ class ConstraintMetadata: class FairretPairwise(ConstraintMetadata): """Wrapper class for a pairwise fairness constraint based on a given statistic (e.g., positive rate, false positive rate, etc.). The constraint is computed as the difference between the statistic for each pair of groups.""" - def __init__(self, statistic: Callable, uses_labels: bool, abs_diff: bool = False, as_logits: bool = False): + def __init__(self, statistic: Callable, uses_labels: bool, abs_diff: bool = False, as_logits: bool = True): """Initializes the FairretPairwise constraint. Args: statistic (Callable): An initialized fairret.statistic object. @@ -41,7 +41,7 @@ def __init__(self, statistic: Callable, uses_labels: bool, abs_diff: bool = Fals self.uses_labels = uses_labels def compute_constraints(self, model, batch_out, batch_sens, batch_labels): - if not self.as_logits: + if self.as_logits: batch_out = torch.sigmoid(batch_out) if self.uses_labels: stat_pergroup = self.statistic(batch_out, batch_sens, batch_labels) @@ -58,7 +58,7 @@ def compute_constraints(self, model, batch_out, batch_sens, batch_labels): class FairretMean(ConstraintMetadata): """Wrapper class for a pairwise fairness constraint based on a given statistic (e.g., positive rate, false positive rate, etc.). The constraint is computed as the difference between the statistic for each pair of groups.""" - def __init__(self, statistic: Callable, uses_labels: bool, as_logits: bool = False): + def __init__(self, statistic: Callable, uses_labels: bool, as_logits: bool = True): """Initializes the FairretPairwise constraint. Args: statistic (Callable): An initialized fairret.statistic object. @@ -73,7 +73,7 @@ def __init__(self, statistic: Callable, uses_labels: bool, as_logits: bool = Fal self.uses_labels = uses_labels def compute_constraints(self, model, batch_out, batch_sens, batch_labels): - if not self.as_logits: + if self.as_logits: batch_out = torch.sigmoid(batch_out) if self.uses_labels: stat_pergroup = self.statistic(batch_out, batch_sens, batch_labels) @@ -91,15 +91,15 @@ def compute_constraints(self, model, batch_out, batch_sens, batch_labels): class FairretAgg(ConstraintMetadata): """Wrapper class for a vector fairness constraint based on a given statistic (e.g., positive rate, false positive rate, etc.). The constraint is computed as the difference between the statistic for each group and the mean statistic across all groups.""" - def __init__(self, loss: Callable, uses_labels: bool, as_logits: bool = False): + def __init__(self, loss: Callable, uses_labels: bool, as_logits: bool = True): super().__init__( fn=self.compute_constraints, m_fn=lambda n_groups: 1 ) self.loss = loss self.as_logits = as_logits - if self.as_logits: - raise ValueError("`as_logits=True`is not supported for the fairret loss constraint, since the loss should already be computed on the logits.") + if not self.as_logits: + raise ValueError("`as_logits=False`is not supported for the fairret loss constraint, since the loss should already be computed on the logits.") self.uses_labels = uses_labels def compute_constraints(self, model, batch_out, batch_sens, batch_labels): @@ -138,7 +138,9 @@ def compute_constraints(self, model, batch_out, batch_sens, batch_labels, loss = loss = self.loss(batch_out, batch_labels) per_group_losses = _get_normalized_per_group_losses(loss, batch_sens).squeeze() - constraints = ((per_group_losses.unsqueeze(1) - per_group_losses.unsqueeze(0))) + # print(per_group_losses) + constraints = ((per_group_losses.unsqueeze(1) - per_group_losses.unsqueeze(0))) + # print(constraints) mask = ~torch.eye(batch_sens.shape[-1], dtype=torch.bool) constraints = constraints[mask] return constraints diff --git a/benchmark/demo_balls.py b/benchmark/demo_balls.py deleted file mode 100644 index 42d196f..0000000 --- a/benchmark/demo_balls.py +++ /dev/null @@ -1,265 +0,0 @@ -from matplotlib.patches import Circle -import torch -from humancompatible.train.optim.PBM import PBM -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid1 import make_axes_locatable - -torch.manual_seed(1) -np.random.seed(1) - -def plot_balls_trajectory(trajectories, names): - """ - trajectory: array-like of shape (N, 2), where each row is [x, y] - """ - - fig, ax = plt.subplots(figsize=(24, 16)) - - # Feasible regions: unit balls - ball_centers = [(-2, 0), (2, 0)] - radius = np.sqrt(0.99) - labels = [r"$\mathbb{E}[g_1(x,y,\xi)] \leq 0 $", r"$\mathbb{E}[g_2(x,y,\xi)] \leq 0$"] - - # Heatmap for x^2 + y^2 - x = np.linspace(-4, 4, 100) - y = np.linspace(-2.5, 2.5, 100) - X, Y = np.meshgrid(x, y) - Z = X**2 + Y**2 - - - for center, label in zip(ball_centers, labels): - ball = Circle( - center, - radius=radius, - facecolor="lightgray", - edgecolor="black", - linewidth=1.5, - alpha=0.6, - zorder=1, - ) - ax.add_patch(ball) - # Label inside the ball - ax.text( - center[0], center[1], - label, - fontsize=18, - fontweight='bold', - color='black', - ha='center', - va='center', - zorder=5 - ) - - for i, traj in enumerate(trajectories): - traj = np.asarray(traj) - - # Trajectory - ax.plot( - traj[:, 0], - traj[:, 1], - linewidth=2.0, - zorder=3, - alpha=1.0 - ) - - # Emphasize x_0 and x_n - x0 = traj[0] - xn = traj[-1] - - ax.scatter( - x0[0], x0[1], - s=80, - marker="o", - facecolor="white", - edgecolor="black", - linewidth=2, - zorder=4, - ) - ax.scatter( - xn[0], xn[1], - s=60, - marker="s", - facecolor="black", - edgecolor="black", - zorder=4, - ) - x_n = [ - r"$x_{\rho=0}^n$", - r"$x_{\rho=1}^n$", - r"$x_{\rho=2.5}^n$", - r"$x_{SPBM}^n$", - ] - # Labels for x_0 and x_n - ax.annotate( - r"$x^0$", - xy=(x0[0], x0[1]), - xytext=(6, 8), - textcoords="offset points", - fontsize=22, - zorder=5, - ) - ax.annotate( - x_n[i], - xy=(xn[0], xn[1]), - # xytext=(8 if i==1 or i == 3 else -36, -12), - xytext=(8 if i==1 or i == 3 else -45, -15), - textcoords="offset points", - fontsize=22, - zorder=5, - ) - - # Formatting - ax.set_aspect("equal", adjustable="box") - ax.set_xlabel(r"$x$", fontsize=12) - ax.set_ylabel(r"$y$", fontsize=12) - ax.grid(True, linestyle=":", linewidth=0.8, alpha=0.7) - ax.set_xlim(-3.2, 3.2) - ax.set_ylim(-1.8, 1.8) - - - contour = ax.contourf(X, Y, Z, levels=100, cmap='viridis', alpha=0.5, zorder=0) - divider = make_axes_locatable(ax) - cax = divider.append_axes("right", size="3%", pad=0.08) - - cbar = fig.colorbar(contour, cax=cax) - cbar.set_label(r"$x^2 + y^2$", fontsize=14) - - fig.savefig( - "./demo_balls_pbm.pdf", - bbox_inches="tight", - pad_inches=0.05 - ) - - - -def balls(x, sample): - g1 = ((x[0] - 2 + sample)**2 + x[1]**2 - 1) - g2 = ((x[0] + 2 + sample)**2 + x[1]**2 - 1) - # g1 = ((x[0] - 2)**2 + x[1]**2 - 1) + sample - # g2 = ((x[0] + 2)**2 + x[1]**2 - 1) + sample - if g1 <= g2: - return g1 - else: - return g2 - -def parabola(x): - return x[0]**2 + x[1]**2 - - -samples = [ - # torch.tensor([0]), - # torch.tensor([0]) - torch.tensor([-0.1]), - torch.tensor([0.1]) -] - - -################## SGD ######################### - -def run_sgd(rho: float): - - xy = torch.nn.Parameter(data=torch.ones(2, requires_grad=True)) - with torch.no_grad(): - xy[0] = 0 - xy[1] = 1 - - sgd = torch.optim.SGD([xy], lr=0.05, dampening=0.1) - - scheduler = torch.optim.lr_scheduler.LambdaLR( - sgd, - lr_lambda=lambda step: 0.99 ** step - ) - - param_log_sgd = [] - con_log_sgd = [] - - for i in range(200): - param_log_sgd.append( - xy.detach().numpy().copy() - ) - - r = np.random.uniform() - minibatch = samples[0 if r > 0.5 else 1] - - c = balls(xy, minibatch) - - obj = parabola(xy) + rho * torch.square(torch.norm(c, p=2)) - - obj.backward() - sgd.step() - scheduler.step() - sgd.zero_grad() - for gr in sgd.param_groups: - gr['lr'] *= 0.97 - - con_log_sgd.append(c.detach().numpy().copy().item()) - - return param_log_sgd, con_log_sgd - - -sgd_param_logs, sgd_con_logs = [], [] - -rhos = [0.1,1,2] - -for rho in rhos: - param_log_sgd, con_log_sgd = run_sgd(rho) - sgd_param_logs.append(param_log_sgd) - sgd_con_logs.append(con_log_sgd) - - -################## PBM ######################### - -xy = torch.nn.Parameter(data=torch.ones(2, requires_grad=True)) -with torch.no_grad(): - xy[0] = 0 - xy[1] = 1 - -pbm = PBM([xy], m=1, lr=0.01, dual_bounds=(1e-3, 1e3), penalty_update_m='CONST', epoch_len=2, mu=0, opt_method="Adam") - -iters = 200 - -param_log = [] -con_log = [] -dual_log = [] -c_grad_log = [] - -for i in range(iters): - param_log.append( - xy.detach().numpy().copy() - ) - # print(xy) - - r = np.random.uniform() - minibatch = samples[ - 0 if r > 0.5 else 1 - ] - - c = balls(xy, minibatch) - - pbm.dual_step(0, c) - dual_log.append(pbm._dual_vars.detach().numpy().copy().item()) - - obj = parabola(xy) - - pbm.step(obj) - for gr in pbm.param_groups: - gr['lr'] *= 0.99 - - con_log.append(c.detach().numpy().copy().item()) - - -# print(param_log) -# print(con_log) - -trajectories = sgd_param_logs -trajectories.append(param_log) - -plot_balls_trajectory( - trajectories, - [r"$\rho= $" + str(rho) for rho in rhos] + ['spbm'] -) - -# print(param_log) -# print(np.array(dual_log)) -# print(np.array(con_log)) -# print(np.array(con_log)) \ No newline at end of file diff --git a/benchmark/dutch_cifar10/pbm_adapt_config.yaml b/benchmark/dutch_cifar10/pbm_adapt_config.yaml new file mode 100644 index 0000000..e5cdbf5 --- /dev/null +++ b/benchmark/dutch_cifar10/pbm_adapt_config.yaml @@ -0,0 +1,241 @@ +,algorithm,primal__lr,dual_penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu +1939d0d0,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +f596628e,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +f5e2b60e,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +3963b135,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +c0d8d373,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +8e25289f,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +1f0efedc,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +2ee5643c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +09966201,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +8f0015d4,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +502d63b6,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +7706dd50,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +b8744781,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +0bd76ed9,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +cfc1a1a0,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +4ca90b82,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +ef8fd315,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +765765fc,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +e12e0f81,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +7657d8d8,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +3cbd2ee6,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +22f07a4c,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +e92df81c,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +b22ff058,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +8052c7ac,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +9a6f1866,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +d1013bcf,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +c5e16fb3,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +1408cbf8,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +a7e90ddd,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +76a4304b,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +6f0c87d0,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +5e6a09e5,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +07493314,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +91b33a17,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +7099b4f4,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +0a3bac31,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +0bf36ff7,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +9901c26f,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +931e4299,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +4f62168a,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +55ffba5f,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +38b46727,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +a7b65e32,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +a0b14bd1,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +86c8e8f3,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +f7d3a60c,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +f8c9637d,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +efc32755,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +aacd8398,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +964cc284,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +dca6fdde,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +5223edf2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +1a61dc34,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +4f89a248,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +e393cbed,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +ecef3a00,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +0e0da02a,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +23a57e34,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +52bba476,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +451e31d0,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +b3e89f73,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +1e1cc2eb,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +b2138db2,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +b02ac3ef,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +667a7f50,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +712532d6,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +7eb9227e,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +c749cef2,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +c22b6836,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +a4e5877a,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +39c627b6,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +cae4df7d,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +42a77620,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +8d5a0c54,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +389ca72b,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +90e46eea,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +a72a36c5,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +4515b686,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +5298ab47,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +e9127df8,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +1b7b433b,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +c22458d5,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +e8322e81,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +891879e7,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +d62fb127,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +617a1969,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +b7857a23,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +1afb9541,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +cdd1e561,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +da47f1dd,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +ba274a55,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +0e5dc653,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +ee2c9b1a,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +9c9029d6,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +3583e68b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +e78ef8d4,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +716133f0,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +06b31eb2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +897ca06c,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +18f9cee1,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +da1b3c6a,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +2899f933,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +cc7b70a5,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +d0e29c58,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +c4fcd59f,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +62639632,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +c52f053c,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +a9f6a045,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +584f64b0,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +a8da0682,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +5f27203d,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +6a4334d2,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +cfeaeb53,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +6f1a514c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +53cdf3a2,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +1fb5ad24,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +28406004,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +ec1b5d6d,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +bf93244f,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +6db3a1d5,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +ba5256a5,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +fc3e315b,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +b8e1fbec,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +b6109144,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +ab16aa38,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +b69a3f0d,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +9d9186ea,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +f78c23cb,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +4244be22,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +a9c3121d,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +1e327c5b,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +96c010df,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +ba4453c2,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +980303e8,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +8d20dc9d,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +7b9a9149,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +941dfa2d,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +b9f529cd,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +bff1c9aa,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +ff9a8046,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +ba1a19fe,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +ece78b87,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +e3b1577b,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +b891d7e9,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +99b2620b,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +7ca1bb04,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +3afec6bb,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +500d2b1b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +81cde4b1,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +6689d9d9,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +b8ee3ce3,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +3eaaa559,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +9ec720d3,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +120de484,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +3000d330,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +cb0f7d98,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +a8d08839,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +d073a2fe,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +ac5546d1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +7e3dc393,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +e4df822b,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +afe8f39f,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +6c0e111d,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +a36b06bb,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +61babd7a,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +9498932e,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +9e6c964e,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +15999499,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +ed753c3d,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +d1038859,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +18b259a8,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +2c79a3e5,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +00911656,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +8698af07,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +cecee675,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +92425387,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 +be6e04cc,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +c2d8119a,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +242c0791,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +5df67a35,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +1eb8a2ed,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +1582f44b,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +c3496ba1,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +fba02db1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 +4fb6eacb,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +b119f84a,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +61e03d7e,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +da7c507a,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +4f64a795,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +360b8b34,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +39677ecb,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +30b307b1,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +38c72a41,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 +13e4a4fa,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +bbd5d752,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +81e5e893,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +1ed62dd1,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +298e7286,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +fde99065,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 +85794c11,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +5decd08b,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +c8b07e1d,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +b4f009ad,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +f8673eaa,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +a149258e,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +d6577c38,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +262f58fa,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +b1b47cb0,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +f52016ad,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 +9839e7fc,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +22b98980,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +8f8e8714,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +e9ef7f84,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +fc79e06d,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +8b3ded22,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +7f4ca63a,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +93e274d5,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 +45ede71b,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 +9b8432b3,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 +63fdd427,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 +412b5708,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +c782df54,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 +9781862e,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +0b391f37,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 +566c01fa,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +407f2cd4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +83d90b35,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +a599ba73,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 +477bc467,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 +f41c72f6,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +9e4f73ee,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 +483bbbbc,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 +13a65243,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +fc795759,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 +edbfa24f,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 +9d7d041f,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 +b9d80d09,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 +4a072978,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 +5cf9d8e3,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 diff --git a/benchmark/dutch_cifar10/pbm_dimin_config.yaml b/benchmark/dutch_cifar10/pbm_dimin_config.yaml new file mode 100644 index 0000000..2ebc98a --- /dev/null +++ b/benchmark/dutch_cifar10/pbm_dimin_config.yaml @@ -0,0 +1,326 @@ +,algorithm,primal__lr,dual_penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu +82817d6b,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +5b3ca681,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +06e21ef2,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +f0705958,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +bf0b84d8,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +6a03c4e2,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +18392377,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +ba76ac2f,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +ed2e80d8,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +a48c3aa7,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +14154af8,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +e398f5ee,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0.1 +4824b1b3,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +9038fce2,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +9f9dc643,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +e7b9066e,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +ca0e357c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +faa0f027,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +af6dfb12,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +0b8e5134,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +169a2a3a,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +607bc2c0,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +3fb16663,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +acad47e9,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +fa46c18c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +a0301919,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +3c2f8f32,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +19ed5a31,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +45572647,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +b48ee2b5,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +ce1ca314,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,2.0 +7065c95d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +4869bd42,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +b5b38e92,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +8a3b4bf9,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +20add89e,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +a3d20128,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +b1c37cdc,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +d64ec5d3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +6fd312df,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +f851f103,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +57e973be,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +e1c61153,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +73e684a8,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,1.0 +889f7dde,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +3efdb5e4,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +c3ac7ba2,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +46c3e884,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +0f2af858,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +ea168269,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +7eae0db6,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +19e6d0a5,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +3b3506d0,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +3fd3ea94,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +f287fd9b,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +2b62adaa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +3abca38a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +1e1797c8,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +edebf933,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +98c2f8c2,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +fdb941ea,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +0e63af8d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +3687be50,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +e96487ad,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +370576db,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +9461418d,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +6b6b0317,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +54d76a73,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +ddc0f892,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +2e917ebb,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +f333ba22,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +14bb0bc6,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +5dd0db45,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +e0330170,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +9b4daa70,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +d5b75b65,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +a5aaba50,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +16ba70ee,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +3e436265,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +0c3f61d5,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +b8bc00fb,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +d69b749c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +c75cd148,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +72be9778,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +89d684bc,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +cb5b2b52,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +fc2bc3bb,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +e03398a2,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +40bd7779,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +9e4362da,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +8d8e608a,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +fdb84094,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +c1a597bd,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0 +624be33c,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +a3db4351,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +0d3f6c28,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +855ec898,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +8a0b633e,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +38b5830a,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +3ccf8e55,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +fdb913dd,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +b475ac20,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +15f32408,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +64be9e02,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +6de0c47f,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +bb8a77af,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +36448ef8,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +1449a077,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +0ba19590,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +bcf7e71c,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +b4f80b28,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +13280627,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +25d228eb,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +dd1b93c5,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +7e436f8a,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +324cbfb9,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +32932ce5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +3462334c,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +135e9dab,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +0c63fc1c,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +d8cdf0d3,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +4e1488f5,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 +11a8696b,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +10719b39,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +8228cd81,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +0250c55d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +368b33b6,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +bc2edf56,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +89272e8c,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +a255debe,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +0800ddab,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +e21dbabc,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +94bd21b1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +7722b98e,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +46d3327d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +71c70895,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +200c6eed,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +6f21bbda,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +cb9d7ad0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +f756f501,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +70ec5ee8,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +4d211aa5,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +7f68bab1,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +beb3596f,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +88816ce4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +491befdf,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +74b8cdd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +ed0caa13,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +f1c79150,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +653ac4e7,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +d0ca8a35,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +dd4b8935,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +2fa4a18a,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +6a47634d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +fe21f25d,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +b8c81c1a,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +4b673f5e,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +0884fa28,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +21f4f2b0,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +da6992cb,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +179c02ae,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +20797283,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +4102a36c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +97411649,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +6b7b3146,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +f71fe8c5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +c287c41e,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +f9904ae0,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +d94561d1,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +fbfaaa3d,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +293a2367,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +d762c188,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +adde6ef3,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +b1c91296,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +233c3714,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +125c64d0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +9832f4b8,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +c4aab02f,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +fc8e2656,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +8fe79504,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +fb7e4884,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +6caccd49,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +b56d7545,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 +95592499,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +ac096871,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +218116c0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +b39b977c,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +aaaa8cff,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +a11b51dc,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +de658dc6,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +e9961a84,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +3c172fdd,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +aa9f53dc,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +55dcac6e,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +c648c195,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +01e79092,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +0ee5e8fa,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +6a9b7d53,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +904eea7e,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +2667cee4,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +10afc92f,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +519fc23b,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +111302e0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +d3828877,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +402c5e53,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +ba3d948c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +a69d4905,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +8f71c416,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +fc786671,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +eebcc229,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +4293165c,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +ec75533e,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +c6a90b0a,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +6a7c0e38,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +cab86a42,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +4c575b5a,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +34e2328f,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +ccfcb6de,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +cddec2d9,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +97c6b7f2,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +4766af48,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +54056ced,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +81470845,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +336f93bf,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +61ab3ad4,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +82fa31e3,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +fff6d2c1,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +c385eba3,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +70430a24,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +e0d9d104,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +c7fbf993,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +4d251599,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +8c35df3a,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +3bfdb40c,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +040d0348,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +b1ed3fed,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +a99d0745,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +5f575060,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +6a0fdd18,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +2ce1450c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +d6ce6186,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +934b2640,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +91890c35,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +10dd97f1,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +ab1d5425,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +7189f63c,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +72b701b2,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +54ae1ff5,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +c119c79d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +40b6422e,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +e637e178,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +5ae4eb2e,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +1cc0dfab,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +6791490c,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +0b3ceeee,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +3d6cd9ca,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +8d2abf9e,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +29e9ff1a,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +f288701b,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +a150853a,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +5feff0ea,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +e11bceae,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0.5 +783474f2,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +ca4cd6de,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +37806fa4,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +e99657ca,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +22544125,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +e3e59acf,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +376fc38c,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +3464a2eb,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +8e4e9cbc,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +cd8c07fc,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +f6d18eb0,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +1c7b672e,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +f82e154d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +8dd962c4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +88ad06ac,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +46646db7,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +18d3bbe0,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 +503836ca,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +8ce79fa5,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +f677c700,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +04f490ea,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +a4e16e00,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +8f7319ee,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +109ff18b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +17140b87,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +66332b52,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +e5ec895d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +4f6d2b15,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +2eec358e,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +db4cbc82,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +c549303e,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +0d9b7e97,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +3e1b21ce,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +1cbd61d3,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +2f43d516,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +ac6f09c7,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +9dfe0a70,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +cf459dfc,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +aa016d20,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +428a9fb1,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +be188337,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +c70b6d71,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +e356573a,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +8afc6c03,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +b2676c1b,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +72a4be4d,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +281b4a74,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +aee2ac81,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +222d9d3c,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +bf08f4ba,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +ef1fbb14,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +cdfa58f2,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +3bcc9755,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +8358f760,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +6f9df33e,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +bb6c79de,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +39f1edd7,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +ee2dc57f,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +a3145abb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +5ff5fdec,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +8349a90a,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +3007200c,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +c874ba03,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 diff --git a/benchmark/equalized_odds_pairwise_dutch/adam_config.yaml b/benchmark/equalized_odds_pairwise_dutch/adam_config.yaml new file mode 100644 index 0000000..ec1cbaa --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/adam_config.yaml @@ -0,0 +1,5 @@ +,algorithm,primal__lr,primal__weight_decay +320c69024dbe,adam,0.0005,0.01 +7c3fe4eff95d,adam,0.0001,0.01 +28191679ac49,adam,0.005,0.01 +cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml b/benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml new file mode 100644 index 0000000..7528ebe --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml @@ -0,0 +1,76 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +ae1f543f9f8b,alm_max,0.001,0.002,1.0,1.0,0.01 +a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 +ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 +e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 +2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 +f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 +b9ea0c071737,alm_max,0.002,0.002,1.0,1.0,0.01 +a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 +e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 +77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 +f24ef0214d90,alm_max,0.0001,0.002,1.0,1.0,0.01 +8df8dd2f3cfc,alm_max,0.0005,0.002,2.0,1.0,0.01 +7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 +1dc3ca37b989,alm_max,0.0005,0.002,0.0,1.0,0.01 +8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 +7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 +72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 +a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 +58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 +934004fb2498,alm_max,0.0001,0.002,2.0,1.0,0.01 +c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 +cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 +6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 +a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 +3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 +44d7d36e411e,alm_max,0.0005,0.002,1.0,1.0,0.01 +c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 +30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 +f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 +b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 +d310040b890f,alm_max,0.002,0.001,0.0,1.0,0.01 +295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 +a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 +2e8c67ef953b,alm_max,0.001,0.002,2.0,1.0,0.01 +199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 +f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 +d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 +cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 +ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 +16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 +36e233f0a98b,alm_max,0.001,0.002,0.0,1.0,0.01 +e6546be05ab0,alm_max,0.005,0.002,2.0,1.0,0.01 +a27958b6f9f2,alm_max,0.0001,0.002,0.0,1.0,0.01 +9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 +f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 +4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 +81ece7ef23c6,alm_max,0.002,0.0005,1.0,1.0,0.01 +0eaf19039256,alm_max,0.002,0.005,0.0,1.0,0.01 +27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 +4a0cb304fe9c,alm_max,0.002,0.0001,1.0,1.0,0.01 +8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 +d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 +a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 +dc16bc324021,alm_max,0.002,0.002,2.0,1.0,0.01 +3b817f73f60b,alm_max,0.005,0.002,1.0,1.0,0.01 +d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 +90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 +69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 +06b8db61a8e6,alm_max,0.002,0.001,2.0,1.0,0.01 +f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 +ff2474672e82,alm_max,0.002,0.0005,0.0,1.0,0.01 +446799210d39,alm_max,0.002,0.001,1.0,1.0,0.01 +93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 +65a4b39a2a78,alm_max,0.002,0.0001,2.0,1.0,0.01 +72d30a3226a1,alm_max,0.002,0.005,1.0,1.0,0.01 +ee4295850776,alm_max,0.002,0.005,2.0,1.0,0.01 +923b7ed4eddf,alm_max,0.005,0.002,0.0,1.0,0.01 +bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 +a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 +5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 +6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 +6e9dbf3d08d4,alm_max,0.002,0.0005,2.0,1.0,0.01 +a44b5e13d05e,alm_max,0.002,0.002,0.0,1.0,0.01 +d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 +e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml b/benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml new file mode 100644 index 0000000..dd18915 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml @@ -0,0 +1,49 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 +cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 +566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 +7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 +cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 +572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 +ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 +5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 +f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 +ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 +f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 +36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 +dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 +cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 +a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 +18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 +3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 +d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 +5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 +43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 +cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 +d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 +ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 +17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 +9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 +7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 +79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 +0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 +80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 +933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 +ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 +7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 +39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 +38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 +4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 +93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 +d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 +5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 +c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 +cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 +927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 +d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 +f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 +4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 +bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 +776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 +76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 +5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_dutch/multirun.yaml b/benchmark/equalized_odds_pairwise_dutch/multirun.yaml new file mode 100644 index 0000000..8e18a40 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/multirun.yaml @@ -0,0 +1,216 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: amdfast + qos: null + comment: null + constraint: null + exclude: null + gres: null + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 16G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 100 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=alm_slack + - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.0001,0.0005,0.001,0.005 + - algorithm.dual__penalty=0.,1.,2. + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=dutch_positive_rate_pair + - data=dutch + job: + name: run_single_experiment + chdir: false + override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0001,0.0005,0.001,0.005,algorithm.dual__penalty=0.,1.,2.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=alm_slack,data=dutch,seed=0,1,2,task=dutch_positive_rate_pair + id: ??? + num: ??? + config_name: experiment + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: alm_slack + data: dutch + task: dutch_positive_rate_pair + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amd + hydra/output: default + verbose: false +task: + task: equalized_odds_pairwise + batch_size: 72 + constraint: + name: FairretPairwise + bound: 0.1 + statistic: PositiveRate + kwargs: + uses_labels: false +data: + name: dutch + kwargs: + sens_attrs: + - AGE + - SEX + extend_groups: false +algorithm: + algorithm: alm_slack + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__penalty: 0., 1., 2. + moreau__mu: 1.0 + primal__weight_decay: 0.01 +n_epochs: 10 +seed: 0 diff --git a/benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml b/benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml new file mode 100644 index 0000000..9b0abf1 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml @@ -0,0 +1,121 @@ +,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult +be22673a4486,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +e68f152b3331,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +54782fa0b5be,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +7929ffa54302,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +5454fa0b8dfe,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +787248ddc490,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +34aaea793403,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +40a4f7489252,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +ce18010adc70,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +cb027db34245,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +036fddf6b004,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +56109b6b2c6d,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +6262fba9720e,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +eebb07ce6841,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +8f579ef22b71,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +a259b37ddeda,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +a98bbe9fe4c4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +641bf5324616,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +4b1cc8ace568,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +3b80a4d05983,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +8e93af2b6e10,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +ae23b284968c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +22fe22c8d318,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +45937e86c6d4,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +61275eea06ec,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +701efae4fb2d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +a53875bd2360,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +714d3c06c0cd,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +a2e6fb502c81,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +9a86344143c1,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +a5d64f3884d6,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +c1703366481e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +956bc43e4dbc,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +5a72c3d47280,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +370b7e556bd2,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +17324bd6bf5f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +765205ddc668,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +11ad72fe9245,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +359d8f81b334,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +a7c22ee50994,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +f0182669cf79,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +d78182d64690,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +d8236456c992,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +6dfee9171ed6,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +23ae18d8aa4c,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +5a7fd986583c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +88499dcda38b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +5ddd9bca044f,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +b8aab754f18a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +feba85d80f18,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +2de391a3c15a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +8fbd1e9d1d22,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +09a26f048887,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +abffec495d1d,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +d7daabcecba7,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +6fb0f9b45bf2,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +9840de24187c,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +68ca6ca4e4ca,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +6c301438dddc,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +78d878c0791f,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +05ba3627ccb3,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +72730f6d2b3b,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +ca4dbdd3121e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +297de22117f8,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +5e92ae0310f8,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +7588d622a66e,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 +4f69717a956c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +4ddc9fc8f90b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +2ef950c7e893,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +803c34c411f7,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +86aa35732504,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +2cb0d01a4caf,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +5e352d823d03,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +3a2c5d68f9c9,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +e277a7ffc241,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +4d0366836a1e,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +b82eef34fbb4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +e62105ff5d13,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +a0d22d602bbc,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +8d8c71b368a0,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +e0433040efe7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +cf58ba368994,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +574a9166bd29,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +be62778a9ca9,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +254327f25d9c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 +eb3d60b97504,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +0b015280585a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +1132d01718da,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 +a03c1afbf6b0,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +c1fe769cd2f3,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +db82422300c8,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +5787d71dba2b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +ae2b5242bc9f,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 +693cc15909e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 +114fcb802009,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +2eef423358c7,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +2fe8b30d8c7b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +d33e4820759d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +26287d2c1840,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +75ca213ffdee,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 +51a224528840,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 +82f85c3d620c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +d7714e56603a,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +5cd4332fca7f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +9b18daf6739a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 +2dee840e47b2,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +324c1c7c5122,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 +bfef4e1d0b38,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +ba1412aa3f3e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 +4d3b0f64b188,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +66a27189f839,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 +e0309aeff930,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +8efd6c89829d,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 +483f821172e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 +bb689b61126b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 +d312728bea17,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 +9f730d2f9c51,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 +d2e20d508ec9,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +14751917cef7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +8e44e3c80150,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 diff --git a/benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml b/benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml new file mode 100644 index 0000000..9b21c69 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml @@ -0,0 +1,101 @@ +,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult +33f86cab0e57,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +89b5ce6d6d7a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +8c98f03fa96c,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +dd7dae189ccd,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +542a5c095d8e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +f3f3e6bb5179,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +5dd16d0f7161,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +da4482befb05,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +af57034056aa,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +60378e00db57,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +ee83de5b1ed7,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +bac17bf5e28b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +fc50981feabc,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +7ba4cbc78107,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +1915944bebcf,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +367de72fd7d1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +baf6df00a0b2,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +c5d93a6fa6e4,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +5a1425e4371c,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +efecd670f32b,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +c95503db821a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +25dcd5fc8b5f,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +be939fca71e3,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +32af5e074d74,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +4237647ff3e2,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +59607d05e5ea,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +215cbcfbbe09,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +04d5d483fc6b,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +f3580c261ce9,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +4f6b2f4fb35b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +fe09fa177a62,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 +aa994a62bfcd,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +76e29f650c23,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 +6ee602b0b379,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +7a65ac59b3c3,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +fa57d7e8ed82,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +d15a8d88da05,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +461397679f3b,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +468fbdc62bce,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +70003c4ff93a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +88bd1e17b3f5,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +770606c6ac2e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +47881a0cc7f1,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +ebaeca59c599,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 +0627bef4d484,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +0f2ee65a529b,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +5504ba84986e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +19ad254eda3e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +92829d64d095,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +a07f83ed3d8d,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +8bae17f0799a,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +255cc4dcbf03,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +d771390ba1f2,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +863da6837fa5,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +50d4e5f04ebc,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +daf430a68d46,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +caa474dcb3ad,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +b0e478ee1afe,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +e594a5a9a0b5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +ed5494e02ba3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +f24b5ab860d5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +fbb3d9bd637e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +c21768bd6d1f,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 +94397d6a9af3,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +2b3d4834213d,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +0595227ef45f,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +70272b387a7a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +a043d1d880b5,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 +eef0cbd9b0b0,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 +ef2c82bb15b4,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +4ea098c06991,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +10b73abd8531,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +ec212dfc2b40,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +47d235ed3f77,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +b293e4bb9152,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 +629d03e3a696,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +4f524281a401,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +001e1bc318a3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +1e8e69c912c2,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 +216139882c44,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +9c17a194e128,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 +d77a15603099,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 +786e26228362,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +d7a566f04535,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +66d4007073a3,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +cbc4ca574388,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 +33b1681d1b40,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 +82a618ec5f28,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 +7b566755aa31,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 +211adebc0707,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 +dcf6db94bef7,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +169d61f3e6e1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 +bbd851e5ebac,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 +326adb6144e3,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 +c2382d20111e,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 +a0e3d4d3a900,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 +bc5d16c3196f,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 +a5b9d0ccda9e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 +be6d8b2c32d9,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 +91b533921e28,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 diff --git a/benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml b/benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml new file mode 100644 index 0000000..0ca60c6 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml @@ -0,0 +1,17 @@ +,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay +dd977b38b115,ssg,0.0001,0.0001,1.0,0.01 +a779bc91982f,ssg,0.0001,0.005,1.0,0.01 +5b53d46e1f43,ssg,0.005,0.0001,1.0,0.01 +c6e8d69207c9,ssg,0.001,0.0005,1.0,0.01 +1f09bf71a728,ssg,0.0005,0.0005,1.0,0.01 +ba47d5d07a71,ssg,0.0001,0.0005,1.0,0.01 +c3c60b74a2f6,ssg,0.001,0.005,1.0,0.01 +6489a3166ee5,ssg,0.0005,0.005,1.0,0.01 +08af6b79a6f6,ssg,0.005,0.0005,1.0,0.01 +b4f96a7ac4de,ssg,0.005,0.001,1.0,0.01 +1e782e2ac50a,ssg,0.001,0.0001,1.0,0.01 +ac60b4c7b56b,ssg,0.001,0.001,1.0,0.01 +c51877d903c0,ssg,0.0005,0.001,1.0,0.01 +04d4e9b32fe3,ssg,0.0001,0.001,1.0,0.01 +3e8cfc283731,ssg,0.005,0.005,1.0,0.01 +3d88cf139676,ssg,0.0005,0.0001,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/adam_config.yaml b/benchmark/equalized_odds_pairwise_folktables/adam_config.yaml new file mode 100644 index 0000000..ec1cbaa --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/adam_config.yaml @@ -0,0 +1,5 @@ +,algorithm,primal__lr,primal__weight_decay +320c69024dbe,adam,0.0005,0.01 +7c3fe4eff95d,adam,0.0001,0.01 +28191679ac49,adam,0.005,0.01 +cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml b/benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml new file mode 100644 index 0000000..7528ebe --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml @@ -0,0 +1,76 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +ae1f543f9f8b,alm_max,0.001,0.002,1.0,1.0,0.01 +a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 +ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 +e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 +2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 +f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 +b9ea0c071737,alm_max,0.002,0.002,1.0,1.0,0.01 +a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 +e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 +77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 +f24ef0214d90,alm_max,0.0001,0.002,1.0,1.0,0.01 +8df8dd2f3cfc,alm_max,0.0005,0.002,2.0,1.0,0.01 +7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 +1dc3ca37b989,alm_max,0.0005,0.002,0.0,1.0,0.01 +8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 +7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 +72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 +a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 +58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 +934004fb2498,alm_max,0.0001,0.002,2.0,1.0,0.01 +c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 +cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 +6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 +a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 +3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 +44d7d36e411e,alm_max,0.0005,0.002,1.0,1.0,0.01 +c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 +30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 +f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 +b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 +d310040b890f,alm_max,0.002,0.001,0.0,1.0,0.01 +295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 +a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 +2e8c67ef953b,alm_max,0.001,0.002,2.0,1.0,0.01 +199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 +f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 +d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 +cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 +ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 +16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 +36e233f0a98b,alm_max,0.001,0.002,0.0,1.0,0.01 +e6546be05ab0,alm_max,0.005,0.002,2.0,1.0,0.01 +a27958b6f9f2,alm_max,0.0001,0.002,0.0,1.0,0.01 +9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 +f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 +4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 +81ece7ef23c6,alm_max,0.002,0.0005,1.0,1.0,0.01 +0eaf19039256,alm_max,0.002,0.005,0.0,1.0,0.01 +27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 +4a0cb304fe9c,alm_max,0.002,0.0001,1.0,1.0,0.01 +8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 +d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 +a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 +dc16bc324021,alm_max,0.002,0.002,2.0,1.0,0.01 +3b817f73f60b,alm_max,0.005,0.002,1.0,1.0,0.01 +d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 +90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 +69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 +06b8db61a8e6,alm_max,0.002,0.001,2.0,1.0,0.01 +f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 +ff2474672e82,alm_max,0.002,0.0005,0.0,1.0,0.01 +446799210d39,alm_max,0.002,0.001,1.0,1.0,0.01 +93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 +65a4b39a2a78,alm_max,0.002,0.0001,2.0,1.0,0.01 +72d30a3226a1,alm_max,0.002,0.005,1.0,1.0,0.01 +ee4295850776,alm_max,0.002,0.005,2.0,1.0,0.01 +923b7ed4eddf,alm_max,0.005,0.002,0.0,1.0,0.01 +bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 +a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 +5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 +6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 +6e9dbf3d08d4,alm_max,0.002,0.0005,2.0,1.0,0.01 +a44b5e13d05e,alm_max,0.002,0.002,0.0,1.0,0.01 +d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 +e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml b/benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml new file mode 100644 index 0000000..dd18915 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml @@ -0,0 +1,49 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 +cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 +566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 +7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 +cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 +572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 +ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 +5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 +f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 +ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 +f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 +36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 +dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 +cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 +a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 +18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 +3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 +d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 +5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 +43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 +cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 +d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 +ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 +17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 +9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 +7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 +79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 +0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 +80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 +933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 +ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 +7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 +39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 +38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 +4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 +93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 +d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 +5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 +c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 +cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 +927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 +d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 +f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 +4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 +bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 +776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 +76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 +5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/multirun.yaml b/benchmark/equalized_odds_pairwise_folktables/multirun.yaml new file mode 100644 index 0000000..fed41ce --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/multirun.yaml @@ -0,0 +1,221 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: amdfast + qos: null + comment: null + constraint: null + exclude: null + gres: null + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 16G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 99 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=ssg + - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.0001,0.0005,0.001,0.005 + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=folktables_positive_rate_pair + - data=income + job: + name: run_single_experiment + chdir: false + override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0001,0.0005,0.001,0.005,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=ssg,data=income,seed=0,1,2,task=folktables_positive_rate_pair + id: ??? + num: ??? + config_name: experiment + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: ssg + data: income + task: folktables_positive_rate_pair + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amd + hydra/output: default + verbose: false +task: + task: equalized_odds_pairwise + batch_size: 30 + constraint: + name: FairretPairwise + bound: 0.1 + statistic: PositiveRate + kwargs: + uses_labels: false + hydra: + run: + dir: . + job: + chdir: false +data: + name: folktables + kwargs: + sens_attrs: + - MAR + - SEX + states: + - VA + extend_groups: false +algorithm: + algorithm: ssg + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__lr: 0.0001, 0.0005, 0.001, 0.005 + moreau__mu: 1.0 + primal__weight_decay: 0.01 +n_epochs: 10 +seed: 0 diff --git a/benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml b/benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml new file mode 100644 index 0000000..72854d4 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml @@ -0,0 +1,141 @@ +,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay +c41d8b309d26,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +60f56507cd4c,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +7e39e94b50e9,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +bf9565806564,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +071ddb5683d4,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +d51eebe8db16,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +f9ac41dbf17d,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +50067bcc14fa,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +9a67b1f6536f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +020c17ed39bd,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +a589aa3dbad2,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +566d25376894,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +672a1c9d3dad,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +f390868f6fb3,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +e7e824168456,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +1b5b2a0c3c36,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +4b5d07301352,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +ea4fca5c8ff4,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d2e0b5fa5fd8,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +b0beadc8529a,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +f874057d5c35,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +75199ec9ed8f,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +340c81f29a29,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +d832cd6b5982,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +20816284bbf7,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +67b73c0400c1,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6d455fdf3528,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +0a0f4678f437,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +ed554442f41b,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +58e01f29ab7b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +13fdcce41dba,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +cfa719f8faa1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +db40274af82b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +a495ed9da514,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +b97988ffd179,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +e98de030b4bc,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +674dc3cf594e,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +c365ab9925fd,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +29e748e8ade1,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +87ba2a8af561,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +c51dadb84fed,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +ffcb2bb90ef0,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +b8c39e71f0e0,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +d58daacfd369,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +15427e1bb833,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +24748a322d62,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +17fb5f98c5b4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +602e062c9681,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +570d2f5ad012,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +dee81252085e,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +dde472854144,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +31990615ab6f,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +e92158c8da0f,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +8a42ad4255c7,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +70609ce2a233,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +e1365d3ada98,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +19b4f4219e6c,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +7b48ecc7f38a,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +c70bd7108819,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +33984b429697,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +9a803dc7d6ba,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +cc90f2844936,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +32b6849dcbad,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d723c3e955f7,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +f031b6a2d804,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +fa5f6873cb0a,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +49de94ab2b32,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +65402a70071b,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +4f0d8b62b67a,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +bc69d5fae4d5,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +d4d370a90084,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +cc7d51edf4b1,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +aedf3b9b5db5,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +ff1524a3e9c4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +76a8a208b7af,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +3c688ec41977,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +17393d86f0c9,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +1524e64e71de,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +7e54e584d522,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +f603cf341477,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +8a12bef0232a,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +d29c00be029c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +a1b5eecd84c0,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +71bb6e765a0e,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +fa96db597209,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +3d929d4641ea,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +a32495735902,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +e1e41b55873f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +af15dc1bebb2,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +b1aaf5c6df51,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +2107d12518cb,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +208abfc28683,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +296afd5844bb,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +4e9f482719a6,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +7675b71bdc60,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +dc5c3f76aebd,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +a74c07c24937,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +373e53556f3a,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +c8216c5aef09,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6ab7c477dfe2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +7b25f7c4b86b,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +93cc79302a0d,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +176f601eba5e,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +a2add11b80f6,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +1701c69224e3,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +2fae08979e1b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +e8422308cd21,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +6dcd58482ad3,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +aba13ca25dcd,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +30b84710b7c7,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +9733db7ef789,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +b383a17bdcf0,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +8bba13a5642b,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +97fa3cf064bb,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +62a93d741bea,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +ca263b01ab7a,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +7a16f25b5ce6,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +01e3167c59f0,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +b387e0ed486e,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +af06713d1914,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +b6fe924b27c2,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +c178fd3c80d0,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +0755b9023328,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +230764c7a139,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +23f236cea236,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +3833a35b59e9,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +e60195d4857d,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +ba8e0159e5d9,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +c3e4b6fb835b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +74d2965804a5,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +aa9e90ad1b60,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 +bfabfb565058,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +dc691ada8f91,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +b08ec6af198c,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +e3c2c488fbf4,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +32939c0a7c2e,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +9a784f203f71,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +979fba337fa2,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +47aa6b2b17fa,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +8ccd02fa1aa5,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml b/benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml new file mode 100644 index 0000000..ba2126a --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml @@ -0,0 +1,101 @@ +,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay +389c5cbb6667,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +ada4aaef2d69,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +7925ef53184a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +cde297aa6cb0,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6471406588ce,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +69332e9fe4ba,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +ad8695a7eda3,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +a753d48c0e68,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +88b4edb95aa6,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +9281594fca6b,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +d2b757a5cb38,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +1bbb246272c5,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +0dde9f347958,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +23b4248c811a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +d0784d95d442,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +6eeb18d283e3,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d6660f1de3fa,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +d6bf073eb827,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +f476de00912f,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +120a930a2e0c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +01f30dcc5bd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +b77c50640c30,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +250dc18aabcb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +9c15e2e95fe5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +3ac5399b5d39,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +24e1116dd537,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +7214504aed04,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +392c2e1b9caa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +fd497153d74f,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +66c57f9bc1e0,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +94e4588b2c7d,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +1c5bf81f55fb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +208678e2267d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +27f0f576bfd1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +8fab6eda432a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +afc9f298f66b,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +0a18682ae461,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +c5a067e6ab17,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +e1a25a0670d9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +061fa4999358,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +40859df64b24,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +f09f3e9f1341,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +e4f4ccaca2b5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +5cbfdd56176d,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +eaab5ec98363,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +61988c4462a7,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +08e30464625e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +011fc61c8566,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +1f423e3ed794,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +906a466efd20,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +0e8bffc4f932,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +b629a874c5d2,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +9998722ae249,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +0492def7d833,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d8e5048fb582,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +353360e09942,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +bbf2c53df3a4,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +ee1d02f6139e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +01ac36b34e7c,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +c5fdd72ae60c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +c9d7770443b9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +801d14bac102,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +e674c568a8a8,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +2abb052127a4,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +9fe1ad6a431b,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +e9fbbca123a3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +0da39dd8fcfb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +585b6ea87eae,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +1d544984d5c8,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +32625fb7c1a3,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +cec931bbe525,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +8003eb358451,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +e20d32d81b6d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +761c77614b9b,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d22048bd7d02,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +8d5fb32d38cd,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +d1695142f03b,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +db75a7654304,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +71550301ae4b,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +8a90dedab180,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +6acae96c7549,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +eac93c19e6fa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +2f6ba0d8c3db,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +2ba8129e76de,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +706306691690,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +bb7077d50e0a,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +03f04267c6bd,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +aaaba3b0457b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +6a8464cf6a33,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +a9fa87857b58,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +c2eb578026db,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +c518364671b9,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +0651f3927c48,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +53e6d78a3f6b,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +501440caa4de,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +8d170ce02cf4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +36e32e0cec94,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +c56c357701f4,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +1bdf67060b07,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6a4b06bf5ffa,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml b/benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml new file mode 100644 index 0000000..0ca60c6 --- /dev/null +++ b/benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml @@ -0,0 +1,17 @@ +,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay +dd977b38b115,ssg,0.0001,0.0001,1.0,0.01 +a779bc91982f,ssg,0.0001,0.005,1.0,0.01 +5b53d46e1f43,ssg,0.005,0.0001,1.0,0.01 +c6e8d69207c9,ssg,0.001,0.0005,1.0,0.01 +1f09bf71a728,ssg,0.0005,0.0005,1.0,0.01 +ba47d5d07a71,ssg,0.0001,0.0005,1.0,0.01 +c3c60b74a2f6,ssg,0.001,0.005,1.0,0.01 +6489a3166ee5,ssg,0.0005,0.005,1.0,0.01 +08af6b79a6f6,ssg,0.005,0.0005,1.0,0.01 +b4f96a7ac4de,ssg,0.005,0.001,1.0,0.01 +1e782e2ac50a,ssg,0.001,0.0001,1.0,0.01 +ac60b4c7b56b,ssg,0.001,0.001,1.0,0.01 +c51877d903c0,ssg,0.0005,0.001,1.0,0.01 +04d4e9b32fe3,ssg,0.0001,0.001,1.0,0.01 +3e8cfc283731,ssg,0.005,0.005,1.0,0.01 +3d88cf139676,ssg,0.0005,0.0001,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/adam_config.yaml b/benchmark/equalized_odds_vec_folktables/adam_config.yaml new file mode 100644 index 0000000..ec1cbaa --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/adam_config.yaml @@ -0,0 +1,5 @@ +,algorithm,primal__lr,primal__weight_decay +320c69024dbe,adam,0.0005,0.01 +7c3fe4eff95d,adam,0.0001,0.01 +28191679ac49,adam,0.005,0.01 +cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/alm_max_config.yaml b/benchmark/equalized_odds_vec_folktables/alm_max_config.yaml new file mode 100644 index 0000000..9ff59c8 --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/alm_max_config.yaml @@ -0,0 +1,49 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 +ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 +e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 +2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 +f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 +a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 +e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 +77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 +7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 +8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 +7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 +72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 +a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 +58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 +c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 +cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 +6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 +a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 +3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 +c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 +30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 +f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 +b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 +295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 +a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 +199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 +f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 +d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 +cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 +ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 +16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 +9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 +f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 +4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 +27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 +8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 +a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 +d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 +90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 +69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 +f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 +93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 +bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 +a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 +5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 +6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 +d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 +e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml b/benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml new file mode 100644 index 0000000..dd18915 --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml @@ -0,0 +1,49 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 +cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 +566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 +7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 +cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 +572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 +ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 +5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 +f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 +ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 +f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 +36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 +dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 +cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 +a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 +18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 +3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 +d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 +5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 +43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 +cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 +d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 +ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 +17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 +9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 +7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 +79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 +0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 +80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 +933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 +ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 +7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 +39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 +38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 +4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 +93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 +d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 +5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 +c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 +cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 +927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 +d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 +f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 +4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 +bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 +776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 +76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 +5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/multirun.yaml b/benchmark/equalized_odds_vec_folktables/multirun.yaml new file mode 100644 index 0000000..0a52626 --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/multirun.yaml @@ -0,0 +1,249 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: amdfast + qos: null + comment: null + constraint: null + exclude: null + gres: null + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 20G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 85 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=pbm_adapt + - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__penalty_mult=0.8,0.9,0.99,0.999 + - algorithm.dual__penalty_update=dimin_adapt + - algorithm.dual__pbf=quadratic_logarithmic + - algorithm.dual__gamma=0.1,0.5,0.9,0.99,0.999 + - algorithm.dual__delta=1.0 + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=folktables_positive_rate_vec + - data=income_sex + job: + name: run_single_experiment + chdir: false + override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__delta=1.0,algorithm.dual__gamma=0.1,0.5,0.9,0.99,0.999,algorithm.dual__pbf=quadratic_logarithmic,algorithm.dual__penalty_mult=0.8,0.9,0.99,0.999,algorithm.dual__penalty_update=dimin_adapt,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=pbm_adapt,data=income_sex,seed=0,1,2,task=folktables_positive_rate_vec + id: ??? + num: ??? + config_name: experiment + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: pbm_adapt + data: income_sex + task: folktables_positive_rate_vec + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amd + hydra/output: default + verbose: false +task: + task: equalized_odds_vec + batch_size: 32 + constraint: + name: FairretAgg + bound: 0.2 + loss: NormLoss + statistic: PositiveRate + kwargs: + uses_labels: false + pbm_params: + primal__lr: 0.001 + dual__p_mult: 0.9 + dual__penalty_update: dimin_adapt + dual__pbf: quadratic_logarithmic + dual__gamma: 0.1 + moreau__mu: 2.0 + alm_params: + primal__lr: 0.001 + dual__lr: 0.001 + dual__penalty: 0.0 + dual__momentum: 0.0 + moreau__mu: 0.5 + ssg_params: + primal__lr: 0.05 + dual__lr: 0.01 + moreau__mu: 0.0 + adam_params: + lr: 0.001 + penalty: 0.5 + hydra: + run: + dir: . + job: + chdir: false +data: + name: folktables + kwargs: + sens_attrs: + - SEX + states: + - VA + extend_groups: false +algorithm: + algorithm: pbm_adapt + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__penalty_mult: 0.9, 0.99, 0.999 + dual__penalty_update: dimin_adapt + dual__pbf: quadratic_logarithmic + dual__gamma: 0.9, 0.99, 0.999 + dual__delta: 1.0 + moreau__mu: 1.0 + primal__weight_decay: 0.01 +n_epochs: 10 +seed: 0 diff --git a/benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml b/benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml new file mode 100644 index 0000000..f88569c --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml @@ -0,0 +1,81 @@ +,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay +60f56507cd4c,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +bf9565806564,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +071ddb5683d4,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +d51eebe8db16,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +9a67b1f6536f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +020c17ed39bd,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +a589aa3dbad2,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +566d25376894,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +672a1c9d3dad,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +ea4fca5c8ff4,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +f874057d5c35,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +340c81f29a29,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +67b73c0400c1,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6d455fdf3528,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +0a0f4678f437,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +58e01f29ab7b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +13fdcce41dba,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +cfa719f8faa1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +db40274af82b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +a495ed9da514,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +b97988ffd179,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +674dc3cf594e,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +c365ab9925fd,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +29e748e8ade1,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +d58daacfd369,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +15427e1bb833,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +24748a322d62,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +17fb5f98c5b4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +602e062c9681,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +dee81252085e,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +31990615ab6f,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +8a42ad4255c7,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +7b48ecc7f38a,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +33984b429697,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +9a803dc7d6ba,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +cc90f2844936,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +32b6849dcbad,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d723c3e955f7,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +f031b6a2d804,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +fa5f6873cb0a,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +49de94ab2b32,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +4f0d8b62b67a,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +bc69d5fae4d5,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +d4d370a90084,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +aedf3b9b5db5,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +ff1524a3e9c4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +3c688ec41977,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +17393d86f0c9,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +7e54e584d522,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +f603cf341477,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d29c00be029c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +a1b5eecd84c0,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +71bb6e765a0e,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +fa96db597209,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +a32495735902,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +e1e41b55873f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +af15dc1bebb2,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +208abfc28683,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +296afd5844bb,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +4e9f482719a6,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +7675b71bdc60,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +a74c07c24937,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +c8216c5aef09,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6ab7c477dfe2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +176f601eba5e,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +a2add11b80f6,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +2fae08979e1b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +30b84710b7c7,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +9733db7ef789,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 +b383a17bdcf0,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +ca263b01ab7a,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +af06713d1914,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +ba8e0159e5d9,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +bfabfb565058,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +dc691ada8f91,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +b08ec6af198c,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 +e3c2c488fbf4,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 +32939c0a7c2e,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 +979fba337fa2,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 +47aa6b2b17fa,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml b/benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml new file mode 100644 index 0000000..ba2126a --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml @@ -0,0 +1,101 @@ +,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay +389c5cbb6667,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +ada4aaef2d69,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +7925ef53184a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +cde297aa6cb0,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6471406588ce,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +69332e9fe4ba,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +ad8695a7eda3,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +a753d48c0e68,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +88b4edb95aa6,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +9281594fca6b,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +d2b757a5cb38,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +1bbb246272c5,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +0dde9f347958,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +23b4248c811a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +d0784d95d442,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +6eeb18d283e3,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d6660f1de3fa,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +d6bf073eb827,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +f476de00912f,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +120a930a2e0c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +01f30dcc5bd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +b77c50640c30,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +250dc18aabcb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +9c15e2e95fe5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +3ac5399b5d39,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +24e1116dd537,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +7214504aed04,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +392c2e1b9caa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +fd497153d74f,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +66c57f9bc1e0,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +94e4588b2c7d,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +1c5bf81f55fb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +208678e2267d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +27f0f576bfd1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +8fab6eda432a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +afc9f298f66b,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +0a18682ae461,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +c5a067e6ab17,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +e1a25a0670d9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +061fa4999358,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +40859df64b24,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +f09f3e9f1341,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +e4f4ccaca2b5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +5cbfdd56176d,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +eaab5ec98363,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +61988c4462a7,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +08e30464625e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +011fc61c8566,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +1f423e3ed794,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +906a466efd20,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +0e8bffc4f932,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +b629a874c5d2,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +9998722ae249,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +0492def7d833,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d8e5048fb582,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +353360e09942,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +bbf2c53df3a4,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +ee1d02f6139e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +01ac36b34e7c,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +c5fdd72ae60c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +c9d7770443b9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +801d14bac102,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +e674c568a8a8,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +2abb052127a4,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +9fe1ad6a431b,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +e9fbbca123a3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +0da39dd8fcfb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +585b6ea87eae,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +1d544984d5c8,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +32625fb7c1a3,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +cec931bbe525,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +8003eb358451,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +e20d32d81b6d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +761c77614b9b,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +d22048bd7d02,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +8d5fb32d38cd,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +d1695142f03b,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +db75a7654304,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +71550301ae4b,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +8a90dedab180,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +6acae96c7549,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +eac93c19e6fa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +2f6ba0d8c3db,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +2ba8129e76de,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +706306691690,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +bb7077d50e0a,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +03f04267c6bd,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +aaaba3b0457b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +6a8464cf6a33,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +a9fa87857b58,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +c2eb578026db,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +c518364671b9,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +0651f3927c48,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +53e6d78a3f6b,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 +501440caa4de,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +8d170ce02cf4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 +36e32e0cec94,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 +c56c357701f4,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 +1bdf67060b07,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 +6a4b06bf5ffa,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/ssg_config.yaml b/benchmark/equalized_odds_vec_folktables/ssg_config.yaml new file mode 100644 index 0000000..0ca60c6 --- /dev/null +++ b/benchmark/equalized_odds_vec_folktables/ssg_config.yaml @@ -0,0 +1,17 @@ +,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay +dd977b38b115,ssg,0.0001,0.0001,1.0,0.01 +a779bc91982f,ssg,0.0001,0.005,1.0,0.01 +5b53d46e1f43,ssg,0.005,0.0001,1.0,0.01 +c6e8d69207c9,ssg,0.001,0.0005,1.0,0.01 +1f09bf71a728,ssg,0.0005,0.0005,1.0,0.01 +ba47d5d07a71,ssg,0.0001,0.0005,1.0,0.01 +c3c60b74a2f6,ssg,0.001,0.005,1.0,0.01 +6489a3166ee5,ssg,0.0005,0.005,1.0,0.01 +08af6b79a6f6,ssg,0.005,0.0005,1.0,0.01 +b4f96a7ac4de,ssg,0.005,0.001,1.0,0.01 +1e782e2ac50a,ssg,0.001,0.0001,1.0,0.01 +ac60b4c7b56b,ssg,0.001,0.001,1.0,0.01 +c51877d903c0,ssg,0.0005,0.001,1.0,0.01 +04d4e9b32fe3,ssg,0.0001,0.001,1.0,0.01 +3e8cfc283731,ssg,0.005,0.005,1.0,0.01 +3d88cf139676,ssg,0.0005,0.0001,1.0,0.01 diff --git a/benchmark/helmholtz_helmholtz/multirun.yaml b/benchmark/helmholtz_helmholtz/multirun.yaml new file mode 100644 index 0000000..3c24961 --- /dev/null +++ b/benchmark/helmholtz_helmholtz/multirun.yaml @@ -0,0 +1,208 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: h200fast,amdgpufast + qos: null + comment: null + constraint: null + exclude: null + gres: gpu=1 + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 10G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 99 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=alm + - algorithm.primal__lr=0.0005,0.001,0.005 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.0005,0.001,0.005 + - algorithm.dual__penalty=0.,1.,2. + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=helmholtz + - data=helmholtz + - model=deep_narrow + - +algorithm.beta=1 + job: + name: PDE_Helmholtz + chdir: false + override_dirname: +algorithm.beta=1,+algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0005,0.001,0.005,algorithm.dual__penalty=0.,1.,2.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0005,0.001,0.005,algorithm=alm,data=helmholtz,model=deep_narrow,seed=0,1,2,task=helmholtz + id: ??? + num: ??? + config_name: helmholtz + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: alm + data: helmholtz + task: helmholtz + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_amdgpu + hydra/output: default + verbose: false +task: + task: helmholtz +data: + name: helmholtz +algorithm: + algorithm: alm + primal__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__lr: 0.0001, 0.0005, 0.001, 0.005 + dual__penalty: 0., 1., 2. + moreau__mu: 1.0 + primal__weight_decay: 0.01 + beta: 1 +n_epochs: 10000 +seed: 0 +model: deep_narrow diff --git a/benchmark/pbm_dimin_config.yaml b/benchmark/pbm_dimin_config.yaml new file mode 100644 index 0000000..2ebc98a --- /dev/null +++ b/benchmark/pbm_dimin_config.yaml @@ -0,0 +1,326 @@ +,algorithm,primal__lr,dual_penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu +82817d6b,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +5b3ca681,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +06e21ef2,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +f0705958,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +bf0b84d8,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +6a03c4e2,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +18392377,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +ba76ac2f,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +ed2e80d8,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +a48c3aa7,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +14154af8,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +e398f5ee,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0.1 +4824b1b3,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +9038fce2,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +9f9dc643,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +e7b9066e,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +ca0e357c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +faa0f027,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +af6dfb12,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +0b8e5134,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +169a2a3a,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +607bc2c0,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +3fb16663,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +acad47e9,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +fa46c18c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +a0301919,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +3c2f8f32,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +19ed5a31,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +45572647,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +b48ee2b5,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +ce1ca314,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,2.0 +7065c95d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +4869bd42,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +b5b38e92,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +8a3b4bf9,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +20add89e,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +a3d20128,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +b1c37cdc,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +d64ec5d3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +6fd312df,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +f851f103,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +57e973be,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +e1c61153,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +73e684a8,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,1.0 +889f7dde,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +3efdb5e4,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +c3ac7ba2,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +46c3e884,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +0f2af858,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +ea168269,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +7eae0db6,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +19e6d0a5,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +3b3506d0,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +3fd3ea94,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +f287fd9b,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +2b62adaa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +3abca38a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +1e1797c8,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +edebf933,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +98c2f8c2,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +fdb941ea,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +0e63af8d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +3687be50,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +e96487ad,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +370576db,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +9461418d,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +6b6b0317,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +54d76a73,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +ddc0f892,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +2e917ebb,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +f333ba22,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +14bb0bc6,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +5dd0db45,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +e0330170,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +9b4daa70,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +d5b75b65,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +a5aaba50,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +16ba70ee,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +3e436265,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +0c3f61d5,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +b8bc00fb,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +d69b749c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +c75cd148,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +72be9778,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +89d684bc,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +cb5b2b52,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +fc2bc3bb,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +e03398a2,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +40bd7779,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +9e4362da,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +8d8e608a,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +fdb84094,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +c1a597bd,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0 +624be33c,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +a3db4351,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +0d3f6c28,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +855ec898,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +8a0b633e,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +38b5830a,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +3ccf8e55,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +fdb913dd,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +b475ac20,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +15f32408,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +64be9e02,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +6de0c47f,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +bb8a77af,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +36448ef8,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +1449a077,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +0ba19590,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 +bcf7e71c,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +b4f80b28,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +13280627,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +25d228eb,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +dd1b93c5,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +7e436f8a,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +324cbfb9,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +32932ce5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +3462334c,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +135e9dab,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +0c63fc1c,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +d8cdf0d3,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +4e1488f5,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 +11a8696b,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +10719b39,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +8228cd81,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 +0250c55d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +368b33b6,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +bc2edf56,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +89272e8c,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +a255debe,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +0800ddab,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +e21dbabc,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +94bd21b1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +7722b98e,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 +46d3327d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +71c70895,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +200c6eed,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +6f21bbda,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +cb9d7ad0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +f756f501,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +70ec5ee8,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +4d211aa5,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +7f68bab1,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +beb3596f,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +88816ce4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +491befdf,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +74b8cdd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 +ed0caa13,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +f1c79150,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +653ac4e7,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +d0ca8a35,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 +dd4b8935,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +2fa4a18a,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +6a47634d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +fe21f25d,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +b8c81c1a,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 +4b673f5e,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 +0884fa28,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 +21f4f2b0,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 +da6992cb,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +179c02ae,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +20797283,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +4102a36c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +97411649,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +6b7b3146,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +f71fe8c5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +c287c41e,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +f9904ae0,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +d94561d1,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +fbfaaa3d,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +293a2367,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +d762c188,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +adde6ef3,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +b1c91296,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +233c3714,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +125c64d0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +9832f4b8,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +c4aab02f,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 +fc8e2656,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +8fe79504,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 +fb7e4884,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +6caccd49,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +b56d7545,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 +95592499,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +ac096871,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +218116c0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +b39b977c,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 +aaaa8cff,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +a11b51dc,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +de658dc6,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +e9961a84,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +3c172fdd,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +aa9f53dc,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +55dcac6e,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +c648c195,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +01e79092,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +0ee5e8fa,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +6a9b7d53,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 +904eea7e,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +2667cee4,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 +10afc92f,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +519fc23b,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +111302e0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 +d3828877,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 +402c5e53,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +ba3d948c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +a69d4905,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +8f71c416,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +fc786671,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +eebcc229,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +4293165c,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 +ec75533e,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +c6a90b0a,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +6a7c0e38,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +cab86a42,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +4c575b5a,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +34e2328f,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 +ccfcb6de,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +cddec2d9,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +97c6b7f2,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +4766af48,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +54056ced,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +81470845,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 +336f93bf,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +61ab3ad4,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +82fa31e3,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 +fff6d2c1,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 +c385eba3,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +70430a24,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +e0d9d104,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 +c7fbf993,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +4d251599,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +8c35df3a,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 +3bfdb40c,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 +040d0348,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +b1ed3fed,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +a99d0745,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 +5f575060,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +6a0fdd18,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +2ce1450c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +d6ce6186,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +934b2640,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +91890c35,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +10dd97f1,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 +ab1d5425,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +7189f63c,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +72b701b2,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +54ae1ff5,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +c119c79d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +40b6422e,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +e637e178,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 +5ae4eb2e,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 +1cc0dfab,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +6791490c,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +0b3ceeee,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +3d6cd9ca,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +8d2abf9e,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 +29e9ff1a,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 +f288701b,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 +a150853a,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +5feff0ea,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 +e11bceae,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0.5 +783474f2,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 +ca4cd6de,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 +37806fa4,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 +e99657ca,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 +22544125,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +e3e59acf,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 +376fc38c,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 +3464a2eb,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 +8e4e9cbc,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +cd8c07fc,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 +f6d18eb0,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +1c7b672e,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 +f82e154d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +8dd962c4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 +88ad06ac,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +46646db7,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 +18d3bbe0,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 +503836ca,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 +8ce79fa5,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 +f677c700,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 +04f490ea,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 +a4e16e00,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +8f7319ee,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 +109ff18b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +17140b87,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +66332b52,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 +e5ec895d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 +4f6d2b15,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 +2eec358e,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 +db4cbc82,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +c549303e,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 +0d9b7e97,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 +3e1b21ce,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +1cbd61d3,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 +2f43d516,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 +ac6f09c7,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 +9dfe0a70,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 +cf459dfc,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 +aa016d20,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 +428a9fb1,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 +be188337,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +c70b6d71,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 +e356573a,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +8afc6c03,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +b2676c1b,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 +72a4be4d,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +281b4a74,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 +aee2ac81,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 +222d9d3c,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 +bf08f4ba,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 +ef1fbb14,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 +cdfa58f2,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 +3bcc9755,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 +8358f760,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 +6f9df33e,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 +bb6c79de,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 +39f1edd7,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 +ee2dc57f,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 +a3145abb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 +5ff5fdec,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 +8349a90a,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 +3007200c,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 +c874ba03,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 diff --git a/benchmark/plotting.py b/benchmark/plotting.py index 86a6c2a..836d8a9 100644 --- a/benchmark/plotting.py +++ b/benchmark/plotting.py @@ -2,34 +2,18 @@ import numpy as np -def plot_losses_and_constraints_stochastic( - train_losses_list, - train_losses_std_list, - train_constraints_list, - train_constraints_std_list, - constraint_thresholds, - test_losses_list=None, - test_losses_std_list=None, - test_constraints_list=None, - test_constraints_std_list=None, - titles=None, - eval_points=1, - std_multiplier=2, - log_constraints=False, - mode="train", # "train" or "train_test" - times=[], # second per epoch - plot_time_instead_epochs=False, - save_path=None, - separate_constraints = False, - abs_constraints=False -): - """ - mode: - "train" -> only training plots - "train_test" -> training + test side by side + +def plot_accuracy_per_epoch(algorithms_data, eval_points=1, algorithms_data_std=None, std_multiplier=2): """ + Plots average per-class accuracy per epoch for each algorithm. -# # --- Color palette (Tableau 10) --- + Parameters: + - algorithms_data: Dict where keys are algorithm names and values are lists of average per-class accuracies per epoch. + - eval_points: Evaluate points for markers (default: 1). + - algorithms_data_std: Optional. Dict with same structure as algorithms_data for standard deviations. + - std_multiplier: Multiplier for standard deviation bands (default: 2). + """ + # --- Color palette (Tableau 10) --- colors = [ "#4E79A7", "#F28E2B", @@ -45,175 +29,274 @@ def plot_losses_and_constraints_stochastic( marker_styles = ["o", "s", "D", "^", "v", "<", ">", "P", "X", "*"] - num_algos = len(train_losses_list) - if titles is None: - titles = [f"Algorithm {i + 1}" for i in range(num_algos)] - - constraint_thresholds = np.atleast_1d(constraint_thresholds) + num_algos = len(algorithms_data) + algo_names = list(algorithms_data.keys()) # --- Layout --- - ncols = 1 if mode == "train" else 2 - nrows = 1 + train_constraints_list[0].shape[0] if separate_constraints else 2 + fig, axes = plt.subplots(num_algos, 1, figsize=(9, 4*num_algos), sharex=True) - join_bottom_plot = not test_constraints_list and mode == "train_test" + if num_algos == 1: + axes = [axes] # Ensure axes is iterable - if join_bottom_plot: - fig = plt.figure(figsize=(9 * ncols, 10)) - axes = [] + for i, (ax, algo_name) in enumerate(zip(axes, algo_names)): + y = np.array(algorithms_data[algo_name]) + K = len(y) + x = np.arange(1, K+1) - ax1 = fig.add_subplot(2, 2, 1) - ax2 = fig.add_subplot(2, 2, 2, sharey = ax1) - ax3 = fig.add_subplot(2, 1, 2) + color = colors[i % len(colors)] + ax.plot(x, y, lw=2.2, color=color, label=algo_name) - axes = [ax1, ax2, ax3] - else: - fig, axes = plt.subplots(2, ncols, figsize=(9 * ncols, 10), sharex="col", sharey="row") - - if ncols == 1: - axes = np.array([[axes[0]], [axes[1]]]) - - # ====================================================== - # Helper plotting functions - # ====================================================== + # Add error band if standard deviation data is provided + if algorithms_data_std is not None: + y_std = np.array(algorithms_data_std[algo_name]) + ax.fill_between( + x, + y - std_multiplier * y_std, + y + std_multiplier * y_std, + color=color, + alpha=0.15, + ) - def plot_loss(ax, losses_list, losses_std_list, title_suffix): - for j, (loss, loss_std) in enumerate(zip(losses_list, losses_std_list)): - x = np.arange(len(loss)) - color = colors[j % len(colors)] - upper = loss + std_multiplier * loss_std - lower = loss - std_multiplier * loss_std - - if plot_time_instead_epochs: - x *= round(times[j]) - - # ax.plot(x, loss, lw=2.2, color=color, label=titles[j] + f"; TPE: {minutes}m:{seconds}s") - ax.plot(x, loss, lw=2.2, color=color, label=titles[j]) - ax.fill_between(x, lower, upper, color=color, alpha=0.15) - - if eval_points is not None: - idx = ( - np.arange(0, len(loss), eval_points) - if isinstance(eval_points, int) - else np.array(eval_points) - ) - idx = idx[idx < len(loss)] - ax.plot( - x[idx], - loss[idx], - marker_styles[j % len(marker_styles)], - color=color, - markersize=6, - alpha=0.8, - ) + if eval_points is not None: + idx = ( + np.arange(0, len(y), eval_points) + if isinstance(eval_points, int) + else np.array(eval_points) + ) + idx = idx[idx < len(y)] + ax.plot( + x[idx], + y[idx], + marker_styles[i % len(marker_styles)], + color=color, + markersize=6, + alpha=0.8, + ) - ax.set_title(f"Loss ({title_suffix})") - ax.set_ylabel("Mean Loss") + ax.set_title(algo_name) + ax.set_xlabel("Epoch") + ax.set_ylabel("Average Per-Class Accuracy") ax.grid(True, linestyle="--", alpha=0.35) ax.legend(fontsize=9) - - - def plot_constraints(ax, constraints_list, constraints_std_list, title_suffix): - for j, (constraints, constraints_std) in enumerate( - zip(constraints_list, constraints_std_list) - ): - color = colors[j % len(colors)] - constraints = np.asarray(constraints) - constraints_std = np.asarray(constraints_std) - - x = np.arange(constraints.shape[1]) - - print(np.array(constraints).shape) - c_max = np.max(constraints, axis=0) - c_max_std = np.std(c_max) - - c_lower = c_max - std_multiplier * c_max_std - c_upper = c_max + std_multiplier * c_max_std - ax.fill_between(x, c_lower, c_upper, color=color, alpha=0.1) - - if plot_time_instead_epochs: - x *= round(times[j]) - - label = titles[j] - ax.plot(x, c_max, lw=1.8, color=color, alpha=0.3, label=label) - - if eval_points is not None: - idx = ( - np.arange(0, len(c_max), eval_points) - if isinstance(eval_points, int) - else np.array(eval_points) - ) - idx = idx[idx < len(c_max)] - ax.plot( - x[idx], - c_max[idx], - marker_styles[j % len(marker_styles)], - color=color, - markersize=5, - alpha=0.3, - ) - - for th in constraint_thresholds: - y = np.log(th) if log_constraints else th - ax.axhline(y, color="red", linestyle="--", lw=1.4, label="Threshold") + plt.tight_layout() + plt.show() - ax.set_title(f"Constraint ({title_suffix})") - ax.set_ylabel("Log Constraint" if log_constraints else "Constraint") - if plot_time_instead_epochs: - ax.set_xlabel("Time (m)") - else: - ax.set_xlabel("Epoch") - ax.grid(True, linestyle="--", alpha=0.35) - ax.legend(fontsize=9) - # ====================================================== - # TRAIN PLOTS - # ====================================================== - plot_loss( - axes[0] if join_bottom_plot else axes[0, 0], - train_losses_list, - train_losses_std_list, - "Train" - ) - plot_constraints( - axes[2] if join_bottom_plot else axes[1, 0], - train_constraints_list, - train_constraints_std_list, - "Train", - ) +# def plot_losses_and_constraints_stochastic( +# train_losses_list, +# train_losses_std_list, +# train_constraints_list, +# train_constraints_std_list, +# constraint_thresholds, +# test_losses_list=None, +# test_losses_std_list=None, +# test_constraints_list=None, +# test_constraints_std_list=None, +# titles=None, +# eval_points=1, +# std_multiplier=2, +# log_constraints=False, +# mode="train", # "train" or "train_test" +# times=[], # second per epoch +# plot_time_instead_epochs=False, +# save_path=None, +# separate_constraints = False, +# abs_constraints=False +# ): +# """ +# mode: +# "train" -> only training plots +# "train_test" -> training + test side by side +# """ - # ====================================================== - # TEST PLOTS - # ====================================================== +# # # --- Color palette (Tableau 10) --- +# colors = [ +# "#4E79A7", +# # "#F28E2B", +# "#E15759", +# "#76B7B2", +# "#59A14F", +# "#EDC948", +# "#B07AA1", +# "#FF9DA7", +# "#9C755F", +# "#BAB0AB", +# ] - if mode == "train_test": - plot_loss( - axes[1] if join_bottom_plot else axes[0, 1], - test_losses_list, - test_losses_std_list, - "Test" - ) - if join_bottom_plot: - print(axes[0].get_yticks()) - print(axes[1].get_yticks()) - if test_constraints_list: - plot_constraints( - axes[1, 1], - test_constraints_list, - test_constraints_std_list, - "Test", - ) +# marker_styles = ["o", "s", "D", "^", "v", "<", ">", "P", "X", "*"] - plt.tight_layout() - if save_path: - plt.savefig(save_path) +# num_algos = len(train_losses_list) +# if titles is None: +# titles = [f"Algorithm {i + 1}" for i in range(num_algos)] +# constraint_thresholds = np.atleast_1d(constraint_thresholds) +# # --- Layout --- +# ncols = 1 if mode == "train" else 2 +# nrows = 1 + train_constraints_list[0].shape[0] if separate_constraints else 2 -import numpy as np -import matplotlib.pyplot as plt +# join_bottom_plot = not test_constraints_list and mode == "train_test" + +# if join_bottom_plot: +# fig = plt.figure(figsize=(9 * ncols, 10)) +# axes = [] + +# ax1 = fig.add_subplot(2, 2, 1) +# ax2 = fig.add_subplot(2, 2, 2, sharey = ax1) +# ax3 = fig.add_subplot(2, 1, 2) + +# axes = [ax1, ax2, ax3] +# else: +# fig, axes = plt.subplots(2, ncols, figsize=(9 * ncols, 10), sharex="col", sharey="row") + +# if ncols == 1: +# axes = np.array([[axes[0]], [axes[1]]]) + +# # ====================================================== +# # Helper plotting functions +# # ====================================================== + +# def plot_loss(ax, losses_list, losses_std_list, title_suffix): +# for j, (loss, loss_std) in enumerate(zip(losses_list, losses_std_list)): +# x = np.arange(len(loss)) +# color = colors[j % len(colors)] +# upper = loss + std_multiplier * loss_std +# lower = loss - std_multiplier * loss_std + +# if plot_time_instead_epochs: +# x *= round(times[j]) + +# # ax.plot(x, loss, lw=2.2, color=color, label=titles[j] + f"; TPE: {minutes}m:{seconds}s") +# ax.plot(x, loss, lw=2.2, color=color, label=titles[j]) +# ax.fill_between(x, lower, upper, color=color, alpha=0.15) + +# if eval_points is not None: +# idx = ( +# np.arange(0, len(loss), eval_points) +# if isinstance(eval_points, int) +# else np.array(eval_points) +# ) +# idx = idx[idx < len(loss)] +# ax.plot( +# x[idx], +# loss[idx], +# marker_styles[j % len(marker_styles)], +# color=color, +# markersize=6, +# alpha=0.8, +# ) + +# ax.set_title(f"Loss ({title_suffix})") +# ax.set_ylabel("Mean Loss") +# ax.grid(True, linestyle="--", alpha=0.35) +# ax.legend(fontsize=9) + + +# def plot_constraints(ax, constraints_list, constraints_std_list, title_suffix): +# for j, (constraints, constraints_std) in enumerate( +# zip(constraints_list, constraints_std_list) +# ): +# color = colors[j % len(colors)] +# constraints = np.asarray(constraints) +# constraints_std = np.asarray(constraints_std) + +# x = np.arange(constraints.shape[1]) + +# print(np.array(constraints).shape) +# c_max = np.max(constraints, axis=0) +# c_max_std = np.std(c_max) + +# c_lower = c_max - std_multiplier * c_max_std +# c_upper = c_max + std_multiplier * c_max_std +# ax.fill_between(x, c_lower, c_upper, color=color, alpha=0.1) + +# if plot_time_instead_epochs: +# x *= round(times[j]) + +# label = titles[j] +# ax.plot(x, c_max, lw=1.8, color=color, alpha=0.3, label=label) + +# if eval_points is not None: +# idx = ( +# np.arange(0, len(c_max), eval_points) +# if isinstance(eval_points, int) +# else np.array(eval_points) +# ) +# idx = idx[idx < len(c_max)] +# ax.plot( +# x[idx], +# c_max[idx], +# marker_styles[j % len(marker_styles)], +# color=color, +# markersize=5, +# alpha=0.3, +# ) + + +# for th in constraint_thresholds: +# y = np.log(th) if log_constraints else th +# ax.axhline(y, color="red", linestyle="--", lw=1.4, label="Threshold") + +# ax.set_title(f"Constraint ({title_suffix})") +# ax.set_ylabel("Log Constraint" if log_constraints else "Constraint") + +# if plot_time_instead_epochs: +# ax.set_xlabel("Time (m)") +# else: +# ax.set_xlabel("Epoch") +# ax.grid(True, linestyle="--", alpha=0.35) +# ax.legend(fontsize=9) + +# # ====================================================== +# # TRAIN PLOTS +# # ====================================================== + +# plot_loss( +# axes[0] if join_bottom_plot else axes[0, 0], +# train_losses_list, +# train_losses_std_list, +# "Train" +# ) +# plot_constraints( +# axes[2] if join_bottom_plot else axes[1, 0], +# train_constraints_list, +# train_constraints_std_list, +# "Train", +# ) + +# # ====================================================== +# # TEST PLOTS +# # ====================================================== + +# if mode == "train_test": +# plot_loss( +# axes[1] if join_bottom_plot else axes[0, 1], +# test_losses_list, +# test_losses_std_list, +# "Test" +# ) +# if join_bottom_plot: +# print(axes[0].get_yticks()) +# print(axes[1].get_yticks()) +# if test_constraints_list: +# plot_constraints( +# axes[1, 1], +# test_constraints_list, +# test_constraints_std_list, +# "Test", +# ) + +# plt.tight_layout() +# if save_path: +# plt.savefig(save_path) + + + +# import numpy as np +# import matplotlib.pyplot as plt def plot_losses_and_constraints_stochastic( @@ -258,7 +341,19 @@ def plot_losses_and_constraints_stochastic( if titles is None: titles = [f"Algorithm {i+1}" for i in range(num_algos)] - colors = plt.rcParams["axes.prop_cycle"].by_key()["color"] + # colors = plt.rcParams["axes.prop_cycle"].by_key()["color"] + colors = [ + "#4E79A7", + "#F28E2B", + "#E15759", + "#76B7B2", + "#59A14F", + "#EDC948", + "#B07AA1", + "#FF9DA7", + "#9C755F", + "#BAB0AB", + ] markers = ["o", "s", "D", "^", "v", "<", ">", "P", "X", "*"] constraint_thresholds = np.atleast_1d(constraint_thresholds) diff --git a/benchmark/run_benchmark.py b/benchmark/run_benchmark.py index c67b892..662c9cc 100644 --- a/benchmark/run_benchmark.py +++ b/benchmark/run_benchmark.py @@ -7,7 +7,7 @@ import hydra from omegaconf import DictConfig, OmegaConf -from benchmark_utils import create_model +from utils import create_model, create_conv_model, create_resnet from _data_sources import load_data_FT_prod, load_data_FT_vec, load_data_FT, load_data_DUTCH, load_data_norm, load_data_cifar10, load_data_cifar100 # from benchmark_utils import * from plotting import plot_losses_and_constraints_stochastic @@ -18,7 +18,12 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, seed = 0 torch.manual_seed(seed) dataset = data_cfg['name'] - device = 'cpu' + + device = ('cuda:0' if torch.cuda.is_available() else 'cpu') + print(torch.cuda.device_count()) + print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'No GPU') + torch.set_default_device(device) + result_dir = "results/" + dataset + '_' + task os.makedirs(result_dir, exist_ok=True) @@ -50,18 +55,27 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, batch_size = cfg.batch_size if task == 'cifar10': criterion = torch.nn.CrossEntropyLoss(reduction = 'none') - dataloader_train, dataloader_val, classes, class_ind = load_data_cifar10(batch_size) + dataloader_train, dataloader_val, dataloader_test, classes, class_ind = load_data_cifar10(device=device) features_train, sens_train, labels_train = next(iter(dataloader_train)) + model_fn = create_conv_model + dataloader_val = dataloader_test + model_kwargs = {} elif task == 'cifar100': criterion = torch.nn.CrossEntropyLoss(reduction = 'none') - dataloader_train, dataloader_val, classes, class_ind = load_data_cifar100(batch_size) + dataloader_train, dataloader_val, dataloader_test, classes, class_ind = load_data_cifar100(device=device) features_train, sens_train, labels_train = next(iter(dataloader_train)) + model_fn = create_resnet + dataloader_val = dataloader_test + model_kwargs = {} else: criterion = torch.nn.functional.binary_cross_entropy_with_logits (dataloader_train, dataloader_val, dataloader_test), (features_train, sens_train, labels_train), (features_val, sens_val, labels_val), (features_test, sens_test, labels_test) = data_source(batch_size) - features_val = features_test - sens_val = sens_test - labels_val = labels_test + if task != 'equalized_odds_vec': + features_val = features_test + sens_val = sens_test + labels_val = labels_test + model_fn = create_model + model_kwargs = {'input_shape': features_train.shape[-1], **model_kwargs} data_val = (features_val, sens_val, labels_val) if task not in ['cifar10', 'cifar100'] else dataloader_val @@ -131,9 +145,10 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, use_slack=False, fuse_loss_constraint=fuse_loss_constraint, reg_penalty=p, - model_gen = create_model, - model_kwargs = {'input_shape': features_train.shape[-1], **model_kwargs}, - criterion=criterion + model_gen = model_fn, + model_kwargs = model_kwargs, + criterion=criterion, + device=device ) models.append(model) @@ -180,9 +195,10 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, constraints_to_eq=False, use_slack=False, fuse_loss_constraint=fuse_loss_constraint, - model_gen = create_model, - model_kwargs = {'input_shape': features_train.shape[-1], **model_kwargs}, - criterion=criterion + model_gen = model_fn, + model_kwargs = model_kwargs, + criterion=criterion, + device=device ) models.append(model) pbm_history_train.append(h_train) @@ -225,9 +241,10 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, constraints_to_eq=True, use_slack=alm_use_slack, fuse_loss_constraint=fuse_loss_constraint, - model_gen = create_model, - model_kwargs = {'input_shape': features_train.shape[-1], **model_kwargs}, - criterion=criterion + model_gen = model_fn, + model_kwargs = model_kwargs, + criterion=criterion, + device=device ) models.append(model) alm_history_train.append(h_train) @@ -272,9 +289,10 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, constraints_to_eq=False, use_slack=False, fuse_loss_constraint=fuse_loss_constraint, - model_gen = create_model, - model_kwargs = {'input_shape': features_train.shape[-1], **model_kwargs}, - criterion=criterion + model_gen = model_fn, + model_kwargs = model_kwargs, + criterion=criterion, + device=device ) models.append(model) ssg_history_train.append(h_train) @@ -300,6 +318,10 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, ###### PLOT ###### + algorithms_run = ['adam', 'ssg', 'alm', 'pbm'] + # algorithms_run = ['adam', 'alm_slack', 'alm_max', 'pbm_dimin'] + # algorithms_run = ['adam', 'alm_max', 'pbm_dimin'] + if len(algorithms_run) == 0: print('\nNo algorithms were run. Skipping plotting.\n') return @@ -307,8 +329,18 @@ def run_benchmark(data_cfg, task, n_runs, n_epochs, constraint_cfg, pbm_params, def read_prepare_data(path: str): train = pd.read_csv(path) c_cols = [c for c in train.columns if c.startswith('c_')] + if "params" in train.columns: + train.drop("params", inplace=True, axis="columns") + if "acc" in train.columns: + train.drop("acc", inplace=True, axis="columns") mean = train.groupby(by='epoch').mean() - std = train.groupby(by=['Unnamed: 0', 'epoch']).mean().groupby(by='epoch').std() + # breakpoint() + # if "Unnamed: 0" not in train.columns: + # train.reset_index(inplace=True) + # train['Unnamed: 0'] = train.index + # std = train.groupby(by=['Unnamed: 0', 'epoch']).mean().groupby(by='epoch').std() + + std = train.groupby(by='epoch').std() loss_mean = mean['loss'].to_numpy() loss_std = std['loss'].to_numpy() cs_mean = mean[c_cols].to_numpy() @@ -327,20 +359,23 @@ def read_prepare_data(path: str): cs_stds_val = [] alg_names = [] alg_display_names = { - 'adam': 'Adam', + 'adam': 'Unconstrained Adam', 'pbm': 'SPBM', - 'alm': 'ALM', - 'ssg': 'SSG' + 'pbm_dimin': 'SPBM', + 'alm': 'SSL-ALM', + 'alm_max': 'SSL-ALM', + 'ssg': 'SSW' } + for alg in algorithms_run: + train_file = f'{result_dir}/runs_{alg}_train.csv' val_file = f'{result_dir}/runs_{alg}_val.csv' if os.path.exists(train_file) and os.path.exists(val_file): _, loss_mean_train, loss_std_train, cs_mean_train, cs_std_train = read_prepare_data(train_file) _, loss_mean_val, loss_std_val, cs_mean_val, cs_std_val = read_prepare_data(val_file) - loss_means_train.append(loss_mean_train) loss_stds_train.append(loss_std_train) cs_means_train.append(cs_mean_train.T) @@ -349,8 +384,9 @@ def read_prepare_data(path: str): loss_stds_val.append(loss_std_val) cs_means_val.append(cs_mean_val.T) cs_stds_val.append(cs_std_val.T) + # alg_names.append(alg) alg_names.append(alg_display_names[alg]) - + print(alg_names) if len(alg_names) > 0: plot_losses_and_constraints_stochastic( loss_means_train, @@ -366,6 +402,7 @@ def read_prepare_data(path: str): mode='train_test' if not task == 'weight_norm' else 'train', # plot_max_constraint=m > 5, save_path=result_dir + '/plot.png', + std_multiplier=1. # combine_algos = True ) diff --git a/benchmark/run_gridsearch.py b/benchmark/run_gridsearch.py index 6b11dd4..229bd7b 100644 --- a/benchmark/run_gridsearch.py +++ b/benchmark/run_gridsearch.py @@ -1,6 +1,4 @@ -# from benchmark_utils import * from utils import * -import benchmark_utils from utils import create_model, create_conv_model from humancompatible.train.fairness.utils import BalancedBatchSampler from itertools import product @@ -51,13 +49,13 @@ def extract_best_params(runs, param_grid, val_c_tolerance, filter='upper'): return min_feasible_val_loss_params, min_feasible_val_loss_idx, min_val_loss, min_val_c, runs -def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): +def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device, seed): seed = 0 torch.manual_seed(seed) dataset = data_cfg['name'] task = task_cfg.task - result_dir = dataset + '_' + task + result_dir = dataset + '_' + task + seed os.makedirs(result_dir, exist_ok=True) @@ -81,13 +79,13 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): if task == 'cifar10': dataloader_train, dataloader_val, classes, class_ind = load_data_cifar10(device=device) features_train, sens_train, labels_train = next(iter(dataloader_train)) - create_model = create_conv_model + create_model_fn = create_conv_model model_kwargs = {} criterion = torch.nn.CrossEntropyLoss(reduction='none') elif task == 'cifar100': dataloader_train, dataloader_val, classes, class_ind = load_data_cifar100(device=device) features_train, sens_train, labels_train = next(iter(dataloader_train)) - create_model = create_conv_model + create_model_fn = create_conv_model model_kwargs = {} criterion = torch.nn.CrossEntropyLoss(reduction='none') else: @@ -95,7 +93,7 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): features_val = features_test sens_val = sens_test labels_val = labels_test - create_model = benchmark_utils.create_model + create_model_fn = create_model model_kwargs = {'input_shape': features_train.shape[1], 'latent_size1': 64, 'latent_size2': 32} criterion = torch.nn.functional.binary_cross_entropy_with_logits @@ -107,11 +105,10 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): "primal__lr": lr, "dual__penalty_mult": dual_lr, "dual__penalty_update": p_update, - "dual__penalty_range": [1e-1, 1.], "dual__pbf": pb_func, - "dual__init_duals": 1e-4, + "dual__penalty_range": p_range, "dual__gamma": dual_gamma, - "dual__delta": dual_delta, + "dual__delta": 1., "moreau__mu": moreau_mu } for ( @@ -119,16 +116,18 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): dual_lr, p_update, pb_func, + p_range, dual_gamma, - dual_delta, + # dual_delta, moreau_mu ) in product ( [0.001, 0.005, 0.01, 0.05], [0., 0.1, 0.2, 0.5], ["dimin_adapt"], ["quadratic_logarithmic"], + [[1e-1, 1.], [1e-1, 100.]], [0., 0.1, 0.2, 0.5], - [0.9, 1.0, 1.1], + # [0.9, 1.0, 1.1], [2.] ) ] @@ -138,18 +137,20 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): "primal__lr": lr, "dual__lr": dual_lr, "dual__penalty": penalty, - "dual__momentum": dual_momentum, + # "dual__momentum": dual_momentum, "moreau__mu": moreau_mu } for ( lr, - dual_lr, penalty, dual_momentum, + dual_lr, + penalty, + # dual_momentum, moreau_mu ) in product ( [0.001, 0.005, 0.01, 0.05], [0.001, 0.005, 0.01, 0.05], [0., 1.], - [0., 0.1, 0.2, 0.5], + # [0., 0.1, 0.2, 0.5], [2.] ) ] @@ -174,7 +175,7 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): alm_max_grid = alm_grid alm_slack_grid = alm_grid - adam_grid = [{"lr": lr} for lr in [0.005, 0.01, 0.05]] + adam_grid = [{"lr": lr} for lr in [0.001, 0.005, 0.01, 0.05]] # Determine constraint function and parameters based on task fuse_loss_constraint = False @@ -215,8 +216,50 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): # Run experiments + if 'adam' in task_cfg.algorithms: + seed = seed + torch.manual_seed(seed) + _, adam_history_train, adam_history_val = run_grid( + m=m, + primal_opt=torch.optim.Adam, + dual_opt=None, + param_grid=adam_grid, + n_epochs=n_epochs, + constraint_fn=constraint_fn, + constraint_bound=constraint_bound, + dataloader=dataloader_train, + data_train=(features_train, sens_train, labels_train), + data_val=data_val, + mode='torch', + verbose=False, + constraints_to_eq=False, + use_slack=False, + fuse_loss_constraint=fuse_loss_constraint, + model_gen=create_model_fn, + model_kwargs=model_kwargs, + device=device, + criterion = criterion) + + best_adam_params = extract_best_params(adam_history_val, adam_grid, None, filter='none') + + print('\n------------\n') + print('adam') + print(best_adam_params[0], best_adam_params[1]) + print(f'loss: {best_adam_params[2]}') + print(f'max c: {best_adam_params[3]}') + print('\n------------\n') + grid_adam = pd.DataFrame(adam_grid) + runs_adam_train = runs_to_df(adam_history_train) + runs_adam_train.to_csv(f'{result_dir}/runs_adam_train.csv') + runs_adam_val = runs_to_df(adam_history_val) + runs_adam_val.to_csv(f'{result_dir}/runs_adam_val.csv') + grid_adam.to_csv(f'{result_dir}/grid_adam.csv') + del adam_history_train, adam_history_val, runs_adam_train, runs_adam_val, grid_adam + ################################################################# if 'pbm' in task_cfg.algorithms: + seed = seed + torch.manual_seed(seed) _, pbm_history_train, pbm_history_val = run_grid( m=m, primal_opt=torch.optim.Adam, @@ -233,7 +276,7 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): constraints_to_eq=False, use_slack=False, fuse_loss_constraint=fuse_loss_constraint, - model_gen=create_model, + model_gen=create_model_fn, model_kwargs=model_kwargs, device=device, criterion=criterion) @@ -255,6 +298,8 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): del pbm_history_train, pbm_history_val, runs_pbm_train, runs_pbm_val, grid_pbm if 'alm_slack' in task_cfg.algorithms: + seed = seed + torch.manual_seed(seed) _, alm_history_train, alm_history_val = run_grid( m=m, primal_opt=torch.optim.Adam, @@ -271,7 +316,7 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): constraints_to_eq=True, use_slack=True, fuse_loss_constraint=fuse_loss_constraint, - model_gen=create_model, + model_gen=create_model_fn, model_kwargs=model_kwargs, device=device, criterion = criterion) @@ -293,6 +338,8 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): del alm_history_train, alm_history_val, runs_alm_train, runs_alm_val, grid_alm if 'alm_max' in task_cfg.algorithms: + seed = seed + torch.manual_seed(seed) _, alm_history_train, alm_history_val = run_grid( m=m, primal_opt=torch.optim.Adam, @@ -309,7 +356,7 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): constraints_to_eq=True, use_slack=False, fuse_loss_constraint=fuse_loss_constraint, - model_gen=create_model, + model_gen=create_model_fn, model_kwargs=model_kwargs, device=device, criterion=criterion) @@ -331,6 +378,8 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): del alm_history_train, alm_history_val, runs_alm_train, runs_alm_val, grid_alm if 'ssg' in task_cfg.algorithms: + seed = seed + torch.manual_seed(seed) _, ssg_history_train, ssg_history_val = run_grid( m=m, primal_opt=torch.optim.Adam, @@ -347,7 +396,7 @@ def main(data_cfg, task_cfg, n_epochs, constraint_cfg, device): constraints_to_eq=False, use_slack=False, fuse_loss_constraint=fuse_loss_constraint, - model_gen=create_model, + model_gen=create_model_fn, model_kwargs=model_kwargs, device=device, criterion=criterion) @@ -380,8 +429,9 @@ def hydra_main(cfg: DictConfig): print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'No GPU') torch.set_default_device(device) constraint_cfg = OmegaConf.to_container(task_cfg.constraint, resolve=True) + seed = task_cfg.seed - main(data_cfg, task_cfg, n_epochs, constraint_cfg, device) + main(data_cfg, task_cfg, n_epochs, constraint_cfg, device, seed) diff --git a/benchmark/tinyimagenet_folktables/adam_config.yaml b/benchmark/tinyimagenet_folktables/adam_config.yaml new file mode 100644 index 0000000..5ad545a --- /dev/null +++ b/benchmark/tinyimagenet_folktables/adam_config.yaml @@ -0,0 +1,2 @@ +,algorithm,primal__lr,primal__weight_decay +7c3fe4eff95d,adam,0.0001,0.01 diff --git a/benchmark/tinyimagenet_folktables/alm_max_config.yaml b/benchmark/tinyimagenet_folktables/alm_max_config.yaml new file mode 100644 index 0000000..01853ab --- /dev/null +++ b/benchmark/tinyimagenet_folktables/alm_max_config.yaml @@ -0,0 +1,2 @@ +,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay +1e87d660012c,alm_max,0.0005,0.0005,0.0,0.1,0.01 diff --git a/benchmark/tinyimagenet_folktables/multirun.yaml b/benchmark/tinyimagenet_folktables/multirun.yaml new file mode 100644 index 0000000..966d71b --- /dev/null +++ b/benchmark/tinyimagenet_folktables/multirun.yaml @@ -0,0 +1,218 @@ +hydra: + run: + dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} + sweep: + dir: multirun/${task.task}_${data.name} + subdir: ./${algorithm.algorithm} + launcher: + submitit_folder: ${hydra.sweep.dir}/.submitit/%j + timeout_min: 60 + cpus_per_task: 4 + gpus_per_node: null + tasks_per_node: 1 + mem_gb: null + nodes: 1 + name: ${hydra.job.name} + stderr_to_stdout: false + _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher + partition: h200fast + qos: null + comment: null + constraint: null + exclude: null + gres: gpu=1 + cpus_per_gpu: null + gpus_per_task: null + mem_per_gpu: null + mem_per_cpu: 20G + account: null + signal_delay_s: 120 + max_num_timeout: 0 + additional_parameters: {} + array_parallelism: 256 + setup: null + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: 85 + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: MULTIRUN + searchpath: [] + callbacks: {} + output_subdir: null + overrides: + hydra: + - hydra.mode=MULTIRUN + task: + - algorithm=alm_slack + - algorithm.primal__lr=0.001 + - +algorithm.primal__weight_decay=0.01 + - algorithm.dual__lr=0.0005 + - algorithm.dual__penalty=0. + - algorithm.moreau__mu=1. + - seed=0,1,2 + - task=tinyimagenet + - data=income_sex + - use_test=true + - n_epochs=30 + job: + name: run_single_experiment + chdir: false + override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0005,algorithm.dual__penalty=0.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.001,algorithm=alm_slack,data=income_sex,n_epochs=30,seed=0,1,2,task=tinyimagenet,use_test=true + id: ??? + num: ??? + config_name: experiment + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.3' + cwd: /mnt/personal/kliacand/humancompatible-train/benchmark + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: ??? + choices: + algorithm: alm_slack + data: income_sex + task: tinyimagenet + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: configured_submitit_slurm_h200 + hydra/output: default + verbose: false +task: + task: tinyimagenet + batch_size: 1200 + constraint: + name: LossPairwise + bound: 0.1 + loss: CrossEntropyLoss +data: + name: folktables + kwargs: + sens_attrs: + - SEX + states: + - VA + extend_groups: false +algorithm: + algorithm: alm_slack + primal__lr: 0.001 + dual__lr: 0.0005 + dual__penalty: 0.0 + moreau__mu: 1.0 + primal__weight_decay: 0.01 +n_epochs: 30 +seed: 0 +use_test: true diff --git a/benchmark/tinyimagenet_folktables/pbm_dimin_config.yaml b/benchmark/tinyimagenet_folktables/pbm_dimin_config.yaml new file mode 100644 index 0000000..42d712d --- /dev/null +++ b/benchmark/tinyimagenet_folktables/pbm_dimin_config.yaml @@ -0,0 +1,3 @@ +,algorithm,dual__delta,dual__gamma,dual__pbf,dual__penalty_mult,dual__penalty_update,init_duals,moreau__mu,primal__lr,primal__weight_decay +985d15a255fc,pbm_dimin,1.0,0.9500000000000001,quadratic_reciprocal,1,const,1e-05,1.0,0.0005,0.01 +00301b66238d,pbm_dimin,1.0,0.1,quadratic_reciprocal,0.9999,dimin,,1.0,0.0005,0.01 diff --git a/benchmark/utils.py b/benchmark/utils.py index 0cc85f5..7696093 100644 --- a/benchmark/utils.py +++ b/benchmark/utils.py @@ -5,6 +5,7 @@ import numpy as np from torch import nn from torch.nn import Sequential +from torchvision import models # define the network class ConvNet(nn.Module): @@ -26,6 +27,19 @@ def forward(self, x): x = self.fc3(x) return x +def create_efficientnet(num_classes=200): + """EfficientNet-B0 from scratch (no pretrained weights).""" + model = models.efficientnet_b0(weights=None) + # Replace classifier head for 200-class TinyImageNet + in_features = model.classifier[1].in_features + model.classifier[1] = nn.Linear(in_features, num_classes) + return model + + +def create_resnet(): + import torchvision + return torchvision.models.resnet18(pretrained=False) + def create_conv_model(): return ConvNet() @@ -128,10 +142,7 @@ def run_train( constraint_tol: float = 0., criterion = None, ): - # Use provided criterion or fall back to global - if criterion is None: - criterion = globals()['criterion'] - + print(f"Starting on {device}") model = model_gen(**model_kwargs) primal_params = {k.removeprefix('primal__'): v for k, v in param_set.items() if k.startswith('primal__')} @@ -158,8 +169,8 @@ def run_train( bounds = torch.tensor([constraint_bound]*m).to(device) - torch.sum(model(data_train[0][0].unsqueeze(0))).backward() - model.zero_grad() + # torch.sum(model(data_train[0][0].unsqueeze(0))).backward() + # model.zero_grad() if mode == 'hc': history = train_loop_primal_dual( @@ -249,20 +260,25 @@ def train_loop_sw( epoch_losses = [] epoch_constraints = [] + epoch_accuracies = [] epoch_constraint_time = 0.0 if epoch == 0: model.eval() + train_start_time = time.perf_counter() for batch_features, batch_sens_attrs, batch_labels in train_dataloader: batch_features = batch_features.to(device) batch_sens_attrs = batch_sens_attrs.to(device) batch_labels = batch_labels.to(device) batch_out = model(batch_features) - constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, None) loss = loss_fn(batch_out, batch_labels) - train_start_time = time.perf_counter() + constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, loss) + batch_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, batch_out) + if loss.dim() > 0: # If loss is not aggregated + loss = loss.mean() epoch_losses.append(loss.detach().cpu().numpy().item()) epoch_constraints.append(constraints.detach().cpu().numpy()) + epoch_accuracies.append(batch_acc) else: # Training phase model.train() @@ -285,6 +301,7 @@ def train_loop_sw( constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, None) epoch_constraint_time += time.perf_counter() - constraint_start + batch_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, batch_out) max_constraint = max(constraints_bounded_eq) # constraint step if violated @@ -292,14 +309,19 @@ def train_loop_sw( max_constraint.backward() dual_optimizer.step() loss = loss_fn(batch_out, batch_labels) + if loss.dim() > 0: + loss = loss.mean() else: loss = loss_fn(batch_out, batch_labels) + if loss.dim() > 0: + loss = loss.mean() loss.backward() optimizer.step() epoch_losses.append(loss.detach().cpu().numpy().item()) epoch_constraints.append(constraints.detach().cpu().numpy()) + epoch_accuracies.append(batch_acc) # Stop training timer train_end_time = time.perf_counter() @@ -312,19 +334,21 @@ def train_loop_sw( eval_dict = { "epoch": epoch, "time": train_time, - "loss": np.mean(epoch_losses) + "loss": np.mean(epoch_losses), + "acc": np.mean(epoch_accuracies, axis=0) } | { f"c_{j}": c for j, c in enumerate(np.mean(epoch_constraints, axis=0)) } history_train.append(eval_dict) # Validation phase model.eval() - val_loss, val_constraints = validate_model(model, val_data, loss_fn, constraint_fn, device) + val_loss, val_constraints, val_acc = validate_model(model, val_data, loss_fn, constraint_fn, device) eval_dict = { "epoch": epoch, "time": train_time, - "loss": val_loss + "loss": val_loss, + "acc": val_acc } | { f"c_{j}": c for j, c in enumerate(val_constraints) } @@ -373,20 +397,28 @@ def train_loop_primal_dual( model.train() epoch_losses = [] epoch_constraints = [] + epoch_accuracies = [] epoch_constraint_time = 0.0 if epoch == 0: model.eval() + train_start_time = time.perf_counter() for batch_features, batch_sens_attrs, batch_labels in train_dataloader: batch_features = batch_features.to(device) batch_sens_attrs = batch_sens_attrs.to(device) batch_labels = batch_labels.to(device) batch_out = model(batch_features) - constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, None) loss = loss_fn(batch_out, batch_labels) - train_start_time = time.perf_counter() + # print(loss) + constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, loss) + batch_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, batch_out) + # print(constraints) + # print(constraints_bounded_eq) + if loss.dim() > 0: # If loss is not aggregated + loss = loss.mean() epoch_losses.append(loss.detach().cpu().numpy().item()) epoch_constraints.append(constraints.detach().cpu().numpy()) + epoch_accuracies.append(batch_acc) model.train() else: # Start training timer @@ -408,10 +440,12 @@ def train_loop_primal_dual( # Compute constraints # if not timing constraints, we just log the time and then subtract it at the end. constraint_start = time.perf_counter() + # print(loss) constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, slack_vars, batch_sens_attrs, batch_labels, batch_out, loss) epoch_constraint_time += time.perf_counter() - constraint_start - if mode != 'sw' and loss.dim() > 0: # If loss is not aggregated + batch_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, batch_out) + if loss.dim() > 0: # If loss is not aggregated loss = loss.mean() lgr = dual_optimizer.forward_update(loss, constraints_bounded_eq) @@ -420,6 +454,7 @@ def train_loop_primal_dual( epoch_losses.append(loss.detach().cpu().numpy().item()) epoch_constraints.append(constraints.detach().cpu().numpy()) + epoch_accuracies.append(batch_acc) # Stop training timer train_end_time = time.perf_counter() @@ -432,23 +467,23 @@ def train_loop_primal_dual( eval_dict = { "epoch": epoch, "time": train_time, - "loss": np.mean(epoch_losses) + "loss": np.mean(epoch_losses), + "acc": np.mean(epoch_accuracies, axis=0) } | { f"c_{j}": c for j, c in enumerate(np.mean(epoch_constraints, axis=0)) } - history_train.append(eval_dict) # Validation phase model.eval() - val_loss, val_constraints = validate_model(model, val_data, loss_fn, constraint_fn, device) + val_loss, val_constraints, val_acc = validate_model(model, val_data, loss_fn, constraint_fn, device) eval_dict = { "epoch": epoch, "time": train_time, - "loss": val_loss + "loss": val_loss, + "acc": val_acc } | { f"c_{j}": c for j, c in enumerate(val_constraints) } - history_val.append(eval_dict) return model, history_train, history_val @@ -488,20 +523,25 @@ def train_loop_adam( model.train() epoch_losses = [] epoch_constraints = [] + epoch_accuracies = [] epoch_constraint_time = 0.0 if epoch == 0: model.eval() + train_start_time = time.perf_counter() for batch_features, batch_sens_attrs, batch_labels in train_dataloader: batch_features = batch_features.to(device) batch_sens_attrs = batch_sens_attrs.to(device) batch_labels = batch_labels.to(device) batch_out = model(batch_features) - constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, None) loss = loss_fn(batch_out, batch_labels) - train_start_time = time.perf_counter() + constraints, constraints_bounded_eq = calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, None, batch_sens_attrs, batch_labels, batch_out, loss) + batch_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, batch_out) + if loss.dim() > 0: # If loss is not aggregated + loss = loss.mean() epoch_losses.append(loss.detach().cpu().numpy().item()) epoch_constraints.append(constraints.detach().cpu().numpy()) + epoch_accuracies.append(batch_acc) model.train() else: # Start training timer @@ -526,6 +566,7 @@ def train_loop_adam( if not time_constraint_computation: # time constraint separately to subtract it from total time later epoch_constraint_time += time.perf_counter() - constraint_start + batch_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, batch_out) if loss.dim() > 0: # If loss is not aggregated loss = loss.mean() @@ -540,6 +581,7 @@ def train_loop_adam( epoch_losses.append(loss.detach().cpu().numpy().item()) epoch_constraints.append(constraints.detach().cpu().numpy()) + epoch_accuracies.append(batch_acc) # Stop training timer train_end_time = time.perf_counter() @@ -552,19 +594,21 @@ def train_loop_adam( eval_dict = { "epoch": epoch, "time": train_time, - "loss": np.mean(epoch_losses) + "loss": np.mean(epoch_losses), + "acc": np.mean(epoch_accuracies, axis=0) } | { f"c_{j}": c for j, c in enumerate(np.mean(epoch_constraints, axis=0)) } history_train.append(eval_dict) # Validation phase model.eval() - val_loss, val_constraints = validate_model(model, val_data, loss_fn, constraint_fn, device) + val_loss, val_constraints, val_acc = validate_model(model, val_data, loss_fn, constraint_fn, device) eval_dict = { "epoch": epoch, "time": train_time, - "loss": val_loss + "loss": val_loss, + "acc": val_acc } | { f"c_{j}": c for j, c in enumerate(val_constraints) } @@ -577,6 +621,7 @@ def train_loop_adam( def validate_model(model, val_data, loss_fn, constraint_fn, device): val_losses = [] val_constraints_list = [] + val_accuracies_list = [] with torch.no_grad(): if isinstance(val_data, torch.utils.data.DataLoader): # Use dataloader batches @@ -591,9 +636,11 @@ def validate_model(model, val_data, loss_fn, constraint_fn, device): val_loss = val_loss.mean() val_constraints = constraint_fn(model, val_out, batch_sens_attrs, batch_labels) + val_acc = calc_perclass_acc(batch_sens_attrs, batch_labels, val_out) # val_constraints -= constraint_bounds val_losses.append(val_loss.detach().cpu().numpy().item()) val_constraints_list.append(val_constraints.detach().cpu().numpy()) + val_accuracies_list.append(val_acc) else: # Use full validation dataset val_features, val_sens_attrs, val_labels = val_data @@ -607,12 +654,15 @@ def validate_model(model, val_data, loss_fn, constraint_fn, device): val_loss = val_loss.mean() val_constraints = constraint_fn(model, val_out, val_sens_attrs, val_labels) + val_acc = calc_perclass_acc(val_sens_attrs, val_labels, val_out) val_losses.append(val_loss.detach().cpu().numpy().item()) val_constraints_list.append(val_constraints.detach().cpu().numpy()) + val_accuracies_list.append(val_acc) val_losses = np.mean(val_losses) val_constraints_list = np.mean(val_constraints_list, axis=0) - return val_losses, val_constraints_list + val_accuracies = np.mean(val_accuracies_list, axis=0) + return val_losses, val_constraints_list, val_accuracies def calc_constraints(model, constraint_fn, constraint_bounds, constraint_options, slack_vars, batch_sens, batch_labels, batch_out, loss=None): @@ -629,3 +679,34 @@ def calc_constraints(model, constraint_fn, constraint_bounds, constraint_options constraints_bounded_eq = (constraints - constraint_bounds) return constraints, constraints_bounded_eq + +def calc_perclass_acc(batch_classes_onehot, batch_labels, batch_out): + """ + Efficiently calculate per-class accuracy. + + Args: + batch_classes_onehot: shape (batch_size, n_classes), one-hot encoding of class membership + batch_labels: shape (batch_size,), ground truth labels + batch_out: shape (batch_size, n_classes), logits from model + + Returns: + per_class_acc: shape (n_classes,), accuracy for each class + """ + # Get predictions from logits + predictions = torch.argmax(batch_out, dim=1) + + # Check if predictions match labels + if batch_labels.ndim > predictions.ndim: + batch_labels = batch_labels.squeeze() + correct = (predictions == batch_labels).float() # shape (batch_size,) + + # Number of samples per class + n_samples_per_class = batch_classes_onehot.sum(dim=0) # shape (n_classes,) + + # Sum correct predictions per class using matrix multiplication + correct_per_class = batch_classes_onehot.T @ correct # shape (n_classes,) + + # Calculate per-class accuracy, avoid division by zero + per_class_acc = correct_per_class / (n_samples_per_class + 1e-8) + + return per_class_acc.detach().cpu().numpy() From 2c9030d9baef89d1f4c1b7406bc754a5d98b792a Mon Sep 17 00:00:00 2001 From: andrewklayk Date: Fri, 22 May 2026 11:29:51 +0200 Subject: [PATCH 11/16] refactoring, add inexact-alm --- .../train/dual_optim/__init__.py | 3 +- src/humancompatible/train/dual_optim/alm.py | 133 +++++--- .../train/dual_optim/barrier.py | 39 ++- src/humancompatible/train/dual_optim/ialm.py | 287 ++++++++++++++++++ .../train/dual_optim/moreau.py | 38 ++- src/humancompatible/train/dual_optim/pbm.py | 287 +++++++++++++----- 6 files changed, 633 insertions(+), 154 deletions(-) create mode 100644 src/humancompatible/train/dual_optim/ialm.py diff --git a/src/humancompatible/train/dual_optim/__init__.py b/src/humancompatible/train/dual_optim/__init__.py index 37ecb26..5dafcbd 100644 --- a/src/humancompatible/train/dual_optim/__init__.py +++ b/src/humancompatible/train/dual_optim/__init__.py @@ -1,3 +1,4 @@ from .alm import ALM +from .ialm import iALM from .pbm import PBM -from .moreau import MoreauEnvelope \ No newline at end of file +from .moreau import MoreauEnvelope diff --git a/src/humancompatible/train/dual_optim/alm.py b/src/humancompatible/train/dual_optim/alm.py index dec03c6..cc270cb 100644 --- a/src/humancompatible/train/dual_optim/alm.py +++ b/src/humancompatible/train/dual_optim/alm.py @@ -1,10 +1,11 @@ import torch from torch.nn import Parameter from torch.optim import Optimizer -from typing import Any, Iterable, Tuple -from torch import clamp_, Tensor, no_grad -from torch.optim.optimizer import _use_grad_for_differentiable +from typing import Any, Tuple +from torch import clamp_, Tensor +# cite: Stochastic Smoothed Primal-Dual Algorithms for Nonconvex Optimization with Linear Inequality Constraints +# https://arxiv.org/pdf/2504.07607 class ALM(Optimizer): def __init__( @@ -15,16 +16,17 @@ def __init__( penalty: float = 1.0, *, dual_range: Tuple[float, float] = (0.0, 100.0), - momentum: float = 0., - dampening: float = 0., - device = None + momentum: float = 0.0, + dampening: float = 0.0, + ctol: float = 1e-4, + device=None, ) -> None: """ A wrapper over a PyTorch`Optimizer` that works on the dual maximization tasks according to the Augmented Lagrangian rule. Creates and updates dual variables. :param m: Number of constraints (determines the number of dual variables to create) :type m: int - :param lr: Dual variable update rate + :param lr: Dual variable update rate :type lr: float :param init_duals: Initial values for the new dual variables. Defaults to 0 for all. :type init_duals: float | Tensor @@ -36,21 +38,32 @@ def __init__( :type momentum: float :param dampening: Dampening for momentum. Equivalent to SGD dampening. Set to `0` to disable. :type dampening: float + :param ctol: Constraint tolerance; allows tiny violations of constraints to account for noise. + :type ctol: float """ if momentum > 0 and dampening == 0: dampening = momentum - + self.dual_range = dual_range - + self.ctol = ctol + self.penalty = penalty - duals, defaults = self._init_constraint_group(m, lr, momentum, dampening, init_duals, dual_range, device) - + duals, defaults = self._init_constraint_group( + m, lr, momentum, dampening, init_duals, dual_range, device + ) + super().__init__(duals, defaults) @staticmethod def _init_constraint_group( - m: int = None, lr: float = None, momentum: float = None, dampening: float = None, init_duals: float | Tensor = None, dual_range: Tuple[float, float] = None, device = None + m: int = None, + lr: float = None, + momentum: float = None, + dampening: float = None, + init_duals: float | Tensor = None, + dual_range: Tuple[float, float] = None, + device=None, ): ## checks ## if init_duals is None and m is None: @@ -58,23 +71,27 @@ def _init_constraint_group( if momentum is not None and (momentum < 0 or momentum > 1): raise ValueError(f"`momentum`must be within [0,1]; got {momentum}") - + m = m if m is not None else len(init_duals) - - if init_duals is None: # initialize duals if not set or set to scalar - init_duals = torch.zeros(m, requires_grad=False, device=device) + dual_range[0] + + if init_duals is None: # initialize duals if not set or set to scalar + init_duals = ( + torch.zeros(m, requires_grad=False, device=device) + dual_range[0] + ) elif isinstance(init_duals, float): init_duals = torch.zeros(m, requires_grad=False, device=device) + init_duals - + duals = Parameter(init_duals, requires_grad=False) settings_dict = { "lr": lr, "momentum": momentum, "dampening": dampening, - "momentum_buffer": torch.zeros_like(init_duals, requires_grad = False, device=device), + "momentum_buffer": torch.zeros_like( + init_duals, requires_grad=False, device=device + ), } - settings_dict = {k:v for k,v in settings_dict.items() if v is not None} + settings_dict = {k: v for k, v in settings_dict.items() if v is not None} param_group = ([duals], settings_dict) return param_group @@ -88,7 +105,12 @@ def duals(self) -> Tensor: return torch.cat([group["params"][0] for group in self.param_groups]) def add_constraint_group( - self, m: int = None, lr: float = None, momentum: float = None, dampening: float = None, init_duals: Tensor = None + self, + m: int = None, + lr: float = None, + momentum: float = None, + dampening: float = None, + init_duals: Tensor = None, ) -> None: """ Allows to add a group of dual variables with separate initial values and learning rates. @@ -100,15 +122,16 @@ def add_constraint_group( :param init_duals: Initial values for the new dual variables :type init_duals: Tensor """ - duals, settings_dict = self._init_constraint_group(m, lr, momentum, dampening, init_duals, self.dual_range) + duals, settings_dict = self._init_constraint_group( + m, lr, momentum, dampening, init_duals, self.dual_range + ) param_group_dict = {"params": duals, **settings_dict} self.add_param_group(param_group_dict) - def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: """ Calculates and returns the Augmented Lagrangian. - + :param loss: Loss (objective function) value :type loss: Tensor :param constraints: Tensor of constraint values @@ -120,17 +143,14 @@ def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: lagrangian.add_(loss) for i, group in enumerate(self.param_groups): duals = group["params"][0] - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] + group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol lagrangian.add_(duals @ group_constraints) if self.penalty > 0: - lagrangian.add_( - 0.5 * self.penalty * torch.dot(constraints, constraints) - ) + lagrangian.add_(0.5 * self.penalty * torch.dot(constraints - self.ctol, constraints - self.ctol)) return lagrangian - def update(self, constraints: Tensor) -> None: """""" """ @@ -140,18 +160,25 @@ def update(self, constraints: Tensor) -> None: :type constraints: Tensor """ for i, group in enumerate(self.param_groups): - duals, lr, momentum, dampening, momentum_buffer = group["params"][0], group["lr"], group["momentum"], group["dampening"], group["momentum_buffer"] - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] + duals, lr, momentum, dampening, momentum_buffer = ( + group["params"][0], + group["lr"], + group["momentum"], + group["dampening"], + group["momentum_buffer"], + ) + group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol with torch.no_grad(): - _update_duals(duals, group_constraints, lr, momentum, dampening, momentum_buffer) + _update_duals( + duals, group_constraints, lr, momentum, dampening, momentum_buffer + ) clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) - # evaluate the Lagrangian and update the dual variables def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: """ Combines `forward` and `update`; slightly faster. - + :param loss: Loss (objective function) value :type loss: Tensor :param constraints: Tensor of constraint values @@ -162,29 +189,38 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: lagrangian = torch.zeros_like(loss) lagrangian.add_(loss) for i, group in enumerate(self.param_groups): - duals, lr, momentum, dampening, momentum_buffer = group["params"][0], group["lr"], group["momentum"], group["dampening"], group["momentum_buffer"] - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] + duals, lr, momentum, dampening, momentum_buffer = ( + group["params"][0], + group["lr"], + group["momentum"], + group["dampening"], + group["momentum_buffer"], + ) + group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol with torch.no_grad(): - _update_duals(duals, group_constraints, lr, momentum, dampening, momentum_buffer) + _update_duals( + duals, group_constraints, lr, momentum, dampening, momentum_buffer + ) clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) lagrangian.add_(duals @ group_constraints) if self.penalty > 0: - lagrangian.add_( - 0.5 * self.penalty * torch.dot(constraints, constraints) - ) + lagrangian.add_(0.5 * self.penalty * torch.dot(constraints - self.ctol, constraints - self.ctol)) return lagrangian def state_dict(self) -> dict[str, Any]: - + state_dict = super().state_dict() state_dict["state"]["penalty"] = self.penalty state_dict["state"]["dual_range"] = self.dual_range # save params themselves in state_dict instead of param ID in default PyTorch - for id_pg, pg in enumerate(state_dict['param_groups']): - pg['params'] = [self.param_groups[id_pg]['params'][param_id] for param_id in pg['params'] ] + for id_pg, pg in enumerate(state_dict["param_groups"]): + pg["params"] = [ + self.param_groups[id_pg]["params"][param_id] + for param_id in pg["params"] + ] return state_dict def load_state_dict(self, state_dict: dict[str, Any]) -> None: @@ -196,9 +232,16 @@ def load_state_dict(self, state_dict: dict[str, Any]) -> None: self.param_groups.append(param) -def _update_duals(duals: Tensor, constraints: Tensor, lr: float, momentum: float, dampening: float, buffer: Tensor) -> None: +def _update_duals( + duals: Tensor, + constraints: Tensor, + lr: float, + momentum: float, + dampening: float, + buffer: Tensor, +) -> None: if momentum == 0: buffer = constraints else: - buffer.mul_(momentum).add_(constraints, alpha = 1 - dampening) - duals.add_(buffer, alpha = lr) + buffer.mul_(momentum).add_(constraints, alpha=1 - dampening) + duals.add_(buffer, alpha=lr) diff --git a/src/humancompatible/train/dual_optim/barrier.py b/src/humancompatible/train/dual_optim/barrier.py index 6a78d26..512444c 100644 --- a/src/humancompatible/train/dual_optim/barrier.py +++ b/src/humancompatible/train/dual_optim/barrier.py @@ -8,23 +8,22 @@ """ + def exponential_penalty(t): return torch.exp(t) - 1.0 + def modified_log_barrier(t): - return -torch.log(1-t) + return -torch.log(1 - t) + def augmented_lagrangian(t): """ Vectorized version of augmented_lagrangian """ - return torch.where( - t >= -1, - t + 0.5 * torch.square(t), - -0.5 * torch.ones_like(t) - ) + return torch.where(t >= -1, t + 0.5 * torch.square(t), -0.5 * torch.ones_like(t)) def quad_log(t): @@ -36,7 +35,7 @@ def quad_log(t): mask = t >= -0.5 out[mask] = t[mask] + 0.5 * torch.pow(t[mask], 2) - out[~mask] = -0.25 * torch.log(-2 * t[~mask]) - 3/8 + out[~mask] = -0.25 * torch.log(-2 * t[~mask]) - 3 / 8 return out @@ -48,27 +47,26 @@ def quad_recipr(t): out = torch.empty_like(t) - mask = t >= -1/3 + mask = t >= -1 / 3 out[mask] = t[mask] + 0.5 * torch.pow(t[mask], 2) - out[~mask] = (32/27) * (1 / (1 - t[~mask])) - 7/6 + out[~mask] = (32 / 27) * (1 / (1 - t[~mask])) - 7 / 6 + + return out - return out def exponential_penalty_derivative(t): - return torch.exp(t) + return torch.exp(t) + def modified_log_barrier_derivative(t): - return 1 / (1-t) + return 1 / (1 - t) + def aug_lagr_der(t): - return torch.where( - t >= -1, - 1 + t, - torch.zeros_like(t) - ) + return torch.where(t >= -1, 1 + t, torch.zeros_like(t)) def quad_log_der(t): @@ -81,12 +79,13 @@ def quad_log_der(t): return out + def quad_recipr_der(t): out = torch.empty_like(t) - mask = t >= -1/3 + mask = t >= -1 / 3 out[mask] = 1 + t[mask] - out[~mask] = (32/27) * (1 / torch.square(1 - t[~mask])) + out[~mask] = (32 / 27) * (1 / torch.square(1 - t[~mask])) - return out \ No newline at end of file + return out diff --git a/src/humancompatible/train/dual_optim/ialm.py b/src/humancompatible/train/dual_optim/ialm.py new file mode 100644 index 0000000..8446f0f --- /dev/null +++ b/src/humancompatible/train/dual_optim/ialm.py @@ -0,0 +1,287 @@ +import torch +from torch.nn import Parameter +from torch.optim import Optimizer +from typing import Any, Tuple +from torch import clamp_, Tensor + +# cite: Stochastic inexact augmented Lagrangian method for nonconvex expectation constrained optimization +# https://link.springer.com/content/pdf/10.1007/s10589-023-00521-z.pdf + +class iALM(Optimizer): + def __init__( + self, + m: int = None, + lr: float = 0.01, + init_duals: float | Tensor = None, + penalty: float = 1.0, + *, + dual_range: Tuple[float, float] = (0.0, 100.0), + momentum: float = 0.0, + dampening: float = 0.0, + beta: float = 1.0, + sigma: float = 1.0, + gamma: float = 1.0, + ctol: float = 1e-4, + device=None, + ) -> None: + """ + A wrapper over a PyTorch`Optimizer` that works on the dual maximization tasks according to the Augmented Lagrangian rule. Creates and updates dual variables. + + :param m: Number of constraints (determines the number of dual variables to create) + :type m: int + :param lr: Dual variable update rate + :type lr: float + :param init_duals: Initial values for the new dual variables. Defaults to 0 for all. + :type init_duals: float | Tensor + :param penalty: Augmented Lagrangian penalty parameter. Defaults to`1.` + :type penalty: float + :param dual_range: Safeguarding range for dual variables; they will be`clamp`-ed to this range. + :type dual_range: Tuple[float, float] + :param momentum: Momentum/Smoothing factor for dual variables. Equivalent to SGD momentum. Set to `0` to disable. + :type momentum: float + :param dampening: Dampening for momentum. Equivalent to SGD dampening. Set to `0` to disable. + :type dampening: float + :param beta: Dual variable update rate + :type beta: float + :param sigma: Multiplier for increasing`beta`. + :type sigma: float + :param gamma: Penalty update parameter + :type gamma: float + :param ctol: Constraint tolerance; value that allows tiny violations of constraints to account for noise. + :type ctol: float + """ + + if momentum > 0 and dampening == 0: + dampening = momentum + + self.dual_range = dual_range + + self.beta = beta + self.penalty = penalty + self.gamma = gamma + self.sigma = sigma + self.ctol = ctol + + duals, defaults = self._init_constraint_group( + m, lr, momentum, dampening, init_duals, dual_range, device + ) + + super().__init__(duals, defaults) + + @staticmethod + def _init_constraint_group( + m: int = None, + lr: float = None, + momentum: float = None, + dampening: float = None, + init_duals: float | Tensor = None, + dual_range: Tuple[float, float] = None, + device=None, + ): + ## checks ## + if init_duals is None and m is None: + raise ValueError("At least one of`m`,`init_duals` must be set") + + if momentum is not None and (momentum < 0 or momentum > 1): + raise ValueError(f"`momentum`must be within [0,1]; got {momentum}") + + m = m if m is not None else len(init_duals) + + if init_duals is None: # initialize duals if not set or set to scalar + init_duals = ( + torch.zeros(m, requires_grad=False, device=device) + dual_range[0] + ) + elif isinstance(init_duals, float): + init_duals = torch.zeros(m, requires_grad=False, device=device) + init_duals + + duals = Parameter(init_duals, requires_grad=False) + + settings_dict = { + "lr": lr, + "momentum": momentum, + "dampening": dampening, + "momentum_buffer": torch.zeros_like( + init_duals, requires_grad=False, device=device + ), + } + settings_dict = {k: v for k, v in settings_dict.items() if v is not None} + + param_group = ([duals], settings_dict) + return param_group + + @property + def duals(self) -> Tensor: + """ + :return: Dual variables, concatenated into a single tensor. + :rtype: Tensor + """ + return torch.cat([group["params"][0] for group in self.param_groups]) + + def add_constraint_group( + self, + m: int = None, + lr: float = None, + momentum: float = None, + dampening: float = None, + init_duals: Tensor = None, + ) -> None: + """ + Allows to add a group of dual variables with separate initial values and learning rates. + + :param m: Size of group (number of dual variables to add) + :type m: int + :param lr: Dual variable update rate + :type lr: float + :param init_duals: Initial values for the new dual variables + :type init_duals: Tensor + """ + duals, settings_dict = self._init_constraint_group( + m, lr, momentum, dampening, init_duals, self.dual_range + ) + param_group_dict = {"params": duals, **settings_dict} + self.add_param_group(param_group_dict) + + def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: + """ + Calculates and returns the Augmented Lagrangian. + + :param loss: Loss (objective function) value + :type loss: Tensor + :param constraints: Tensor of constraint values + :type constraints: Tensor + :return: Lagrangian + :rtype: Tensor + """ + lagrangian = torch.zeros_like(loss) + lagrangian.add_(loss) + for i, group in enumerate(self.param_groups): + duals, lr, momentum, dampening, momentum_buffer = ( + group["params"][0], + group["lr"], + group["momentum"], + group["dampening"], + group["momentum_buffer"], + ) + group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + lagrangian.add_(duals @ group_constraints) + + _update_c_buffers( + group_constraints, momentum, dampening, momentum_buffer + ) + + lagrangian.add_(0.5 * self.beta * torch.dot(constraints, constraints)) + + return lagrangian + + def update(self, constraints: Tensor) -> None: + """ + Updates the dual variables + + :param constraints: Tensor of constraint values + :type constraints: Tensor + """ + for i, group in enumerate(self.param_groups): + duals, lr, momentum, dampening, momentum_buffer = ( + group["params"][0], + group["lr"], + group["momentum"], + group["dampening"], + group["momentum_buffer"], + ) + group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + with torch.no_grad(): + _update_duals( + duals, group_constraints, lr, self.beta, self.gamma, momentum, dampening, momentum_buffer + ) + clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) + + self.beta *= self.sigma + + + # evaluate the Lagrangian and update the dual variables + def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: + """ + Combines `forward` and `update`; slightly faster. + + :param loss: Loss (objective function) value + :type loss: Tensor + :param constraints: Tensor of constraint values + :type constraints: Tensor + :return: Lagrangian + :rtype: Tensor + """ + lagrangian = torch.zeros_like(loss) + lagrangian.add_(loss) + for i, group in enumerate(self.param_groups): + duals, lr, momentum, dampening, momentum_buffer = ( + group["params"][0], + group["lr"], + group["momentum"], + group["dampening"], + group["momentum_buffer"], + ) + group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + with torch.no_grad(): + _update_c_buffers( + group_constraints, momentum, dampening, momentum_buffer + ) + _update_duals( + duals, group_constraints, lr, self.beta, self.gamma, momentum, dampening, momentum_buffer + ) + clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) + + lagrangian.add_(duals @ group_constraints) + + lagrangian.add_(0.5 * self.beta * torch.dot(constraints - self.ctol, constraints - self.ctol)) + + self.beta *= self.sigma + + return lagrangian + + def state_dict(self) -> dict[str, Any]: + + state_dict = super().state_dict() + state_dict["state"]["penalty"] = self.penalty + state_dict["state"]["dual_range"] = self.dual_range + # save params themselves in state_dict instead of param ID in default PyTorch + for id_pg, pg in enumerate(state_dict["param_groups"]): + pg["params"] = [ + self.param_groups[id_pg]["params"][param_id] + for param_id in pg["params"] + ] + return state_dict + + def load_state_dict(self, state_dict: dict[str, Any]) -> None: + self.penalty = state_dict["state"]["penalty"] + self.dual_range = state_dict["state"]["dual_range"] + params = state_dict["param_groups"] + self.param_groups = [] + for param in params: + self.param_groups.append(param) + + +def _update_c_buffers( + constraints: Tensor, + momentum: float, + dampening: float, + buffer: Tensor, +): + if momentum == 0: + buffer = constraints + else: + buffer.mul_(momentum).add_(constraints, alpha=1 - dampening) + + +def _update_duals( + duals: Tensor, + constraints: Tensor, + lr: float, + beta: float, + gamma: float, + momentum: float, + dampening: float, + buffer: Tensor, +) -> None: + + update_mult = min(beta, gamma/(buffer @ buffer)) + duals.add_(buffer, alpha=update_mult) diff --git a/src/humancompatible/train/dual_optim/moreau.py b/src/humancompatible/train/dual_optim/moreau.py index a964857..a6269f7 100644 --- a/src/humancompatible/train/dual_optim/moreau.py +++ b/src/humancompatible/train/dual_optim/moreau.py @@ -1,6 +1,5 @@ import torch from torch.optim import Optimizer -from torch.optim.optimizer import _use_grad_for_differentiable class MoreauEnvelope(Optimizer): @@ -8,7 +7,7 @@ def __init__( self, optimizer: torch.optim.Optimizer, *, - mu: float = 2., + mu: float = 2.0, beta: float = 0.5, ) -> None: """ @@ -26,24 +25,33 @@ def __init__( self.mu, self.beta = mu, beta if mu < 0: - raise ValueError(f"The smoothing parameter`mu`must be non-negative, got {mu}.") + raise ValueError( + f"The smoothing parameter`mu`must be non-negative, got {mu}." + ) else: self.smoothing_buffer = [] for param_group in optimizer.param_groups: - self.smoothing_buffer.append({'params': []}) - for _, param in enumerate(param_group['params']): - self.smoothing_buffer[-1]['params'].append(param.clone().detach()) + self.smoothing_buffer.append({"params": []}) + for _, param in enumerate(param_group["params"]): + self.smoothing_buffer[-1]["params"].append(param.clone().detach()) def step(self) -> None: with torch.no_grad(): # add smoothing term gradient to the gradient w.r.t. primal params, and update smoothing params before optimizer step - for param_group, smoothing_buffer_group in zip(self.optimizer.param_groups, self.smoothing_buffer): - for param, smoothing_buffer in zip(param_group["params"], smoothing_buffer_group['params']): - param.grad.add_(param, alpha=self.mu).add_(smoothing_buffer, alpha=-self.mu) - smoothing_buffer.add_(smoothing_buffer, alpha=-self.beta).add_(param, alpha=self.beta) - - self.optimizer.step() + for param_group, smoothing_buffer_group in zip( + self.optimizer.param_groups, self.smoothing_buffer + ): + for param, smoothing_buffer in zip( + param_group["params"], smoothing_buffer_group["params"] + ): + param.grad.add_(param, alpha=self.mu).add_( + smoothing_buffer, alpha=-self.mu + ) + smoothing_buffer.add_(smoothing_buffer, alpha=-self.beta).add_( + param, alpha=self.beta + ) + self.optimizer.step() def __getattr__(self, name): # Delegate to the wrapped object @@ -54,8 +62,10 @@ def __getattr__(self, name): else: # If it's a method, bind it to self.optimizer if callable(attr): + def method(*args, **kwargs): return attr(self.optimizer, *args, **kwargs) + return method else: return attr @@ -72,7 +82,7 @@ def method(*args, **kwargs): # def load_state_dict(self, state_dict: dict[str, Any]) -> None: # primal_state_dict = state_dict["primal"] # self.primal_optimizer.load_state_dict(primal_state_dict) - + # dual_state_dict = state_dict["dual"] # self.penalty = dual_state_dict["state"]["penalty"] # self.dual_range = dual_state_dict["state"]["dual_range"] @@ -80,4 +90,4 @@ def method(*args, **kwargs): # params = dual_state_dict["param_groups"] # self.param_groups = [] # for param in params: - # self.param_groups.append(param) \ No newline at end of file + # self.param_groups.append(param) diff --git a/src/humancompatible/train/dual_optim/pbm.py b/src/humancompatible/train/dual_optim/pbm.py index 6ee38ec..71801d4 100644 --- a/src/humancompatible/train/dual_optim/pbm.py +++ b/src/humancompatible/train/dual_optim/pbm.py @@ -1,15 +1,10 @@ import torch from torch.nn import Parameter from torch.optim import Optimizer -from typing import Any, Iterable, Tuple, Callable -from torch import clamp_, Tensor, no_grad -from torch.optim.optimizer import _use_grad_for_differentiable -from .barrier import ( - quad_log, - quad_log_der, - quad_recipr, - quad_recipr_der -) +from typing import Any, Tuple, Callable +from torch import clamp_, Tensor +from .barrier import quad_log, quad_log_der, quad_recipr, quad_recipr_der + class PBM(Optimizer): def __init__( @@ -18,15 +13,15 @@ def __init__( penalty_mult: float = 0.1, gamma: float = 0.9, delta: float = 0.9, - penalty_update: str = 'dimin_adapt', + penalty_update: str = "dimin_adapt", *, - pbf: str = 'quadratic_logarithmic', + pbf: str = "quadratic_logarithmic", init_duals: float | Tensor = None, init_penalties: float | Tensor = None, - dual_range: Tuple[float, float] = (0.0001, 100.), - penalty_range: Tuple[float, float] = (0.1, 100.), - device = None, - primal_update_process_length=1, # length of the primal update process - if =1, is the original algorithm + dual_range: Tuple[float, float] = (0.0001, 100.0), + penalty_range: Tuple[float, float] = (0.1, 2.0), + device=None, + primal_update_process_length=1, # length of the primal update process - if =1, is the original algorithm ) -> None: """ A wrapper over a PyTorch`Optimizer` that works on the dual maximization tasks according to the Penalty-Barrier Method rule. Creates and updates dual variables. @@ -38,7 +33,7 @@ def __init__( :param gamma: Multiplier for dual parameter update. Values close to 1 correspond to a high "momentum". :type gamma: float :param delta: Violation/satisfaction parameter for penalty update; values > 1 make the penalties decrease faster on violated constraints and vice versa. - :type delta: float + :type delta: float :param penalty_update: Penalty update strategy; must be one of `dimin`,`dimin_dual`,`dimin_adapt`,`const`. Defaults to`dimin_adapt`. :type penalty_update: str :param pbf: Penalty-Barrier Function to use. Must be one of `quadratic_logarithmic`,`quadratic_reciprocal` @@ -54,7 +49,20 @@ def __init__( self.dual_range = dual_range self.penalty_range = penalty_range - params, defaults = self._init_constraint_group(m, penalty_mult, penalty_update, delta, pbf, init_duals, init_penalties, gamma, dual_range, penalty_range, primal_update_process_length, device) + params, defaults = self._init_constraint_group( + m, + penalty_mult, + penalty_update, + delta, + pbf, + init_duals, + init_penalties, + gamma, + dual_range, + penalty_range, + primal_update_process_length, + device, + ) self.iter = 0 super().__init__(params, defaults) @@ -71,33 +79,45 @@ def _init_constraint_group( dual_range: Tuple[float, float] = None, penalty_range: Tuple[float, float] = None, primal_update_process_length: int = 1, - device = None + device=None, ): if init_duals is None and m is None: raise ValueError("At least one of`size`,`init_duals` must be set") - - if init_duals is None or isinstance(init_duals, (int, float)): # initialize duals if not set or set to scalar - init_duals = torch.zeros(m, requires_grad=False, device=device) + (init_duals if isinstance(init_duals, (int, float)) else dual_range[0]) - if init_penalties is None or isinstance(init_penalties, (int, float)): # initialize penalties if not set or set to scalar - init_penalties = torch.zeros(m, requires_grad=False, device=device) + (init_penalties if isinstance(init_penalties, (int, float)) else penalty_range[1]) + + if init_duals is None or isinstance( + init_duals, (int, float) + ): # initialize duals if not set or set to scalar + init_duals = torch.zeros(m, requires_grad=False, device=device) + ( + init_duals if isinstance(init_duals, (int, float)) else dual_range[0] + ) + if init_penalties is None or isinstance( + init_penalties, (int, float) + ): # initialize penalties if not set or set to scalar + init_penalties = torch.zeros(m, requires_grad=False, device=device) + ( + init_penalties + if isinstance(init_penalties, (int, float)) + else penalty_range[1] + ) duals = Parameter(init_duals, requires_grad=False) penalties = Parameter(init_penalties, requires_grad=False) - + primal_update_process_length = primal_update_process_length - if penalty_update == 'dimin': + if penalty_update == "dimin": penalty_update_f = _update_penalties_dimin - elif penalty_update == 'dimin_dual': + elif penalty_update == "dimin_dual": penalty_update_f = _update_penalties_dimin_dual - elif penalty_update == 'dimin_adapt': + elif penalty_update == "dimin_adapt": penalty_update_f = _update_penalties_adapt - elif penalty_update == 'const': + elif penalty_update == "const": penalty_update_f = _update_penalties_const + elif penalty_update == "aimd": + penalty_update_f = _update_penalties_aimd elif penalty_update is None: penalty_update_f = None else: - raise ValueError(f'Unknown penalty update function: {penalty_update}!') + raise ValueError(f"Unknown penalty update function: {penalty_update}!") settings_dict = { "p_mult": p_mult, @@ -106,9 +126,11 @@ def _init_constraint_group( "pbf": pbf, "dual_momentum": dual_momentum, "primal_update_process_length": primal_update_process_length, - "dual_momentum_buffer": torch.zeros_like(init_duals, requires_grad = False, device=device), + "dual_momentum_buffer": torch.zeros_like( + init_duals, requires_grad=False, device=device + ), } - settings_dict = {k:v for k,v in settings_dict.items() if v is not None} + settings_dict = {k: v for k, v in settings_dict.items() if v is not None} param_group = ([duals, penalties], settings_dict) @@ -123,7 +145,7 @@ def duals(self) -> Tensor: :rtype: Tensor """ return torch.cat([group["params"][0] for group in self.param_groups]) - + @property def penalties(self) -> Tensor: """ @@ -145,7 +167,7 @@ def add_constraint_group( init_penalties: float | Tensor = None, *, momentum: float = None, - primal_update_process_length: int = 1 + primal_update_process_length: int = 1, ) -> None: """ Adds an additional group of dual variables with separate hyperparameters and barrier functions. @@ -169,9 +191,20 @@ def add_constraint_group( :param primal_update_process_length: Length of the primal update process for this group. If 1 (default), uses original algorithm variant. :type primal_update_process_length: int """ - - - params, settings_dict = self._init_constraint_group(m, penalty_mult, penalty_update, delta, pbf, init_duals, init_penalties, momentum, self.dual_range, self.penalty_range, primal_update_process_length) + + params, settings_dict = self._init_constraint_group( + m, + penalty_mult, + penalty_update, + delta, + pbf, + init_duals, + init_penalties, + momentum, + self.dual_range, + self.penalty_range, + primal_update_process_length, + ) param_group_dict = {"params": params, **settings_dict} self.add_param_group(param_group_dict) @@ -186,13 +219,37 @@ def update(self, constraints: Tensor) -> None: """ for i, group in enumerate(self.param_groups): - duals, penalties, p_mult, _update_penalties, delta, pbf, momentum, primal_update_process_length = group["params"][0], group["params"][1], group["p_mult"], group["penalty_update"], group["delta"], group["pbf"], group['dual_momentum'], group["primal_update_process_length"] + ( + duals, + penalties, + p_mult, + _update_penalties, + delta, + pbf, + momentum, + primal_update_process_length, + ) = ( + group["params"][0], + group["params"][1], + group["p_mult"], + group["penalty_update"], + group["delta"], + group["pbf"], + group["dual_momentum"], + group["primal_update_process_length"], + ) group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] cdivp = group_constraints.div(penalties) with torch.no_grad(): - _update_duals(duals, cdivp, penalty_barrier_funcs[pbf]['d'], momentum) + _update_duals(duals, cdivp, penalty_barrier_funcs[pbf]["d"], momentum) clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) - _update_penalties(penalties, p_mult, duals, penalty_barrier_funcs[pbf]['d'](group_constraints), delta) + _update_penalties( + penalties, + p_mult, + duals, + penalty_barrier_funcs[pbf]["d"](group_constraints), + delta, + ) clamp_(penalties, min=self.penalty_range[0], max=self.penalty_range[1]) def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: @@ -214,7 +271,7 @@ def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] # calculate lagrangian cdivp = group_constraints.div(penalties) - pbf_val = penalty_barrier_funcs[pbf]['f'](cdivp) + pbf_val = penalty_barrier_funcs[pbf]["f"](cdivp) lagrangian.add_(duals.mul(penalties) @ pbf_val) return lagrangian @@ -240,28 +297,60 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: lagrangian.add_(loss) _last_c_group_index = 0 for i, group in enumerate(self.param_groups): - duals, penalties, p_mult, _update_penalties, delta, pbf, momentum, primal_update_process_length = group["params"][0], group["params"][1], group["p_mult"], group["penalty_update"], group["delta"], group["pbf"], group['dual_momentum'], group["primal_update_process_length"] - group_constraints = constraints[_last_c_group_index : _last_c_group_index + len(duals)] + ( + duals, + penalties, + p_mult, + _update_penalties, + delta, + pbf, + momentum, + primal_update_process_length, + ) = ( + group["params"][0], + group["params"][1], + group["p_mult"], + group["penalty_update"], + group["delta"], + group["pbf"], + group["dual_momentum"], + group["primal_update_process_length"], + ) + group_constraints = constraints[ + _last_c_group_index : _last_c_group_index + len(duals) + ] _last_c_group_index = _last_c_group_index + len(duals) # calculate lagrangian - if self.iter + 1 == primal_update_process_length: # this enables a second variant of the algorithm + if ( + self.iter + 1 == primal_update_process_length + ): # this enables a second variant of the algorithm # update duals and penalties cdivp = group_constraints.div(penalties) with torch.no_grad(): - _update_duals(duals, cdivp, penalty_barrier_funcs[pbf]['d'], momentum) + _update_duals( + duals, cdivp, penalty_barrier_funcs[pbf]["d"], momentum + ) clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) - _update_penalties(penalties, p_mult, duals, penalty_barrier_funcs[pbf]['d'](group_constraints), delta) - clamp_(penalties, min=self.penalty_range[0], max=self.penalty_range[1]) + _update_penalties( + penalties, + p_mult, + duals, + penalty_barrier_funcs[pbf]["d"](group_constraints), + delta, + ) # , cdivp) + clamp_( + penalties, min=self.penalty_range[0], max=self.penalty_range[1] + ) cdivp = group_constraints.div(penalties) - pbf_val = penalty_barrier_funcs[pbf]['f'](cdivp) + pbf_val = penalty_barrier_funcs[pbf]["f"](cdivp) lagrangian.add_(duals.mul(penalties) @ pbf_val) # update the iter self.iter = (self.iter + 1) % primal_update_process_length return lagrangian - + def update_penalties(self, constraints: Tensor) -> None: """ Updates penalties according to the specified penalty update strategy for each constraint group. @@ -272,26 +361,36 @@ def update_penalties(self, constraints: Tensor) -> None: :rtype: None """ for i, group in enumerate(self.param_groups): - duals, penalties, p_mult, _update_penalties, pbf = group["params"][0], group["params"][1], group["p_mult"], group["penalty_update"], group['pbf'] + duals, penalties, p_mult, _update_penalties, pbf = ( + group["params"][0], + group["params"][1], + group["p_mult"], + group["penalty_update"], + group["pbf"], + ) group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - _update_penalties(penalties, p_mult, duals, penalty_barrier_funcs[pbf]['d'](group_constraints)) + _update_penalties( + penalties, + p_mult, + duals, + penalty_barrier_funcs[pbf]["d"](group_constraints), + ) clamp_(penalties, min=self.penalty_range[0], max=self.penalty_range[1]) - def state_dict(self) -> dict[str, Any]: """ - Returns the state of the optimizer as a dictionary, including dual and penalty ranges and all constraint groups. - - :return: Dictionary containing optimizer state with param groups and configuration. - :rtype: dict[str, Any] + Returns the state of the optimizer as a dictionary, including dual and penalty ranges and all constraint groups. + PP + :return: Dictionary containing optimizer state with param groups and configuration. + :rtype: dict[str, Any] """ - + state_dict = super().state_dict() state_dict["state"]["penalty_range"] = self.penalty_range state_dict["state"]["dual_range"] = self.dual_range # save params themselves in state_dict instead of param ID in default PyTorch - for id_pg, pg in enumerate(state_dict['param_groups']): - pg['params'] = self.param_groups[id_pg]['params'] + for id_pg, pg in enumerate(state_dict["param_groups"]): + pg["params"] = self.param_groups[id_pg]["params"] return state_dict def load_state_dict(self, state_dict: dict[str, Any]) -> None: @@ -311,35 +410,75 @@ def load_state_dict(self, state_dict: dict[str, Any]) -> None: self.param_groups.append(param) - penalty_barrier_funcs = { - 'quadratic_logarithmic': {'f': quad_log, 'd': quad_log_der}, - 'quadratic_reciprocal': {'f': quad_recipr, 'd': quad_recipr_der} + "quadratic_logarithmic": {"f": quad_log, "d": quad_log_der}, + "quadratic_reciprocal": {"f": quad_recipr, "d": quad_recipr_der}, } -def _update_duals(duals: Tensor, cdivp: Tensor, pbf_der: Callable, gamma: float) -> None: + +def _update_duals( + duals: Tensor, cdivp: Tensor, pbf_der: Callable, gamma: float +) -> None: pbf_der_val = pbf_der(cdivp) upd = pbf_der_val.mul(duals) - duals.mul_(gamma).add_(upd, alpha=1-gamma) + duals.mul_(gamma).add_(upd, alpha=1 - gamma) + -def _update_penalties_const(penalties: Tensor, p_mult: Tensor = None, duals: Tensor = None, phi_der: Tensor = None, delta: float = None): +def _update_penalties_const( + penalties: Tensor, + p_mult: Tensor = None, + duals: Tensor = None, + phi_der: Tensor = None, + delta: float = None, +): pass -def _update_penalties_dimin(penalties: Tensor, p_mult: Tensor, duals: Tensor = None, phi_der: Tensor = None, delta: float = None): + +def _update_penalties_dimin( + penalties: Tensor, + p_mult: Tensor, + duals: Tensor = None, + phi_der: Tensor = None, + delta: float = None, +): penalties.mul_(p_mult) -def _update_penalties_adapt(penalties: Tensor, p_mult: Tensor, duals: Tensor, phi_der: Tensor, delta: float): - d_phd = torch.where(phi_der < 1., phi_der, torch.clamp(delta * phi_der, min=1.0)) - b = (1-p_mult)*penalties/(d_phd + 1e-8) + +def _update_penalties_adapt( + penalties: Tensor, p_mult: Tensor, duals: Tensor, phi_der: Tensor, delta: float +): + d_phd = torch.where(phi_der < 1.0, phi_der, delta * phi_der) + b = (1 - p_mult) * penalties / (d_phd + 1e-8) penalties.mul_(p_mult).add_(b) -def _update_penalties_dimin_dual(penalties: Tensor, p_mult: Tensor, duals: Tensor, phi_der: Tensor = None, delta: float = None): + +def _update_penalties_aimd( + penalties: Tensor, + p_mult: Tensor, + duals: Tensor, + phi_der: Tensor, + delta: float, + cdivp: Tensor, +): + p_add_rate = 0.1 + p_upd_add = torch.where(cdivp <= 0.0, p_add_rate, 0.0) + p_upd_mult = torch.where(cdivp > 0.0, p_mult, 1.0) + penalties.add_(p_upd_add).mul_(p_upd_mult) + + +def _update_penalties_dimin_dual( + penalties: Tensor, + p_mult: Tensor, + duals: Tensor, + phi_der: Tensor = None, + delta: float = None, +): penalties.mul_(p_mult).mul_(duals) penalty_update_funcs = { - 'const': _update_penalties_const, - 'dimin': _update_penalties_dimin, - 'adapt': _update_penalties_adapt, - 'dimin_dual': _update_penalties_dimin_dual -} \ No newline at end of file + "const": _update_penalties_const, + "dimin": _update_penalties_dimin, + "adapt": _update_penalties_adapt, + "dimin_dual": _update_penalties_dimin_dual, +} From f663c698e10e75072f04f0e506a4de6b328c3277 Mon Sep 17 00:00:00 2001 From: andrewklayk Date: Fri, 22 May 2026 12:23:37 +0200 Subject: [PATCH 12/16] refactor new methods --- src/humancompatible/train/dual_optim/alm.py | 27 ++++++++--- src/humancompatible/train/dual_optim/ialm.py | 50 ++++++++++++++------ src/humancompatible/train/dual_optim/pbm.py | 12 ++--- 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/src/humancompatible/train/dual_optim/alm.py b/src/humancompatible/train/dual_optim/alm.py index cc270cb..2b34684 100644 --- a/src/humancompatible/train/dual_optim/alm.py +++ b/src/humancompatible/train/dual_optim/alm.py @@ -4,9 +4,10 @@ from typing import Any, Tuple from torch import clamp_, Tensor -# cite: Stochastic Smoothed Primal-Dual Algorithms for Nonconvex Optimization with Linear Inequality Constraints +# cite: Stochastic Smoothed Primal-Dual Algorithms for Nonconvex Optimization with Linear Inequality Constraints # https://arxiv.org/pdf/2504.07607 + class ALM(Optimizer): def __init__( self, @@ -143,11 +144,17 @@ def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: lagrangian.add_(loss) for i, group in enumerate(self.param_groups): duals = group["params"][0] - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + group_constraints = ( + constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + ) lagrangian.add_(duals @ group_constraints) if self.penalty > 0: - lagrangian.add_(0.5 * self.penalty * torch.dot(constraints - self.ctol, constraints - self.ctol)) + lagrangian.add_( + 0.5 + * self.penalty + * torch.dot(constraints - self.ctol, constraints - self.ctol) + ) return lagrangian @@ -167,7 +174,9 @@ def update(self, constraints: Tensor) -> None: group["dampening"], group["momentum_buffer"], ) - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + group_constraints = ( + constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + ) with torch.no_grad(): _update_duals( duals, group_constraints, lr, momentum, dampening, momentum_buffer @@ -196,7 +205,9 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: group["dampening"], group["momentum_buffer"], ) - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + group_constraints = ( + constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + ) with torch.no_grad(): _update_duals( duals, group_constraints, lr, momentum, dampening, momentum_buffer @@ -206,7 +217,11 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: lagrangian.add_(duals @ group_constraints) if self.penalty > 0: - lagrangian.add_(0.5 * self.penalty * torch.dot(constraints - self.ctol, constraints - self.ctol)) + lagrangian.add_( + 0.5 + * self.penalty + * torch.dot(constraints - self.ctol, constraints - self.ctol) + ) return lagrangian diff --git a/src/humancompatible/train/dual_optim/ialm.py b/src/humancompatible/train/dual_optim/ialm.py index 8446f0f..82d1965 100644 --- a/src/humancompatible/train/dual_optim/ialm.py +++ b/src/humancompatible/train/dual_optim/ialm.py @@ -7,6 +7,7 @@ # cite: Stochastic inexact augmented Lagrangian method for nonconvex expectation constrained optimization # https://link.springer.com/content/pdf/10.1007/s10589-023-00521-z.pdf + class iALM(Optimizer): def __init__( self, @@ -162,12 +163,12 @@ def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: group["dampening"], group["momentum_buffer"], ) - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol - lagrangian.add_(duals @ group_constraints) - - _update_c_buffers( - group_constraints, momentum, dampening, momentum_buffer + group_constraints = ( + constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol ) + lagrangian.add_(duals @ group_constraints) + + _update_c_buffers(group_constraints, momentum, dampening, momentum_buffer) lagrangian.add_(0.5 * self.beta * torch.dot(constraints, constraints)) @@ -176,7 +177,7 @@ def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: def update(self, constraints: Tensor) -> None: """ Updates the dual variables - + :param constraints: Tensor of constraint values :type constraints: Tensor """ @@ -188,16 +189,24 @@ def update(self, constraints: Tensor) -> None: group["dampening"], group["momentum_buffer"], ) - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + group_constraints = ( + constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + ) with torch.no_grad(): _update_duals( - duals, group_constraints, lr, self.beta, self.gamma, momentum, dampening, momentum_buffer + duals, + group_constraints, + lr, + self.beta, + self.gamma, + momentum, + dampening, + momentum_buffer, ) clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) self.beta *= self.sigma - # evaluate the Lagrangian and update the dual variables def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: """ @@ -220,19 +229,32 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: group["dampening"], group["momentum_buffer"], ) - group_constraints = constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + group_constraints = ( + constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol + ) with torch.no_grad(): _update_c_buffers( group_constraints, momentum, dampening, momentum_buffer ) _update_duals( - duals, group_constraints, lr, self.beta, self.gamma, momentum, dampening, momentum_buffer + duals, + group_constraints, + lr, + self.beta, + self.gamma, + momentum, + dampening, + momentum_buffer, ) clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) lagrangian.add_(duals @ group_constraints) - lagrangian.add_(0.5 * self.beta * torch.dot(constraints - self.ctol, constraints - self.ctol)) + lagrangian.add_( + 0.5 + * self.beta + * torch.dot(constraints - self.ctol, constraints - self.ctol) + ) self.beta *= self.sigma @@ -282,6 +304,6 @@ def _update_duals( dampening: float, buffer: Tensor, ) -> None: - - update_mult = min(beta, gamma/(buffer @ buffer)) + + update_mult = min(beta, gamma / (buffer @ buffer)) duals.add_(buffer, alpha=update_mult) diff --git a/src/humancompatible/train/dual_optim/pbm.py b/src/humancompatible/train/dual_optim/pbm.py index 2fea042..07c7665 100644 --- a/src/humancompatible/train/dual_optim/pbm.py +++ b/src/humancompatible/train/dual_optim/pbm.py @@ -343,13 +343,13 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: ) cdivp = group_constraints.div(penalties) - pbf_val = penalty_barrier_funcs[pbf]['f'](cdivp) + pbf_val = penalty_barrier_funcs[pbf]["f"](cdivp) # change duals to 0 for them < 1e-4, but do not overwrite the actual duals to keep the momentum working active = duals >= 1e-5 if active.any(): lagrangian.add_(duals[active].mul(penalties[active]) @ pbf_val[active]) - + # update the iter self.iter = (self.iter + 1) % primal_update_process_length @@ -383,10 +383,10 @@ def update_penalties(self, constraints: Tensor) -> None: def state_dict(self) -> dict[str, Any]: """ - Returns the state of the optimizer as a dictionary, including dual and penalty ranges and all constraint groups. - PP - :return: Dictionary containing optimizer state with param groups and configuration. - :rtype: dict[str, Any] + Returns the state of the optimizer as a dictionary, including dual and penalty ranges and all constraint groups. + + :return: Dictionary containing optimizer state with param groups and configuration. + :rtype: dict[str, Any] """ state_dict = super().state_dict() From b783a682f674ba6f9731b83dce63eae71984152e Mon Sep 17 00:00:00 2001 From: andrewklayk Date: Fri, 22 May 2026 13:20:38 +0200 Subject: [PATCH 13/16] clean benchmark --- benchmark/burgers_burgers/multirun.yaml | 208 ----------- benchmark/burgers_burgers__/multirun.yaml | 208 ----------- benchmark/cifar100_dutch/adam_config.yaml | 2 - benchmark/cifar100_dutch/alm_max_config.yaml | 2 - benchmark/cifar100_dutch/multirun.yaml | 240 ------------- .../cifar100_dutch/pbm_dimin_config.yaml | 2 - benchmark/cifar100_dutch/ssg_config.yaml | 2 - benchmark/cifar10_dutch/adam_config.yaml | 5 - benchmark/cifar10_dutch/alm_max_config.yaml | 76 ---- benchmark/cifar10_dutch/alm_slack_config.yaml | 49 --- benchmark/cifar10_dutch/multirun.yaml | 214 ------------ benchmark/cifar10_dutch/pbm_adapt_config.yaml | 121 ------- benchmark/cifar10_dutch/pbm_dimin_config.yaml | 66 ---- benchmark/dutch_cifar10/pbm_adapt_config.yaml | 241 ------------- benchmark/dutch_cifar10/pbm_dimin_config.yaml | 326 ------------------ .../adam_config.yaml | 5 - .../alm_max_config.yaml | 76 ---- .../alm_slack_config.yaml | 49 --- .../multirun.yaml | 216 ------------ .../pbm_adapt_config.yaml | 121 ------- .../pbm_dimin_config.yaml | 101 ------ .../ssg_config.yaml | 17 - .../adam_config.yaml | 5 - .../alm_max_config.yaml | 76 ---- .../alm_slack_config.yaml | 49 --- .../multirun.yaml | 221 ------------ .../pbm_adapt_config.yaml | 141 -------- .../pbm_dimin_config.yaml | 101 ------ .../ssg_config.yaml | 17 - .../adam_config.yaml | 5 - .../alm_max_config.yaml | 49 --- .../alm_slack_config.yaml | 49 --- .../multirun.yaml | 249 ------------- .../pbm_adapt_config.yaml | 81 ----- .../pbm_dimin_config.yaml | 101 ------ .../ssg_config.yaml | 17 - benchmark/helmholtz_helmholtz/multirun.yaml | 208 ----------- run.batch | 20 -- setup.txt | 14 - 39 files changed, 3750 deletions(-) delete mode 100644 benchmark/burgers_burgers/multirun.yaml delete mode 100644 benchmark/burgers_burgers__/multirun.yaml delete mode 100644 benchmark/cifar100_dutch/adam_config.yaml delete mode 100644 benchmark/cifar100_dutch/alm_max_config.yaml delete mode 100644 benchmark/cifar100_dutch/multirun.yaml delete mode 100644 benchmark/cifar100_dutch/pbm_dimin_config.yaml delete mode 100644 benchmark/cifar100_dutch/ssg_config.yaml delete mode 100644 benchmark/cifar10_dutch/adam_config.yaml delete mode 100644 benchmark/cifar10_dutch/alm_max_config.yaml delete mode 100644 benchmark/cifar10_dutch/alm_slack_config.yaml delete mode 100644 benchmark/cifar10_dutch/multirun.yaml delete mode 100644 benchmark/cifar10_dutch/pbm_adapt_config.yaml delete mode 100644 benchmark/cifar10_dutch/pbm_dimin_config.yaml delete mode 100644 benchmark/dutch_cifar10/pbm_adapt_config.yaml delete mode 100644 benchmark/dutch_cifar10/pbm_dimin_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/adam_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/multirun.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/adam_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/multirun.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml delete mode 100644 benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/adam_config.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/alm_max_config.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/multirun.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml delete mode 100644 benchmark/equalized_odds_vec_folktables/ssg_config.yaml delete mode 100644 benchmark/helmholtz_helmholtz/multirun.yaml delete mode 100644 run.batch delete mode 100644 setup.txt diff --git a/benchmark/burgers_burgers/multirun.yaml b/benchmark/burgers_burgers/multirun.yaml deleted file mode 100644 index 97107bd..0000000 --- a/benchmark/burgers_burgers/multirun.yaml +++ /dev/null @@ -1,208 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: h200fast,amdgpufast - qos: null - comment: null - constraint: null - exclude: null - gres: gpu=1 - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 10G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 99 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=alm - - algorithm.primal__lr=0.0005,0.001 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.005,0.01,0.05 - - algorithm.dual__penalty=0.,1. - - algorithm.moreau__mu=1. - - seed=0,1 - - task=burgers - - data=burgers - - model=deep_narrow - - +algorithm.beta=1 - job: - name: PDE_Viscous_Burgers - chdir: false - override_dirname: +algorithm.beta=1,+algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.005,0.01,0.05,algorithm.dual__penalty=0.,1.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0005,0.001,algorithm=alm,data=burgers,model=deep_narrow,seed=0,1,task=burgers - id: ??? - num: ??? - config_name: helmholtz - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: alm - data: burgers - task: burgers - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amdgpu - hydra/output: default - verbose: false -task: - task: burgers -data: - name: burgers -algorithm: - algorithm: alm - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__penalty: 0., 1., 2. - moreau__mu: 1.0 - primal__weight_decay: 0.01 - beta: 1 -n_epochs: 5000 -seed: 0 -model: deep_narrow diff --git a/benchmark/burgers_burgers__/multirun.yaml b/benchmark/burgers_burgers__/multirun.yaml deleted file mode 100644 index f00c430..0000000 --- a/benchmark/burgers_burgers__/multirun.yaml +++ /dev/null @@ -1,208 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: h200fast,amdgpufast - qos: null - comment: null - constraint: null - exclude: null - gres: gpu=1 - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 10G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 99 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=alm - - algorithm.primal__lr=0.0005,0.001 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.0005,0.001 - - algorithm.dual__penalty=0.,1. - - algorithm.moreau__mu=1. - - seed=0,1 - - task=burgers - - data=burgers - - model=deep_narrow - - +algorithm.beta=1 - job: - name: PDE_Viscous_Burgers - chdir: false - override_dirname: +algorithm.beta=1,+algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0005,0.001,algorithm.dual__penalty=0.,1.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0005,0.001,algorithm=alm,data=burgers,model=deep_narrow,seed=0,1,task=burgers - id: ??? - num: ??? - config_name: helmholtz - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: alm - data: burgers - task: burgers - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amdgpu - hydra/output: default - verbose: false -task: - task: burgers -data: - name: burgers -algorithm: - algorithm: alm - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__penalty: 0., 1., 2. - moreau__mu: 1.0 - primal__weight_decay: 0.01 - beta: 1 -n_epochs: 10000 -seed: 0 -model: deep_narrow diff --git a/benchmark/cifar100_dutch/adam_config.yaml b/benchmark/cifar100_dutch/adam_config.yaml deleted file mode 100644 index 5ad545a..0000000 --- a/benchmark/cifar100_dutch/adam_config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -,algorithm,primal__lr,primal__weight_decay -7c3fe4eff95d,adam,0.0001,0.01 diff --git a/benchmark/cifar100_dutch/alm_max_config.yaml b/benchmark/cifar100_dutch/alm_max_config.yaml deleted file mode 100644 index 2cce36e..0000000 --- a/benchmark/cifar100_dutch/alm_max_config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 diff --git a/benchmark/cifar100_dutch/multirun.yaml b/benchmark/cifar100_dutch/multirun.yaml deleted file mode 100644 index 6f6fd5d..0000000 --- a/benchmark/cifar100_dutch/multirun.yaml +++ /dev/null @@ -1,240 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: h200fast - qos: null - comment: null - constraint: null - exclude: null - gres: gpu=1 - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 20G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 85 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=ssg - - algorithm.primal__lr=0.002 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.002 - - algorithm.moreau__mu=1. - - seed=0,1,2 - - task=cifar100_loss - - data=dutch - - use_test=true - - n_epochs=30 - job: - name: run_single_experiment - chdir: false - override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.002,algorithm.moreau__mu=1.,algorithm.primal__lr=0.002,algorithm=ssg,data=dutch,n_epochs=30,seed=0,1,2,task=cifar100_loss,use_test=true - id: ??? - num: ??? - config_name: experiment - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: ssg - data: dutch - task: cifar100_loss - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_h200 - hydra/output: default - verbose: false -task: - task: cifar100 - batch_size: 400 - constraint: - name: LossPairwise - bound: 0.1 - loss: CrossEntropyLoss - algorithms: none - pbm_params: - primal__lr: 0.05 - dual__penalty_mult: 1.0 - dual__penalty_update: dimin - dual__penalty_range: - - 0.1 - - 10.0 - dual__pbf: quadratic_logarithmic - dual__gamma: 0.2 - dual_delta: 1.0 - moreau__mu: 0.0 - alm_params: - primal__lr: 0.01 - dual__lr: 0.001 - dual__penalty: 0.0 - dual__momentum: 0.0 - moreau__mu: 0.0 - adam_params: - lr: 0.01 - hydra: - run: - dir: . - job: - chdir: false -data: - name: dutch - kwargs: - sens_attrs: - - AGE - - SEX - extend_groups: false -algorithm: - algorithm: ssg - primal__lr: 0.002 - dual__lr: 0.002 - moreau__mu: 1.0 - primal__weight_decay: 0.01 -n_epochs: 30 -seed: 0 -use_test: true diff --git a/benchmark/cifar100_dutch/pbm_dimin_config.yaml b/benchmark/cifar100_dutch/pbm_dimin_config.yaml deleted file mode 100644 index 2bd3c0c..0000000 --- a/benchmark/cifar100_dutch/pbm_dimin_config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay -c4052e989d6c,pbm_dimin,0.002,1.0,const,quadratic_reciprocal,0.9500000000000001,1.0,1.0,0.01 diff --git a/benchmark/cifar100_dutch/ssg_config.yaml b/benchmark/cifar100_dutch/ssg_config.yaml deleted file mode 100644 index 758e11b..0000000 --- a/benchmark/cifar100_dutch/ssg_config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay -028daf5cba49,ssg,0.002,0.002,1.0,0.01 diff --git a/benchmark/cifar10_dutch/adam_config.yaml b/benchmark/cifar10_dutch/adam_config.yaml deleted file mode 100644 index ec1cbaa..0000000 --- a/benchmark/cifar10_dutch/adam_config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -,algorithm,primal__lr,primal__weight_decay -320c69024dbe,adam,0.0005,0.01 -7c3fe4eff95d,adam,0.0001,0.01 -28191679ac49,adam,0.005,0.01 -cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/cifar10_dutch/alm_max_config.yaml b/benchmark/cifar10_dutch/alm_max_config.yaml deleted file mode 100644 index 7528ebe..0000000 --- a/benchmark/cifar10_dutch/alm_max_config.yaml +++ /dev/null @@ -1,76 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -ae1f543f9f8b,alm_max,0.001,0.002,1.0,1.0,0.01 -a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 -ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 -e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 -2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 -f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 -b9ea0c071737,alm_max,0.002,0.002,1.0,1.0,0.01 -a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 -e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 -77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 -f24ef0214d90,alm_max,0.0001,0.002,1.0,1.0,0.01 -8df8dd2f3cfc,alm_max,0.0005,0.002,2.0,1.0,0.01 -7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 -1dc3ca37b989,alm_max,0.0005,0.002,0.0,1.0,0.01 -8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 -7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 -72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 -a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 -58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 -934004fb2498,alm_max,0.0001,0.002,2.0,1.0,0.01 -c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 -cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 -6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 -a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 -3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 -44d7d36e411e,alm_max,0.0005,0.002,1.0,1.0,0.01 -c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 -30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 -f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 -b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 -d310040b890f,alm_max,0.002,0.001,0.0,1.0,0.01 -295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 -a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 -2e8c67ef953b,alm_max,0.001,0.002,2.0,1.0,0.01 -199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 -f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 -d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 -cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 -ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 -16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 -36e233f0a98b,alm_max,0.001,0.002,0.0,1.0,0.01 -e6546be05ab0,alm_max,0.005,0.002,2.0,1.0,0.01 -a27958b6f9f2,alm_max,0.0001,0.002,0.0,1.0,0.01 -9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 -f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 -4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 -81ece7ef23c6,alm_max,0.002,0.0005,1.0,1.0,0.01 -0eaf19039256,alm_max,0.002,0.005,0.0,1.0,0.01 -27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 -4a0cb304fe9c,alm_max,0.002,0.0001,1.0,1.0,0.01 -8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 -d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 -a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 -dc16bc324021,alm_max,0.002,0.002,2.0,1.0,0.01 -3b817f73f60b,alm_max,0.005,0.002,1.0,1.0,0.01 -d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 -90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 -69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 -06b8db61a8e6,alm_max,0.002,0.001,2.0,1.0,0.01 -f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 -ff2474672e82,alm_max,0.002,0.0005,0.0,1.0,0.01 -446799210d39,alm_max,0.002,0.001,1.0,1.0,0.01 -93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 -65a4b39a2a78,alm_max,0.002,0.0001,2.0,1.0,0.01 -72d30a3226a1,alm_max,0.002,0.005,1.0,1.0,0.01 -ee4295850776,alm_max,0.002,0.005,2.0,1.0,0.01 -923b7ed4eddf,alm_max,0.005,0.002,0.0,1.0,0.01 -bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 -a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 -5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 -6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 -6e9dbf3d08d4,alm_max,0.002,0.0005,2.0,1.0,0.01 -a44b5e13d05e,alm_max,0.002,0.002,0.0,1.0,0.01 -d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 -e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/cifar10_dutch/alm_slack_config.yaml b/benchmark/cifar10_dutch/alm_slack_config.yaml deleted file mode 100644 index dd18915..0000000 --- a/benchmark/cifar10_dutch/alm_slack_config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 -cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 -566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 -7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 -cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 -572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 -ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 -5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 -f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 -ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 -f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 -36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 -dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 -cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 -a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 -18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 -3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 -d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 -5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 -43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 -cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 -d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 -ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 -17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 -9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 -7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 -79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 -0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 -80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 -933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 -ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 -7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 -39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 -38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 -4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 -93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 -d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 -5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 -c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 -cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 -927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 -d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 -f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 -4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 -bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 -776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 -76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 -5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/cifar10_dutch/multirun.yaml b/benchmark/cifar10_dutch/multirun.yaml deleted file mode 100644 index e4f5068..0000000 --- a/benchmark/cifar10_dutch/multirun.yaml +++ /dev/null @@ -1,214 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: h200fast,amdgpufast - qos: null - comment: null - constraint: null - exclude: null - gres: gpu=1 - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 16G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 100 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=alm_slack - - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.0001,0.0005,0.001,0.005 - - algorithm.dual__penalty=0.,1.,2. - - algorithm.moreau__mu=1. - - seed=0,1,2 - - task=cifar10_loss - - data=dutch - job: - name: run_single_experiment - chdir: false - override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0001,0.0005,0.001,0.005,algorithm.dual__penalty=0.,1.,2.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=alm_slack,data=dutch,seed=0,1,2,task=cifar10_loss - id: ??? - num: ??? - config_name: experiment - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: alm_slack - data: dutch - task: cifar10_loss - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amdgpu - hydra/output: default - verbose: false -task: - task: cifar10 - batch_size: 120 - constraint: - name: LossPairwise - bound: 0.1 - loss: CrossEntropyLoss -data: - name: dutch - kwargs: - sens_attrs: - - AGE - - SEX - extend_groups: false -algorithm: - algorithm: alm_slack - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__penalty: 0., 1., 2. - moreau__mu: 1.0 - primal__weight_decay: 0.01 -n_epochs: 10 -seed: 0 diff --git a/benchmark/cifar10_dutch/pbm_adapt_config.yaml b/benchmark/cifar10_dutch/pbm_adapt_config.yaml deleted file mode 100644 index 9b0abf1..0000000 --- a/benchmark/cifar10_dutch/pbm_adapt_config.yaml +++ /dev/null @@ -1,121 +0,0 @@ -,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult -be22673a4486,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -e68f152b3331,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -54782fa0b5be,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -7929ffa54302,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -5454fa0b8dfe,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -787248ddc490,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -34aaea793403,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -40a4f7489252,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -ce18010adc70,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -cb027db34245,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -036fddf6b004,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -56109b6b2c6d,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -6262fba9720e,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -eebb07ce6841,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -8f579ef22b71,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -a259b37ddeda,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -a98bbe9fe4c4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -641bf5324616,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -4b1cc8ace568,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -3b80a4d05983,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -8e93af2b6e10,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -ae23b284968c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -22fe22c8d318,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -45937e86c6d4,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -61275eea06ec,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -701efae4fb2d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -a53875bd2360,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -714d3c06c0cd,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -a2e6fb502c81,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -9a86344143c1,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -a5d64f3884d6,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -c1703366481e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -956bc43e4dbc,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -5a72c3d47280,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -370b7e556bd2,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -17324bd6bf5f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -765205ddc668,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -11ad72fe9245,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -359d8f81b334,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -a7c22ee50994,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -f0182669cf79,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -d78182d64690,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -d8236456c992,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -6dfee9171ed6,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -23ae18d8aa4c,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -5a7fd986583c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -88499dcda38b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -5ddd9bca044f,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -b8aab754f18a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -feba85d80f18,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -2de391a3c15a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -8fbd1e9d1d22,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -09a26f048887,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -abffec495d1d,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -d7daabcecba7,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -6fb0f9b45bf2,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -9840de24187c,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -68ca6ca4e4ca,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -6c301438dddc,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -78d878c0791f,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -05ba3627ccb3,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -72730f6d2b3b,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -ca4dbdd3121e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -297de22117f8,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -5e92ae0310f8,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -7588d622a66e,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -4f69717a956c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -4ddc9fc8f90b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -2ef950c7e893,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -803c34c411f7,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -86aa35732504,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -2cb0d01a4caf,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -5e352d823d03,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -3a2c5d68f9c9,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -e277a7ffc241,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -4d0366836a1e,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -b82eef34fbb4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -e62105ff5d13,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -a0d22d602bbc,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -8d8c71b368a0,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -e0433040efe7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -cf58ba368994,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -574a9166bd29,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -be62778a9ca9,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -254327f25d9c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -eb3d60b97504,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -0b015280585a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -1132d01718da,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -a03c1afbf6b0,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -c1fe769cd2f3,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -db82422300c8,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -5787d71dba2b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -ae2b5242bc9f,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -693cc15909e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -114fcb802009,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -2eef423358c7,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -2fe8b30d8c7b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -d33e4820759d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -26287d2c1840,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -75ca213ffdee,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -51a224528840,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -82f85c3d620c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -d7714e56603a,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -5cd4332fca7f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -9b18daf6739a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -2dee840e47b2,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -324c1c7c5122,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -bfef4e1d0b38,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -ba1412aa3f3e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -4d3b0f64b188,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -66a27189f839,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -e0309aeff930,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -8efd6c89829d,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -483f821172e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -bb689b61126b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -d312728bea17,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -9f730d2f9c51,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -d2e20d508ec9,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -14751917cef7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -8e44e3c80150,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 diff --git a/benchmark/cifar10_dutch/pbm_dimin_config.yaml b/benchmark/cifar10_dutch/pbm_dimin_config.yaml deleted file mode 100644 index e74e4ba..0000000 --- a/benchmark/cifar10_dutch/pbm_dimin_config.yaml +++ /dev/null @@ -1,66 +0,0 @@ -,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult -33f86cab0e57,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -89b5ce6d6d7a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -8c98f03fa96c,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -dd7dae189ccd,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -542a5c095d8e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -f3f3e6bb5179,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -5dd16d0f7161,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -da4482befb05,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -af57034056aa,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -60378e00db57,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -ee83de5b1ed7,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -bac17bf5e28b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -1915944bebcf,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -367de72fd7d1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -baf6df00a0b2,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -5a1425e4371c,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -c95503db821a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -25dcd5fc8b5f,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -4237647ff3e2,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -215cbcfbbe09,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -4f6b2f4fb35b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -fe09fa177a62,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 -aa994a62bfcd,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -76e29f650c23,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 -6ee602b0b379,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -d15a8d88da05,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -468fbdc62bce,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -70003c4ff93a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -88bd1e17b3f5,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -770606c6ac2e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -0f2ee65a529b,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -5504ba84986e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -19ad254eda3e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -92829d64d095,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -a07f83ed3d8d,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -255cc4dcbf03,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -d771390ba1f2,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -50d4e5f04ebc,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -daf430a68d46,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -caa474dcb3ad,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -e594a5a9a0b5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -ed5494e02ba3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -f24b5ab860d5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -70272b387a7a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -eef0cbd9b0b0,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -ef2c82bb15b4,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -4ea098c06991,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -10b73abd8531,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -ec212dfc2b40,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -47d235ed3f77,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -b293e4bb9152,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -4f524281a401,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -001e1bc318a3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -216139882c44,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -9c17a194e128,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -d77a15603099,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -d7a566f04535,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -82a618ec5f28,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -211adebc0707,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -169d61f3e6e1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -bbd851e5ebac,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -326adb6144e3,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -fbb3d9bd637e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -a5b9d0ccda9e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -91b533921e28,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 diff --git a/benchmark/dutch_cifar10/pbm_adapt_config.yaml b/benchmark/dutch_cifar10/pbm_adapt_config.yaml deleted file mode 100644 index e5cdbf5..0000000 --- a/benchmark/dutch_cifar10/pbm_adapt_config.yaml +++ /dev/null @@ -1,241 +0,0 @@ -,algorithm,primal__lr,dual_penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu -1939d0d0,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -f596628e,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -f5e2b60e,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -3963b135,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -c0d8d373,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -8e25289f,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -1f0efedc,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -2ee5643c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -09966201,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -8f0015d4,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -502d63b6,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -7706dd50,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -b8744781,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -0bd76ed9,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -cfc1a1a0,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -4ca90b82,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -ef8fd315,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -765765fc,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -e12e0f81,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -7657d8d8,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -3cbd2ee6,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -22f07a4c,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -e92df81c,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -b22ff058,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -8052c7ac,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -9a6f1866,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -d1013bcf,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -c5e16fb3,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -1408cbf8,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -a7e90ddd,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -76a4304b,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -6f0c87d0,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -5e6a09e5,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -07493314,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -91b33a17,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -7099b4f4,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -0a3bac31,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -0bf36ff7,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -9901c26f,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -931e4299,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -4f62168a,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -55ffba5f,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -38b46727,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -a7b65e32,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -a0b14bd1,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -86c8e8f3,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -f7d3a60c,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -f8c9637d,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -efc32755,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -aacd8398,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -964cc284,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -dca6fdde,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -5223edf2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -1a61dc34,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -4f89a248,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -e393cbed,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -ecef3a00,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -0e0da02a,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -23a57e34,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -52bba476,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -451e31d0,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -b3e89f73,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -1e1cc2eb,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -b2138db2,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -b02ac3ef,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -667a7f50,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -712532d6,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -7eb9227e,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -c749cef2,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -c22b6836,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -a4e5877a,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -39c627b6,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -cae4df7d,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -42a77620,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -8d5a0c54,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -389ca72b,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -90e46eea,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -a72a36c5,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -4515b686,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -5298ab47,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -e9127df8,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -1b7b433b,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -c22458d5,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -e8322e81,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -891879e7,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -d62fb127,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -617a1969,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -b7857a23,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -1afb9541,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -cdd1e561,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -da47f1dd,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -ba274a55,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -0e5dc653,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -ee2c9b1a,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -9c9029d6,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -3583e68b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -e78ef8d4,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -716133f0,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -06b31eb2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -897ca06c,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -18f9cee1,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -da1b3c6a,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -2899f933,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -cc7b70a5,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -d0e29c58,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -c4fcd59f,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -62639632,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -c52f053c,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -a9f6a045,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -584f64b0,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -a8da0682,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -5f27203d,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -6a4334d2,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -cfeaeb53,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -6f1a514c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -53cdf3a2,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -1fb5ad24,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -28406004,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -ec1b5d6d,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -bf93244f,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -6db3a1d5,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -ba5256a5,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -fc3e315b,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -b8e1fbec,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -b6109144,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -ab16aa38,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -b69a3f0d,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -9d9186ea,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -f78c23cb,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -4244be22,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -a9c3121d,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -1e327c5b,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -96c010df,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -ba4453c2,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -980303e8,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -8d20dc9d,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -7b9a9149,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -941dfa2d,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -b9f529cd,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -bff1c9aa,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -ff9a8046,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -ba1a19fe,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -ece78b87,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -e3b1577b,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -b891d7e9,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -99b2620b,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -7ca1bb04,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -3afec6bb,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -500d2b1b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -81cde4b1,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -6689d9d9,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -b8ee3ce3,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -3eaaa559,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -9ec720d3,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -120de484,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -3000d330,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -cb0f7d98,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -a8d08839,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -d073a2fe,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -ac5546d1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -7e3dc393,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -e4df822b,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -afe8f39f,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -6c0e111d,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -a36b06bb,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -61babd7a,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -9498932e,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -9e6c964e,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -15999499,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -ed753c3d,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -d1038859,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -18b259a8,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -2c79a3e5,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -00911656,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -8698af07,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -cecee675,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -92425387,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,0 -be6e04cc,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -c2d8119a,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -242c0791,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -5df67a35,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -1eb8a2ed,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -1582f44b,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -c3496ba1,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -fba02db1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0 -4fb6eacb,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -b119f84a,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -61e03d7e,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -da7c507a,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -4f64a795,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -360b8b34,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -39677ecb,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -30b307b1,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -38c72a41,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0 -13e4a4fa,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -bbd5d752,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -81e5e893,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -1ed62dd1,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -298e7286,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -fde99065,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.5 -85794c11,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -5decd08b,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -c8b07e1d,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -b4f009ad,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -f8673eaa,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -a149258e,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -d6577c38,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -262f58fa,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -b1b47cb0,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -f52016ad,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,0 -9839e7fc,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -22b98980,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -8f8e8714,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -e9ef7f84,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -fc79e06d,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -8b3ded22,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -7f4ca63a,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -93e274d5,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0 -45ede71b,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.5 -9b8432b3,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,0 -63fdd427,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,2.0 -412b5708,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -c782df54,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,0.1 -9781862e,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -0b391f37,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,0.1 -566c01fa,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -407f2cd4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -83d90b35,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -a599ba73,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 -477bc467,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0 -f41c72f6,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -9e4f73ee,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.5 -483bbbbc,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.5 -13a65243,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -fc795759,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,0.1 -edbfa24f,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,2.0 -9d7d041f,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,0.1 -b9d80d09,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0 -4a072978,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,2.0 -5cf9d8e3,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,2.0 diff --git a/benchmark/dutch_cifar10/pbm_dimin_config.yaml b/benchmark/dutch_cifar10/pbm_dimin_config.yaml deleted file mode 100644 index 2ebc98a..0000000 --- a/benchmark/dutch_cifar10/pbm_dimin_config.yaml +++ /dev/null @@ -1,326 +0,0 @@ -,algorithm,primal__lr,dual_penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu -82817d6b,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 -5b3ca681,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 -06e21ef2,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 -f0705958,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 -bf0b84d8,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 -6a03c4e2,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 -18392377,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 -ba76ac2f,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 -ed2e80d8,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 -a48c3aa7,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 -14154af8,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 -e398f5ee,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0.1 -4824b1b3,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 -9038fce2,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 -9f9dc643,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 -e7b9066e,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 -ca0e357c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 -faa0f027,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 -af6dfb12,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 -0b8e5134,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 -169a2a3a,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 -607bc2c0,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 -3fb16663,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 -acad47e9,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 -fa46c18c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 -a0301919,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 -3c2f8f32,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 -19ed5a31,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 -45572647,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 -b48ee2b5,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 -ce1ca314,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,2.0 -7065c95d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 -4869bd42,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 -b5b38e92,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 -8a3b4bf9,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 -20add89e,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 -a3d20128,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 -b1c37cdc,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 -d64ec5d3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 -6fd312df,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 -f851f103,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 -57e973be,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 -e1c61153,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 -73e684a8,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,1.0 -889f7dde,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 -3efdb5e4,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 -c3ac7ba2,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 -46c3e884,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 -0f2af858,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 -ea168269,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 -7eae0db6,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 -19e6d0a5,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 -3b3506d0,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 -3fd3ea94,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 -f287fd9b,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 -2b62adaa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 -3abca38a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 -1e1797c8,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 -edebf933,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 -98c2f8c2,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 -fdb941ea,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 -0e63af8d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 -3687be50,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 -e96487ad,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 -370576db,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 -9461418d,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 -6b6b0317,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 -54d76a73,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 -ddc0f892,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 -2e917ebb,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 -f333ba22,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 -14bb0bc6,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 -5dd0db45,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 -e0330170,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 -9b4daa70,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 -d5b75b65,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 -a5aaba50,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 -16ba70ee,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 -3e436265,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 -0c3f61d5,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 -b8bc00fb,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 -d69b749c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 -c75cd148,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 -72be9778,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 -89d684bc,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 -cb5b2b52,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 -fc2bc3bb,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 -e03398a2,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 -40bd7779,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 -9e4362da,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 -8d8e608a,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 -fdb84094,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 -c1a597bd,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0 -624be33c,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 -a3db4351,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 -0d3f6c28,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 -855ec898,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 -8a0b633e,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 -38b5830a,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 -3ccf8e55,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 -fdb913dd,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 -b475ac20,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 -15f32408,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 -64be9e02,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 -6de0c47f,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 -bb8a77af,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 -36448ef8,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 -1449a077,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 -0ba19590,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,1.0 -bcf7e71c,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 -b4f80b28,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 -13280627,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 -25d228eb,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 -dd1b93c5,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 -7e436f8a,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 -324cbfb9,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 -32932ce5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 -3462334c,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 -135e9dab,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 -0c63fc1c,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 -d8cdf0d3,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 -4e1488f5,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 -11a8696b,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 -10719b39,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 -8228cd81,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.5 -0250c55d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 -368b33b6,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 -bc2edf56,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 -89272e8c,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 -a255debe,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 -0800ddab,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 -e21dbabc,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 -94bd21b1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 -7722b98e,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0 -46d3327d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 -71c70895,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 -200c6eed,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 -6f21bbda,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 -cb9d7ad0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 -f756f501,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 -70ec5ee8,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 -4d211aa5,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 -7f68bab1,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 -beb3596f,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 -88816ce4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 -491befdf,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 -74b8cdd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.1 -ed0caa13,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 -f1c79150,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 -653ac4e7,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 -d0ca8a35,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.5 -dd4b8935,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 -2fa4a18a,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 -6a47634d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 -fe21f25d,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 -b8c81c1a,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.1 -4b673f5e,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.1 -0884fa28,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,2.0 -21f4f2b0,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,2.0 -da6992cb,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 -179c02ae,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 -20797283,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 -4102a36c,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 -97411649,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 -6b7b3146,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 -f71fe8c5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 -c287c41e,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 -f9904ae0,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 -d94561d1,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 -fbfaaa3d,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 -293a2367,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 -d762c188,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 -adde6ef3,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 -b1c91296,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 -233c3714,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 -125c64d0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 -9832f4b8,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 -c4aab02f,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0 -fc8e2656,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 -8fe79504,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.1 -fb7e4884,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 -6caccd49,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 -b56d7545,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 -95592499,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 -ac096871,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 -218116c0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 -b39b977c,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0 -aaaa8cff,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 -a11b51dc,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 -de658dc6,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 -e9961a84,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 -3c172fdd,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 -aa9f53dc,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 -55dcac6e,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 -c648c195,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 -01e79092,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 -0ee5e8fa,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 -6a9b7d53,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0.1 -904eea7e,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 -2667cee4,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,1.0 -10afc92f,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 -519fc23b,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 -111302e0,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.5 -d3828877,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0 -402c5e53,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 -ba3d948c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 -a69d4905,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 -8f71c416,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 -fc786671,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 -eebcc229,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 -4293165c,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.999,1.0,1.0 -ec75533e,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 -c6a90b0a,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 -6a7c0e38,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 -cab86a42,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 -4c575b5a,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 -34e2328f,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.9,1.0,0 -ccfcb6de,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 -cddec2d9,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 -97c6b7f2,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 -4766af48,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 -54056ced,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 -81470845,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,2.0 -336f93bf,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 -61ab3ad4,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 -82fa31e3,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,2.0 -fff6d2c1,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0 -c385eba3,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 -70430a24,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 -e0d9d104,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0.1 -c7fbf993,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 -4d251599,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 -8c35df3a,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,2.0 -3bfdb40c,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,2.0 -040d0348,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 -b1ed3fed,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 -a99d0745,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.1 -5f575060,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 -6a0fdd18,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 -2ce1450c,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 -d6ce6186,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 -934b2640,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 -91890c35,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 -10dd97f1,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.1 -ab1d5425,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 -7189f63c,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 -72b701b2,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 -54ae1ff5,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 -c119c79d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 -40b6422e,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 -e637e178,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0 -5ae4eb2e,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.5 -1cc0dfab,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 -6791490c,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 -0b3ceeee,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 -3d6cd9ca,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 -8d2abf9e,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.1 -29e9ff1a,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,2.0 -f288701b,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.1 -a150853a,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 -5feff0ea,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.1 -e11bceae,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.1,1.0,0.5 -783474f2,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,0.5 -ca4cd6de,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0 -37806fa4,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.999,1.0,0 -e99657ca,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,0.5 -22544125,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 -e3e59acf,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.1 -376fc38c,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.99,1.0,1.0 -3464a2eb,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.5,1.0,2.0 -8e4e9cbc,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 -cd8c07fc,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0 -f6d18eb0,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 -1c7b672e,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,2.0 -f82e154d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 -8dd962c4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0.5 -88ad06ac,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 -46646db7,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.5,1.0,0 -18d3bbe0,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 -503836ca,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0 -8ce79fa5,pbm_dimin,0.001,0.9,dimin,quadratic_logarithmic,0.99,1.0,0 -f677c700,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0 -04f490ea,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,2.0 -a4e16e00,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 -8f7319ee,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,0 -109ff18b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 -17140b87,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 -66332b52,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0.5 -e5ec895d,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,2.0 -4f6d2b15,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0.5 -2eec358e,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.99,1.0,2.0 -db4cbc82,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 -c549303e,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,1.0 -0d9b7e97,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0 -3e1b21ce,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 -1cbd61d3,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0 -2f43d516,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.5 -ac6f09c7,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,0.5 -9dfe0a70,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,0.5 -cf459dfc,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,0 -aa016d20,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.5 -428a9fb1,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.5,1.0,0.1 -be188337,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 -c70b6d71,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.5,1.0,0 -e356573a,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 -8afc6c03,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 -b2676c1b,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0 -72a4be4d,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 -281b4a74,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,0.5 -aee2ac81,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,0 -222d9d3c,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,2.0 -bf08f4ba,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0 -ef1fbb14,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,0.5 -cdfa58f2,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,0.1 -3bcc9755,pbm_dimin,0.0005,0.9,dimin,quadratic_logarithmic,0.5,1.0,1.0 -8358f760,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,0 -6f9df33e,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.5,1.0,2.0 -bb6c79de,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,2.0 -39f1edd7,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,0 -ee2dc57f,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.5,1.0,1.0 -a3145abb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0 -5ff5fdec,pbm_dimin,0.005,0.9,dimin,quadratic_logarithmic,0.5,1.0,0.1 -8349a90a,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,0.5 -3007200c,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.5,1.0,0.1 -c874ba03,pbm_dimin,0.0001,0.9,dimin,quadratic_logarithmic,0.9,1.0,2.0 diff --git a/benchmark/equalized_odds_pairwise_dutch/adam_config.yaml b/benchmark/equalized_odds_pairwise_dutch/adam_config.yaml deleted file mode 100644 index ec1cbaa..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/adam_config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -,algorithm,primal__lr,primal__weight_decay -320c69024dbe,adam,0.0005,0.01 -7c3fe4eff95d,adam,0.0001,0.01 -28191679ac49,adam,0.005,0.01 -cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml b/benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml deleted file mode 100644 index 7528ebe..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/alm_max_config.yaml +++ /dev/null @@ -1,76 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -ae1f543f9f8b,alm_max,0.001,0.002,1.0,1.0,0.01 -a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 -ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 -e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 -2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 -f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 -b9ea0c071737,alm_max,0.002,0.002,1.0,1.0,0.01 -a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 -e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 -77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 -f24ef0214d90,alm_max,0.0001,0.002,1.0,1.0,0.01 -8df8dd2f3cfc,alm_max,0.0005,0.002,2.0,1.0,0.01 -7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 -1dc3ca37b989,alm_max,0.0005,0.002,0.0,1.0,0.01 -8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 -7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 -72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 -a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 -58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 -934004fb2498,alm_max,0.0001,0.002,2.0,1.0,0.01 -c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 -cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 -6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 -a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 -3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 -44d7d36e411e,alm_max,0.0005,0.002,1.0,1.0,0.01 -c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 -30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 -f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 -b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 -d310040b890f,alm_max,0.002,0.001,0.0,1.0,0.01 -295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 -a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 -2e8c67ef953b,alm_max,0.001,0.002,2.0,1.0,0.01 -199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 -f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 -d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 -cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 -ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 -16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 -36e233f0a98b,alm_max,0.001,0.002,0.0,1.0,0.01 -e6546be05ab0,alm_max,0.005,0.002,2.0,1.0,0.01 -a27958b6f9f2,alm_max,0.0001,0.002,0.0,1.0,0.01 -9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 -f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 -4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 -81ece7ef23c6,alm_max,0.002,0.0005,1.0,1.0,0.01 -0eaf19039256,alm_max,0.002,0.005,0.0,1.0,0.01 -27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 -4a0cb304fe9c,alm_max,0.002,0.0001,1.0,1.0,0.01 -8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 -d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 -a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 -dc16bc324021,alm_max,0.002,0.002,2.0,1.0,0.01 -3b817f73f60b,alm_max,0.005,0.002,1.0,1.0,0.01 -d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 -90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 -69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 -06b8db61a8e6,alm_max,0.002,0.001,2.0,1.0,0.01 -f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 -ff2474672e82,alm_max,0.002,0.0005,0.0,1.0,0.01 -446799210d39,alm_max,0.002,0.001,1.0,1.0,0.01 -93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 -65a4b39a2a78,alm_max,0.002,0.0001,2.0,1.0,0.01 -72d30a3226a1,alm_max,0.002,0.005,1.0,1.0,0.01 -ee4295850776,alm_max,0.002,0.005,2.0,1.0,0.01 -923b7ed4eddf,alm_max,0.005,0.002,0.0,1.0,0.01 -bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 -a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 -5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 -6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 -6e9dbf3d08d4,alm_max,0.002,0.0005,2.0,1.0,0.01 -a44b5e13d05e,alm_max,0.002,0.002,0.0,1.0,0.01 -d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 -e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml b/benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml deleted file mode 100644 index dd18915..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/alm_slack_config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 -cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 -566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 -7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 -cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 -572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 -ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 -5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 -f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 -ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 -f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 -36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 -dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 -cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 -a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 -18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 -3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 -d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 -5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 -43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 -cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 -d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 -ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 -17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 -9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 -7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 -79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 -0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 -80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 -933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 -ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 -7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 -39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 -38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 -4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 -93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 -d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 -5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 -c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 -cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 -927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 -d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 -f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 -4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 -bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 -776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 -76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 -5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_dutch/multirun.yaml b/benchmark/equalized_odds_pairwise_dutch/multirun.yaml deleted file mode 100644 index 8e18a40..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/multirun.yaml +++ /dev/null @@ -1,216 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: amdfast - qos: null - comment: null - constraint: null - exclude: null - gres: null - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 16G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 100 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=alm_slack - - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.0001,0.0005,0.001,0.005 - - algorithm.dual__penalty=0.,1.,2. - - algorithm.moreau__mu=1. - - seed=0,1,2 - - task=dutch_positive_rate_pair - - data=dutch - job: - name: run_single_experiment - chdir: false - override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0001,0.0005,0.001,0.005,algorithm.dual__penalty=0.,1.,2.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=alm_slack,data=dutch,seed=0,1,2,task=dutch_positive_rate_pair - id: ??? - num: ??? - config_name: experiment - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: alm_slack - data: dutch - task: dutch_positive_rate_pair - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amd - hydra/output: default - verbose: false -task: - task: equalized_odds_pairwise - batch_size: 72 - constraint: - name: FairretPairwise - bound: 0.1 - statistic: PositiveRate - kwargs: - uses_labels: false -data: - name: dutch - kwargs: - sens_attrs: - - AGE - - SEX - extend_groups: false -algorithm: - algorithm: alm_slack - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__penalty: 0., 1., 2. - moreau__mu: 1.0 - primal__weight_decay: 0.01 -n_epochs: 10 -seed: 0 diff --git a/benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml b/benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml deleted file mode 100644 index 9b0abf1..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/pbm_adapt_config.yaml +++ /dev/null @@ -1,121 +0,0 @@ -,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult -be22673a4486,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -e68f152b3331,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -54782fa0b5be,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -7929ffa54302,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -5454fa0b8dfe,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -787248ddc490,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -34aaea793403,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -40a4f7489252,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -ce18010adc70,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -cb027db34245,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -036fddf6b004,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -56109b6b2c6d,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -6262fba9720e,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -eebb07ce6841,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -8f579ef22b71,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -a259b37ddeda,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -a98bbe9fe4c4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -641bf5324616,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -4b1cc8ace568,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -3b80a4d05983,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -8e93af2b6e10,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -ae23b284968c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -22fe22c8d318,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -45937e86c6d4,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -61275eea06ec,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -701efae4fb2d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -a53875bd2360,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -714d3c06c0cd,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -a2e6fb502c81,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -9a86344143c1,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -a5d64f3884d6,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -c1703366481e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -956bc43e4dbc,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -5a72c3d47280,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -370b7e556bd2,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -17324bd6bf5f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -765205ddc668,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -11ad72fe9245,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -359d8f81b334,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -a7c22ee50994,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -f0182669cf79,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -d78182d64690,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -d8236456c992,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -6dfee9171ed6,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -23ae18d8aa4c,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -5a7fd986583c,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -88499dcda38b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -5ddd9bca044f,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -b8aab754f18a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -feba85d80f18,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -2de391a3c15a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -8fbd1e9d1d22,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -09a26f048887,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -abffec495d1d,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -d7daabcecba7,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -6fb0f9b45bf2,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -9840de24187c,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -68ca6ca4e4ca,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -6c301438dddc,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -78d878c0791f,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -05ba3627ccb3,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -72730f6d2b3b,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -ca4dbdd3121e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -297de22117f8,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -5e92ae0310f8,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -7588d622a66e,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.999 -4f69717a956c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -4ddc9fc8f90b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -2ef950c7e893,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -803c34c411f7,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -86aa35732504,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -2cb0d01a4caf,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -5e352d823d03,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -3a2c5d68f9c9,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -e277a7ffc241,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -4d0366836a1e,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -b82eef34fbb4,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -e62105ff5d13,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -a0d22d602bbc,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -8d8c71b368a0,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -e0433040efe7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -cf58ba368994,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -574a9166bd29,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -be62778a9ca9,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -254327f25d9c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.8 -eb3d60b97504,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -0b015280585a,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -1132d01718da,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.99 -a03c1afbf6b0,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -c1fe769cd2f3,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -db82422300c8,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -5787d71dba2b,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -ae2b5242bc9f,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.9 -693cc15909e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.999 -114fcb802009,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -2eef423358c7,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -2fe8b30d8c7b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -d33e4820759d,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -26287d2c1840,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -75ca213ffdee,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.8 -51a224528840,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.8 -82f85c3d620c,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -d7714e56603a,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -5cd4332fca7f,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -9b18daf6739a,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01,0.9 -2dee840e47b2,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -324c1c7c5122,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9 -bfef4e1d0b38,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -ba1412aa3f3e,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.8 -4d3b0f64b188,pbm_adapt,0.0005,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -66a27189f839,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.8 -e0309aeff930,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -8efd6c89829d,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9 -483f821172e6,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.8 -bb689b61126b,pbm_adapt,0.005,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01,0.99 -d312728bea17,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9 -9f730d2f9c51,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9 -d2e20d508ec9,pbm_adapt,0.002,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -14751917cef7,pbm_adapt,0.001,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -8e44e3c80150,pbm_adapt,0.0001,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 diff --git a/benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml b/benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml deleted file mode 100644 index 9b21c69..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/pbm_dimin_config.yaml +++ /dev/null @@ -1,101 +0,0 @@ -,algorithm,primal__lr,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay,dual__penalty_mult -33f86cab0e57,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -89b5ce6d6d7a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -8c98f03fa96c,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -dd7dae189ccd,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -542a5c095d8e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -f3f3e6bb5179,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -5dd16d0f7161,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -da4482befb05,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -af57034056aa,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -60378e00db57,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -ee83de5b1ed7,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -bac17bf5e28b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -fc50981feabc,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -7ba4cbc78107,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -1915944bebcf,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -367de72fd7d1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -baf6df00a0b2,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -c5d93a6fa6e4,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -5a1425e4371c,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -efecd670f32b,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -c95503db821a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -25dcd5fc8b5f,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -be939fca71e3,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -32af5e074d74,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -4237647ff3e2,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -59607d05e5ea,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -215cbcfbbe09,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -04d5d483fc6b,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -f3580c261ce9,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -4f6b2f4fb35b,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -fe09fa177a62,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 -aa994a62bfcd,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -76e29f650c23,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 -6ee602b0b379,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -7a65ac59b3c3,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -fa57d7e8ed82,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -d15a8d88da05,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -461397679f3b,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -468fbdc62bce,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -70003c4ff93a,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -88bd1e17b3f5,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -770606c6ac2e,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -47881a0cc7f1,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -ebaeca59c599,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 -0627bef4d484,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -0f2ee65a529b,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -5504ba84986e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -19ad254eda3e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -92829d64d095,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -a07f83ed3d8d,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -8bae17f0799a,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -255cc4dcbf03,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -d771390ba1f2,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -863da6837fa5,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -50d4e5f04ebc,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -daf430a68d46,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -caa474dcb3ad,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -b0e478ee1afe,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -e594a5a9a0b5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -ed5494e02ba3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -f24b5ab860d5,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -fbb3d9bd637e,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -c21768bd6d1f,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.99 -94397d6a9af3,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -2b3d4834213d,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -0595227ef45f,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -70272b387a7a,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -a043d1d880b5,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,1.0 -eef0cbd9b0b0,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,1.0 -ef2c82bb15b4,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -4ea098c06991,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -10b73abd8531,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -ec212dfc2b40,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -47d235ed3f77,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -b293e4bb9152,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.9999 -629d03e3a696,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -4f524281a401,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -001e1bc318a3,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -1e8e69c912c2,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.99 -216139882c44,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -9c17a194e128,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.999 -d77a15603099,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.999 -786e26228362,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -d7a566f04535,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -66d4007073a3,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -cbc4ca574388,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,1.0 -33b1681d1b40,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,1.0 -82a618ec5f28,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.9999 -7b566755aa31,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.999 -211adebc0707,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.99 -dcf6db94bef7,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -169d61f3e6e1,pbm_dimin,0.0001,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,0.999 -bbd851e5ebac,pbm_dimin,0.0005,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01,0.9999 -326adb6144e3,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.99 -c2382d20111e,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01,0.9999 -a0e3d4d3a900,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 -bc5d16c3196f,pbm_dimin,0.002,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01,1.0 -a5b9d0ccda9e,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01,0.999 -be6d8b2c32d9,pbm_dimin,0.005,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.99 -91b533921e28,pbm_dimin,0.001,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01,0.9999 diff --git a/benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml b/benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml deleted file mode 100644 index 0ca60c6..0000000 --- a/benchmark/equalized_odds_pairwise_dutch/ssg_config.yaml +++ /dev/null @@ -1,17 +0,0 @@ -,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay -dd977b38b115,ssg,0.0001,0.0001,1.0,0.01 -a779bc91982f,ssg,0.0001,0.005,1.0,0.01 -5b53d46e1f43,ssg,0.005,0.0001,1.0,0.01 -c6e8d69207c9,ssg,0.001,0.0005,1.0,0.01 -1f09bf71a728,ssg,0.0005,0.0005,1.0,0.01 -ba47d5d07a71,ssg,0.0001,0.0005,1.0,0.01 -c3c60b74a2f6,ssg,0.001,0.005,1.0,0.01 -6489a3166ee5,ssg,0.0005,0.005,1.0,0.01 -08af6b79a6f6,ssg,0.005,0.0005,1.0,0.01 -b4f96a7ac4de,ssg,0.005,0.001,1.0,0.01 -1e782e2ac50a,ssg,0.001,0.0001,1.0,0.01 -ac60b4c7b56b,ssg,0.001,0.001,1.0,0.01 -c51877d903c0,ssg,0.0005,0.001,1.0,0.01 -04d4e9b32fe3,ssg,0.0001,0.001,1.0,0.01 -3e8cfc283731,ssg,0.005,0.005,1.0,0.01 -3d88cf139676,ssg,0.0005,0.0001,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/adam_config.yaml b/benchmark/equalized_odds_pairwise_folktables/adam_config.yaml deleted file mode 100644 index ec1cbaa..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/adam_config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -,algorithm,primal__lr,primal__weight_decay -320c69024dbe,adam,0.0005,0.01 -7c3fe4eff95d,adam,0.0001,0.01 -28191679ac49,adam,0.005,0.01 -cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml b/benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml deleted file mode 100644 index 7528ebe..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/alm_max_config.yaml +++ /dev/null @@ -1,76 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -ae1f543f9f8b,alm_max,0.001,0.002,1.0,1.0,0.01 -a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 -ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 -e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 -2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 -f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 -b9ea0c071737,alm_max,0.002,0.002,1.0,1.0,0.01 -a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 -e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 -77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 -f24ef0214d90,alm_max,0.0001,0.002,1.0,1.0,0.01 -8df8dd2f3cfc,alm_max,0.0005,0.002,2.0,1.0,0.01 -7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 -1dc3ca37b989,alm_max,0.0005,0.002,0.0,1.0,0.01 -8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 -7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 -72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 -a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 -58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 -934004fb2498,alm_max,0.0001,0.002,2.0,1.0,0.01 -c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 -cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 -6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 -a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 -3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 -44d7d36e411e,alm_max,0.0005,0.002,1.0,1.0,0.01 -c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 -30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 -f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 -b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 -d310040b890f,alm_max,0.002,0.001,0.0,1.0,0.01 -295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 -a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 -2e8c67ef953b,alm_max,0.001,0.002,2.0,1.0,0.01 -199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 -f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 -d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 -cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 -ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 -16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 -36e233f0a98b,alm_max,0.001,0.002,0.0,1.0,0.01 -e6546be05ab0,alm_max,0.005,0.002,2.0,1.0,0.01 -a27958b6f9f2,alm_max,0.0001,0.002,0.0,1.0,0.01 -9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 -f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 -4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 -81ece7ef23c6,alm_max,0.002,0.0005,1.0,1.0,0.01 -0eaf19039256,alm_max,0.002,0.005,0.0,1.0,0.01 -27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 -4a0cb304fe9c,alm_max,0.002,0.0001,1.0,1.0,0.01 -8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 -d1805c92af10,alm_max,0.002,0.0001,0.0,1.0,0.01 -a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 -dc16bc324021,alm_max,0.002,0.002,2.0,1.0,0.01 -3b817f73f60b,alm_max,0.005,0.002,1.0,1.0,0.01 -d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 -90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 -69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 -06b8db61a8e6,alm_max,0.002,0.001,2.0,1.0,0.01 -f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 -ff2474672e82,alm_max,0.002,0.0005,0.0,1.0,0.01 -446799210d39,alm_max,0.002,0.001,1.0,1.0,0.01 -93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 -65a4b39a2a78,alm_max,0.002,0.0001,2.0,1.0,0.01 -72d30a3226a1,alm_max,0.002,0.005,1.0,1.0,0.01 -ee4295850776,alm_max,0.002,0.005,2.0,1.0,0.01 -923b7ed4eddf,alm_max,0.005,0.002,0.0,1.0,0.01 -bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 -a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 -5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 -6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 -6e9dbf3d08d4,alm_max,0.002,0.0005,2.0,1.0,0.01 -a44b5e13d05e,alm_max,0.002,0.002,0.0,1.0,0.01 -d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 -e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml b/benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml deleted file mode 100644 index dd18915..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/alm_slack_config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 -cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 -566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 -7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 -cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 -572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 -ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 -5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 -f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 -ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 -f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 -36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 -dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 -cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 -a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 -18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 -3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 -d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 -5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 -43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 -cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 -d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 -ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 -17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 -9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 -7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 -79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 -0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 -80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 -933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 -ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 -7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 -39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 -38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 -4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 -93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 -d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 -5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 -c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 -cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 -927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 -d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 -f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 -4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 -bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 -776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 -76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 -5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/multirun.yaml b/benchmark/equalized_odds_pairwise_folktables/multirun.yaml deleted file mode 100644 index fed41ce..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/multirun.yaml +++ /dev/null @@ -1,221 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: amdfast - qos: null - comment: null - constraint: null - exclude: null - gres: null - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 16G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 99 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=ssg - - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.0001,0.0005,0.001,0.005 - - algorithm.moreau__mu=1. - - seed=0,1,2 - - task=folktables_positive_rate_pair - - data=income - job: - name: run_single_experiment - chdir: false - override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0001,0.0005,0.001,0.005,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=ssg,data=income,seed=0,1,2,task=folktables_positive_rate_pair - id: ??? - num: ??? - config_name: experiment - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: ssg - data: income - task: folktables_positive_rate_pair - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amd - hydra/output: default - verbose: false -task: - task: equalized_odds_pairwise - batch_size: 30 - constraint: - name: FairretPairwise - bound: 0.1 - statistic: PositiveRate - kwargs: - uses_labels: false - hydra: - run: - dir: . - job: - chdir: false -data: - name: folktables - kwargs: - sens_attrs: - - MAR - - SEX - states: - - VA - extend_groups: false -algorithm: - algorithm: ssg - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__lr: 0.0001, 0.0005, 0.001, 0.005 - moreau__mu: 1.0 - primal__weight_decay: 0.01 -n_epochs: 10 -seed: 0 diff --git a/benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml b/benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml deleted file mode 100644 index 72854d4..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/pbm_adapt_config.yaml +++ /dev/null @@ -1,141 +0,0 @@ -,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay -c41d8b309d26,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -60f56507cd4c,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -7e39e94b50e9,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -bf9565806564,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -071ddb5683d4,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -d51eebe8db16,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -f9ac41dbf17d,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -50067bcc14fa,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -9a67b1f6536f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -020c17ed39bd,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -a589aa3dbad2,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -566d25376894,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -672a1c9d3dad,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -f390868f6fb3,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -e7e824168456,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -1b5b2a0c3c36,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -4b5d07301352,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -ea4fca5c8ff4,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d2e0b5fa5fd8,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -b0beadc8529a,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -f874057d5c35,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -75199ec9ed8f,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -340c81f29a29,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -d832cd6b5982,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -20816284bbf7,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -67b73c0400c1,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6d455fdf3528,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -0a0f4678f437,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -ed554442f41b,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -58e01f29ab7b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -13fdcce41dba,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -cfa719f8faa1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -db40274af82b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -a495ed9da514,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -b97988ffd179,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -e98de030b4bc,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -674dc3cf594e,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -c365ab9925fd,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -29e748e8ade1,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -87ba2a8af561,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -c51dadb84fed,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -ffcb2bb90ef0,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -b8c39e71f0e0,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -d58daacfd369,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -15427e1bb833,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -24748a322d62,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -17fb5f98c5b4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -602e062c9681,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -570d2f5ad012,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -dee81252085e,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -dde472854144,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -31990615ab6f,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -e92158c8da0f,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -8a42ad4255c7,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -70609ce2a233,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -e1365d3ada98,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -19b4f4219e6c,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -7b48ecc7f38a,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -c70bd7108819,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -33984b429697,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -9a803dc7d6ba,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -cc90f2844936,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -32b6849dcbad,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d723c3e955f7,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -f031b6a2d804,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -fa5f6873cb0a,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -49de94ab2b32,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -65402a70071b,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -4f0d8b62b67a,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -bc69d5fae4d5,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -d4d370a90084,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -cc7d51edf4b1,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -aedf3b9b5db5,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -ff1524a3e9c4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -76a8a208b7af,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -3c688ec41977,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -17393d86f0c9,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -1524e64e71de,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -7e54e584d522,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -f603cf341477,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -8a12bef0232a,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -d29c00be029c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -a1b5eecd84c0,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -71bb6e765a0e,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -fa96db597209,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -3d929d4641ea,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -a32495735902,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -e1e41b55873f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -af15dc1bebb2,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -b1aaf5c6df51,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -2107d12518cb,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -208abfc28683,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -296afd5844bb,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -4e9f482719a6,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -7675b71bdc60,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -dc5c3f76aebd,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -a74c07c24937,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -373e53556f3a,pbm_adapt,0.002,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -c8216c5aef09,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6ab7c477dfe2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -7b25f7c4b86b,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -93cc79302a0d,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -176f601eba5e,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -a2add11b80f6,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -1701c69224e3,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -2fae08979e1b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -e8422308cd21,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -6dcd58482ad3,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -aba13ca25dcd,pbm_adapt,0.002,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -30b84710b7c7,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -9733db7ef789,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -b383a17bdcf0,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -8bba13a5642b,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -97fa3cf064bb,pbm_adapt,0.002,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -62a93d741bea,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -ca263b01ab7a,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -7a16f25b5ce6,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -01e3167c59f0,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -b387e0ed486e,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -af06713d1914,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -b6fe924b27c2,pbm_adapt,0.002,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -c178fd3c80d0,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -0755b9023328,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -230764c7a139,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -23f236cea236,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -3833a35b59e9,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -e60195d4857d,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -ba8e0159e5d9,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -c3e4b6fb835b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -74d2965804a5,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -aa9e90ad1b60,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 -bfabfb565058,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -dc691ada8f91,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -b08ec6af198c,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -e3c2c488fbf4,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -32939c0a7c2e,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -9a784f203f71,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -979fba337fa2,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -47aa6b2b17fa,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -8ccd02fa1aa5,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9999,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml b/benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml deleted file mode 100644 index ba2126a..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/pbm_dimin_config.yaml +++ /dev/null @@ -1,101 +0,0 @@ -,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay -389c5cbb6667,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -ada4aaef2d69,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -7925ef53184a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -cde297aa6cb0,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6471406588ce,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -69332e9fe4ba,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -ad8695a7eda3,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -a753d48c0e68,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -88b4edb95aa6,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -9281594fca6b,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -d2b757a5cb38,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -1bbb246272c5,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -0dde9f347958,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -23b4248c811a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -d0784d95d442,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -6eeb18d283e3,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d6660f1de3fa,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -d6bf073eb827,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -f476de00912f,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -120a930a2e0c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -01f30dcc5bd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -b77c50640c30,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -250dc18aabcb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -9c15e2e95fe5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -3ac5399b5d39,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -24e1116dd537,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -7214504aed04,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -392c2e1b9caa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -fd497153d74f,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -66c57f9bc1e0,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -94e4588b2c7d,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -1c5bf81f55fb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -208678e2267d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -27f0f576bfd1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -8fab6eda432a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -afc9f298f66b,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -0a18682ae461,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -c5a067e6ab17,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -e1a25a0670d9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -061fa4999358,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -40859df64b24,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -f09f3e9f1341,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -e4f4ccaca2b5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -5cbfdd56176d,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -eaab5ec98363,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -61988c4462a7,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -08e30464625e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -011fc61c8566,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -1f423e3ed794,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -906a466efd20,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -0e8bffc4f932,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -b629a874c5d2,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -9998722ae249,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -0492def7d833,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d8e5048fb582,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -353360e09942,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -bbf2c53df3a4,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -ee1d02f6139e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -01ac36b34e7c,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -c5fdd72ae60c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -c9d7770443b9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -801d14bac102,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -e674c568a8a8,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -2abb052127a4,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -9fe1ad6a431b,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -e9fbbca123a3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -0da39dd8fcfb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -585b6ea87eae,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -1d544984d5c8,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -32625fb7c1a3,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -cec931bbe525,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -8003eb358451,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -e20d32d81b6d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -761c77614b9b,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d22048bd7d02,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -8d5fb32d38cd,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -d1695142f03b,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -db75a7654304,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -71550301ae4b,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -8a90dedab180,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -6acae96c7549,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -eac93c19e6fa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -2f6ba0d8c3db,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -2ba8129e76de,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -706306691690,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -bb7077d50e0a,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -03f04267c6bd,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -aaaba3b0457b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -6a8464cf6a33,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -a9fa87857b58,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -c2eb578026db,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -c518364671b9,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -0651f3927c48,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -53e6d78a3f6b,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -501440caa4de,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -8d170ce02cf4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -36e32e0cec94,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -c56c357701f4,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -1bdf67060b07,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6a4b06bf5ffa,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml b/benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml deleted file mode 100644 index 0ca60c6..0000000 --- a/benchmark/equalized_odds_pairwise_folktables/ssg_config.yaml +++ /dev/null @@ -1,17 +0,0 @@ -,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay -dd977b38b115,ssg,0.0001,0.0001,1.0,0.01 -a779bc91982f,ssg,0.0001,0.005,1.0,0.01 -5b53d46e1f43,ssg,0.005,0.0001,1.0,0.01 -c6e8d69207c9,ssg,0.001,0.0005,1.0,0.01 -1f09bf71a728,ssg,0.0005,0.0005,1.0,0.01 -ba47d5d07a71,ssg,0.0001,0.0005,1.0,0.01 -c3c60b74a2f6,ssg,0.001,0.005,1.0,0.01 -6489a3166ee5,ssg,0.0005,0.005,1.0,0.01 -08af6b79a6f6,ssg,0.005,0.0005,1.0,0.01 -b4f96a7ac4de,ssg,0.005,0.001,1.0,0.01 -1e782e2ac50a,ssg,0.001,0.0001,1.0,0.01 -ac60b4c7b56b,ssg,0.001,0.001,1.0,0.01 -c51877d903c0,ssg,0.0005,0.001,1.0,0.01 -04d4e9b32fe3,ssg,0.0001,0.001,1.0,0.01 -3e8cfc283731,ssg,0.005,0.005,1.0,0.01 -3d88cf139676,ssg,0.0005,0.0001,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/adam_config.yaml b/benchmark/equalized_odds_vec_folktables/adam_config.yaml deleted file mode 100644 index ec1cbaa..0000000 --- a/benchmark/equalized_odds_vec_folktables/adam_config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -,algorithm,primal__lr,primal__weight_decay -320c69024dbe,adam,0.0005,0.01 -7c3fe4eff95d,adam,0.0001,0.01 -28191679ac49,adam,0.005,0.01 -cd4c2c95e1f2,adam,0.001,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/alm_max_config.yaml b/benchmark/equalized_odds_vec_folktables/alm_max_config.yaml deleted file mode 100644 index 9ff59c8..0000000 --- a/benchmark/equalized_odds_vec_folktables/alm_max_config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -a245a5f90446,alm_max,0.0005,0.005,1.0,1.0,0.01 -ddef7251e146,alm_max,0.0001,0.0001,1.0,1.0,0.01 -e3fe6cfa3789,alm_max,0.001,0.001,2.0,1.0,0.01 -2d6b4fcbdff2,alm_max,0.0005,0.0001,0.0,1.0,0.01 -f910089b7270,alm_max,0.0001,0.005,0.0,1.0,0.01 -a814c09bb202,alm_max,0.001,0.0001,2.0,1.0,0.01 -e568859fd8b1,alm_max,0.0005,0.001,2.0,1.0,0.01 -77a9f91c75e5,alm_max,0.0001,0.001,0.0,1.0,0.01 -7c8ce77fb394,alm_max,0.0005,0.0005,1.0,1.0,0.01 -8aed9cdcf77b,alm_max,0.0001,0.0001,2.0,1.0,0.01 -7b7845ca7f91,alm_max,0.0005,0.001,1.0,1.0,0.01 -72e349866459,alm_max,0.005,0.0001,1.0,1.0,0.01 -a94e35154c6e,alm_max,0.0005,0.0001,1.0,1.0,0.01 -58d12bc2c8c4,alm_max,0.0005,0.0005,0.0,1.0,0.01 -c9c59def0bbe,alm_max,0.005,0.005,0.0,1.0,0.01 -cee7080c5521,alm_max,0.001,0.005,0.0,1.0,0.01 -6f7fdb2f7f24,alm_max,0.0005,0.0001,2.0,1.0,0.01 -a40efee7f505,alm_max,0.005,0.0001,0.0,1.0,0.01 -3b010c8c66c7,alm_max,0.005,0.0005,1.0,1.0,0.01 -c644dc2c2f31,alm_max,0.001,0.0005,2.0,1.0,0.01 -30d703041175,alm_max,0.0005,0.005,2.0,1.0,0.01 -f24c866dbc29,alm_max,0.0005,0.0005,2.0,1.0,0.01 -b472373aa646,alm_max,0.005,0.0005,0.0,1.0,0.01 -295999e849ae,alm_max,0.001,0.0005,0.0,1.0,0.01 -a3e4dbc6dbf3,alm_max,0.0005,0.005,0.0,1.0,0.01 -199d1764d399,alm_max,0.001,0.005,1.0,1.0,0.01 -f93718ad4922,alm_max,0.001,0.0001,0.0,1.0,0.01 -d52b9aa3d7db,alm_max,0.0001,0.0005,1.0,1.0,0.01 -cf77f56b27cf,alm_max,0.0001,0.0001,0.0,1.0,0.01 -ad8b4a09bc6b,alm_max,0.005,0.005,2.0,1.0,0.01 -16a549f78466,alm_max,0.005,0.005,1.0,1.0,0.01 -9e94673d095a,alm_max,0.005,0.001,0.0,1.0,0.01 -f17eeab58a50,alm_max,0.005,0.001,1.0,1.0,0.01 -4c950655efc7,alm_max,0.0005,0.001,0.0,1.0,0.01 -27d78abc252e,alm_max,0.0001,0.005,1.0,1.0,0.01 -8e8f2bcfb4b4,alm_max,0.001,0.0001,1.0,1.0,0.01 -a0520064923f,alm_max,0.0001,0.0005,2.0,1.0,0.01 -d59bcf652328,alm_max,0.0001,0.005,2.0,1.0,0.01 -90c7471789ee,alm_max,0.005,0.0001,2.0,1.0,0.01 -69b2d7ad97f7,alm_max,0.001,0.005,2.0,1.0,0.01 -f21c01e0f5d4,alm_max,0.001,0.0005,1.0,1.0,0.01 -93774fe90d32,alm_max,0.001,0.001,1.0,1.0,0.01 -bc7044bea48e,alm_max,0.0001,0.001,1.0,1.0,0.01 -a83c04410851,alm_max,0.001,0.001,0.0,1.0,0.01 -5ce04880f90c,alm_max,0.005,0.0005,2.0,1.0,0.01 -6b261cb5d4cd,alm_max,0.0001,0.0005,0.0,1.0,0.01 -d0280a74c5a6,alm_max,0.005,0.001,2.0,1.0,0.01 -e9aeda9b61d1,alm_max,0.0001,0.001,2.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml b/benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml deleted file mode 100644 index dd18915..0000000 --- a/benchmark/equalized_odds_vec_folktables/alm_slack_config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -,algorithm,primal__lr,dual__lr,dual__penalty,moreau__mu,primal__weight_decay -cec56f56503a,alm_slack,0.0001,0.005,1.0,1.0,0.01 -cc783df21599,alm_slack,0.0001,0.0005,0.0,1.0,0.01 -566d9021804d,alm_slack,0.001,0.005,1.0,1.0,0.01 -7b6db7f4f6d3,alm_slack,0.005,0.0005,2.0,1.0,0.01 -cd1cff9743fc,alm_slack,0.001,0.0001,1.0,1.0,0.01 -572ec99a3d92,alm_slack,0.005,0.001,0.0,1.0,0.01 -ac5171af5dca,alm_slack,0.0005,0.005,1.0,1.0,0.01 -5755c834e89b,alm_slack,0.001,0.005,2.0,1.0,0.01 -f083ec83c93f,alm_slack,0.005,0.005,2.0,1.0,0.01 -ed8c14133386,alm_slack,0.0005,0.001,2.0,1.0,0.01 -f950d1ac108f,alm_slack,0.001,0.0005,0.0,1.0,0.01 -36c01dc54e83,alm_slack,0.001,0.001,0.0,1.0,0.01 -dc69572c4159,alm_slack,0.005,0.0001,0.0,1.0,0.01 -cee6947cfef0,alm_slack,0.0005,0.0001,2.0,1.0,0.01 -a922c152b2b8,alm_slack,0.0005,0.001,1.0,1.0,0.01 -18d51b324a4c,alm_slack,0.0001,0.001,2.0,1.0,0.01 -3ea3158a230f,alm_slack,0.0005,0.0005,2.0,1.0,0.01 -d4cc7fcedc51,alm_slack,0.0001,0.0005,2.0,1.0,0.01 -5782478e4fbc,alm_slack,0.001,0.0001,0.0,1.0,0.01 -43c9e14dfaf2,alm_slack,0.005,0.0005,0.0,1.0,0.01 -cdde59f55fc9,alm_slack,0.001,0.0005,1.0,1.0,0.01 -d3ea416c02a9,alm_slack,0.0005,0.001,0.0,1.0,0.01 -ac0098d7d0a6,alm_slack,0.0001,0.0001,2.0,1.0,0.01 -17429550d9f4,alm_slack,0.005,0.001,1.0,1.0,0.01 -9db90d4a4134,alm_slack,0.0005,0.0005,1.0,1.0,0.01 -7a6762f06ce3,alm_slack,0.0001,0.001,1.0,1.0,0.01 -79c20abb326c,alm_slack,0.005,0.0001,1.0,1.0,0.01 -0491270ec6e0,alm_slack,0.001,0.005,0.0,1.0,0.01 -80c7b6b98239,alm_slack,0.005,0.0005,1.0,1.0,0.01 -933899a25bbf,alm_slack,0.0001,0.001,0.0,1.0,0.01 -ad2034d52855,alm_slack,0.0005,0.005,2.0,1.0,0.01 -7ee7d1f6c7b0,alm_slack,0.005,0.0001,2.0,1.0,0.01 -39f57e156b18,alm_slack,0.001,0.0001,2.0,1.0,0.01 -38883b897053,alm_slack,0.001,0.001,1.0,1.0,0.01 -4d57e35042cf,alm_slack,0.0005,0.005,0.0,1.0,0.01 -93d90452bff2,alm_slack,0.0001,0.005,2.0,1.0,0.01 -d6c18607d11b,alm_slack,0.0001,0.005,0.0,1.0,0.01 -5f61c1cd9e1a,alm_slack,0.0005,0.0005,0.0,1.0,0.01 -c23bb42f0017,alm_slack,0.0005,0.0001,0.0,1.0,0.01 -cdf9ad7e3dec,alm_slack,0.001,0.0005,2.0,1.0,0.01 -927bb80943db,alm_slack,0.0001,0.0001,0.0,1.0,0.01 -d49d8cfa04a6,alm_slack,0.0005,0.0001,1.0,1.0,0.01 -f857187d973b,alm_slack,0.005,0.001,2.0,1.0,0.01 -4ddcccf87644,alm_slack,0.001,0.001,2.0,1.0,0.01 -bd5dbc158570,alm_slack,0.005,0.005,1.0,1.0,0.01 -776f577373fb,alm_slack,0.005,0.005,0.0,1.0,0.01 -76e6915542f1,alm_slack,0.0001,0.0005,1.0,1.0,0.01 -5ab6bba8e3ca,alm_slack,0.0001,0.0001,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/multirun.yaml b/benchmark/equalized_odds_vec_folktables/multirun.yaml deleted file mode 100644 index 0a52626..0000000 --- a/benchmark/equalized_odds_vec_folktables/multirun.yaml +++ /dev/null @@ -1,249 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: amdfast - qos: null - comment: null - constraint: null - exclude: null - gres: null - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 20G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 85 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=pbm_adapt - - algorithm.primal__lr=0.0001,0.0005,0.001,0.005 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__penalty_mult=0.8,0.9,0.99,0.999 - - algorithm.dual__penalty_update=dimin_adapt - - algorithm.dual__pbf=quadratic_logarithmic - - algorithm.dual__gamma=0.1,0.5,0.9,0.99,0.999 - - algorithm.dual__delta=1.0 - - algorithm.moreau__mu=1. - - seed=0,1,2 - - task=folktables_positive_rate_vec - - data=income_sex - job: - name: run_single_experiment - chdir: false - override_dirname: +algorithm.primal__weight_decay=0.01,algorithm.dual__delta=1.0,algorithm.dual__gamma=0.1,0.5,0.9,0.99,0.999,algorithm.dual__pbf=quadratic_logarithmic,algorithm.dual__penalty_mult=0.8,0.9,0.99,0.999,algorithm.dual__penalty_update=dimin_adapt,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0001,0.0005,0.001,0.005,algorithm=pbm_adapt,data=income_sex,seed=0,1,2,task=folktables_positive_rate_vec - id: ??? - num: ??? - config_name: experiment - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: pbm_adapt - data: income_sex - task: folktables_positive_rate_vec - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amd - hydra/output: default - verbose: false -task: - task: equalized_odds_vec - batch_size: 32 - constraint: - name: FairretAgg - bound: 0.2 - loss: NormLoss - statistic: PositiveRate - kwargs: - uses_labels: false - pbm_params: - primal__lr: 0.001 - dual__p_mult: 0.9 - dual__penalty_update: dimin_adapt - dual__pbf: quadratic_logarithmic - dual__gamma: 0.1 - moreau__mu: 2.0 - alm_params: - primal__lr: 0.001 - dual__lr: 0.001 - dual__penalty: 0.0 - dual__momentum: 0.0 - moreau__mu: 0.5 - ssg_params: - primal__lr: 0.05 - dual__lr: 0.01 - moreau__mu: 0.0 - adam_params: - lr: 0.001 - penalty: 0.5 - hydra: - run: - dir: . - job: - chdir: false -data: - name: folktables - kwargs: - sens_attrs: - - SEX - states: - - VA - extend_groups: false -algorithm: - algorithm: pbm_adapt - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__penalty_mult: 0.9, 0.99, 0.999 - dual__penalty_update: dimin_adapt - dual__pbf: quadratic_logarithmic - dual__gamma: 0.9, 0.99, 0.999 - dual__delta: 1.0 - moreau__mu: 1.0 - primal__weight_decay: 0.01 -n_epochs: 10 -seed: 0 diff --git a/benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml b/benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml deleted file mode 100644 index f88569c..0000000 --- a/benchmark/equalized_odds_vec_folktables/pbm_adapt_config.yaml +++ /dev/null @@ -1,81 +0,0 @@ -,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay -60f56507cd4c,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -bf9565806564,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -071ddb5683d4,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -d51eebe8db16,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -9a67b1f6536f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -020c17ed39bd,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -a589aa3dbad2,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -566d25376894,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -672a1c9d3dad,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -ea4fca5c8ff4,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -f874057d5c35,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -340c81f29a29,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -67b73c0400c1,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6d455fdf3528,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -0a0f4678f437,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -58e01f29ab7b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -13fdcce41dba,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -cfa719f8faa1,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -db40274af82b,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -a495ed9da514,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -b97988ffd179,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -674dc3cf594e,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -c365ab9925fd,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -29e748e8ade1,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -d58daacfd369,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -15427e1bb833,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -24748a322d62,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -17fb5f98c5b4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -602e062c9681,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -dee81252085e,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -31990615ab6f,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -8a42ad4255c7,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -7b48ecc7f38a,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -33984b429697,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -9a803dc7d6ba,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -cc90f2844936,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -32b6849dcbad,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d723c3e955f7,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -f031b6a2d804,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -fa5f6873cb0a,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -49de94ab2b32,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -4f0d8b62b67a,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -bc69d5fae4d5,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -d4d370a90084,pbm_adapt,0.001,0.8,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -aedf3b9b5db5,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -ff1524a3e9c4,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -3c688ec41977,pbm_adapt,0.005,0.999,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -17393d86f0c9,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -7e54e584d522,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -f603cf341477,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d29c00be029c,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -a1b5eecd84c0,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -71bb6e765a0e,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -fa96db597209,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -a32495735902,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -e1e41b55873f,pbm_adapt,0.0001,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -af15dc1bebb2,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -208abfc28683,pbm_adapt,0.001,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -296afd5844bb,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -4e9f482719a6,pbm_adapt,0.001,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -7675b71bdc60,pbm_adapt,0.0005,0.9,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -a74c07c24937,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -c8216c5aef09,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6ab7c477dfe2,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -176f601eba5e,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -a2add11b80f6,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -2fae08979e1b,pbm_adapt,0.0001,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -30b84710b7c7,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -9733db7ef789,pbm_adapt,0.0005,0.8,dimin_adapt,quadratic_logarithmic,0.9,1.0,1.0,0.01 -b383a17bdcf0,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -ca263b01ab7a,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -af06713d1914,pbm_adapt,0.005,0.8,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -ba8e0159e5d9,pbm_adapt,0.001,0.999,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -bfabfb565058,pbm_adapt,0.0001,0.99,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -dc691ada8f91,pbm_adapt,0.0001,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -b08ec6af198c,pbm_adapt,0.005,0.9,dimin_adapt,quadratic_logarithmic,0.1,1.0,1.0,0.01 -e3c2c488fbf4,pbm_adapt,0.0005,0.999,dimin_adapt,quadratic_logarithmic,0.5,1.0,1.0,0.01 -32939c0a7c2e,pbm_adapt,0.0005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 -979fba337fa2,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.99,1.0,1.0,0.01 -47aa6b2b17fa,pbm_adapt,0.005,0.99,dimin_adapt,quadratic_logarithmic,0.999,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml b/benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml deleted file mode 100644 index ba2126a..0000000 --- a/benchmark/equalized_odds_vec_folktables/pbm_dimin_config.yaml +++ /dev/null @@ -1,101 +0,0 @@ -,algorithm,primal__lr,dual__penalty_mult,dual__penalty_update,dual__pbf,dual__gamma,dual__delta,moreau__mu,primal__weight_decay -389c5cbb6667,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -ada4aaef2d69,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -7925ef53184a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -cde297aa6cb0,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6471406588ce,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -69332e9fe4ba,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -ad8695a7eda3,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -a753d48c0e68,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -88b4edb95aa6,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -9281594fca6b,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -d2b757a5cb38,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -1bbb246272c5,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -0dde9f347958,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -23b4248c811a,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -d0784d95d442,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -6eeb18d283e3,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d6660f1de3fa,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -d6bf073eb827,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -f476de00912f,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -120a930a2e0c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -01f30dcc5bd6,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -b77c50640c30,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -250dc18aabcb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -9c15e2e95fe5,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -3ac5399b5d39,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -24e1116dd537,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -7214504aed04,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -392c2e1b9caa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -fd497153d74f,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -66c57f9bc1e0,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -94e4588b2c7d,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -1c5bf81f55fb,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -208678e2267d,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -27f0f576bfd1,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -8fab6eda432a,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -afc9f298f66b,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -0a18682ae461,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -c5a067e6ab17,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -e1a25a0670d9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -061fa4999358,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -40859df64b24,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -f09f3e9f1341,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -e4f4ccaca2b5,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -5cbfdd56176d,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -eaab5ec98363,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -61988c4462a7,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -08e30464625e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -011fc61c8566,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -1f423e3ed794,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -906a466efd20,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -0e8bffc4f932,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -b629a874c5d2,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -9998722ae249,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -0492def7d833,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d8e5048fb582,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -353360e09942,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -bbf2c53df3a4,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -ee1d02f6139e,pbm_dimin,0.002,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -01ac36b34e7c,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -c5fdd72ae60c,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -c9d7770443b9,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -801d14bac102,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -e674c568a8a8,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -2abb052127a4,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -9fe1ad6a431b,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -e9fbbca123a3,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -0da39dd8fcfb,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -585b6ea87eae,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -1d544984d5c8,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -32625fb7c1a3,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -cec931bbe525,pbm_dimin,0.0005,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -8003eb358451,pbm_dimin,0.0001,0.9999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -e20d32d81b6d,pbm_dimin,0.005,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -761c77614b9b,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -d22048bd7d02,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -8d5fb32d38cd,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -d1695142f03b,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -db75a7654304,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -71550301ae4b,pbm_dimin,0.001,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -8a90dedab180,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -6acae96c7549,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -eac93c19e6fa,pbm_dimin,0.001,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -2f6ba0d8c3db,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -2ba8129e76de,pbm_dimin,0.0005,0.999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -706306691690,pbm_dimin,0.001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -bb7077d50e0a,pbm_dimin,0.002,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -03f04267c6bd,pbm_dimin,0.005,0.999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -aaaba3b0457b,pbm_dimin,0.005,0.99,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -6a8464cf6a33,pbm_dimin,0.005,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -a9fa87857b58,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -c2eb578026db,pbm_dimin,0.0001,1.0,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -c518364671b9,pbm_dimin,0.0001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -0651f3927c48,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -53e6d78a3f6b,pbm_dimin,0.0005,1.0,dimin,quadratic_logarithmic,0.8,1.0,1.0,0.01 -501440caa4de,pbm_dimin,0.0001,0.99,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -8d170ce02cf4,pbm_dimin,0.0005,0.99,dimin,quadratic_logarithmic,0.999,1.0,1.0,0.01 -36e32e0cec94,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.99,1.0,1.0,0.01 -c56c357701f4,pbm_dimin,0.001,0.999,dimin,quadratic_logarithmic,0.9500000000000001,1.0,1.0,0.01 -1bdf67060b07,pbm_dimin,0.002,0.9999,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 -6a4b06bf5ffa,pbm_dimin,0.002,0.99,dimin,quadratic_logarithmic,0.9,1.0,1.0,0.01 diff --git a/benchmark/equalized_odds_vec_folktables/ssg_config.yaml b/benchmark/equalized_odds_vec_folktables/ssg_config.yaml deleted file mode 100644 index 0ca60c6..0000000 --- a/benchmark/equalized_odds_vec_folktables/ssg_config.yaml +++ /dev/null @@ -1,17 +0,0 @@ -,algorithm,primal__lr,dual__lr,moreau__mu,primal__weight_decay -dd977b38b115,ssg,0.0001,0.0001,1.0,0.01 -a779bc91982f,ssg,0.0001,0.005,1.0,0.01 -5b53d46e1f43,ssg,0.005,0.0001,1.0,0.01 -c6e8d69207c9,ssg,0.001,0.0005,1.0,0.01 -1f09bf71a728,ssg,0.0005,0.0005,1.0,0.01 -ba47d5d07a71,ssg,0.0001,0.0005,1.0,0.01 -c3c60b74a2f6,ssg,0.001,0.005,1.0,0.01 -6489a3166ee5,ssg,0.0005,0.005,1.0,0.01 -08af6b79a6f6,ssg,0.005,0.0005,1.0,0.01 -b4f96a7ac4de,ssg,0.005,0.001,1.0,0.01 -1e782e2ac50a,ssg,0.001,0.0001,1.0,0.01 -ac60b4c7b56b,ssg,0.001,0.001,1.0,0.01 -c51877d903c0,ssg,0.0005,0.001,1.0,0.01 -04d4e9b32fe3,ssg,0.0001,0.001,1.0,0.01 -3e8cfc283731,ssg,0.005,0.005,1.0,0.01 -3d88cf139676,ssg,0.0005,0.0001,1.0,0.01 diff --git a/benchmark/helmholtz_helmholtz/multirun.yaml b/benchmark/helmholtz_helmholtz/multirun.yaml deleted file mode 100644 index 3c24961..0000000 --- a/benchmark/helmholtz_helmholtz/multirun.yaml +++ /dev/null @@ -1,208 +0,0 @@ -hydra: - run: - dir: multirun/${task.task}_${data.name}/${algorithm.algorithm} - sweep: - dir: multirun/${task.task}_${data.name} - subdir: ./${algorithm.algorithm} - launcher: - submitit_folder: ${hydra.sweep.dir}/.submitit/%j - timeout_min: 60 - cpus_per_task: 4 - gpus_per_node: null - tasks_per_node: 1 - mem_gb: null - nodes: 1 - name: ${hydra.job.name} - stderr_to_stdout: false - _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher - partition: h200fast,amdgpufast - qos: null - comment: null - constraint: null - exclude: null - gres: gpu=1 - cpus_per_gpu: null - gpus_per_task: null - mem_per_gpu: null - mem_per_cpu: 10G - account: null - signal_delay_s: 120 - max_num_timeout: 0 - additional_parameters: {} - array_parallelism: 256 - setup: null - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: 99 - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: MULTIRUN - searchpath: [] - callbacks: {} - output_subdir: null - overrides: - hydra: - - hydra.mode=MULTIRUN - task: - - algorithm=alm - - algorithm.primal__lr=0.0005,0.001,0.005 - - +algorithm.primal__weight_decay=0.01 - - algorithm.dual__lr=0.0005,0.001,0.005 - - algorithm.dual__penalty=0.,1.,2. - - algorithm.moreau__mu=1. - - seed=0,1,2 - - task=helmholtz - - data=helmholtz - - model=deep_narrow - - +algorithm.beta=1 - job: - name: PDE_Helmholtz - chdir: false - override_dirname: +algorithm.beta=1,+algorithm.primal__weight_decay=0.01,algorithm.dual__lr=0.0005,0.001,0.005,algorithm.dual__penalty=0.,1.,2.,algorithm.moreau__mu=1.,algorithm.primal__lr=0.0005,0.001,0.005,algorithm=alm,data=helmholtz,model=deep_narrow,seed=0,1,2,task=helmholtz - id: ??? - num: ??? - config_name: helmholtz - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /mnt/personal/kliacand/humancompatible-train/benchmark - config_sources: - - path: hydra.conf - schema: pkg - provider: hydra - - path: /mnt/personal/kliacand/humancompatible-train/benchmark/conf - schema: file - provider: main - - path: '' - schema: structured - provider: schema - output_dir: ??? - choices: - algorithm: alm - data: helmholtz - task: helmholtz - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: configured_submitit_slurm_amdgpu - hydra/output: default - verbose: false -task: - task: helmholtz -data: - name: helmholtz -algorithm: - algorithm: alm - primal__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__lr: 0.0001, 0.0005, 0.001, 0.005 - dual__penalty: 0., 1., 2. - moreau__mu: 1.0 - primal__weight_decay: 0.01 - beta: 1 -n_epochs: 10000 -seed: 0 -model: deep_narrow diff --git a/run.batch b/run.batch deleted file mode 100644 index d945c2e..0000000 --- a/run.batch +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -#SBATCH --time=4:00:00 -#SBATCH --partition=amdgpufast -#SBATCH --nodes=1 -#SBATCH --mem=150G -#SBATCH --gres=gpu:1 -#SBATCH --cpus-per-task=1 -#SBATCH --out=./logs/simulator/output_tiny.stdout -#SBATCH --err=./logs/simulator/err_tiny.out -#SBATCH --mail-user=bosakad1@fel.cvut.cz -#SBATCH --mail-type=ALL -#SBATCH --job-name=humancompatible - -ml load Python/3.13.1-GCCcore-14.2.0 -ml load GCCcore/14.2.0 -ml load PyTorch/2.7.1-foss-2025a-CUDA-12.8.0 -ml load torchvision/0.22.1-foss-2025a-CUDA-12.8.0 -source env_humancompatible/bin/activate - -python3 tiny_image_net.py diff --git a/setup.txt b/setup.txt deleted file mode 100644 index 19ebf38..0000000 --- a/setup.txt +++ /dev/null @@ -1,14 +0,0 @@ - -srun -p gpufast --gres=gpu:1 --pty bash -i -srun -p h200fast --mem=150GB --gres=gpu:1 --pty bash -i - -ml load Python/3.13.1-GCCcore-14.2.0 -ml load GCCcore/14.2.0 -ml load PyTorch/2.7.1-foss-2025a-CUDA-12.8.0 -ml load torchvision/0.22.1-foss-2025a-CUDA-12.8.0 - -source env_humancompatible/bin/activate - - -# old -ml load PyTorch/2.10.0-foss-2025a-CUDA-12.8.0 \ No newline at end of file From 321359b86d4b6e5fc740e764e01c075fa7bff692 Mon Sep 17 00:00:00 2001 From: andrewklayk Date: Fri, 22 May 2026 13:22:02 +0200 Subject: [PATCH 14/16] tests and setup update --- .github/workflows/setup.yml | 41 +++++-------------------------------- tests/test_pbm.py | 6 +++--- 2 files changed, 8 insertions(+), 39 deletions(-) diff --git a/.github/workflows/setup.yml b/.github/workflows/setup.yml index cdbbc11..5379770 100644 --- a/.github/workflows/setup.yml +++ b/.github/workflows/setup.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11"] + python-version: ["3.12"] steps: - uses: actions/checkout@v4 @@ -30,24 +30,14 @@ jobs: - name: Run tests run: | python -m unittest - - name: Install benchmark dependencies - run: | - pip install -r requirements_benchmark.txt - pip install -e . - - name: Run algorithms - run: | - python experiments/run_folktables.py alg=sslalm n_runs=2 run_maxtime=2 - python experiments/run_folktables.py alg=ghost n_runs=2 run_maxtime=2 - python experiments/run_folktables.py alg=alm n_runs=2 run_maxtime=2 - python experiments/run_folktables.py alg=sgd n_runs=2 run_maxtime=2 - + run-on-windows: name: Setup on windows runs-on: windows-latest strategy: fail-fast: false matrix: - python-version: ["3.11"] + python-version: ["3.12"] steps: - uses: actions/checkout@v4 @@ -63,16 +53,6 @@ jobs: - name: Run tests run: | python -m unittest - - name: Install benchmark dependencies - run: | - pip install -r requirements_benchmark.txt - pip install -e . - - name: Run algorithms - run: | - python experiments/run_folktables.py alg=sslalm n_runs=2 run_maxtime=2 - python experiments/run_folktables.py alg=ghost n_runs=2 run_maxtime=2 - python experiments/run_folktables.py alg=alm n_runs=2 run_maxtime=2 - python experiments/run_folktables.py alg=sgd n_runs=2 run_maxtime=2 run-on-macos: name: Setup on macos @@ -80,7 +60,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11"] + python-version: ["3.12"] steps: - uses: actions/checkout@v4 @@ -95,15 +75,4 @@ jobs: pip install -e . - name: Run tests run: | - python -m unittest - # - name: Install benchmark dependencies - # run: | - # pip install -U --force-reinstall certifi - # pip install -r requirements_benchmark.txt - # pip install -e . - # - name: Run algorithms - # run: | - # python experiments/run_folktables.py alg=sslalm n_runs=2 run_maxtime=2 - # python experiments/run_folktables.py alg=ghost n_runs=2 run_maxtime=2 - # python experiments/run_folktables.py alg=alm n_runs=2 run_maxtime=2 - # python experiments/run_folktables.py alg=sgd n_runs=2 run_maxtime=2 + python -m unittest \ No newline at end of file diff --git a/tests/test_pbm.py b/tests/test_pbm.py index 0f44648..a7fa2d7 100644 --- a/tests/test_pbm.py +++ b/tests/test_pbm.py @@ -114,7 +114,7 @@ class TestPenaltyUpdateStrategies(unittest.TestCase): def test_constant_penalty(self): """Test that penalty_update='const' keeps penalties constant during forward_update.""" init_penalty = 5.0 - pbm = PBM(m=3, penalty_update='const', init_penalties=init_penalty) + pbm = PBM(m=3, penalty_update='const', init_penalties=init_penalty, penalty_range=(0.1, 100.)) penalties_before = pbm.penalties.clone() loss = torch.tensor(1.0) @@ -453,8 +453,8 @@ def test_gamma_affects_dual_convergence_rate(self): def test_delta_affects_adaptive_penalty_behavior(self): """Test that delta parameter affects adaptive penalty update.""" - pbm_low_delta = PBM(m=1, penalty_update='dimin_adapt', delta=0.5, penalty_mult=0.8, init_penalties=10.0) - pbm_high_delta = PBM(m=1, penalty_update='dimin_adapt', delta=2.0, penalty_mult=0.8, init_penalties=10.0) + pbm_low_delta = PBM(m=1, penalty_update='dimin_adapt', delta=0.5, penalty_mult=0.8, init_penalties=10.0, penalty_range=(0.1, 100.)) + pbm_high_delta = PBM(m=1, penalty_update='dimin_adapt', delta=2.0, penalty_mult=0.8, init_penalties=10.0, penalty_range=(0.1, 100.)) loss = torch.tensor(1.0) # Constraint with significant violation From 194e7022b42af55f3f01c0b41eff8a073aa416dc Mon Sep 17 00:00:00 2001 From: andrewklayk Date: Fri, 22 May 2026 13:23:19 +0200 Subject: [PATCH 15/16] refactor alm --- src/humancompatible/train/dual_optim/alm.py | 203 +++++++++++--------- 1 file changed, 108 insertions(+), 95 deletions(-) diff --git a/src/humancompatible/train/dual_optim/alm.py b/src/humancompatible/train/dual_optim/alm.py index 2b34684..9cb4a87 100644 --- a/src/humancompatible/train/dual_optim/alm.py +++ b/src/humancompatible/train/dual_optim/alm.py @@ -19,7 +19,7 @@ def __init__( dual_range: Tuple[float, float] = (0.0, 100.0), momentum: float = 0.0, dampening: float = 0.0, - ctol: float = 1e-4, + ctol: float = 0., device=None, ) -> None: """ @@ -50,53 +50,12 @@ def __init__( self.ctol = ctol self.penalty = penalty - duals, defaults = self._init_constraint_group( + duals, defaults = _init_constraint_group( m, lr, momentum, dampening, init_duals, dual_range, device ) super().__init__(duals, defaults) - @staticmethod - def _init_constraint_group( - m: int = None, - lr: float = None, - momentum: float = None, - dampening: float = None, - init_duals: float | Tensor = None, - dual_range: Tuple[float, float] = None, - device=None, - ): - ## checks ## - if init_duals is None and m is None: - raise ValueError("At least one of`m`,`init_duals` must be set") - - if momentum is not None and (momentum < 0 or momentum > 1): - raise ValueError(f"`momentum`must be within [0,1]; got {momentum}") - - m = m if m is not None else len(init_duals) - - if init_duals is None: # initialize duals if not set or set to scalar - init_duals = ( - torch.zeros(m, requires_grad=False, device=device) + dual_range[0] - ) - elif isinstance(init_duals, float): - init_duals = torch.zeros(m, requires_grad=False, device=device) + init_duals - - duals = Parameter(init_duals, requires_grad=False) - - settings_dict = { - "lr": lr, - "momentum": momentum, - "dampening": dampening, - "momentum_buffer": torch.zeros_like( - init_duals, requires_grad=False, device=device - ), - } - settings_dict = {k: v for k, v in settings_dict.items() if v is not None} - - param_group = ([duals], settings_dict) - return param_group - @property def duals(self) -> Tensor: """ @@ -123,12 +82,22 @@ def add_constraint_group( :param init_duals: Initial values for the new dual variables :type init_duals: Tensor """ - duals, settings_dict = self._init_constraint_group( + duals, settings_dict = _init_constraint_group( m, lr, momentum, dampening, init_duals, self.dual_range ) param_group_dict = {"params": duals, **settings_dict} self.add_param_group(param_group_dict) + def _add_penalty_term(self, lagrangian: Tensor, constraints: Tensor) -> None: + """Add penalty term to lagrangian in-place.""" + if self.penalty > 0: + lagrangian.add_( + 0.5 + * self.penalty + * torch.dot(constraints - self.ctol, constraints - self.ctol) + ) + + def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: """ Calculates and returns the Augmented Lagrangian. @@ -142,46 +111,28 @@ def forward(self, loss: Tensor, constraints: Tensor) -> Tensor: """ lagrangian = torch.zeros_like(loss) lagrangian.add_(loss) - for i, group in enumerate(self.param_groups): - duals = group["params"][0] - group_constraints = ( - constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol - ) - lagrangian.add_(duals @ group_constraints) - if self.penalty > 0: - lagrangian.add_( - 0.5 - * self.penalty - * torch.dot(constraints - self.ctol, constraints - self.ctol) + for i in range(len(self.param_groups)): + duals, group_constraints = _process_constraint_group( + self.param_groups[i], i, constraints, self.ctol, self.dual_range, update_duals=False ) + lagrangian.add_(duals @ group_constraints) + self._add_penalty_term(lagrangian, constraints) return lagrangian + def update(self, constraints: Tensor) -> None: - """""" """ Updates the dual variables - + :param constraints: Tensor of constraint values :type constraints: Tensor """ - for i, group in enumerate(self.param_groups): - duals, lr, momentum, dampening, momentum_buffer = ( - group["params"][0], - group["lr"], - group["momentum"], - group["dampening"], - group["momentum_buffer"], + for i in range(len(self.param_groups)): + _process_constraint_group( + self.param_groups[i], i, constraints, self.ctol, self.dual_range, update_duals=True ) - group_constraints = ( - constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol - ) - with torch.no_grad(): - _update_duals( - duals, group_constraints, lr, momentum, dampening, momentum_buffer - ) - clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) # evaluate the Lagrangian and update the dual variables def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: @@ -197,32 +148,14 @@ def forward_update(self, loss: Tensor, constraints: Tensor) -> Tensor: """ lagrangian = torch.zeros_like(loss) lagrangian.add_(loss) - for i, group in enumerate(self.param_groups): - duals, lr, momentum, dampening, momentum_buffer = ( - group["params"][0], - group["lr"], - group["momentum"], - group["dampening"], - group["momentum_buffer"], - ) - group_constraints = ( - constraints[i * len(duals) : (i + 1) * len(duals)] - self.ctol - ) - with torch.no_grad(): - _update_duals( - duals, group_constraints, lr, momentum, dampening, momentum_buffer - ) - clamp_(duals, min=self.dual_range[0], max=self.dual_range[1]) - lagrangian.add_(duals @ group_constraints) - - if self.penalty > 0: - lagrangian.add_( - 0.5 - * self.penalty - * torch.dot(constraints - self.ctol, constraints - self.ctol) + for i in range(len(self.param_groups)): + duals, group_constraints = _process_constraint_group( + self.param_groups[i], i, constraints, self.ctol, self.dual_range, update_duals=True ) + lagrangian.add_(duals @ group_constraints) + self._add_penalty_term(lagrangian, constraints) return lagrangian def state_dict(self) -> dict[str, Any]: @@ -247,6 +180,86 @@ def load_state_dict(self, state_dict: dict[str, Any]) -> None: self.param_groups.append(param) +def _process_constraint_group( + group: dict[str, Any], + group_idx: int, + constraints: Tensor, + ctol: float, + dual_range: Tuple[float, float], + update_duals: bool = False, +) -> Tuple[Tensor, Tensor]: + """ + Process a single constraint group: extract duals/constraints and optionally update duals. + + :param group: The constraint group dictionary + :param group_idx: Index of the constraint group + :param constraints: Full constraints tensor + :param ctol: Constraint tolerance + :param dual_range: Safeguarding range for dual variables + :param update_duals: Whether to update dual variables + :return: Tuple of (duals, group_constraints) + """ + duals = group["params"][0] + group_constraints = ( + constraints[group_idx * len(duals) : (group_idx + 1) * len(duals)] - ctol + ) + + if update_duals: + lr = group.get("lr") + momentum = group.get("momentum", 0.0) + dampening = group.get("dampening", 0.0) + momentum_buffer = group["momentum_buffer"] + + with torch.no_grad(): + _update_duals( + duals, group_constraints, lr, momentum, dampening, momentum_buffer + ) + clamp_(duals, min=dual_range[0], max=dual_range[1]) + + return duals, group_constraints + + +def _init_constraint_group( + m: int = None, + lr: float = None, + momentum: float = None, + dampening: float = None, + init_duals: float | Tensor = None, + dual_range: Tuple[float, float] = None, + device=None, + ): + ## checks ## + if init_duals is None and m is None: + raise ValueError("At least one of`m`,`init_duals` must be set") + + if momentum is not None and (momentum < 0 or momentum > 1): + raise ValueError(f"`momentum`must be within [0,1]; got {momentum}") + + m = m if m is not None else len(init_duals) + + if init_duals is None: # initialize duals if not set or set to scalar + init_duals = ( + torch.zeros(m, requires_grad=False, device=device) + dual_range[0] + ) + elif isinstance(init_duals, float): + init_duals = torch.zeros(m, requires_grad=False, device=device) + init_duals + + duals = Parameter(init_duals, requires_grad=False) + + settings_dict = { + "lr": lr, + "momentum": momentum, + "dampening": dampening, + "momentum_buffer": torch.zeros_like( + init_duals, requires_grad=False, device=device + ), + } + settings_dict = {k: v for k, v in settings_dict.items() if v is not None} + + param_group = ([duals], settings_dict) + return param_group + + def _update_duals( duals: Tensor, constraints: Tensor, From 5067254595501d76cf80c0e2ca7f76b4835204aa Mon Sep 17 00:00:00 2001 From: andrewklayk Date: Fri, 22 May 2026 15:31:08 +0200 Subject: [PATCH 16/16] temp fix to balancedbatchsampler --- .../fairness/utils/balanced_batch_sampler.py | 12 ++-- tests/test_balanced_batch_sampler.py | 56 ++++++++++--------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/humancompatible/train/fairness/utils/balanced_batch_sampler.py b/src/humancompatible/train/fairness/utils/balanced_batch_sampler.py index fe6fcd8..2fb8370 100644 --- a/src/humancompatible/train/fairness/utils/balanced_batch_sampler.py +++ b/src/humancompatible/train/fairness/utils/balanced_batch_sampler.py @@ -71,12 +71,15 @@ def __iter__(self): # determine number of tiles if not self._extend_groups or group_id not in self._extend_groups: num_tiles = 1 + tile_size = len(group_indices) else: - num_tiles = ceil(max(self._group_sizes) / self._group_sizes[group_id]) - # tile with random reorderings of list of indices of the group + num_tiles = ceil(max(self._group_sizes) / self._n_samples_per_group) + tile_size = self._n_samples_per_group + # num_tiles = ceil(max(self._group_sizes) / self._group_sizes[group_id]) + # tile with random n_samples_per_group-sized reorderings of list of indices of the group for _ in range(num_tiles): - # shuffle - indices_shuffled = torch.randperm(len(group_indices), generator=self.generator).tolist() + # shuffle within tile + indices_shuffled = torch.randperm(len(group_indices), generator=self.generator).tolist()[: tile_size] # add new shuffled tile to the indices group_indices_tiled_shuffled.extend(indices_shuffled) # cutoff at the length of max group @@ -95,7 +98,6 @@ def __iter__(self): for indices in self._group_indices ): max_batches += 1 # Include partial batches if drop_last is False - # Yield balanced batches for batch_idx in range(max_batches): batch = [] diff --git a/tests/test_balanced_batch_sampler.py b/tests/test_balanced_batch_sampler.py index 4c3afe8..62ae520 100644 --- a/tests/test_balanced_batch_sampler.py +++ b/tests/test_balanced_batch_sampler.py @@ -23,6 +23,35 @@ def setUp(self): ] ).T + + def test_extends_without_replacement(self): + for _ in range(10): # Run multiple times to check randomness + sampler = BalancedBatchSampler( + group_indices=self.subset_indices, + batch_size=6, + drop_last=True, + extend_groups=[0, 1], + ) + # Check that each extended group is sampled without replacement within a batch + batches = [] + for i, batch in enumerate(sampler): + self.assertEqual(len(set(batch)), len(batch)) + batches.extend(batch) + + + def test_extend_num_batches(self): + sampler = BalancedBatchSampler( + group_indices=self.subset_indices, + batch_size=6, + drop_last=True, + extend_groups=[0, 1], + ) + # check correct number of batches in case of tiling + i = 0 + for _ in iter(sampler): + i += 1 + self.assertEqual(i, 2) + def test_batch_size_divisible(self): with self.assertRaises(AssertionError): BalancedBatchSampler( @@ -72,32 +101,7 @@ def test_balanced_extended_batches(self): self.assertEqual(len([i for i in batch if i in self.subset_indices[1]]), 2) self.assertEqual(len([i for i in batch if i in self.subset_indices[2]]), 2) - def test_extends_without_replacement(self): - sampler = BalancedBatchSampler( - group_indices=self.subset_indices, - batch_size=6, - drop_last=True, - extend_groups=[0, 1], - ) - # Check that each extended group is sampled without replacement within a batch - batches = [] - for i, batch in enumerate(sampler): - self.assertEqual(len(set(batch)), len(batch)) - batches.extend(batch) - - - def test_extend_num_batches(self): - sampler = BalancedBatchSampler( - group_indices=self.subset_indices, - batch_size=6, - drop_last=True, - extend_groups=[0, 1], - ) - # check correct number of batches in case of tiling - i = 0 - for _ in iter(sampler): - i += 1 - self.assertEqual(i, 2) + def test_extend_large_batchsize(self): # check AssertionError on batch_size / n_groups > size of one of the groups