Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save wolfv/7ca864345f38bfe31b846b04e4eba3c1 to your computer and use it in GitHub Desktop.
Save wolfv/7ca864345f38bfe31b846b04e4eba3c1 to your computer and use it in GitHub Desktop.
Problems explorations for libmambapy
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "6804a4e2",
"metadata": {},
"outputs": [],
"source": [
"import libmambapy\n",
"from mamba.utils import load_channels\n",
"import tempfile\n",
"import pathlib\n",
"import json\n",
"libmambapy.PackageInfo.__str__ = lambda self: self.name + \"-\" + self.version + \"-\" + self.build_string"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "62a32f83",
"metadata": {},
"outputs": [],
"source": [
"def create_package(name, version, dependencies=[], constraints=[], build_number=0, build_string=\"bstring\"):\n",
" return {\n",
" \"name\": name,\n",
" \"version\": version,\n",
" \"build_number\": build_number,\n",
" \"build_string\": build_string,\n",
" \"version\": version,\n",
" \"depends\": dependencies,\n",
" \"constraints\": constraints\n",
" }\n",
"\n",
"def create_repodata(d, packages):\n",
" d = pathlib.Path(d)\n",
" (d / \"noarch\").mkdir()\n",
" repodata_file = d / \"noarch\" / \"repodata.json\"\n",
" repodata = {}\n",
" repodata[\"packages\"] = {}\n",
" for p in packages:\n",
" repodata[\"packages\"][f\"{p['name']}-{p['version']}-{p['build_string']}.tar.bz2\"] = p\n",
" repodata_file.write_text(json.dumps(repodata))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3ab82482",
"metadata": {},
"outputs": [],
"source": [
"repos = []\n",
"pool = libmambapy.Pool()\n",
"\n",
"with tempfile.TemporaryDirectory() as d:\n",
" create_repodata(d, [\n",
" create_package(\"A\", \"0.1.0\"),\n",
" create_package(\"A\", \"0.2.0\"),\n",
" create_package(\"A\", \"0.3.0\")]\n",
" )\n",
" \n",
" # change this to point where you cloned mamba\n",
" channels = [\n",
" f\"file:///{d}\"\n",
" ]\n",
"\n",
" subdirs = load_channels(pool, channels, repos, prepend=False, platform=\"linux-64\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "b753bd4f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(<libmambapy.bindings.SubdirData at 0x113962ef0>,\n",
" {'platform': 'linux-64',\n",
" 'url': 'file:////var/folders/4x/plfnxvhs0rg43pttd200crxr0000gn/T/tmp0xqx8i95/linux-64',\n",
" 'channel': tmp0xqx8i95[linux-64,noarch]}),\n",
" (<libmambapy.bindings.SubdirData at 0x1077c3e70>,\n",
" {'platform': 'noarch',\n",
" 'url': 'file:////var/folders/4x/plfnxvhs0rg43pttd200crxr0000gn/T/tmp0xqx8i95/noarch',\n",
" 'channel': tmp0xqx8i95[linux-64,noarch]})]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"subdirs"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "0689068c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n"
]
}
],
"source": [
"specs = [\n",
" \"A=0.4.0\"\n",
"]\n",
"\n",
"solver_options = [(libmambapy.SOLVER_FLAG_ALLOW_DOWNGRADE, 1)]\n",
"solver = libmambapy.Solver(pool, solver_options)\n",
"\n",
"solver.add_jobs(specs, libmambapy.SOLVER_INSTALL)\n",
"success = solver.solve()\n",
"print(success)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "fc0bf159",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[<libmambapy.bindings.SolverProblem object at 0x11381a0b0>]\n"
]
}
],
"source": [
"problems = solver.all_problems_structured()\n",
"print(problems)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0fc80384",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SolverRuleinfo.SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP : 0 ➔ -2147483644 ➔ 259\n"
]
}
],
"source": [
"for p in problems:\n",
" print(\"{_type:>40} : {source} ➔ {dep} ➔ {target}\".format(\n",
" _type=str(p.type),\n",
" source=str(p.source_id),\n",
" dep=p.dep_id,\n",
" target=str(p.target_id)\n",
" ))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "8b818ae4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SolverRuleinfo.SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP : None ➔ a 0.4.0** ➔ None\n"
]
}
],
"source": [
"for p in problems:\n",
" print(\"{_type:>40} : {source} ➔ {dep} ➔ {target}\".format(\n",
" _type=str(p.type),\n",
" source=str(p.source()),\n",
" dep=p.dep(),\n",
" target=str(p.target())\n",
" ))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "396954d6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SolverRuleinfo.SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP : nothing provides requested a 0.4.0**\n"
]
}
],
"source": [
"for p in problems:\n",
" print(\"{_type:>40} : {problemstr}\".format(\n",
" _type=str(p.type),\n",
" problemstr=str(p),\n",
" ))"
]
},
{
"attachments": {
"image.png": {
"image/png": "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"
}
},
"cell_type": "markdown",
"id": "f86bc53f",
"metadata": {},
"source": [
"The example given by Natalie Weizenbaum (image credits https://nex3.medium.com/pubgrub-2fb6470504f)\n",
"\n",
"![image.png](attachment:image.png)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "2083ad45",
"metadata": {},
"outputs": [],
"source": [
"repos = []\n",
"pool = libmambapy.Pool()\n",
"\n",
"with tempfile.TemporaryDirectory() as d:\n",
" create_repodata(d, [\n",
" create_package(\"menu\", \"1.5.0\", dependencies=[\"dropdown=2.*\"]),\n",
" create_package(\"menu\", \"1.4.0\", dependencies=[\"dropdown=2.*\"]),\n",
" create_package(\"menu\", \"1.3.0\", dependencies=[\"dropdown=2.*\"]),\n",
" create_package(\"menu\", \"1.2.0\", dependencies=[\"dropdown=2.*\"]),\n",
" create_package(\"menu\", \"1.0.0\", dependencies=[\"dropdown=1.*\"]),\n",
" create_package(\"dropdown\", \"2.3.0\", dependencies=[\"icons=2.*\"]),\n",
" create_package(\"dropdown\", \"2.2.0\", dependencies=[\"icons=2.*\"]),\n",
" create_package(\"dropdown\", \"2.1.0\", dependencies=[\"icons=2.*\"]),\n",
" create_package(\"dropdown\", \"2.0.0\", dependencies=[\"icons=2.*\"]),\n",
" create_package(\"dropdown\", \"1.8.0\", dependencies=[\"icons=1.*\", \"intl=3.*\"]),\n",
" create_package(\"icons\", \"2.0.0\"), \n",
" create_package(\"icons\", \"1.0.0\"), \n",
" create_package(\"intl\", \"5.0.0\"), \n",
" create_package(\"intl\", \"4.0.0\"), \n",
" create_package(\"intl\", \"3.0.0\"),\n",
" ])\n",
" \n",
" # change this to point where you cloned mamba\n",
" channels = [\n",
" f\"file:///{d}\"\n",
" ]\n",
"\n",
" subdirs = load_channels(pool, channels, repos, prepend=False, platform=\"linux-64\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "48d73065",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n"
]
}
],
"source": [
"specs = [\n",
" \"menu\", \"icons=1.*\", \"intl=5.*\"\n",
"]\n",
"spec_names = [\"menu\", \"icons\", \"intl\"]\n",
"\n",
"solver_options = [(libmambapy.SOLVER_FLAG_ALLOW_DOWNGRADE, 1)]\n",
"solver = libmambapy.Solver(pool, solver_options)\n",
"\n",
"solver.add_jobs(specs, libmambapy.SOLVER_INSTALL)\n",
"success = solver.solve()\n",
"print(success)"
]
},
{
"cell_type": "markdown",
"id": "ccc11db9",
"metadata": {},
"source": [
"### Ideal output (from PubGrub)\n",
"\n",
"Because dropdown >=2.0.0 depends on icons >=2.0.0 and root depends\n",
" on icons <2.0.0, dropdown >=2.0.0 is forbidden.\n",
"\n",
"And because menu >=1.1.0 depends on dropdown >=2.0.0, menu >=1.1.0\n",
" is forbidden.\n",
"\n",
"And because menu <1.1.0 depends on dropdown >=1.0.0 <2.0.0 which\n",
" depends on intl <4.0.0, every version of menu requires intl\n",
" <4.0.0.\n",
"\n",
"So, because root depends on both menu >=1.0.0 and intl >=5.0.0,\n",
" version solving failed."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "ca1d638f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[<libmambapy.bindings.SolverProblem object at 0x10776fa30>, <libmambapy.bindings.SolverProblem object at 0x113992f30>, <libmambapy.bindings.SolverProblem object at 0x113992970>, <libmambapy.bindings.SolverProblem object at 0x1139926b0>, <libmambapy.bindings.SolverProblem object at 0x113992670>, <libmambapy.bindings.SolverProblem object at 0x1139924f0>, <libmambapy.bindings.SolverProblem object at 0x113992e70>, <libmambapy.bindings.SolverProblem object at 0x113992f70>, <libmambapy.bindings.SolverProblem object at 0x113992bf0>, <libmambapy.bindings.SolverProblem object at 0x113992bb0>, <libmambapy.bindings.SolverProblem object at 0x1139925f0>, <libmambapy.bindings.SolverProblem object at 0x113992870>, <libmambapy.bindings.SolverProblem object at 0x1139929b0>, <libmambapy.bindings.SolverProblem object at 0x113992d30>, <libmambapy.bindings.SolverProblem object at 0x1139927f0>]\n",
" SolverRuleinfo.SOLVER_RULE_JOB : conflicting requests\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package menu-1.0.0 requires dropdown 1.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package menu-1.5.0 requires dropdown 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package menu-1.4.0 requires dropdown 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package menu-1.3.0 requires dropdown 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package menu-1.2.0 requires dropdown 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package dropdown-1.8.0 requires intl 3.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package dropdown-2.3.0 requires icons 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package dropdown-2.2.0 requires icons 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package dropdown-2.1.0 requires icons 2.**, but none of the providers can be installed\n",
" SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES : package dropdown-2.0.0 requires icons 2.**, but none of the providers can be installed\n",
"SolverRuleinfo.SOLVER_RULE_PKG_SAME_NAME : cannot install both intl-3.0.0 and intl-5.0.0\n",
"SolverRuleinfo.SOLVER_RULE_PKG_SAME_NAME : cannot install both icons-1.0.0 and icons-2.0.0\n",
" SolverRuleinfo.SOLVER_RULE_JOB : conflicting requests\n",
" SolverRuleinfo.SOLVER_RULE_JOB : conflicting requests\n"
]
}
],
"source": [
"problems = solver.all_problems_structured()\n",
"print(problems)\n",
"for p in problems:\n",
" print(\"{_type:>40} : {problemstr}\".format(\n",
" _type=str(p.type),\n",
" problemstr=str(p),\n",
" ))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "a6d2f4f9",
"metadata": {},
"outputs": [],
"source": [
"# problems_sorted = []\n",
"# problem_roots = []\n",
"# dep_id_2_problem\n",
"# for p in reversed(problems):\n",
"# if (p.type == libmambapy.SolverRuleinfo.SOLVER_RULE_PKG_SAME_NAME):\n",
"# print(p)\n",
"# problem_roots.append(p.source().name)\n",
"# if (p.type == libmambapy.SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES):\n",
"# pass"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "df096605",
"metadata": {},
"outputs": [],
"source": [
"# problem_roots"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "28fb07c4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 203 259\n",
"6 -2147483642 0\n",
"2 -2147483647 0\n",
"3 -2147483647 0\n",
"4 -2147483647 0\n",
"5 -2147483647 0\n",
"11 -2147483634 0\n",
"7 -2147483640 0\n",
"8 -2147483640 0\n",
"9 -2147483640 0\n",
"10 -2147483640 0\n",
"16 0 14\n",
"13 0 12\n",
"4 -2147483626 259\n",
"2 -2147483627 259\n"
]
}
],
"source": [
"for p in problems:\n",
"# print(p.source(), p.dep(), p.target())\n",
" print(p.source_id, p.dep_id, p.target_id)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "5682abab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-2147483640"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"problems[-5].dep_id"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "fd6d0df5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[12]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pool.select_solvables(problems[-5].dep_id)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "a6b84d19",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[7, 8, 9, 10]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sxs = pool.select_solvables(problems[3].dep_id)\n",
"sxs"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "967c92b7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dropdown-2.2.0-\n"
]
}
],
"source": [
"print(pool.id2pkginfo(sxs[1]))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "be4a234a",
"metadata": {},
"outputs": [],
"source": [
"ms_id = pool.matchspec2id(\"intl\")"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "e5172992",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[14, 15, 16]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pool.select_solvables(ms_id)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment