Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file.
### Removed
### Fixed
- [#1713](https://github.com/pints-team/pints/pull/1713) Fixed Numpy 2.4.1 compatibility issues.
- [#1690][https://github.com/pints-team/pints/pull/1690) Fixed bug in optimisation controller if population size left at `None`.


## [0.5.1] - 2025-09-26
Expand Down
4 changes: 4 additions & 0 deletions pints/_optimisers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,10 @@ def run(self):
pop_size = 1
if isinstance(self._optimiser, PopulationBasedOptimiser):
pop_size = self._optimiser.population_size()
if pop_size is None:
pop_size = self._optimiser.suggested_population_size(
n_workers if self._parallel else None)
self._optimiser.set_population_size(pop_size)
if self._log_to_screen:
print('Population size: ' + str(pop_size))

Expand Down
34 changes: 10 additions & 24 deletions pints/tests/test_opt_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,31 +364,17 @@ def test_stopping_no_criterion(self):
opt.set_max_unchanged_iterations(None)
self.assertRaises(ValueError, opt.run)

def test_set_population_size(self):
# Tests the set_population_size method for this optimiser.
def test_population_size_not_set(self):
# Population size can be None: then suggested should be used

r = pints.toy.RosenbrockError()
x = np.array([1.01, 1.01])
opt = pints.OptimisationController(r, x, method=method)
m = opt.optimiser()
n = m.population_size()
m.set_population_size(n + 1)
self.assertEqual(m.population_size(), n + 1)

# Test invalid size
self.assertRaisesRegex(
ValueError, 'at least 1', m.set_population_size, 0)

# test hyper parameter interface
self.assertEqual(m.n_hyper_parameters(), 1)
m.set_hyper_parameters([n + 2])
self.assertEqual(m.population_size(), n + 2)
self.assertRaisesRegex(
ValueError, 'at least 1', m.set_hyper_parameters, [0])

# Test changing during run
m.ask()
self.assertRaises(Exception, m.set_population_size, 2)
model = pints.toy.ParabolicError()
opt = pints.OptimisationController(model, [1, 1], method=pints.CMAES)
opt.optimiser().set_population_size(None)
opt.set_log_to_screen(True)
opt.set_max_iterations(3)
with StreamCapture() as c:
opt.run()
self.assertIn('Population size: 6', c.text())

def test_parallel(self):
# Test parallelised running.
Expand Down
53 changes: 53 additions & 0 deletions pints/tests/test_opt_population_based.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env python3
#
# Tests the shared methods of the PopulationBasedOptimiser
#
# This file is part of PINTS (https://github.com/pints-team/pints/) which is
# released under the BSD 3-clause license. See accompanying LICENSE.md for
# copyright notice and full license details.
#
import unittest

import numpy as np

import pints
import pints.toy


class TestPopulationBasedOptimiser(unittest.TestCase):
"""
Tests the shared methods of the PopulationBasedOptimiser.
"""
def setUp(self):
""" Called before every test """
np.random.seed(1)

def test_population_size(self):

r = pints.toy.RosenbrockError()
x = np.array([1.01, 1.01])
opt = pints.OptimisationController(r, x, method=pints.XNES)
m = opt.optimiser()
n = m.population_size()
m.set_population_size(n + 1)
self.assertEqual(m.population_size(), n + 1)

# Test invalid size
self.assertRaisesRegex(
ValueError, 'at least 1', m.set_population_size, 0)

# test hyper parameter interface
self.assertEqual(m.n_hyper_parameters(), 1)
m.set_hyper_parameters([n + 2])
self.assertEqual(m.population_size(), n + 2)
self.assertRaisesRegex(
ValueError, 'at least 1', m.set_hyper_parameters, [0])

# Test changing during run
m.ask()
self.assertRaises(Exception, m.set_population_size, 2)


if __name__ == '__main__':
unittest.main()