This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Latest commit

History

History
158 lines (127 loc) · 6.85 KB

File metadata and controls

158 lines (127 loc) · 6.85 KB

Python Modules

Adding new modules

  1. Create a new folder in the directory /src/python/modules with the name equals to adding module name (let's suppose it is <ModuleName>).

  2. Create an empty __init__.py file in your folder. This has to be done because /src/python folder is designed as a package.

  3. For each objective create a class implementing abstract class ITest (it is defined in the file /src/python/shared/ITest.py). Your class name must have the form <ModuleName><Objective>, where <Objective> is the type of objective this class is created for (BA, GMM etc.). The class file must have the same name as the class itself (i.e. <ModuleName><Objective>.py). As far as the /src/python designed as a package, imports in your class files must be relative to src/python directory. E.g.

    fromshared.ITestimportITest

    You need to implement the following methods:

    • prepare(self, input)

      Performs some preliminary work, e.g. converts input data into the format that tested AD framework needs. input parameter is a variable of type <Objective>Input. Such classes are defined in the files <Objective>Data.py in the folder /src/python/shared.

    • calculate_objective(self, times)

      Repeatedly calculates objective function given number of times.

    • calculate_jacobian(self, times)

      Repeatedly calculates objective function jacobian given number of times.

    • output(self)

      Returns an object of the class <Objective>Output contains calculated values. Such classes are defined in the files <Objective>Data.py.

  4. Configure python requirements for a new module:

    • Add the following line to /src/python/modules/CMakeLists.txt:

      add_subdirectory ("<ModuleName>")
    • In /src/python/modules/<ModuleName>/ create following files:

      • requirements.txt with python requirements. E.g.
        scipy>=1.3.1
        numpy>=1.11
        
      • CMakeLists.txt with the following content:
        project(<ModuleName>)
        execute_process(
        COMMAND${Python3_EXECUTABLE}"-m""pip""install""-r""${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
        )
        This command installs required pip packages on configure stage of CMake.
  5. Do not forget to add your module to the global runner script.

Unit Tests

For module testing unittest framework is used.

Adding a new module to common tests

All modules have common tests defined in the folder /test/python/modules/common. The file for the specified objective type has the name <objective>_tests.py, where <objective> is the objective type in the lowercase (e.g. ba). If you want to add your module to the module common test list then follow these steps:

  1. Open respected common test file.
  2. Find a test_params variable definition. It looks like this:
    # Parameters for different modules. They have the following form:# {# "path": <module path relative to src/python/modules directory>,# "tolerance": <tolerance for module output results># }test_params= [
    {
    "path": os.path.join("PyTorch", "PyTorchHand.py"),
    "tolerance": 1e-8
    },
    # other class information
    ]
  3. Add information of your objective class to this definition.

Adding a new common test

If you want to add a new test to common tests, add a new test method to the respected common test class. Method name must start with the test prefix and it must not take any parameters except self:

deftestSomeFeature(self):
# method body

Note, that before any test method running unittest framework calls setUp method of the test class. In the common test classes this method has the following form:

defsetUp(self):
module_path=os.path.join(MODULES_ROOT, self.params["path"])
self.test=module_load(module_path)
self.assertIsNotNone(self.test)

So, self.test variable holds an instance of your objective benchmark class.

You can use standard unittest assertion methods or additional assertion methods from the class TestClassWithAdditionalAsserts, defined in the file /test/python/modules/common/utils.py. This class is extended by common test classes.

Adding new objective common tests

If you want to add common tests for a new type of objective follow these steps:

  1. Add a new python file in the folder /test/python/modules/common. It could have any name but suggesting name is <objective>_tests.py where <objective> is a name of a new objective type in the lower case.

  2. Do any import you need for a new file and also import unittest module and utils.py file from the folder /test/python/modules/common:

    importunittestimportutils
  3. Create a test class inherited form utils.BaseTestClass. This base class has additional assertions and also provides parametrization, so you are able to create common tests for several modules using its.

  4. If you don't need parametrization, then just add the following code to the end of the file:

    if__name__=="__main__":
    unittest.main()

    If you need parametrization, then you should add something like this:

    test_params= [
    # array of test parameters
    ]
    if__name__=="__main__":
    suite=unittest.TestSuite()
    forparam_setintest_params:
    suite.addTest(utils.ParametrizedTestClass.parametrize(
    PythonModuleCommonGMMTests,
    params=param_set
    ))
    res=unittest.TextTestRunner(verbosity=2).run(suite)
    ifres.wasSuccessful():
    sys.exit(0)
    else:
    sys.exit(1)

    If such a code is added, then self.params variable of the test class object will store current test class parameters (respected element of your test_params array).

  5. You can make a new test file visible for GTest runner. Add the following lines to the file /test/python/modules/common/CMakeList.txt:

    add_test(NAME<TestsName>COMMAND${Python3_EXECUTABLE}"${CMAKE_SOURCE_DIR}/test/python/modules/common/<test_file_name>")

    Here <TestsName> is the displaying name of your tests for GTest, <test_file_name> is a name of the new common test file.

Test Running

You can run test file by a Python3 interpreter installed on your machine, e.g.:

python3 ba_tests.py

All test files that are made visible for GTest can be run using any GTest runner.