Skip to content

Commit

Permalink
Package fixes (#43)
Browse files Browse the repository at this point in the history
adds github action to run tests on PR
adds two parameters to specify custom output files
restructures packages (again) because I noticed errors when trying to use this in our library
fixes pypi tests, they were not properly testing the installation from testpypi but simply using the local files

Co-authored-by: Ben Hurdelhey <Ben.Hurdelhey@vm-midea03.eaalab.hpi.uni-potsdam.de>
Co-authored-by: Christopher Hagedorn <christopher.schmidt1989@gmail.com>
  • Loading branch information
3 people committed Jan 13, 2022
1 parent 3b001d2 commit 0422487
Show file tree
Hide file tree
Showing 39 changed files with 127 additions and 79 deletions.
26 changes: 26 additions & 0 deletions .github/workflows/test-python.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Run tests

on:
pull_request:
branches: [master]


jobs:
test:
name: Run tests
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.9
uses: actions/setup-python@v2
with:
python-version: "3.9"
- name: Install pytest
run: |
python3 -m pip install pytest --user
- name: Install dependencies
run: |
python3 -m pip install .
- name: Test with pytest
run: |
pytest --ignore test/test_manm_cs_pypi.py
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,6 @@ data
graph
ground_truth*.gml
samples*.csv
data.csv
graph.gml
test_pypi
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ The related paper ["MANM-CS: Data Generation for Benchmarking Causal Structure L

### Installation / Usage via pip
```
python3 -m pip install manm_cs
python3 -m pip install manm-cs
python3 -m manm_cs --num_nodes 10 --edge_density 0.5 --num_samples 10000 --discrete_node_ratio 0.5
```

Expand Down Expand Up @@ -60,10 +60,10 @@ python3 -m pip install .

#### Execute data generation

You can start the data generation with following command. The generated graph and the dataset are saved as ground_truth.gml and samples.csv in the current working directory. Available parameters for data generation can be seen with ```python3 -m src.manm_cs --help```.
You can start the data generation with following command. The generated graph and the dataset are saved as ground_truth.gml and samples.csv in the current working directory. Available parameters for data generation can be seen with ```python3 -m manm_cs --help```.

```
python3 -m src.manm_cs \
python3 -m manm_cs \
--num_nodes 10 \
--edge_density 0.5 \
--num_samples 10000 \
Expand Down
File renamed without changes.
18 changes: 12 additions & 6 deletions src/manm_cs/__main__.py → manm_cs/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@

import networkx as nx

from src.manm_cs.graph import Graph, GraphBuilder
from src.manm_cs.utils import write_single_csv
from manm_cs.graph import Graph, GraphBuilder
from manm_cs.utils import write_single_csv

GROUND_TRUTH_FILE = "ground_truth.gml"
SAMPLES_FILE = "samples.csv"
GROUND_TRUTH_FILE = "ground_truth"
SAMPLES_FILE = "samples"


def type_in_range(type_: Type, lower_bound: Optional[float], upper_bound: Optional[float]) -> \
Expand Down Expand Up @@ -113,6 +113,12 @@ def parse_args():
required=False, default=1.0,
help='Defines the upper limit for beta values used for continuous parents. '
'Should be larger than lower_limit. Note that we sample from the union of [-upper,-lower] and [lower,upper]')
parser.add_argument('--output_ground_truth_file', type=str, required=False, default=GROUND_TRUTH_FILE,
help='Output file (path) for the generated ground truth graph (gml). Relative to the directory from which the library is executed. '
'Specify without file extension.')
parser.add_argument('--output_samples_file', type=str, required=False, default=SAMPLES_FILE,
help='Output file (path) for the generated samples csv. Relative to the directory from which the library is executed.'
'Specify without file extension.')
args = parser.parse_args()

assert args.min_discrete_value_classes <= args.max_discrete_value_classes, \
Expand Down Expand Up @@ -145,7 +151,7 @@ def graph_from_args(args) -> Graph:
graph = graph_from_args(args)

dfs = graph.sample(num_observations=args.num_samples, num_processes=args.num_processes)
write_single_csv(dataframes=dfs, target_path=SAMPLES_FILE)
write_single_csv(dataframes=dfs, target_path=f"{args.output_samples_file}.csv")

nx_graph = graph.to_networkx_graph()
nx.write_gml(nx_graph, GROUND_TRUTH_FILE)
nx.write_gml(nx_graph, f"{args.output_ground_truth_file}.gml")
File renamed without changes.
2 changes: 1 addition & 1 deletion src/manm_cs/graph/graph.py → manm_cs/graph/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import numpy as np
from pathos.multiprocessing import ProcessingPool

from src.manm_cs.variables.variable import Variable
from manm_cs.variables.variable import Variable


class Graph:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
import random
from validation import validate_int, validate_float, validate_bool

from src.manm_cs.graph import Graph
from src.manm_cs.noise import GaussianNoiseBuilder, DiscreteNoiseBuilder
from src.manm_cs.prob_distributions.continuous.bimodal_distribution import BimodalDistribution
from src.manm_cs.prob_distributions.continuous.gaussian_distribution import GaussianDistribution
from src.manm_cs.variables.continuous_variable import ContinuousVariable
from src.manm_cs.variables.discrete_variable import DiscreteVariable
from src.manm_cs.variables.variable import Variable
from src.manm_cs.variables.variable_type import VariableType
from manm_cs.graph import Graph
from manm_cs.noise import GaussianNoiseBuilder, DiscreteNoiseBuilder
from manm_cs.prob_distributions.continuous.bimodal_distribution import BimodalDistribution
from manm_cs.prob_distributions.continuous.gaussian_distribution import GaussianDistribution
from manm_cs.variables.continuous_variable import ContinuousVariable
from manm_cs.variables.discrete_variable import DiscreteVariable
from manm_cs.variables.variable import Variable
from manm_cs.variables.variable_type import VariableType


class GraphBuilder:
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from src.manm_cs.noise.noise import Noise
from src.manm_cs.prob_distributions.continuous import ContinuousDistribution
from manm_cs.noise.noise import Noise
from manm_cs.prob_distributions.continuous import ContinuousDistribution


class ContinuousNoise(Noise):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from src.manm_cs.noise.noise import Noise
from src.manm_cs.prob_distributions.discrete import DiscreteDistribution
from manm_cs.noise.noise import Noise
from manm_cs.prob_distributions.discrete import DiscreteDistribution


class DiscreteNoise(Noise):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from src.manm_cs.noise import DiscreteNoise
from src.manm_cs.prob_distributions import CustomDiscreteDistribution
from manm_cs.noise import DiscreteNoise
from manm_cs.prob_distributions import CustomDiscreteDistribution


class DiscreteNoiseBuilder:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from src.manm_cs.noise import ContinuousNoise
from src.manm_cs.prob_distributions.continuous import GaussianDistribution
from manm_cs.noise import ContinuousNoise
from manm_cs.prob_distributions.continuous import GaussianDistribution


class GaussianNoiseBuilder:
Expand Down
4 changes: 2 additions & 2 deletions src/manm_cs/noise/noise.py → manm_cs/noise/noise.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import numpy as np
import pandas as pd

from src.manm_cs.variables import VariableType
from manm_cs.variables import VariableType

if TYPE_CHECKING:
from src.manm_cs.prob_distributions.prob_distribution import ProbDistribution
from manm_cs.prob_distributions.prob_distribution import ProbDistribution


class Noise:
Expand Down
4 changes: 4 additions & 0 deletions manm_cs/prob_distributions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from manm_cs.prob_distributions.continuous import GaussianDistribution
from manm_cs.prob_distributions.discrete import BinomialDistribution
from manm_cs.prob_distributions.discrete import CustomDiscreteDistribution
from manm_cs.prob_distributions.discrete import UniformDiscreteDistribution
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np

from src.manm_cs.prob_distributions.continuous import ContinuousDistribution, GaussianDistribution
from manm_cs.prob_distributions.continuous import ContinuousDistribution, GaussianDistribution


class BimodalDistribution(ContinuousDistribution):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from abc import ABC

from manm_cs.prob_distributions.prob_distribution import ProbDistribution
from manm_cs.variables import VariableType


class ContinuousDistribution(ProbDistribution, ABC):
type = VariableType.CONTINUOUS
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np

from src.manm_cs.prob_distributions.continuous import ContinuousDistribution
from manm_cs.prob_distributions.continuous import ContinuousDistribution


class GaussianDistribution(ContinuousDistribution):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np

from src.manm_cs.prob_distributions.discrete.discrete_distribution import DiscreteDistribution
from manm_cs.prob_distributions.discrete.discrete_distribution import DiscreteDistribution


class BinomialDistribution(DiscreteDistribution):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
from numpy.random import random_sample

from src.manm_cs.prob_distributions.discrete.discrete_distribution import DiscreteDistribution
from manm_cs.prob_distributions.discrete.discrete_distribution import DiscreteDistribution


class CustomDiscreteDistribution(DiscreteDistribution):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from abc import ABC

from src.manm_cs.prob_distributions.prob_distribution import ProbDistribution
from src.manm_cs.variables import VariableType
from manm_cs.prob_distributions.prob_distribution import ProbDistribution
from manm_cs.variables import VariableType


class DiscreteDistribution(ProbDistribution, ABC):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np

from src.manm_cs.prob_distributions.discrete import CustomDiscreteDistribution
from src.manm_cs.prob_distributions.discrete import DiscreteDistribution
from manm_cs.prob_distributions.discrete import CustomDiscreteDistribution
from manm_cs.prob_distributions.discrete import DiscreteDistribution


class RandomDiscreteDistribution(DiscreteDistribution):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np

from src.manm_cs.prob_distributions.discrete.discrete_distribution import DiscreteDistribution
from manm_cs.prob_distributions.discrete.discrete_distribution import DiscreteDistribution


class UniformDiscreteDistribution(DiscreteDistribution):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import numpy as np

from src.manm_cs.variables import VariableType
from manm_cs.variables import VariableType


class ProbDistribution(ABC):
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import numpy as np
import pandas as pd

from src.manm_cs.noise.continous_noise import ContinuousNoise
from src.manm_cs.variables.variable import Variable, VariableType
from manm_cs.noise.continous_noise import ContinuousNoise
from manm_cs.variables.variable import Variable, VariableType


class ContinuousVariable(Variable):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import numpy as np
import pandas as pd

from src.manm_cs.noise.discrete_noise import DiscreteNoise
from src.manm_cs.prob_distributions import CustomDiscreteDistribution
from src.manm_cs.variables.variable import Variable, VariableType
from manm_cs.noise.discrete_noise import DiscreteNoise
from manm_cs.prob_distributions import CustomDiscreteDistribution
from manm_cs.variables.variable import Variable, VariableType


class DiscreteVariable(Variable):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

import pandas as pd

from src.manm_cs.noise.noise import Noise
from src.manm_cs.variables import VariableType
from manm_cs.noise.noise import Noise
from manm_cs.variables import VariableType


class Variable(ABC):
Expand Down
File renamed without changes.
16 changes: 8 additions & 8 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = manm_cs
version = 0.0.5
version = 0.1.0
author = Johannes Huegle, Christopher Hagedorn, Lukas Boehme, Mats Poerschke, Jonas Umland
author_email = johannes.huegle@hpi.de
description = Data generation for causal structure learning based on mixed additive noise model (MANM)
Expand All @@ -16,18 +16,18 @@ classifiers =

[options]
package_dir =
= src
= .
packages = find:
python_requires = >=3.6
install_requires =
pandas==1.1.5
numpy==1.19.5
multiprocess==0.70.11.1
pandas>=1.1.5
numpy>=1.19.5
multiprocess>=0.70.11.1
validation==0.5.0
networkx==2.5
pathos==0.2.7
networkx>=2.5
pathos>=0.2.7


[options.packages.find]
where = src
where = .

Empty file removed src/manm_cs/__init__.py
Empty file.
4 changes: 0 additions & 4 deletions src/manm_cs/prob_distributions/__init__.py

This file was deleted.

This file was deleted.

8 changes: 4 additions & 4 deletions test/graph/test_graph.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from src.manm_cs.graph.graph import Graph
from src.manm_cs.noise import DiscreteNoise
from src.manm_cs.prob_distributions import BinomialDistribution, CustomDiscreteDistribution, UniformDiscreteDistribution
from src.manm_cs.variables.discrete_variable import DiscreteVariable
from manm_cs.graph.graph import Graph
from manm_cs.noise import DiscreteNoise
from manm_cs.prob_distributions import BinomialDistribution, CustomDiscreteDistribution, UniformDiscreteDistribution
from manm_cs.variables.discrete_variable import DiscreteVariable
import networkx as nx


Expand Down
15 changes: 15 additions & 0 deletions test/test_manm_cs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import os
import time

ground_truth = "graph"
samples = "data"
test_folder = "test_pypi"

def test_manm_cs():
os.system(
"python3 -m pip install . &&" + # install dependencies from actual pip because they are not on testpypi
f"mkdir -p {test_folder} && cd {test_folder} && rm -f {samples} {ground_truth} &&" +
f"python3 -m manm_cs --num_nodes 10 --edge_density 0.5 --num_samples 10000 --discrete_node_ratio 0.5 --output_ground_truth_file \"{ground_truth}\" --output_samples_file \"{samples}\"")

assert os.path.isfile(test_folder + "/" + ground_truth + ".gml")
assert os.path.isfile(test_folder + "/" + samples + ".csv")
18 changes: 8 additions & 10 deletions test/test_manm_cs_pypi.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
import os
import time

ground_truth = "./ground_truth.gml"
samples = "./samples.csv"
ground_truth = "graph"
samples = "data"
test_folder = "test_pypi"

def test_manm_cs_pypi():

if os.path.isfile(ground_truth):
os.rename(ground_truth, f"./ground_truth_old_{int(time.time())}.gml")
if os.path.isfile(samples):
os.rename(samples, f"./samples_old{int(time.time())}.csv")

os.system(
"python3 -m pip install . &&" + # install dependencies from actual pip because they are not on testpypi
f"mkdir -p {test_folder} && cd {test_folder} && rm -f {samples} {ground_truth} && " +
"python3 -m pip uninstall -y manm-cs &&" + # uninstall the package itself so we can install it from testpypi
"python3 -m pip install -i https://test.pypi.org/simple/ manm-cs &&" + # install latest manm-cs from testpypi
"python3 -m manm_cs --num_nodes 10 --edge_density 0.5 --num_samples 10000 --discrete_node_ratio 0.5")
f"python3 -m manm_cs --num_nodes 10 --edge_density 0.5 --num_samples 10000 --discrete_node_ratio 0.5 --output_ground_truth_file \"{ground_truth}\" --output_samples_file \"{samples}\"")

assert os.path.isfile(ground_truth)
assert os.path.isfile(samples)
assert os.path.isfile(test_folder + "/" + ground_truth + ".gml")
assert os.path.isfile(test_folder + "/" + samples + ".csv")

0 comments on commit 0422487

Please sign in to comment.