aboutsummaryrefslogtreecommitdiff
path: root/code/sunlab/common/distribution
diff options
context:
space:
mode:
authorChristian C <cc@localhost>2024-11-11 12:29:32 -0800
committerChristian C <cc@localhost>2024-11-11 12:29:32 -0800
commitb85ee9d64a536937912544c7bbd5b98b635b7e8d (patch)
treecef7bc17d7b29f40fc6b1867d0ce0a742d5583d0 /code/sunlab/common/distribution
Initial commit
Diffstat (limited to 'code/sunlab/common/distribution')
-rw-r--r--code/sunlab/common/distribution/__init__.py7
-rw-r--r--code/sunlab/common/distribution/adversarial_distribution.py35
-rw-r--r--code/sunlab/common/distribution/gaussian_distribution.py23
-rw-r--r--code/sunlab/common/distribution/o_gaussian_distribution.py38
-rw-r--r--code/sunlab/common/distribution/s_gaussian_distribution.py40
-rw-r--r--code/sunlab/common/distribution/swiss_roll_distribution.py42
-rw-r--r--code/sunlab/common/distribution/symmetric_uniform_distribution.py21
-rw-r--r--code/sunlab/common/distribution/uniform_distribution.py21
-rw-r--r--code/sunlab/common/distribution/x_gaussian_distribution.py38
9 files changed, 265 insertions, 0 deletions
diff --git a/code/sunlab/common/distribution/__init__.py b/code/sunlab/common/distribution/__init__.py
new file mode 100644
index 0000000..a23cb0c
--- /dev/null
+++ b/code/sunlab/common/distribution/__init__.py
@@ -0,0 +1,7 @@
+from .gaussian_distribution import *
+from .x_gaussian_distribution import *
+from .o_gaussian_distribution import *
+from .s_gaussian_distribution import *
+from .uniform_distribution import *
+from .symmetric_uniform_distribution import *
+from .swiss_roll_distribution import *
diff --git a/code/sunlab/common/distribution/adversarial_distribution.py b/code/sunlab/common/distribution/adversarial_distribution.py
new file mode 100644
index 0000000..675c00e
--- /dev/null
+++ b/code/sunlab/common/distribution/adversarial_distribution.py
@@ -0,0 +1,35 @@
+class AdversarialDistribution:
+ """# Distribution Class to use in Adversarial Autoencoder
+
+ For any distribution to be implemented, make sure to ensure each of the
+ methods are implemented"""
+
+ def __init__(self, N):
+ """# Initialize the distribution for N-dimensions"""
+ self.dims = N
+ return
+
+ def get_full_name(self):
+ """# Return a human-readable name of the distribution"""
+ return self.full_name
+
+ def get_name(self):
+ """# Return a shortened name of the distribution
+
+ Preferrably, the name should include characters that can be included in
+ a file name"""
+ return self.name
+
+ def __str__(self):
+ """# Returns the short name"""
+ return self.get_name()
+
+ def __repr__(self):
+ """# Returns the short name"""
+ return self.get_name()
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use `dist(...)`"""
+ raise NotImplementedError("This distribution has not been implemented yet")
diff --git a/code/sunlab/common/distribution/gaussian_distribution.py b/code/sunlab/common/distribution/gaussian_distribution.py
new file mode 100644
index 0000000..e478ab6
--- /dev/null
+++ b/code/sunlab/common/distribution/gaussian_distribution.py
@@ -0,0 +1,23 @@
+from .adversarial_distribution import *
+
+
+class GaussianDistribution(AdversarialDistribution):
+ """# Gaussian Distribution"""
+
+ def __init__(self, N):
+ """# Gaussian Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ self.full_name = f"{N}-Dimensional Gaussian Distribution"
+ self.name = "G"
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use gauss(N1,...,Nm)"""
+ import numpy as np
+
+ return np.random.multivariate_normal(
+ mean=np.zeros(self.dims), cov=np.eye(self.dims), size=[*args]
+ )
diff --git a/code/sunlab/common/distribution/o_gaussian_distribution.py b/code/sunlab/common/distribution/o_gaussian_distribution.py
new file mode 100644
index 0000000..1222ca1
--- /dev/null
+++ b/code/sunlab/common/distribution/o_gaussian_distribution.py
@@ -0,0 +1,38 @@
+from .adversarial_distribution import *
+
+
+class OGaussianDistribution(AdversarialDistribution):
+ """# O Gaussian Distribution"""
+
+ def __init__(self, N):
+ """# O Gaussian Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ assert self.dims == 2, "This Distribution only Supports 2-Dimensions"
+ self.full_name = "2-Dimensional O-Gaussian Distribution"
+ self.name = "OG"
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use xgauss(case_count)"""
+ import numpy as np
+
+ assert len(args) == 1, "Only 1 argument supported"
+ N = args[0]
+ sample_base = np.zeros((4 * N, 2))
+ sample_base[0 * N : (0 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[1, 1], cov=[[1, 0], [0, 1]], size=[N]
+ )
+ sample_base[1 * N : (1 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[-1, -1], cov=[[1, 0], [0, 1]], size=[N]
+ )
+ sample_base[2 * N : (2 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[-1, 1], cov=[[1, 0], [0, 1]], size=[N]
+ )
+ sample_base[3 * N : (3 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[1, -1], cov=[[1, 0], [0, 1]], size=[N]
+ )
+ np.random.shuffle(sample_base)
+ return sample_base[:N, :]
diff --git a/code/sunlab/common/distribution/s_gaussian_distribution.py b/code/sunlab/common/distribution/s_gaussian_distribution.py
new file mode 100644
index 0000000..cace57f
--- /dev/null
+++ b/code/sunlab/common/distribution/s_gaussian_distribution.py
@@ -0,0 +1,40 @@
+from .adversarial_distribution import *
+
+
+class SGaussianDistribution(AdversarialDistribution):
+ """# S Gaussian Distribution"""
+
+ def __init__(self, N, scale=0):
+ """# S Gaussian Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ assert self.dims == 2, "This Distribution only Supports 2-Dimensions"
+ self.full_name = "2-Dimensional S-Gaussian Distribution"
+ self.name = "SG"
+ self.scale = scale
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use xgauss(case_count)"""
+ import numpy as np
+
+ assert len(args) == 1, "Only 1 argument supported"
+ N = args[0]
+ sample_base = np.zeros((4 * N, 2))
+ scale = self.scale
+ sample_base[0 * N : (0 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[1, 1], cov=[[1, scale], [scale, 1]], size=[N]
+ )
+ sample_base[1 * N : (1 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[-1, -1], cov=[[1, scale], [scale, 1]], size=[N]
+ )
+ sample_base[2 * N : (2 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[-1, 1], cov=[[1, -scale], [-scale, 1]], size=[N]
+ )
+ sample_base[3 * N : (3 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[1, -1], cov=[[1, -scale], [-scale, 1]], size=[N]
+ )
+ np.random.shuffle(sample_base)
+ return sample_base[:N, :]
diff --git a/code/sunlab/common/distribution/swiss_roll_distribution.py b/code/sunlab/common/distribution/swiss_roll_distribution.py
new file mode 100644
index 0000000..613bfc5
--- /dev/null
+++ b/code/sunlab/common/distribution/swiss_roll_distribution.py
@@ -0,0 +1,42 @@
+from .adversarial_distribution import *
+
+
+class SwissRollDistribution(AdversarialDistribution):
+ """# Swiss Roll Distribution"""
+
+ def __init__(self, N, scaling_factor=0.25, noise_level=0.15):
+ """# Swiss Roll Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ assert (self.dims == 2) or (
+ self.dims == 3
+ ), "This Distribution only Supports 2,3-Dimensions"
+ self.full_name = f"{self.dims}-Dimensional Swiss Roll Distribution Distribution"
+ self.name = f"SR{self.dims}"
+ self.noise_level = noise_level
+ self.scale = scaling_factor
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use xgauss(case_count)"""
+ import numpy as np
+
+ assert len(args) == 1, "Only 1 argument supported"
+ N = args[0]
+ noise = self.noise_level
+ scaling_factor = self.scale
+
+ t = 3 * np.pi / 2 * (1 + 2 * np.random.rand(1, N))
+ h = 21 * np.random.rand(1, N)
+ RANDOM = np.random.randn(3, N) * noise
+ data = (
+ np.concatenate(
+ (scaling_factor * t * np.cos(t), h, scaling_factor * t * np.sin(t))
+ )
+ + RANDOM
+ )
+ if self.dims == 2:
+ return data.T[:, [0, 2]]
+ return data.T[:, [0, 2, 1]]
diff --git a/code/sunlab/common/distribution/symmetric_uniform_distribution.py b/code/sunlab/common/distribution/symmetric_uniform_distribution.py
new file mode 100644
index 0000000..c3a4db0
--- /dev/null
+++ b/code/sunlab/common/distribution/symmetric_uniform_distribution.py
@@ -0,0 +1,21 @@
+from .adversarial_distribution import *
+
+
+class SymmetricUniformDistribution(AdversarialDistribution):
+ """# Symmetric Uniform Distribution on [-1, 1)"""
+
+ def __init__(self, N):
+ """# Symmetric Uniform Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ self.full_name = f"{N}-Dimensional Symmetric Uniform Distribution"
+ self.name = "SU"
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use suniform(N1,...,Nm)"""
+ import numpy as np
+
+ return np.random.rand(*args, self.dims) * 2.0 - 1.0
diff --git a/code/sunlab/common/distribution/uniform_distribution.py b/code/sunlab/common/distribution/uniform_distribution.py
new file mode 100644
index 0000000..3e23e67
--- /dev/null
+++ b/code/sunlab/common/distribution/uniform_distribution.py
@@ -0,0 +1,21 @@
+from .adversarial_distribution import *
+
+
+class UniformDistribution(AdversarialDistribution):
+ """# Uniform Distribution on [0, 1)"""
+
+ def __init__(self, N):
+ """# Uniform Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ self.full_name = f"{N}-Dimensional Uniform Distribution"
+ self.name = "U"
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use uniform(N1,...,Nm)"""
+ import numpy as np
+
+ return np.random.rand(*args, self.dims)
diff --git a/code/sunlab/common/distribution/x_gaussian_distribution.py b/code/sunlab/common/distribution/x_gaussian_distribution.py
new file mode 100644
index 0000000..b4330aa
--- /dev/null
+++ b/code/sunlab/common/distribution/x_gaussian_distribution.py
@@ -0,0 +1,38 @@
+from .adversarial_distribution import *
+
+
+class XGaussianDistribution(AdversarialDistribution):
+ """# X Gaussian Distribution"""
+
+ def __init__(self, N):
+ """# X Gaussian Distribution Initialization
+
+ Initializes the name and dimensions"""
+ super().__init__(N)
+ assert self.dims == 2, "This Distribution only Supports 2-Dimensions"
+ self.full_name = "2-Dimensional X-Gaussian Distribution"
+ self.name = "XG"
+
+ def __call__(self, *args):
+ """# Magic method when calling the distribution
+
+ This method is going to be called when you use xgauss(case_count)"""
+ import numpy as np
+
+ assert len(args) == 1, "Only 1 argument supported"
+ N = args[0]
+ sample_base = np.zeros((4 * N, 2))
+ sample_base[0 * N : (0 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[1, 1], cov=[[1, 0.7], [0.7, 1]], size=[N]
+ )
+ sample_base[1 * N : (1 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[-1, -1], cov=[[1, 0.7], [0.7, 1]], size=[N]
+ )
+ sample_base[2 * N : (2 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[-1, 1], cov=[[1, -0.7], [-0.7, 1]], size=[N]
+ )
+ sample_base[3 * N : (3 + 1) * N, :] = np.random.multivariate_normal(
+ mean=[1, -1], cov=[[1, -0.7], [-0.7, 1]], size=[N]
+ )
+ np.random.shuffle(sample_base)
+ return sample_base[:N, :]