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
32 changes: 32 additions & 0 deletions pygad/pygad.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,38 @@ def save(self, filename):
file.write(cloudpickle_serialized_object)
cloudpickle.dump(self, file)

def push_to_vilvik(self, *, api_key=None, **overrides):
"""Import this run into Vilvik (https://vilvik.com) as an editable,
continuable cloud record.

This is a thin convenience wrapper over the Vilvik SDK, which must be
installed separately::

pip install vilvik

After ``ga.run()``, call ``ga.push_to_vilvik()`` (sign in first with the
``vilvik login`` command or set the ``VILVIK_API_KEY`` environment
variable). All keyword arguments are forwarded to ``vilvik.push`` (for
example ``name=``, ``fitness_source=``, ``callbacks=``, ``preamble=``,
``dry_run=True``). Returns the created record, or a capture report when
``dry_run=True``.
"""
try:
import vilvik
except ImportError as exc:
raise ImportError(
"push_to_vilvik requires the Vilvik SDK. Install it with: "
"pip install vilvik"
) from exc

import pygad
return vilvik.push(
self,
api_key=api_key,
origin_overrides={"client": "pygad_wrapper", "pygad_version": pygad.__version__},
**overrides,
)

def load(filename):
"""
Reads a saved instance of the genetic algorithm:
Expand Down
38 changes: 38 additions & 0 deletions tests/test_push_to_vilvik.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import sys
import types
import pytest
import pygad


def _ga():
return pygad.GA(
num_generations=1, num_parents_mating=2, sol_per_pop=4, num_genes=3,
fitness_func=lambda ga_instance, solution, solution_idx: 0.0)


def test_push_to_vilvik_forwards_to_sdk(monkeypatch):
calls = {}
fake = types.ModuleType("vilvik")

def fake_push(ga, **kw):
calls["ga"] = ga
calls["kw"] = kw
return "RECORD"

fake.push = fake_push
monkeypatch.setitem(sys.modules, "vilvik", fake)

ga = _ga()
out = ga.push_to_vilvik(name="local run")
assert out == "RECORD"
assert calls["ga"] is ga
assert calls["kw"]["name"] == "local run"
assert calls["kw"]["origin_overrides"]["client"] == "pygad_wrapper"
assert calls["kw"]["origin_overrides"]["pygad_version"] == pygad.__version__


def test_push_to_vilvik_missing_sdk(monkeypatch):
monkeypatch.setitem(sys.modules, "vilvik", None) # forces `import vilvik` to raise ImportError
ga = _ga()
with pytest.raises(ImportError, match="pip install vilvik"):
ga.push_to_vilvik()
Loading