diff --git a/.travis.yml b/.travis.yml index 5259244..ab358b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,11 @@ language: python env: - PYVERSION=3.5 before_install: + # see https://github.com/lhelontra/tensorflow-on-arm/issues/13#issuecomment-489296444 + - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + - sudo apt-get update + - sudo apt-get -y install gcc-4.9 + - sudo apt-get -y install --only-upgrade libstdc++6 - export MPLBACKEND='Agg' - wget -q https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh - export MINICONDA_PREFIX="$HOME/miniconda" diff --git a/songbird/multinomial.py b/songbird/multinomial.py index 2351de4..5ff376f 100644 --- a/songbird/multinomial.py +++ b/songbird/multinomial.py @@ -142,7 +142,7 @@ def fit(self, epochs=10, summary_interval=100, checkpoint_interval=3600): ---------- epochs : int Number of epochs to train - summary_interval : int + summary_interval : float Number of seconds until a summary is recorded checkpoint_interval : int Number of seconds until a checkpoint is recorded diff --git a/songbird/q2/plugin_setup.py b/songbird/q2/plugin_setup.py index 589c01e..4f150ca 100644 --- a/songbird/q2/plugin_setup.py +++ b/songbird/q2/plugin_setup.py @@ -49,7 +49,7 @@ 'clipnorm': Float, 'min_sample_count': Int, 'min_feature_count': Int, - 'summary_interval': Int, + 'summary_interval': Float, 'random_seed': Int, }, outputs=[ diff --git a/songbird/q2/tests/test_method.py b/songbird/q2/tests/test_method.py index fb13407..226351e 100644 --- a/songbird/q2/tests/test_method.py +++ b/songbird/q2/tests/test_method.py @@ -8,6 +8,8 @@ from skbio import OrdinationResults from skbio.stats.composition import clr, clr_inv import numpy.testing as npt +import pandas as pd +from songbird.q2.plugin_setup import plugin as songbird_plugin class TestMultinomial(unittest.TestCase): @@ -73,6 +75,53 @@ def test_fit_consistency(self): npt.assert_array_equal(res_biplot1.samples, res_biplot2.samples) npt.assert_array_equal(res_biplot1.features, res_biplot2.features) + def test_fit_float_summary_interval(self): + tf.set_random_seed(0) + md = self.md + + multregression = songbird_plugin.actions['multinomial'] + + md.name = 'sampleid' + md = qiime2.Metadata(md) + + # See issue #31 + exp_beta = clr(clr_inv(np.hstack((np.zeros((2, 1)), self.beta.T)))) + + q2_table = qiime2.Artifact.import_data('FeatureTable[Frequency]', + self.table) + + q2_res_beta, q2_res_stats, q2_res_biplot = multregression( + table=q2_table, metadata=md, + min_sample_count=0, min_feature_count=0, + formula="X", epochs=1000, + summary_interval=0.5, + ) + + # try-except is for helpful error message if q2-coercion fails + try: + res_biplot = q2_res_biplot.view(OrdinationResults) + except Exception: + raise AssertionError('res_biplot unable to be coerced to ' + 'OrdinationResults') + try: + res_beta = q2_res_beta.view(pd.DataFrame) + except Exception: + raise AssertionError('res_beta unable to be coerced to ' + 'pd.DataFrame') + try: + res_stats = q2_res_stats.view(qiime2.Metadata) + except Exception: + raise AssertionError('res_stats unable to be coerced to ' + 'qiime2.Metadata') + + u = res_biplot.samples.values + v = res_biplot.features.values.T + npt.assert_allclose(u @ v, res_beta.values, + atol=0.5, rtol=0.5) + + npt.assert_allclose(exp_beta, res_beta.T, atol=0.6, rtol=0.6) + self.assertGreater(len(res_stats.to_dataframe().index), 1) + if __name__ == "__main__": unittest.main()