
# NOTICE ======================================================================
# The file name `msg.py` does NOT stands for Monosodium glutamate. And PLEASE,
# PLEASE, PLEASE do NOT put any MSG into your dishes.
# =============================================================================

# Error message - Missing required field
ERROR_MISSING_N                         = "ERROR: Missing required field `N`, `N` is an integer indicating number of vertices"
ERROR_MISSING_NODES                     =("ERROR: Missing required field `nodes`. The format of `nodes` is \n"
                                        + "    { \n"
                                        + "        nodeID1: {\n"
                                        + "            'loc': (x, y),\n"
                                        + "            'marker': 'r',    # Optional, default as circle\n"
                                        + "            'color': 'red',   # Optional, default as 'Random'\n"
                                        + "            'size': 3,        # Optional, default as 3\n"
                                        + "            'fontsize': 3,    # Optional, default as 3\n"
                                        + "            'neighbor': poly, # Optional, indicate if need to display the neighborhood\n"
                                        + "        }, # ...\n"
                                        + "    }")
ERROR_MISSING_NODES_DISTR               =("ERROR: Missing (or incorrect) required field `method`, `methodi` can be chosen from the following options\n"
                                        + "1) (default) Uniformly sample from a square on the Euclidean space\n"
                                        + "    method = {\n"
                                        + "        'distr': 'uniformSquareXY', \n"
                                        + "        'xRange': (0, 100), # A 2-tuple with minimum/maximum range of x, default as (0, 100), \n"
                                        + "        'yRange': (0, 100), # A 2-tuple with minimum/maximum range of y, default as (0, 100), \n"
                                        + "    }\n"
                                        + "2) Uniformly sample from a given polygon on the Euclidean space\n"
                                        + "    method = {\n"
                                        + "        'distr': 'uniformPolyXY', \n"
                                        + "        'polyXY': poly, # polygon of the area, (no holes)\n"
                                        + "        'polyXYs': polys, # alternative option for 'polyXY', as a list of polygons \n"
                                        + "    }\n"
                                        + "3) Uniformly sample from a circle on the Euclidean space\n"
                                        + "    method = {\n"
                                        + "        'distr': 'uniformCircleXY',\n"
                                        + "        'centerXY': (0, 0), # centering location, default as (0, 0), \n"
                                        + "        'radius': 100, # radius of the circle , default as 100\n"
                                        + "    }\n"
                                        + "4) Uniformly sample from a given polygon by lat/lon\n"
                                        + "    method = {\n"
                                        + "        'distr': 'uniformPolyLatLon', \n"
                                        + "        'polyLatLon': polygon of the area, (no holes)\n"
                                        + "        'polyLatLons': alternative option for 'polyLatLon', as a list of polygons \n"
                                        + "    }\n"
                                        + "5) Uniformly sample from a given circle by lat/lon,\n"
                                        + "    method = {\n"
                                        + "        'distr': 'uniformCircleLatLon', \n"
                                        + "        'centerLatLon': required, centering location in lat/lon, \n"
                                        + "        'radiusInMeters': radius of the circle in meters \n"
                                        + "    }\n"
                                        + "6) Uniformly generate from a given polygon on a road network\n"
                                        + "    method = {\n"
                                        + "        'distr': 'roadNetworkPolyLatLon'\n"
                                        + "        'roadNetwork': list of arcs that can be sampled \n"
                                        + "        'polyLatLon': nodes should generated within the polygon, if not provided, will consider the entire network, \n"
                                        + "        'roadClass': list of classes that can be sampled \n"
                                        + "    }\n"
                                        + "7) Uniformly generate from a given circle on a road network\n"
                                        + "    method = {\n"
                                        + "        'distr': 'roadNetworkCircleLatLon', \n"
                                        + "        'roadNetwork': list of arcs that can be sampled \n"
                                        + "        'centerLatLon': [lat, lon], \n"
                                        + "        'radiusInMeters': radius in [m] \n"
                                        + "        'roadClass': list of classes that can be sampled\n"
                                        + "    }\n")

ERROR_MISSING_EDGES                     =("ERROR: Missing (or incorrect) required field `edges`, `edges` can be chosen from the following options\n"
                                        +"1) (default) Euclidean space \n"
                                        +"    edge = { \n"
                                        +"        'method': 'Euclidean', \n"
                                        +"        'ratio': 1 # Optional, default to be 1 \n"
                                        +"    } \n"
                                        +"2) By given pairs of lat/lon \n"
                                        +"    edge = { \n"
                                        +"        'method': 'LatLon', \n"
                                        +"        'unit': 'meters' # Optional, default to be 1 \n"
                                        +"    } \n"
                                        +"3) ManhattenDistance \n"
                                        +"    edge = { \n"
                                        +"        'method': 'Manhatten', \n"
                                        +"        'ratio': 1 # Optional, default to be 1 \n"
                                        +"    } \n"
                                        +"4) By a given dictionary \n"
                                        +"    edge = { \n"
                                        +"        'method': 'Dictionary', \n"
                                        +"        'dictionary': dictionary, \n"
                                        +"        'ratio': 1 # Optional, default to be 1 \n"
                                        +"    } \n"
                                        +"5) On the grids \n"
                                        +"    edge = { \n"
                                        +"        'method': 'Grid', \n"
                                        +"        'grid': grid \n"
                                        +"    } \n")
                                        
ERROR_MISSING_TSP_ALGO                  =("ERROR: Missing (or incorrect) required field `algo`, `algo` can be chosen from the following options\n"                                        
                                        + "1) (default) Insertion \n"
                                        + "    algo = { \n"
                                        + "        'cons': 'Insertion', \n"
                                        + "        'initSeq': initSeq, # An initial sequence, defalt [depotID] \n"
                                        + "        'impv': '2Opt' # Options are: 'Reinsert', '2Opt', can select multiple methods by collecting them into a list, e.g. ['Reinsert', '2Opt'] \n"
                                        + "    } \n"
                                        + "2) Nearest neighborhood / k-nearest neighborhood \n"
                                        + "    algo = { \n"
                                        + "        'cons': 'NearestNeighbor', \n"
                                        + "        'k': 1, # 1: nearest neighbor, 2 ~ K: k-nearest neighbor, -1: farthest neighbor  \n"
                                        + "    } \n"
                                        + "3) Sweep \n"
                                        + "    algo = { \n"
                                        + "        'cons': 'Sweep' \n"
                                        + "    } \n"
                                        + "4) (not available) Christofides \n"
                                        + "    algo = { \n"
                                        + "        'cons': 'Christofides' \n"
                                        + "    } \n"
                                        + "5) (not available) Cycle cover, particular for Asymmetric TSP \n"
                                        + "    algo = { \n"
                                        + "        'cons': 'CycleCover' \n"
                                        + "    } \n"
                                        + "6) Random sequence \n"
                                        + "    algo = { \n"
                                        + "        'cons': 'Random' \n"
                                        + "    } \n"
                                        + "7) Given sequence for further local improvements \n"
                                        + "    algo = { \n"
                                        + "        'cons': None, # or skip this \n"
                                        + "        'initSeq': initSeq, # An initial sequence, cannot be None in this case \n"
                                        + "    } \n")                                        

ERROR_MISSING_GANTT                     =("ERROR: Missing required field `gantt`. The format of `gantt` is \n"
                                        + "    [{\n"
                                        + "        'entityID': entityID, \n"
                                        + "        'timeWindow': [startTime, endTime], \n"
                                        + "        'desc': description of the window,\n"
                                        + "        'color': color, \n"
                                        + "        'style': 'solid' \n"
                                        + "    }, ... , \n"
                                        + "    {\n"
                                        + "        'entityID': entityID, \n"
                                        + "        'timeStamps': [timeStamp1, timeStamp2, ..., timeStampN], \n"
                                        + "        'desc': [List of descriptions, correspond to `timeStamps`],\n"
                                        + "        'color': color, \n"
                                        + "        'style': 'solid' \n"
                                        + "    }]\n")
ERROR_ZERO_VECTOR                       = "ERROR: Segment or Ray should be defined using two different points"

