diff --git a/.github/workflows/build_and_publish.yml b/.github/workflows/build_and_publish.yml
index 1bb83a4..25d4dd2 100644
--- a/.github/workflows/build_and_publish.yml
+++ b/.github/workflows/build_and_publish.yml
@@ -26,7 +26,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: true
@@ -53,27 +53,36 @@ jobs:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-24.04, macOS-11 ]
- python-version: [ 36, 37, 38, 39, 310, 311 ]
+ os: [ ubuntu-24.04, macos-14, macos-15-intel ]
+ python-version: [ 310, 311 ]
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: true
- name: "Build wheel (${{ matrix.os }}, py${{ matrix.python-version }})"
- uses: pypa/cibuildwheel@v2.11.1
+ uses: pypa/cibuildwheel@v2.21.3
with:
config-file: cibuildwheel.toml
env:
CIBW_BUILD: "cp${{ matrix.python-version}}-*"
+ # Override deployment target to 14.0 for all macOS runners
+ MACOSX_DEPLOYMENT_TARGET: "14.0"
+ # Build only native architecture on each runner (no cross-compilation)
+ CIBW_ARCHS_MACOS: >-
+ ${{
+ matrix.os == 'macos-14' && 'arm64' ||
+ matrix.os == 'macos-15-intel' && 'x86_64' ||
+ 'auto'
+ }}
- name: "Upload build artifacts (${{ matrix.os }}, py${{ matrix.python-version }})"
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
- name: dist
+ name: dist-${{ matrix.os }}-py${{ matrix.python-version }}
path: ./wheelhouse/*.whl
make_sdist:
@@ -83,7 +92,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: true
@@ -94,9 +103,9 @@ jobs:
pipx run build --sdist
- name: "Upload build artifacts"
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
- name: "dist"
+ name: "dist-sdist"
path: "dist/*.tar.gz"
publish_to_pypi:
@@ -113,10 +122,14 @@ jobs:
steps:
- name: "Download build artifacts"
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
with:
- name: "dist"
- path: "dist"
+ path: "artifacts"
+
+ - name: "Collect all artifacts into dist folder"
+ run: |
+ mkdir -p dist
+ find artifacts -type f \( -name '*.whl' -o -name '*.tar.gz' \) -exec cp {} dist/ \;
- name: "Publish to PyPI"
if: startsWith(github.ref, 'refs/tags')
diff --git a/.gitignore b/.gitignore
index 99073f4..2d7ac95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,9 +28,8 @@ tests/FFPopSim.py
tests/FFPopSim.pyc
tests/_FFPopSim.so
-# SWIG generated files (they are kept in the static-gsl branch)
-src/python/FFPopSim.py
-src/python/FFPopSim_wrap.cpp
+# SWIG generated Python module (FFPopSim.py is kept in repo)
+# Wrapper is now committed to ensure consistent SWIG 4.3.1 across platforms
# Compiled Object files
*.slo
diff --git a/Makefile b/Makefile
index fd34a89..86876a7 100644
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@
# Please set your Python 3 executable if you want to build the Python
# bindings. If you are only interested in the C++ part of the library,
# comment out the following line
-PYTHON := python3
+PYTHON := micromamba run -n ffpopsim11 python
# Note: please look in 'setup.py' if you are building the Python extension!
# You can call distutils with 'setup.py' directly if you prefer. The
@@ -73,11 +73,19 @@ OPTIMIZATION_LEVEL := O2
# Please use the following variable for additional flags to the C++ compiler,
# such as include folders (e.g. -I/opt/local/include)
-CXXFLAGS = -c -Wall -$(OPTIMIZATION_LEVEL) -fPIC
+GSL_CFLAGS := $(shell gsl-config --cflags 2>/dev/null)
+# Try to find Boost in common locations (macOS Homebrew, MacPorts, or standard Linux paths)
+BOOST_INCLUDE := $(shell \
+ if [ -d /opt/homebrew/opt/boost/include ]; then echo "-I/opt/homebrew/opt/boost/include"; \
+ elif [ -d /usr/local/opt/boost/include ]; then echo "-I/usr/local/opt/boost/include"; \
+ elif [ -d /opt/local/include/boost ]; then echo "-I/opt/local/include"; \
+ fi)
+CXXFLAGS = -c -Wall -$(OPTIMIZATION_LEVEL) -fPIC -std=c++11 $(GSL_CFLAGS) $(BOOST_INCLUDE)
# Please use the following variable for additional flags to the linker, such
# as library folders for GSL (e.g. -L/opt/local/lib)
-LDFLAGS = -$(OPTIMIZATION_LEVEL)
+GSL_LDFLAGS := $(shell gsl-config --libs 2>/dev/null | sed 's/-lgsl -lgslcblas//')
+LDFLAGS = -$(OPTIMIZATION_LEVEL) $(GSL_LDFLAGS)
# Additional options used to regenerate the SWIG files or to rebuild the docs.
@@ -263,11 +271,7 @@ $(TESTSDIR)/$(TESTS_OBJECT_GENEALOGY): $(TESTSDIR)/$(TESTS_SOURCE_GENEALOGY)
$(CXX) $(TESTS_CXXFLAGS) -c $(@:.o=.cpp) -o $@
run-tests:
- cd "tests" && ./highd
- cd "tests" && ./hivpopulation
- cd "tests" && ./lowd
- cd "tests" && ./recombination_lowd
- cd "tests" && ./test_genealogy
+ cd tests && ./highd && ./hivpopulation && ./lowd && ./recombination_lowd && ./test_genealogy
clean-tests:
cd $(TESTSDIR); rm -rf *.o $(TESTS_LOWD) $(TESTS_HIGHD) $(TESTS_GENEALOGY) $(TESTS_LOWD_REC) $(TESTS_HIVPOP)
diff --git a/cibuildwheel.toml b/cibuildwheel.toml
index e7e910b..b207a11 100644
--- a/cibuildwheel.toml
+++ b/cibuildwheel.toml
@@ -11,46 +11,57 @@ skip = [
"pp*",
]
-macos.archs = ["x86_64", "arm64"]
+# Architecture is set per-runner in the workflow file to avoid cross-compilation
+# GSL libraries from Homebrew require macOS 14.0 minimum
+macos.environment = {MACOSX_DEPLOYMENT_TARGET = "14.0"}
build-verbosity = 1
linux.before-build = [
"yum makecache fast",
"yum install -y boost-devel gsl-devel >/dev/null",
- "make swig",
]
macos.before-build = [
"brew install boost gsl",
- "make swig",
-]
-
-
-test-skip = [
- "*aarch64*",
- "*arm64*",
- "*ppc64*",
- "*s390x*",
]
linux.before-test = [
- "yum install -y parallel >/dev/null",
- "pip install biopython matplotlib numpy pandas pygments scipy"
+ "pip install 'biopython' 'matplotlib' 'numpy<2' 'pandas' 'pygments' 'scipy'"
]
+# Run examples serially (one at a time) without parallel to avoid memory issues in CI
linux.test-command = [
- "cd {project} && bash ./run-examples --skip-slow"
+ """cd {project}/examples && for f in *.py; do
+ case "$f" in
+ benefits_of_sex.py|genealogies_with_selection.py|measuring_fixation_probabilities.py|multi_sample_adaptive.py|mutation_selection_balance_highd.py|neutral_LD_highd.py|speed_highd.py|speed_lowd.py)
+ echo "Skipping slow example: $f"
+ ;;
+ *)
+ echo "Testing $f..."
+ MPLBACKEND=Agg python3 "$f" || exit 1
+ ;;
+ esac
+ done"""
]
macos.before-test = [
- "brew install parallel >/dev/null",
- "pip install biopython matplotlib numpy pandas pygments scipy"
+ "pip install 'biopython' 'matplotlib' 'numpy<2' 'pandas' 'pygments' 'scipy'"
]
-# Tests are very slow on mac, so only do basics
+# Run same tests as Linux for consistency - serially without parallel
macos.test-command = [
- "cd {project} && python examples/example.py"
+ """cd {project}/examples && for f in *.py; do
+ case "$f" in
+ benefits_of_sex.py|genealogies_with_selection.py|measuring_fixation_probabilities.py|multi_sample_adaptive.py|mutation_selection_balance_highd.py|neutral_LD_highd.py|speed_highd.py|speed_lowd.py)
+ echo "Skipping slow example: $f"
+ ;;
+ *)
+ echo "Testing $f..."
+ MPLBACKEND=Agg python3 "$f" || exit 1
+ ;;
+ esac
+ done"""
]
diff --git a/examples/genealogies_with_selection.py b/examples/genealogies_with_selection.py
index 4b8c0cc..ecfcb50 100644
--- a/examples/genealogies_with_selection.py
+++ b/examples/genealogies_with_selection.py
@@ -38,8 +38,8 @@
#set the effect sizes of the mutations that are injected (the same at each site in this case)
pop.set_fitness_additive(np.ones(L)*s)
-#track the genealogy at a central locus L/2 (which one doesn't matter in the asexual case)
-pop.track_locus_genealogy([L/2])
+#track the genealogy at a central locus L//2 (which one doesn't matter in the asexual case)
+pop.track_locus_genealogy([L//2])
#initialize the populations
pop.set_wildtype(pop.carrying_capacity)
diff --git a/examples/speed_highd.py b/examples/speed_highd.py
index 28d2c1c..e07f4b1 100644
--- a/examples/speed_highd.py
+++ b/examples/speed_highd.py
@@ -41,7 +41,7 @@
pop.set_wildtype(N) # set a wildtype population of size N
- pop.evolve(1.0 / (L * (mu + r))) # evolve until equilibrium
+ pop.evolve(int(1.0 / (L * (mu + r)))) # evolve until equilibrium
# run for G generations to measure execution time
t1=time.time()
diff --git a/setup.py b/setup.py
index 2f0cf2d..d00e9b9 100644
--- a/setup.py
+++ b/setup.py
@@ -2,6 +2,8 @@
# vim: fdm=indent
import sys
+import subprocess
+import os
# Python 3.6 compatibility: Python 3.6 has no compatible version of setuptools that supports
# PEP-517 (the `pyproject.toml`-based config), so we use a shim package `ppsetuptools` instead.
@@ -12,6 +14,31 @@
import numpy as np
+# Get GSL include paths
+def get_gsl_include():
+ try:
+ output = subprocess.check_output(['gsl-config', '--cflags'], stderr=subprocess.DEVNULL)
+ cflags = output.decode().strip().split()
+ return [flag[2:] for flag in cflags if flag.startswith('-I')]
+ except:
+ return []
+
+# Get Boost include paths
+def get_boost_include():
+ for path in ['/opt/homebrew/opt/boost/include', '/usr/local/opt/boost/include', '/opt/local/include']:
+ if os.path.isdir(path):
+ return [path]
+ return []
+
+# Get GSL library paths
+def get_gsl_lib_dirs():
+ try:
+ output = subprocess.check_output(['gsl-config', '--libs'], stderr=subprocess.DEVNULL)
+ ldflags = output.decode().strip().split()
+ return [flag[2:] for flag in ldflags if flag.startswith('-L')]
+ except:
+ return []
+
setup_args = dict(
py_modules=["FFPopSim"],
package_dir={ '': 'src/python' },
@@ -29,8 +56,10 @@
'src/hypercube_lowd.cpp',
'src/hypercube_highd.cpp',
],
- include_dirs=[np.get_include()],
+ include_dirs=[np.get_include()] + get_gsl_include() + get_boost_include(),
+ library_dirs=get_gsl_lib_dirs(),
libraries=['gsl', 'gslcblas'],
+ extra_compile_args=['-std=c++11'],
py_limited_api = True
)
]
diff --git a/src/haploid_highd.cpp b/src/haploid_highd.cpp
index 1daf593..ca2a072 100644
--- a/src/haploid_highd.cpp
+++ b/src/haploid_highd.cpp
@@ -187,9 +187,18 @@ int haploid_highd::free_mem() {
cerr <<"haploid_highd::free_mem(): No memory allocated!\n";
return HP_BADARG;
} else {
+ delete [] genome;
+ delete [] crossovers;
delete [] allele_frequencies;
delete [] gamete_allele_frequencies;
delete [] trait;
+ delete [] trait_stat;
+ for (int t = 0; t < number_of_traits; t++){
+ delete [] trait_covariance[t];
+ }
+ delete [] trait_covariance;
+ delete [] trait_weights;
+ gsl_rng_free(evo_generator);
mem = false;
return 0;
}
@@ -203,6 +212,10 @@ int haploid_highd::free_mem() {
int haploid_highd::provide_at_least(int n) {
//calculate the number of clones that need to be newly allocated. Allow for some slack
//to avoid calling this too often
+ // BUG FIX: Check if we already have enough clones to avoid unsigned arithmetic underflow
+ if (available_clones.size() >= n) {
+ return 0; // We already have enough clones available
+ }
int needed_gts = n - available_clones.size() + 100 + 0.1 * population.size();
//allocate at the necessary memory
diff --git a/src/python/FFPopSim.py b/src/python/FFPopSim.py
new file mode 100644
index 0000000..f744bb4
--- /dev/null
+++ b/src/python/FFPopSim.py
@@ -0,0 +1,3464 @@
+# This file was automatically generated by SWIG (https://www.swig.org).
+# Version 4.3.1
+#
+# Do not make changes to this file unless you know what you are doing - modify
+# the SWIG interface file instead.
+
+"""
+C++/Python library for population genetics.
+
+This library offers *two* simulation packages for population genetics: one for
+low-dimensional simulations (up to ~15 loci) and one for high-dimensional ones.
+
+Each package is based on a big class that represents a population:
+
+ - ``haploid_lowd`` for low-dimensional populations
+ - ``haploid_highd`` for high-dimensional simulations
+
+A simple example routine is the following::
+
+ #####################################
+ # EXAMPLE SCRIPT #
+ #####################################
+ import numpy as np
+ import matplotlib.pyplot as plt
+ import FFPopSim as h
+
+ c = h.haploid_lowd(4)
+ c.set_allele_frequencies([0,0.3,0.6,0.9], N=1000)
+ c.evolve(100)
+ c.plot_diversity_histogram()
+ plt.show()
+ #####################################
+
+which evolves a population with 4 loci for 100 generations starting from fixed
+allele frequencies, under neutral conditions, and plots the diversity
+histogram afterwards.
+
+For more usage examples, please consult the ``tests`` and ``examples`` folders.
+
+"""
+
+from sys import version_info as _swig_python_version_info
+# Import the low-level C/C++ module
+if __package__ or "." in __name__:
+ from . import _FFPopSim
+else:
+ import _FFPopSim
+
+try:
+ import builtins as __builtin__
+except ImportError:
+ import __builtin__
+
+_swig_new_instance_method = _FFPopSim.SWIG_PyInstanceMethod_New
+_swig_new_static_method = _FFPopSim.SWIG_PyStaticMethod_New
+
+def _swig_repr(self):
+ try:
+ strthis = "proxy of " + self.this.__repr__()
+ except __builtin__.Exception:
+ strthis = ""
+ return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
+
+
+def _swig_setattr_nondynamic_instance_variable(set):
+ def set_instance_attr(self, name, value):
+ if name == "this":
+ set(self, name, value)
+ elif name == "thisown":
+ self.this.own(value)
+ elif hasattr(self, name) and isinstance(getattr(type(self), name), property):
+ set(self, name, value)
+ else:
+ raise AttributeError("You cannot add instance attributes to %s" % self)
+ return set_instance_attr
+
+
+def _swig_setattr_nondynamic_class_variable(set):
+ def set_class_attr(cls, name, value):
+ if hasattr(cls, name) and not isinstance(getattr(cls, name), property):
+ set(cls, name, value)
+ else:
+ raise AttributeError("You cannot add class attributes to %s" % cls)
+ return set_class_attr
+
+
+def _swig_add_metaclass(metaclass):
+ """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass"""
+ def wrapper(cls):
+ return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())
+ return wrapper
+
+
+class _SwigNonDynamicMeta(type):
+ """Meta class to enforce nondynamic attributes (no new attributes) for a class"""
+ __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)
+
+
+class SwigPyIterator(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+
+ def __init__(self, *args, **kwargs):
+ raise AttributeError("No constructor defined - class is abstract")
+ __repr__ = _swig_repr
+ __swig_destroy__ = _FFPopSim.delete_SwigPyIterator
+ value = _swig_new_instance_method(_FFPopSim.SwigPyIterator_value)
+ incr = _swig_new_instance_method(_FFPopSim.SwigPyIterator_incr)
+ decr = _swig_new_instance_method(_FFPopSim.SwigPyIterator_decr)
+ distance = _swig_new_instance_method(_FFPopSim.SwigPyIterator_distance)
+ equal = _swig_new_instance_method(_FFPopSim.SwigPyIterator_equal)
+ copy = _swig_new_instance_method(_FFPopSim.SwigPyIterator_copy)
+ next = _swig_new_instance_method(_FFPopSim.SwigPyIterator_next)
+ __next__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___next__)
+ previous = _swig_new_instance_method(_FFPopSim.SwigPyIterator_previous)
+ advance = _swig_new_instance_method(_FFPopSim.SwigPyIterator_advance)
+ __eq__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___eq__)
+ __ne__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___ne__)
+ __iadd__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___iadd__)
+ __isub__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___isub__)
+ __add__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___add__)
+ __sub__ = _swig_new_instance_method(_FFPopSim.SwigPyIterator___sub__)
+ def __iter__(self):
+ return self
+
+# Register SwigPyIterator in _FFPopSim:
+_FFPopSim.SwigPyIterator_swigregister(SwigPyIterator)
+class _intVector(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim._intVector_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim._intVector___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim._intVector___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim._intVector___len__)
+ __getslice__ = _swig_new_instance_method(_FFPopSim._intVector___getslice__)
+ __setslice__ = _swig_new_instance_method(_FFPopSim._intVector___setslice__)
+ __delslice__ = _swig_new_instance_method(_FFPopSim._intVector___delslice__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim._intVector___delitem__)
+ __getitem__ = _swig_new_instance_method(_FFPopSim._intVector___getitem__)
+ __setitem__ = _swig_new_instance_method(_FFPopSim._intVector___setitem__)
+ pop = _swig_new_instance_method(_FFPopSim._intVector_pop)
+ append = _swig_new_instance_method(_FFPopSim._intVector_append)
+ empty = _swig_new_instance_method(_FFPopSim._intVector_empty)
+ size = _swig_new_instance_method(_FFPopSim._intVector_size)
+ swap = _swig_new_instance_method(_FFPopSim._intVector_swap)
+ begin = _swig_new_instance_method(_FFPopSim._intVector_begin)
+ end = _swig_new_instance_method(_FFPopSim._intVector_end)
+ rbegin = _swig_new_instance_method(_FFPopSim._intVector_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim._intVector_rend)
+ clear = _swig_new_instance_method(_FFPopSim._intVector_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim._intVector_get_allocator)
+ pop_back = _swig_new_instance_method(_FFPopSim._intVector_pop_back)
+ erase = _swig_new_instance_method(_FFPopSim._intVector_erase)
+
+ def __init__(self, *args):
+ _FFPopSim._intVector_swiginit(self, _FFPopSim.new__intVector(*args))
+ push_back = _swig_new_instance_method(_FFPopSim._intVector_push_back)
+ front = _swig_new_instance_method(_FFPopSim._intVector_front)
+ back = _swig_new_instance_method(_FFPopSim._intVector_back)
+ assign = _swig_new_instance_method(_FFPopSim._intVector_assign)
+ resize = _swig_new_instance_method(_FFPopSim._intVector_resize)
+ insert = _swig_new_instance_method(_FFPopSim._intVector_insert)
+ reserve = _swig_new_instance_method(_FFPopSim._intVector_reserve)
+ capacity = _swig_new_instance_method(_FFPopSim._intVector_capacity)
+ __swig_destroy__ = _FFPopSim.delete__intVector
+
+# Register _intVector in _FFPopSim:
+_FFPopSim._intVector_swigregister(_intVector)
+class vector_tree_step(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.vector_tree_step_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___len__)
+ __getslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___getslice__)
+ __setslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___setslice__)
+ __delslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___delslice__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___delitem__)
+ __getitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___getitem__)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_step___setitem__)
+ pop = _swig_new_instance_method(_FFPopSim.vector_tree_step_pop)
+ append = _swig_new_instance_method(_FFPopSim.vector_tree_step_append)
+ empty = _swig_new_instance_method(_FFPopSim.vector_tree_step_empty)
+ size = _swig_new_instance_method(_FFPopSim.vector_tree_step_size)
+ swap = _swig_new_instance_method(_FFPopSim.vector_tree_step_swap)
+ begin = _swig_new_instance_method(_FFPopSim.vector_tree_step_begin)
+ end = _swig_new_instance_method(_FFPopSim.vector_tree_step_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.vector_tree_step_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.vector_tree_step_rend)
+ clear = _swig_new_instance_method(_FFPopSim.vector_tree_step_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.vector_tree_step_get_allocator)
+ pop_back = _swig_new_instance_method(_FFPopSim.vector_tree_step_pop_back)
+ erase = _swig_new_instance_method(_FFPopSim.vector_tree_step_erase)
+
+ def __init__(self, *args):
+ _FFPopSim.vector_tree_step_swiginit(self, _FFPopSim.new_vector_tree_step(*args))
+ push_back = _swig_new_instance_method(_FFPopSim.vector_tree_step_push_back)
+ front = _swig_new_instance_method(_FFPopSim.vector_tree_step_front)
+ back = _swig_new_instance_method(_FFPopSim.vector_tree_step_back)
+ assign = _swig_new_instance_method(_FFPopSim.vector_tree_step_assign)
+ resize = _swig_new_instance_method(_FFPopSim.vector_tree_step_resize)
+ insert = _swig_new_instance_method(_FFPopSim.vector_tree_step_insert)
+ reserve = _swig_new_instance_method(_FFPopSim.vector_tree_step_reserve)
+ capacity = _swig_new_instance_method(_FFPopSim.vector_tree_step_capacity)
+ __swig_destroy__ = _FFPopSim.delete_vector_tree_step
+
+# Register vector_tree_step in _FFPopSim:
+_FFPopSim.vector_tree_step_swigregister(vector_tree_step)
+class vector_tree_key(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.vector_tree_key_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___len__)
+ __getslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___getslice__)
+ __setslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___setslice__)
+ __delslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___delslice__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___delitem__)
+ __getitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___getitem__)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_key___setitem__)
+ pop = _swig_new_instance_method(_FFPopSim.vector_tree_key_pop)
+ append = _swig_new_instance_method(_FFPopSim.vector_tree_key_append)
+ empty = _swig_new_instance_method(_FFPopSim.vector_tree_key_empty)
+ size = _swig_new_instance_method(_FFPopSim.vector_tree_key_size)
+ swap = _swig_new_instance_method(_FFPopSim.vector_tree_key_swap)
+ begin = _swig_new_instance_method(_FFPopSim.vector_tree_key_begin)
+ end = _swig_new_instance_method(_FFPopSim.vector_tree_key_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.vector_tree_key_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.vector_tree_key_rend)
+ clear = _swig_new_instance_method(_FFPopSim.vector_tree_key_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.vector_tree_key_get_allocator)
+ pop_back = _swig_new_instance_method(_FFPopSim.vector_tree_key_pop_back)
+ erase = _swig_new_instance_method(_FFPopSim.vector_tree_key_erase)
+
+ def __init__(self, *args):
+ _FFPopSim.vector_tree_key_swiginit(self, _FFPopSim.new_vector_tree_key(*args))
+ push_back = _swig_new_instance_method(_FFPopSim.vector_tree_key_push_back)
+ front = _swig_new_instance_method(_FFPopSim.vector_tree_key_front)
+ back = _swig_new_instance_method(_FFPopSim.vector_tree_key_back)
+ assign = _swig_new_instance_method(_FFPopSim.vector_tree_key_assign)
+ resize = _swig_new_instance_method(_FFPopSim.vector_tree_key_resize)
+ insert = _swig_new_instance_method(_FFPopSim.vector_tree_key_insert)
+ reserve = _swig_new_instance_method(_FFPopSim.vector_tree_key_reserve)
+ capacity = _swig_new_instance_method(_FFPopSim.vector_tree_key_capacity)
+ __swig_destroy__ = _FFPopSim.delete_vector_tree_key
+
+# Register vector_tree_key in _FFPopSim:
+_FFPopSim.vector_tree_key_swigregister(vector_tree_key)
+class list_tree_key(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.list_tree_key_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.list_tree_key___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.list_tree_key___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.list_tree_key___len__)
+ __getslice__ = _swig_new_instance_method(_FFPopSim.list_tree_key___getslice__)
+ __setslice__ = _swig_new_instance_method(_FFPopSim.list_tree_key___setslice__)
+ __delslice__ = _swig_new_instance_method(_FFPopSim.list_tree_key___delslice__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.list_tree_key___delitem__)
+ __getitem__ = _swig_new_instance_method(_FFPopSim.list_tree_key___getitem__)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.list_tree_key___setitem__)
+ pop = _swig_new_instance_method(_FFPopSim.list_tree_key_pop)
+ append = _swig_new_instance_method(_FFPopSim.list_tree_key_append)
+ empty = _swig_new_instance_method(_FFPopSim.list_tree_key_empty)
+ size = _swig_new_instance_method(_FFPopSim.list_tree_key_size)
+ swap = _swig_new_instance_method(_FFPopSim.list_tree_key_swap)
+ begin = _swig_new_instance_method(_FFPopSim.list_tree_key_begin)
+ end = _swig_new_instance_method(_FFPopSim.list_tree_key_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.list_tree_key_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.list_tree_key_rend)
+ clear = _swig_new_instance_method(_FFPopSim.list_tree_key_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.list_tree_key_get_allocator)
+ pop_back = _swig_new_instance_method(_FFPopSim.list_tree_key_pop_back)
+ erase = _swig_new_instance_method(_FFPopSim.list_tree_key_erase)
+
+ def __init__(self, *args):
+ _FFPopSim.list_tree_key_swiginit(self, _FFPopSim.new_list_tree_key(*args))
+ push_back = _swig_new_instance_method(_FFPopSim.list_tree_key_push_back)
+ front = _swig_new_instance_method(_FFPopSim.list_tree_key_front)
+ back = _swig_new_instance_method(_FFPopSim.list_tree_key_back)
+ assign = _swig_new_instance_method(_FFPopSim.list_tree_key_assign)
+ resize = _swig_new_instance_method(_FFPopSim.list_tree_key_resize)
+ insert = _swig_new_instance_method(_FFPopSim.list_tree_key_insert)
+ pop_front = _swig_new_instance_method(_FFPopSim.list_tree_key_pop_front)
+ push_front = _swig_new_instance_method(_FFPopSim.list_tree_key_push_front)
+ reverse = _swig_new_instance_method(_FFPopSim.list_tree_key_reverse)
+ __swig_destroy__ = _FFPopSim.delete_list_tree_key
+
+# Register list_tree_key in _FFPopSim:
+_FFPopSim.list_tree_key_swigregister(list_tree_key)
+class map_key_edge(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.map_key_edge_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.map_key_edge___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.map_key_edge___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.map_key_edge___len__)
+ def __iter__(self):
+ return self.key_iterator()
+ def iterkeys(self):
+ return self.key_iterator()
+ def itervalues(self):
+ return self.value_iterator()
+ def iteritems(self):
+ return self.iterator()
+ __getitem__ = _swig_new_instance_method(_FFPopSim.map_key_edge___getitem__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.map_key_edge___delitem__)
+ has_key = _swig_new_instance_method(_FFPopSim.map_key_edge_has_key)
+ keys = _swig_new_instance_method(_FFPopSim.map_key_edge_keys)
+ values = _swig_new_instance_method(_FFPopSim.map_key_edge_values)
+ items = _swig_new_instance_method(_FFPopSim.map_key_edge_items)
+ __contains__ = _swig_new_instance_method(_FFPopSim.map_key_edge___contains__)
+ key_iterator = _swig_new_instance_method(_FFPopSim.map_key_edge_key_iterator)
+ value_iterator = _swig_new_instance_method(_FFPopSim.map_key_edge_value_iterator)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.map_key_edge___setitem__)
+ asdict = _swig_new_instance_method(_FFPopSim.map_key_edge_asdict)
+
+ def __init__(self, *args):
+ _FFPopSim.map_key_edge_swiginit(self, _FFPopSim.new_map_key_edge(*args))
+ empty = _swig_new_instance_method(_FFPopSim.map_key_edge_empty)
+ size = _swig_new_instance_method(_FFPopSim.map_key_edge_size)
+ swap = _swig_new_instance_method(_FFPopSim.map_key_edge_swap)
+ begin = _swig_new_instance_method(_FFPopSim.map_key_edge_begin)
+ end = _swig_new_instance_method(_FFPopSim.map_key_edge_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.map_key_edge_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.map_key_edge_rend)
+ clear = _swig_new_instance_method(_FFPopSim.map_key_edge_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.map_key_edge_get_allocator)
+ count = _swig_new_instance_method(_FFPopSim.map_key_edge_count)
+ erase = _swig_new_instance_method(_FFPopSim.map_key_edge_erase)
+ find = _swig_new_instance_method(_FFPopSim.map_key_edge_find)
+ lower_bound = _swig_new_instance_method(_FFPopSim.map_key_edge_lower_bound)
+ upper_bound = _swig_new_instance_method(_FFPopSim.map_key_edge_upper_bound)
+ __swig_destroy__ = _FFPopSim.delete_map_key_edge
+
+# Register map_key_edge in _FFPopSim:
+_FFPopSim.map_key_edge_swigregister(map_key_edge)
+class map_key_node(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.map_key_node_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.map_key_node___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.map_key_node___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.map_key_node___len__)
+ def __iter__(self):
+ return self.key_iterator()
+ def iterkeys(self):
+ return self.key_iterator()
+ def itervalues(self):
+ return self.value_iterator()
+ def iteritems(self):
+ return self.iterator()
+ __getitem__ = _swig_new_instance_method(_FFPopSim.map_key_node___getitem__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.map_key_node___delitem__)
+ has_key = _swig_new_instance_method(_FFPopSim.map_key_node_has_key)
+ keys = _swig_new_instance_method(_FFPopSim.map_key_node_keys)
+ values = _swig_new_instance_method(_FFPopSim.map_key_node_values)
+ items = _swig_new_instance_method(_FFPopSim.map_key_node_items)
+ __contains__ = _swig_new_instance_method(_FFPopSim.map_key_node___contains__)
+ key_iterator = _swig_new_instance_method(_FFPopSim.map_key_node_key_iterator)
+ value_iterator = _swig_new_instance_method(_FFPopSim.map_key_node_value_iterator)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.map_key_node___setitem__)
+ asdict = _swig_new_instance_method(_FFPopSim.map_key_node_asdict)
+
+ def __init__(self, *args):
+ _FFPopSim.map_key_node_swiginit(self, _FFPopSim.new_map_key_node(*args))
+ empty = _swig_new_instance_method(_FFPopSim.map_key_node_empty)
+ size = _swig_new_instance_method(_FFPopSim.map_key_node_size)
+ swap = _swig_new_instance_method(_FFPopSim.map_key_node_swap)
+ begin = _swig_new_instance_method(_FFPopSim.map_key_node_begin)
+ end = _swig_new_instance_method(_FFPopSim.map_key_node_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.map_key_node_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.map_key_node_rend)
+ clear = _swig_new_instance_method(_FFPopSim.map_key_node_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.map_key_node_get_allocator)
+ count = _swig_new_instance_method(_FFPopSim.map_key_node_count)
+ erase = _swig_new_instance_method(_FFPopSim.map_key_node_erase)
+ find = _swig_new_instance_method(_FFPopSim.map_key_node_find)
+ lower_bound = _swig_new_instance_method(_FFPopSim.map_key_node_lower_bound)
+ upper_bound = _swig_new_instance_method(_FFPopSim.map_key_node_upper_bound)
+ __swig_destroy__ = _FFPopSim.delete_map_key_node
+
+# Register map_key_node in _FFPopSim:
+_FFPopSim.map_key_node_swigregister(map_key_node)
+class vector_polymorphism(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.vector_polymorphism_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___len__)
+ __getslice__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___getslice__)
+ __setslice__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___setslice__)
+ __delslice__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___delslice__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___delitem__)
+ __getitem__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___getitem__)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.vector_polymorphism___setitem__)
+ pop = _swig_new_instance_method(_FFPopSim.vector_polymorphism_pop)
+ append = _swig_new_instance_method(_FFPopSim.vector_polymorphism_append)
+ empty = _swig_new_instance_method(_FFPopSim.vector_polymorphism_empty)
+ size = _swig_new_instance_method(_FFPopSim.vector_polymorphism_size)
+ swap = _swig_new_instance_method(_FFPopSim.vector_polymorphism_swap)
+ begin = _swig_new_instance_method(_FFPopSim.vector_polymorphism_begin)
+ end = _swig_new_instance_method(_FFPopSim.vector_polymorphism_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.vector_polymorphism_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.vector_polymorphism_rend)
+ clear = _swig_new_instance_method(_FFPopSim.vector_polymorphism_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.vector_polymorphism_get_allocator)
+ pop_back = _swig_new_instance_method(_FFPopSim.vector_polymorphism_pop_back)
+ erase = _swig_new_instance_method(_FFPopSim.vector_polymorphism_erase)
+
+ def __init__(self, *args):
+ _FFPopSim.vector_polymorphism_swiginit(self, _FFPopSim.new_vector_polymorphism(*args))
+ push_back = _swig_new_instance_method(_FFPopSim.vector_polymorphism_push_back)
+ front = _swig_new_instance_method(_FFPopSim.vector_polymorphism_front)
+ back = _swig_new_instance_method(_FFPopSim.vector_polymorphism_back)
+ assign = _swig_new_instance_method(_FFPopSim.vector_polymorphism_assign)
+ resize = _swig_new_instance_method(_FFPopSim.vector_polymorphism_resize)
+ insert = _swig_new_instance_method(_FFPopSim.vector_polymorphism_insert)
+ reserve = _swig_new_instance_method(_FFPopSim.vector_polymorphism_reserve)
+ capacity = _swig_new_instance_method(_FFPopSim.vector_polymorphism_capacity)
+ __swig_destroy__ = _FFPopSim.delete_vector_polymorphism
+
+# Register vector_polymorphism in _FFPopSim:
+_FFPopSim.vector_polymorphism_swigregister(vector_polymorphism)
+class vector_tree_node(object):
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ __repr__ = _swig_repr
+ iterator = _swig_new_instance_method(_FFPopSim.vector_tree_node_iterator)
+ def __iter__(self):
+ return self.iterator()
+ __nonzero__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___nonzero__)
+ __bool__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___bool__)
+ __len__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___len__)
+ __getslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___getslice__)
+ __setslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___setslice__)
+ __delslice__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___delslice__)
+ __delitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___delitem__)
+ __getitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___getitem__)
+ __setitem__ = _swig_new_instance_method(_FFPopSim.vector_tree_node___setitem__)
+ pop = _swig_new_instance_method(_FFPopSim.vector_tree_node_pop)
+ append = _swig_new_instance_method(_FFPopSim.vector_tree_node_append)
+ empty = _swig_new_instance_method(_FFPopSim.vector_tree_node_empty)
+ size = _swig_new_instance_method(_FFPopSim.vector_tree_node_size)
+ swap = _swig_new_instance_method(_FFPopSim.vector_tree_node_swap)
+ begin = _swig_new_instance_method(_FFPopSim.vector_tree_node_begin)
+ end = _swig_new_instance_method(_FFPopSim.vector_tree_node_end)
+ rbegin = _swig_new_instance_method(_FFPopSim.vector_tree_node_rbegin)
+ rend = _swig_new_instance_method(_FFPopSim.vector_tree_node_rend)
+ clear = _swig_new_instance_method(_FFPopSim.vector_tree_node_clear)
+ get_allocator = _swig_new_instance_method(_FFPopSim.vector_tree_node_get_allocator)
+ pop_back = _swig_new_instance_method(_FFPopSim.vector_tree_node_pop_back)
+ erase = _swig_new_instance_method(_FFPopSim.vector_tree_node_erase)
+
+ def __init__(self, *args):
+ _FFPopSim.vector_tree_node_swiginit(self, _FFPopSim.new_vector_tree_node(*args))
+ push_back = _swig_new_instance_method(_FFPopSim.vector_tree_node_push_back)
+ front = _swig_new_instance_method(_FFPopSim.vector_tree_node_front)
+ back = _swig_new_instance_method(_FFPopSim.vector_tree_node_back)
+ assign = _swig_new_instance_method(_FFPopSim.vector_tree_node_assign)
+ resize = _swig_new_instance_method(_FFPopSim.vector_tree_node_resize)
+ insert = _swig_new_instance_method(_FFPopSim.vector_tree_node_insert)
+ reserve = _swig_new_instance_method(_FFPopSim.vector_tree_node_reserve)
+ capacity = _swig_new_instance_method(_FFPopSim.vector_tree_node_capacity)
+ __swig_destroy__ = _FFPopSim.delete_vector_tree_node
+
+# Register vector_tree_node in _FFPopSim:
+_FFPopSim.vector_tree_node_swigregister(vector_tree_node)
+
+LICENSE = '''FFPopSim is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. FFPopSim is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with FFPopSim. If not, see .'''
+
+
+import numpy as _np
+
+FREE_RECOMBINATION = _FFPopSim.FREE_RECOMBINATION
+
+CROSSOVERS = _FFPopSim.CROSSOVERS
+
+SINGLE_CROSSOVER = _FFPopSim.SINGLE_CROSSOVER
+
+class index_value_pair(object):
+ r"""Pair of an index and a value"""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ index = property(_FFPopSim.index_value_pair_index_get, _FFPopSim.index_value_pair_index_set, doc=r"""Index""")
+ val = property(_FFPopSim.index_value_pair_val_get, _FFPopSim.index_value_pair_val_set, doc=r"""Value""")
+
+ def __init__(self, *args, **kwargs):
+ r"""Pair of an index and a value"""
+ _FFPopSim.index_value_pair_swiginit(self, _FFPopSim.new_index_value_pair(*args, **kwargs))
+ __str__ = _swig_new_instance_method(_FFPopSim.index_value_pair___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.index_value_pair___repr__)
+ __swig_destroy__ = _FFPopSim.delete_index_value_pair
+
+# Register index_value_pair in _FFPopSim:
+_FFPopSim.index_value_pair_swigregister(index_value_pair)
+class genotype_value_pair(object):
+ r"""Pair of a genotype and a value"""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ genotype = property(_FFPopSim.genotype_value_pair_genotype_get, _FFPopSim.genotype_value_pair_genotype_set, doc=r"""Genotype""")
+ val = property(_FFPopSim.genotype_value_pair_val_get, _FFPopSim.genotype_value_pair_val_set, doc=r"""Value""")
+
+ def __init__(self, *args, **kwargs):
+ r"""Pair of a genotype and a value"""
+ _FFPopSim.genotype_value_pair_swiginit(self, _FFPopSim.new_genotype_value_pair(*args, **kwargs))
+ __str__ = _swig_new_instance_method(_FFPopSim.genotype_value_pair___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.genotype_value_pair___repr__)
+ __swig_destroy__ = _FFPopSim.delete_genotype_value_pair
+
+# Register genotype_value_pair in _FFPopSim:
+_FFPopSim.genotype_value_pair_swigregister(genotype_value_pair)
+class stat(object):
+ r"""Mean and variance of a statistical distribution"""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ mean = property(_FFPopSim.stat_mean_get, _FFPopSim.stat_mean_set, doc=r"""Mean""")
+ variance = property(_FFPopSim.stat_variance_get, _FFPopSim.stat_variance_set, doc=r"""Variance""")
+
+ def __init__(self, *args, **kwargs):
+ r"""Mean and variance of a statistical distribution"""
+ _FFPopSim.stat_swiginit(self, _FFPopSim.new_stat(*args, **kwargs))
+ __str__ = _swig_new_instance_method(_FFPopSim.stat___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.stat___repr__)
+ __swig_destroy__ = _FFPopSim.delete_stat
+
+# Register stat in _FFPopSim:
+_FFPopSim.stat_swigregister(stat)
+
+def binarify(gt, L=0):
+ '''Transform an integer into a binary sequence on the L hypercube.
+
+ Parameters:
+ - gt: integer representing a genotype
+ - L: number of dimensions of the hypercube
+
+ Returns:
+ - genotype: bool vector representing the same genotype
+
+ **Examples**:
+
+ .. sourcecode:: ipython
+
+ In [1]: binarify(3, 5)
+ Out[1]: array([False, False, False, True, True], dtype=bool)
+
+ In [2]: FFPopSim.binarify(0b11, 5)
+ Out[2]: array([False, False, False, True, True], dtype=bool)
+ '''
+ if not L:
+ L=1
+ while gt > ((1<= self.L - 1):
+ raise ValueError("Expecting a locus from 0 to L - 2.")
+
+
+ return _FFPopSim.haploid_lowd_get_recombination_rate(self, *args, **kwargs)
+
+
+ def set_allele_frequencies(self, *args, **kwargs):
+ r"""
+ Initialize the population in linkage equilibrium with specified allele frequencies.
+
+ Parameters:
+ - frequencies: an array of length L with all allele frequencies
+ - N: set the population size and, if still unset, the carrying
+ capacity to this value
+
+ .. note:: the population size is only used for resampling and has therefore
+ no effect on the speed of the simulation.
+
+ """
+
+ if len(args) and (len(args[0]) != self.L):
+ raise ValueError('The input array of allele frequencies has the wrong length.')
+
+
+ val = _FFPopSim.haploid_lowd_set_allele_frequencies(self, *args, **kwargs)
+
+ return None
+
+
+ return val
+
+
+ def set_wildtype(self, *args, **kwargs):
+ r"""
+ Initialize population of N individuals with the - allele at all loci (wildtype)
+
+ Parameters:
+ - N: the number of individuals
+
+ .. note:: the carrying capacity is set to the same value if still unset.
+
+ """
+ val = _FFPopSim.haploid_lowd_set_wildtype(self, *args, **kwargs)
+
+ return None
+
+
+ return val
+
+ _set_recombination_model = _swig_new_instance_method(_FFPopSim.haploid_lowd__set_recombination_model)
+ _set_recombination_rates = _swig_new_instance_method(_FFPopSim.haploid_lowd__set_recombination_rates)
+
+ def evolve(self, *args, **kwargs):
+ r"""
+ Evolve for some generations
+
+ Parameters:
+ - gen: number of generations to evolve the population, defaults to one
+
+ """
+ val = _FFPopSim.haploid_lowd_evolve(self, *args, **kwargs)
+
+ return None
+
+
+ return val
+
+
+ def evolve_norec(self, *args, **kwargs):
+ r"""
+ Evolve for some generations without recombination
+
+ Parameters:
+ - gen: number of generations to evolve the population
+
+ """
+ val = _FFPopSim.haploid_lowd_evolve_norec(self, *args, **kwargs)
+
+ return None
+
+
+ return val
+
+
+ def evolve_deterministic(self, *args, **kwargs):
+ r"""
+ Evolve for some generations deterministically (skips the resampling)
+
+ Parameters:
+ - gen: number of generations to evolve the population
+
+ """
+ val = _FFPopSim.haploid_lowd_evolve_deterministic(self, *args, **kwargs)
+
+ return None
+
+
+ return val
+
+
+ def get_genotype_frequency(self, *args, **kwargs):
+ r"""
+ Get the frequency of a genotype
+
+ Parameters:
+ - genotype: genotype, whose the frequency is to be returned
+
+ Returns:
+ - the frequency of the genotype
+
+ """
+
+ if len(args) and (args[0] >= (1<}{2}`, where :math:`s_i \in \{-1, 1\}`.
+
+ """
+
+ if len(args) and (args[0] >= (self.L)):
+ raise ValueError("Expecting a locus from 0 to L - 1.")
+
+
+ return _FFPopSim.haploid_lowd_get_allele_frequency(self, *args, **kwargs)
+
+
+ def get_pair_frequency(self, *args, **kwargs):
+ r"""
+ Get the frequency of genotypes with the + allele at both loci.
+
+ Parameters:
+ - locus1: first locus
+ - locus2: second locus
+
+ Returns:
+ - the joint frequency of the + alleles
+
+ """
+
+ if (len(args) >= 2) and ((args[0] >= (self.L)) or (args[1] >= (self.L))):
+ raise ValueError("Expecting loci from 0 to L - 1.")
+
+
+ return _FFPopSim.haploid_lowd_get_pair_frequency(self, *args, **kwargs)
+
+
+ def get_chi(self, *args, **kwargs):
+ r"""
+ Get chi of an allele in the -/+ basis
+
+ Parameters:
+ - locus: locus whose chi is to be computed
+
+ Returns:
+ - the chi of that allele, :math:`\chi_i := \left`, where :math:`s_i \in \{-1, 1\}`.
+
+ """
+
+ if len(args) and (args[0] >= (self.L)):
+ raise ValueError("Expecting a locus from 0 to L - 1.")
+
+
+ return _FFPopSim.haploid_lowd_get_chi(self, *args, **kwargs)
+
+
+ def get_chi2(self, *args, **kwargs):
+ r"""
+ Get :math:`\chi_{ij}`
+
+ Parameters:
+ - locus1: first locus
+ - locus2: second locus
+
+ Returns:
+ - the linkage disequilibiurm between them, i.e. :math:`\chi_{ij} := \left - \chi_i \cdot \chi_j`.
+
+ """
+
+ if (len(args) >= 2) and ((args[0] >= (self.L)) or (args[1] >= (self.L))):
+ raise ValueError("Expecting loci from 0 to L - 1.")
+
+
+ return _FFPopSim.haploid_lowd_get_chi2(self, *args, **kwargs)
+
+
+ def get_LD(self, *args, **kwargs):
+ r"""
+ Get linkage disequilibrium
+
+ Parameters:
+ - locus1: first locus
+ - locus2: second locus
+
+ Returns:
+ - the linkage disequilibiurm between them, i.e. :math:`D_{ij} := 1 / 4 \left[\left - \chi_i \cdot \chi_j\right]`.
+
+ """
+
+ if (len(args) >= 2) and ((args[0] >= (self.L)) or (args[1] >= (self.L))):
+ raise ValueError("Expecting loci from 0 to L - 1.")
+
+
+ return _FFPopSim.haploid_lowd_get_LD(self, *args, **kwargs)
+
+
+ def get_moment(self, *args, **kwargs):
+ r"""
+ Get moment of two alleles in the -/+ basis
+
+ Parameters:
+ - locus1: first locus
+ - locus2: second locus
+
+ Returns:
+ - the second moment, i.e. :math:`\left`, where :math:`s_i, s_j \in \{-1, 1\}`.
+
+ """
+
+ if (len(args) >= 2) and ((args[0] >= (self.L)) or (args[1] >= (self.L))):
+ raise ValueError("Expecting loci from 0 to L - 1.")
+
+
+ return _FFPopSim.haploid_lowd_get_moment(self, *args, **kwargs)
+
+ genotype_entropy = _swig_new_instance_method(_FFPopSim.haploid_lowd_genotype_entropy)
+ allele_entropy = _swig_new_instance_method(_FFPopSim.haploid_lowd_allele_entropy)
+
+ def get_fitness(self, *args, **kwargs):
+ r"""
+ Get fitness values of a genotype
+
+ Parameters:
+ - genotype: genotype whose fitness is to be calculated. This can either be an integer or in binary format, e.g. 5 = 0b101
+
+ Returns:
+ - the fitness of that genotype.
+
+ """
+
+ if len(args) and (args[0] >= (1<= (1<""")
+ fitness = property(_FFPopSim.tree_node_fitness_get, _FFPopSim.tree_node_fitness_set, doc=r"""Fitness of the clone represented by the node""")
+ _weight_distribution = property(_FFPopSim.tree_node__weight_distribution_get, _FFPopSim.tree_node__weight_distribution_set, doc=r"""_weight_distribution : vector<(step_t)>""")
+ number_of_offspring = property(_FFPopSim.tree_node_number_of_offspring_get, _FFPopSim.tree_node_number_of_offspring_set, doc=r"""Number of offspring""")
+ clone_size = property(_FFPopSim.tree_node_clone_size_get, _FFPopSim.tree_node_clone_size_set, doc=r"""Size of the clone represented by the node""")
+ sampled = property(_FFPopSim.tree_node_sampled_get, _FFPopSim.tree_node_sampled_set, doc=r"""sampled : int""")
+ sequence = property(_FFPopSim.tree_node_sequence_get, _FFPopSim.tree_node_sequence_set, doc=r"""sequence : boost::dynamic_bitset<()>""")
+ __str__ = _swig_new_instance_method(_FFPopSim.tree_node___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.tree_node___repr__)
+
+ @property
+ def child_edges(self):
+ '''Child edges of the node'''
+ return list(self._child_edges)
+
+
+ @child_edges.setter
+ def child_edges(self, es):
+ self._child_edges = list_tree_key(es)
+
+ _get_crossover_chunk = _swig_new_instance_method(_FFPopSim.tree_node__get_crossover_chunk)
+ _set_crossover_chunk = _swig_new_instance_method(_FFPopSim.tree_node__set_crossover_chunk)
+
+ @property
+ def crossover(self):
+ '''Crossover of node'''
+ return [self._get_crossover_chunk(i) for i in range(2)]
+
+ @crossover.setter
+ def crossover(self, value):
+ if len(value) != 2:
+ raise ValueError('Crossover is a pair of integers.')
+ [self._set_crossover_chunk(value[i], i) for i in range(2)]
+
+
+ @property
+ def weight_distribution(self):
+ '''Distribution of weights of this node'''
+ return list(self._weight_distribution)
+
+ @weight_distribution.setter
+ def weight_distribution(self, distr):
+ self._weight_distribution = vector_tree_step(distr)
+
+
+ def __init__(self, *args, **kwargs):
+ r"""Node of a phylogenetic tree"""
+ _FFPopSim.tree_node_swiginit(self, _FFPopSim.new_tree_node(*args, **kwargs))
+ __swig_destroy__ = _FFPopSim.delete_tree_node
+
+# Register tree_node in _FFPopSim:
+_FFPopSim.tree_node_swigregister(tree_node)
+class tree_edge(object):
+ r"""Edge of a phylogenetic tree"""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ parent_node = property(_FFPopSim.tree_edge_parent_node_get, _FFPopSim.tree_edge_parent_node_set, doc=r"""Parent tree key""")
+ own_key = property(_FFPopSim.tree_edge_own_key_get, _FFPopSim.tree_edge_own_key_set, doc=r"""Own tree key""")
+ length = property(_FFPopSim.tree_edge_length_get, _FFPopSim.tree_edge_length_set, doc=r"""Edge length [in generations]""")
+ number_of_offspring = property(_FFPopSim.tree_edge_number_of_offspring_get, _FFPopSim.tree_edge_number_of_offspring_set, doc=r"""Number of offspring""")
+ __str__ = _swig_new_instance_method(_FFPopSim.tree_edge___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.tree_edge___repr__)
+ _get_segment_chunk = _swig_new_instance_method(_FFPopSim.tree_edge__get_segment_chunk)
+
+ @property
+ def segment(self):
+ '''Segment of edge'''
+ return [self._get_segment_chunk(i) for i in range(2)]
+
+
+ def __init__(self, *args, **kwargs):
+ r"""Edge of a phylogenetic tree"""
+ _FFPopSim.tree_edge_swiginit(self, _FFPopSim.new_tree_edge(*args, **kwargs))
+ __swig_destroy__ = _FFPopSim.delete_tree_edge
+
+# Register tree_edge in _FFPopSim:
+_FFPopSim.tree_edge_swigregister(tree_edge)
+class polymorphism(object):
+ r"""Polymorphism history"""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ birth = property(_FFPopSim.polymorphism_birth_get, _FFPopSim.polymorphism_birth_set, doc=r"""Birth generation""")
+ sweep_time = property(_FFPopSim.polymorphism_sweep_time_get, _FFPopSim.polymorphism_sweep_time_set, doc=r"""Sweep time [in generations]""")
+ effect = property(_FFPopSim.polymorphism_effect_get, _FFPopSim.polymorphism_effect_set, doc=r"""Fitness effect of the mutation""")
+ fitness = property(_FFPopSim.polymorphism_fitness_get, _FFPopSim.polymorphism_fitness_set, doc=r"""Relative fitness of the clone at birth""")
+ fitness_variance = property(_FFPopSim.polymorphism_fitness_variance_get, _FFPopSim.polymorphism_fitness_variance_set, doc=r"""Fitness variance of the population at birth""")
+
+ def __init__(self, *args, **kwargs):
+ r"""Polymorphism history"""
+ _FFPopSim.polymorphism_swiginit(self, _FFPopSim.new_polymorphism(*args, **kwargs))
+ __str__ = _swig_new_instance_method(_FFPopSim.polymorphism___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.polymorphism___repr__)
+ __swig_destroy__ = _FFPopSim.delete_polymorphism
+
+# Register polymorphism in _FFPopSim:
+_FFPopSim.polymorphism_swigregister(polymorphism)
+class rooted_tree(object):
+ r"""
+ Rooted phylogenetic tree.
+
+ This class is used to represent the phylogenetic tree of a single locus.
+ It is possible to print the tree in Newick format, to get the subtree
+ spanned by some of the leaves, and to look at the tree nodes and edges.
+
+ """
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ _edges = property(_FFPopSim.rooted_tree__edges_get, _FFPopSim.rooted_tree__edges_set, doc=r"""_edges : map<(tree_key_t,edge_t)>""")
+ _nodes = property(_FFPopSim.rooted_tree__nodes_get, _FFPopSim.rooted_tree__nodes_set, doc=r"""_nodes : map<(tree_key_t,node_t)>""")
+ _leafs = property(_FFPopSim.rooted_tree__leafs_get, _FFPopSim.rooted_tree__leafs_set, doc=r"""_leafs : vector<(tree_key_t)>""")
+ _sampled_leafs = property(_FFPopSim.rooted_tree__sampled_leafs_get, _FFPopSim.rooted_tree__sampled_leafs_set, doc=r"""_sampled_leafs : vector<(tree_key_t)>""")
+ root = property(_FFPopSim.rooted_tree_root_get, _FFPopSim.rooted_tree_root_set, doc=r"""root : tree_key_t""")
+ MRCA = property(_FFPopSim.rooted_tree_MRCA_get, _FFPopSim.rooted_tree_MRCA_set, doc=r"""MRCA : tree_key_t""")
+
+ def __init__(self, *args, **kwargs):
+ r"""
+ Rooted phylogenetic tree.
+
+ This class is used to represent the phylogenetic tree of a single locus.
+ It is possible to print the tree in Newick format, to get the subtree
+ spanned by some of the leaves, and to look at the tree nodes and edges.
+
+ """
+ _FFPopSim.rooted_tree_swiginit(self, _FFPopSim.new_rooted_tree(*args, **kwargs))
+ __swig_destroy__ = _FFPopSim.delete_rooted_tree
+ external_branch_length = _swig_new_instance_method(_FFPopSim.rooted_tree_external_branch_length)
+ total_branch_length = _swig_new_instance_method(_FFPopSim.rooted_tree_total_branch_length)
+ calc_weight_distribution = _swig_new_instance_method(_FFPopSim.rooted_tree_calc_weight_distribution)
+ print_newick = _swig_new_instance_method(_FFPopSim.rooted_tree_print_newick)
+ print_sequences = _swig_new_instance_method(_FFPopSim.rooted_tree_print_sequences)
+ subtree_newick = _swig_new_instance_method(_FFPopSim.rooted_tree_subtree_newick)
+ print_weight_distribution = _swig_new_instance_method(_FFPopSim.rooted_tree_print_weight_distribution)
+ read_newick = _swig_new_instance_method(_FFPopSim.rooted_tree_read_newick)
+ get_sampled_leafs = _swig_new_instance_method(_FFPopSim.rooted_tree_get_sampled_leafs)
+ set_sampled_leafs = _swig_new_instance_method(_FFPopSim.rooted_tree_set_sampled_leafs)
+ __str__ = _swig_new_instance_method(_FFPopSim.rooted_tree___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.rooted_tree___repr__)
+ _ancestors_at_age = _swig_new_instance_method(_FFPopSim.rooted_tree__ancestors_at_age)
+
+ def ancestors_at_age(self, age, subtree):
+ '''Find nodes in subtree younger than a certain age
+
+ Parameters:
+ - age: critical age to check
+ - subtree: subtree to look for nodes in
+
+ Returns:
+ - ancestors: the ancestors at that age
+ '''
+ return list(self._ancestors_at_age(age, subtree))
+
+ create_subtree_from_keys = _swig_new_instance_method(_FFPopSim.rooted_tree_create_subtree_from_keys)
+
+ @property
+ def edges(self):
+ '''Edges of the tree'''
+ return dict(self._edges)
+
+
+ @edges.setter
+ def edges(self, es):
+ self._edges = map_key_edge(es)
+
+
+ @property
+ def nodes(self):
+ '''Nodes of the tree'''
+ return dict(self._nodes)
+
+
+ @nodes.setter
+ def nodes(self, ns):
+ self._nodes = map_key_node(ns)
+
+
+ @property
+ def leafs(self):
+ '''Leaves of the tree'''
+ return list(self._leafs)
+
+
+ @leafs.setter
+ def leafs(self, leaves):
+ self._leafs = vector_tree_key(leaves)
+
+
+ @property
+ def sampled_leafs(self):
+ return list(self._sampled_leafs)
+
+
+ @leafs.setter
+ def sampled_leafs(self, leaves):
+ self._sampled_leafs = vector_tree_key(leaves)
+
+
+ def to_Biopython_tree(self):
+ '''Convert the tree into Biopython format
+
+ Returns:
+ - tree: Biopython.Phylo phylogenetic tree representation of self
+ '''
+ from io import StringIO
+ from Bio import Phylo
+
+ treedata = self.print_newick()
+ handle = StringIO(treedata)
+ tree = Phylo.read(handle, "newick")
+ return tree
+
+
+# Register rooted_tree in _FFPopSim:
+_FFPopSim.rooted_tree_swigregister(rooted_tree)
+class multi_locus_genealogy(object):
+ r"""Genealogy for multiple loci"""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+
+ def __init__(self, *args, **kwargs):
+ r"""Default constructor"""
+ _FFPopSim.multi_locus_genealogy_swiginit(self, _FFPopSim.new_multi_locus_genealogy(*args, **kwargs))
+ __swig_destroy__ = _FFPopSim.delete_multi_locus_genealogy
+ track_locus = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy_track_locus)
+ reset = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy_reset)
+ reset_but_loci = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy_reset_but_loci)
+ __str__ = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy___repr__)
+ _get_number_of_loci = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy__get_number_of_loci)
+ _get_loci = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy__get_loci)
+
+ @property
+ def loci(self):
+ '''The loci that are being tracked'''
+ return self._get_loci(self._get_number_of_loci())
+
+ get_tree = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy_get_tree)
+ _set_tree = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy__set_tree)
+ _get_newGeneration = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy__get_newGeneration)
+ _set_newGeneration = _swig_new_instance_method(_FFPopSim.multi_locus_genealogy__set_newGeneration)
+
+# Register multi_locus_genealogy in _FFPopSim:
+_FFPopSim.multi_locus_genealogy_swigregister(multi_locus_genealogy)
+class haploid_highd(object):
+ r"""
+ Class for high-dimensional population genetics (genomes larger than ~20 loci).
+
+ This class is the main object for simulating the evolution of populations with
+ many loci (more than ~20). The class offers a number of functions, but an
+ example will explain the basic idea::
+
+ ######################################
+ # EXAMPLE SCRIPT FOR HAPLOID_HIGHD #
+ ######################################
+ import numpy as np
+ import matplotlib.pyplot as plt
+ import FFPopSim as h
+ c = h.haploid_highd(300) # 300 loci
+ pop.set_wildtype(1000) # start with 1000 wildtype individuals
+ pop.mutation_rate = 1e-4 # mutation rate per site per generation
+ pop.outcrossing_rate = 1e-1 # probability of sexual reproduction per gen
+ pop.crossover_rate = 1e-2 # probability of crossover per site per gen
+ pop.evolve(100) # evolve for 100 generations
+ c.plot_divergence_histogram()
+ plt.show()
+ ######################################
+
+ Populations can have a number of phenotypic traits that contribute to the fitness
+ of each individual. The function that calculates fitness from the phenotype
+ identifies fitness with the first trait only by default. The user is, however,
+ free to subclass haploid_highd in C++ (as it is done in hivpopulation) and
+ implement their own phenotype -> fitness function.
+
+ In addition, the trait landscapes describe the genotype -> phenotype maps.
+ These can be set directly from Python (since the genotypic space has a finite
+ number of elements).
+
+ **Note**: fitness is not a phenotypic trait directly, but rather a function of *all*
+ phenotypic traits together.
+
+ """
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+
+ def __init__(self, *args, **kwargs):
+ r"""
+ Construct a high-dimensional population with certain parameters.
+
+ Parameters:
+ - L: number of loci
+ - rng_seed: seed for the random generator. If zero (default) pick a random number
+ - number_of_traits: number of phenotypic traits, defaults to one
+ - all_polymorphic: option to use an infinite-sites model tracking ancestral alleles
+ (only available with a single phenotypic trait and zero mutation rate)
+
+ """
+ _FFPopSim.haploid_highd_swiginit(self, _FFPopSim.new_haploid_highd(*args, **kwargs))
+ __swig_destroy__ = _FFPopSim.delete_haploid_highd
+ carrying_capacity = property(_FFPopSim.haploid_highd_carrying_capacity_get, _FFPopSim.haploid_highd_carrying_capacity_set, doc=r"""current carrying capacity of the environment""")
+ outcrossing_rate = property(_FFPopSim.haploid_highd_outcrossing_rate_get, _FFPopSim.haploid_highd_outcrossing_rate_set, doc=r"""outcrossing rate (probability of sexual reproduction per generation)""")
+ crossover_rate = property(_FFPopSim.haploid_highd_crossover_rate_get, _FFPopSim.haploid_highd_crossover_rate_set, doc=r"""crossover rate (probability of crossover per site per generation)""")
+ recombination_model = property(_FFPopSim.haploid_highd_recombination_model_get, _FFPopSim.haploid_highd_recombination_model_set, doc=r"""
+ Model of recombination to use
+
+ Available values:
+ - FFPopSim.FREE_RECOMBINATION: free reassortment of all loci between parents
+ - FFPopSim.CROSSOVERS: linear chromosome with crossover probability per locus
+
+ """)
+ circular = property(_FFPopSim.haploid_highd_circular_get, _FFPopSim.haploid_highd_circular_set, doc=r"""is the genome circular?""")
+ growth_rate = property(_FFPopSim.haploid_highd_growth_rate_get, _FFPopSim.haploid_highd_growth_rate_set, doc=r"""
+ Growth rate
+
+ This value is used to determine how fast a population converges to the
+ carrying capacity.
+
+ This parameter must be set strictly larger than 1 (very slow growth) and not
+ too big to avoid population explosion. The default is 2, which means that a
+ freely expanding population (N << carrying capacity) approximately doubles in
+ size every generation.
+
+ Note that when the population is shrinking, in order to avoid extinction, the
+ population decreases by ten times or so only. If you want a hard bottleneck,
+ use the bottleneck function.
+
+ """)
+ all_polymorphic = property(_FFPopSim.haploid_highd_all_polymorphic_get, _FFPopSim.haploid_highd_all_polymorphic_set, doc=r"""All polymorphic?""")
+ _get_mutation_rate = _swig_new_instance_method(_FFPopSim.haploid_highd__get_mutation_rate)
+ _set_mutation_rate = _swig_new_instance_method(_FFPopSim.haploid_highd__set_mutation_rate)
+ get_all_polymorphic = _swig_new_instance_method(_FFPopSim.haploid_highd_get_all_polymorphic)
+ set_all_polymorphic = _swig_new_instance_method(_FFPopSim.haploid_highd_set_all_polymorphic)
+ _get_polymorphisms = _swig_new_instance_method(_FFPopSim.haploid_highd__get_polymorphisms)
+ _get_fixed_mutations = _swig_new_instance_method(_FFPopSim.haploid_highd__get_fixed_mutations)
+ _get_number_of_mutations = _swig_new_instance_method(_FFPopSim.haploid_highd__get_number_of_mutations)
+
+ def set_allele_frequencies(self, *args, **kwargs):
+ r"""
+ Initialize the population according to the given allele frequencies in linkage equilibrium.
+
+ Parameters:
+ - frequencies: an array of length L with all allele frequencies
+ - N: set the population size and, if still unset, the carrying
+ capacity to this value
+
+ """
+
+ if len(args) and (len(args[0]) != self.L):
+ raise ValueError('Please input an L dimensional list of allele frequencies.')
+
+
+ val = _FFPopSim.haploid_highd_set_allele_frequencies(self, *args, **kwargs)
+
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+ return None
+
+
+ return val
+
+
+ def set_wildtype(self, *args, **kwargs):
+ r"""
+ Initialize a population of wildtype individuals
+
+ Parameters:
+ - N: the number of individuals
+
+ .. note:: the carrying capacity is set to the same value if still unset.
+
+ """
+ val = _FFPopSim.haploid_highd_set_wildtype(self, *args, **kwargs)
+
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+ return None
+
+
+ return val
+
+ track_locus_genealogy = _swig_new_instance_method(_FFPopSim.haploid_highd_track_locus_genealogy)
+
+ def add_genotype(self, *args, **kwargs):
+ r"""
+ Add new individuals to the population with certain genotypes
+
+ Parameters:
+ - genotype: genotype to add to the population (Boolean list)
+ - n: number of new individuals carrying that genotype
+
+ """
+ val = _FFPopSim.haploid_highd_add_genotype(self, *args, **kwargs)
+
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+
+
+ return val
+
+ add_trait_coefficient = _swig_new_instance_method(_FFPopSim.haploid_highd_add_trait_coefficient)
+ clear_trait = _swig_new_instance_method(_FFPopSim.haploid_highd_clear_trait)
+ clear_traits = _swig_new_instance_method(_FFPopSim.haploid_highd_clear_traits)
+ set_random_trait_epistasis = _swig_new_instance_method(_FFPopSim.haploid_highd_set_random_trait_epistasis)
+ add_fitness_coefficient = _swig_new_instance_method(_FFPopSim.haploid_highd_add_fitness_coefficient)
+ clear_fitness = _swig_new_instance_method(_FFPopSim.haploid_highd_clear_fitness)
+ set_random_epistasis = _swig_new_instance_method(_FFPopSim.haploid_highd_set_random_epistasis)
+
+ def evolve(self, *args, **kwargs):
+ r"""
+ Evolve for some generations.
+
+ Parameters:
+ - gen: number of generations, defaults to one
+
+ """
+ val = _FFPopSim.haploid_highd_evolve(self, *args, **kwargs)
+
+ self.calc_stat()
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+ return None
+
+
+ return val
+
+
+ def bottleneck(self, *args, **kwargs):
+ r"""
+ Make the population undergo a bottleneck
+
+ Parameters:
+ - size_of_bottleneck: the number of individuals at the bottleneck
+
+ """
+ val = _FFPopSim.haploid_highd_bottleneck(self, *args, **kwargs)
+
+ self.calc_stat()
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+ return None
+
+
+ return val
+
+ flip_single_locus = _swig_new_instance_method(_FFPopSim.haploid_highd_flip_single_locus)
+ calc_stat = _swig_new_instance_method(_FFPopSim.haploid_highd_calc_stat)
+
+ def unique_clones(self, *args, **kwargs):
+ r"""
+ Recompress the clone structure
+
+ During its evolution, identical clones might be generated by different routes at
+ different times. This function merges any such duplicates into unique clones with
+ the size equal to the sum of the sizes of the duplicates.
+
+ """
+ val = _FFPopSim.haploid_highd_unique_clones(self, *args, **kwargs)
+
+ self._nonempty_clones = self._get_nonempty_clones()
+
+
+ return val
+
+ _get_nonempty_clones = _swig_new_instance_method(_FFPopSim.haploid_highd__get_nonempty_clones)
+
+ def random_clone(self, *args, **kwargs):
+ r"""
+ Get a random clone
+
+ Returns:
+ - clone: index of the random clone
+
+ """
+ val = _FFPopSim.haploid_highd_random_clone(self, *args, **kwargs)
+
+ val = (self._nonempty_clones == val).nonzero()[0][0]
+
+
+ return val
+
+ get_diversity_statistics = _swig_new_instance_method(_FFPopSim.haploid_highd_get_diversity_statistics)
+ get_divergence_statistics = _swig_new_instance_method(_FFPopSim.haploid_highd_get_divergence_statistics)
+ get_allele_frequency = _swig_new_instance_method(_FFPopSim.haploid_highd_get_allele_frequency)
+ get_derived_allele_frequency = _swig_new_instance_method(_FFPopSim.haploid_highd_get_derived_allele_frequency)
+ get_ancestral_state = _swig_new_instance_method(_FFPopSim.haploid_highd_get_ancestral_state)
+ get_pair_frequency = _swig_new_instance_method(_FFPopSim.haploid_highd_get_pair_frequency)
+ get_chi = _swig_new_instance_method(_FFPopSim.haploid_highd_get_chi)
+ get_derived_chi = _swig_new_instance_method(_FFPopSim.haploid_highd_get_derived_chi)
+ get_chi2 = _swig_new_instance_method(_FFPopSim.haploid_highd_get_chi2)
+ get_LD = _swig_new_instance_method(_FFPopSim.haploid_highd_get_LD)
+ get_moment = _swig_new_instance_method(_FFPopSim.haploid_highd_get_moment)
+ get_trait_weight = _swig_new_instance_method(_FFPopSim.haploid_highd_get_trait_weight)
+
+ def get_fitness(self, *args, **kwargs):
+ r"""
+ Get the fitness of an individual
+
+ Parameters:
+ - n: index of the clone whose fitness is to be computed
+
+ Returns:
+ - fitness: fitness value of that clone
+
+ """
+
+ if len(args) and (args[0] >= self.number_of_clones):
+ raise ValueError('The population has only '+str(self.number_of_clones)+' clones.')
+ if len(args):
+ args = list(args)
+ args[0] = self._nonempty_clones[args[0]]
+ args = tuple(args)
+
+
+ return _FFPopSim.haploid_highd_get_fitness(self, *args, **kwargs)
+
+
+ def get_clone_size(self, *args, **kwargs):
+ r"""
+ Get the size of a clone
+
+ Parameters:
+ - n: index of the clone
+
+ Returns:
+ - size: size of the selected clone
+
+ """
+
+ if len(args) and (args[0] >= self.number_of_clones):
+ raise ValueError('The population has only '+str(self.number_of_clones)+' clones.')
+ if len(args):
+ args = list(args)
+ args[0] = self._nonempty_clones[args[0]]
+ args = tuple(args)
+
+
+ return _FFPopSim.haploid_highd_get_clone_size(self, *args, **kwargs)
+
+
+ def get_trait(self, *args, **kwargs):
+ r"""
+ Get a trait of an individual
+
+ Parameters:
+ - n: index of the clone whose trait is to be computed
+ - t: trait to be computed
+
+ Returns:
+ - trait: value of that trait for that clone
+
+ """
+
+ if (len(args) > 1) and (args[1] >= self.number_of_traits):
+ raise ValueError("There are only "+str(self.number_of_traits)+" traits.")
+ if len(args) and (args[0] >= self.number_of_clones):
+ raise ValueError('The population has only '+str(self.number_of_clones)+' clones.')
+ if len(args):
+ args = list(args)
+ args[0] = self._nonempty_clones[args[0]]
+ args = tuple(args)
+
+
+ return _FFPopSim.haploid_highd_get_trait(self, *args, **kwargs)
+
+ get_trait_epistasis = _swig_new_instance_method(_FFPopSim.haploid_highd_get_trait_epistasis)
+ get_fitness_statistics = _swig_new_instance_method(_FFPopSim.haploid_highd_get_fitness_statistics)
+ get_trait_statistics = _swig_new_instance_method(_FFPopSim.haploid_highd_get_trait_statistics)
+ get_trait_covariance = _swig_new_instance_method(_FFPopSim.haploid_highd_get_trait_covariance)
+ _update_traits = _swig_new_instance_method(_FFPopSim.haploid_highd__update_traits)
+ _update_fitness = _swig_new_instance_method(_FFPopSim.haploid_highd__update_fitness)
+ tree_sample = property(_FFPopSim.haploid_highd_tree_sample_get, _FFPopSim.haploid_highd_tree_sample_set, doc=r"""tree_sample : int""")
+ __str__ = _swig_new_instance_method(_FFPopSim.haploid_highd___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.haploid_highd___repr__)
+
+ @property
+ def mutation_rate(self):
+ '''mutation rate (per site per generation)'''
+ return self._get_mutation_rate()
+
+ @mutation_rate.setter
+ def mutation_rate(self, m):
+ if self.all_polymorphic and m != 0:
+ raise ValueError("You cannot set all_polymorphic and a nonzero mutation rate.")
+ else:
+ self._set_mutation_rate(m)
+
+ get_clone = _swig_new_instance_method(_FFPopSim.haploid_highd_get_clone)
+ L = property(_FFPopSim.haploid_highd_L_get, doc=r"""Number of loci (read-only)""")
+ number_of_loci = property(_FFPopSim.haploid_highd_number_of_loci_get, doc=r"""Number of loci (read-only)""")
+ N = property(_FFPopSim.haploid_highd_N_get, doc=r"""Population size (read-only)""")
+ population_size = property(_FFPopSim.haploid_highd_population_size_get, doc=r"""Population size (read-only)""")
+ generation = property(_FFPopSim.haploid_highd_generation_get, _FFPopSim.haploid_highd_generation_set, doc=r"""Current generation (read-only)""")
+ number_of_clones = property(_FFPopSim.haploid_highd_number_of_clones_get, doc=r"""Number of non-empty clones (read-only)""")
+ number_of_traits = property(_FFPopSim.haploid_highd_number_of_traits_get, doc=r"""Number of traits (read-only)""")
+ max_fitness = property(_FFPopSim.haploid_highd_max_fitness_get, doc=r"""Maximal fitness in the population (read-only)""")
+ participation_ratio = property(_FFPopSim.haploid_highd_participation_ratio_get, doc=r"""Participation ratio (read-only)""")
+
+ @property
+ def polymorphisms(self):
+ '''Polymorphisms from all_polymorphic (read-only)'''
+ if not self.all_polymorphic:
+ raise ValueError("all_polymorphic is not set.")
+ return self._get_polymorphisms()
+
+
+ @property
+ def fixed_mutations(self):
+ '''Fixed mutations from all_polymorphic (read-only)'''
+ if not self.all_polymorphic:
+ raise ValueError("all_polymorphic is not set.")
+ return self._get_fixed_mutations()
+
+
+ @property
+ def number_of_mutations(self):
+ '''Fixed mutations from all_polymorphic (read-only)'''
+ if not self.all_polymorphic:
+ raise ValueError("all_polymorphic is not set.")
+ return self._get_number_of_mutations()
+
+
+ def _set_trait_weights(self, *args, **kwargs):
+ r"""_set_trait_weights(haploid_highd self, double * IN_ARRAY1)"""
+
+ if len(args) and (len(args[0]) != self.number_of_traits):
+ raise ValueError('The weights must be a sequence of length equal to the number of traits.')
+
+
+ return _FFPopSim.haploid_highd__set_trait_weights(self, *args, **kwargs)
+
+
+ def _get_trait_weights(self, *args, **kwargs):
+ r"""
+ weight of each trait on fitness
+
+ .. note:: Fitness is updated automatically when the weights are changed.
+
+ """
+
+ args = tuple(list(args) + [self.number_of_traits])
+
+
+ return _FFPopSim.haploid_highd__get_trait_weights(self, *args, **kwargs)
+
+
+ trait_weights = property(_get_trait_weights, _set_trait_weights)
+
+
+ def dump(self, filename, format='bz2', include_genealogy=False):
+ '''Dump a population to binary file, for later use.
+
+ Parameters:
+ - filename: the path to the file where to store the information
+ - format: one of 'bz2' or 'plain'. Choose the former if you want compression.
+ - include_genealogy: if True, the multi_locus_genealogy is stored as well (if present).
+
+ .. note:: The population can be reloaded using the function FFPopSim.load_haploid_highd.
+ '''
+
+ try:
+ import cPickle as pickle
+ except:
+ import pickle
+
+ pop_dict = {}
+ pop_dict['genotypes'] = self.get_genotypes()
+ pop_dict['N'] = self.carrying_capacity
+ pop_dict['L'] = self.L
+ pop_dict['mu'] = self.mutation_rate
+ pop_dict['crossover_rate'] = self.crossover_rate
+ pop_dict['outcrossing_rate'] = self.outcrossing_rate
+ pop_dict['circular'] = self.circular
+ pop_dict['generation'] = self.generation
+ pop_dict['clone_sizes'] = self.get_clone_sizes()
+ pop_dict['recombination_model'] = self.recombination_model
+ pop_dict['traits_additive'] = [self.get_trait_additive(i) for i in range(self.number_of_traits)]
+ pop_dict['traits_epistasis'] = [self.get_trait_epistasis(i) for i in range(self.number_of_traits)]
+ pop_dict['all_polymorphic'] = self.all_polymorphic
+ pop_dict['ancestral'] = self.get_ancestral_states()
+ pop_dict['trait_weights'] = self.trait_weights
+
+ # Genealogy
+ if include_genealogy and len(self.genealogy.loci):
+ pop_dict['trees'] = {locus: self.genealogy.get_tree(locus).print_newick() for locus in self.genealogy.loci}
+ pop_dict['_nonempty_clones'] = self._nonempty_clones
+
+ # Save newGenerations as a non-SWIG object
+ def serialize_leaf(leaf):
+ serial = {}
+ for key in ['clone_size', 'crossover', 'fitness', 'number_of_offspring']:
+ serial[key] = getattr(leaf, key)
+ serial['own_key'] = (leaf.own_key.index, leaf.own_key.age)
+ serial['parent_node'] = (leaf.parent_node.index, leaf.parent_node.age)
+ return serial
+
+ newGenerations = []
+ for locus in self.genealogy.loci:
+ newGenerations.append(map(serialize_leaf, self.genealogy._get_newGeneration(locus)))
+ pop_dict['_newGenerations'] = newGenerations
+
+
+ with open(filename, 'wb') as f:
+ dump = pickle.dumps(pop_dict, pickle.HIGHEST_PROTOCOL)
+
+ # Try to compress if the user wishes so
+ try:
+ if format == 'bz2':
+ import bz2
+ dump = dump.encode('bz2')
+ # Fallback on uncompressed
+ except:
+ import warnings
+ warnings.warn('compression module ('+format+') not found. Defaulting to uncompressed file.')
+ format = 'plain'
+
+ # Dump to file
+ f.write(dump)
+
+
+ def copy(self, rng_seed=0):
+ '''Copy population into new instance.
+
+ Parameters:
+ - rng_seed: random number to initialize the new population
+ '''
+ pop = haploid_highd(self.L, rng_seed=rng_seed, number_of_traits=self.number_of_traits)
+
+ # Mutation and recombination
+ pop.recombination_model = self.recombination_model
+ pop.outcrossing_rate = self.outcrossing_rate
+ pop.crossover_rate = self.crossover_rate
+ pop.mutation_rate = self.mutation_rate
+ pop.circular = self.circular
+
+ # Fitness
+ for i in range(self.number_of_traits):
+ pop.set_trait_additive(self.get_trait_additive(i), i)
+ for coeff in self.get_trait_epistasis(i):
+ pop.add_trait_coefficient(coeff[0], coeff[1], i)
+
+ # Population parameters
+ pop.carrying_capacity = self.carrying_capacity
+ pop.set_genotypes(self.get_genotypes(), self.get_clone_sizes())
+
+ # Evolution
+ pop.generation = self.generation
+
+ return pop
+
+
+ def status(self):
+ '''Print a status list of the population parameters'''
+ parameters = (('number of loci', 'L'),
+ ('circular', 'circular'),
+ ('number of traits', 'number_of_traits'),
+ ('population size', 'N'),
+ ('carrying capacity', 'carrying_capacity'),
+ ('generation', 'generation'),
+ ('outcrossing rate', 'outcrossing_rate'),
+ ('crossover rate', 'crossover_rate'),
+ ('recombination model', 'recombination_model'),
+ ('mutation rate', 'mutation_rate'),
+ ('participation ratio', 'participation_ratio'),
+ ('number of non-empty clones', 'number_of_clones'),
+ )
+ lenmax = max(map(lambda x: len(x[0]), parameters))
+
+ for (strin, name) in parameters:
+ par = getattr(self, name)
+ # Recombination model needs a conversion
+ # (a very frequently used one, to be honest)
+ if strin == 'recombination model':
+ if par == 0:
+ par = 'FREE_RECOMBINATION'
+ else:
+ par = 'CROSSOVERS'
+ print(('{:<'+str(lenmax + 2)+'s}').format(strin)+'\t'+str(par))
+
+
+ def set_genotypes(self, *args, **kwargs):
+ r"""
+ Initialize population with fixed counts for specific genotypes.
+
+ Parameters:
+ - genotypes: list of genotypes to set. Genotypes are lists of alleles,
+ e.g. [[0,0,1,0], [0,1,1,1]] for genotypes 0010 and 0111
+ - counts: list of the number at which each of those genotypes it to be present
+
+ .. note:: the population size and, if unset, the carrying capacity will be set
+ as the sum of the counts.
+
+ **Example**: if you want to initialize 200 individuals with genotype 001 and
+ 300 individuals with genotype 110, you can use
+ ``set_genotypes([[0,0,1], [1,1,0]], [200, 300])``
+
+ """
+
+ if len(args) and (len(args) >= 2):
+ genotypes = args[0]
+ counts = args[1]
+ genotypes = _np.array(genotypes, float, copy=False, ndmin=2)
+ counts = _np.asarray(counts, float)
+ if len(genotypes) != len(counts):
+ raise ValueError('Genotypes and counts must have the same length')
+ args = tuple([genotypes.ravel(), counts] + list(args[2:]))
+
+
+ val = _FFPopSim.haploid_highd_set_genotypes(self, *args, **kwargs)
+
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+ return None
+
+
+ return val
+
+
+ def set_genotypes_and_ancestral_state(self, *args, **kwargs):
+ r"""
+ Initialize population with fixed counts for specific genotypes.
+
+ Parameters:
+ - genotypes: list of genotypes to set. Genotypes are lists of alleles,
+ e.g. [[0,0,1,0], [0,1,1,1]] for genotypes 0010 and 0111
+ - counts: list of the number at which each of those genotypes it to be present
+ - ancestral state of the sample, a vector of 0 and 1
+ .. note:: the population size and, if unset, the carrying capacity will be set
+ as the sum of the counts.
+
+ **Example**: if you want to initialize 200 individuals with genotype 001 and
+ 300 individuals with genotype 110, you can use
+ ``set_genotypes([[0,0,1], [1,1,0]], [200, 300])``
+
+ """
+
+ if len(args) and (len(args) >= 3):
+ genotypes = args[0]
+ counts = args[1]
+ anc_state = args[2]
+ genotypes = _np.array(genotypes, float, copy=False, ndmin=2)
+ counts = _np.asarray(counts, float)
+ anc_state = _np.asarray(anc_state, float)
+ if len(genotypes) != len(counts):
+ raise ValueError('Genotypes and counts must have the same length')
+ if (len(anc_state) != self.L):
+ raise ValueError('Ancestral state vector must have length L')
+ args = tuple([genotypes.ravel(), counts] + list(args[2:]))
+
+
+ val = _FFPopSim.haploid_highd_set_genotypes_and_ancestral_state(self, *args, **kwargs)
+
+ self._nonempty_clones = _np.array(self._get_nonempty_clones())
+ return None
+
+
+ return val
+
+ _get_genealogy = _swig_new_instance_method(_FFPopSim.haploid_highd__get_genealogy)
+
+ genealogy = property(_get_genealogy)
+
+
+ def get_allele_frequencies(self, *args, **kwargs):
+ r"""Get all allele frequencies"""
+
+ args = tuple(list(args) + [self.L])
+
+
+ return _FFPopSim.haploid_highd_get_allele_frequencies(self, *args, **kwargs)
+
+
+ def get_derived_allele_frequencies(self, *args, **kwargs):
+ r"""Get all derived allele frequencies"""
+
+ args = tuple(list(args) + [self.L])
+
+
+ return _FFPopSim.haploid_highd_get_derived_allele_frequencies(self, *args, **kwargs)
+
+
+ def get_ancestral_states(self, *args, **kwargs):
+ r"""Get ancestral state of all loci"""
+
+ args = tuple(list(args) + [self.L])
+
+
+ return _FFPopSim.haploid_highd_get_ancestral_states(self, *args, **kwargs)
+
+
+ def get_trait_additive(self, *args, **kwargs):
+ r"""
+ Get an array with the additive coefficients of all loci of a trait.
+
+ Parameters:
+ - t: number of the trait
+
+ Returns:
+ - coefficients: array of additive coefficients for the selected trait
+
+ """
+
+ if (len(args) > 1) and (args[1] >= self.number_of_traits):
+ raise ValueError("There are only "+str(self.number_of_traits)+" traits.")
+ args = tuple([self.L] + list(args))
+
+
+ return _FFPopSim.haploid_highd_get_trait_additive(self, *args, **kwargs)
+
+
+ def set_trait_additive(self, *args, **kwargs):
+ r"""
+ Set the additive part of a trait
+
+ Parameters:
+ - coefficients: array of coefficients for the trait (of length L). All previous additive coefficents are erased
+ - t: number of the trait to set
+
+ """
+
+ if (len(args) > 1) and (args[1] >= self.number_of_traits):
+ raise ValueError("There are only "+str(self.number_of_traits)+" traits.")
+ if len(args) and (len(args[0]) != self.L):
+ raise ValueError("L coefficients expected.")
+
+
+ return _FFPopSim.haploid_highd_set_trait_additive(self, *args, **kwargs)
+
+
+ def set_fitness_additive(self, *args, **kwargs):
+ r"""Shortcut for set_trait_additive when there is only one trait"""
+
+ if len(args) and (len(args[0]) != self.L):
+ raise ValueError("L coefficients expected.")
+
+
+ return _FFPopSim.haploid_highd_set_fitness_additive(self, *args, **kwargs)
+
+
+ def get_fitnesses(self):
+ '''Get the fitness of all clones.'''
+ f = _np.zeros(self.number_of_clones)
+ for i in range(self.number_of_clones):
+ f[i] = self.get_fitness(i)
+ return f
+
+
+ def get_traits(self):
+ '''Get all traits from all clones'''
+ t = _np.zeros((self.number_of_clones, self.number_of_traits))
+ for i in range(self.number_of_clones):
+ for j in range(self.number_of_traits):
+ t[i, j] = self.get_trait(i, j)
+ return t
+
+
+ def get_clone_sizes(self):
+ '''Get the size of all clones.'''
+ s = _np.zeros(self.number_of_clones, int)
+ for i in range(self.number_of_clones):
+ s[i] = self.get_clone_size(i)
+ return s
+
+
+ def get_genotype(self, *args, **kwargs):
+ r"""get_genotype(haploid_highd self, int n) -> boost::dynamic_bitset< >"""
+
+ if len(args) and (args[0] >= self.number_of_clones):
+ raise ValueError('The population has only '+str(self.number_of_clones)+' clones.')
+ if len(args):
+ args = list(args)
+ args[0] = self._nonempty_clones[args[0]]
+ args = tuple(args)
+
+
+ return _FFPopSim.haploid_highd_get_genotype(self, *args, **kwargs)
+
+
+ def get_genotypes(self):
+ '''Get all genotypes of the population.
+
+ Return:
+ - genotypes: boolean 2D array with the genotypes
+
+ .. note:: this function does not return the sizes of each clone.
+ '''
+ genotypes = _np.zeros((self.number_of_clones, self.number_of_loci), bool)
+ for i in range(self.number_of_clones):
+ genotypes[i] = self.get_genotype(i)
+ return genotypes
+
+
+ def distance_Hamming(self, clone_gt1, clone_gt2, chunks=None, every=1):
+ '''Calculate the Hamming distance between two genotypes
+
+ Parameters:
+ - clone_gt1: index of the clone corresponding to the first genotype
+ - clone_gt2: index of the clone corresponding to the second genotype
+ - chunks: list of pairs delimiting the genetic areas to include
+ - every: do the comparison only on certain sites
+
+ **Example**: to calculate the distance between the first two clones
+ limited to third codon positions between locus 90 and 200, use:
+ ``distance_Hamming(0, 1, chunks=[92, 200], every=3)``.
+ '''
+ if _np.isscalar(clone_gt1):
+ genotypes = self.get_genotypes((clone_gt1, clone_gt2))
+ clone_gt1 = genotypes[0]
+ clone_gt2 = genotypes[1]
+
+ if chunks is not None:
+ ind = _np.zeros(clones.shape[1], bool)
+ for chunk in chunks:
+ inde = _np.arange(chunk[1] - chunk[0])
+ inde = inde[(inde % every) == 0] + chunk[0]
+ ind[inde] = True
+ clone_gt1 = clone_gt1[ind]
+ clone_gt2 = clone_gt2[ind]
+ return (clone_gt1 != clone_gt2).sum()
+
+
+ def random_genomes(self, n):
+ '''Get a sample of random genomes from the population
+
+ Parameters:
+ - n: number of random genomes to compute
+
+ Returns:
+ - gts: (n x L) bool matrix with the n genotypes
+ '''
+
+ L = self.number_of_loci
+ genotypes = _np.zeros((n, L), bool)
+ for i in range(genotypes.shape[0]):
+ genotypes[i] = self.get_genotype(self.random_clone())
+ return genotypes
+
+
+ def random_clones(self, n):
+ '''Get random clones
+
+ Parameters:
+ - n: number of random clones to return
+
+ Returns:
+ - clones: clone indices
+ '''
+ return _np.array([self.random_clone() for i in range(n)], int)
+
+
+ def get_fitness_histogram(self, n_sample=1000, **kwargs):
+ '''Calculate the fitness histogram of a population sample.
+
+ Parameters:
+ - n_sample: number of individuals to sample
+
+ Returns:
+ - h: numpy.histogram of fitness in the population
+ '''
+
+ fit = [self.get_fitness(self.random_clone()) for i in range(n_sample)]
+ h = _np.histogram(fit, **kwargs)
+ return h
+
+
+ def plot_fitness_histogram(self, axis=None, n_sample=1000, **kwargs):
+ '''Plot a distribution of fitness of a population sample.
+
+ Parameters:
+ - axis: an axis to use. A new figure is created by default
+ - n_sample: number of individuals to sample
+ - kwargs: further optional keyword arguments to matplotlib.pyplot.hist
+
+ Returns:
+ - return value of axis.hist(...)
+ '''
+
+ import matplotlib.pyplot as plt
+ fit = [self.get_fitness(self.random_clone()) for i in range(n_sample)]
+
+ if axis is None:
+ fig = plt.figure()
+ axis = fig.add_subplot(111)
+ axis.set_title('Fitness histogram')
+ axis.set_xlabel('Fitness')
+ return axis.hist(fit, **kwargs)
+
+
+ def get_divergence_histogram(self, bins=10, chunks=None, every=1, n_sample=1000, **kwargs):
+ '''Get the divergence histogram restricted to those chunks of the genome.
+
+ Parameters:
+ - bins: number or array of bins to be used in the histogram (see also numpy.histogram)
+ - chunks: restrict analysis to some chunk in the genome. It must be an n x 2 matrix with
+ the initial and (final+1) positions of the chunks
+ - every: restrict analysis to every X positions. For instance, if every third site is neutral,
+ this argument can be used to only look at those neutral sites
+ - n_sample: number of individuals to sample
+ - kwargs: further optional keyword arguments to numpy.histogram
+
+ Returns:
+ - h: numpy.histogram of divergence in the population
+ '''
+
+ # Check chunks
+ if chunks is not None:
+ chunks = _np.asarray(chunks)
+ if (_np.rank(chunks) != 2) or (chunks.shape[1] != 2):
+ raise ValueError('Please input an N x 2 matrix with the chunks initial and (final+1) positions')
+
+ # Get the random genotypes
+ genotypes = self.random_genomes(n_sample)
+
+ # Restrict to the chunks
+ if chunks is not None:
+ ind = _np.zeros(genotypes.shape[1], bool)
+ for chunk in chunks:
+ inde = _np.arange(chunk[1] - chunk[0])
+ inde = inde[(inde % every) == 0] + chunk[0]
+ ind[inde] = True
+ genotypes = genotypes[:,ind]
+
+ # Calculate divergence
+ div = genotypes.sum(axis=1)
+
+ # Calculate histogram
+ return _np.histogram(div, bins=bins, **kwargs)
+
+
+ def plot_divergence_histogram(self, axis=None, n_sample=1000, **kwargs):
+ '''Plot the divergence histogram of a population sample.
+
+ Parameters:
+ - axis: an axis to use. A new figure is created by default
+ - n_sample: number of individuals to sample
+ - kwargs: further optional keyword arguments to matplotlib.pyplot.hist
+
+ Returns:
+ - return value of axis.hist(...)
+ '''
+
+ import matplotlib.pyplot as plt
+ genotypes = self.random_genomes(n_sample)
+ div = genotypes.sum(axis=1)
+
+ if axis is None:
+ fig = plt.figure()
+ axis = fig.add_subplot(111)
+ axis.set_title('Divergence histogram')
+ axis.set_xlabel('Divergence')
+
+ if 'bins' not in kwargs:
+ kwargs['bins'] = _np.arange(10) * max(1, (div.max() + 1 - div.min()) / 10) + div.min()
+ return axis.hist(div, **kwargs)
+
+
+ def get_diversity_histogram(self, bins=10, chunks=None, every=1, n_sample=1000, **kwargs):
+ '''Get the diversity histogram restricted to those chunks of the genome.
+
+ Parameters:
+ - bins: number or array of bins to be used in the histogram (see also numpy.histogram)
+ - chunks: restrict analysis to some chunk in the genome. It must be an n x 2 matrix with
+ the initial and (final+1) positions of the chunks
+ - every: restrict analysis to every X positions. For instance, if every third site is neutral,
+ this argument can be used to only look at those neutral sites
+ - n_sample: number of individuals to sample
+ - kwargs: further optional keyword arguments to numpy.histogram
+
+ Returns:
+ - h: numpy.histogram of diversity in the population
+ '''
+
+ # Check chunks
+ if chunks is not None:
+ chunks = _np.asarray(chunks)
+ if (_np.rank(chunks) != 2) or (chunks.shape[1] != 2):
+ raise ValueError('Please input an N x 2 matrix with the chunks initial and (final+1) positions')
+
+ # Get the random genotypes
+ genotypes = self.random_genomes(2 * n_sample)
+
+ # Restrict to the chunks
+ if chunks is not None:
+ ind = _np.zeros(genotypes.shape[1], bool)
+ for chunk in chunks:
+ inde = _np.arange(chunk[1] - chunk[0])
+ inde = inde[(inde % every) == 0] + chunk[0]
+ ind[inde] = True
+ genotypes = genotypes[:,ind]
+
+ # Calculate diversity
+ genotypes1 = genotypes[:genotypes.shape[0] / 2]
+ genotypes2 = genotypes[-genotypes1.shape[0]:]
+ div = (genotypes1 != genotypes2).sum(axis=1)
+
+ # Calculate histogram
+ return _np.histogram(div, bins=bins, **kwargs)
+
+
+ def plot_diversity_histogram(self, axis=None, n_sample=1000, **kwargs):
+ '''Plot the diversity histogram of a population sample.
+
+ Parameters:
+ - axis: an axis to use. A new figure is created by default
+ - n_sample: number of individuals to sample
+ - kwargs: further optional keyword arguments to matplotlib.pyplot.hist
+
+ Returns:
+ - return value of axis.hist(...)
+ '''
+
+ import matplotlib.pyplot as plt
+ genotypes1 = self.random_genomes(n_sample)
+ genotypes2 = self.random_genomes(n_sample)
+ div = (genotypes1 != genotypes2).sum(axis=1)
+
+ if axis is None:
+ fig = plt.figure()
+ axis = fig.add_subplot(111)
+ axis.set_title('Diversity histogram')
+ axis.set_xlabel('Diversity')
+
+ if 'bins' not in kwargs:
+ kwargs['bins'] = _np.arange(10) * max(1, (div.max() + 1 - div.min()) / 10) + div.min()
+ return axis.hist(div, **kwargs)
+
+ _set_tree_in_genealogy = _swig_new_instance_method(_FFPopSim.haploid_highd__set_tree_in_genealogy)
+ _set_newGeneration_in_genealogy = _swig_new_instance_method(_FFPopSim.haploid_highd__set_newGeneration_in_genealogy)
+
+# Register haploid_highd in _FFPopSim:
+_FFPopSim.haploid_highd_swigregister(haploid_highd)
+HIVPOP_VERBOSE = _FFPopSim.HIVPOP_VERBOSE
+
+HIVPOP_BADARG = _FFPopSim.HIVPOP_BADARG
+
+NOTHING = _FFPopSim.NOTHING
+
+HIVGENOME = _FFPopSim.HIVGENOME
+
+GAG_START = _FFPopSim.GAG_START
+
+GAG_END = _FFPopSim.GAG_END
+
+POL_START = _FFPopSim.POL_START
+
+POL_END = _FFPopSim.POL_END
+
+ENV_START = _FFPopSim.ENV_START
+
+ENV_END = _FFPopSim.ENV_END
+
+NEF_START = _FFPopSim.NEF_START
+
+NEF_END = _FFPopSim.NEF_END
+
+VIF_START = _FFPopSim.VIF_START
+
+VIF_END = _FFPopSim.VIF_END
+
+VPR_START = _FFPopSim.VPR_START
+
+VPR_END = _FFPopSim.VPR_END
+
+VPU_START = _FFPopSim.VPU_START
+
+VPU_END = _FFPopSim.VPU_END
+
+REV1_START = _FFPopSim.REV1_START
+
+REV1_END = _FFPopSim.REV1_END
+
+REV2_START = _FFPopSim.REV2_START
+
+REV2_END = _FFPopSim.REV2_END
+
+TAT1_START = _FFPopSim.TAT1_START
+
+TAT1_END = _FFPopSim.TAT1_END
+
+TAT2_START = _FFPopSim.TAT2_START
+
+TAT2_END = _FFPopSim.TAT2_END
+
+class hivgene(object):
+ r"""Structure for an HIV gene."""
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+ start = property(_FFPopSim.hivgene_start_get, _FFPopSim.hivgene_start_set, doc=r"""Initial position of the gene""")
+ end = property(_FFPopSim.hivgene_end_get, _FFPopSim.hivgene_end_set, doc=r"""Final position of the gene""")
+ second_start = property(_FFPopSim.hivgene_second_start_get, _FFPopSim.hivgene_second_start_set, doc=r"""second_start : unsigned int""")
+ second_end = property(_FFPopSim.hivgene_second_end_get, _FFPopSim.hivgene_second_end_set, doc=r"""second_end : unsigned int""")
+
+ def __init__(self, *args, **kwargs):
+ r"""Structure for an HIV gene."""
+ _FFPopSim.hivgene_swiginit(self, _FFPopSim.new_hivgene(*args, **kwargs))
+ __str__ = _swig_new_instance_method(_FFPopSim.hivgene___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.hivgene___repr__)
+ __swig_destroy__ = _FFPopSim.delete_hivgene
+
+# Register hivgene in _FFPopSim:
+_FFPopSim.hivgene_swigregister(hivgene)
+class hivpopulation(haploid_highd):
+ r"""
+ Class for HIV population genetics (genome size = 10000).
+
+ This class is the main object for simulating the evolution of HIV.
+ The class offers a number of functions, but an example will explain the basic
+ idea::
+
+ #####################################
+ # EXAMPLE SCRIPT #
+ #####################################
+ import numpy as np
+ import matplotlib.pyplot as plt
+ import FFPopSim as h
+
+ c = h.hivpopulation(2000) # Create a population of 2000 individuals
+ c.evolve(100) # Evolve (neutrally) for 100 generations
+ c.plot_divergence_histogram()
+ plt.show()
+ #####################################
+
+ **This class is a subclass of haploid_high and offers most of its methods.**
+ In addition to the haploid_highd class, this class offers functions for reading
+ fitness and drug resistance landscapes from a text file, and to save genomes as
+ plain text or in compressed NumPy format.
+
+ Moreover, there are two phenotypic traits, replication and resistance. Their
+ relative importance for viral fitness is set by the ``treatment`` attribute::
+
+ f[trait] = trait[0] + treatment * trait[1]
+
+ By default, ``treatment`` is set to zero, to simulate non-treated patients.
+
+ The gene structure of HIV is modelled roughly, including only start/end positions
+ for the exons, using HXB2 as a reference. Different genes do not get automatically
+ different fitness landscapes.
+
+ """
+
+ thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+
+ def __init__(self, *args, **kwargs):
+ r"""
+ Construct a HIV population with certain parameters.
+
+ Parameters:
+
+ - N number of viral particles
+ - rng_seed seed for the random number generator. If this is 0, time(NULL)+getpid() is used.
+ - mutation_rate mutation rate in events / generation / site
+ - coinfection_rate probability of coinfection of the same cell by two viral particles in events / generation
+ - crossover_rate probability of template switching during coinfection in events / site
+
+ .. note:: the genome length is 10000 (see HIVGENOME).
+
+ """
+ _FFPopSim.hivpopulation_swiginit(self, _FFPopSim.new_hivpopulation(*args, **kwargs))
+ __swig_destroy__ = _FFPopSim.delete_hivpopulation
+ gag = property(_FFPopSim.hivpopulation_gag_get, _FFPopSim.hivpopulation_gag_set, doc=r"""gag : hivgene""")
+ pol = property(_FFPopSim.hivpopulation_pol_get, _FFPopSim.hivpopulation_pol_set, doc=r"""pol : hivgene""")
+ env = property(_FFPopSim.hivpopulation_env_get, _FFPopSim.hivpopulation_env_set, doc=r"""env : hivgene""")
+ nef = property(_FFPopSim.hivpopulation_nef_get, _FFPopSim.hivpopulation_nef_set, doc=r"""nef : hivgene""")
+ vif = property(_FFPopSim.hivpopulation_vif_get, _FFPopSim.hivpopulation_vif_set, doc=r"""vif : hivgene""")
+ vpu = property(_FFPopSim.hivpopulation_vpu_get, _FFPopSim.hivpopulation_vpu_set, doc=r"""vpu : hivgene""")
+ vpr = property(_FFPopSim.hivpopulation_vpr_get, _FFPopSim.hivpopulation_vpr_set, doc=r"""vpr : hivgene""")
+ tat = property(_FFPopSim.hivpopulation_tat_get, _FFPopSim.hivpopulation_tat_set, doc=r"""tat : hivgene""")
+ rev = property(_FFPopSim.hivpopulation_rev_get, _FFPopSim.hivpopulation_rev_set, doc=r"""rev : hivgene""")
+ read_replication_coefficients = _swig_new_instance_method(_FFPopSim.hivpopulation_read_replication_coefficients)
+ read_resistance_coefficients = _swig_new_instance_method(_FFPopSim.hivpopulation_read_resistance_coefficients)
+ write_genotypes = _swig_new_instance_method(_FFPopSim.hivpopulation_write_genotypes)
+ __str__ = _swig_new_instance_method(_FFPopSim.hivpopulation___str__)
+ __repr__ = _swig_new_instance_method(_FFPopSim.hivpopulation___repr__)
+
+ def copy(self, rng_seed=0):
+ '''Copy population into new instance.
+
+ Parameters:
+ - rng_seed: random number to initialize the new population
+ '''
+ pop = hivpopulation(self.N,
+ rng_seed=rng_seed,
+ mutation_rate=self.mutation_rate,
+ coinfection_rate=self.outcrossing_rate,
+ crossover_rate=self.crossover_rate)
+
+ # Fitness
+ for i in range(self.number_of_traits):
+ pop.set_trait_additive(self.get_trait_additive(i), i)
+ for coeff in self.get_trait_epistasis(i):
+ pop.add_trait_coefficient(coeff[0], coeff[1], i)
+
+ # Population parameters
+ pop.carrying_capacity = self.carrying_capacity
+ pop.set_genotypes(self.get_genotypes(), self.get_clone_sizes())
+
+ # Evolution
+ pop._set_generation(self.generation)
+
+ return pop
+
+ treatment = property(_FFPopSim.hivpopulation_treatment_get, _FFPopSim.hivpopulation_treatment_set, doc=r"""
+ Treatment weight (between 0 and 1)
+
+ .. note:: this variable controls how important is either of the two phenotypic
+ traits, replication and resistance. Their contribution to fitness is
+ always linear (in this implementation).
+
+ """)
+
+ def write_genotypes_compressed(self, filename, sample_size, gt_label='', start=0, length=0):
+ '''Store random genotypes into a compressed file.
+
+ Parameters:
+ - filename: string with the name of the file to store the genotype into
+ - sample_size: how many random genotypes to store
+ - gt_label: common fasta label for the genotypes (e.g. "HIV-sim")
+ - start: if only a portion of the genome is to be stored, start from this position
+ - length: store a chunk from ``start`` to this length
+
+ The genotypes can be read using numpy.load.
+ '''
+
+ import numpy as np
+ L = self.number_of_loci
+ if length <= 0:
+ length = L - start
+ d = {}
+ for i in range(sample_size):
+ rcl = self.random_clone()
+ d['>'+str(i)+'_GT-'+gt_label+'_'+str(rcl)] = self.get_genotype(rcl)[start:start+length]
+ np.savez_compressed(filename, **d)
+
+
+ def set_trait_landscape(self,
+ traitnumber=0,
+ lethal_fraction=0.05,
+ deleterious_fraction=0.8,
+ adaptive_fraction=0.01,
+ effect_size_lethal=0.8,
+ effect_size_deleterious=0.1,
+ effect_size_adaptive=0.01,
+ env_fraction=0.1,
+ effect_size_env=0.01,
+ number_epitopes=0,
+ epitope_strength=0.05,
+ number_valleys=0,
+ valley_strength=0.1,
+ ):
+ '''Set HIV trait landscape according to some general parameters.
+
+ Parameters:
+ - lethal_fraction: fraction of lethal sites
+ - deleterious_fraction: fraction of deleterious sites
+ - adaptive_fraction: fraction of beneficial sites
+ - effect_size_lethal: effect of lethal changes
+ - effect_size_deleterious: average effect of deleterious changes
+ - effect_size_adaptive: average effect of beneficial changes
+
+ - env_fraction: fraction of beneficial sites in env
+ - effect_size_env: average effect of beneficial changes in env
+ - number_epitopes: number of (epistatic) epitopes
+ - epitope_strength: average height of an epitope escape mutation
+ - number_valleys: number of (epistatic) valleys
+ - valley_strength: average depth of a valley
+
+ .. note:: the effects of deleterious and beneficial sites are exponentially
+ distributed, i.e. most of them will still be almost neutral.
+
+ .. note:: fractions refer to first and second positions only. For instance,
+ by default, 80% of first and second positions outside env are
+ deleterious.
+
+ .. note:: the third positions are always neutral (synonymous).
+ '''
+
+ import numpy as np
+
+ # Clear trait
+ self.clear_trait(traitnumber)
+
+ # Handy
+ L = self.L
+ aL = np.arange(L)
+
+ # Decide what mutation is of what kind
+ # Note: the rest, between
+ #
+ # lethal_fraction + deleterious_fraction and (1 - adaptive_fraction),
+ #
+ # is neutral, i.e. EXACTLY 0. Fair assumption.
+ onetwo_vector = (aL % 3) < 2
+ random_numbers = np.random.random(L)
+ adaptive_mutations = (random_numbers > (1 - adaptive_fraction)) & onetwo_vector
+ lethal_mutations = (random_numbers < lethal_fraction) & onetwo_vector
+ deleterious_mutations = ((random_numbers > lethal_fraction) & \
+ (random_numbers < (lethal_fraction + deleterious_fraction)) & \
+ (random_numbers < (1 - adaptive_fraction)) & \
+ onetwo_vector)
+
+ # Decide how strong mutations are
+ single_locus_effects=np.zeros(L)
+ single_locus_effects[np.where(deleterious_mutations)] = -np.random.exponential(effect_size_deleterious, deleterious_mutations.sum())
+ single_locus_effects[np.where(adaptive_mutations)] = np.random.exponential(effect_size_adaptive, adaptive_mutations.sum())
+ single_locus_effects[np.where(lethal_mutations)] = -effect_size_lethal
+
+ # Mutations in env are treated separately
+ env_position = (aL >= self.env.start) & (aL < self.env.end)
+ env_mutations = (random_numbers > (1 - env_fraction)) & onetwo_vector & env_position
+ single_locus_effects[np.where(env_mutations)] = np.random.exponential(effect_size_env, env_mutations.sum())
+
+ # Call the C++ routines
+ self.set_trait_additive(single_locus_effects, traitnumber)
+
+ # Epistasis
+ multi_locus_coefficients=[]
+ def add_epitope(strength=0.2):
+ '''Note: we are in the +-1 basis.'''
+ loci = random.sample(range(9),2)
+ loci.sort()
+ depression = - 0.05
+ f1 = depression*0.25
+ f2 = depression*0.25
+ f12 = depression*0.25 - strength*0.5
+ return loci, f1,f2,f12
+
+ def add_valley(depth=0.1, height=0.01):
+ '''Note: we are in the +-1 basis.'''
+ f1 = height*0.25
+ f2 = height*0.25
+ f12 = height*0.25 + depth*0.5
+ return (f1,f2,f12)
+
+ # Set fitness valleys
+ for vi in range(number_valleys):
+ pos = np.random.random_integers(L/3-100)
+ d = int(np.random.exponential(10) + 1)
+ valley_str = np.random.exponential(valley_strength)
+ if number_valleys:
+ print('valley:', pos*3, valley_str)
+ (f1,f2,f12)=add_valley(valley_str)
+ single_locus_effects[pos*3+1]+=f1
+ single_locus_effects[(pos+d)*3+1]+=f2
+ multi_locus_coefficients.append([[pos*3+1, (pos+d)*3+1], f12])
+
+ # Set epitopes (bumps, i.e. f_DM < d_WT << f_SM)
+ for ei in range(number_epitopes):
+ pos = np.random.random_integers(L/3-10)
+ epi_strength = np.random.exponential(epitope_strength)
+ if number_epitopes:
+ print('epitope', pos*3, epi_strength)
+ epi, f1,f2,f12=add_epitope(epi_strength)
+ single_locus_effects[(pos+epi[0])*3+1]+=f1
+ single_locus_effects[(pos+epi[1])*3+1]+=f2
+ multi_locus_coefficients.append([[(pos+epi[0])*3+1, (pos+epi[1])*3+1], f12])
+
+ for mlc in multi_locus_coefficients:
+ self.add_trait_coefficient(mlc[1], np.asarray(mlc[0], int), traitnumber)
+ self._update_traits()
+ self._update_fitness()
+
+
+ def get_replication_additive(self):
+ '''The additive part of the replication lansdscape.
+
+ Returns:
+ - coefficients: array of additive replication coefficients
+
+ .. warning:: the -/+ basis is used throughout the library.
+ If you are used to the 0/1 basis, keep in mind that
+ the interaction series-expansion is different.
+ '''
+ return self.get_trait_additive(0)
+
+
+ def set_replication_additive(self, coefficients):
+ '''Set the additive replication coefficients
+
+ Parameters:
+ - coefficients: array of additive replication coefficients
+
+ .. warning:: the -/+ basis is used throughout the library.
+ If you are used to the 0/1 basis, keep in mind that
+ the interaction series-expansion is different.
+ '''
+
+ self.set_trait_additive(coefficients, 0)
+
+
+ def get_resistance_additive(self):
+ '''The additive part of the resistance lansdscape.
+
+ Returns:
+ - coefficients: array of additive drug resistance coefficients
+
+ .. warning:: the -/+ basis is used throughout the library.
+ If you are used to the 0/1 basis, keep in mind that
+ the interaction series-expansion is different.
+ '''
+ return self.get_trait_additive(1)
+
+
+ def set_resistance_additive(self, coefficients):
+ '''Set the additive drug resistance coefficients
+
+ Parameters:
+ - coefficients: array of additive drug resistance coefficients
+
+ .. warning:: the -/+ basis is used throughout the library.
+ If you are used to the 0/1 basis, keep in mind that
+ the interaction series-expansion is different.
+ '''
+
+ self.set_trait_additive(coefficients, 1)
+
+
+
+
+ def set_replication_landscape(self,
+ lethal_fraction=0.05,
+ deleterious_fraction=0.8,
+ adaptive_fraction=0.01,
+ effect_size_lethal=0.8,
+ effect_size_deleterious=0.1,
+ effect_size_adaptive=0.01,
+ env_fraction=0.1,
+ effect_size_env=0.01,
+ number_epitopes=0,
+ epitope_strength=0.05,
+ number_valleys=0,
+ valley_strength=0.1,
+ ):
+ '''Set the phenotypic landscape for the replication capacity of HIV.
+
+ Parameters:
+ - lethal_fraction: fraction of lethal sites
+ - deleterious_fraction: fraction of deleterious sites
+ - adaptive_fraction: fraction of beneficial sites
+ - effect_size_lethal: effect of lethal changes
+ - effect_size_deleterious: average effect of deleterious changes
+ - effect_size_adaptive: average effect of beneficial changes
+
+ - env_fraction: fraction of beneficial sites in env
+ - effect_size_env: average effect of beneficial changes in env
+ - number_epitopes: number of (epistatic) epitopes
+ - epitope_strength: average height of an epitope escape mutation
+ - number_valleys: number of (epistatic) valleys
+ - valley_strength: average depth of a valley
+
+ .. note:: the effects of deleterious and beneficial sites are exponentially
+ distributed, i.e. most of them will still be almost neutral.
+
+ .. note:: fractions refer to first and second positions only. For instance,
+ by default, 80% of first and second positions outside env are
+ deleterious.
+
+ .. note:: the third positions are always neutral (synonymous).
+ '''
+
+ self.set_trait_landscape(traitnumber=0,
+ lethal_fraction=lethal_fraction,
+ deleterious_fraction=deleterious_fraction,
+ adaptive_fraction=adaptive_fraction,
+ effect_size_lethal=effect_size_lethal,
+ effect_size_deleterious=effect_size_deleterious,
+ effect_size_adaptive=effect_size_adaptive,
+ env_fraction=env_fraction,
+ effect_size_env=effect_size_env,
+ number_epitopes=number_epitopes,
+ epitope_strength=epitope_strength,
+ number_valleys=number_valleys,
+ valley_strength=valley_strength)
+
+
+ def set_resistance_landscape(self,
+ lethal_fraction=0.05,
+ deleterious_fraction=0.8,
+ adaptive_fraction=0.01,
+ effect_size_lethal=0.8,
+ effect_size_deleterious=0.1,
+ effect_size_adaptive=0.01,
+ env_fraction=0.1,
+ effect_size_env=0.01,
+ number_epitopes=0,
+ epitope_strength=0.05,
+ number_valleys=0,
+ valley_strength=0.1,
+ ):
+ '''Set the phenotypic landscape for the drug resistance of HIV.
+
+ Parameters:
+ - lethal_fraction: fraction of lethal sites
+ - deleterious_fraction: fraction of deleterious sites
+ - adaptive_fraction: fraction of beneficial sites
+ - effect_size_lethal: effect of lethal changes
+ - effect_size_deleterious: average effect of deleterious changes
+ - effect_size_adaptive: average effect of beneficial changes
+
+ - env_fraction: fraction of beneficial sites in env
+ - effect_size_env: average effect of beneficial changes in env
+ - number_epitopes: number of (epistatic) epitopes
+ - epitope_strength: average height of an epitope escape mutation
+ - number_valleys: number of (epistatic) valleys
+ - valley_strength: average depth of a valley
+
+ .. note:: the effects of deleterious and beneficial sites are exponentially
+ distributed, i.e. most of them will still be almost neutral.
+
+ .. note:: fractions refer to first and second positions only. For instance,
+ by default, 80% of first and second positions outside env are
+ deleterious.
+
+ .. note:: the third positions are always neutral (synonymous).
+ '''
+
+ self.set_trait_landscape(traitnumber=1,
+ lethal_fraction=lethal_fraction,
+ deleterious_fraction=deleterious_fraction,
+ adaptive_fraction=adaptive_fraction,
+ effect_size_lethal=effect_size_lethal,
+ effect_size_deleterious=effect_size_deleterious,
+ effect_size_adaptive=effect_size_adaptive,
+ env_fraction=env_fraction,
+ effect_size_env=effect_size_env,
+ number_epitopes=number_epitopes,
+ epitope_strength=epitope_strength,
+ number_valleys=number_valleys,
+ valley_strength=valley_strength)
+
+
+
+
+# Register hivpopulation in _FFPopSim:
+_FFPopSim.hivpopulation_swigregister(hivpopulation)
+
diff --git a/src/python/FFPopSim_wrap.cpp b/src/python/FFPopSim_wrap.cpp
new file mode 100644
index 0000000..8179b43
--- /dev/null
+++ b/src/python/FFPopSim_wrap.cpp
@@ -0,0 +1,39685 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (https://www.swig.org).
+ * Version 4.3.1
+ *
+ * Do not make changes to this file unless you know what you are doing - modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+
+#define SWIG_VERSION 0x040301
+#define SWIGPYTHON
+#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
+#define SWIG_CASTRANK_MODE
+#define SWIG_PYTHON_CAST_MODE
+#define SWIGPYTHON_FASTPROXY
+
+#define SWIG_name "_FFPopSim"
+/* -----------------------------------------------------------------------------
+ * This section contains generic SWIG labels for method/variable
+ * declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+# define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+# define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+# define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+# define SWIGINLINE inline
+# else
+# define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+# define SWIGUNUSED __attribute__ ((__unused__))
+# else
+# define SWIGUNUSED
+# endif
+# elif defined(__ICC)
+# define SWIGUNUSED __attribute__ ((__unused__))
+# else
+# define SWIGUNUSED
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+# pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+# define SWIGUNUSEDPARM(p)
+# else
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if defined(__GNUC__)
+# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# ifndef GCC_HASCLASSVISIBILITY
+# define GCC_HASCLASSVISIBILITY
+# endif
+# endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+# if defined(STATIC_LINKED)
+# define SWIGEXPORT
+# else
+# define SWIGEXPORT __declspec(dllexport)
+# endif
+# else
+# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+# define SWIGEXPORT __attribute__ ((visibility("default")))
+# else
+# define SWIGEXPORT
+# endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+# define SWIGSTDCALL __stdcall
+# else
+# define SWIGSTDCALL
+# endif
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used. So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
+
+#if defined(__cplusplus) && __cplusplus >=201103L
+# define SWIG_NULLPTR nullptr
+#else
+# define SWIG_NULLPTR NULL
+#endif
+
+/* -----------------------------------------------------------------------------
+ * swigcompat.swg
+ *
+ * Macros to provide support compatibility with older C and C++ standards.
+ *
+ * Note that SWIG expects __cplusplus to be defined to the appropriate C++ standard.
+ * MSVC users are urged to check and examine the /Zc:__cplusplus compiler option.
+ * See https://learn.microsoft.com/en-us/cpp/build/reference/zc-cplusplus.
+ * ----------------------------------------------------------------------------- */
+
+/* C99 and C++11 should provide snprintf, but define SWIG_NO_SNPRINTF
+ * if you're missing it.
+ */
+#if ((defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || \
+ (defined __cplusplus && __cplusplus >= 201103L) || \
+ defined SWIG_HAVE_SNPRINTF) && \
+ !defined SWIG_NO_SNPRINTF
+# define SWIG_snprintf(O,S,F,A) snprintf(O,S,F,A)
+# define SWIG_snprintf2(O,S,F,A,B) snprintf(O,S,F,A,B)
+#else
+/* Fallback versions ignore the buffer size, but most of our uses either have a
+ * fixed maximum possible size or dynamically allocate a buffer that's large
+ * enough.
+ */
+# define SWIG_snprintf(O,S,F,A) sprintf(O,F,A)
+# define SWIG_snprintf2(O,S,F,A,B) sprintf(O,F,A,B)
+#endif
+
+
+#if defined(__GNUC__) && defined(_WIN32) && !defined(SWIG_PYTHON_NO_HYPOT_WORKAROUND)
+/* Workaround for '::hypot' has not been declared', see https://bugs.python.org/issue11566 */
+# include
+#endif
+
+#if !defined(PY_SSIZE_T_CLEAN) && !defined(SWIG_NO_PY_SSIZE_T_CLEAN)
+#define PY_SSIZE_T_CLEAN
+#endif
+
+#if __GNUC__ >= 7
+#pragma GCC diagnostic push
+#if defined(__cplusplus) && __cplusplus >=201703L
+#pragma GCC diagnostic ignored "-Wregister" /* For python-2.7 headers that use register */
+#endif
+#endif
+
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+
+#if defined(_MSC_VER) && _MSC_VER >= 1929
+/* Workaround compilation errors when redefining _DEBUG in MSVC 2019 version 16.10 and later
+ * See https://github.com/swig/swig/issues/2090 */
+# include
+#endif
+
+# undef _DEBUG
+# include
+# define _DEBUG 1
+#else
+# include
+#endif
+
+#if defined(SWIGPYTHON_BUILTIN) && defined(SWIG_HEAPTYPES)
+/* SWIG_HEAPTYPES is not ready for use with SWIGPYTHON_BUILTIN, but if turned on manually requires the following */
+#if PY_VERSION_HEX >= 0x03030000 && PY_VERSION_HEX < 0x030c0000
+#include
+#define Py_READONLY READONLY
+#define Py_T_PYSSIZET T_PYSSIZET
+#endif
+#endif
+
+#if __GNUC__ >= 7
+#pragma GCC diagnostic pop
+#endif
+
+#include
+#include
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+ or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+ You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+ creating a static or dynamic library from the SWIG runtime code.
+ In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+
+ But only do this if strictly necessary, ie, if you have problems
+ with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/* Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN 0x1
+#define SWIG_CAST_NEW_MEMORY 0x2
+#define SWIG_POINTER_NO_NULL 0x4
+#define SWIG_POINTER_CLEAR 0x8
+#define SWIG_POINTER_RELEASE (SWIG_POINTER_CLEAR | SWIG_POINTER_DISOWN)
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN 0x1
+
+
+/*
+ Flags/methods for returning states.
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
+ that tells if the conversion was successful or not. And if not,
+ an error code can be returned (see swigerrors.swg for the codes).
+
+ Use the following macros/flags to set or process the returning
+ states.
+
+ In old versions of SWIG, code such as the following was usually written:
+
+ if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+ // success code
+ } else {
+ //fail code
+ }
+
+ Now you can be more explicit:
+
+ int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+ if (SWIG_IsOK(res)) {
+ // success code
+ } else {
+ // fail code
+ }
+
+ which is the same really, but now you can also do
+
+ Type *ptr;
+ int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+ if (SWIG_IsOK(res)) {
+ // success code
+ if (SWIG_IsNewObj(res) {
+ ...
+ delete *ptr;
+ } else {
+ ...
+ }
+ } else {
+ // fail code
+ }
+
+ I.e., now SWIG_ConvertPtr can return new objects and you can
+ identify the case and take care of the deallocation. Of course that
+ also requires SWIG_ConvertPtr to return new result values, such as
+
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if () {
+ if () {
+ *ptr = ;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = ;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
+ }
+
+ Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+ more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+ SWIG errors code.
+
+ Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+ allows returning the 'cast rank', for example, if you have this
+
+ int food(double)
+ int fooi(int);
+
+ and you call
+
+ food(1) // cast rank '1' (1 -> 1.0)
+ fooi(1) // cast rank '0'
+
+ just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK (0)
+/* Runtime errors are < 0 */
+#define SWIG_ERROR (-1)
+/* Errors in range -1 to -99 are in swigerrors.swg (errors for all languages including those not using the runtime) */
+/* Errors in range -100 to -199 are language specific errors defined in *errors.swg */
+/* Errors < -200 are generic runtime specific errors */
+#define SWIG_ERROR_RELEASE_NOT_OWNED (-200)
+
+#define SWIG_IsOK(r) (r >= 0)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1)
+/* The TmpMask is for in/out typemaps that use temporary objects */
+#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ (SWIG_ERROR)
+#define SWIG_OLDOBJ (SWIG_OK)
+#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del object mask methods */
+#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+# ifndef SWIG_TypeRank
+# define SWIG_TypeRank unsigned long
+# endif
+# ifndef SWIG_MAXCASTRANK /* Default cast allowed */
+# define SWIG_MAXCASTRANK (2)
+# endif
+# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
+# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
+ return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+}
+#else /* no cast-rank mode */
+# define SWIG_AddCast(r) (r)
+# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+ const char *name; /* mangled name of this type */
+ const char *str; /* human readable name of this type */
+ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */
+ struct swig_cast_info *cast; /* linked list of types that can cast into this type */
+ void *clientdata; /* language specific type data */
+ int owndata; /* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+ swig_type_info *type; /* pointer to type that is equivalent to this type */
+ swig_converter_func converter; /* function to cast the void pointers */
+ struct swig_cast_info *next; /* pointer to next cast in linked list */
+ struct swig_cast_info *prev; /* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+ swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */
+ size_t size; /* Number of types in this module */
+ struct swig_module_info *next; /* Pointer to next element in circularly linked list */
+ swig_type_info **type_initial; /* Array of initially generated type structures */
+ swig_cast_info **cast_initial; /* Array of initially generated casting structures */
+ void *clientdata; /* Language specific module data */
+} swig_module_info;
+
+/*
+ Compare two type names skipping the space characters, therefore
+ "char*" == "char *" and "Class" == "Class", etc.
+
+ Return 0 when the two name types are equivalent, as in
+ strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+ const char *f2, const char *l2) {
+ for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+ while ((*f1 == ' ') && (f1 != l1)) ++f1;
+ while ((*f2 == ' ') && (f2 != l2)) ++f2;
+ if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+ }
+ return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+ Check type equivalence in a name list like ||...
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
+ const char* te = tb + strlen(tb);
+ const char* ne = nb;
+ while (equiv != 0 && *ne) {
+ for (nb = ne; *ne; ++ne) {
+ if (*ne == '|') break;
+ }
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
+ if (*ne) ++ne;
+ }
+ return equiv;
+}
+
+/*
+ Check type equivalence in a name list like ||...
+ Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
+}
+
+/*
+ Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+ if (ty) {
+ swig_cast_info *iter = ty->cast;
+ while (iter) {
+ if (strcmp(iter->type->name, c) == 0) {
+ if (iter == ty->cast)
+ return iter;
+ /* Move iter to the top of the linked list */
+ iter->prev->next = iter->next;
+ if (iter->next)
+ iter->next->prev = iter->prev;
+ iter->next = ty->cast;
+ iter->prev = 0;
+ if (ty->cast) ty->cast->prev = iter;
+ ty->cast = iter;
+ return iter;
+ }
+ iter = iter->next;
+ }
+ }
+ return 0;
+}
+
+/*
+ Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(const swig_type_info *from, swig_type_info *ty) {
+ if (ty) {
+ swig_cast_info *iter = ty->cast;
+ while (iter) {
+ if (iter->type == from) {
+ if (iter == ty->cast)
+ return iter;
+ /* Move iter to the top of the linked list */
+ iter->prev->next = iter->next;
+ if (iter->next)
+ iter->next->prev = iter->prev;
+ iter->next = ty->cast;
+ iter->prev = 0;
+ if (ty->cast) ty->cast->prev = iter;
+ ty->cast = iter;
+ return iter;
+ }
+ iter = iter->next;
+ }
+ }
+ return 0;
+}
+
+/*
+ Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+ return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/*
+ Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+ swig_type_info *lastty = ty;
+ if (!ty || !ty->dcast) return ty;
+ while (ty && (ty->dcast)) {
+ ty = (*ty->dcast)(ptr);
+ if (ty) lastty = ty;
+ }
+ return lastty;
+}
+
+/*
+ Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+ return ty->name;
+}
+
+/*
+ Return the pretty name associated with this type,
+ that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+ /* The "str" field contains the equivalent pretty names of the
+ type, separated by vertical-bar characters. Choose the last
+ name. It should be the most specific; a fully resolved name
+ but not necessarily with default template parameters expanded. */
+ if (!type) return NULL;
+ if (type->str != NULL) {
+ const char *last_name = type->str;
+ const char *s;
+ for (s = type->str; *s; s++)
+ if (*s == '|') last_name = s+1;
+ return last_name;
+ }
+ else
+ return type->name;
+}
+
+/*
+ Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+ swig_cast_info *cast = ti->cast;
+ /* if (ti->clientdata == clientdata) return; */
+ ti->clientdata = clientdata;
+
+ while (cast) {
+ if (!cast->converter) {
+ swig_type_info *tc = cast->type;
+ if (!tc->clientdata) {
+ SWIG_TypeClientData(tc, clientdata);
+ }
+ }
+ cast = cast->next;
+ }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+ SWIG_TypeClientData(ti, clientdata);
+ ti->owndata = 1;
+}
+
+/*
+ Search for a swig_type_info structure only by mangled name
+ Search is a O(log #types)
+
+ We start searching at module start, and finish searching when start == end.
+ Note: if start == end at the beginning of the function, we go all the way around
+ the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
+ const char *name) {
+ swig_module_info *iter = start;
+ do {
+ if (iter->size) {
+ size_t l = 0;
+ size_t r = iter->size - 1;
+ do {
+ /* since l+r >= 0, we can (>> 1) instead (/ 2) */
+ size_t i = (l + r) >> 1;
+ const char *iname = iter->types[i]->name;
+ if (iname) {
+ int compare = strcmp(name, iname);
+ if (compare == 0) {
+ return iter->types[i];
+ } else if (compare < 0) {
+ if (i) {
+ r = i - 1;
+ } else {
+ break;
+ }
+ } else if (compare > 0) {
+ l = i + 1;
+ }
+ } else {
+ break; /* should never happen */
+ }
+ } while (l <= r);
+ }
+ iter = iter->next;
+ } while (iter != end);
+ return 0;
+}
+
+/*
+ Search for a swig_type_info structure for either a mangled name or a human readable name.
+ It first searches the mangled names of the types, which is a O(log #types)
+ If a type is not found it then searches the human readable names, which is O(#types).
+
+ We start searching at module start, and finish searching when start == end.
+ Note: if start == end at the beginning of the function, we go all the way around
+ the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
+ const char *name) {
+ /* STEP 1: Search the name field using binary search */
+ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+ if (ret) {
+ return ret;
+ } else {
+ /* STEP 2: If the type hasn't been found, do a complete search
+ of the str field (the human readable name) */
+ swig_module_info *iter = start;
+ do {
+ size_t i = 0;
+ for (; i < iter->size; ++i) {
+ if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+ return iter->types[i];
+ }
+ iter = iter->next;
+ } while (iter != end);
+ }
+
+ /* neither found a match */
+ return 0;
+}
+
+/*
+ Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+ static const char hex[17] = "0123456789abcdef";
+ const unsigned char *u = (unsigned char *) ptr;
+ const unsigned char *eu = u + sz;
+ for (; u != eu; ++u) {
+ unsigned char uu = *u;
+ *(c++) = hex[(uu & 0xf0) >> 4];
+ *(c++) = hex[uu & 0xf];
+ }
+ return c;
+}
+
+/*
+ Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+ unsigned char *u = (unsigned char *) ptr;
+ const unsigned char *eu = u + sz;
+ for (; u != eu; ++u) {
+ char d = *(c++);
+ unsigned char uu;
+ if ((d >= '0') && (d <= '9'))
+ uu = (unsigned char)((d - '0') << 4);
+ else if ((d >= 'a') && (d <= 'f'))
+ uu = (unsigned char)((d - ('a'-10)) << 4);
+ else
+ return (char *) 0;
+ d = *(c++);
+ if ((d >= '0') && (d <= '9'))
+ uu |= (unsigned char)(d - '0');
+ else if ((d >= 'a') && (d <= 'f'))
+ uu |= (unsigned char)(d - ('a'-10));
+ else
+ return (char *) 0;
+ *u = uu;
+ }
+ return c;
+}
+
+/*
+ Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+ char *r = buff;
+ if ((2*sizeof(void *) + 2) > bsz) return 0;
+ *(r++) = '_';
+ r = SWIG_PackData(r,&ptr,sizeof(void *));
+ if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+ strcpy(r,name);
+ return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+ if (*c != '_') {
+ if (strcmp(c,"NULL") == 0) {
+ *ptr = (void *) 0;
+ return name;
+ } else {
+ return 0;
+ }
+ }
+ return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+ char *r = buff;
+ size_t lname = (name ? strlen(name) : 0);
+ if ((2*sz + 2 + lname) > bsz) return 0;
+ *(r++) = '_';
+ r = SWIG_PackData(r,ptr,sz);
+ if (lname) {
+ strncpy(r,name,lname+1);
+ } else {
+ *r = 0;
+ }
+ return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+ if (*c != '_') {
+ if (strcmp(c,"NULL") == 0) {
+ memset(ptr,0,sz);
+ return name;
+ } else {
+ return 0;
+ }
+ }
+ return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/* SWIG Errors applicable to all language modules, values are reserved from -1 to -99 */
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
+#define SWIG_SystemError -10
+#define SWIG_AttributeError -11
+#define SWIG_MemoryError -12
+#define SWIG_NullReferenceError -13
+
+
+/* Compatibility macros for Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+
+#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
+#define PyInt_Check(x) PyLong_Check(x)
+#define PyInt_AsLong(x) PyLong_AsLong(x)
+#define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyInt_FromSize_t(x) PyLong_FromSize_t(x)
+#define PyString_Check(name) PyBytes_Check(name)
+#define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args)
+#define PyString_AsString(str) PyBytes_AsString(str)
+#define PyString_Size(str) PyBytes_Size(str)
+#define PyString_InternFromString(key) PyUnicode_InternFromString(key)
+#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE
+#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x)
+
+#endif
+
+/* SWIG APIs for compatibility of both Python 2 & 3 */
+
+#if PY_VERSION_HEX >= 0x03000000
+# define SWIG_Python_str_FromFormat PyUnicode_FromFormat
+#else
+# define SWIG_Python_str_FromFormat PyString_FromFormat
+#endif
+
+
+/* Wrapper around PyUnicode_AsUTF8AndSize - call Py_XDECREF on the returned pbytes when finished with the returned string */
+SWIGINTERN const char *
+SWIG_PyUnicode_AsUTF8AndSize(PyObject *str, Py_ssize_t *psize, PyObject **pbytes)
+{
+#if PY_VERSION_HEX >= 0x03030000
+# if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000
+ *pbytes = NULL;
+ return PyUnicode_AsUTF8AndSize(str, psize);
+# else
+ const char *chars;
+ *pbytes = PyUnicode_AsUTF8String(str);
+ chars = *pbytes ? PyBytes_AsString(*pbytes) : NULL;
+ if (chars && psize)
+ *psize = PyBytes_Size(*pbytes);
+ return chars;
+# endif
+#else
+ char *chars = NULL;
+ *pbytes = NULL;
+ PyString_AsStringAndSize(str, &chars, psize);
+ return chars;
+#endif
+}
+
+SWIGINTERN PyObject*
+SWIG_Python_str_FromChar(const char *c)
+{
+#if PY_VERSION_HEX >= 0x03000000
+ return PyUnicode_FromString(c);
+#else
+ return PyString_FromString(c);
+#endif
+}
+
+/* SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user interface files check for it. */
+# define SWIGPY_USE_CAPSULE
+#ifdef SWIGPYTHON_BUILTIN
+# define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule_builtin" SWIG_TYPE_TABLE_NAME
+#else
+# define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule" SWIG_TYPE_TABLE_NAME
+#endif
+# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION "." SWIGPY_CAPSULE_ATTR_NAME)
+
+#if PY_VERSION_HEX < 0x03020000
+#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#define Py_hash_t long
+#endif
+
+#ifdef Py_LIMITED_API
+# define PyTuple_GET_ITEM PyTuple_GetItem
+/* Note that PyTuple_SetItem() has different semantics from PyTuple_SET_ITEM as it decref's the original tuple item, so in general they cannot be used
+ interchangeably. However in SWIG-generated code PyTuple_SET_ITEM is only used with newly initialized tuples without any items and for them this does work. */
+# define PyTuple_SET_ITEM PyTuple_SetItem
+# define PyTuple_GET_SIZE PyTuple_Size
+# define PyCFunction_GET_FLAGS PyCFunction_GetFlags
+# define PyCFunction_GET_FUNCTION PyCFunction_GetFunction
+# define PyCFunction_GET_SELF PyCFunction_GetSelf
+# define PyList_GET_ITEM PyList_GetItem
+# define PyList_SET_ITEM PyList_SetItem
+# define PySliceObject PyObject
+#endif
+
+/* Increment and Decrement wrappers - for portability when using the stable abi and for performance otherwise */
+#ifdef Py_LIMITED_API
+# define SWIG_Py_INCREF Py_IncRef
+# define SWIG_Py_XINCREF Py_IncRef
+# define SWIG_Py_DECREF Py_DecRef
+# define SWIG_Py_XDECREF Py_DecRef
+#else
+# define SWIG_Py_INCREF Py_INCREF
+# define SWIG_Py_XINCREF Py_XINCREF
+# define SWIG_Py_DECREF Py_DECREF
+# define SWIG_Py_XDECREF Py_XDECREF
+#endif
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIME PyObject*
+SWIG_Python_ErrorType(int code) {
+ PyObject* type = 0;
+ switch(code) {
+ case SWIG_MemoryError:
+ type = PyExc_MemoryError;
+ break;
+ case SWIG_IOError:
+ type = PyExc_IOError;
+ break;
+ case SWIG_RuntimeError:
+ type = PyExc_RuntimeError;
+ break;
+ case SWIG_IndexError:
+ type = PyExc_IndexError;
+ break;
+ case SWIG_TypeError:
+ type = PyExc_TypeError;
+ break;
+ case SWIG_DivisionByZero:
+ type = PyExc_ZeroDivisionError;
+ break;
+ case SWIG_OverflowError:
+ type = PyExc_OverflowError;
+ break;
+ case SWIG_SyntaxError:
+ type = PyExc_SyntaxError;
+ break;
+ case SWIG_ValueError:
+ type = PyExc_ValueError;
+ break;
+ case SWIG_SystemError:
+ type = PyExc_SystemError;
+ break;
+ case SWIG_AttributeError:
+ type = PyExc_AttributeError;
+ break;
+ case SWIG_NullReferenceError:
+ type = PyExc_TypeError;
+ break;
+ default:
+ type = PyExc_RuntimeError;
+ }
+ return type;
+}
+
+
+SWIGRUNTIME void
+SWIG_Python_AddErrorMsg(const char* mesg)
+{
+ PyObject *type = 0;
+ PyObject *value = 0;
+ PyObject *traceback = 0;
+
+ if (PyErr_Occurred())
+ PyErr_Fetch(&type, &value, &traceback);
+ if (value) {
+ PyObject *old_str = PyObject_Str(value);
+ PyObject *bytes = NULL;
+ const char *tmp = SWIG_PyUnicode_AsUTF8AndSize(old_str, NULL, &bytes);
+ PyErr_Clear();
+ SWIG_Py_XINCREF(type);
+ if (tmp)
+ PyErr_Format(type, "%s %s", tmp, mesg);
+ else
+ PyErr_Format(type, "%s", mesg);
+ SWIG_Py_XDECREF(bytes);
+ SWIG_Py_DECREF(old_str);
+ SWIG_Py_DECREF(value);
+ } else {
+ PyErr_SetString(PyExc_RuntimeError, mesg);
+ }
+}
+
+SWIGRUNTIME int
+SWIG_Python_TypeErrorOccurred(PyObject *obj)
+{
+ PyObject *error;
+ if (obj)
+ return 0;
+ error = PyErr_Occurred();
+ return error && PyErr_GivenExceptionMatches(error, PyExc_TypeError);
+}
+
+SWIGRUNTIME void
+SWIG_Python_RaiseOrModifyTypeError(const char *message)
+{
+ if (SWIG_Python_TypeErrorOccurred(NULL)) {
+ /* Use existing TypeError to preserve stacktrace and enhance with given message */
+ PyObject *newvalue;
+ PyObject *type = NULL, *value = NULL, *traceback = NULL;
+ PyErr_Fetch(&type, &value, &traceback);
+#if PY_VERSION_HEX >= 0x03000000
+ newvalue = PyUnicode_FromFormat("%S\nAdditional information:\n%s", value, message);
+#else
+ newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message);
+#endif
+ if (newvalue) {
+ SWIG_Py_XDECREF(value);
+ PyErr_Restore(type, newvalue, traceback);
+ } else {
+ PyErr_Restore(type, value, traceback);
+ }
+ } else {
+ /* Raise TypeError using given message */
+ PyErr_SetString(PyExc_TypeError, message);
+ }
+}
+
+#if defined(SWIG_PYTHON_NO_THREADS)
+# if defined(SWIG_PYTHON_THREADS)
+# undef SWIG_PYTHON_THREADS
+# endif
+#endif
+#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
+# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
+# define SWIG_PYTHON_USE_GIL
+# endif
+# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
+# if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+# if PY_VERSION_HEX < 0x03070000
+# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads()
+# else
+# define SWIG_PYTHON_INITIALIZE_THREADS
+# endif
+# endif
+# ifdef __cplusplus /* C++ code */
+ class SWIG_Python_Thread_Block {
+ bool status;
+ PyGILState_STATE state;
+ public:
+ void end() { if (status) { PyGILState_Release(state); status = false;} }
+ SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
+ ~SWIG_Python_Thread_Block() { end(); }
+ };
+ class SWIG_Python_Thread_Allow {
+ bool status;
+ PyThreadState *save;
+ public:
+ void end() { if (status) { status = false; PyEval_RestoreThread(save); }}
+ SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
+ ~SWIG_Python_Thread_Allow() { end(); }
+ };
+# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block
+# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end()
+# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow
+# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end()
+# else /* C code */
+# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
+# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block)
+# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread()
+# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow)
+# endif
+# else /* Old thread way, not implemented, user must provide it */
+# if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+# define SWIG_PYTHON_INITIALIZE_THREADS
+# endif
+# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
+# define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+# endif
+# if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
+# define SWIG_PYTHON_THREAD_END_BLOCK
+# endif
+# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
+# define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+# endif
+# if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
+# define SWIG_PYTHON_THREAD_END_ALLOW
+# endif
+# endif
+#else /* No thread support */
+# define SWIG_PYTHON_INITIALIZE_THREADS
+# define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+# define SWIG_PYTHON_THREAD_END_BLOCK
+# define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+# define SWIG_PYTHON_THREAD_END_ALLOW
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Python API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Constant declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Constant Types */
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY 5
+
+/* Constant information structure */
+typedef struct swig_const_info {
+ int type;
+ const char *name;
+ long lvalue;
+ double dvalue;
+ void *pvalue;
+ swig_type_info **ptype;
+} swig_const_info;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * pyrun.swg
+ *
+ * This file contains the runtime support for Python modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ *
+ * ----------------------------------------------------------------------------- */
+
+#if PY_VERSION_HEX < 0x02070000 /* 2.7.0 */
+# error "This version of SWIG only supports Python >= 2.7"
+#endif
+
+#if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03030000
+# error "This version of SWIG only supports Python 3 >= 3.3"
+#endif
+
+/* Common SWIG API */
+
+/* for raw pointers */
+#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+
+#ifdef SWIGPYTHON_BUILTIN
+#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags)
+#else
+#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+#endif
+
+#define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+
+#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty)
+#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src)
+#define swig_owntype int
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
+#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata)
+#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer)
+#define SWIG_NewClientData(obj) SwigPyClientData_New(obj)
+
+#define SWIG_SetErrorObj SWIG_Python_SetErrorObj
+#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg
+#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code)
+#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg)
+#define SWIG_fail goto fail
+
+
+/* Runtime API implementation */
+
+/* Error manipulation */
+
+SWIGINTERN void
+SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ PyErr_SetObject(errtype, obj);
+ SWIG_Py_DECREF(obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+SWIGINTERN void
+SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ PyErr_SetString(errtype, msg);
+ SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
+
+/* Set a constant value */
+
+#if defined(SWIGPYTHON_BUILTIN)
+
+SWIGINTERN void
+SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) {
+ PyObject *s = PyString_InternFromString(key);
+ PyList_Append(seq, s);
+ SWIG_Py_DECREF(s);
+}
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {
+ PyDict_SetItemString(d, name, obj);
+ SWIG_Py_DECREF(obj);
+ if (public_interface)
+ SwigPyBuiltin_AddPublicSymbol(public_interface, name);
+}
+
+#else
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {
+ PyDict_SetItemString(d, name, obj);
+ SWIG_Py_DECREF(obj);
+}
+
+#endif
+
+/* Append a value to the result obj */
+
+SWIGINTERN PyObject*
+SWIG_Python_AppendOutput(PyObject* result, PyObject* obj, int is_void) {
+ if (!result) {
+ result = obj;
+ } else if (result == Py_None && is_void) {
+ SWIG_Py_DECREF(result);
+ result = obj;
+ } else {
+ if (!PyList_Check(result)) {
+ PyObject *o2 = result;
+ result = PyList_New(1);
+ if (result) {
+ PyList_SET_ITEM(result, 0, o2);
+ } else {
+ SWIG_Py_DECREF(obj);
+ return o2;
+ }
+ }
+ PyList_Append(result,obj);
+ SWIG_Py_DECREF(obj);
+ }
+ return result;
+}
+
+/* Unpack the argument tuple */
+
+SWIGINTERN Py_ssize_t
+SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
+{
+ if (!args) {
+ if (!min && !max) {
+ return 1;
+ } else {
+ PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none",
+ name, (min == max ? "" : "at least "), (int)min);
+ return 0;
+ }
+ }
+ if (!PyTuple_Check(args)) {
+ if (min <= 1 && max >= 1) {
+ Py_ssize_t i;
+ objs[0] = args;
+ for (i = 1; i < max; ++i) {
+ objs[i] = 0;
+ }
+ return 2;
+ }
+ PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
+ return 0;
+ } else {
+ Py_ssize_t l = PyTuple_GET_SIZE(args);
+ if (l < min) {
+ PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d",
+ name, (min == max ? "" : "at least "), (int)min, (int)l);
+ return 0;
+ } else if (l > max) {
+ PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d",
+ name, (min == max ? "" : "at most "), (int)max, (int)l);
+ return 0;
+ } else {
+ Py_ssize_t i;
+ for (i = 0; i < l; ++i) {
+ objs[i] = PyTuple_GET_ITEM(args, i);
+ }
+ for (; l < max; ++l) {
+ objs[l] = 0;
+ }
+ return i + 1;
+ }
+ }
+}
+
+SWIGINTERN int
+SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) {
+ int no_kwargs = 1;
+ if (kwargs) {
+ assert(PyDict_Check(kwargs));
+ if (PyDict_Size(kwargs) > 0) {
+ PyErr_Format(PyExc_TypeError, "%s() does not take keyword arguments", name);
+ no_kwargs = 0;
+ }
+ }
+ return no_kwargs;
+}
+
+/* A functor is a function object with one single object argument */
+#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL);
+
+/*
+ Helper for static pointer initialization for both C and C++ code, for example
+ static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
+*/
+#ifdef __cplusplus
+#define SWIG_STATIC_POINTER(var) var
+#else
+#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Python-specific SWIG API */
+#define SWIG_newvarlink() SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants)
+
+/* -----------------------------------------------------------------------------
+ * global variable support code.
+ * ----------------------------------------------------------------------------- */
+
+typedef struct swig_globalvar {
+ char *name; /* Name of global variable */
+ PyObject *(*get_attr)(void); /* Return the current value */
+ int (*set_attr)(PyObject *); /* Set the value */
+ struct swig_globalvar *next;
+} swig_globalvar;
+
+typedef struct swig_varlinkobject {
+ PyObject_HEAD
+ swig_globalvar *vars;
+} swig_varlinkobject;
+
+SWIGINTERN PyObject *
+swig_varlink_repr(PyObject *SWIGUNUSEDPARM(v)) {
+#if PY_VERSION_HEX >= 0x03000000
+ return PyUnicode_InternFromString("");
+#else
+ return PyString_FromString("");
+#endif
+}
+
+SWIGINTERN PyObject *
+swig_varlink_str(PyObject *o) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+#if PY_VERSION_HEX >= 0x03000000
+ PyObject *str = PyUnicode_InternFromString("(");
+ PyObject *tail;
+ PyObject *joined;
+ swig_globalvar *var;
+ for (var = v->vars; var; var=var->next) {
+ tail = PyUnicode_FromString(var->name);
+ joined = PyUnicode_Concat(str, tail);
+ SWIG_Py_DECREF(str);
+ SWIG_Py_DECREF(tail);
+ str = joined;
+ if (var->next) {
+ tail = PyUnicode_InternFromString(", ");
+ joined = PyUnicode_Concat(str, tail);
+ SWIG_Py_DECREF(str);
+ SWIG_Py_DECREF(tail);
+ str = joined;
+ }
+ }
+ tail = PyUnicode_InternFromString(")");
+ joined = PyUnicode_Concat(str, tail);
+ SWIG_Py_DECREF(str);
+ SWIG_Py_DECREF(tail);
+ str = joined;
+#else
+ PyObject *str = PyString_FromString("(");
+ swig_globalvar *var;
+ for (var = v->vars; var; var=var->next) {
+ PyString_ConcatAndDel(&str,PyString_FromString(var->name));
+ if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
+ }
+ PyString_ConcatAndDel(&str,PyString_FromString(")"));
+#endif
+ return str;
+}
+
+SWIGINTERN void
+swig_varlink_dealloc(PyObject *o) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ swig_globalvar *var = v->vars;
+ while (var) {
+ swig_globalvar *n = var->next;
+ free(var->name);
+ free(var);
+ var = n;
+ }
+}
+
+SWIGINTERN PyObject *
+swig_varlink_getattr(PyObject *o, char *n) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ PyObject *res = NULL;
+ swig_globalvar *var = v->vars;
+ while (var) {
+ if (strcmp(var->name,n) == 0) {
+ res = (*var->get_attr)();
+ break;
+ }
+ var = var->next;
+ }
+ if (res == NULL && !PyErr_Occurred()) {
+ PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+ }
+ return res;
+}
+
+SWIGINTERN int
+swig_varlink_setattr(PyObject *o, char *n, PyObject *p) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ int res = 1;
+ swig_globalvar *var = v->vars;
+ while (var) {
+ if (strcmp(var->name,n) == 0) {
+ res = (*var->set_attr)(p);
+ break;
+ }
+ var = var->next;
+ }
+ if (res == 1 && !PyErr_Occurred()) {
+ PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+ }
+ return res;
+}
+
+#if !defined(SWIGPYTHON_BUILTIN) && PY_VERSION_HEX >= 0x03030000
+#define SWIG_HEAPTYPES
+#endif
+
+SWIGINTERN PyTypeObject*
+swig_varlink_type(void) {
+ static char varlink__doc__[] = "Swig var link object";
+#ifndef SWIG_HEAPTYPES
+ static PyTypeObject varlink_type;
+ static int type_init = 0;
+ if (!type_init) {
+ const PyTypeObject tmp = {
+#if PY_VERSION_HEX >= 0x03000000
+ PyVarObject_HEAD_INIT(NULL, 0)
+#else
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+#endif
+ "swigvarlink", /* tp_name */
+ sizeof(swig_varlinkobject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor) swig_varlink_dealloc, /* tp_dealloc */
+#if PY_VERSION_HEX < 0x030800b4
+ (printfunc)0, /* tp_print */
+#else
+ (Py_ssize_t)0, /* tp_vectorcall_offset */
+#endif
+ (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+ (setattrfunc) swig_varlink_setattr, /* tp_setattr */
+ 0, /* tp_compare */
+ (reprfunc) swig_varlink_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ (reprfunc) swig_varlink_str, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ 0, /* tp_flags */
+ varlink__doc__, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+#if PY_VERSION_HEX >= 0x03040000
+ 0, /* tp_finalize */
+#endif
+#if PY_VERSION_HEX >= 0x03080000
+ 0, /* tp_vectorcall */
+#endif
+#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)
+ 0, /* tp_print */
+#endif
+#if PY_VERSION_HEX >= 0x030c0000
+ 0, /* tp_watched */
+#endif
+#if PY_VERSION_HEX >= 0x030d00a4
+ 0, /* tp_versions_used */
+#endif
+#ifdef COUNT_ALLOCS
+ 0, /* tp_allocs */
+ 0, /* tp_frees */
+ 0, /* tp_maxalloc */
+ 0, /* tp_prev */
+ 0 /* tp_next */
+#endif
+ };
+ varlink_type = tmp;
+ type_init = 1;
+ if (PyType_Ready(&varlink_type) < 0)
+ return NULL;
+ }
+ return &varlink_type;
+#else
+ PyType_Slot slots[] = {
+ { Py_tp_dealloc, (void *)swig_varlink_dealloc },
+ { Py_tp_repr, (void *)swig_varlink_repr },
+ { Py_tp_getattr, (void *)swig_varlink_getattr },
+ { Py_tp_setattr, (void *)swig_varlink_setattr },
+ { Py_tp_str, (void *)swig_varlink_str },
+ { Py_tp_doc, (void *)varlink__doc__ },
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+ "swigvarlink",
+ sizeof(swig_varlinkobject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+ slots
+ };
+ return (PyTypeObject *)PyType_FromSpec(&spec);
+#endif
+}
+
+/* Create a variable linking object for use later */
+SWIGINTERN PyObject *
+SWIG_Python_newvarlink(void) {
+ swig_varlinkobject *result = PyObject_New(swig_varlinkobject, swig_varlink_type());
+ if (result) {
+ result->vars = 0;
+ }
+ return ((PyObject*) result);
+}
+
+SWIGINTERN void
+SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+ swig_varlinkobject *v = (swig_varlinkobject *) p;
+ swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+ if (gv) {
+ size_t size = strlen(name)+1;
+ gv->name = (char *)malloc(size);
+ if (gv->name) {
+ memcpy(gv->name, name, size);
+ gv->get_attr = get_attr;
+ gv->set_attr = set_attr;
+ gv->next = v->vars;
+ }
+ }
+ v->vars = gv;
+}
+
+
+static PyObject *Swig_Globals_global = NULL;
+
+SWIGINTERN PyObject *
+SWIG_globals(void) {
+ if (Swig_Globals_global == NULL) {
+ Swig_Globals_global = SWIG_newvarlink();
+ }
+ return Swig_Globals_global;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Pointer declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1)
+#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
+
+#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1)
+
+#define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2)
+#define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The python void return value */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Py_Void(void)
+{
+ PyObject *none = Py_None;
+ SWIG_Py_INCREF(none);
+ return none;
+}
+
+/* SwigPyClientData */
+
+typedef struct {
+ PyObject *klass;
+ PyObject *newraw;
+ PyObject *newargs;
+ PyObject *destroy;
+ int delargs;
+ int implicitconv;
+ PyTypeObject *pytype;
+} SwigPyClientData;
+
+SWIGRUNTIMEINLINE int
+SWIG_Python_CheckImplicit(swig_type_info *ty)
+{
+ SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
+ int fail = data ? data->implicitconv : 0;
+ if (fail)
+ PyErr_SetString(PyExc_TypeError, "Implicit conversion is prohibited for explicit constructors.");
+ return fail;
+}
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_ExceptionType(swig_type_info *desc) {
+ SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
+ PyObject *klass = data ? data->klass : 0;
+ return (klass ? klass : PyExc_RuntimeError);
+}
+
+
+SWIGRUNTIME SwigPyClientData *
+SwigPyClientData_New(PyObject* obj)
+{
+ if (!obj) {
+ return 0;
+ } else {
+ SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
+ /* the klass element */
+ data->klass = obj;
+ SWIG_Py_INCREF(data->klass);
+ /* the newraw method and newargs arguments used to create a new raw instance */
+ if (PyClass_Check(obj)) {
+ data->newraw = 0;
+ SWIG_Py_INCREF(obj);
+ data->newargs = obj;
+ } else {
+ data->newraw = PyObject_GetAttrString(data->klass, "__new__");
+ if (data->newraw) {
+ data->newargs = PyTuple_New(1);
+ if (data->newargs) {
+ SWIG_Py_INCREF(obj);
+ PyTuple_SET_ITEM(data->newargs, 0, obj);
+ } else {
+ SWIG_Py_DECREF(data->newraw);
+ SWIG_Py_DECREF(data->klass);
+ free(data);
+ return 0;
+ }
+ } else {
+ SWIG_Py_INCREF(obj);
+ data->newargs = obj;
+ }
+ }
+ /* the destroy method, aka as the C++ delete method */
+ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__");
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ data->destroy = 0;
+ }
+ if (data->destroy) {
+ data->delargs = !(PyCFunction_GET_FLAGS(data->destroy) & METH_O);
+ } else {
+ data->delargs = 0;
+ }
+ data->implicitconv = 0;
+ data->pytype = 0;
+ return data;
+ }
+}
+
+SWIGRUNTIME void
+SwigPyClientData_Del(SwigPyClientData *data)
+{
+ SWIG_Py_XDECREF(data->klass);
+ SWIG_Py_XDECREF(data->newraw);
+ SWIG_Py_XDECREF(data->newargs);
+ SWIG_Py_XDECREF(data->destroy);
+ free(data);
+}
+
+/* =============== SwigPyObject =====================*/
+
+typedef struct {
+ PyObject_HEAD
+ void *ptr;
+ swig_type_info *ty;
+ int own;
+ PyObject *next;
+#ifdef SWIGPYTHON_BUILTIN
+ PyObject *dict;
+#endif
+} SwigPyObject;
+
+
+#ifdef SWIGPYTHON_BUILTIN
+
+SWIGRUNTIME PyObject *
+SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+ SwigPyObject *sobj = (SwigPyObject *)v;
+
+ if (!sobj->dict)
+ sobj->dict = PyDict_New();
+
+ SWIG_Py_XINCREF(sobj->dict);
+ return sobj->dict;
+}
+
+#endif
+
+SWIGRUNTIME PyObject *
+SwigPyObject_long(SwigPyObject *v)
+{
+ return PyLong_FromVoidPtr(v->ptr);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_format(const char* fmt, SwigPyObject *v)
+{
+ PyObject *res = NULL;
+ PyObject *args = PyTuple_New(1);
+ if (args) {
+ PyObject *val = SwigPyObject_long(v);
+ if (val) {
+ PyObject *ofmt;
+ PyTuple_SET_ITEM(args, 0, val);
+ ofmt = SWIG_Python_str_FromChar(fmt);
+ if (ofmt) {
+#if PY_VERSION_HEX >= 0x03000000
+ res = PyUnicode_Format(ofmt,args);
+#else
+ res = PyString_Format(ofmt,args);
+#endif
+ SWIG_Py_DECREF(ofmt);
+ }
+ }
+ SWIG_Py_DECREF(args);
+ }
+ return res;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_oct(SwigPyObject *v)
+{
+ return SwigPyObject_format("%o",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_hex(SwigPyObject *v)
+{
+ return SwigPyObject_format("%x",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_repr(SwigPyObject *v)
+{
+ const char *name = SWIG_TypePrettyName(v->ty);
+ PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v);
+ if (repr && v->next) {
+ PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
+ if (nrep) {
+# if PY_VERSION_HEX >= 0x03000000
+ PyObject *joined = PyUnicode_Concat(repr, nrep);
+ SWIG_Py_DECREF(repr);
+ SWIG_Py_DECREF(nrep);
+ repr = joined;
+# else
+ PyString_ConcatAndDel(&repr,nrep);
+# endif
+ } else {
+ SWIG_Py_DECREF(repr);
+ repr = NULL;
+ }
+ }
+ return repr;
+}
+
+/* We need a version taking two PyObject* parameters so it's a valid
+ * PyCFunction to use in swigobject_methods[]. */
+SWIGRUNTIME PyObject *
+SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+ return SwigPyObject_repr((SwigPyObject*)v);
+}
+
+SWIGRUNTIME int
+SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+{
+ void *i = v->ptr;
+ void *j = w->ptr;
+ return (i < j) ? -1 : ((i > j) ? 1 : 0);
+}
+
+/* Added for Python 3.x, would it also be useful for Python 2.x? */
+SWIGRUNTIME PyObject*
+SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
+{
+ PyObject* res = NULL;
+ if (!PyErr_Occurred()) {
+ if (op != Py_EQ && op != Py_NE) {
+ SWIG_Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0);
+ }
+ return res;
+}
+
+
+SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void);
+
+#ifdef SWIGPYTHON_BUILTIN
+static swig_type_info *SwigPyObject_stype = 0;
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+ SwigPyClientData *cd;
+ assert(SwigPyObject_stype);
+ cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+ assert(cd);
+ assert(cd->pytype);
+ return cd->pytype;
+}
+#else
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+ static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce();
+ return type;
+}
+#endif
+
+SWIGRUNTIMEINLINE int
+SwigPyObject_Check(PyObject *op) {
+ PyTypeObject *target_tp = SwigPyObject_type();
+ PyTypeObject *op_type = Py_TYPE(op);
+#ifdef SWIGPYTHON_BUILTIN
+ if (PyType_IsSubtype(op_type, target_tp))
+ return 1;
+ return (strcmp(op_type->tp_name, "SwigPyObject") == 0);
+#else
+# ifdef Py_LIMITED_API
+ int cmp;
+ PyObject *tp_name;
+#endif
+ if (op_type == target_tp)
+ return 1;
+# ifdef Py_LIMITED_API
+ tp_name = PyObject_GetAttrString((PyObject *)op_type, "__name__");
+ if (!tp_name)
+ return 0;
+ cmp = PyUnicode_CompareWithASCIIString(tp_name, "SwigPyObject");
+ SWIG_Py_DECREF(tp_name);
+ return cmp == 0;
+# else
+ return (strcmp(op_type->tp_name, "SwigPyObject") == 0);
+# endif
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own);
+
+static PyObject* Swig_Capsule_global = NULL;
+
+SWIGRUNTIME void
+SwigPyObject_dealloc(PyObject *v)
+{
+ SwigPyObject *sobj = (SwigPyObject *) v;
+ PyObject *next = sobj->next;
+ if (sobj->own == SWIG_POINTER_OWN) {
+ swig_type_info *ty = sobj->ty;
+ SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+ PyObject *destroy = data ? data->destroy : 0;
+ if (destroy) {
+ /* destroy is always a VARARGS method */
+ PyObject *res;
+
+ /* PyObject_CallFunction() has the potential to silently drop
+ the active exception. In cases of unnamed temporary
+ variable or where we just finished iterating over a generator
+ StopIteration will be active right now, and this needs to
+ remain true upon return from SwigPyObject_dealloc. So save
+ and restore. */
+
+ PyObject *type = NULL, *value = NULL, *traceback = NULL;
+ PyErr_Fetch(&type, &value, &traceback);
+
+ if (data->delargs) {
+ /* we need to create a temporary object to carry the destroy operation */
+ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+ if (tmp) {
+ res = SWIG_Python_CallFunctor(destroy, tmp);
+ } else {
+ res = 0;
+ }
+ SWIG_Py_XDECREF(tmp);
+ } else {
+ PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+ PyObject *mself = PyCFunction_GET_SELF(destroy);
+ res = ((*meth)(mself, v));
+ }
+ if (!res)
+ PyErr_WriteUnraisable(destroy);
+
+ PyErr_Restore(type, value, traceback);
+
+ SWIG_Py_XDECREF(res);
+ }
+#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
+ else {
+ const char *name = SWIG_TypePrettyName(ty);
+ printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
+ }
+#endif
+ SWIG_Py_XDECREF(Swig_Capsule_global);
+ }
+ SWIG_Py_XDECREF(next);
+#ifdef SWIGPYTHON_BUILTIN
+ SWIG_Py_XDECREF(sobj->dict);
+#endif
+ PyObject_Free(v);
+}
+
+SWIGRUNTIME PyObject*
+SwigPyObject_append(PyObject* v, PyObject* next)
+{
+ SwigPyObject *sobj = (SwigPyObject *) v;
+ if (!SwigPyObject_Check(next)) {
+ PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject");
+ return NULL;
+ }
+ ((SwigPyObject *)next)->next = sobj->next;
+ sobj->next = next;
+ SWIG_Py_INCREF(next);
+ return SWIG_Py_Void();
+}
+
+SWIGRUNTIME PyObject*
+SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+ SwigPyObject *sobj = (SwigPyObject *) v;
+ if (sobj->next) {
+ SWIG_Py_INCREF(sobj->next);
+ return sobj->next;
+ } else {
+ return SWIG_Py_Void();
+ }
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+ SwigPyObject *sobj = (SwigPyObject *)v;
+ sobj->own = 0;
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+ SwigPyObject *sobj = (SwigPyObject *)v;
+ sobj->own = SWIG_POINTER_OWN;
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_own(PyObject *v, PyObject *args)
+{
+ PyObject *val = 0;
+ if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) {
+ return NULL;
+ } else {
+ SwigPyObject *sobj = (SwigPyObject *)v;
+ PyObject *obj = PyBool_FromLong(sobj->own);
+ if (val) {
+ if (PyObject_IsTrue(val)) {
+ SWIG_Py_DECREF(SwigPyObject_acquire(v,args));
+ } else {
+ SWIG_Py_DECREF(SwigPyObject_disown(v,args));
+ }
+ }
+ return obj;
+ }
+}
+
+static PyMethodDef
+swigobject_methods[] = {
+ {"disown", SwigPyObject_disown, METH_NOARGS, "releases ownership of the pointer"},
+ {"acquire", SwigPyObject_acquire, METH_NOARGS, "acquires ownership of the pointer"},
+ {"own", SwigPyObject_own, METH_VARARGS, "returns/sets ownership of the pointer"},
+ {"append", SwigPyObject_append, METH_O, "appends another 'this' object"},
+ {"next", SwigPyObject_next, METH_NOARGS, "returns the next 'this' object"},
+ {"__repr__",SwigPyObject_repr2, METH_NOARGS, "returns object representation"},
+ {0, 0, 0, 0}
+};
+
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_TypeOnce(void) {
+ static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
+#ifndef SWIG_HEAPTYPES
+ static PyNumberMethods SwigPyObject_as_number = {
+ (binaryfunc)0, /*nb_add*/
+ (binaryfunc)0, /*nb_subtract*/
+ (binaryfunc)0, /*nb_multiply*/
+ /* nb_divide removed in Python 3 */
+#if PY_VERSION_HEX < 0x03000000
+ (binaryfunc)0, /*nb_divide*/
+#endif
+ (binaryfunc)0, /*nb_remainder*/
+ (binaryfunc)0, /*nb_divmod*/
+ (ternaryfunc)0,/*nb_power*/
+ (unaryfunc)0, /*nb_negative*/
+ (unaryfunc)0, /*nb_positive*/
+ (unaryfunc)0, /*nb_absolute*/
+ (inquiry)0, /*nb_nonzero*/
+ 0, /*nb_invert*/
+ 0, /*nb_lshift*/
+ 0, /*nb_rshift*/
+ 0, /*nb_and*/
+ 0, /*nb_xor*/
+ 0, /*nb_or*/
+#if PY_VERSION_HEX < 0x03000000
+ 0, /*nb_coerce*/
+#endif
+ (unaryfunc)SwigPyObject_long, /*nb_int*/
+#if PY_VERSION_HEX < 0x03000000
+ (unaryfunc)SwigPyObject_long, /*nb_long*/
+#else
+ 0, /*nb_reserved*/
+#endif
+ (unaryfunc)0, /*nb_float*/
+#if PY_VERSION_HEX < 0x03000000
+ (unaryfunc)SwigPyObject_oct, /*nb_oct*/
+ (unaryfunc)SwigPyObject_hex, /*nb_hex*/
+#endif
+#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */
+#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
+#else
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
+#endif
+ };
+
+ static PyTypeObject swigpyobject_type;
+ static int type_init = 0;
+ if (!type_init) {
+ const PyTypeObject tmp = {
+#if PY_VERSION_HEX >= 0x03000000
+ PyVarObject_HEAD_INIT(NULL, 0)
+#else
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+#endif
+ "SwigPyObject", /* tp_name */
+ sizeof(SwigPyObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)SwigPyObject_dealloc, /* tp_dealloc */
+#if PY_VERSION_HEX < 0x030800b4
+ (printfunc)0, /* tp_print */
+#else
+ (Py_ssize_t)0, /* tp_vectorcall_offset */
+#endif
+ (getattrfunc)0, /* tp_getattr */
+ (setattrfunc)0, /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+ 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+#else
+ (cmpfunc)SwigPyObject_compare, /* tp_compare */
+#endif
+ (reprfunc)SwigPyObject_repr, /* tp_repr */
+ &SwigPyObject_as_number, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ (hashfunc)0, /* tp_hash */
+ (ternaryfunc)0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ swigobject_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ swigobject_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+#if PY_VERSION_HEX >= 0x03040000
+ 0, /* tp_finalize */
+#endif
+#if PY_VERSION_HEX >= 0x03080000
+ 0, /* tp_vectorcall */
+#endif
+#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)
+ 0, /* tp_print */
+#endif
+#if PY_VERSION_HEX >= 0x030c0000
+ 0, /* tp_watched */
+#endif
+#if PY_VERSION_HEX >= 0x030d00a4
+ 0, /* tp_versions_used */
+#endif
+#ifdef COUNT_ALLOCS
+ 0, /* tp_allocs */
+ 0, /* tp_frees */
+ 0, /* tp_maxalloc */
+ 0, /* tp_prev */
+ 0 /* tp_next */
+#endif
+ };
+ swigpyobject_type = tmp;
+ type_init = 1;
+ if (PyType_Ready(&swigpyobject_type) != 0)
+ return NULL;
+ }
+ return &swigpyobject_type;
+#else
+ PyType_Slot slots[] = {
+ { Py_tp_dealloc, (void *)SwigPyObject_dealloc },
+ { Py_tp_repr, (void *)SwigPyObject_repr },
+ { Py_tp_getattro, (void *)PyObject_GenericGetAttr },
+ { Py_tp_doc, (void *)swigobject_doc },
+ { Py_tp_richcompare, (void *)SwigPyObject_richcompare },
+ { Py_tp_methods, (void *)swigobject_methods },
+ { Py_nb_int, (void *)SwigPyObject_long },
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+ "SwigPyObject",
+ sizeof(SwigPyObject),
+ 0,
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+ slots
+ };
+ return (PyTypeObject *)PyType_FromSpec(&spec);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
+{
+ SwigPyObject *sobj = PyObject_New(SwigPyObject, SwigPyObject_type());
+ if (sobj) {
+ sobj->ptr = ptr;
+ sobj->ty = ty;
+ sobj->own = own;
+ sobj->next = 0;
+#ifdef SWIGPYTHON_BUILTIN
+ sobj->dict = 0;
+#endif
+ if (own == SWIG_POINTER_OWN) {
+ /* Obtain a reference to the Python capsule wrapping the module information, so that the
+ * module information is correctly destroyed after all SWIG python objects have been freed
+ * by the GC (and corresponding destructors invoked) */
+ SWIG_Py_XINCREF(Swig_Capsule_global);
+ }
+ }
+ return (PyObject *)sobj;
+}
+
+/* -----------------------------------------------------------------------------
+ * Implements a simple Swig Packed type, and use it instead of string
+ * ----------------------------------------------------------------------------- */
+
+typedef struct {
+ PyObject_HEAD
+ void *pack;
+ swig_type_info *ty;
+ size_t size;
+} SwigPyPacked;
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_repr(SwigPyPacked *v)
+{
+ char result[SWIG_BUFFER_SIZE];
+ if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+ return SWIG_Python_str_FromFormat("", result, v->ty->name);
+ } else {
+ return SWIG_Python_str_FromFormat("", v->ty->name);
+ }
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_str(SwigPyPacked *v)
+{
+ char result[SWIG_BUFFER_SIZE];
+ if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
+ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
+ } else {
+ return SWIG_Python_str_FromChar(v->ty->name);
+ }
+}
+
+SWIGRUNTIME int
+SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
+{
+ size_t i = v->size;
+ size_t j = w->size;
+ int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
+ return s ? s : strncmp((const char *)v->pack, (const char *)w->pack, 2*v->size);
+}
+
+SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void);
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_type(void) {
+ static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce();
+ return type;
+}
+
+SWIGRUNTIMEINLINE int
+SwigPyPacked_Check(PyObject *op) {
+#ifdef Py_LIMITED_API
+ int cmp;
+ PyObject *tp_name;
+#endif
+ PyTypeObject* op_type = Py_TYPE(op);
+ if (op_type == SwigPyPacked_TypeOnce())
+ return 1;
+#ifdef Py_LIMITED_API
+ tp_name = PyObject_GetAttrString((PyObject *)op_type, "__name__");
+ if (!tp_name)
+ return 0;
+ cmp = PyUnicode_CompareWithASCIIString(tp_name, "SwigPyPacked");
+ SWIG_Py_DECREF(tp_name);
+ return cmp == 0;
+#else
+ return (strcmp(op_type->tp_name, "SwigPyPacked") == 0);
+#endif
+}
+
+SWIGRUNTIME void
+SwigPyPacked_dealloc(PyObject *v)
+{
+ if (SwigPyPacked_Check(v)) {
+ SwigPyPacked *sobj = (SwigPyPacked *) v;
+ free(sobj->pack);
+ }
+ PyObject_Free(v);
+}
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_TypeOnce(void) {
+ static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
+#ifndef SWIG_HEAPTYPES
+ static PyTypeObject swigpypacked_type;
+ static int type_init = 0;
+ if (!type_init) {
+ const PyTypeObject tmp = {
+#if PY_VERSION_HEX>=0x03000000
+ PyVarObject_HEAD_INIT(NULL, 0)
+#else
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+#endif
+ "SwigPyPacked", /* tp_name */
+ sizeof(SwigPyPacked), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */
+#if PY_VERSION_HEX < 0x030800b4
+ (printfunc)0, /* tp_print */
+#else
+ (Py_ssize_t)0, /* tp_vectorcall_offset */
+#endif
+ (getattrfunc)0, /* tp_getattr */
+ (setattrfunc)0, /* tp_setattr */
+#if PY_VERSION_HEX>=0x03000000
+ 0, /* tp_reserved in 3.0.1 */
+#else
+ (cmpfunc)SwigPyPacked_compare, /* tp_compare */
+#endif
+ (reprfunc)SwigPyPacked_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ (hashfunc)0, /* tp_hash */
+ (ternaryfunc)0, /* tp_call */
+ (reprfunc)SwigPyPacked_str, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ swigpacked_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+#if PY_VERSION_HEX >= 0x03040000
+ 0, /* tp_finalize */
+#endif
+#if PY_VERSION_HEX >= 0x03080000
+ 0, /* tp_vectorcall */
+#endif
+#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)
+ 0, /* tp_print */
+#endif
+#if PY_VERSION_HEX >= 0x030c0000
+ 0, /* tp_watched */
+#endif
+#if PY_VERSION_HEX >= 0x030d00a4
+ 0, /* tp_versions_used */
+#endif
+#ifdef COUNT_ALLOCS
+ 0, /* tp_allocs */
+ 0, /* tp_frees */
+ 0, /* tp_maxalloc */
+ 0, /* tp_prev */
+ 0 /* tp_next */
+#endif
+ };
+ swigpypacked_type = tmp;
+ type_init = 1;
+ if (PyType_Ready(&swigpypacked_type) != 0)
+ return NULL;
+ }
+ return &swigpypacked_type;
+#else
+ PyType_Slot slots[] = {
+ { Py_tp_dealloc, (void *)SwigPyPacked_dealloc },
+ { Py_tp_repr, (void *)SwigPyPacked_repr },
+ { Py_tp_str, (void *)SwigPyPacked_str },
+ { Py_tp_getattro, (void *)PyObject_GenericGetAttr },
+ { Py_tp_doc, (void *)swigpacked_doc },
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+ "SwigPyPacked",
+ sizeof(SwigPyPacked),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+ slots
+ };
+ return (PyTypeObject *)PyType_FromSpec(&spec);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
+{
+ SwigPyPacked *sobj = PyObject_New(SwigPyPacked, SwigPyPacked_type());
+ if (sobj) {
+ void *pack = malloc(size);
+ if (pack) {
+ memcpy(pack, ptr, size);
+ sobj->pack = pack;
+ sobj->ty = ty;
+ sobj->size = size;
+ } else {
+ PyObject_Free((PyObject *)sobj);
+ sobj = 0;
+ }
+ }
+ return (PyObject *) sobj;
+}
+
+SWIGRUNTIME swig_type_info *
+SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
+{
+ if (SwigPyPacked_Check(obj)) {
+ SwigPyPacked *sobj = (SwigPyPacked *)obj;
+ if (sobj->size != size) return 0;
+ memcpy(ptr, sobj->pack, size);
+ return sobj->ty;
+ } else {
+ return 0;
+ }
+}
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+static PyObject *Swig_This_global = NULL;
+
+SWIGRUNTIME PyObject *
+SWIG_This(void)
+{
+ if (Swig_This_global == NULL)
+ Swig_This_global = SWIG_Python_str_FromChar("this");
+ return Swig_This_global;
+}
+
+/* #define SWIG_PYTHON_SLOW_GETSET_THIS */
+
+/* TODO: I don't know how to implement the fast getset in Python 3 right now */
+#if PY_VERSION_HEX>=0x03000000
+#define SWIG_PYTHON_SLOW_GETSET_THIS
+#endif
+
+SWIGRUNTIME SwigPyObject *
+SWIG_Python_GetSwigThis(PyObject *pyobj)
+{
+ PyObject *obj;
+
+ if (SwigPyObject_Check(pyobj))
+ return (SwigPyObject *) pyobj;
+
+#ifdef SWIGPYTHON_BUILTIN
+ (void)obj;
+# ifdef PyWeakref_CheckProxy
+ if (PyWeakref_CheckProxy(pyobj)) {
+#if PY_VERSION_HEX >= 0x030d0000
+ PyWeakref_GetRef(pyobj, &pyobj);
+ Py_DECREF(pyobj);
+#else
+ pyobj = PyWeakref_GET_OBJECT(pyobj);
+#endif
+ if (pyobj && SwigPyObject_Check(pyobj))
+ return (SwigPyObject*) pyobj;
+ }
+# endif
+ return NULL;
+#else
+
+ obj = 0;
+
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ if (PyInstance_Check(pyobj)) {
+ obj = _PyInstance_Lookup(pyobj, SWIG_This());
+ } else {
+ PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
+ if (dictptr != NULL) {
+ PyObject *dict = *dictptr;
+ obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
+ } else {
+#ifdef PyWeakref_CheckProxy
+ if (PyWeakref_CheckProxy(pyobj)) {
+ PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
+ return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
+ }
+#endif
+ obj = PyObject_GetAttr(pyobj,SWIG_This());
+ if (obj) {
+ SWIG_Py_DECREF(obj);
+ } else {
+ if (PyErr_Occurred()) PyErr_Clear();
+ return 0;
+ }
+ }
+ }
+#else
+ obj = PyObject_GetAttr(pyobj,SWIG_This());
+ if (obj) {
+ SWIG_Py_DECREF(obj);
+ } else {
+ if (PyErr_Occurred()) PyErr_Clear();
+ return 0;
+ }
+#endif
+ if (obj && !SwigPyObject_Check(obj)) {
+ /* a PyObject is called 'this', try to get the 'real this'
+ SwigPyObject from it */
+ return SWIG_Python_GetSwigThis(obj);
+ }
+ return (SwigPyObject *)obj;
+#endif
+}
+
+/* Acquire a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_AcquirePtr(PyObject *obj, int own) {
+ if (own == SWIG_POINTER_OWN) {
+ SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
+ if (sobj) {
+ int oldown = sobj->own;
+ sobj->own = own;
+ return oldown;
+ }
+ }
+ return 0;
+}
+
+/* Convert a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
+ int res;
+ SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
+
+ if (!obj)
+ return SWIG_ERROR;
+ if (obj == Py_None && !implicit_conv) {
+ if (ptr)
+ *ptr = 0;
+ return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK;
+ }
+
+ res = SWIG_ERROR;
+
+ sobj = SWIG_Python_GetSwigThis(obj);
+ if (own)
+ *own = 0;
+ while (sobj) {
+ void *vptr = sobj->ptr;
+ if (ty) {
+ swig_type_info *to = sobj->ty;
+ if (to == ty) {
+ /* no type cast needed */
+ if (ptr) *ptr = vptr;
+ break;
+ } else {
+ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+ if (!tc) {
+ sobj = (SwigPyObject *)sobj->next;
+ } else {
+ if (ptr) {
+ int newmemory = 0;
+ *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+ if (newmemory == SWIG_CAST_NEW_MEMORY) {
+ assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+ if (own)
+ *own = *own | SWIG_CAST_NEW_MEMORY;
+ }
+ }
+ break;
+ }
+ }
+ } else {
+ if (ptr) *ptr = vptr;
+ break;
+ }
+ }
+ if (sobj) {
+ if (((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE) && !sobj->own) {
+ res = SWIG_ERROR_RELEASE_NOT_OWNED;
+ } else {
+ if (own)
+ *own = *own | sobj->own;
+ if (flags & SWIG_POINTER_DISOWN) {
+ sobj->own = 0;
+ }
+ if (flags & SWIG_POINTER_CLEAR) {
+ sobj->ptr = 0;
+ }
+ res = SWIG_OK;
+ }
+ } else {
+ if (implicit_conv) {
+ SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+ if (data && !data->implicitconv) {
+ PyObject *klass = data->klass;
+ if (klass) {
+ PyObject *impconv;
+ data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
+ impconv = SWIG_Python_CallFunctor(klass, obj);
+ data->implicitconv = 0;
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ impconv = 0;
+ }
+ if (impconv) {
+ SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
+ if (iobj) {
+ void *vptr;
+ res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
+ if (SWIG_IsOK(res)) {
+ if (ptr) {
+ *ptr = vptr;
+ /* transfer the ownership to 'ptr' */
+ iobj->own = 0;
+ res = SWIG_AddCast(res);
+ res = SWIG_AddNewMask(res);
+ } else {
+ res = SWIG_AddCast(res);
+ }
+ }
+ }
+ SWIG_Py_DECREF(impconv);
+ }
+ }
+ }
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
+ }
+ }
+ return res;
+}
+
+/* Convert a function ptr value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+ if (!PyCFunction_Check(obj)) {
+ return SWIG_ConvertPtr(obj, ptr, ty, 0);
+ } else {
+ void *vptr = 0;
+ swig_cast_info *tc;
+
+ /* here we get the method pointer for callbacks */
+#ifndef Py_LIMITED_API
+ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+#else
+ PyObject* pystr_doc = PyObject_GetAttrString(obj, "__doc__");
+ PyObject *bytes = NULL;
+ const char *doc = pystr_doc ? SWIG_PyUnicode_AsUTF8AndSize(pystr_doc, NULL, &bytes) : 0;
+#endif
+ const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+ if (desc)
+ desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+#ifdef Py_LIMITED_API
+ SWIG_Py_XDECREF(bytes);
+ SWIG_Py_XDECREF(pystr_doc);
+#endif
+ if (!desc)
+ return SWIG_ERROR;
+ tc = SWIG_TypeCheck(desc,ty);
+ if (tc) {
+ int newmemory = 0;
+ *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+ assert(!newmemory); /* newmemory handling not yet implemented */
+ } else {
+ return SWIG_ERROR;
+ }
+ return SWIG_OK;
+ }
+}
+
+/* Convert a packed pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
+ swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
+ if (!to) return SWIG_ERROR;
+ if (ty) {
+ if (to != ty) {
+ /* check type cast? */
+ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+ if (!tc) return SWIG_ERROR;
+ }
+ }
+ return SWIG_OK;
+}
+
+/* -----------------------------------------------------------------------------
+ * Create a new pointer object
+ * ----------------------------------------------------------------------------- */
+
+/*
+ Create a new instance object, without calling __init__, and set the
+ 'this' attribute.
+*/
+
+SWIGRUNTIME PyObject*
+SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
+{
+ PyObject *inst = 0;
+ PyObject *newraw = data->newraw;
+ if (newraw) {
+ inst = PyObject_Call(newraw, data->newargs, NULL);
+ if (inst) {
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ PyObject **dictptr = _PyObject_GetDictPtr(inst);
+ if (dictptr != NULL) {
+ PyObject *dict = *dictptr;
+ if (dict == NULL) {
+ dict = PyDict_New();
+ *dictptr = dict;
+ }
+ if (dict) {
+ PyDict_SetItem(dict, SWIG_This(), swig_this);
+ } else{
+ SWIG_Py_DECREF(inst);
+ inst = 0;
+ }
+ }
+#else
+ if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) {
+ SWIG_Py_DECREF(inst);
+ inst = 0;
+ }
+#endif
+ }
+ } else {
+#if PY_VERSION_HEX >= 0x03000000
+ PyObject *empty_args = PyTuple_New(0);
+ if (empty_args) {
+ PyObject *empty_kwargs = PyDict_New();
+ if (empty_kwargs) {
+#ifndef Py_LIMITED_API
+ newfunc newfn = ((PyTypeObject *)data->newargs)->tp_new;
+#else
+ newfunc newfn = (newfunc)PyType_GetSlot((PyTypeObject *)data->newargs, Py_tp_new);
+#endif
+ inst = newfn((PyTypeObject *)data->newargs, empty_args, empty_kwargs);
+ SWIG_Py_DECREF(empty_kwargs);
+ if (inst) {
+ if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) {
+ SWIG_Py_DECREF(inst);
+ inst = 0;
+ } else {
+ PyType_Modified(Py_TYPE(inst));
+ }
+ }
+ }
+ SWIG_Py_DECREF(empty_args);
+ }
+#else
+ PyObject *dict = PyDict_New();
+ if (dict) {
+ PyDict_SetItem(dict, SWIG_This(), swig_this);
+ inst = PyInstance_NewRaw(data->newargs, dict);
+ SWIG_Py_DECREF(dict);
+ }
+#endif
+ }
+ return inst;
+}
+
+SWIGRUNTIME int
+SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
+{
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ PyObject **dictptr = _PyObject_GetDictPtr(inst);
+ if (dictptr != NULL) {
+ PyObject *dict = *dictptr;
+ if (dict == NULL) {
+ dict = PyDict_New();
+ *dictptr = dict;
+ }
+ if (dict) {
+ return PyDict_SetItem(dict, SWIG_This(), swig_this);
+ } else{
+ return -1;
+ }
+ }
+#endif
+ return PyObject_SetAttr(inst, SWIG_This(), swig_this);
+}
+
+
+SWIGINTERN PyObject *
+SWIG_Python_InitShadowInstance(PyObject *args) {
+ PyObject *obj[2];
+ if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) {
+ return NULL;
+ } else {
+ SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
+ if (sthis) {
+ SWIG_Py_DECREF(SwigPyObject_append((PyObject*) sthis, obj[1]));
+ } else {
+ if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0)
+ return NULL;
+ }
+ return SWIG_Py_Void();
+ }
+}
+
+/* Create a new pointer object */
+
+SWIGRUNTIME PyObject *
+SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) {
+ SwigPyClientData *clientdata;
+ PyObject * robj;
+ int own;
+
+ if (!ptr)
+ return SWIG_Py_Void();
+
+ clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
+ own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
+ if (clientdata && clientdata->pytype) {
+ SwigPyObject *newobj;
+ if (flags & SWIG_BUILTIN_TP_INIT) {
+ newobj = (SwigPyObject*) self;
+ if (newobj->ptr) {
+#ifndef Py_LIMITED_API
+ allocfunc alloc = clientdata->pytype->tp_alloc;
+#else
+ allocfunc alloc = (allocfunc)PyType_GetSlot(clientdata->pytype, Py_tp_alloc);
+#endif
+ PyObject *next_self = alloc(clientdata->pytype, 0);
+ while (newobj->next)
+ newobj = (SwigPyObject *) newobj->next;
+ newobj->next = next_self;
+ newobj = (SwigPyObject *)next_self;
+#ifdef SWIGPYTHON_BUILTIN
+ newobj->dict = 0;
+#endif
+ }
+ } else {
+ newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+#ifdef SWIGPYTHON_BUILTIN
+ if (newobj) {
+ newobj->dict = 0;
+ }
+#endif
+ }
+ if (newobj) {
+ newobj->ptr = ptr;
+ newobj->ty = type;
+ newobj->own = own;
+ newobj->next = 0;
+ return (PyObject*) newobj;
+ }
+ return SWIG_Py_Void();
+ }
+
+ assert(!(flags & SWIG_BUILTIN_TP_INIT));
+
+ robj = SwigPyObject_New(ptr, type, own);
+ if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+ PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
+ SWIG_Py_DECREF(robj);
+ robj = inst;
+ }
+ return robj;
+}
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+ return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
+}
+
+/* -----------------------------------------------------------------------------*
+ * Get type list
+ * -----------------------------------------------------------------------------*/
+
+#ifdef SWIG_LINK_RUNTIME
+void *SWIG_ReturnGlobalTypeList(void *);
+#endif
+
+static PyObject *Swig_TypeCache_global = NULL;
+
+/* The python cached type query */
+SWIGRUNTIME PyObject *
+SWIG_Python_TypeCache(void) {
+ if (Swig_TypeCache_global == NULL) {
+ Swig_TypeCache_global = PyDict_New();
+ }
+ return Swig_TypeCache_global;
+}
+
+SWIGRUNTIME swig_module_info *
+SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
+#ifdef SWIG_LINK_RUNTIME
+ static void *type_pointer = (void *)0;
+ /* first check if module already created */
+ if (!type_pointer) {
+ type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
+ }
+#else
+ void *type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0);
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ type_pointer = (void *)0;
+ }
+#endif
+ return (swig_module_info *) type_pointer;
+}
+
+
+static int interpreter_counter = 0; /* how many (sub-)interpreters are using swig_module's types */
+
+SWIGRUNTIME void
+SWIG_Python_DestroyModule(PyObject *obj)
+{
+ swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME);
+ swig_type_info **types = swig_module->types;
+ size_t i;
+ if (--interpreter_counter != 0) /* another sub-interpreter may still be using the swig_module's types */
+ return;
+ for (i =0; i < swig_module->size; ++i) {
+ swig_type_info *ty = types[i];
+ if (ty->owndata) {
+ SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+ ty->clientdata = 0;
+ if (data) SwigPyClientData_Del(data);
+ }
+ }
+ SWIG_Py_DECREF(SWIG_This());
+ Swig_This_global = NULL;
+ SWIG_Py_DECREF(SWIG_globals());
+ Swig_Globals_global = NULL;
+ SWIG_Py_DECREF(SWIG_Python_TypeCache());
+ Swig_TypeCache_global = NULL;
+ Swig_Capsule_global = NULL;
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetModule(swig_module_info *swig_module) {
+#if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+ PyObject *module = PyImport_AddModule("swig_runtime_data" SWIG_RUNTIME_VERSION);
+#else
+ static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+ PyObject *module = Py_InitModule("swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
+#endif
+ PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+ if (pointer && module) {
+ if (PyModule_AddObject(module, SWIGPY_CAPSULE_ATTR_NAME, pointer) == 0) {
+ ++interpreter_counter;
+ Swig_Capsule_global = pointer;
+ } else {
+ SWIG_Py_DECREF(pointer);
+ }
+ } else {
+ SWIG_Py_XDECREF(pointer);
+ }
+}
+
+SWIGRUNTIME swig_type_info *
+SWIG_Python_TypeQuery(const char *type)
+{
+ PyObject *cache = SWIG_Python_TypeCache();
+ PyObject *key = SWIG_Python_str_FromChar(type);
+ PyObject *obj = PyDict_GetItem(cache, key);
+ swig_type_info *descriptor;
+ if (obj) {
+ descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
+ } else {
+ swig_module_info *swig_module = SWIG_GetModule(0);
+ descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
+ if (descriptor) {
+ obj = PyCapsule_New((void*) descriptor, NULL, NULL);
+ if (obj) {
+ PyDict_SetItem(cache, key, obj);
+ SWIG_Py_DECREF(obj);
+ }
+ }
+ }
+ SWIG_Py_DECREF(key);
+ return descriptor;
+}
+
+/*
+ For backward compatibility only
+*/
+#define SWIG_POINTER_EXCEPTION 0
+#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg)
+#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+SWIGRUNTIME int
+SWIG_Python_AddErrMesg(const char* mesg, int infront)
+{
+ if (PyErr_Occurred()) {
+ PyObject *type = 0;
+ PyObject *value = 0;
+ PyObject *traceback = 0;
+ PyErr_Fetch(&type, &value, &traceback);
+ if (value) {
+ PyObject *old_str = PyObject_Str(value);
+ PyObject *bytes = NULL;
+ const char *tmp = SWIG_PyUnicode_AsUTF8AndSize(old_str, NULL, &bytes);
+ const char *errmesg = tmp ? tmp : "Invalid error message";
+ SWIG_Py_XINCREF(type);
+ PyErr_Clear();
+ if (infront) {
+ PyErr_Format(type, "%s %s", mesg, errmesg);
+ } else {
+ PyErr_Format(type, "%s %s", errmesg, mesg);
+ }
+ SWIG_Py_XDECREF(bytes);
+ SWIG_Py_DECREF(old_str);
+ }
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+SWIGRUNTIME int
+SWIG_Python_ArgFail(int argnum)
+{
+ if (PyErr_Occurred()) {
+ /* add information about failing argument */
+ char mesg[256];
+ PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
+ return SWIG_Python_AddErrMesg(mesg, 1);
+ } else {
+ return 0;
+ }
+}
+
+SWIGRUNTIMEINLINE const char *
+SwigPyObject_GetDesc(PyObject *self)
+{
+ SwigPyObject *v = (SwigPyObject *)self;
+ swig_type_info *ty = v ? v->ty : 0;
+ return ty ? ty->str : "";
+}
+
+SWIGRUNTIME void
+SWIG_Python_TypeError(const char *type, PyObject *obj)
+{
+ (void) obj;
+ if (type) {
+#if defined(SWIG_COBJECT_TYPES)
+ if (obj && SwigPyObject_Check(obj)) {
+ const char *otype = (const char *) SwigPyObject_GetDesc(obj);
+ if (otype) {
+ PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
+ type, otype);
+ return;
+ }
+ } else
+#endif
+ {
+#ifndef Py_LIMITED_API
+ /* tp_name is not accessible */
+ const char *otype = (obj ? obj->ob_type->tp_name : 0);
+ if (otype) {
+ PyObject *str = PyObject_Str(obj);
+ PyObject *bytes = NULL;
+ const char *cstr = str ? SWIG_PyUnicode_AsUTF8AndSize(str, NULL, &bytes) : 0;
+ if (cstr) {
+ PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
+ type, otype, cstr);
+ } else {
+ PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
+ type, otype);
+ }
+ SWIG_Py_XDECREF(bytes);
+ SWIG_Py_XDECREF(str);
+ return;
+ }
+#endif
+ }
+ PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
+ } else {
+ PyErr_Format(PyExc_TypeError, "unexpected type is received");
+ }
+}
+
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME void *
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) {
+ void *result;
+ if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
+ PyErr_Clear();
+ }
+ return result;
+}
+
+#ifdef SWIGPYTHON_BUILTIN
+SWIGRUNTIME int
+SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+ PyTypeObject *tp = obj->ob_type;
+ PyObject *descr;
+ PyObject *encoded_name;
+ descrsetfunc f;
+ int res = -1;
+
+# ifdef Py_USING_UNICODE
+ if (PyString_Check(name)) {
+ name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
+ if (!name)
+ return -1;
+ } else if (!PyUnicode_Check(name))
+# else
+ if (!PyString_Check(name))
+# endif
+ {
+ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
+ return -1;
+ } else {
+ SWIG_Py_INCREF(name);
+ }
+
+ if (!tp->tp_dict) {
+ if (PyType_Ready(tp) != 0)
+ goto done;
+ }
+
+ descr = _PyType_Lookup(tp, name);
+ f = NULL;
+ if (descr != NULL)
+ f = descr->ob_type->tp_descr_set;
+ if (!f) {
+ if (PyString_Check(name)) {
+ encoded_name = name;
+ SWIG_Py_INCREF(name);
+ } else {
+ encoded_name = PyUnicode_AsUTF8String(name);
+ if (!encoded_name)
+ goto done;
+ }
+ PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+ SWIG_Py_DECREF(encoded_name);
+ } else {
+ res = f(descr, obj, value);
+ }
+
+ done:
+ SWIG_Py_DECREF(name);
+ return res;
+}
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0)
+
+#define SWIG_contract_assert(expr, msg) do { if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } } while (0)
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Method creation and docstring support functions */
+
+SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name);
+SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func);
+SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+ #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0)
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_allocator_type swig_types[0]
+#define SWIGTYPE_p_char swig_types[1]
+#define SWIGTYPE_p_clone_t swig_types[2]
+#define SWIGTYPE_p_difference_type swig_types[3]
+#define SWIGTYPE_p_double swig_types[4]
+#define SWIGTYPE_p_edge_t swig_types[5]
+#define SWIGTYPE_p_genotype_value_pair_t swig_types[6]
+#define SWIGTYPE_p_haploid_highd swig_types[7]
+#define SWIGTYPE_p_haploid_lowd swig_types[8]
+#define SWIGTYPE_p_hivgene swig_types[9]
+#define SWIGTYPE_p_hivpopulation swig_types[10]
+#define SWIGTYPE_p_index_value_pair_t swig_types[11]
+#define SWIGTYPE_p_int swig_types[12]
+#define SWIGTYPE_p_istream swig_types[13]
+#define SWIGTYPE_p_key_type swig_types[14]
+#define SWIGTYPE_p_mapped_type swig_types[15]
+#define SWIGTYPE_p_multi_locus_genealogy swig_types[16]
+#define SWIGTYPE_p_node_t swig_types[17]
+#define SWIGTYPE_p_ostream swig_types[18]
+#define SWIGTYPE_p_p_PyObject swig_types[19]
+#define SWIGTYPE_p_poly_t swig_types[20]
+#define SWIGTYPE_p_rooted_tree swig_types[21]
+#define SWIGTYPE_p_size_type swig_types[22]
+#define SWIGTYPE_p_stat_t swig_types[23]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[24]
+#define SWIGTYPE_p_std__allocatorT_node_t_t swig_types[25]
+#define SWIGTYPE_p_std__allocatorT_poly_t_t swig_types[26]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_tree_key_t_const_edge_t_t_t swig_types[27]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_tree_key_t_const_node_t_t_t swig_types[28]
+#define SWIGTYPE_p_std__allocatorT_step_t_t swig_types[29]
+#define SWIGTYPE_p_std__allocatorT_tree_key_t_t swig_types[30]
+#define SWIGTYPE_p_std__invalid_argument swig_types[31]
+#define SWIGTYPE_p_std__lessT_tree_key_t_t swig_types[32]
+#define SWIGTYPE_p_std__listT_tree_key_t_t swig_types[33]
+#define SWIGTYPE_p_std__mapT_tree_key_t_edge_t_t swig_types[34]
+#define SWIGTYPE_p_std__mapT_tree_key_t_node_t_t swig_types[35]
+#define SWIGTYPE_p_std__vectorT_int_t swig_types[36]
+#define SWIGTYPE_p_std__vectorT_node_t_t swig_types[37]
+#define SWIGTYPE_p_std__vectorT_poly_t_t swig_types[38]
+#define SWIGTYPE_p_std__vectorT_step_t_t swig_types[39]
+#define SWIGTYPE_p_std__vectorT_tree_key_t_t swig_types[40]
+#define SWIGTYPE_p_step_t swig_types[41]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[42]
+#define SWIGTYPE_p_tree_key_t swig_types[43]
+#define SWIGTYPE_p_value_type swig_types[44]
+static swig_type_info *swig_types[46];
+static swig_module_info swig_module = {swig_types, 45, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#ifdef SWIG_TypeQuery
+# undef SWIG_TypeQuery
+#endif
+#define SWIG_TypeQuery SWIG_Python_TypeQuery
+
+/*-----------------------------------------------
+ @(target):= _FFPopSim.so
+ ------------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+# define SWIG_init PyInit__FFPopSim
+
+#else
+# define SWIG_init init_FFPopSim
+
+#endif
+
+#ifdef __cplusplus
+#include
+/* SwigValueWrapper is described in swig.swg */
+template class SwigValueWrapper {
+ struct SwigSmartPointer {
+ T *ptr;
+ SwigSmartPointer(T *p) : ptr(p) { }
+ ~SwigSmartPointer() { delete ptr; }
+ SwigSmartPointer& operator=(SwigSmartPointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+ void reset(T *p) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = p; }
+ } pointer;
+ SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
+ SwigValueWrapper(const SwigValueWrapper& rhs);
+public:
+ SwigValueWrapper() : pointer(0) { }
+ SwigValueWrapper& operator=(const T& t) { SwigSmartPointer tmp(new T(t)); pointer = tmp; return *this; }
+#if __cplusplus >=201103L
+ SwigValueWrapper& operator=(T&& t) { SwigSmartPointer tmp(new T(std::move(t))); pointer = tmp; return *this; }
+ operator T&&() const { return std::move(*pointer.ptr); }
+#else
+ operator T&() const { return *pointer.ptr; }
+#endif
+ T *operator&() const { return pointer.ptr; }
+ static void reset(SwigValueWrapper& t, T *p) { t.pointer.reset(p); }
+};
+
+/*
+ * SwigValueInit() is a generic initialisation solution as the following approach:
+ *
+ * T c_result = T();
+ *
+ * doesn't compile for all types for example:
+ *
+ * unsigned int c_result = unsigned int();
+ */
+template T SwigValueInit() {
+ return T();
+}
+
+#if __cplusplus >=201103L
+# define SWIG_STD_MOVE(OBJ) std::move(OBJ)
+#else
+# define SWIG_STD_MOVE(OBJ) OBJ
+#endif
+
+#endif
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a))
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a))
+
+
+#include
+
+
+namespace swig {
+ class SwigPtr_PyObject {
+ protected:
+ PyObject *_obj;
+
+ public:
+ SwigPtr_PyObject() :_obj(0)
+ {
+ }
+
+ SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
+ {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ SWIG_Py_XINCREF(_obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
+ }
+
+ SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
+ {
+ if (initial_ref) {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ SWIG_Py_XINCREF(_obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
+ }
+ }
+
+ SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item)
+ {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ SWIG_Py_XINCREF(item._obj);
+ SWIG_Py_XDECREF(_obj);
+ _obj = item._obj;
+ SWIG_PYTHON_THREAD_END_BLOCK;
+ return *this;
+ }
+
+ ~SwigPtr_PyObject()
+ {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ SWIG_Py_XDECREF(_obj);
+ SWIG_PYTHON_THREAD_END_BLOCK;
+ }
+
+ operator PyObject *() const
+ {
+ return _obj;
+ }
+
+ PyObject *operator->() const
+ {
+ return _obj;
+ }
+ };
+}
+
+
+namespace swig {
+ struct SwigVar_PyObject : SwigPtr_PyObject {
+ SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
+
+ SwigVar_PyObject & operator = (PyObject* obj)
+ {
+ SWIG_Py_XDECREF(_obj);
+ _obj = obj;
+ return *this;
+ }
+ };
+}
+
+
+#define SWIG_FILE_WITH_INIT
+#include "../ffpopsim_generic.h"
+#include "../ffpopsim_lowd.h"
+#include "../ffpopsim_highd.h"
+#include "../hivpopulation.h"
+
+
+#include
+
+
+#include
+
+#if PY_VERSION_HEX >= 0x03020000
+# define SWIGPY_SLICEOBJECT PyObject
+#else
+# define SWIGPY_SLICEOBJECT PySliceObject
+#endif
+
+
+#include
+#include
+
+
+#if defined(__GNUC__)
+# if __GNUC__ == 2 && __GNUC_MINOR <= 96
+# define SWIG_STD_NOMODERN_STL
+# endif
+#endif
+
+
+#include
+
+
+namespace swig {
+ struct stop_iteration {
+ };
+
+ struct SwigPyIterator {
+ private:
+ SwigPtr_PyObject _seq;
+
+ protected:
+ SwigPyIterator(PyObject *seq) : _seq(seq)
+ {
+ }
+
+ public:
+ virtual ~SwigPyIterator() {}
+
+ // Access iterator method, required by Python
+ virtual PyObject *value() const = 0;
+
+ // Forward iterator method, required by Python
+ virtual SwigPyIterator *incr(size_t n = 1) = 0;
+
+ // Backward iterator method, very common in C++, but not required in Python
+ virtual SwigPyIterator *decr(size_t /*n*/ = 1)
+ {
+ throw stop_iteration();
+ }
+
+ // Random access iterator methods, but not required in Python
+ virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const
+ {
+ throw std::invalid_argument("operation not supported");
+ }
+
+ virtual bool equal (const SwigPyIterator &/*x*/) const
+ {
+ throw std::invalid_argument("operation not supported");
+ }
+
+ // C++ common/needed methods
+ virtual SwigPyIterator *copy() const = 0;
+
+ PyObject *next()
+ {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads
+ PyObject *obj = value();
+ incr();
+ SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads
+ return obj;
+ }
+
+ /* Make an alias for Python 3.x */
+ PyObject *__next__()
+ {
+ return next();
+ }
+
+ PyObject *previous()
+ {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads
+ decr();
+ PyObject *obj = value();
+ SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads
+ return obj;
+ }
+
+ SwigPyIterator *advance(ptrdiff_t n)
+ {
+ return (n > 0) ? incr(n) : decr(-n);
+ }
+
+ bool operator == (const SwigPyIterator& x) const
+ {
+ return equal(x);
+ }
+
+ bool operator != (const SwigPyIterator& x) const
+ {
+ return ! operator==(x);
+ }
+
+ SwigPyIterator& operator += (ptrdiff_t n)
+ {
+ return *advance(n);
+ }
+
+ SwigPyIterator& operator -= (ptrdiff_t n)
+ {
+ return *advance(-n);
+ }
+
+ SwigPyIterator* operator + (ptrdiff_t n) const
+ {
+ return copy()->advance(n);
+ }
+
+ SwigPyIterator* operator - (ptrdiff_t n) const
+ {
+ return copy()->advance(-n);
+ }
+
+ ptrdiff_t operator - (const SwigPyIterator& x) const
+ {
+ return x.distance(*this);
+ }
+
+ static swig_type_info* descriptor() {
+ static swig_type_info* desc = SWIG_TypeQuery("swig::SwigPyIterator *");
+ return desc;
+ }
+ };
+
+#if defined(SWIGPYTHON_BUILTIN)
+ inline PyObject* make_output_iterator_builtin (PyObject *pyself)
+ {
+ SWIG_Py_INCREF(pyself);
+ return pyself;
+ }
+#endif
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_double (PyObject *obj, double *val)
+{
+ int res = SWIG_TypeError;
+ if (PyFloat_Check(obj)) {
+ if (val) *val = PyFloat_AsDouble(obj);
+ return SWIG_OK;
+#if PY_VERSION_HEX < 0x03000000
+ } else if (PyInt_Check(obj)) {
+ if (val) *val = (double) PyInt_AsLong(obj);
+ return SWIG_OK;
+#endif
+ } else if (PyLong_Check(obj)) {
+ double v = PyLong_AsDouble(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ PyErr_Clear();
+ }
+ }
+#ifdef SWIG_PYTHON_CAST_MODE
+ {
+ int dispatch = 0;
+ double d = PyFloat_AsDouble(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = d;
+ return SWIG_AddCast(SWIG_OK);
+ } else {
+ PyErr_Clear();
+ }
+ if (!dispatch) {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
+ } else {
+ PyErr_Clear();
+ }
+ }
+ }
+#endif
+ return res;
+}
+
+
+#include
+
+
+#include
+
+
+SWIGINTERNINLINE int
+SWIG_CanCastAsInteger(double *d, double min, double max) {
+ double x = *d;
+ if ((min <= x && x <= max)) {
+ double fx, cx, rd;
+ errno = 0;
+ fx = floor(x);
+ cx = ceil(x);
+ rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */
+ if ((errno == EDOM) || (errno == ERANGE)) {
+ errno = 0;
+ } else {
+ double summ, reps, diff;
+ if (rd < x) {
+ diff = x - rd;
+ } else if (rd > x) {
+ diff = rd - x;
+ } else {
+ return 1;
+ }
+ summ = rd + x;
+ reps = diff/summ;
+ if (reps < 8*DBL_EPSILON) {
+ *d = rd;
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
+{
+#if PY_VERSION_HEX < 0x03000000
+ if (PyInt_Check(obj)) {
+ long v = PyInt_AsLong(obj);
+ if (v >= 0) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ return SWIG_OverflowError;
+ }
+ } else
+#endif
+ if (PyLong_Check(obj)) {
+ unsigned long v = PyLong_AsUnsignedLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ PyErr_Clear();
+ return SWIG_OverflowError;
+ }
+ }
+#ifdef SWIG_PYTHON_CAST_MODE
+ {
+ int dispatch = 0;
+ unsigned long v = PyLong_AsUnsignedLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_AddCast(SWIG_OK);
+ } else {
+ PyErr_Clear();
+ }
+ if (!dispatch) {
+ double d;
+ int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+ // Largest double not larger than ULONG_MAX (not portably calculated easily)
+ // Note that double(ULONG_MAX) is stored in a double rounded up by one (for 64-bit unsigned long)
+ // 0xfffffffffffff800ULL == (uint64_t)std::nextafter(double(__uint128_t(ULONG_MAX)+1), double(0))
+ const double ulong_max = sizeof(unsigned long) == 8 ? 0xfffffffffffff800ULL : ULONG_MAX;
+ if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ulong_max)) {
+ if (val) *val = (unsigned long)(d);
+ return res;
+ }
+ }
+ }
+#endif
+ return SWIG_TypeError;
+}
+
+
+#include
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+# define LLONG_MAX __LONG_LONG_MAX__
+# define LLONG_MIN (-LLONG_MAX - 1LL)
+# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+#if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE)
+# define SWIG_LONG_LONG_AVAILABLE
+#endif
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val)
+{
+ int res = SWIG_TypeError;
+ if (PyLong_Check(obj)) {
+ unsigned long long v = PyLong_AsUnsignedLongLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ PyErr_Clear();
+ res = SWIG_OverflowError;
+ }
+ } else {
+ unsigned long v;
+ res = SWIG_AsVal_unsigned_SS_long (obj,&v);
+ if (SWIG_IsOK(res)) {
+ if (val) *val = v;
+ return res;
+ }
+ }
+#ifdef SWIG_PYTHON_CAST_MODE
+ {
+ const double mant_max = 1LL << DBL_MANT_DIG;
+ double d;
+ res = SWIG_AsVal_double (obj,&d);
+ if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max))
+ return SWIG_OverflowError;
+ if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
+ if (val) *val = (unsigned long long)(d);
+ return SWIG_AddCast(res);
+ }
+ res = SWIG_TypeError;
+ }
+#endif
+ return res;
+}
+#endif
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_size_t (PyObject * obj, size_t *val)
+{
+ int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+ if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+ unsigned long v;
+ res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+ if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+ } else if (sizeof(size_t) <= sizeof(unsigned long long)) {
+ unsigned long long v;
+ res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0);
+ if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+ }
+#endif
+ return res;
+}
+
+
+ #define SWIG_From_long PyInt_FromLong
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE PyObject*
+SWIG_From_long_SS_long (long long value)
+{
+ return ((value < LONG_MIN) || (value > LONG_MAX)) ?
+ PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value));
+}
+#endif
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_ptrdiff_t (ptrdiff_t value)
+{
+#ifdef SWIG_LONG_LONG_AVAILABLE
+ if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+ return SWIG_From_long (static_cast< long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+ } else {
+ /* assume sizeof(ptrdiff_t) <= sizeof(long long) */
+ return SWIG_From_long_SS_long (static_cast< long long >(value));
+ }
+#endif
+}
+
+
+SWIGINTERNINLINE PyObject*
+ SWIG_From_bool (bool value)
+{
+ return PyBool_FromLong(value ? 1 : 0);
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_long (PyObject *obj, long* val)
+{
+#if PY_VERSION_HEX < 0x03000000
+ if (PyInt_Check(obj)) {
+ if (val) *val = PyInt_AsLong(obj);
+ return SWIG_OK;
+ } else
+#endif
+ if (PyLong_Check(obj)) {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ PyErr_Clear();
+ return SWIG_OverflowError;
+ }
+ }
+#ifdef SWIG_PYTHON_CAST_MODE
+ {
+ int dispatch = 0;
+ long v = PyInt_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_AddCast(SWIG_OK);
+ } else {
+ PyErr_Clear();
+ }
+ if (!dispatch) {
+ double d;
+ int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+ // Largest double not larger than LONG_MAX (not portably calculated easily)
+ // Note that double(LONG_MAX) is stored in a double rounded up by one (for 64-bit long)
+ // 0x7ffffffffffffc00LL == (int64_t)std::nextafter(double(__uint128_t(LONG_MAX)+1), double(0))
+ const double long_max = sizeof(long) == 8 ? 0x7ffffffffffffc00LL : LONG_MAX;
+ // No equivalent needed for 64-bit double(LONG_MIN) is exactly LONG_MIN
+ if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, long_max)) {
+ if (val) *val = (long)(d);
+ return res;
+ }
+ }
+ }
+#endif
+ return SWIG_TypeError;
+}
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_long_SS_long (PyObject *obj, long long *val)
+{
+ int res = SWIG_TypeError;
+ if (PyLong_Check(obj)) {
+ long long v = PyLong_AsLongLong(obj);
+ if (!PyErr_Occurred()) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ PyErr_Clear();
+ res = SWIG_OverflowError;
+ }
+ } else {
+ long v;
+ res = SWIG_AsVal_long (obj,&v);
+ if (SWIG_IsOK(res)) {
+ if (val) *val = v;
+ return res;
+ }
+ }
+#ifdef SWIG_PYTHON_CAST_MODE
+ {
+ const double mant_max = 1LL << DBL_MANT_DIG;
+ const double mant_min = -mant_max;
+ double d;
+ res = SWIG_AsVal_double (obj,&d);
+ if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max))
+ return SWIG_OverflowError;
+ if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) {
+ if (val) *val = (long long)(d);
+ return SWIG_AddCast(res);
+ }
+ res = SWIG_TypeError;
+ }
+#endif
+ return res;
+}
+#endif
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val)
+{
+ int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+ if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+ long v;
+ res = SWIG_AsVal_long (obj, val ? &v : 0);
+ if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+ } else if (sizeof(ptrdiff_t) <= sizeof(long long)) {
+ long long v;
+ res = SWIG_AsVal_long_SS_long (obj, val ? &v : 0);
+ if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+ }
+#endif
+ return res;
+}
+
+
+#include
+
+
+#include
+
+
+#include
+
+
+#include
+
+
+#include