prod = ['eggs','milk']
act = ['Producer','Consumer']
loc = [
'Portugal',
'Spain',
'France',
'Italy',
'Germany',
'Montenegro',
'others'
]
myNW = go.createGraph(
listOfActors=act,
listOfLocations=loc,
listOfProducts=prod)
#---------------------------
myData = {
loc[0]: [1, 625, 1737, 2509, 2781, 3351,4000],
loc[1]: [625, 1, 1277, 1965, 2320, 2804,4000],
loc[2]: [1737, 1277, 1, 1420, 1054, 2038,4000],
loc[3]: [2509, 1965, 1420, 1, 1505, 740,4000],
loc[4]: [2781, 2320, 1054, 1505, 1, 1636,4000],
loc[5]: [3351, 2804, 2038, 740, 1636, 1,4000],
loc[6]: [4000,4000,4000,4000,4000,4000,1]
}
myDF = pd.DataFrame(myData,index=loc)
# supply and demand
sendingProd = [[12588339,44688368,48464470,33153139,24304433,2300,9204611],#eggs
[75752927,121886945,490834291,3933048,497278336,138,0]]#milk
receivingProd = [[19101284,91333314,48818138,957046,12195878,0,0],#eggs
[70146856,121623784,95268102,761020054,104160029,14602,37452258]]#milk
myTDs = []
allFlows = np.ndarray((7,7,2,5))
# creating list of node IDs of participants
for run,p in enumerate(prod):
senderIDs = go.getListOfNodeIDs(
myNW,
actors=['Producer'],
products=[p]
)
receiverIDs = go.getListOfNodeIDs(
myNW,
actors=['Consumer'],
products=[p]
)
# creating edgeIDs for adding 'distance' to graph
allcombIDs1, allcombIDs2 = go.getAllCombinations(
senderIDs,
receiverIDs,
order='1st'
)
myEdges4Graph = go.getEdgeID(myNW, allcombIDs1, allcombIDs2)
didItWork3 = go.addAttr2Edges(
myNW,
myEdges4Graph,
myDF.values.flatten(),
attr='distance'
)
go.addAttr2ExistingNodes(myNW,senderIDs,'output',sendingProd[run])
go.addAttr2ExistingNodes(myNW,receiverIDs,'input',receivingProd[run])
# get the transport distances
myTDs.append(
go.calcPotTransportDistances(
myNW,
listOfSenderIDs=senderIDs,
listOfReceiverIDs=receiverIDs
)
)
# Run the gravity model with given transport distance and return the
# flow each myTDs[run] is a list of 5 transport distances
# allFlows is input for the calibration algorithm
for it, td in enumerate(myTDs[run]):
allFlows[
0:len(senderIDs),
0:len(receiverIDs),
run,
it
] = go.hymanModel(
myNW,
listOfSenderIDs=senderIDs,
listOfReceiverIDs=receiverIDs,
transportDistance=td,
tolerance=0.01
)
#creating calibration measure that halfway might make sense
allFoodTransported = sum(sum(sendingProd,[]))
dummy = np.random.rand(48)*allFoodTransported/80+allFoodTransported/(len(sum(sendingProd,[]))+1)
myCalMat = np.append(
dummy,
allFoodTransported-np.sum(dummy)).reshape((len(senderIDs),
len(receiverIDs))
)
print(go.calibration(allFlows,myCalMat))
#--------------------------
myDF1 = pd.DataFrame(myCalMat, index=loc)
# entering distance information to the right nodes on the graph
senderIDs = go.getListOfNodeIDs(
SCGraph=myNW,
actors=['Producer'],
products=['milk'])
receiverIDs = go.getListOfNodeIDs(
myNW,
actors=['Consumer'],
products=['milk'])
# supply and demand for milk and enrich the graph with this data
sendingProd1 = [75752927,121886945,490834291,3933048,497278336,138,0]#milk
receivingProd1 = [70146856,121623784,95268102,761020054,104160029,14602,37452258]#milk
myInt = 1000000
sendingProd1 = [x / myInt for x in sendingProd1]
receivingProd1 = [x / myInt for x in receivingProd1]
#sendingProd = [1, 4, 9, 15, 2]
#receivingProd = [36, 47, 68, 79, 100]
go.addAttr2ExistingNodes(
SCGraph=myNW,
listOfNodeIDs=senderIDs,
nameOfAttr='output',
listOfAttr=sendingProd1)
go.addAttr2ExistingNodes(
SCGraph=myNW,
listOfNodeIDs=receiverIDs,
nameOfAttr='input',
listOfAttr=receivingProd1)
# get edge IDs for enriching graph with distance matrix
allcombIDs1, allcombIDs2 = go.getAllCombinations(
senderIDs,
receiverIDs,
order='1st')
myEdges4Graph = go.getEdgeID(
SCGraph=myNW,
outgoingNodes=allcombIDs1,
incomingNodes=allcombIDs2)
# actual adding edges to graph
go.addAttr2Edges(
SCGraph=myNW,
listOfEdgeIDs=myEdges4Graph,
listOfContent=myDF1.values.flatten(),
attr='weight')