Skip to content

Commit

Permalink
Start developing random functions tests
Browse files Browse the repository at this point in the history
  • Loading branch information
enekomartinmartinez committed Apr 20, 2024
1 parent a6064b7 commit 4f82387
Show file tree
Hide file tree
Showing 5 changed files with 100,173 additions and 0 deletions.
41 changes: 41 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import shutil
from pathlib import Path
from dataclasses import dataclass


import pytest

from pysd import read_vensim, read_xmile, load
from pysd.translators.vensim.vensim_utils import supported_extensions as\
vensim_extensions
from pysd.translators.xmile.xmile_utils import supported_extensions as\
xmile_extensions

from pysd.builders.python.imports import ImportsManager


@pytest.fixture(scope="session")
def _root():
Expand All @@ -21,6 +26,13 @@ def _test_models(_root):
return _root.joinpath("test-models/tests")


@pytest.fixture(scope="session")
def _test_random(_root):
# test-models directory
# TODO to be updated
return _root.joinpath("pytest_random")


@pytest.fixture(scope="class")
def shared_tmpdir(tmp_path_factory):
# shared temporary directory for each class
Expand Down Expand Up @@ -58,3 +70,32 @@ def ignore_warns():
"future version. Use timezone-aware objects to represent datetimes "
"in UTC.*",
]


@dataclass
class FakeComponent:
element: str
section: object
subscripts_dict: dict


@dataclass
class FakeSection:
namespace: object
macrospace: dict
imports: object


@dataclass
class FakeNamespace:
cleanspace: dict


@pytest.fixture(scope="function")
def fake_component():

return FakeComponent(
'',
FakeSection(FakeNamespace({}), {}, ImportsManager()),
{}
)
73 changes: 73 additions & 0 deletions tests/pytest_random/generate_fake_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
from dataclasses import dataclass
from pathlib import Path

import pandas as pd

# imports needed by the translated functions
import numpy as np
from scipy import stats


from pysd.translators.vensim.vensim_element import Component
from pysd.builders.python.python_expressions_builder import\
CallBuilder, NumericBuilder
from pysd.builders.python.imports import ImportsManager


outfile = Path(__file__).parent / 'test.tab'

cols = [
'RANDOM UNIFORM(0, 1, 0)',
'RANDOM UNIFORM(-3, 10, 0)',
'RANDOM UNIFORM(0.5, 7.8, 0)',
'RANDOM NORMAL(-1000, 1000, 0, 1, 0)',
'RANDOM NORMAL(0, 1000, 0, 1, 0)',
'RANDOM NORMAL(-100, 100, 3, 1, 0)',
'RANDOM NORMAL(-100, 100, -3, 0.5, 0)',
'RANDOM NORMAL(-100, 10, 5, 10, 0)'
]


@dataclass
class FakeComponent:
element: str
section: object
subscripts_dict: dict


@dataclass
class FakeSection:
namespace: object
macrospace: dict
imports: object


@dataclass
class FakeNamespace:
cleanspace: dict


imports = ImportsManager()
fake_component = FakeComponent(
'',
FakeSection(FakeNamespace({}), {}, imports),
{}
)

size = int(1e5)

out = {}
for col in cols:
component = Component('', ([], []), col)
component.parse()
builder = CallBuilder(component.ast, fake_component)
args = {
i: NumericBuilder(arg, fake_component).build({})
for i, arg in builder.arguments.items()
}
expr = builder.build(args).expression
expr = expr.replace('()', str(size))
out[col] = eval(expr)

df = pd.DataFrame(out)
df.to_csv(outfile, sep='\t')
Empty file.
58 changes: 58 additions & 0 deletions tests/pytest_random/pytest_random.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import pytest

import pandas as pd

# imports needed by the translated functions
import numpy as np
from scipy import stats


from pysd.translators.vensim.vensim_element import Component
from pysd.builders.python.python_expressions_builder import\
CallBuilder, NumericBuilder


@pytest.mark.parametrize(
"input_file",
[
( # rectangular
'test.tab'
),
],
ids=["test_file"]
)
class TestRandomVensim():

@pytest.fixture(scope="function")
def data_raw(self, input_file, _test_random):
file = _test_random.joinpath(input_file)
data = pd.read_table(file, sep='\t', index_col=0)
return data

@pytest.fixture(scope="function")
def data_python(self, data_raw, fake_component):
size = len(data_raw.index)
out = {}
for col in data_raw.columns:
component = Component('', ([], []), col)
component.parse()
builder = CallBuilder(component.ast, fake_component)
args = {
i: NumericBuilder(arg, fake_component).build({})
for i, arg in builder.arguments.items()
}
expr = builder.build(args).expression
expr = expr.replace('()', str(size))
out[col] = eval(expr)

return pd.DataFrame(out, index=data_raw.index)

def test_statistics(self, data_raw, data_python):

raw_desc = stats.describe(data_raw, axis=0, nan_policy='omit')
py_desc = stats.describe(data_python, axis=0, nan_policy='omit')
for stat in ('mean', 'variance', 'skewness', 'kurtosis'):
assert np.allclose(
getattr(raw_desc, stat),
getattr(py_desc, stat),
atol=5e-2, rtol=5e-2), 'Failed when comparing %s' % stat
Loading

0 comments on commit 4f82387

Please sign in to comment.