text:
Genealogy, including African American genealogy, is a process. Resources available will depend on the historical time period in question. No matter how far back you are searching, you need to start with yourself and move back, generation by generation to be able to say with confidence that you have identified your ancestor, not just someone with the same name.
First, you will want to gather as much information about your parents, aunts and uncles, grandparents, and if possible, your great grandparents. The basic information you want to learn will be birth dates and places, marriage dates, and places, and where relevant, death dates and places. These are known as vital records. These are the most basic information pieces to start your genealogical journey.
Figure 1 Sample Ancestry Chart
Recording Your Information
Your family information is traditionally recorded on Ancestry Charts. Information for individual family groups (a set of parents and children) can be recorded on Family Group Sheets. There are several free on-line sites to obtain these charts, including the various research sites such as Ancestry, My Heritage, Geni, and others. Various chart styles can be found on sites such as Pinterest, as well. Free printable charts are available on a variety of sites, including Vertex42. You can also build your family tree and research your family in the databases located on sites such as Ancestry, MyHeritage, Geni, and FamilySearch. You may also wish to acquire a family history software program. There are several popular ones, such as RootsMagic, Legacy Family Tree, and Family Tree Maker, to name just three.
Basics for Finding Vital Record Information
What are the resources for finding information on the births, marriages, and deaths of your family members? One resource that you may have, or one of your relatives may have is a Family Bibles. Family Bibles often include pages for recording births, baptisms, marriages, and deaths. These bibles may be the only recorded vital record information for grandparents, great grandparents, and other family members born before births and deaths were officially collected by states. While bibles are the most likely place to find this information, do not overlook other places, such as other books in which someone may have recorded these events.
While birth records have not been officially recorded until the twentieth (20th) century, except for a few states, Marriages have been recorded by county governments and even towns throughout our history. The enslaved were not able to legally marry, but free people of color could marry in all time periods. Usually, individuals are noted by color, and in some instances, separate registers were maintained for people of color.
Figure 2 Church Marriage Record, Montgomery County, MD
The information found in marriage applications, bonds, licenses, or on the certificates varies with time and location. Applications for licenses sometimes record the names of the parents, whether they are still living, and if so, where they live. Some more recent forms include questions about previous marriages. It is important to note that some jurisdictions, even today, include only simple questions about the bride and groom. In Maryland, no questions are asked about parents.
Marriage records can also be found sometimes in church records. Some denominations keep detailed information on marriages performed at the churches, however, some do not. Many early church records have been digitized and are available on-line.
Figure 3 Tombstone in Mutual Memorial Cemetery, Sandy Spring, Montgomery County, MD
Deaths and burials were not officially recorded until the twentieth century in most locations, with a few exceptions. However, many church cemeteries and even community cemeteries have graves marked with tombstones. It is important to remember that not every grave has a stone. In addition, the locations of some cemeteries over time have been lost. Nevertheless, cemeteries and their tombstones can provide important information about a deceased ancestor and their families, including parents' names, children's names, spouses, and birth and death dates. A word of caution, some dates may conflict with other records. Birth dates often vary considerably. In some instances, the deceased is believed to be much younger than they were; conversely, they may be recorded as much older than they were. Sometimes the date of death recorded differs by only a few days, indicating that the stone was probably erected at some time after the death by persons who did not have accurate information about the deceased.
Many cemeteries have been recorded with transcriptions available at local historical societies. Many of those have been made available in book form or on-line. In addition, there are several on-line databases devoted to cemetery information. The best known is Find A Grave. Others include Cemetery Census, Interment.com, and BillionGraves.
Beyond Vital Records
Finding marriage, death, and even birth records can help you begin to learn the names of your grandparents and great grandparents. You may also learn from these records that your family didn't always live in the same place. Some of them may have been born in other places, places you didn't know about. How can you learn more about them? One important set of records can help you learn about your ancestors, their families, their communities, what they did for a living, their education, whether they owned land, sometimes whether they served in the military and more. Those records are the censuses.
Censuses have been taken every ten years since 1790. They are used to determine election districts and representation in Congress. In recent years, local governments use statistical information from censuses to help determine the distribution of resources for schools, hospitals, and other government programs. Because the census attempts to capture information on every single person in the country (citizen or non-citizen), it is useful for locating our ancestors and learning about their lives.
Figure 4 1840 Census Page, Montgomery County, MD
There are several important things to learn about the census. Each census year, the government was seeking different information. In 1790, apportionment for congress and acquiring an accurate list of those who should be taxed. All free people who could be taxed, primarily white men (and white women heads of household), but also free people of color (no enslaved) who were taxable, including women of color. Since taxation and representation were the primary reasons for the census, only the names of heads of households were recorded. It was not until 1850 that all names in a household were recorded, but no relationships were recorded. It was not until 1880 that the census recorded the relationships of each person to the head of the household. Beware, sometimes a person listed as a lodger or boarder was a cousin or in-law. You can read more about the information gathered in each census year on the History page at census.gov.
Figure 5 1870 Census Page, Sandy Spring, Montgomery County, MD
For African Americans, the 1870 census is one of the most important census years. That is the first year that all people, especially the formerly enslaved, were recorded. This census will list everyone in the household. It will record age; gender; color; occupation; if they own real estate, what is its value; the value of the personal estate; where they were born; whether parents were foreign-born; if an infant, what month born; if married within the year, what month; if attended school that year; whether literate or not; whether deaf, blind, idiotic, or insane; whether a male citizen 21 or older, or whether a male citizen 21 years or older but not eligible to vote. Answers to these questions not only can give you new insights into your ancestors' lives but also help guide your next research steps.
You may be surprised to learn that your family already owned property in 1870. You may wonder where it came from. This is where deed records and property tax lists can be helpful. Many county deed indexes have been microfilmed or digitized. They may be available through the state archives, such as the Maryland State Archives, or in other states, through such sites as FamilySearch or Ancestry, which are available without subscription through public libraries and Family History Centers. Some tax lists may also be microfilmed or digitized. They are also available in the county tax offices.
Figure 6 Record of Freedmen Marriages
Between the end of the Civil War and the early 1870s, the federal government established the Bureau of Refugees, Freedmen, and Abandoned Lands, commonly known as the Freedmen's Bureau. As the official title notes, the Bureau was not just for Freedmen, but it provides an important resource for African American research, because of its work with Freedmen. In Maryland, there were three locations, Rockville, Bladensburg, and Annapolis. Freedmen's Bureau offices helped the newly freed to regularize their marriages, obtain work contracts, settle disputes with employers, and bring charges when criminally attacked. They also ran hospitals and refugee camps. Perhaps the best-known hospital was in Washington, D. C. Known originally as "Freedmen's Hospital," it is known today as Howard University Hospital.
Figure 7 Freedmen's Savings Bank Records
There were other organizations created to help the Freedmen. There was the Freedmen's Savings Bank. All these entries have been digitized and indexed. These records can be a treasure trove of information. They may, though not always, include the names of all the family members and their ages. Sometimes there are indications that some of the children may have had a different parent. Sometimes, even the former enslaver is named.
Education records can provide information on family members who attended and even taught at Freedmen's schools. Receipts for payments to those teaching in the schools can be found in the records.
For more information on the history of the Freedmen's Bureau and the location of their field offices, banks, schools, and hospitals, you can go to Mapping the Freedmen's Bureau.
Figure 8 Civil War Draft Registration, Montgomery County, MD
Many African Americans, both free and enslaved, enlisted in the United States Colored Troops, referred to commonly as the USCT. At first, forbidden to serve, African Americans were granted the right to enlist in July 1862. They would make up 15 percent of the army and 25 percent of the Navy. While some would serve in regular units, the army created special units called the United States Colored Troops (USCT). The best known to be the 54th Massachusetts celebrated in the movie, Glory.
Figure 10 Descriptive Card for a Montgomery County, MD USCT Soldier
The records of those who served during the Civil War, including in the USCT, have been digitized and indexed. These records can show when a person enlisted, their age, where they were living, where they served, if they were injured or got sick, if and where they were hospitalized, if they died in service, where, and possibly where buried. If married, the name of the wife or widow can appear. In Maryland, those who were enslaved at the time they enlisted, may have information on their enslaver. For more information on African Americans in the Civil War, go to the site of the African American Civil War Memorial and Museum. To obtain information on your ancestor on the wall at the African American Civil War Memorial, contact them here.
As with all veterans, these men often applied to the Veterans Administration (VA) for compensation or pension benefits. After their deaths, their widows also may have applied for benefits. VA pension files can be a treasure trove of information. To receive added benefits for a spouse or a widow to receive benefits, proof of marriage must be provided. This may be the first place you can acquire proof of an ancestor's marriage. Proof could include a copy of a marriage license or certificate, an affidavit from the person who married them, and other supporting affidavits from family friends and neighbors.
Figure 9 Civil War Widow's Pension Index Card, Maryland
To receive benefits for children, similar information would need to be provided. Since birth certificates would not exist, affidavits from neighbors, midwives, doctors, and others who had first-hand knowledge may be included. There may be other affidavits that are supportive of the character of the veteran or widow, some of which may mention the claimant's enslaver. Copies of census records or bible records may have been submitted to prove the age of the claimant. Sometimes, even pictures of the veteran or widow may be in the files. These files may hold the only information available that can corroborate your family stories or other circumstantial evidence you have collected. These VA files are not digitized, they must be requested from the National Archives. However, the VA Pension File index that has been digitized and indexed and is available on all major genealogy sites, including FamilySearch, which is a free site.
Before Emancipation
African American research prior to Emancipation is very challenging. While the information on free people of color is found in many of the same records as those for whites, those for the enslaved can be very difficult to find. Those who were enslaved were considered property, so their records are usually found in record groups that deal with property, such as, estate inventories and sales, or deeds.
Uncovering the lives, families, and ancestors of those we have identified on the 1870 census, who were likely enslaved previously, requires identifying the enslavers and researching their records, especially their property records. Chief among those records are the estate records, found in court probate records. These records may include wills, inventories, accounts of sales, distributions of the estate.
Figure 11 Will Bequeathing Enslaved Persons, Montgomery County, MD
Because those enslaved were considered property, they could be bequeathed to family members in wills or sometimes be manumitted as George Washington did. Those left to daughters who subsequently married would be under the control of the husbands, but not technically their estate. Thus, it is important to research both a husband's and wife's family to determine where to research next.
Inventories and Accounts of Sale
When someone dies, an inventory of their estate is compiled. This included enslaved property. The enslaved were named, gender identified, sometimes age or age grouping recorded (child, girl, young woman, old woman, etc.), and monetary value. Sometimes, the monetary value is not mentioned in the inventory, only in the accounts of sales. Sometimes inventories will list people in what seems to be family groups. These names could be compared with family groups on the 1870 census or against other family accounts of members. Other times the names may be separated into lists of males and lists of females.
Figure 12 Account of Sale of Slaves
The accounts will list the individual and monetary value. Those in their prime working years and childbearing years will be noted to have greater monetary value than the very young or the very old. The accounts are important because they will tell the name of the person who bought the enslaved individual. This information can provide the information needed to continue your research.
Distributions of the Estate
When all debts and other provisions of the estate have been satisfied, the assets are distributed to the heirs. This will be in accordance with the will, if there is one, but will follow specific rules if there is no will (known as intestate probate). In intestate probate the heirs are named, then the estate, including enslaved property, will be divided among them. Again, this will help you determine where and whom to research next. Many probate records have been microfilmed or digitized and indexed. In Maryland, most are available either in the county courthouses or at the state archives.
Figure 13 Bill of Sale of Enslaved Persons, Montgomery County, MD
Property bought and sold was usually recorded by a registrar of deeds at the county courthouse, including enslaved property, though not always. In some jurisdictions, sales and purchases of enslaved were recorded in separate sections of the registers, other places not. Unfortunately, there is not uniform compliance with the recording of these transactions. In addition to deeds and bills of sale, deeds of gift, and manumissions can also be found in the property records of the county where your ancestors lived. Therefore, potential deed transactions should be explored.
Figure 14 1860 Slave Census Page, Montgomery County, MD
Slave Censuses
In 1850 and 1860, separate "Slave Schedules" were taken. They were organized according to enslaver, "owner." Unfortunately, the enslaved were not named but rather enumerated by gender and age. However, if you've gathered enough other identifying information, it is possible to make a potential identification of your ancestor in one of these schedules. However, this would not be a place to start. You would need to find other information first.
Maryland Slave Statistics
In 18167, Maryland created a census of enslavers, and those they enslaved before Maryland's new state constitution, which abolished slavery, took effect on 1 November 1864. The enslavers hoped to be able to receive compensation for property lost, as enslavers in the District of Columbia had done. These lists name the enslaver, the enslaved persons, their physical condition, their terms of servitude (some indentures were included), and whether they had served in the military. These and other databases related to slavery in Maryland can be found on the Maryland Archives site, Legacy of Slavery in Maryland.
Figure 15 Manumission of Enslaved Persons, Montgomery County, MD
Manumissions
From time to time, enslavers chose to grant an enslaved person (possibly even including their family members) their freedom. Documents that carried out these wishes are called manumissions. Sometimes an enslaver would manumit their slaves when they died, as George Washington did. Other times they chose to manumit them as a reward for their loyalty or other meritorious services, or because they were their biological children, grandchildren, or half-siblings. Manumissions resulting from a will would be found in the decedent's estate records in the county's probate records. Manumissions granted during the life of an enslaver may be found recorded in the county's deeds or county court records or may be in special manumission files maintained at state archives.
There are many research facilities whose resources can be great resources. Historical societies, such as the Montgomery County Historical Society and its library, other local libraries, community museums, such as Sandy Spring Museum and research library, university libraries, Maryland State Archives, Family History Centers, and county courthouses to name a few, have many resources and collections of records and documents that may hold the answers to your ancestral quest. In addition, the staff and volunteers at these repositories are very knowledgeable and great resources. Many of these repositories also have online resources that can be readily accessed from the comfort of your home computer. For example, a resource of the Family History Library in Salt Lake City, Utah, which maintains FamilySearch and local Family History Centers, has a Wiki page dedicated to African American Genealogy research. To help you with your research in Maryland, the Maryland State Archives has produced its research guide, Researching African American Families at the Maryland State Archives.
Genealogy Societies
The largest genealogical society devoted to African American research is the Afro American Historical and Genealogical Society. They have chapters across the country. In Maryland, there is a Montgomery County chapter, Prince George's County chapter, Central Maryland chapter (Howard County), and Baltimore chapter. The national society holds an annual conference and publishes a newsletter and journal. The Maryland chapters, along with the African American Special Interest Group at the Washington D. C. Family History Center, (Kensington, MD) sponsor a full day, free conference every year in February in celebration of African American History Month. In addition, there are the Maryland Genealogical Society and county genealogical societies in most counties.
At some point in your research, you may wish to explore how DNA can help you overcome "brick wall" problems in your research. DNA can help you extend your research back generations, identifying grandparents or great grandparents whose names have been lost to your family. It can also help you identify unknown cousins, thus reuniting branches of your family that has lost touch over time. Perhaps the most exciting discovery that can be made for African Americans is the possibility of identifying areas in Africa from which your ancestors may have been brought, including DNA matches (distant cousins) who are living descendants of common ancestors from centuries ago in your shared homeland. The most frequently used testing companies include AncestryDNA, 23 and me, FamilyTreeDNA, and MyHeritage.
Additional Research Aids
Kenyatta Berry. The Family Tree Toolkit (New York, NY: Skyhorse Publishing). 2018.
Blaine Bettinger. The Family Tree Guide to DNA Testing and Genetic Genealogy (Fort Collins, CO: Family Tree Magazine), 2016.
Tony Burroughs. Black Roots: A Beginner's Guide to Tracing the African American Family Tree (New York, NY: Touchstone), 2001.
Margo Lee Williams is a historian working on Sandy Spring Museum's Historically Black Communities of Sandy Spring research project. She is an award-winning genealogy and history author. A former editor of the Journal of the Afro-American Historical and Genealogical Society, she is particularly interested in community and family histories of free people of color in the Southeastern United States, especially those from North Carolina and Virginia, who often had mixed-race origins.
Historically Black Communities of Sandy Spring has been made possible in part by a major grant from the National Endowment for the Humanities: Exploring the human endeavor.
Clashing in Sandy Spring
Black Baseball in the Sandy Spring Area


Setting goals is difficult because it is almost exactly equivalent to determining what your life is about. The problem is that we tend to avoid hard things like figuring out what our life is about and fill our lives with easy things like answering email. Only later do we realize that a big stack of easy things done almost never equates to getting just one of those hard things, those big things done.
Don't have all your goals figured out, yet? Welcome to the club. Instead of beating yourself up for not having those goals figured out, how about giving yourself a small taste of getting something done towards that.
Today pick just one of those big things you know would be on your big list of goals and work on that for just one hour today. You might miss the flurry of other activity, but you sure are going to like seeing what you might accomplish once you jump over your unnamed fear and put in even one hour on something that will make a difference in your life.


several months ago i saw a recipe in a magazine for a spinach and butterbean bruschetta. it looked fabulous in the photos and when i read through the recipe i was sold – this was something that i needed to try. i then forgot which magazine it was in and, given i usually have several piles of recipe cuttings lying around, tracking it down wasn't easy.
however, i spent a couple of days over a long and wet weekend sorting through these recipes and filing them away and, as a result, i found the bruschetta recipe.
i made it for friends (it preceded my lentil and spinach lasagne) and it was fabulous! the depth of flavour reminded me of the bruschetta di cavolo nero, fagioli (black eye beans) con l'occio e por we had in siena last year and it is a much more interesting bruschetta than the tomato and basil version that is often people's default choice.
i'm a big fan of bruschetta as a simple supper party starter/snack – if you are too, give this recipe a try. you won't be disappointed.
in a large frying pan sauce the onion and bay leaf in 2 tablespoons of olive oil until the onion is soft and begins to caramelise. add the chilli, sliced garlic and herbs and cook for another minute, stirring often (the smell will be wonderful!). add the butterbeans, 120ml water and the soy sauce. bring to the boil, cover and simmer for 5 minutes.
remove the bay leaf and smash the beans until about half are broken up – don't make a smooth puree. taste and adjust seasoning with more soy sauce and black pepper of needed. mix in the spinach and stir until it has wilted. remove from the heat.
grill the bread on a griddle pan, having brushed each side with the remaining olive oil – don't move it and you'll get the smokey blackened stripes. or you can just toast it. rub one side of each slice with the garlic clove.
to serve, place a piece of bread on a plate and top with a serving of the bean stew. drizzle with extra virgin olive oil (or lemon oil if you have it) and top with a sprinkle of cheese.
variation: this is also delicious with fresh goats curd in place of the parmesan shavings.
* adapted from a mystery recipe!


text:
Coronavirus- patients treated in the parking lot congest SA hospital
Steve Biko Hospital in Pretoria is so full that workers are providing oxygen to some patients in beds wheeled out into the parking lot, as regular cases of Covid-19 in South Africa exceed 20,000, surpassing levels seen during the first wave of the pandemic.
Hospitals are full of capacity in coronavirus hotspots across Africa's most developed country, facing a shortage of beds, declining oxygen supplies, and a scarcity of intensive care units.
On Monday, a Reuters cameraman visited the Steve Biko Academic Hospital in the capital city, operated by the government, and saw a patient getting oxygen on the tarmac outside the emergency department entrance.
Nearby, to cater for more arrivals, hospital workers sprayed beds with sanitizer.
The hospital has erected huge tents where, before being moved to designated wards, some patients receive emergency care.
South Africa had reported more than 1.2 million infections as of Sunday night, the most in Africa, and more than 33,000 fatalities. Last week, infections exceeded 21,000 a day, a new record, propelled by a version of the virus called 501Y.V2 that is thought to be more infectious.
The chief executive of Steve Biko told state broadcaster SABC that treating patients outside was inevitable due to a sudden patient surge.
The condition can alter at any time for Covid-19 patients, including one that looks stable when he steps through the door. In terms of our inner power,
it was overflowing,' said Mathabo Mathebula.

redpajama_set_name: RedPajamaCommonCrawl


To all Taylor Swift fans out there – the wait is almost over! It appears that Taylor Swift will be releasing new music this week, as sources close to the singer reveal.
Namely, the first single from her upcoming sixth album will be released on Friday, August 25!
"The song is poppy," one insider told Us Weekly. It looks like Swift's new album isn't too far away either: "She's being very secretive about it, but it's going to be a really good one," another source says.
There's also talk that the music video accompanying the first single will premiere later this week.
After her upcoming single is dropped, the pop diva (27) will be heading to the MTV Video Music Awards in L.A., where Swift's former friend Katy Perry will be hosting and performing in front of a star-studded audience on Sunday, August 27.
It will be interesting to see Swift's reaction when Katy Perry takes the stage.
Since Swift has been keeping a relatively low profile throughout this year, the star has been quite busy working on her new material in the recording studio.
"She's aiming to release an album this fall," one insider told Us Weekly back in May.


How the CSWRR Operating Sessions Work.
In designing my Consolidated South Western Railroad (CSWRR), I had two major goals that I wanted to achieve. One was to have the feeling of going from one place to another and the other was to have Operating Sessions. The first was accomplished by creating the CSWRR in my 30' by 40' basement. The Operation I wanted would more or less mimic the railroads from where I had lived all my life. I wanted something simple enough that an inexperienced operator could do it, yet difficult enough to make it realistic and challenging for an experienced operator. After having several unsatisfactory experiences on friends railroads where there was either a total lack of instructions or it was so simple to be boring I knew there had to be another way.
First of all, crews must understand what they are expected to do. Thus I developed an instructional method of operation on my Railroad and it has been in use now for over 18 years. The crew members are provided with simple, clear, step by step instructions of what each train is expected to do. Similar to following a TO manual in the military, if you can read and follow the instructions that you read, you can operate the train. The written paperwork is held to a minimum, mainline trains set-out cars in blocks. Only the locals would require switch lists where specific cars need to be routed to specific industries. For a new operator, the hardiest thing they have to learn is where the control points (town locations) are.
After the Model Railroad was well enough along to run trains smoothly, it was time for Operation. The first I had to work out what I wanted each trains to do. Second was to provide the crew members with clear instructions of what their train is expected to do. Third was to keep the paperwork to a minimum. Fourth was to make the sessions as continuous as possible, when one session is complete the trains are in place ready for the next session. For example, the road trains are operated first in one direction, then turned and operated back as another train in the opposite direction, I call this "Regenerative Staging".
I started by making up a list of the trains which operated on the prototype railroad that I was modeling. From the very beginning, it became obvious that there was no way that I would be able to operate all these trains within the 3.5 hour limit I had set as a maximum time for a session. It also became quite clear that as I did not have all the same industries on my railroad as on the prototype, the car makeup of the trains would be different. Thus while I would be using some of the train symbols from the prototype railroad, I would be moving cars based on the industries on my CSW railroad.
Next a list was made up of all the locations on my railroad where cars could be routed to, including industries, interchange, staging and yard tracks. This also included the car holding capacities of each track as well as if it was East or West facing.
Finally a rough Train Work Sheet was developed, showing the location where the train/crew was expected to perform some task. How the trains would share the staging yard tracks as well as how they interact with each other. The first versions of this were quite crude and changed between each session. If you want to try this type of operation, start out with 6 or 8 trains and add on later. I also found out early on that it was necessary to set the number of cars in the train once in each session. This clears out any errors by the crews and allows the trains to fit in the staging tracks and using dedicated power sets to get the train over the road.
Below is a sample of my much refined Train Work List. For the first ten or so years I used train symbols to reference trains, Now for the past several years I have been using the engine numbers with the symbol being secondary as the number on the lead engine is what is obvious and everybody sees. The engines remain on the train all the time and are seldom changed. The number in parentheses is the expected run time for the train. The Train Work List sample shown below only shows the first 9 trains operated in one session.
Next you need to convey to your train crews what you expect them to do with each train. For this I make up an instruction sheet for each mainline train which I call a Train Order, a sample is shown below. (Local crews use a Switch List which I describe later.) This Instruction sheet describes to the operating crew what tasks each train is to perform. These instructions include all the information that a crew needs to run the train including the engine number that the train will be operating under, the DCC address and the starting and terminating locations. These instructions also include what and where set-outs and pick-ups are to be made as well as checks on the number of cars that should be in the train at that time. The sample shown below is folded on the center line and in this case the west bound train is on the left and then the sheet is turned over for the east bound train on the reverse side.
You also need to provide your Yard Crew with instructions on what they are expected to do and in roughly what order to have the cars ready when the road train arrives. Shown below is the instruction sheet that is used on the CSWRR to tell the yard crew what they need to do. This instruction includes the Engine Number assigned to the yard and the types of tasks that the Yard Crew will be performing. The Yard Crew will also break down cuts of cars that have been set-out by through trains or Local returns. The list should also include all the trains which the Yard Crew will encounter during the session, even if it is only passing through and requires no action. Keep the list simple and brief, but include all the information that the crew may require to perform their tasks.
For Local Train crews that will be setting out specific cars to industries, you need to provide them with a switch list similar to the one shown below. This list also includes instructions on which cars to pick-up and which cars to leave. The Switch Lists are the only paperwork which requires any writing by crews, or reading of car numbers. When folded back down the middle, this closely resembles a prototype Switch list. When the crew needs help with following the list, they may open it up to refer to the added help / instructions on the back.
Finally, we get to the Dispatchers Train Sheet. This has evolved over the years to what is shown below. I use Microsoft Excel and it is made to be printed on two 8.5 by 11 inch sheet of paper, then taped together for use. At the top, there is a space for the Dispatchers initials, A Yard crew, their power, B Yard crew, their power and the date. To help the Dispatcher keep track of crew assignments, there is a space to enter the name of the crew. Tracking trains on the railroad is usually done by memory, however some Dispatchers will use stick-on tags to assist them.
When the train has arrived at it's destination, the Dispatcher simply draws a red line through that line on the sheet. As the CSWRR does not use a clock, there is no need to enter any times. Mostly under Routing and Work, there are prompts to aid on how to route the train, work the train needs to do and any other helpful information.
Shown below is the CTC board used on the CSWRR. By observing the lights, the Dispatcher can tell the position of all Main line switches and the blocks that are occupied. Hanging above are the Train Order/Instruction sheets. To the right, is the computer used to monitor the DCC system and view hidden parts of the railroad.
This how the Operation system works on the CSWRR, and it works, we have fun. If you would like to try this system of operation on your railroad look over what I have provided here and give it a try. Yes, my CSWRR is a larger then average model railroad, however a simplified version of this operation could be used on almost any size of railroad. A 4 by 8 Railroad may only require a single sheet, a combination of the Yard Instruction and the train Order sheets. I would like in the near future to describe an operation for the Mooselip display railroad.
• The track work needs to be nearly perfect, derailed cars can spoil the fun real fast.
• Car weight standards need to be carefully followed. An overweight car is hard to pull and reduces train length. An underweight car tends to derail and will "Daisy Chain" on curves. I have found that the NMRA standard for HO (1 oz plus 1/2 oz per inch) works very well.
• Cars must be free rolling. "Lead Sleds" reduce the number of cars that an engine(s) can pull.
• I use dedicated power sets for each train to assure that there is sufficient power to pull the train up the hill without the use of helpers. I have had problems with finding helper crews as it is to mundane to be interesting.
• At some point in the session each train needs to set to a specific number of cars. This is to correct for any unforeseen variations of cars during the session.
• Through Trains without any switching which simply run from their originating point to the terminating point. These are easy trains for the newcomer or the guy that has a hard time understanding the operation. This includes almost all passenger trains. They can also be a drag as an experienced crew will find them very boring.
• Through Trains with switching between their originating point and terminating point. These trains are great for most crew members that have a basic understanding of the operation.
• Local Trains which switch the industries. These trains require the crew to think about how they can get their cars into position to switch each industry in a timely manner without delaying Through Trains. These trains are great for the crew who wants a challenge.
• Yard Jobs work in the two yards to assemble and block the cars for pick-up by Through Trains and make-up cars to be switched by the Local Train crews. Yard Jobs may also service some industries and are quite complex and challenging.
• Yard Crews and Local Crews may substitute their personal power (engines) as long as it runs smoothly and has sufficient pulling power to perform the task.
• Visiting power may be substituted in consists if they have sufficient pulling power, operate smoothly with the remaining CSWRR power in the consist and will remain on the CSWRR for several Operating Sessions. The visiting power replaces a CSWRR engine which is placed in ready storage to be placed back in the consist at any time.
Managing your Operating Sessions where you may have more people for one session than you can keep busy and then the next Session you may be way short. I find that identifying trains ahead of time that may be easily dropped or may be held and run at a later date is extremely helpful. These trains may also be super simple trains that the "new bee", inexperienced operator can run and get the feeling that they are in the middle of the operation. I identify these trains in the Crew column on the Train Sheet with an "A" for annulled and "H" for hold to run at a later time.
If you have any questions I would also be most happy to answer them or provide any additional information.


text:
Q: dynamic id selector not being called or instantiate I am creating a jquery function, when I add new
 this tag with id will increase by one for example select_row1, select_row2, select_row3.
After the row has been increased I try to click on the checkbox but it does not trigger below as well as changing the value where id is #single_price0 and #total_price0
if ( ((meat_length == 1)&&(vege_length == 2)) || ((meat_length == 1)&&(vege_length == 1)) ) {};
var list = $('#add_order_table');
var initial = 0;

    list.click(function(){

    html  = '
';
        html += '';
        //meat
        html += '
';
        html += '
<input type="checkbox" name="meat'+initial+'[]" class="meat"> Black Pepper Fried Chicken
';
        html += '
<input type="checkbox" name="meat'+initial+'[]" class="meat"> Pineapple Pork
';
        html += '
<input type="checkbox" name="meat'+initial+'[]" class="meat"> Bitter Gourd with Dash Fish
';
        html += '
';

        //vege
        html += '
';
        html += '
<input type="checkbox" name="vege'+initial+'[]" class="vege"> Garlic Bayam
';
        html += '
<input type="checkbox" name="vege'+initial+'[]" class="vege"> Oyster Young Pakchoy
';
        html += '
';

        html += '	';
        html += '
RM 0.00
	';
        html += '
<input id="qty'+initial+'"type="text" value="" name="demo" class="text-center qty_spinner">
	';
        html += '
RM 0.00
	';
        html += '
<button type="button" class="btn btn-danger" onclick="$(\'#select-row' + initial + '\').remove();">';
            html += '';
        html += '</button>
	';
    html += '
';

    $('#order_table tbody').append(html);

    $('.qty_spinner').TouchSpin({
        initval: 1,
        min:1,
        max:50,
        buttondown_class: 'btn btn-danger',
        buttonup_class: 'btn btn-primary',
    });

    var row =  $("#select-row"+initial);
    row.on('change',function(e){

        var meat_length = $('input[class="meat"]:checked').length;
        var vege_length = $('input[class="vege"]:checked').length;

        if (meat_length == 0 || vege_length == 0) {
            $("#single_price"+initial).text("0.00");
            $("#total_price"+initial).text("0.00");
        };

        // 5.50 meal function
        if ( ((meat_length == 1)&&(vege_length == 2)) || ((meat_length == 1)&&(vege_length == 1)) ) {
            // set single price without parsing
            $("#single_price"+initial).text("5.50");
            //get single price with parsing
            var single1 = parseFloat($("#single_price"+initial).text()).toFixed(2);
            // get quantity value
            var qty1 = parseInt($("#single_qty"+initial).val());
            //single price multiply
            var total = parseFloat(single1*qty1).toFixed(2);
            $("#total_price"+initial).text(total);
        };

        // 6.00 meal function
        if ( ((meat_length == 2)&&(vege_length == 1)) || (meat_length == 2) ) {
            // set single price without parsing
            $("#single_price"+initial).text("6.00");
            //get single price with parsing
            var single1 = parseFloat($("#single_price"+initial).text()).toFixed(2);
            // get quantity value
            var qty1 = parseInt($("#single_qty"+initial).val());
            //single price multiply
            var total = parseFloat(single1*qty1).toFixed(2);
            $("#total_price"+initial).text(total);
        };

    });

    initial++;
});

A: Wrap initial in a function, so it preserves the increment within the change function:
(function(initial) {
    var row =  $("#select-row"+initial);
    row.on('change',function(e){

    var meat_length = $('input[class="meat"]:checked').length;
    var vege_length = $('input[class="vege"]:checked').length;

    if (meat_length == 0 || vege_length == 0) {
        $("#single_price"+initial).text("0.00");
        $("#total_price"+initial).text("0.00");
    };

    // 5.50 meal function
    if ( ((meat_length == 1)&&(vege_length == 2)) || ((meat_length == 1)&&(vege_length == 1)) ) {
        // set single price without parsing
        $("#single_price"+initial).text("5.50");
        //get single price with parsing
        var single1 = parseFloat($("#single_price"+initial).text()).toFixed(2);
        // get quantity value
        var qty1 = parseInt($("#single_qty"+initial).val());
        //single price multiply
        var total = parseFloat(single1*qty1).toFixed(2);
        $("#total_price"+initial).text(total);
    };

    // 6.00 meal function
    if ( ((meat_length == 2)&&(vege_length == 1)) || (meat_length == 2) ) {
        // set single price without parsing
        $("#single_price"+initial).text("6.00");
        //get single price with parsing
        var single1 = parseFloat($("#single_price"+initial).text()).toFixed(2);
        // get quantity value
        var qty1 = parseInt($("#single_qty"+initial).val());
        //single price multiply
        var total = parseFloat(single1*qty1).toFixed(2);
        $("#total_price"+initial).text(total);
    };

    });
})(initial);

redpajama_set_name: RedPajamaStackExchange


Please refer to our stock # 1007 when inquiring.
Beautiful covered, reticulated, Royal Crown Derby potpourri jar with exquisite heavily decorated gold design over cobolt blue and pale yellow. Measures 14" tall x 8" wide. Minor loss to gold in a couple of places, but otherwise in perfect condition.


text:
Connect Recommends
Badfish, Passafire
Over a decade has passed since Brad Nowell, lead vocalist of the California-based reggae/rock crossover band Sublime died of a heroin overdose. Yet, in that time, improbably, the band (and its back catalog) have become ever more popular, year after year. Hell, they even had a brand of alcoholic lemonade named after them, if memory serves. Badfish is one of the more well-known Sublime tribute bands on the road these days and they have been for ages. They routinely pack clubs and theaters with folks who either never got to see Sublime in their heyday, or did, but still need a fix. Local favorites (and budding national phenoms Passafire open with their own original take on this continually evolving genre. $18 advance tix available now. Wed., June 6, 8 pm, Monkey Business (Hilton Head). ****
Kate Campbell
Enoch Hendry of Trinity UMC is a diehard music fan — especially when it comes to acoustic singer/songwriters. As such, he's occasionally arranged for standout talents in this field to play gigs in the beautiful and acoustically impressive confines of his church. This free show is sponsored by The Foundry Fellowship, and coincides with the South Georgia Conference of the United Methodist Church. Campbell's voice and songwriting gifts are well-known among fans of the burgeoning Americana genre. She gets comparisons to Lucinda and Emmylou, and this veteran of the folk festival circuit's latest CD finds her interpreting tunes by songwriters who have inspired her the most. The acoustic guitarist will be joined by veteran bassist Don Porterfield. For more info, call Pastor Enoch Hendry at 233-4766. Tues., 8 pm, Trinity United Methodist Church - FREE TO ALL-AGES.
Part motivational speaker, part high-on-life motivational speaker, part budding slacker cult leader, and part Radio Shack low-tech electronics geek, Baltimore's own Dan Deacon is not for everyone, but those who like him act like Lola Heatherton: they want to bear his children. His silly, sweaty, vaguely dance-oriented "gigs" are as much pieces of bizarre performance art with copious amounts of freeform audience participation as they are traditional concerts — even in the contemporary world of electroclash. Deacon has a solid following of SCAD kids, which is owed in part to a viral internet video of an on-air, Borat-style prank he pulled on local TV personality Lindy Brannen some time ago. With avant-garde opening act Video Hippos, and this club's resident DJ D-Frost and friends. Thurs., 10 pm, The Jinx.
This is being billed as the last local show for some time from this melodramatic piano-driven, modern alt.rock act which formed in Savannah, but is now relocating to Chicago in pursuit of bigger and better things. Their DIY recordings and slick promotional videos (courtesy of connections to SCAD's impressively equipped video and film department) bode well for the group, whose music and approach has drawn comparison to acts as disparate as Arcade Fire and U2. The Winter Hours, rising stars in the latest wave of Athens, Ga. indie-rock bands opens with a set of moody, richly-layered guitar rock, as does local, synth-heavy experimental pop combo Unsolved Mysteries. Fri., 11 pm, The Jinx.
Ziggy Marley, The Nevilles
In less than 5 years, SCAD's "New Alumni" concert in Forsyth Park has become a hotly-anticipated annual tradition. Their first headliner for this massive, free, public concert was P-Funk mastermind George Clinton. The following year they brought the late, great funk icon James Brown. Last year's appearance by Blues Traveler was a let down to many, but that didn't stop locals from voting it Best Concert of 2006 in our recent Readers' Poll. Now things seem to be back on track with this double bill from two of the biggest families in the history of rock, funk, reggae and soul music. Ziggy has taken the music his late father Bob pioneered into a more dancey vibe than might have been expected, while The Neville Brothers are internationally known ambassadors of Louisiana music. Bring a lawn chair and get there early for the best view. Fri., 7 pm, Forsyth Park - ALL-AGES.
The Sapphire Bullets
A rare public gig from this 13-piece R & B revue featuring several of the most experienced and respected players in town. This rustic but swanky restaurant and bar is right on the water and only about 30 minutes from Savannah. Admission is $10 at the door. Sat., 9 pm, Sunbury Crab Company (Sunbury).
Civvies hosts benefit show for Savannah Harm Reduction Coalition
Walter Parks revamps Swamp Cabbage, returns to Savannah
Blues-rock titan Tab Benoit brings rock show to Victory North
Memorial gathering, tattoos for Athon


text:
■Music
Sublime Legend Judy Collins at Cafe Carlyle, Introduces "Send in the Clowns": "We know where the clowns really are"
"I love you," Judy Collins, a vision in white from mane to silvery toe, shouted out to Clive Davis, and...
Theater Review: Dramatically Innovative "Flight" from Edinburgh Lands Safely in New York
The McKittrick Hotel is well known for unusual theatrical events—cue the long-running immersive Sleep No More. Now fresh from Edinburgh's International Arts Festival comes...
Review: "The Only Living Boy in New York" Features a Little Simon & Garfunkel and a Rogues' Gallery of Hip New Yorkers
In "Baby Driver," the whole musical pay off to the film is Simon & Garfunkel's title song at the end. Not so in the...
Michael Moore's All Star Opening Night Broadway Audience: From Harry Belafonte, Rosie O'Donnell, Marlo Thomas, Phil Donahue And More
Michael Moore scored an all star audience for his opening night on Broadway. His one man show, "The Terms of My Surrender" has earned...
Review: Kathryn Bigelow's "Detroit" Leaves Nowhere to Run, Nowhere to Hide
Director Kathryn Bigelow and writer Mark Boal -- Oscar winners for "The Hurt Locker" -- collaborated to give us a vision of "enhanced interrogation"...
Steven Spielberg, Tom Brokaw Salute "Five Came Back," WWII Netflix Doc About Hollywood Directors
"We still have not come to grips with World War II," asserted newsman Tom Brokaw, the author of several books on the subject. "It...
Broadway: Lynn Nottage's High Wattage "Sweat" Provides a Backstory for Our Current Trump Troubles
by Regina Weinreich - March 27, 2017 12:58 pm
For those still pondering how we got to Trump in the White House, "Sweat," Lynn Nottage's play opened last night at the Roundabout Theater/Studio...
Hamptons: Barbra Streisand Visits Donna Karan, Matthew Broderick & Treat Williams Go Hall & Oates
THE HAMPTONS-- Barbra Streisand is here. Coming off her hit tour and now having a hit album, Streisand has made her annual journey to...
■Television
Jane Fonda on Relationships: "It took me 72 years to realize kindness is a good thing to look for"
by Regina Weinreich - May 30, 2016 3:20 pm
Emmy season is upon us, which means Jane Fonda and Lily Tomlin are back in the mix with season 2 of "Grace and Frankie"...
Bruce Springsteen Raises $740K for Vets at Bob Woodruff's 9th Annual "Stand Up for Heroes"
by Regina Weinreich - November 11, 2015 11:53 am
For the 9th year in a row, ABC's Bob Woodruff, his wife Lee, and Caroline Hirsch and Andrew Fox raised money for vets and...
Prev1...567Next Page 6 of 7


As an ICT service provider, Prime delivers Data Centre services, Enterprise-grade Cloud Services, Security services, Network services, Application services, Technology Integration services and related Managed service. Our Managed service plays a crucial role in providing end-to-end IT management services to transform an organization's IT needs and align with current and future business needs.
Prime Managed Service helps you to build and operate your company's critical IT infrastructure more efficiently, without having to move from your current site. With our resources, advanced toolset and proven ITIL-based service framework, you can improve the quality and reliability of your IT operation – with fewer headaches and lower risk.
Prime can design, procure, deploy, manage, support, maintain and expand your IT infrastructure just about anywhere including your company data centers, remote offices and collocation centers run by other service providers. As a result, you avoid the costs of managing hardware, can grow as your business dictates, and can focus your internal IT staff on strategy instead of maintenance.
Specialist on Open Source platform & with its innovation, it can rule the world by its customized solution & own house development on plug-in.
Group of experts joined together to leverage their expertise (gathered knowledge for years in the renowned players on this sector) for you.
Optimizing the cost in terms of tools without compromising the performance & quality bench-marking.
How can Prime add value to your investment?
Meet stringent SLA expectations of business users, in terms of service availability and Performance on a 24X7 basis for the managed service.
Enhance responsiveness to changing business needs by improving flexibility, speed of technology innovation and support.
Ensure better return on invested capital by optimizing IT infrastructure through consolidations, capacity planning and new technology adoption.
Enabling compliance to statutory / regulatory requirements.
Are You Aware of Cyber Attacks on Smart Cities?
Simple vulnerabilities if not addressed can cause big problems and have big impact, whether it's a water barrage or power grids, financial institutions, water systems or online networks, all these infrastructures are going to be at risk and would be under threat like never before, and we need to do more to safeguard these critical infrastructures. Technologies used by smart cities would pose a major cyber security threat and open the door for several possible cyber-attacks.


text:
\section{Introduction} \label{sec:intro}

Many massive graphs appear in practice as a temporal \emph{stream of edges}.
People call each other on the phone, exchange emails, or co-author a paper;  computers exchange messages;  animals come in the vicinity of each other;  companies trade with each other. Each such interaction is modeled as an edge in the graph, and has a natural timestamp.

Due to the need for real-time awareness despite the volume of such transactions,
there is much interest in processing temporal graphs using fast, limited-memory algorithms.
Formally, think of the input as a sequence of edges $e_1, e_2, \ldots, e_m$. Some of the edges may be repeated, meaning that (say) $e_1\! =\! e_{100}\! =\! e_{125}\! =\! (u,v)$.
We are interested in small space streaming algorithms that make a \emph{single pass} over the stream $e_1, e_2, \ldots, e_m$.
Such an algorithm maintains data structures that are many orders of magnitude smaller than the stream itself.
At every timestep $t$, these data structures are updated rapidly (possible randomly).
The algorithm computes an accurate estimate for the property of interest on the graph seen so far.
Because of the single pass and small space, the algorithm cannot revisit edges that it has forgotten. Furthermore, it cannot always determine if the new edge, $e_t$, has appeared before.
This work focuses on triangle counting in this setting.

\textbf{Graph vs multigraph:}  Previous results assume that
the edge stream forms a simple graph, and no edge is  repeated in the stream.
This is a useful assumption for algorithmic progress; yet, often false in practice.
Real-world graph streams are multigraphs, in that same edges can occur repeatedly in the data stream.
The simple graph representation is obtained by removing duplicate edges.
For example, the classic {\tt Enron}{} email dataset is really a multigraph with 1.14M edges, while the underlying simple graph has only 297K edges.
Similarly, a {\tt DBLP}{} co-authorship graph recently collected is a multigraph with 3.63M edges, but the underlying simple graph  has only 2.54M edges.
Close to 10 million edges in
a popular dynamic {\tt Flickr}{} network dataset (see~\cite{graphrepository2013, mislove-2008-flickr}) are repeated.

The assumption of simplicity is implemented in practice with an extra pass
to remove duplicate edges. \emph{This pass requires storage of the entire simple graph, which is completely ignored
in all previous work.} Indeed, if one can store the entire simple graph, there exist much better
algorithms for triangle counting~\cite{ScWa05-2,TsKaMiFa09,SePiKo13}.
We posit that for streaming algorithms to be actually useful in practice,
multiple edges must be dealt with small space.
There is much work on streaming graph algorithms (see surveys~\cite{NeAhKo13,McG14}).
Yet this algorithmic work ignores important issues  such as  repeated edges and temporal aggregation that arise when looking at a real-world graph stream, as  demonstrated in \Fig{prev-multi}.

\begin{figure*}[t]
  \centering
  \subfloat[{Real stream}]{\includegraphics[width=0.4\textwidth]{prev_work_real}\label{fig:prev-multi}}\
  \subfloat[{Simple}]{\includegraphics[width=0.4\textwidth]{prev_work_simple}\label{fig:prev-simple}}\
   \caption{Previous works when run on multigraph {\tt DBLP}{} converge (as storage increases) to an incorrect value. On the simple graph {\tt DBLP}, they converge correctly.}
  \label{fig:prev-works}
\end{figure*}

\textbf{Aggregation over time:} Given a stream of edges, what is the actual graph? The most common answer
is to simply aggregate all edges ever seen. Again, this is a useful assumption for algorithmic progress, but
ignores the temporal aspect of the edges. Time is a complex issue and there are no clear solutions.
One may consider sliding windows in time or have some decay of edges. For simplicity, we focus on sliding
time windows (like edges seen in the past month, or past year).
Even for sliding windows,
it is not clear what the width should be. Observations can often be an artifact of the window size~\cite{Mac12}.
Therefore, it is essential to observe multiple time windows at the same time, instead of committing to a single one.

\Fig{dblp-window} shows how our algorithm \mgt \ can analyze  different time windows with a single run.  Our algorithm estimates the triangle counts for any time window without altering its data structures, as the time window is only used in calculating the estimate.

\begin{figure*}[t]
  \centering
  \subfloat[{{\tt DBLP}: transitivity}]{\includegraphics[width=0.23\textwidth]{dblp_window_trans.png}\label{fig:dblp-w-gcc} } \
  \subfloat[{{\tt DBLP}: triangles}]{\includegraphics[width=0.23\textwidth]{dblp_window_tri.png}\label{fig:dblp-w-tri}}\
   \subfloat[{{\tt Enron}: Transitivity}]{\includegraphics[width=0.23\textwidth]{enron_window_trans.png}\label{fig:enron-w-gcc}} \
  \subfloat[{{\tt Enron}: triangles}]{\includegraphics[width=0.23\textwidth]{enron_window_tri.png}\label{fig:enron-w-tri}}

   \caption{Transitivity and triangles estimates for varying window lengths for {\tt DBLP}\  coauthorship  and {\tt Enron}\  email networks: Our algorithm
   stores less than 3\% of the multigraph stream yet produces fine-grained triangle results.}
  \label{fig:dblp-window}
\end{figure*}

\subsection{Triangle counting}
The abundance of triangles has been observed in networks arising in numerous scenarios,
such as  social sciences~\cite{Co88,Po98,Burt04,FoDeCo10}, spam detection~\cite{EcMo02}, community detection~\cite{GS12}, finding common topics on the web~\cite{BeBoCaGi08}, bioinformatics~\cite{Milo2002}, and modeling and characterizing real-world networks~\cite{SeKoPi11,DuPiKo12}. Subsequently, there has been a lot of work on triangle counting in graph streams \cite{JoGh05,BuFrLeMaSo06,AhGuMc12,KaMeSaSu12,TaPaTi13,PaTaTi+13,JhSePi13,AhDuNe+14}, and  in various other settings (see e.g., \cite{SPK14} and references therein).
The result of Ahmed et al.~\cite{AhDuNe+14} is arguably the state-of-the-art, with a storage
significantly smaller than previous algorithms. None of these results explicitly deal with multigraphs.

Formally, we are processing a multigraph
stream $e_1, e_2, \ldots, e_m$. At every time $t$, consider the underlying \emph{simple} graph $G_t$ formed by
edges $e_{t-\Delta t},\ldots,e_t$. So take all these edges, and remove duplicates.
We wish to output the triangle count (alternately, the
transitivity) of $G_t$ for all times $t$. The window length $\Delta t$ may be defined in different ways.
It could either be in terms of number of edges (say, the past 10K edges), or in terms
of the semantics of timestamps (say, edges seen in the past month). Most importantly,
we want a single-pass small space algorithm to handle multiple windows lengths and do not
want different passes for each window length.

A reader may wonder why we only output estimates for the underlying simple graph.
Ideally, we would like to compute measures that involve the multigraph structure.
We agree that this is an interesting problem, and duplicates have their
own significance. Currently, it is standard to focus on simple graphs, and there is no consensus on how to define triadic measures
on  multigraphs. This is  an exciting avenue for future work.

\textbf{Why is this a difficult problem?} Multigraphs are a major challenge for triangle counting algorithms. Edges appears with varying frequencies, and (in our setting) we do not wish
to be biased by this. Furthermore, triangles can be formed in different ways.
Consider edges $a, b$, and $c$ that form a triangle. These edges may appear in the multigraph
stream in many different ways. For example, these edges could come as $a,a,\ldots, b,b,\ldots, c,c,\ldots$, or as $a,b,c,a,b,c,a,b,c,\ldots$.
(Observe how this is  \emph{not} an issue for simple graphs.)
These patterns create biases for existing triangle counting algorithms, which we explain in more detail
later.

For now, it suffices to say that existing algorithms~\cite{BuFrLeMaSo06,JhSePi13,PaTaTi+13,TaPaTi13,AhDuNe+14} will give different estimates
for triangle counts of different multigraphs streams that contain the same simple graph.
This is demonstrated in \Fig{prev-multi}, where we run
previous streaming triangle counting algorithms on the raw {\tt DBLP}{} multigraph stream.
Previous algorithms converge to an incorrect value as their storage increases.
They all perform extremely well if all duplicates were removed from the stream (\Fig{prev-simple}).
Previous work on multigraph mining explicitly states
triangle counting of streaming multigraphs as an open problem~\cite{CormodeM05}.

\subsection{Preliminaries}

The edge stream is denoted by $e_1, e_2, \ldots, e_m$.
We focus on undirected graphs, so each edge is an unordered pair of vertex ids.
The simple graph formed by edges $e_{t'},\ldots,e_t$ is denoted by $G[t',t]$.
A \emph{wedge} is a path of length $2$.
The set of wedges in a simple graph $G$ is denoted $W(G)$, and the set
of triangles by $T(G)$. A wedge in $W(G)$ is \emph{closed} if it participates
in a triangle and \emph{open} otherwise. The \emph{transitivity} is the fraction
of closed wedges, $\tau(G) = 3|T(G)|/|W(G)|$.
Our aim is to maintain the transitivity and triangle count (for all $t$) of the graph
$G[t-\Delta t,t]$, where $\Delta t$ is the desired window of aggregation.
The window is usually specified as a fixed number of edges or
a fixed interval of time (like month, year, etc.), though the algorithm works
for windows lengths that change with time. For convenience, we
denote $G_t = G[t-\Delta t,t]$, $E_t = E(G_t)$, $W_t = W(G_t)$, $T_t = T(G_t)$,
and $\tau_t = \tau(G_t)$.

\subsection{Our Contributions}

We design a small space streaming algorithm, {\sc MG-Triangle}, to estimate transitivity and triangle counts for multiple time windows on multigraphs.
As mentioned earlier, the main technical contribution is in handling repeated edges without a separate storage-intensive deduplication
process.
We consider this work as a first step towards small space streaming analytics for real-world graph streams. %

\begin{asparaitem}
\item {\bf The multiedge problem:} We applied previous streaming triangle algorithms~\cite{PaTaTi+13,JhSePi13,AhDuNe+14}
on multigraph streams, and showed that they fail to give correct answers. \Fig{prev-multi} shows how all
these algorithms converge as their storage increases to an incorrect estimate on a {\tt DBLP}{} multigraph stream.
Of course, these algorithms
were designed with the assumption of simple graph streams, and have excellent convergence properties (\Fig{prev-simple}). These results show how repeated edges
are a problem and why we need new algorithms for multigraph streams.

\item {\bf Theoretical and empirical proofs of convergence:} We give proofs
of convergence for {\sc MG-Triangle}. Our algorithm is based on wedge sampling~\cite{ScWa05-2,SePiKo13} and borrows
ideas from~\cite{JhSePi13,AhDuNe+14}.
It is provably correct on expectation.
We also  prove variance bounds, but {\sc MG-Triangle}{} shows much better performance in practice than such bounds would indicate. We perform detailed
experiments to prove that our algorithm gives accurate estimates
with little storage (less than 5\% of the stream in all instances). In \Fig{prev-multi}, we observe
how {\sc MG-Triangle}{} converges to the correct value storing at most 60K edges (the stream size is 3M).

\item {\bf Low storage required on real-world graphs:} Our algorithm stores less than 5\% of the stream
in all instances, and gives accurate estimates for transitivity and triangles counts.
For example, we converted a 223M edge {\tt orkut} graph~\cite{Snap} to a 500M edge multigraph, where  our algorithm produced triangles estimates within $1\%$ relative error.
The storage required was just 1.2M edges, less than $0.5\%$ of the stream.
Our algorithm's worst performance (on a livejournal social network) only led to $0.04$ additive error in transitivity, and 8.7\% relative error in triangle count.

\item {\bf Multiple time window estimates in real-world graph streams:}
\Fig{dblp-window} presents
an example output of {\sc MG-Triangle}{} on a {\tt DBLP}{} coauthorship
graph stream.
{\sc MG-Triangle}{} makes a single pass and stores less than 100K edges ($<\!3\%$ of total stream).
It gives estimates for transitivity and triangles count at every year for window sizes
of 5, 10, 15, 20 years, and all of time. In other words, at year (say) 2013,
it gives triangle estimates for the simple graphs that aggregates
edges in the following intervals: 2009--2013, 2004--2013, 1999--2013, 1994--2013,
and 1938--2013.
We immediately detect specific trends for different windows, like increasing window size
decreases transitivity (even though triangle count naturally goes up). Also note the overall
decrease of transitivity over time. We also perform such analyses on an email network
and a social network, and observe differences between these graphs.
\end{asparaitem}

\section{Effects of repeated edges on triangle counting} \label{sec:effect}

We describe previous practical streaming triangle algorithms and
explain why repeated edges is a challenge. We hope that this provides better
context for our work and explains how important the assumption of simple graphs is
for previous work. Our focus is on the neighborhood sampler of Pavan et al.~\cite{PaTaTi+13},
the wedge sampler of Jha et al.~\cite{JhSePi13}, and the sample-and-hold algorithm of Ahmed et al.~\cite{AhDuNe+14}.
To the best of our knowledge, these are the algorithms with established practical performance
and good theoretical guarantees. (We omit the algorithm of Buriol et al.~\cite{BuFrLeMaSo06}, since its
practical performance is not good even for million edge streams~\cite{JhSePi13}.)
For the sake of exposition, we formulate and describe the algorithms in slightly different
terms from the original papers.

\textbf{Reservoir sampling vs hashing:} All algorithms sample uniform random edges
from the stream, either by reservoir sampling or sampling an edge with fixed probability, which poses
 a problem in multigraph streams, since frequent edges
have a higher probability of being sampled.  This problem  can be mitigated by using
random hash functions.
Suppose we wish to store each edge of the underlying simple graph from the stream with probability $\alpha$. Each edge should be equally likely to be selected, independent of its frequency.
Let $hash$ be a uniform random function into the range $(0,1)$.
When the algorithm sees an edge $e$ in the stream, it stores the edge
if $hash(e) < \alpha$.
Observe that the probability that an edge is selected only depends on its hash value and \emph{is independent
of its frequency}. We also stress that, for simple graph streams, hash based sampling is essentially
equivalent to any other uniform random method.

Hashing provides an easy fix for the basic sampling problem, and is actually a convenient
implementation method even for simple graphs. (We implemented all previous algorithm using hashing.)
But the real challenge is debiasing, which comes next.

\textbf{Neighborhood sampling~\cite{PaTaTi+13}:} Let edge $f$ be a neighbor of $e$, if $e$ and $f$ intersect.
The main idea of~\cite{PaTaTi+13} is to pick a uniform random edge $e$, and then pick a uniform random neighbor $f$
of $e$ from the subsequent edges. This provides a wedge $\{e,f\}$, which is then checked for closure
to provide a triangle. This process samples triangles non-uniformly. Pavan et al. cleverly debias by counting the number of following edges adjacent to $e$. (Equivalently, keeping track of the degree of vertices after storing $e$.) The algorithm takes a number of independent samples
to get a low-error estimate. The method is provably correct and has excellent behavior in practice.

But multigraphs affect this debiasing. Tracking (simple) degrees of a vertex $v$ is a non-trivial task,
and requires counting the number of distinct edges incident to $v$. This itself
requires a space overhead and it is not clear how to get a complete small-space extension of this approach for multigraphs.

\textbf{Sample-and-hold~\cite{AhDuNe+14} and wedge sampling~\cite{JhSePi13}:} Ahmed et al. give an
elegant algorithm for triangle counting. Simply
store every edge with some fixed (small) probability. For every edge $e$ in the stream, count the number
of triangles formed by $e$ and a wedge among the stored edges. The sum of these counts
can be used to estimate the total number of triangles. The final algorithm is simple, converges extremely rapidly, and is space efficient
(To date, it is arguably the best streaming triangle counting algorithm).
The wedge sampling algorithm of Jha et al~\cite{JhSePi13} can also be thought
of in this framework, except that it tracks a subset of the wedges created by stored edges.

Without getting into details, it suffices to say that the correctness of these algorithms
hinges on a critical fact. Every triangle (in a simple graph) stream has a unique wedge
that closes in the future. Suppose edges $\{e,f,g\}$ form a triangle, and edges
appear in order $e,\ldots,f,\ldots,g$. Then the wedge $\{e,f\}$ is closed subsequently
by edge $g$. It can be shown that both algorithms sample triangles uniformly, leading to unbiased estimates.
This is not true for multigraph streams. If they appear
in the stream as $e,f,g,e,f,g,e,f,g,\ldots$, there is no unique wedge closed in the future. (Indeed, all
wedges are closed in the future.) This is a significant problem and increasing storage does not mitigate this problem.
As demonstrated in \Fig{prev-multi}, these algorithms converge to an incorrect estimate as storage increases.

\section{Proposed algorithm}
Our algorithm \mgt{} takes as input sampling rates $\alpha, \beta \in (0,1)$
and a window $\Delta t$. The window is specified as a fixed number of edges or
a fixed interval of time (like month, year, etc.).
We describe the data structures used by \mgt.
\begin{asparaitem}
	\item Lists {\it e-list}, {\it w-list}: These are lists consisting of random edges and wedges, respectively.
	The sizes of these lists are controlled by $\alpha$ and $\beta$.
	\item Flags $X_w$: For each wedge $w \in$ {\it w-list}, we have a boolean flag $X_w$
	supposed to denote whether it is open or closed.
\end{asparaitem}
As mentioned earlier, it is convenient to think of $hash$ as a uniform
random function into the range $(0,1)$.
Abusing notation, we will use $hash$ to map various different
objects\footnote{This is implemented by appropriately concatenating vertex ids.}
such as edges, wedges, etc.

\begin{algorithm2e}
\caption{\mgt($\alpha,\beta,\Delta t$)}\label{algo:estimate}
\DontPrintSemicolon
\nl\ForEach{edge $e_t$ in the stream}{
	\nl Call {\tt update}($e_t$). \;
	\nl	\ForEach{wedge $w$ in  {\it w-list}}{\label{step:id-begin-bias-correction}
		\nl	Let $w = \set{(u,v), (u,w)}$. \;
		\nl	\If {$e_t$ is the closing edge $(v,w)$}{
		\nl	Set $X_w$ to $1$.\;
	 	}
		\nl	\ElseIf{$e_t \in \set{(u,v), (u,w)}$}{
		\nl	Reset $X_w$ to $0$. \tcp*[r]{bias-correction} \label{step:reset}
		}
	}
	\nl Let $\mathcal{W} \subseteq$ {\it w-list}{} be the set of wedges that formed in time $[t-\Delta t,t]$.\;
	\nl Output $\widehat{T}_t = (\alpha^2\beta)^{-1}\sum_{w \in \mathcal{W}} X_w$.\;
	\nl Output $\widehat{W}_t = (\alpha^2\beta)^{-1}|\mathcal{W}|$ and $\tau_t = 3\widehat{T}_t/\widehat{W}_t$
	(if $\widehat{W}_t = 0$, set $\tau_t = 0$).
}
\end{algorithm2e}

\begin{algorithm2e}
\caption{{\tt update}($e_t$)}\label{algo:update}
\DontPrintSemicolon
\nl \If {$hash(e_t) \leq \alpha$ and $e_t \notin$ {\it e-list}} {
	\nl Insert $e_t$ in {\it e-list}. \;
	\nl \ForEach {wedge $w = (e,e_t)$ where $e \in$ {\it e-list}} {
		\nl \If {$hash(w) \leq \beta$ and $w \notin$ {\it w-list}{}} {
			\nl Insert $w$ in {\it w-list}.\;
			}
		}

	}
\end{algorithm2e}

\subsection{High level description}

The first step on encountering edge $e_t$
is to update the lists {\it e-list}{} and {\it w-list}. This is done in procedure
{\tt update}. The idea is based on standard hash-based sampling. We add $e_t$
to {\it e-list}{} if $hash(e_t) \leq \alpha$ and $e_t$ is not already in {\it e-list}.
Then, we look at all the wedges that $e_t$ creates with existing
edges in {\it e-list}. We apply another round of hash-based sampling
to put these wedges in {\it w-list}.

Critically, if an edge $e$ enters {\it e-list}, it never
leaves. If $e$ enters {\it e-list}{}, it does so the first time it appears in the stream.
The probability of an edge entering {\it e-list}{} is independent of its frequency
in the stream. This is vital to get unbiased samples of edges in the underlying simple graph $G_t$.
Similar statements hold for wedges.

\textbf{Checking for closures and debiasing:}
We encounter edge $e_t$ and have updated {\it e-list}{} and {\it w-list}.
For each wedge $w \in$ {\it w-list}, we have a boolean variable $X_w$. If $e_t$
closes $w$ (so $w$ and $e_t$ form a triangle), we set $X_w \!=\! 1$. This is
the standard wedge-sampling approach~\cite{ScWa05-2,SePiKo13,JhSePi13}. At this point,
the algorithm would basically be that of~\cite{JhSePi13}, implemented with hash-based
sampling. As argued earlier and shown in~\Fig{prev-works}, this algorithm does not
work.

To fix the biasing, we perform a somewhat mysterious step.
We have wedge $w \in$ {\it w-list}{} and encounter $e_t$. If $e_t$ is already
part of $w$, we simply reset $X_w$ to $0$. So even though $w$ may be closed,
we just assume it is open. This completely resolves the biasing, and we give
a formal proof in \Thm{main}.

\textbf{Outputting the estimate:} Finally, we need to output estimates,$|\widehat{T}_t|, |\widehat{W}_t|, \widehat{\tau}_t$ for $|T_t|, |W_t|, \tau_t$, respectively.
This is the only step where the time window $\Delta t$ is used. We look at all wedges
in {\it w-list}{} that formed in the time $[t-\Delta t,t]$. The total number of these
wedges can be scaled to estimate $|W_t|$. The number of these wedges, where $X_w = 1$
is scaled to estimate $|T_t|$, and the appropriate ratio estimates $\tau_t$.

\subsection{Theoretical analysis} \label{sec:theory}

We prove that the \mgt{} is correct on expectation
and prove weak concentration results bounding the variance.
We also show some basic bounds on the storage of \mgt.
Throughout this section, we focus at some time $t$ and the simple graph $G_t$.
We stress that there is no distributional assumption
on the graph or the stream. All the probabilities are over the internal randomness
of the algorithm (which is encapsulated in the random behavior of $hash$).

\begin{restatable}{lem}{problemma}
\label{lem:prob} Consider time $t$. For any edge $e \in G_t$,
the probability that $e \in$ {\it e-list}{} is $\alpha$.
For any wedge $w \in W_t$, the probability
that $w \in$ {\it w-list}{} is  $\alpha^2\beta$.
\end{restatable}

\begin{proof} Consider edge $e$. We first argue that  $e\! \in$\! {\it e-list}{} iff $hash(e) \!\leq\! \alpha$
(Note that this is independent of  the frequency of $e$).
Suppose $hash(e) \!\leq \!\alpha$. At its first  occurrence,  $e$ enters {\it e-list}\ and remains in {\it e-list}.
Suppose $hash(e) \! >\!  \alpha$. At no timestep will $e$ be added to {\it e-list}, regardless of how many times
it appears.
From the randomness of $hash$, $hash(e) \!\leq\! \alpha$ with probability $\alpha$. Hence, $e \in$
{\it e-list}{} with probability $\alpha$.

For wedge $w\! =\! \{e,e'\}$
to be in {\it w-list}, both its edges must be in {\it e-list}.
That means both $hash(e)$ and $hash(e')$ are at most $\alpha$.
Suppose the first occurrence of $e$
is before that of $e'$. At the first time $e'$ occurs, procedure {\tt update}{}
will add $w$  to {\it w-list}\ iff $hash(w) \leq \beta$.
At any subsequent occurrence of $e$ or $e'$, the wedge $w$ is not considered
for adding to {\it w-list}{} (simply because $e$ and $e'$ are already in {\it e-list}).
The total probability (by the randomness of $hash$) is $\alpha^2\beta$.
\hfill $\Box$
\end{proof}

The following hold just by linearity of expectation.
We move proofs to the \ifnum0=1{supplementary file attached with the submission}\else{appendix}\fi.

\begin{restatable}{thm}{spacethm}
\label{thm:space}
The expected size of {\it e-list}{} is  $\alpha E(G[1,t])$ and the expected size of {\it w-list}{} is $\alpha^2\beta W(G[1,t])$.
\end{restatable}

\begin{restatable}{thm}{wedgethm}
\label{thm:wedge} $\mathbf{E}[\widehat{W}_t] = |W_t|$.
\end{restatable}

Now we come to a key theorem that shows that $\widehat{T}_t$
is correct on expectation. This is where we prove that our proposed debiasing technique works.

\begin{restatable}{thm}{mainthm}
\label{thm:main} $\mathbf{E}[\widehat{T}_t] = |T_t|$.
\end{restatable}

\begin{proof} We extend the definition of Boolean flag $X_w$ to every wedge $w$ in $W_t$.
Let $X_w\!=\!0$ if $w$ is not present in {\it w-list}{} (at time $t$).
Note that $\widehat{T_t} = (\alpha^2\beta)^{-1}\sum_{w \in W_t} X_w$.
For every edge $e$ in $E_t$,
let $t_{max}(e)$ be the maximum time $s \!\leq \!t$ such that $e_s \!= \!e$.
Fix a triangle $A \!= \!\set{a,b,c} \!\in \!T_t$ formed by edges $a, b,$ and $c$, and
assume (by relabeling if required) that $c$ is the last edge to appear in the stream among $a, b$, and $c$.
In other words, $t_{max}(c) > \max\set{t_{max}(a), t_{max}(b)}$. Since $\{a,b\}, \{b,c\}, \{c,a\}$ are wedges, it makes
sense to talk about $X_{\{a,b\}}$, etc.
The following is the debiasing argument, showing that exactly
one wedge in $A$ has $X_w = 1$.

\begin{lemma}
\label{lem:debias}
 $X_{\{b,c\}} = X_{\{c,a\}} = 0$. Moreover, $X_{\{a,b\}} = 1$ iff $\{a,b\}$ is in {\it w-list}.
\end{lemma}

\begin{proof}
Consider the moment $s = t_{max}(c)$ when $e_s = c$.
If wedge $\{b,c\} \not \in$ {\it w-list}, then by definition, $X_{\set{b,c}}$ is $0$.
If  $\{b,c\}\in$ {\it w-list}, then by Step~\ref{step:reset} of Algorithm~\ref{algo:estimate}, the value of $X_{\{b,c\}}$ is reset to $0$. No subsequent change is made to this value. An identical argument shows the same for $X_{\{c,a\}}$.
Finally, $X_{\{a,b\}}$ is set to 1 at this moment iff if wedge $\{a,b\}$ is in {\it e-list}, and once again, this value is not changed subsequently.
\hfill $\Box$
\end{proof}

By Lemma~\ref{lem:debias}, $\mathbf{E}[X_{\{b,c\}}]  = \mathbf{E}[X_{\{c,a\}}] = 0$, while $\mathbf{E}[X_{\{a,b\}}]$
is the probability that this wedge is in {\it w-list}. This is exactly $\alpha^2\beta$.
Therefore, the sum of expectations of $X_w$ over all three wedges $w$ of the triangle $A = \set{a,b,c}$ is $\sum_{w \in A} \mathbf{E}[X_w] = \alpha^2\beta$.
Observe this is true for any fixed triangle in $T_t$.
For any wedge $w$ that does not participate in a triangle,
$X_w$ is obviously zero. By linearity of expectation,
$\mathbf{E}[\widehat{T}_t] = (\alpha^2\beta)^{-1} \mathbf{E}[\sum_{w \in W_t} X_w] $ $= (\alpha^2\beta)^{-1} \sum_{A \in T_t} \sum_{w \in A} \mathbf{E}[X_w]$.
Plugging in the value of $\mathbf{E}[X_w]$, this is $(\alpha^2\beta)^{-1} \cdot \alpha^2\beta |T_t| = |T_t|$.
\hfill $\Box$
\end{proof}

Using methods from~\cite{JhSePi13}, we can prove weak concentration bounds for
 $\widehat{T}_t$ and $\widehat{W}_t$ (by bounding their variance).
We need to assume that  $\alpha$ and $\beta$ are large enough to ensure that enough
wedges of $W_t$ are in {\it w-list}, and there are at least as many wedges
in $G_t$ as edges. The latter is needed to rule out extreme cases
like $G_t$ being a path or a matching. This assumption is reasonable
for real-world networks, as can be seen in~\Tab{run-synthetic}. Proof
is in the \ifnum0=1{supplementary file attached with the submission}\else{appendix}\fi

\begin{restatable}{thm}{concthm}
\label{thm:conc} Fix some sufficiently small $\gamma > 0$.
Suppose that $(\alpha^2\beta)|W_t|$ (the expected number of wedges in $W_t$
that are in {\it w-list}) is at least $1/\gamma^6$. Furthermore
$|W_t| \geq |E_t|$ (there are at least as many wedges in $G_t$ as edges).
Then, $\Pr[|\widehat{W}_t - |W_t|| > \gamma|W_t|] < \gamma$,
$\Pr[|\widehat{T}_t - |T_t|| > \gamma|W_t|] < \gamma$, and
$Pr[|\widehat{\tau}_t - \tau_t| > 8\gamma] < 4\gamma$.
\end{restatable}

\section{Empirical evaluation of \mgt}

We implemented our algorithm in C++ and ran it on a MacBook Air laptop with 1.7 GHz Intel Core i7 processor and 8 GB 1600 MHz DDR3 RAM. We applied \mgt{} on a variety of real-world datasets.  Refer to \Tab{run-synthetic} for details about these datasets.\\
{\bf {\tt DBLP}:}   This is a co-authorship network for papers on the DBLP website.  From  the raw data at DBLP~\cite{DBLP} we  extracted 786,719 papers by ignoring papers with (i) a single author, (ii) more than 100 authors, and (iii) missing ``year'' metadata. For each paper we put an edge corresponding to every distinct pair of co-authors resulting in a total of 3,630,374 (multi)edges. \\
 %
{ \bf  {\tt Enron}:} This network is derived from emails between Enron employees between 1999 and 2003~\cite{graphrepository2013}. Nodes correspond to employees while edges represent  their email correspondence. Multiple emails between the same pair of individuals result in a multigraph. \\
 {\bf {\tt Flickr}:} This dataset consists of friendship connections of users of Flickr, obtained from \cite{graphrepository2013}. Originally, the data was collected in \cite{mislove-2008-flickr}. (Results on {\tt Flickr}{} given in the \ifnum0=1{supplementary file attached with the submission}\else{appendix}\fi.) \\
{\bf SNAP:}  We extended our data set to include networks from SNAP \cite{Snap}. We synthetically replicate edges of these datasets to get a multigraph.

\begin{table*}[t]
 \caption{A run of our algorithm on a variety of real-world and synthetic graphs with $\alpha = 0.01$ and $\beta$ set such that size of {\it w-list}{} is at most 50K. The third column gives the number of edges in the multigraph while the fourth column (Space) gives the space (in terms of number of edges) used by the algorithm. The first three datasets are raw real-world datasets whereas the remaining datasets were synthetically made multigraphs starting with graphs from \cite{Snap}.}
\label{tab:run-synthetic}
\centering
\scriptsize
  \begin{tabular}{|l|c|c|cc|c|cc|cc|}
  \hline
\multicolumn{1}{|c|}{Dataset } & \multicolumn{1}{c|}{$n$} & \multicolumn{1}{c|}{Wedges} & \multicolumn{2}{c|}{Edges}  &  \multicolumn{1}{c|}{ Space} & \multicolumn{2}{c|}{Transitivity} & \multicolumn{2}{c|}{Triangles} \\
 &  & (simple) & simple & multi &  &   exact &  estimate &  exact & Rel. error \\ \hline
{\tt DBLP} 			&  755K	&  61M 		&  2.54M		&  3.63M 		 & 31K 	& 0.269 	& 0.282	&5.50M	& 3.09\%\\
{\tt Enron} 			& 86K	&  49M 		& 297K 		&  1.15M		&  8K 	& 0.069 	& 0.071  	& 1.18M 	&3.38\% \\
{\tt Flickr}        			& 2302K	&  22B    	& 22M		&  33.1M            &  251K    & 0.110  	& 0.108     &837M	& 1.24\%\\  \hline
as-skitter 			& 1.6M	&  16B 		& 11M 		& 53M 		&  160K 	& 0.005	& 0.005 	&28M 	&6.50\%  \\
cit-Patents 		& 3.7M	&  0.3B 		& 16M		& 79M		&  199K  	& 0.067	& 0.066 	&7.51M 	&0.33\%  \\
web-Google  		& 0.8M	&  0.7B 		& 4M 		& 20M 		&  79K  	& 0.055 	& 0.057	& 13.3M	&3.79\% \\
web-NotreDame 	& 0.3M	&  0.3B 		& 1M 		& 5M 		&  42K 	& 0.088 	& 0.088	& 8.91M	&3.93\%  \\
youtube 			& 1.1M	&  1.4B 		& 2M 		& 14M 		&  64K 	& 0.006 	& 0.006 	&3.05M 	&1.86\%  \\
livejournal 		& 5.2M	&  7.5B 		& 48M 		& 205M 		&  473K 	& 0.124 	& 0.118	& 310M	&8.65\%  \\
orkut   			& 3.0M	&  45B 		& 223M 		& 562M  		&  1.2M  	& 0.041	& 0.041 	&627M 	&0.09\% \\ \hline
\end{tabular}
\end{table*}

\textbf{Convergence of estimate:}  \Fig{dblp-final-convergence}\subref{entire-trans} and \Fig{dblp-final-convergence}\subref{entire-trigs} demonstrate convergence of the {\em final estimates} (i.e. for $G_m$) for increasing space.
We define storage as the  number of edges stored by our algorithm: $|\mbox{{\it e-list}{}}| + 2\cdot |\mbox{{\it w-list}}|$. We first choose $\beta$ in $\set{0.2, 0.4, 0.6, 0.8, 1.0}$ and then vary $\alpha$ in increments of $0.0005$ up to $0.02$. For each setting of $\alpha$ and $\beta$, we plot 5 runs of the algorithm. One can see that both the transitivity and triangles estimates converge rapidly to true values as we increase the space.
\begin{figure*}[tb]
  \centering
  \subfloat[{Transitivity; 1999--2008}]{\includegraphics[width=0.24\textwidth]{dblp-trans-1}} \
    \subfloat[{Transitivity; 1989--2008}]{\includegraphics[width=0.24\textwidth]{dblp-trans-2}} \
  \subfloat[{Transitivity; 1938--2008}]{\includegraphics[width=0.24\textwidth]{dblp-trans-3}} \
        \subfloat[{Transitivity; entire stream}]{\includegraphics[width=0.24\textwidth]{trans-convergence}\label{entire-trans}}\
  \subfloat[{Triangles; 1999--2008}]{\includegraphics[width=0.24\textwidth]{dblp-trigs-1}}\
    \subfloat[{Triangles; 1989--2008 }]{\includegraphics[width=0.24\textwidth]{dblp-trigs-2}} \
     \subfloat[{Triangles; 1938--2008}]{\includegraphics[width=0.24\textwidth]{dblp-trigs-3}}\
    \subfloat[{Triangles; entire stream}]{\includegraphics[width=0.24\textwidth]{trigs-convergence}\label{entire-trigs}} \

   \caption{{\tt DBLP}{} convergence: We show that both transitivity and triangles estimates converge to true values as we increase the space. The top row  is for transitivity,  while the bottom row is for triangle counts. The plots are arranged in the order of increasing window length ending at 2008 except for the last column which corresponds to the entire stream length.}
  \label{fig:dblp-final-convergence}
\end{figure*}

Our estimates for various time windows also converge rapidly, as we demonstrate in  \Fig{dblp-final-convergence}.
For these experiments,
we picked specific time windows on {\tt DBLP}, namely, 1989--2008, 1999--2008,  and 1938--2008. This is mostly
for demonstrating the convergence of differing window sizes. We chose $\beta$  from $\set{0.2, 0.4, 0.6, 0.8, 1.0}$ and varied $\alpha$ in increments of $0.1\%$ up to $3.0\%$. For each value of $\alpha$ and $\beta$, we give 5 runs of the algorithm.
In the plots $x$-axis gives increasing space (i.e., increasing $\alpha$) and
the $y$-axis is the estimate.

Across the board, we see rapid convergence as storage increases. For {\tt DBLP}, storage of 60K
is enough to guarantee extremely accurate results (relative errors within 5\%), for all the time windows.
This is even true for the 10 year window, which is quite small compared to the entire stream of data
(\mgt{} will not work for window sizes of a year, since there  are not enough samples from such a window. But the number of edges in a year is small enough to store explicitly).

\textbf{Space usage:}  \Fig{space-usage} shows the space used by our algorithm in terms of parameters $\alpha$ and $\beta$.
We measure both {\it e-list}{} and {\it w-list}{} for varying values of $\alpha$ and  $\beta$, and plot the predictions
of \Thm{space}. We see almost perfect alignment of the predictions with \Thm{space}.

\begin{figure*}[t]
  \centering
  \subfloat[{{\it e-list}{} size}]{\includegraphics[width=0.4\textwidth]{edge-reservoir-size}}
  \subfloat[{{\it w-list}{}  size}]{\includegraphics[width=0.4\textwidth]{wedge-reservoir-size}}
   \caption{Number of edges and wedges stored by {\it e-list}{} and {\it w-list}{} respectively. The observed usage matches almost exactly with theoretical predictions.}
  \label{fig:space-usage}
\end{figure*}

\textbf{Comparison with previous work:} We run the algorithms of~\cite{PaTaTi+13},~\cite{JhSePi13}, and~\cite{AhDuNe+14}, using hash based sampling to recreate uniform edge sampling in a multigraph. We first note that our implementations work correctly on the simple graph version of {\tt DBLP}, shown
in  \Fig{prev-simple}. All algorithms converge extremely rapidly. When these
algorithms are applied to the multigraph version of {\tt DBLP}, then they all converge to incorrect triangle estimates (\Fig{prev-multi}).

\textbf{Tests on a broader data set:} For more validation of \mgt{}, we run it on a large
set of real-world graphs. Most of these graphs are neither temporal nor multigraphs. We construct a multigraph stream
from each graph as follows: every edge $e$ of the graph is independently replicated with probability $1/3$
(specifically $r$ times where $r$ is uniform in $\{2, 4, 8, 16, 32\}$). The stream is obtained by randomly
permuting these multiedges.
For each graph, we only use \mgt{}  record to transitivity and triangle
count of the entire stream (the graph $G[1,m]$). The results are presented in \Tab{run-synthetic}. For these runs, we set $\alpha = 0.01$ and capped the size of wedge reservoir to $50K$ (by choosing $\beta$ appropriately). We observe that transitivity estimates are very sharp (matching the true values up to the third decimal point in many cases).
The relative error in triangles estimates is less than $3\%$ for most cases and never exceeds $8.7\%$. The overall space used by the algorithm is at most $4\%$ of the number of edges of the underlying {\em simple} graph. We point out that for {\tt orkut} which has nearly half a billion edges (after injecting duplicate edges), the transitivity estimate closely matches with the true value and the relative error in triangles is less than $1\%$. The total storage used is less than $0.5\%$ of the edge stream.

\section{Experiments with time windows} \label{sec:implement}

\mgt{} takes as input a single time window length $\Delta t$. But observe that
the primary data structures {\it e-list}, {\it w-list}, and $X_w$ are independent
of this window. As a result, \mgt{} can handle multiple time windows with the
\emph{same} data structure.
We only maintain the latest timestamp for each edge, and do not store any history.
If the time window $[t-\Delta t,t]$ is too small, it is unlikely that {\it e-list}{}
will have any edges from this window. On the other hand,
small time windows can be stored explicitly to get exact answers.

\textbf{Triangle trends in {\tt DBLP}:} In our opinion, the following results are the real achievement of \mgt.
We wish to understand transitivity and triangle trends for {\tt DBLP}{}  in various time windows. We focus
on 5-year, 10-year, 15-year, 20-year, and entire history windows. So think of a (say) 5-year sliding time window
in {\tt DBLP}, and the aim is to report the transitivity in each such window. Refer to \Fig{dblp-window}
(``All" refers to the window that contains the entire history).
\emph{The algorithm \mgt{} makes a single pass over {\tt DBLP}{} without preprocessing and provides results for all these windows at
every year.}

The transitivity reveals intriguing trends. Firstly, smaller windows have higher transitivity. It shows that network clustering tends to happen
in shorter time intervals. This is probably because of the affiliation structure of coauthorship networks.
The increase of triangle counts over time (for the same window size) may not be too surprising, given that the
volume of research increasing. But juxtapose this with
the \emph{decreasing} of transitivity over time.
This means that (say) the transitivity in 2004--2008 is higher than 2009--2013, even though there
are more papers (and more triangles) in the latter interval. Why is this the case? Is it because of increasing
of interdisciplinary work, which might create more open wedges? Or is it simply some issue with the recording
of {\tt DBLP}{} data? Will the decreasing transitivity converge in the future, or do we expect it to simply go to zero?
Can we give a reasonable model of this behavior? We believe that the output of \mgt{}
will lead to many data science questions, and this is the real significance of the algorithm.

\textbf{Triangle trends in  {\tt Enron}:} In \Fig{enron-w-tri} and \Fig{enron-w-gcc}, we present triangles and transitivity estimates for {\tt Enron}{} for various windows. For this dataset, we think of a window as being defined by a specified number of past edges. In particular, apart from considering the entire past, we look at windows formed by past 200K, 400K, and 800K edges. Observe that in the beginning of the stream all these windows coincide, since the windows are equivalent. Focusing on the triangles estimate, it is clear that the estimate corresponding to the larger window size dominates that of a smaller window size. What is interesting for {\tt Enron}{} dataset is that the same ordering is observed even for transitivity estimates. That is, in general, a transitivity estimate curve corresponding to the larger size window dominates the one corresponding to the smaller size. We observe a completely opposite behavior with {\tt DBLP}{} transitivity curves, see \Fig{dblp-window}.

Another interesting observation is that in case of {\tt Enron}{}, the curves for triangles estimates for smaller window lengths flattens out  whereas that in {\tt DBLP}{} the curves for triangle estimates continue to rise even for smaller time windows. This indicates that the growth of {\em total number of triangles} is superlinear in {\tt DBLP}{}  (with respect to the number of years) whereas it is nearly linear (with respect to the number of edges seen so far) in case of {\tt Enron}. Indeed the final estimate for the number of triangles in {\tt Enron}{} is almost the same as the number of edges in the stream.

\ignore{
\section{Conclusions}

We have described a streaming algorithm  to compute the number of triangles  and the  transitivity of a  multigraph. Our algorithm can seamlessly compute estimates for stream windows of various sizes in real-time. It would be very interesting to carefully study the behavior of \mgt{} on more real-world edge streams, to understand the evolution
of triangles over time. It appears that \mgt{} reveals phenomena at different timescales, which might be an aid to finding the ``right"
window for aggregation. Designing good models for temporal graphs is a big open problem, and our findings on {\tt DBLP}{} and {\tt Enron}{} might provide some
useful information towards that objective.
}

\section*{Acknowledgements}
We thank Ashish Goel for suggesting the use of hash-function based reservoir sampling. This was a key step towards the development of the final algorithm.

\vspace{-3ex}
{
\scriptsize
\bibliographystyle{abbrv}

redpajama_set_name: RedPajamaArXiv


Almighty Games is the work of a solo indie video game developer. Hi! My name is Billy McDaniel. I've been creating games since as far back as I can remember. In just the last few years I have published 5 games on Steam and 6 full courses on Udemy.com. I am currently living in Las Vegas and spend much of my time broadcasting while I work on Twitch.
Become a Patron to Provide Financial Support through Patreon.
Follow us on Social Channels such as Twitter & YouTube.
Follow and hang out with the developer live on Twitch.
Join the Almighty Games Discord Channel to keep up with current events.
Talk about Almighty Games and Udemy Courses on Twitter.
Share recorded videos of yourself playing our games on YouTube.
Live stream yourself playing our games on Twitch.
Buy copies of our games for yourself or as a gift to friends.
Leave honest feedback about our games on Steam.
Ask me how you can save money buying my Udemy Courses with Coupons.
Like & Follow Almighty Games on Facebook!