Example Minizinc Placement Models for 5G 97/35097/1
authorramkri123 <ramkri123@gmail.com>
Mon, 12 Mar 2018 01:33:39 +0000 (22:33 -0300)
committerramkri123 <ramkri123@gmail.com>
Mon, 12 Mar 2018 04:32:09 +0000 (01:32 -0300)
Issue-ID: OPTFRA-173
Change-Id: I245e64764d8dd6e9e254a79a97a7d49e228b125a
Signed-off-by: ramkri123 <ramkri123@gmail.com>
examples/placement-models-minizinc/5g-placement-scheduling/README [new file with mode: 0644]
examples/placement-models-minizinc/5g-placement-scheduling/gold-1.dzn [new file with mode: 0755]
examples/placement-models-minizinc/5g-placement-scheduling/gold-2.dzn [new file with mode: 0755]
examples/placement-models-minizinc/5g-placement-scheduling/gold-3.dzn [new file with mode: 0755]
examples/placement-models-minizinc/5g-placement-scheduling/gold-4.dzn [new file with mode: 0755]
examples/placement-models-minizinc/5g-placement-scheduling/gold.dzn [new file with mode: 0755]
examples/placement-models-minizinc/5g-placement-scheduling/network-slicing.ipynb [new file with mode: 0644]
examples/placement-models-minizinc/5g-placement-scheduling/placement.mzn [new file with mode: 0755]

diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/README b/examples/placement-models-minizinc/5g-placement-scheduling/README
new file mode 100644 (file)
index 0000000..210e3e8
--- /dev/null
@@ -0,0 +1,10 @@
+Build docker image:
+------------------
+sudo docker build --network=host -t placement-example .
+
+Run Jupyter lab demo:
+---------------------
+sudo docker run --name placement-example --network=host -it placement-example /bin/bash -c 'cd /osdf/examples/placement-models-minizinc/vdns-plus-vfw-use-case; jupyter lab --port=<public port> --ip=<public ip> --allow-root placement-minizinc.ipynb'
+
+Usage Example:
+  sudo docker run --name placement-example --network=host -it placement-example /bin/bash -c 'cd /osdf/examples/placement-models-minizinc/vdns-plus-vfw-use-case; jupyter lab --port=8181 --ip=10.172.161.6 --allow-root placement-minizinc.ipynb'
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/gold-1.dzn b/examples/placement-models-minizinc/5g-placement-scheduling/gold-1.dzn
new file mode 100755 (executable)
index 0000000..eafacdd
--- /dev/null
@@ -0,0 +1,116 @@
+% enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+% enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+\r
+NCR = 8;  % e-dc-1,2,3,4,5 core-dc-6,7,8\r
+N_ATTR = 4;\r
+N_UTILIZATION_METRICS = 2;\r
+N_CAPM = 2;\r
+N_VMS = 3;\r
+C_ALLOC_THRESHOLD = 0.65;\r
+CUST_ALLOC_THRESHOLD = 0.95;\r
+AVG_CPU_UTILIZATION_THRESHOLD = 0.7;\r
+PEAK_CPU_UTILIZATION_THRESHOLD = 0.95;\r
+\r
+cust_type = GOLD;\r
+N_WL = 5;\r
+MIN_GUAR_ADDL_WT = 1000;\r
+\r
+u_lat = 0;\r
+u_lon = 0;\r
+cr_lat = [0, 1, 2, 3, 4, 100, 100, 100];\r
+cr_lon = [0, 1, 2, 3, 4, 100, 100, 100];\r
+dist_norm = 1000.0;\r
+max_dist_ue = 3.0;\r
+\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+w_attr = [0.1, 0.7, 0.1, 0.1]; \r
+capabilities = [| 0, 1, 0, 1    % edge dc 1\r
+                | 0, 1, 1, 1    % edge dc 2\r
+                | 0, 1, 0, 0    % edge dc 3\r
+                | 0, 1, 0, 1    % edge dc 4\r
+                | 0, 1, 0, 1    % edge dc 5\r
+                | 1, 0, 1, 0    % core dc 6\r
+                | 1, 0, 0, 0    % core dc 7\r
+                | 1, 0, 0, 0 |];% core dc 8\r
+\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+w_metrics       = [0.9,  0.1];\r
+cpu_utilization = [| 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8 |];\r
+\r
+c_alloc_capacity = [| 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 2400, 4800\r
+                    | 2400, 4800\r
+                    | 2400, 4800 |];\r
+\r
+c_total_capacity = [| 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 4000, 8000\r
+                    | 4000, 8000\r
+                    | 4000, 8000 |];\r
+\r
+c_alloc_capacity_norm = [| 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6 |];\r
+\r
+cust_alloc_capacity = [| 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 240, 480\r
+                       | 240, 480\r
+                       | 240, 480 |];\r
+\r
+cust_total_capacity = [| 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 400, 800\r
+                       | 400, 800\r
+                       | 400, 800 |];\r
+\r
+cust_alloc_capacity_norm = [| 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6 |];\r
+\r
+vm_reqs = [| 1, 4\r
+           | 2, 8\r
+           | 4, 16 |];\r
+\r
+%vm_reqs_sums = [ 14, 56 ];\r
+\r
+vm_reqs_sums_norm = [| 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035 |];\r
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/gold-2.dzn b/examples/placement-models-minizinc/5g-placement-scheduling/gold-2.dzn
new file mode 100755 (executable)
index 0000000..b821a5a
--- /dev/null
@@ -0,0 +1,116 @@
+% enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+% enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+\r
+NCR = 8;  % e-dc-1,2,3,4,5 core-dc-6,7,8\r
+N_ATTR = 4;\r
+N_UTILIZATION_METRICS = 2;\r
+N_CAPM = 2;\r
+N_VMS = 3;\r
+C_ALLOC_THRESHOLD = 0.65;\r
+CUST_ALLOC_THRESHOLD = 0.95;\r
+AVG_CPU_UTILIZATION_THRESHOLD = 0.7;\r
+PEAK_CPU_UTILIZATION_THRESHOLD = 0.95;\r
+\r
+cust_type = GOLD;\r
+N_WL = 5;\r
+MIN_GUAR_ADDL_WT = 1000;\r
+\r
+u_lat = 1;\r
+u_lon = 1;\r
+cr_lat = [0, 1, 2, 3, 4, 100, 100, 100];\r
+cr_lon = [0, 1, 2, 3, 4, 100, 100, 100];\r
+dist_norm = 1000.0;\r
+max_dist_ue = 3.0;\r
+\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+w_attr = [0.1, 0.7, 0.1, 0.1]; \r
+capabilities = [| 0, 1, 0, 1    % edge dc 1\r
+                | 0, 1, 1, 1    % edge dc 2\r
+                | 0, 1, 0, 0    % edge dc 3\r
+                | 0, 1, 0, 1    % edge dc 4\r
+                | 0, 1, 0, 1    % edge dc 5\r
+                | 1, 0, 1, 0    % core dc 6\r
+                | 1, 0, 0, 0    % core dc 7\r
+                | 1, 0, 0, 0 |];% core dc 8\r
+\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+w_metrics       = [0.9,  0.1];\r
+cpu_utilization = [| 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8 |];\r
+\r
+c_alloc_capacity = [| 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 2400, 4800\r
+                    | 2400, 4800\r
+                    | 2400, 4800 |];\r
+\r
+c_total_capacity = [| 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 4000, 8000\r
+                    | 4000, 8000\r
+                    | 4000, 8000 |];\r
+\r
+c_alloc_capacity_norm = [| 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6 |];\r
+\r
+cust_alloc_capacity = [| 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 240, 480\r
+                       | 240, 480\r
+                       | 240, 480 |];\r
+\r
+cust_total_capacity = [| 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 400, 800\r
+                       | 400, 800\r
+                       | 400, 800 |];\r
+\r
+cust_alloc_capacity_norm = [| 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6 |];\r
+\r
+vm_reqs = [| 1, 4\r
+           | 2, 8\r
+           | 4, 16 |];\r
+\r
+%vm_reqs_sums = [ 14, 56 ];\r
+\r
+vm_reqs_sums_norm = [| 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035 |];\r
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/gold-3.dzn b/examples/placement-models-minizinc/5g-placement-scheduling/gold-3.dzn
new file mode 100755 (executable)
index 0000000..84af4bc
--- /dev/null
@@ -0,0 +1,116 @@
+% enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+% enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+\r
+NCR = 8;  % e-dc-1,2,3,4,5 core-dc-6,7,8\r
+N_ATTR = 4;\r
+N_UTILIZATION_METRICS = 2;\r
+N_CAPM = 2;\r
+N_VMS = 3;\r
+C_ALLOC_THRESHOLD = 0.65;\r
+CUST_ALLOC_THRESHOLD = 0.95;\r
+AVG_CPU_UTILIZATION_THRESHOLD = 0.7;\r
+PEAK_CPU_UTILIZATION_THRESHOLD = 0.95;\r
+\r
+cust_type = GOLD;\r
+N_WL = 5;\r
+MIN_GUAR_ADDL_WT = 1000;\r
+\r
+u_lat = 3;\r
+u_lon = 3;\r
+cr_lat = [0, 1, 2, 3, 4, 100, 100, 100];\r
+cr_lon = [0, 1, 2, 3, 4, 100, 100, 100];\r
+dist_norm = 1000.0;\r
+max_dist_ue = 3.0;\r
+\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+w_attr = [0.1, 0.7, 0.1, 0.1]; \r
+capabilities = [| 0, 1, 0, 1    % edge dc 1\r
+                | 0, 1, 1, 1    % edge dc 2\r
+                | 0, 1, 0, 0    % edge dc 3\r
+                | 0, 1, 0, 1    % edge dc 4\r
+                | 0, 1, 0, 1    % edge dc 5\r
+                | 1, 0, 1, 0    % core dc 6\r
+                | 1, 0, 0, 0    % core dc 7\r
+                | 1, 0, 0, 0 |];% core dc 8\r
+\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+w_metrics       = [0.9,  0.1];\r
+cpu_utilization = [| 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8 |];\r
+\r
+c_alloc_capacity = [| 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 2400, 4800\r
+                    | 2400, 4800\r
+                    | 2400, 4800 |];\r
+\r
+c_total_capacity = [| 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 4000, 8000\r
+                    | 4000, 8000\r
+                    | 4000, 8000 |];\r
+\r
+c_alloc_capacity_norm = [| 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6 |];\r
+\r
+cust_alloc_capacity = [| 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 240, 480\r
+                       | 240, 480\r
+                       | 240, 480 |];\r
+\r
+cust_total_capacity = [| 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 400, 800\r
+                       | 400, 800\r
+                       | 400, 800 |];\r
+\r
+cust_alloc_capacity_norm = [| 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6 |];\r
+\r
+vm_reqs = [| 1, 4\r
+           | 2, 8\r
+           | 4, 16 |];\r
+\r
+%vm_reqs_sums = [ 14, 56 ];\r
+\r
+vm_reqs_sums_norm = [| 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035 |];\r
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/gold-4.dzn b/examples/placement-models-minizinc/5g-placement-scheduling/gold-4.dzn
new file mode 100755 (executable)
index 0000000..172766b
--- /dev/null
@@ -0,0 +1,116 @@
+% enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+% enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+\r
+NCR = 8;  % e-dc-1,2,3,4,5 core-dc-6,7,8\r
+N_ATTR = 4;\r
+N_UTILIZATION_METRICS = 2;\r
+N_CAPM = 2;\r
+N_VMS = 3;\r
+C_ALLOC_THRESHOLD = 0.65;\r
+CUST_ALLOC_THRESHOLD = 0.95;\r
+AVG_CPU_UTILIZATION_THRESHOLD = 0.7;\r
+PEAK_CPU_UTILIZATION_THRESHOLD = 0.95;\r
+\r
+cust_type = GOLD;\r
+N_WL = 5;\r
+MIN_GUAR_ADDL_WT = 1000;\r
+\r
+u_lat = 3;\r
+u_lon = 3;\r
+cr_lat = [0, 1, 2, 3, 4, 100, 100, 100];\r
+cr_lon = [0, 1, 2, 3, 4, 100, 100, 100];\r
+dist_norm = 1000.0;\r
+max_dist_ue = 3.0;\r
+\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+w_attr = [0.1, 0.7, 0.1, 0.1]; \r
+capabilities = [| 0, 1, 0, 1    % edge dc 1\r
+                | 0, 1, 1, 1    % edge dc 2\r
+                | 0, 1, 0, 0    % edge dc 3\r
+                | 0, 1, 0, 1    % edge dc 4\r
+                | 0, 1, 0, 1    % edge dc 5\r
+                | 1, 0, 1, 0    % core dc 6\r
+                | 1, 0, 0, 0    % core dc 7\r
+                | 1, 0, 0, 0 |];% core dc 8\r
+\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+w_metrics       = [0.9,  0.1];\r
+cpu_utilization = [| 0.1,  0.5\r
+                   | 0.1,  0.96\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8 |];\r
+\r
+c_alloc_capacity = [| 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 2400, 4800\r
+                    | 2400, 4800\r
+                    | 2400, 4800 |];\r
+\r
+c_total_capacity = [| 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 4000, 8000\r
+                    | 4000, 8000\r
+                    | 4000, 8000 |];\r
+\r
+c_alloc_capacity_norm = [| 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6 |];\r
+\r
+cust_alloc_capacity = [| 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 240, 480\r
+                       | 240, 480\r
+                       | 240, 480 |];\r
+\r
+cust_total_capacity = [| 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 400, 800\r
+                       | 400, 800\r
+                       | 400, 800 |];\r
+\r
+cust_alloc_capacity_norm = [| 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6 |];\r
+\r
+vm_reqs = [| 1, 4\r
+           | 2, 8\r
+           | 4, 16 |];\r
+\r
+%vm_reqs_sums = [ 14, 56 ];\r
+\r
+vm_reqs_sums_norm = [| 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035 |];\r
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/gold.dzn b/examples/placement-models-minizinc/5g-placement-scheduling/gold.dzn
new file mode 100755 (executable)
index 0000000..eafacdd
--- /dev/null
@@ -0,0 +1,116 @@
+% enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+% enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+\r
+NCR = 8;  % e-dc-1,2,3,4,5 core-dc-6,7,8\r
+N_ATTR = 4;\r
+N_UTILIZATION_METRICS = 2;\r
+N_CAPM = 2;\r
+N_VMS = 3;\r
+C_ALLOC_THRESHOLD = 0.65;\r
+CUST_ALLOC_THRESHOLD = 0.95;\r
+AVG_CPU_UTILIZATION_THRESHOLD = 0.7;\r
+PEAK_CPU_UTILIZATION_THRESHOLD = 0.95;\r
+\r
+cust_type = GOLD;\r
+N_WL = 5;\r
+MIN_GUAR_ADDL_WT = 1000;\r
+\r
+u_lat = 0;\r
+u_lon = 0;\r
+cr_lat = [0, 1, 2, 3, 4, 100, 100, 100];\r
+cr_lon = [0, 1, 2, 3, 4, 100, 100, 100];\r
+dist_norm = 1000.0;\r
+max_dist_ue = 3.0;\r
+\r
+% enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+w_attr = [0.1, 0.7, 0.1, 0.1]; \r
+capabilities = [| 0, 1, 0, 1    % edge dc 1\r
+                | 0, 1, 1, 1    % edge dc 2\r
+                | 0, 1, 0, 0    % edge dc 3\r
+                | 0, 1, 0, 1    % edge dc 4\r
+                | 0, 1, 0, 1    % edge dc 5\r
+                | 1, 0, 1, 0    % core dc 6\r
+                | 1, 0, 0, 0    % core dc 7\r
+                | 1, 0, 0, 0 |];% core dc 8\r
+\r
+% enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+w_metrics       = [0.9,  0.1];\r
+cpu_utilization = [| 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.1,  0.5\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8\r
+                   | 0.6,  0.8 |];\r
+\r
+c_alloc_capacity = [| 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 600,  1200\r
+                    | 2400, 4800\r
+                    | 2400, 4800\r
+                    | 2400, 4800 |];\r
+\r
+c_total_capacity = [| 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 1000, 2000\r
+                    | 4000, 8000\r
+                    | 4000, 8000\r
+                    | 4000, 8000 |];\r
+\r
+c_alloc_capacity_norm = [| 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6\r
+                         | 0.6, 0.6 |];\r
+\r
+cust_alloc_capacity = [| 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 60, 120\r
+                       | 240, 480\r
+                       | 240, 480\r
+                       | 240, 480 |];\r
+\r
+cust_total_capacity = [| 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 100, 200\r
+                       | 400, 800\r
+                       | 400, 800\r
+                       | 400, 800 |];\r
+\r
+cust_alloc_capacity_norm = [| 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6\r
+                            | 0.6, 0.6 |];\r
+\r
+vm_reqs = [| 1, 4\r
+           | 2, 8\r
+           | 4, 16 |];\r
+\r
+%vm_reqs_sums = [ 14, 56 ];\r
+\r
+vm_reqs_sums_norm = [| 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.007, 0.014\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035\r
+                     | 0.00175, 0.0035 |];\r
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/network-slicing.ipynb b/examples/placement-models-minizinc/5g-placement-scheduling/network-slicing.ipynb
new file mode 100644 (file)
index 0000000..4518603
--- /dev/null
@@ -0,0 +1,77 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mzn-gecode placement.mzn gold-1.dzn"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mzn-gecode placement.mzn gold-2.dzn"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mzn-gecode placement.mzn gold-3.dzn"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mzn-gecode placement.mzn gold-4.dzn"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mzn-gecode placement.mzn gold-5.dzn"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.6.4"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/examples/placement-models-minizinc/5g-placement-scheduling/placement.mzn b/examples/placement-models-minizinc/5g-placement-scheduling/placement.mzn
new file mode 100755 (executable)
index 0000000..dc41f0c
--- /dev/null
@@ -0,0 +1,104 @@
+include "globals.mzn";\r
+\r
+int: NCR;  % number of cloud regions\r
+int: N_ATTR; %  number of capability related attributes\r
+array[1..N_ATTR] of float: w_attr; % weights of each attribute\r
+\r
+int: N_UTILIZATION_METRICS; % number of dynamic capacity metrics of interest\r
+% set of 1..N_UTILIZATION_METRICS: U_METRICS;\r
+array[1..N_UTILIZATION_METRICS] of float: w_metrics; % weights of each capacity metric\r
+\r
+int: cust_type;  % customer type, 0 = regular, 1 = silver, 2 = gold\r
+int: N_VMS; % number of VMs in VNF\r
+int: N_CAPM; % number of metrics for cloud region capacity check\r
+int: MIN_GUAR_ADDL_WT; % additional weight for min guarantee capability\r
+\r
+float: C_ALLOC_THRESHOLD; % allocation threshold for cloud\r
+float: CUST_ALLOC_THRESHOLD; % allocation threshold for customer in cloud\r
+float: AVG_CPU_UTILIZATION_THRESHOLD;\r
+float: PEAK_CPU_UTILIZATION_THRESHOLD;\r
+\r
+int: u_lat;\r
+int: u_lon;\r
+float: dist_norm;\r
+float: max_dist_ue;\r
+array[1..NCR] of int: cr_lat;\r
+array[1..NCR] of int: cr_lon;\r
+\r
+enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+enum WL_TYPES = { W1, W2, W3, W4, W5 };\r
+int: N_WL;\r
+\r
+% set of 1..N_CAPM: CAP_METRICS;\r
+\r
+% whether a cloud region has the corresponding capability -- data will be customer specific\r
+array[1..NCR, 1..N_ATTR] of int: capabilities;\r
+array[1..NCR, 1..N_UTILIZATION_METRICS] of float: cpu_utilization;  % how much capacity is already dynamically utilized     (fraction)\r
+array[1..NCR, 1..N_CAPM] of int: c_alloc_capacity; % how much percent is already allocated in the cloud\r
+array[1..NCR, 1..N_CAPM] of int: c_total_capacity;  % total cloud capacity\r
+array[1..NCR, 1..N_CAPM] of float: c_alloc_capacity_norm;\r
+array[1..NCR, 1..N_CAPM] of int: cust_alloc_capacity; % how much percent is already allocated in the cloud for the customer\r
+array[1..NCR, 1..N_CAPM] of int: cust_total_capacity; % total cloud capacity for customer\r
+array[1..NCR, 1..N_CAPM] of float: cust_alloc_capacity_norm;\r
+\r
+% VM requirements for each type of capacity (vm cpu, memory, etc.)\r
+% TODO: establish a standard for units (MB RAM, GB disk, N virtual cores, etc.)\r
+array[1..N_VMS, 1..N_CAPM] of int: vm_reqs;\r
+array[1..N_CAPM] of int: vm_reqs_sums = [ sum(k in 1..N_VMS) (vm_reqs[k,j]) | j in 1..N_CAPM ];\r
+array[1..NCR, 1..N_CAPM] of float: vm_reqs_sums_norm;\r
+%forall(i in 1..NCR, j in 1..N_CAPM) (\r
+%  vm_reqs_sums_norm[i, j] = vm_reqs_sums[j]/c_total_capacity[i, j]\r
+%)\r
+%array[1..NCR, 1..N_CAPM] of float: vm_reqs_sums_norm = [ ((vm_reqs_sums[j]/c_total_capacity[i,j]) | j in 1..N_CAPM) | i in 1..NCR ];\r
+\r
+array[1..N_WL] of var int: s_regions;  % target cloud regions (solution to the problem)\r
+\r
+function var float: dist(var int: x1, var int: y1, var int: x2, var int: y2) = (sqrt(pow((x1-x2),2) + pow((y1-y2),2)))/dist_norm;\r
+\r
+% custom constraints\r
+constraint forall (s in s_regions) (\r
+    cpu_utilization[s, AVG_CPU_UTILIZATION] <= AVG_CPU_UTILIZATION_THRESHOLD /\    % hard constraint: need some capacity available\r
+    cpu_utilization[s, PEAK_CPU_UTILIZATION] <= PEAK_CPU_UTILIZATION_THRESHOLD /\  % hard constraint: need some capacity available\r
+    cust_alloc_capacity[s, CPU_CLOUD] <= (CUST_ALLOC_THRESHOLD*(cust_total_capacity[s, CPU_CLOUD])) - (vm_reqs_sums[CPU_CLOUD]) /\\r
+    cust_alloc_capacity[s, MEMORY_CLOUD] <= (CUST_ALLOC_THRESHOLD*(cust_total_capacity[s, MEMORY_CLOUD])) - (vm_reqs_sums[MEMORY_CLOUD]) /\\r
+    c_alloc_capacity[s, CPU_CLOUD] <= (C_ALLOC_THRESHOLD*(c_total_capacity[s, CPU_CLOUD])) - (vm_reqs_sums[CPU_CLOUD]) /\\r
+    c_alloc_capacity[s, MEMORY_CLOUD] <= (C_ALLOC_THRESHOLD*(c_total_capacity[s, MEMORY_CLOUD])) - (vm_reqs_sums[MEMORY_CLOUD])\r
+);\r
+\r
+% specific constraints based on the workload\r
+constraint [capabilities[s_regions[x], CORE_DC] | x in WL_TYPES] = [1, 1, 0, 0, 0];\r
+\r
+constraint forall (x in [W3, W4, W5])\r
+(dist(u_lat, u_lon, cr_lat[s_regions[x]], cr_lon[s_regions[x]]) < max_dist_ue/dist_norm);\r
+\r
+constraint all_different([s_regions[x] | x in WL_TYPES]);\r
+\r
+% custom soft constraint for gold customers -- give a large weight to Minimum Guarantee\r
+var float: additional_obj = sum(s in s_regions) (bool2int(cust_type = GOLD) * capabilities[s, MIN_GUARANTEE] * MIN_GUAR_ADDL_WT);\r
+\r
+% TODO: global constraints (such as data validation)\r
+\r
+% Objective for utilization\r
+var float: obj_c_capacity = sum(k in 1..N_CAPM, s in s_regions) (\r
+                 (1 - c_alloc_capacity_norm[s, k] - vm_reqs_sums_norm[s, k]) +\r
+%                  (1 - cust_alloc_capacity_norm[s, k] - vm_reqs_sums_norm[s, k]));\r
+                  (1 - cust_alloc_capacity_norm[s, k] - vm_reqs_sums_norm[s, k]) +\r
+                  (1 - dist(u_lat, u_lon,cr_lat[s], cr_lon[s])));\r
+\r
+% Objective for utilization\r
+var float: obj_utilization = sum(k in 1..N_UTILIZATION_METRICS, s in s_regions) ( w_metrics[k] * (1 - cpu_utilization[s, k]) );\r
+\r
+% Objective for capabilities\r
+var float: obj_capabilities = sum(k in 1..N_ATTR, s in s_regions) ( w_attr[k] * capabilities[s, k] );\r
+\r
+% Overall objective function\r
+var float: obj = obj_c_capacity + obj_utilization + obj_capabilities + additional_obj;\r
+\r
+solve maximize obj;\r
+\r
+output [ "Solution: \n"\r
+         ++ concat(["Cloud Region for W" ++ format(x) ++ " = " ++ format(s_regions[x]) ++ "\n" | x in 1..N_WL]) ]\r
+         ++ [ "Objective function value: ", show(obj), "\n", "Customer type: ", show(cust_type), "\n"];\r