Topology* Topology::GenLineTopo(int len, int content_num, int content_size, int k, int* cacheSizes)
{
	
	Topology* topo = new Topology();
	topo->router_num = len;
	topo->routers = new Router[topo->router_num];
	topo->content_num = content_num;
	topo->size_of_content = content_size;
	
	topo->server_num = 1;
	topo->servers = new Server[topo->server_num];

	topo->sink_num = 1;
	topo->sinks = new Sink[topo->sink_num];



	//sink-100-0-1- ... - 8-9-server-10
	topo->edges.clear();
	//routers
	for (int router_id = 0; router_id < topo->router_num; router_id++) {
		topo->routers[router_id].Init(router_id, cacheSizes[router_id], k, topo->server_num);
	}
	//server
	for (int server_id = 0; server_id < topo->server_num; server_id++) {
		topo->servers[server_id].Init(SERVER_BASE + server_id);
	}
	//sink
	for (int sink_id = 0; sink_id < topo->sink_num; sink_id++) {
		topo->sinks[sink_id].Init(SINK_BASE + sink_id, &(topo->routers[sink_id]));
	}
	//edges
	for (int router_id = 0; router_id < (topo->router_num - 1); router_id++) {
		Edge* e = new Edge(&topo->routers[router_id], &topo->routers[router_id + 1], router_id, MyRandom::NextDouble());
		topo->routers[router_id].AddEdge(e);
		topo->routers[router_id + 1].AddEdge(e);
		topo->edges.push_back(e);
	}
	for (int server_id = 0; server_id < topo->server_num; server_id++) {
		Edge* e = new Edge(&topo->servers[server_id], &topo->routers[topo->router_num - 1 - server_id],server_id-100,MyRandom::NextDouble());
		topo->servers[server_id].AddEdge(e);
		topo->routers[topo->router_num - 1 - server_id].AddEdge(e);
		topo->edges.push_back(e);
	}
	for (int sink_id = 0; sink_id < topo->sink_num; sink_id++) {
		Edge* e = new Edge(&topo->sinks[sink_id], &topo->routers[sink_id],sink_id + SINK_BASE,MyRandom::NextDouble());
		topo->sinks[sink_id].AddEdge(e);
		topo->routers[sink_id].AddEdge(e);
		topo->edges.push_back(e);
	}

	topo->IssueContentOnServer();
	topo->Announce();
	return topo; 
}
Topology* Topology::GenTreeTopo(int tree_level, int tree_degree, int content_num, int content_size, int k, int* cache_sizes)
{
    Logger::Log(LOGGER_INFO) << "Topology::GenLineTopo(tree_level=" << tree_level << ",tree_degree=" << tree_degree << ",content_num=" << content_num << ",content_size=" << content_size << ",k=" << k << ")" << endl;
    Topology* topo = new Topology();

    int router_num = 1;
    int level_num = 1;
    for(int level = 1; level < tree_level; level++)
    {
        level_num *= tree_degree;
        router_num += level_num;
    }
    topo->router_num = router_num;
    topo->routers = new Router[topo->router_num];
    topo->content_num = content_num;
    topo->size_of_content = content_size;

    topo->server_num = 1;
    topo->servers = new Server[topo->server_num];

    topo->sink_num = level_num;
    topo->sinks = new Sink[topo->sink_num];

    // server-10
    // router-0
    //		1	2
    //	3	4	5	6
    //	sink  ......  sink-100
    topo->edges.clear();
    //routers
    for (int router_id = 0; router_id < topo->router_num; router_id++) {
        topo->routers[router_id].Init(router_id, cache_sizes[Tree::GetTreeLevel(tree_degree, router_id)], k, topo->server_num);
    }
    //server
    for (int server_id = 0; server_id < topo->server_num; server_id++) {
        topo->servers[server_id].Init(SERVER_BASE + server_id);
    }
    //sink
    for (int sink_id = 0; sink_id < topo->sink_num; sink_id++) {
        topo->sinks[sink_id].Init(SINK_BASE + sink_id, &(topo->routers[router_num - 1 - sink_id]));
    }

    //edges
    for (int router_id = 0; router_id < (topo->router_num - 1); router_id++) {
        Edge* e = new Edge(&topo->routers[router_id], &topo->routers[router_id + 1], router_id, MyRandom::NextDouble());
        topo->routers[router_id].AddEdge(e);
        topo->routers[router_id + 1].AddEdge(e);
        topo->edges.push_back(e);
    }
    for (int server_id = 0; server_id < topo->server_num; server_id++) {
        Edge* e = new Edge(&topo->servers[server_id], &topo->routers[topo->router_num - 1 - server_id],server_id-100,MyRandom::NextDouble());
        topo->servers[server_id].AddEdge(e);
        topo->routers[topo->router_num - 1 - server_id].AddEdge(e);
        topo->edges.push_back(e);
    }
    for (int sink_id = 0; sink_id < topo->sink_num; sink_id++) {
        Edge* e = new Edge(&topo->sinks[sink_id], &topo->routers[sink_id],sink_id + SINK_BASE,MyRandom::NextDouble());
        topo->sinks[sink_id].AddEdge(e);
        topo->routers[sink_id].AddEdge(e);
        topo->edges.push_back(e);
    }

    //between routers
    for (int i = 1; i < router_num; i++)
    {
        int parent = Tree::GetParentIndex(tree_degree, tree_level, i);
        for(int j = 0; j < tree_degree; j++)
        {
            Edge* e = new Edge(&topo->routers[i], &topo->routers[parent], i * router_num + j + router_num * 2, MyRandom::NextDouble());
            topo->edges.push_back(e);
            topo->routers[i].AddEdge(e);
            topo->routers[parent].AddEdge(e);
        }
    }
    //servers
    for (int i = 0; i < topo->server_num; i++)
    {
        Edge* e = new Edge(&topo->routers[i], &topo->servers[i], -i, MyRandom::NextDouble());
        topo->routers[i].AddEdge(e);
        topo->servers[i].AddEdge(e);
    }
    //sinks
    for (int i = 0; i < topo->sink_num; i++)
    {
        Edge* e = new Edge(&topo->routers[router_num - i - 1], &topo->sinks[i], -1, MyRandom::NextDouble());
        topo->routers[router_num - i - 1].AddEdge(e);
        topo->sinks[i].AddEdge(e);
    }
    topo->IssueContentOnServer();
    topo->Announce();
    return topo;
}