mirror of
https://github.com/ANL-CEEESA/MIPLearn.git
synced 2025-12-06 01:18:52 -06:00
Implement MemorizingCutsComponent; STAB: switch to edge formulation
This commit is contained in:
@@ -108,7 +108,11 @@
|
||||
"execution_count": 1,
|
||||
"id": "f14e560c-ef9f-4c48-8467-72d6acce5f9f",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
"tags": [],
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.409419720Z",
|
||||
"start_time": "2023-11-07T16:29:47.824353556Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -126,10 +130,11 @@
|
||||
"8 [ 8.47 21.9 16.58 15.37 3.76 3.91 1.57 20.57 14.76 18.61] 94.58\n",
|
||||
"9 [ 8.57 22.77 17.06 16.25 4.14 4. 1.56 22.97 14.09 19.09] 100.79\n",
|
||||
"\n",
|
||||
"Restricted license - for non-production use only - expires 2024-10-28\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 20 rows, 110 columns and 210 nonzeros\n",
|
||||
"Model fingerprint: 0x1ff9913f\n",
|
||||
@@ -154,22 +159,14 @@
|
||||
"H 0 0 2.0000000 1.27484 36.3% - 0s\n",
|
||||
" 0 0 1.27484 0 4 2.00000 1.27484 36.3% - 0s\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (38 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Explored 1 nodes (38 simplex iterations) in 0.02 seconds (0.00 work units)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 3: 2 4 5 \n",
|
||||
"\n",
|
||||
"Optimal solution found (tolerance 1.00e-04)\n",
|
||||
"Best objective 2.000000000000e+00, best bound 2.000000000000e+00, gap 0.0000%\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/home/axavier/.conda/envs/miplearn2/lib/python3.9/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
||||
" from .autonotebook import tqdm as notebook_tqdm\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
@@ -304,7 +301,12 @@
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "1ce5f8fb-2769-4fbd-a40c-fd62b897690a",
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.485068449Z",
|
||||
"start_time": "2023-11-07T16:29:48.406139946Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
@@ -323,8 +325,8 @@
|
||||
"\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 5 rows, 10 columns and 50 nonzeros\n",
|
||||
"Model fingerprint: 0xaf3ac15e\n",
|
||||
@@ -352,7 +354,7 @@
|
||||
" Cover: 1\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (4 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 2: -1279 -804 \n",
|
||||
"No other solutions better than -1279\n",
|
||||
@@ -470,7 +472,12 @@
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "4e0e4223-b4e0-4962-a157-82a23a86e37d",
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.575025403Z",
|
||||
"start_time": "2023-11-07T16:29:48.453962705Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
@@ -493,8 +500,8 @@
|
||||
"\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 21 rows, 110 columns and 220 nonzeros\n",
|
||||
"Model fingerprint: 0x8d8d9346\n",
|
||||
@@ -529,7 +536,7 @@
|
||||
"* 0 0 0 91.2300000 91.23000 0.00% - 0s\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (70 simplex iterations) in 0.02 seconds (0.00 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 10: 91.23 93.92 93.98 ... 368.79\n",
|
||||
"\n",
|
||||
@@ -643,7 +650,12 @@
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "3224845b-9afd-463e-abf4-e0e93d304859",
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.804292323Z",
|
||||
"start_time": "2023-11-07T16:29:48.492933268Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
@@ -660,8 +672,8 @@
|
||||
"\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 5 rows, 10 columns and 28 nonzeros\n",
|
||||
"Model fingerprint: 0xe5c2d4fa\n",
|
||||
@@ -676,8 +688,8 @@
|
||||
"Presolve time: 0.00s\n",
|
||||
"Presolve: All rows and columns removed\n",
|
||||
"\n",
|
||||
"Explored 0 nodes (0 simplex iterations) in 0.00 seconds (0.00 work units)\n",
|
||||
"Thread count was 1 (of 32 available processors)\n",
|
||||
"Explored 0 nodes (0 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 1 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 1: 213.49 \n",
|
||||
"\n",
|
||||
@@ -775,8 +787,9 @@
|
||||
"id": "cc797da7",
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"jupyter": {
|
||||
"outputs_hidden": false
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.806917868Z",
|
||||
"start_time": "2023-11-07T16:29:48.781619530Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
@@ -795,8 +808,8 @@
|
||||
"\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 5 rows, 10 columns and 28 nonzeros\n",
|
||||
"Model fingerprint: 0x4ee91388\n",
|
||||
@@ -811,9 +824,8 @@
|
||||
"Presolve time: 0.00s\n",
|
||||
"Presolve: All rows and columns removed\n",
|
||||
"\n",
|
||||
"Explored 0 nodes (0 simplex iterations) in 0.00 seconds (0.00 work units)\n",
|
||||
"Thread count was 1 (of 32 available processors)\n",
|
||||
"\n",
|
||||
"Explored 0 nodes (0 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 1 (of 12 available processors)\n",
|
||||
"Solution count 2: -1986.37 -1265.56 \n",
|
||||
"No other solutions better than -1986.37\n",
|
||||
"\n",
|
||||
@@ -875,11 +887,10 @@
|
||||
"$$\n",
|
||||
"\\begin{align*}\n",
|
||||
"\\text{minimize} \\;\\;\\; & -\\sum_{v \\in V} w_v x_v \\\\\n",
|
||||
"\\text{such that} \\;\\;\\; & \\sum_{v \\in C} x_v \\leq 1 & \\forall C \\in \\mathcal{C} \\\\\n",
|
||||
"\\text{such that} \\;\\;\\; & x_v + x_u \\leq 1 & \\forall (v,u) \\in E \\\\\n",
|
||||
"& x_v \\in \\{0, 1\\} & \\forall v \\in V\n",
|
||||
"\\end{align*}\n",
|
||||
"$$\n",
|
||||
"where $\\mathcal{C}$ is the set of cliques in $G$. We recall that a clique is a subset of vertices in which every pair of vertices is adjacent."
|
||||
"$$"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -903,7 +914,12 @@
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "0f996e99-0ec9-472b-be8a-30c9b8556931",
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.954896857Z",
|
||||
"start_time": "2023-11-07T16:29:48.825579097Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
@@ -913,13 +929,14 @@
|
||||
"weights[0] [37.45 95.07 73.2 59.87 15.6 15.6 5.81 86.62 60.11 70.81]\n",
|
||||
"weights[1] [ 2.06 96.99 83.24 21.23 18.18 18.34 30.42 52.48 43.19 29.12]\n",
|
||||
"\n",
|
||||
"Set parameter PreCrush to value 1\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 10 rows, 10 columns and 24 nonzeros\n",
|
||||
"Model fingerprint: 0xf4c21689\n",
|
||||
"Optimize a model with 15 rows, 10 columns and 30 nonzeros\n",
|
||||
"Model fingerprint: 0x3240ea4a\n",
|
||||
"Variable types: 0 continuous, 10 integer (10 binary)\n",
|
||||
"Coefficient statistics:\n",
|
||||
" Matrix range [1e+00, 1e+00]\n",
|
||||
@@ -927,26 +944,28 @@
|
||||
" Bounds range [1e+00, 1e+00]\n",
|
||||
" RHS range [1e+00, 1e+00]\n",
|
||||
"Found heuristic solution: objective -219.1400000\n",
|
||||
"Presolve removed 2 rows and 2 columns\n",
|
||||
"Presolve removed 7 rows and 2 columns\n",
|
||||
"Presolve time: 0.00s\n",
|
||||
"Presolved: 8 rows, 8 columns, 19 nonzeros\n",
|
||||
"Variable types: 0 continuous, 8 integer (8 binary)\n",
|
||||
"\n",
|
||||
"Root relaxation: objective -2.205650e+02, 4 iterations, 0.00 seconds (0.00 work units)\n",
|
||||
"Root relaxation: objective -2.205650e+02, 5 iterations, 0.00 seconds (0.00 work units)\n",
|
||||
"\n",
|
||||
" Nodes | Current Node | Objective Bounds | Work\n",
|
||||
" Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time\n",
|
||||
"\n",
|
||||
" 0 0 infeasible 0 -219.14000 -219.14000 0.00% - 0s\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (4 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Explored 1 nodes (5 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 1: -219.14 \n",
|
||||
"No other solutions better than -219.14\n",
|
||||
"\n",
|
||||
"Optimal solution found (tolerance 1.00e-04)\n",
|
||||
"Best objective -2.191400000000e+02, best bound -2.191400000000e+02, gap 0.0000%\n"
|
||||
"Best objective -2.191400000000e+02, best bound -2.191400000000e+02, gap 0.0000%\n",
|
||||
"\n",
|
||||
"User-callback calls 300, time in user-callback 0.00 sec\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -956,7 +975,7 @@
|
||||
"from scipy.stats import uniform, randint\n",
|
||||
"from miplearn.problems.stab import (\n",
|
||||
" MaxWeightStableSetGenerator,\n",
|
||||
" build_stab_model_gurobipy,\n",
|
||||
" build_stab_model,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"# Set random seed to make example reproducible\n",
|
||||
@@ -979,7 +998,7 @@
|
||||
"print()\n",
|
||||
"\n",
|
||||
"# Load and optimize the first instance\n",
|
||||
"model = build_stab_model_gurobipy(data[0])\n",
|
||||
"model = build_stab_model(data[0])\n",
|
||||
"model.optimize()\n"
|
||||
]
|
||||
},
|
||||
@@ -1053,8 +1072,9 @@
|
||||
"id": "9d0c56c6",
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"jupyter": {
|
||||
"outputs_hidden": false
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:48.958833448Z",
|
||||
"start_time": "2023-11-07T16:29:48.898121017Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
@@ -1085,11 +1105,12 @@
|
||||
" [ 444. 398. 371. 454. 356. 476. 565. 374. 0. 274.]\n",
|
||||
" [ 668. 446. 317. 648. 469. 752. 394. 286. 274. 0.]]\n",
|
||||
"\n",
|
||||
"Set parameter PreCrush to value 1\n",
|
||||
"Set parameter LazyConstraints to value 1\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 10 rows, 45 columns and 90 nonzeros\n",
|
||||
"Model fingerprint: 0x719675e5\n",
|
||||
@@ -1114,7 +1135,7 @@
|
||||
" Lazy constraints: 3\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (17 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 1: 2921 \n",
|
||||
"\n",
|
||||
@@ -1263,8 +1284,9 @@
|
||||
"id": "6217da7c",
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"jupyter": {
|
||||
"outputs_hidden": false
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:49.061613905Z",
|
||||
"start_time": "2023-11-07T16:29:48.941857719Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
@@ -1300,8 +1322,8 @@
|
||||
"\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 578 rows, 360 columns and 2128 nonzeros\n",
|
||||
"Model fingerprint: 0x4dc1c661\n",
|
||||
@@ -1312,7 +1334,7 @@
|
||||
" Bounds range [1e+00, 1e+00]\n",
|
||||
" RHS range [1e+00, 1e+03]\n",
|
||||
"Presolve removed 244 rows and 131 columns\n",
|
||||
"Presolve time: 0.02s\n",
|
||||
"Presolve time: 0.01s\n",
|
||||
"Presolved: 334 rows, 229 columns, 842 nonzeros\n",
|
||||
"Variable types: 116 continuous, 113 integer (113 binary)\n",
|
||||
"Found heuristic solution: objective 440662.46430\n",
|
||||
@@ -1340,7 +1362,7 @@
|
||||
" Relax-and-lift: 7\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (234 simplex iterations) in 0.04 seconds (0.02 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 5: 364722 368600 374044 ... 440662\n",
|
||||
"\n",
|
||||
@@ -1450,7 +1472,12 @@
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "5fff7afe-5b7a-4889-a502-66751ec979bf",
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:49.075657363Z",
|
||||
"start_time": "2023-11-07T16:29:49.049561363Z"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
@@ -1462,8 +1489,8 @@
|
||||
"\n",
|
||||
"Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)\n",
|
||||
"\n",
|
||||
"CPU model: AMD Ryzen 9 7950X 16-Core Processor, instruction set [SSE2|AVX|AVX2|AVX512]\n",
|
||||
"Thread count: 16 physical cores, 32 logical processors, using up to 32 threads\n",
|
||||
"CPU model: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, instruction set [SSE2|AVX|AVX2]\n",
|
||||
"Thread count: 6 physical cores, 12 logical processors, using up to 12 threads\n",
|
||||
"\n",
|
||||
"Optimize a model with 15 rows, 10 columns and 30 nonzeros\n",
|
||||
"Model fingerprint: 0x2d2d1390\n",
|
||||
@@ -1487,7 +1514,7 @@
|
||||
" 0 0 infeasible 0 301.00000 301.00000 0.00% - 0s\n",
|
||||
"\n",
|
||||
"Explored 1 nodes (8 simplex iterations) in 0.01 seconds (0.00 work units)\n",
|
||||
"Thread count was 32 (of 32 available processors)\n",
|
||||
"Thread count was 12 (of 12 available processors)\n",
|
||||
"\n",
|
||||
"Solution count 1: 301 \n",
|
||||
"\n",
|
||||
@@ -1531,12 +1558,13 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 9,
|
||||
"id": "9f12e91f",
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"jupyter": {
|
||||
"outputs_hidden": false
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-07T16:29:49.075852252Z",
|
||||
"start_time": "2023-11-07T16:29:49.050243601Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
|
||||
Reference in New Issue
Block a user