text:
Cryptocurrencies Go From Boom To Bust
BusinessCryptocurrencies Go From Boom To Bust
Ripple, Bitcoin, Etherum and Litecoin are still active but experience price volatility. REUTERS/Dado Ruvic
More than 800 cryptocurrencies have gone from boom to bust as their value has fallen below even one cent, drawing comparisons with the dotcom bubble of 2000.
The "Digital Wild West"
Vast numbers of new digital coins have been created via initial coin offerings (ICOs), in which a startup issues digital "tokens" that investors can buy instead of an equity stake in the business. Nearly $12bn has been raised via ICOs this year, with investors attracted by cheap coins that could mint hefty future returns. Prominent celebrities including award-winning actor Jamie Foxx have backed ICOs, leading to concerns over scams in the "digital wild west".
Hundreds of ICO projects are now dead in the water due to being fraudulent, jokes or flops, according to figures compiled by the Dead Coins website. These coins are now technically worthless, trading at fewer than one cent.
Bitcoin's "Blood Bath"
Meanwhile, bitcoin's "blood bath" has continued in recent weeks as the price of the best-known cryptocurrency has plunged by roughly 70% since its record high near $20,000 last year, according to CoinDesk data. The tanking of bitcoin's price has drawn comparisons with some of the companies that crashed during the dotcom era, when simply adding "dotcom" to the name of a company could drive a buying frenzy.
Morgan Stanley analysts say that bitcoin's price plunge was 15 times faster than the dotcom crash. The behaviour of myriad cryptocurrencies is considered by some to cause a ripple effect across the entire market, similar to the one that savaged the Nasdaq 100 Index in 2000 and led to heavy losses and the closure of prominent tech stocks that rose to prominence on the back of excitement around the potential of the Internet.
Investors' Nerves Rattled by Hacking
Investors' nerves have been rattled following the hacking of two prominent South Korean cryptocurrency exchanges — highlighting the security concerns around digital money.
ICOs are speculative and risky endeavours that have been plagued by scams in recent months, not least the fake startup called Giza that cashed out with $2m of investors' cash.
To evangelists, ICOs are a potential future alternative to initial public offerings, which have dwindled in recent years among tech companies, and venture capital funding.
Cryptocurrencies have also come under pressure from regulators, who have warned on their risks and as fears that celebrity endorsements could lead to law suits from regulators and investors who believe they have been swindled.


text:
Changes in children's surgical services during the COVID-19 pandemic at a tertiary-level government hospital in a lower middle-income country
Md. Abdullah Al Farooq1,
S M Humayun Kabir2,
http://orcid.org/0000-0002-1661-2111Tanvir Kabir Chowdhury1,
Ayesha Sadia1,
Md. Afruzul Alam1,
Tanzil Farhad1
1Department of Paediatric Surgery, Chittagong Medical College, Chattogram, Bangladesh
2Director, Chattogram Medical College Hospital, Chattogram, Bangladesh
Correspondence to Dr Tanvir Kabir Chowdhury; ivan_tanvir{at}yahoo.com
Objective The aim of this study was to quantify the changes that occurred in the surgical services of children during the COVID-19 pandemic from the perspective of a low/middle-income country.
Design A case–control study was conducted at a large referral centre in Bangladesh among patients aged ≤12 years. Comparisons were made between cases admitted during a period of 'April to September 2020' (Pandemic period) and controls during a similar period in 2019 (Reference period). The number of admissions and outpatient department (OPD) attendances, age and sex distribution, diagnosis, number and types of surgeries performed (elective vs emergency), variations in treatment of acute appendicitis, types of anaesthesia and mortality were compared.
Results Admissions were only 41% of previous year (635 vs 1549), and OPD attendances were only 28% of previous year (603 vs 2152). Admission of children reduced by 65.8%, but neonatal admission reduced only by 7.6%. The median age of the admitted patients was significantly lower during the pandemic period (3 vs 4 years, p<0.01). Acute appendicitis (151, 9.8%) and trauma (61, 9.6%), respectively, were the the most common causes of admission during the reference and the pandemic period. Elective surgeries were only 17% and emergency surgeries were 64% of previous year (p<0.01). Appendectomy (88, 9.1%) and laparotomy (77, 17.6%), respectively, were the most common surgeries performed during the reference and the pandemic period. Conservative treatment of acute appendicitis was more during the pandemic period (47.5% vs 28.5%, p=0.01), but patients who underwent appendectomies had more complicated appendicitis (63.3% vs 42.1%, p=0.01). In all, 90.4% of surgeries were performed by resident doctors. There were no COVID-19- related deaths.
Conclusion Trauma became the most common cause of admission during the pandemic, and neonatal surgical conditions remained almost unchanged with high mortality rates. Elective procedures and laparoscopy remained low and resident doctors played a major role in providing surgical services.
Data are available upon reasonable request from the following ORCID ID: https://orcid.org/0000-0002-1661-2111.
http://dx.doi.org/10.1136/bmjpo-2021-001066
What is known about the subject?
The COVID-19 pandemic has changed the management of care around the world. Different centres took different measures to prioritise their pattern of services and keep essential services moving. Surgical care of children was also compromised, but emergency surgery and surgery for malignant conditions did not stop. It was predicted that there would be a reduction in the volume of surgeries, but catastrophic loss of lives would occur in the low/middle-income countries.
What this study adds?
Neonatal admissions did not significantly reduce, and patients had a significantly less median age. Trauma was the most common cause of admission despite the limited movements and outdoor activities. There were more conservative treatments for acute appendicitis. Resident doctors were the key service providers.
The COVID-19 pandemic has affected every aspect of life around the world, and children's surgical condition is no exception.1–4 Many routine surgeries were cancelled, emergency surgical care was also very challenging and patients suffered from limited access to healthcare delivery systems.5–7 In Bangladesh, the first confirmed COVID-19 case was declared on 8 March 2020 and the first COVID-19-related death was reported on 18 March 2020.8 9 As of 1 February 2021, there were 535 139 confirmed cases in Bangladesh, of which 8127 (1.5%) died.10 Bangladesh is the third most affected country in South East Asia after India and Pakistan, and 31st in the world.11
Although it has been observed that children suffered less from COVID-19-related problems, access to surgical care was also restricted in children during this period.5 12 A global survey on children's surgery providers from 30 low/middle-income countries (LMICs) reported that there was little consensus among respondents on which procedures should be limited or delayed during the pandemic.13 There is also scarcity of report from LMICs about the actual changes during the pandemic on the surgical services to children. The aim of the study was to assess the changes the COVID-19 pandemic brought about on children's surgical services and to compare surgical activities in children during the COVID-19 pandemic with those during a reference period in a tertiary-level government hospital in Bangladesh.
Study design and settings
This was a case–control study performed in the Department of Paediatric Surgery, Chittagong Medical College Hospital (CMCH) in Chattogram. Chattogram (former Chittagong) district has the second highest number of COVID-19 positive cases in Bangladesh.14 CMCH is the largest government referral centre for paediatric surgical conditions for about one-fifth of the population in the country. This department deals with patients of paediatric general surgery, paediatric casualty, paediatric urology, neonatal surgery and paediatric oncosurgery. It also provides outpatient and emergency services to surgical children aged ≤12 years. Children with orthopaedic, neurosurgical, cardiac surgical, and burn and plastic surgical problems are usually admitted in the respective adult departments, but some of them are also admitted in this department and transferred there if needed. In Bangladesh, the number of positive cases had increased from April until July 2020 when it began to reduce and reached a plateau at the beginning of October 2020. The number of cases increased again during December 2020.15 To answer the research question regarding changes in paediatric surgical services during the pandemic, we analysed all the children admitted in this department and attended in the outpatient department (OPD) during a period between 1 April and 30 September 2020 (Pandemic period) and compared them with the records of patients of similar period between 1 April and 30 September 2019 (Reference period). Patients of the pandemic period were considered as cases and those of the reference period were the controls. All patients aged ≤12 years who were admitted in the ward or attended in the OPD were included in the study. Patients aged more than 12 years (three during the pandemic period and eight during the reference period) were excluded. Children with surgical conditions who were admitted in other adult surgical departments were also excluded from the study. The specific objectives were to compare the number of admissions and OPD attendances, age and sex distribution, diagnosis, number and types of surgeries performed (elective vs emergency), expertise of surgeons, types of anaesthesia, and number and diseases of mortality between both periods. As a secondary objective, variations between the patterns of treatment of acute appendicitis (conservative vs surgical) and operative findings (uncomplicated vs complicated) were recorded as this remains the most common paediatric surgical condition.16 Complicated appendicitis was defined as operative finding of appendicular perforation, gangrene or abscess formation.
Comparisons were made between groups with regard to sex, age groups (neonates, infants and children), diagnoses among the admitted and OPD patients, types of surgery and anaesthesia. Age was compared using the Jonckheere-Terpstra test. Age group, sex, type of surgery, expertise of surgeon and type of anaesthesia, treatment pattern of acute appendicitis and per-operative findings were compared using χ2 or Fisher's exact test. Average monthly surgeries between pandemic and control period were compared using Student's t-test. P value of <0.05 was considered as significant. Statistical analyses were performed using SPSS V.22.
No patient or public involvement was required for this study.
During the pandemic period, a total of 635 patients were admitted in contrast to 1549 admissions during the reference period. Male to female ratios were 1.8 vs 1.9 during the pandemic versus reference period, respectively (p=0.63). The median age of the admitted patients was 3 years during the pandemic period and 4 years during the reference period (p<0.01). Admission of children reduced by 65.8%, but neonatal admission reduced only by 7.6% (table 1). OPD attendances reduced to 603 in the pandemic period from 2152 in the reference period.
Frequency of admission and OPD attendance during the pandemic and the reference period among different age groups
Acute appendicitis was the most common disease among admitted patients during the reference period (151, 9.8%). Trauma was the most common cause of admission during the pandemic period (61, 9.6%), which was followed by acute appendicitis (59, 9.3%) (table 2). The number of admissions for acute appendicitis reduced by 60.9% during the pandemic period. Although trauma cases reduced during the pandemic period (101 vs 61), their relative percentage increased (6.5% vs 9.6%). There was very low admission for inguinal hernia. Neonatal intestinal obstruction (20) became the 10th most common cause of admission during the pandemic period (not shown in table 2). Inguinal hernia was the the most common cause of OPD attendance during both periods (154, 7.2% vs 49, 8.2%) (table 2). OPD attendance for undescended testes and urinary tract infection reduced substantially (table 2). However, vascular anomaly (20) and pelvi-ureteric junction obstruction (12) were among the 10 most common causes of OPD attendance during the pandemic period (not shown in table 2).
Ten most common diseases admitted in the ward and attended in the OPD during the reference period (2019) and their changes during the pandemic period (2020)
During the pandemic period, 438 surgeries were performed in contrast to 967 during the reference period, which means that there was a 54.7% reduction in surgeries during the pandemic period. However, among the admitted patients, 69.0% underwent surgery during the pandemic period in contrast to 62.4% during the reference period (p<0.01). Elective surgeries were only 17% and emergency surgeries were 64% of previous year (p<0.01) (figure 1). The number of surgeries gradually increased from June onwards during the pandemic period (figure 2). On average, 73 emergency surgeries were performed every month during the pandemic period versus 161 during the reference period (p<0.01). There were 26 laparoscopic procedures during the reference period in contrast to only 3 laparoscopic procedures during the 6-month span of the pandemic period (p=0.01). Cystoscopy procedures were 23 during the reference period and 11 during the pandemic period (p=0.51). Surgeries performed under general anaesthesia were 435 (45.0%) during the reference period in contrast to 179 (40.9%) during the pandemic period (p=0.15). During the pandemic period, 396 (90.4%) surgeries were performed by residents (supervised by consultants who did not scrub) in contrast to 669 (69.2%) during the reference period (p<0.01). Elective surgeries performed by residents were 35 (53.0%) vs 128 (33.6%) during the pandemic and the reference period, respectively (p<0.01).
Comparison of number of surgeries performed during the reference and the pandemic period.
Comparison of monthly volume of elective and emergency surgeries during the reference (2019) and the pandemic (2020) period.
While appendectomy (88, 9.1%) was the most common surgery performed during the reference period, laparotomies for various other causes (77, 17.6%) were the most common during the pandemic period (table 3). In all, 47.5% of the admitted cases of acute appendicitis were treated conservatively during the pandemic period in contrast to 28.5% during the reference period (p=0.01). However, there were more cases of complicated appendicitis (63.3% vs 42.1%, p=0.01) during the pandemic period among patients who underwent surgeries. The number of laparoscopic appendectomies reduced by 85% during the pandemic period.
Major types of surgeries during the reference and the pandemic period
The number of mortalities remained almost similar (61 vs 58) during both periods. There were more neonatal and child deaths but fewer infant deaths during the pandemic period in contrast to the reference period (figure 3). The major causes of mortality during the reference period were intestinal obstructions (19), anorectal malformation (ARM) (5), gastroschisis (5), intestinal perforation (5), posterior urethral valve (5) and omphalocele (3). The major causes of mortality during the pandemic period were intestinal obstructions (29), ARM (8) and gastroschisis (7).
Neonatal, infant and child mortality during the reference (2019) and the pandemic (2020) period.
The COVID-19 pandemic affected LMICs later than high-income countries (HICs), and the consequences were less devastating than those of many HICs.17 However, it was predicted differently because of the inability of LMICs to respond aggressively.18 19 The changes in the surgical scenario in children during the pandemic in LMICs have not been adequately reported. This study reports a 59% reduction in admissions, 72% reduction in OPD attendances and 55% reduction in surgeries during the pandemic. These changes were predictable in the context of a pandemic. However, neonatal surgical admissions remained almost similar. Neonates constituted nearly one-fourth of the admitted patients and 72% of all mortalities during the pandemic period. In many LMICs, neonatal surgical care is not adequate and there is a lack of neonatal intensive care unit (NICU), provision of total parenteral nutrition and other necessary adjuncts.20 21 This hospital has an NICU, yet it observed a high neonatal surgical mortality. Birth defects are a major proportion of neonatal surgical conditions, and 94% of global birth defects occur in LMICs.22 23 The unchanged neonatal admission and more neonatal mortalities in a large centre from LMICs re-emphasise the need for improvement of neonatal surgical care in these countries.
Significantly younger babies were admitted during the pandemic period. This alludes to the fact that younger children are more prone to emergency surgical conditions than older children and are more in need of prompt surgical care. Children constitute a large part of the population in many LMICs, reaching about 60% in some.24 However, only 6.3% of all global surgical procedures occur in LMICs.25 This is in the perspective that about 19% of children in low-income countries have a surgical need and 62% of them have at least one unmet need.25 This study showed that although children suffered less from COVID-19, their surgical services had a major setback during the pandemic, making the scenario worse. This pandemic exposed many areas of concerns in provision of child health in LMICs but, at the same time, provided opportunity to improve the healthcare delivery system.24 26
There were changes in the disease pattern among the admitted patients during the pandemic. While acute appendicitis was the the most common disease for admission during the reference period, trauma was the the most common cause of admission during the pandemic period. About 95% of all trauma deaths in children occur in LMICs that have an underdeveloped trauma management system, especially in the emergency care of trauma patients.27 The emergency departments in the majority of the hospitals are not well-equipped and there are delays in acute trauma care. Trauma remained a major cause of morbidity in children during the pandemic despite the reduced number of vehicles in the roads and fewer outdoor activities.
There was an extreme reduction in laparoscopic surgeries during the pandemic period (26 vs 3), and there were no laparoscopies during May and June 2020. It was because of the earlier recommendations at the beginning of the COVID-19 pandemic by the surgical societies to avoid laparoscopy because of the fear of transmission of SARS-CoV-2 through surgical smoke or aerosol.28 29 Although this restriction was later relaxed, laparoscopic procedures remained very low.29 A significantly higher proportion of surgeries were performed by the residents during the pandemic period. Residents also performed a significantly higher proportion of elective surgeries during the pandemic period. However, consultants performed more difficult and time-consuming surgeries.
There was a significant increase in the percentage of conservative treatment for acute appendicitis during the pandemic period. On the contrary, among patients who underwent appendectomies, the majority had complicated appendicitis and it was significantly more than the previous year. There were contradicting findings in this regard around the world.16 30–34 Observations in this study passively suggest that an increase in the conservative treatment of acute appendicitis in LMICs might increase the rate of complicated appendicitis. Although this study did not analyse the reasons for conservative treatment of acute appendicitis, those were not always surgeons' choice. The observed reasons were parents' refusal to surgery; signs of resolution after delayed presentation despite ultrasonographic evidence of acute appendicitis; and disappearance of symptoms during the delay in arranging theatre, giving consent or waiting for the availability of anaesthetists.
This study has several limitations. It has the inherent limitations of a retrospective study and it was performed in a single centre. Patients with orthopaedic, neurosurgical, cardiac, burn and plastic surgical conditions were under-represented as a majority of these conditions were admitted in the respective adult surgical departments. However, it quantified some of the changes during the COVID-19 pandemic on the volume and patterns of surgical conditions in children from one of the largest paediatric surgical centres in Bangladesh. It depicts that healthcare workers continued their services even during the very peak hours of the pandemic.
The COVID-19 pandemic brought about major changes in the surgical services to children. Admission, OPD attendance and the volume of surgeries decreased. There were also changes in patterns of admissions, age distribution and types of major surgeries. There were major reductions in laparoscopic procedures. Resident doctors played a major role during the pandemic. There were no COVID-19-related deaths.
Not required.
Ethics approval was given by the Ethical Review Committee of Chittagong Medical College (Memo: CMC/PG/2020/125).
The authors acknowledge the contribution of the residents involved in the original record keeping of the patients.
Leva E,
Morandi A,
Sartori A, et al
. Correspondence from northern Italy about our experience with COVID-19. J Pediatr Surg 2020;55:985–6.doi:10.1016/j.jpedsurg.2020.03.028pmid:http://www.ncbi.nlm.nih.gov/pubmed/32278542
Keefe D,
Rickard M,
Anderson P, et al
. Prioritization and management recommendations of paediatric urology conditions during the COVID-19 pandemic. Can Urol Assoc J 2020;14:237–50.doi:10.5489/cuaj.6693
Cini C,
Bortot G,
Sforza S, et al
. Paediatric urology practice during COVID-19 pandemic. J Pediatr Urol 2020;16:295–6.doi:10.1016/j.jpurol.2020.04.023pmid:http://www.ncbi.nlm.nih.gov/pubmed/32359910
. Novel coronavirus (2019-nCoV): situation report, 11. World Health organization, 2020. Available: https://apps.who.int/iris/handle/10665/330776 [Accessed 23 Oct 2020].
Hussain M,
Abdullah M,
Mamun A
. COVID-19 in children in Bangladesh: situation analysis. Asia Pac J Paediatr Child Heal 2020;3:59–65.
Guijo B,
Rivilla LF
. Influence of the Covid19 epidemic on the daily practice of major ambulatory surgery in a pediatric surgery unit. Arch Pedia Surg 2020;4:75–9.
Gacelle FK,
Sadjo SA,
Eugenie DC
. Adaptations of Surgical Practice During the Covid-19 Pandemic : Report from a Pediatric Surgery Unit in Yaounde - Cameroon. Arch Pedia Surg 2020;4:64–5.
DGHS
. National guideline for providing essential maternal, newborn and child health services in the context of COVID-19. Dhaka, 2020. Available: https://dghs.gov.bd/images/docs/Guideline/Covid19_MNCH_guideline.pdf
. COVID-19 health bulletin 2020. Dhaka, 2020. Available: https://dghs.gov.bd/images/docs/Notice/19_01_2021_Health Bulletin English PDF Final 18-01-2021.pdf
Government of Bangladesh
. Corona Info, 2021. Available: https://corona.gov.bd/ [Accessed 1 Feb 2021].
. Countries where COVID-19 has spread, 2021. Available: https://www.worldometers.info/coronavirus/countries-where-coronavirus-has-spread/ [Accessed 1 Feb 2021].
Cano-Valderrama O,
Morales X,
Ferrigni CJ, et al
. Reduction in emergency surgery activity during COVID-19 pandemic in three Spanish hospitals. Br J Surg 2020;107:e239.doi:10.1002/bjs.11667pmid:http://www.ncbi.nlm.nih.gov/pubmed/32406929
Truche P,
Bowder A,
Lalla AT, et al
. Perspectives on perioperative management of children's surgical conditions during the COVID-19 pandemic in low-income and middle-income countries: a global survey. World Jnl Ped Surgery 2020;3:e000187.doi:10.1136/wjps-2020-000187
. Coronavirus COVID-19 Dashboard, 2020, 2021. Available: http://103.247.238.92/webportal/pages/covid19.php [Accessed 1 Feb 2021].
Kvasnovsky CL,
Shi Y,
Rich BS, et al
. Limiting Hospital resources for acute appendicitis in children: lessons learned from the U.S. epicenter of the COVID-19 pandemic. J Pediatr Surg 2020;132. doi:doi:10.1016/j.jpedsurg.2020.06.024. [Epub ahead of print: 23 Jun 2020].pmid:http://www.ncbi.nlm.nih.gov/pubmed/32620267
Schellekens P,
Sourrouille D
. The unreal dichotomy in COVID-19 mortality between high-income and developing countries, 2020. Available: https://www.brookings.edu/blog/future-development/2020/05/05/the-unreal-dichotomy-in-covid-19-mortality-between-high-income-and-developing-countries/ [Accessed 16 Feb 2021].
Bong C-L,
Brasher C,
Chikumba E, et al
. The COVID-19 pandemic: effects on low- and middle-income countries. Aneths Analg 2020;131:86–92.doi:10.1213/ANE.0000000000004846
Hodgins S,
Saad A
. Will the Higher-Income country blueprint for COVID-19 work in low- and lower middle-income countries? Glob Health Sci Pract 2020;8:136–43.doi:10.9745/GHSP-D-20-00217pmid:http://www.ncbi.nlm.nih.gov/pubmed/32522765
Ekenze SO,
Ajuzieogu OV,
Nwomeh BC
. Challenges of management and outcome of neonatal surgery in Africa: a systematic review. Pediatr Surg Int 2016;32:291–9.doi:10.1007/s00383-016-3861-xpmid:http://www.ncbi.nlm.nih.gov/pubmed/26783085
Ford K,
Poenaru D,
Moulot O, et al
. Gastroschisis: bellwether for neonatal surgery capacity in low resource settings? J Pediatr Surg 2016;51:1262–7.doi:10.1016/j.jpedsurg.2016.02.090pmid:http://www.ncbi.nlm.nih.gov/pubmed/27032610
Toobaie A,
Yousef Y,
Balvardi S, et al
. Incidence and prevalence of congenital anomalies in low- and middle-income countries: a systematic review. J Pediatr Surg 2019;54:1089–93.doi:10.1016/j.jpedsurg.2019.01.034pmid:http://www.ncbi.nlm.nih.gov/pubmed/30786990
. Congenital anomalies, 2020. Available: https://www.who.int/en/news-room/fact-sheets/detail/congenital-anomalies [Accessed 24 Feb 2021].
Zar HJ,
Dawa J,
Fischer GB, et al
. Challenges of COVID-19 in children in low- and middle-income countries. Paediatr Respir Rev 2020;35:70–4.doi:10.1016/j.prrv.2020.06.016pmid:http://www.ncbi.nlm.nih.gov/pubmed/32654854
Butler EK,
Tran TM,
Nagarajan N, et al
. Epidemiology of pediatric surgical needs in low-income countries. PLoS One 2017;12:e0170968. doi:10.1371/journal.pone.0170968pmid:http://www.ncbi.nlm.nih.gov/pubmed/28257418
Ma X,
Vervoort D,
Reddy CL, et al
. Emergency and essential surgical healthcare services during COVID-19 in low- and middle-income countries: a perspective. International Journal of Surgery 2020;79:43–6.doi:10.1016/j.ijsu.2020.05.037
. World report on child injury prevention, 2008. Available: https://www.who.int/violence_injury_prevention/child/injury/world_report/World_report_presentation.pdf
de Leeuw RA,
Burger NB,
Ceccaroni M, et al
. COVID-19 and laparoscopic surgery: Scoping review of current literature and local expertise. JMIR Public Health Surveill 2020;6:e18928–40.doi:10.2196/18928pmid:http://www.ncbi.nlm.nih.gov/pubmed/32406853
Mintz Y,
Arezzo A,
Boni L, et al
. The risk of COVID-19 transmission by laparoscopic smoke may be lower than for laparotomy: a narrative review. Surg Endosc 2020;34:3298–305.doi:10.1007/s00464-020-07652-ypmid:http://www.ncbi.nlm.nih.gov/pubmed/32458289
La Pergola E,
Sgrò A,
Rebosio F, et al
. Appendicitis in children in a large Italian COVID-19 pandemic area. Front Pediatr 2020;8:600320. doi:10.3389/fped.2020.600320pmid:http://www.ncbi.nlm.nih.gov/pubmed/33363065
Hassoun A,
Kadenhe-Chiweshe A,
Sharma M
. New York's COVID-19 shelter-in-place and acute appendicitis inchildren. J Pediatr Surg 2021;56:635–6.doi:10.1016/j.jpedsurg.2020.08.027pmid:http://www.ncbi.nlm.nih.gov/pubmed/32981660
Saleem M
. Challenges to pediatric surgical practices during COVID- 19 and their solutions. Pak Pediatr J 2020;44:193–9.
Baral S,
Chhetri RK,
Thapa N
. Comparison of acute appendicitis before and within lockdown period in COVID-19 era: a retrospective study from rural Nepal. PLoS One 2021;16:e0245137. doi:10.1371/journal.pone.0245137pmid:http://www.ncbi.nlm.nih.gov/pubmed/33406126
Balvardi S,
Fiore J,
Feldman LS, et al
. Emergency department utilization by children with general surgical conditions during the COVID-19 pandemic. Br J Surg 2021;107.doi:10.1093/bjs/znaa096
Contributors MAAF was involved in conceptualisation. TKC, AS, MAA and TF were involved in data curation. TKC was involved in formal analysis, methodology, review and editing, and writing the original draft. SMHK was involved in supervision. MAAF and AS were involved in writing the article and review and editing. MAAF and SMHK approved the final manuscript.
Patient and public involvement Patients and/or the public were not involved in the design, or conduct, or reporting, or dissemination plans of this research.

redpajama_set_name: RedPajamaCommonCrawl


As part of efforts to grow its men's wear business, UK department store operator Debenhams has signed E Tautz and Norton & Sons designer Patrick Grant as its latest Designer at Debenhams collaborator.
Despite booking a 9% rise in full-year underlying pre-tax profit, UK fashion retailer Next Plc was forced to admit that it had suffered a slow start to the new year. Here is a flavour of what leading retail watchers are saying about Next's results.
UK department store operator Debenhams is set to bolster its presence in the Baltics, with plans for stores in Latvia and Estonia.
Debenhams plans to increase its use of British manufacturers in a move which it claims will bolster domestic production and help revitalise the UK clothing industry.
Three organisations are calling on UK fashion businesses to ensure that workers at overseas supplier companies are given a living wage to match their UK counterparts.
Debenhams chief executive Michael Sharp has revealed the department store retailer plans to open 17 stores in the UK over the next five years, after recording growing sales and profit during the past year.
Debenhams has raised its multi-channel and international growth goals after recording strong full-year sales and profit increases.
Department store group Debenhams has confirmed it will open its first store in Bulgaria with franchise partner Canopus Investments.
Debenhams has tapped Google's head of retail, Peter Fitzgerald, as a non-executive director to help grow the department store group's online business.
The BRIC countries are far from being the only emerging market suppliers for the global apparel sector - and a knot of competitors such as Bangladesh and Vietnam have long been vying for business. But there are also smaller players who are looking to grow.
British department store group Debenhams will open its first store in Estonia in September 2013.
Textile and apparel manufacturer Arvind Lifestyle Brands has acquired the Indian franchise rights of British retailers Next and Debenhams and US apparel brand Nautica from Planet Retail.
Indian fashion house Genesis Colors has today (6 August) denied it is in talks to acquire the Indian franchise rights to brands including Next, Debenhams and Nautica.
British department store group Debenhams has opened its first store in Pakistan by teaming up with international brand retailer Team A Ventures.
Retailer Marks & Spencer has appointed Carole Boyes-Weston as head of design for its Per Una and Limited Collection brands, replacing Helen Low.
Like a vast, slow-moving and rather unwieldy tanker, battered and lashed by stormy seas, the UK's largest clothing retailer Marks & Spencer has done much over the past decade to try to steady its business.
Ten high street retailers have backed new guidelines to prevent the sale and marketing of provocative and sexually-suggestive children's clothing in Ireland.
Marks & Spencer today (10 July) confirmed that general merchandise executive director Kate Bostock will leave the company "by mutual consent" as first quarter general merchandise sales plunged.
Increased footfall around events including Easter, Mother's Day, and the Diamond Jubilee has helped British department store group Debenhams Plc to a "good sales performance" so far in the second half of its financial year.


Warangal Station Rd, Enquiry No. 0870-2426232, Warangal.
The Shortest Route between WL and BBS is 15 km (2%) shorter.
The Shortest Route between WL and NZM is 2 km (0%) shorter.
This is the Shortest Route between WL and MTM.
This is the Shortest Route between WL and SC.
This is the Shortest Route between WL and SVDK.
The Shortest Route between WL and DNR is 39 km (2%) shorter.
This is the Shortest Route between WL and GDR.
The Shortest Route between WL and JU is 71 km (4%) shorter.
The Shortest Route between WL and NED is 41 km (10%) shorter.
Arr Time Changed. Speeded up by: 1h 40m.
Arrival Time Changed. Speeded up by: 1h 40m.
This is the Shortest Route between WL and NS.
This is the Shortest Route between WL and BZA.
The Shortest Route between WL and SBC is 231 km (23%) shorter.
This is the Shortest Route between WL and BIDR.
The Shortest Route between WL and LKO is 168 km (11%) shorter.
The Shortest Route between WL and DBG is 193 km (10%) shorter.
Compare with the Shortest Route between Warangal and Patliputra Jn.
This is the Shortest Route between WL and LPI.
The Shortest Route between WL and MUGR is 3 km (2%) shorter.
This is the Shortest Route between WL and KCG.
This is the Shortest Route between WL and HYB.
Compare with the Shortest Route between Warangal and Banaswadi.
The Shortest Route between WL and VSKP is 2 km (0%) shorter.
Compare with the Shortest Route between Warangal and Okha.
This is the Shortest Route between WL and GIMB.
This is the Shortest Route between WL and MAS.
The Shortest Route between WL and MYS is 231 km (20%) shorter.
This is the Shortest Route between WL and PDY.
The Shortest Route between WL and YPR is 244 km (24%) shorter.
The Shortest Route between WL and CPR is 10 km (1%) shorter.
The Shortest Route between WL and JP is 24 km (2%) shorter.
The Shortest Route between WL and TEN is 107 km (8%) shorter.
This is the Shortest Route between WL and RMM.
This is the Shortest Route between WL and TPTY.
This is the Shortest Route between WL and NDLS.
This is the Shortest Route between WL and MS.


text:
Monti's La Casa Vieja Steakhouse
(closed 11-17-2014, auction 12-4)
My first memory of Phoenix food was a place called Monti's La Casa Vieja.
We used celebrate here when our son finished a grade in school. Now it's the perfect place to introduce your guests to some real Arizona history and some great steaks. Or have you own excuse for a celebration.
It's located at the north end of Mill Street right across from the old mill.
Yes, there still is the hulk of an old mill. See photo below.
It is located in the town of Tempe which is just east of Mesa.
The Old Mill at Mill Street
Monti's La Casa Vieja means "the old house." It was built out of dirt. Actually dirt in the form of mud adobe made from local earth and straw. Seems primitive at first however it makes good insulation against the hot weather in Arizona.
This site was originally a ferry landing (Hayden's Ferry) which let people get across the Salt River in 1871. It was guided by wire connected to both sides so the current would not push you down the river. The site was developed and is part of the restaurant.
Grab a site map on your way in and look around while you wait for your name to come up for dinner. They keep a basket of them at the entrance. It's like a treasure map.
Monti's Self-Guided Tour Map
The kids will love the cool old rifles on the walls! There is a wall with four rifles that include an 1873 & 1876 Winchester rifle, and an 1891 Marlin Rifle. Look around and you can find more relics on the walls. It is better than a museum.
Monti's Historical Rifles display
You will love the old photos of the Salt River floods. Check out the adobe walls in the Hayden room next to the bedroom where U.S. Senator Carl Hayden was born. Monti's is like a museum with steaks and a bar.
The building is low, rustic and rambling and the steaks are just the way you like 'em. A petit filet mignon prepared with baked potatoes is my favorite meal. Anyway, this building looks like a museum and the food is reminiscent of the grand old steak house.
Monti's patio and entrance
Times have changed and now land is at a premium and so is parking. Even when there are festivals nearby and the crush of cars produces gridlock, you can find plenty of parking behind this restaurant.
Here's how it works. When you pull into the parking lot the attendants may ask where you are going. If you answer "Monti's!" you park for free! No hassles. No walking two miles for food. They take your word for it and how refreshing that is! Nice to be trusted.
Or take the Valley Metro Rail there and laugh at the traffic! Get off at Mill street and it's a short fun walk.
And you are correct, this is the restaurant that serves baskets of Rosemary herb bread that they call "Roman Bread." Leonard Monti's Italian sister brought the recipe from Montecchiani Italy in the 1970's. Phone (480) 967-7594. Hours can change so you might want to call ahead.
Monti's Hours-subject to change
Map of Monti's La Casa Vieja
Return from Monti's La Casa Vieja to Mesa-Goodlife
Return from Monti's La Casa Vieja to Remarkable Dining


text:
SERVICES & TOPICS
COFFEE WITH THE MAYOR & CITY MANAGER THIS FRIDAY
Join the Mayor and City Manager for some coffee and conversation this Friday (January 7) from 8:30 a.m. to 10:00 a.m. in the Council Chambers at the Police Department located at 2360 McCulloch Blvd North. Residents are encouraged to attend to express any issues, concerns, or questions.
For more information or questions about Coffee with the Mayor and City Manager, contact the Mayor's office at (928) 854-4278.
Subscribe to our YouTube channel.
We will send you email alerts when the city releases a news article.
© 2023 LAKE HAVASU CITY
EMPLOYEE LOGIN | PRIVACY STATEMENT | SITE MAP


The Indian Government Planning Commission Google Hangout.
India's government has been embracing a high-tech strategy over the past year, with new online portals and open data initiatives aiming to democratize civic life. Last Friday, a Google Hangout with members of the Government Planning Commission was emblematic of these efforts. But some viewers expressed skepticism that undermined the impact of the conversation, alleging that some of the "spontaneous" citizen questioners in the hangout were government plans. One commission member denounced the event live on camera.
British Columbia's question: What to do about water?


text:
Wicca je suvremena neopoganska religija nadahnuta pretkršćanskim vjerovanjima. Postoji više wiccanskih tradicija i sljedbi, a većini je zajedničko štovanje ženskog božanskog načela (Božice), i poštovanje prirode i prirodnih ciklusa.

Postoje dvije glavne tradicije u Wicca religiji: ona koja potječe od Geralda Gardnera i druga koju vezujemo za Aleka Sandersa. Za gardnerijasku Wiccu je karakteristično da ne priznaje samoinicijaciju.

Wiccanska religija najbrže je rastuća religija u Americi, američki časopis o misterijskim tradicijama objavio je da u SAD-u ima otprilike 500.000 sljedbenika Wicce, a u Velikoj Britaniji 110.000-120.000. Sljedbenici Wicce su većinom ljudi visokog obrazovanja i politički usmjereni ekologiji, trećinu čine muškarci, a u zadnje vrijeme sve je više mladih. Wicca nije ni na koji način povezana sa Sotonizmom, vjeruju u zakon privlačnosti, ravnotežu i harmoniju, snagu koja dolazi kroz znanje i progresivnu reinkarnaciju. Wicca se odnosi na religiju, na štovanje Božice (ženskog aspekta) i Boga (muškog aspekta), no Božanstva su samo metafora koja služi za pojednostavljivanje,oni u biti vjeruju u ono nešto savršeno što sve pokreće( božansvenu energiju). Bogovi nisu personalizirana sila kao u Kršćanstvu. Vjeruju da je čovjekova života energija (duša) spojena s energijom svega što nas okružuje ,tako da je čovjek dio priorde i priroda dio čovjeka. Ne povode se previše za nekim pisanim pravilima i dogmama, dakle nemaju svoju Bibliju, njihova uvjerenja se, kao i njihovi rituali sastoje od proučavanja prirode koja nas okružuje a time i prirode čovjeka. Rituali koje izvode i predmeti kojima se koriste su samo pomoćno sredstvo kojim se služe da bi lakše upotrijebili zakon privlačnosti.Takav predmet je naprimjer athame koji služi za usmjeravanje energije i iako je vjerojatno jedan od najvažnijih predmeta u ritualima može se i bez njega.
Wicce ne vjeruju u pojam dobrog i lošeg jer vjeruju u prirodnu ravnotežu koja da bi funkcionirala mora sadržavati i dobro i loše.
Glavno pravilo po kojemu se povode je : Ne naudi nikome, čini što te volja.Ne vjeruju u neki poseban sustav grijeha (samo dakle da ne smiju nauditi nikome ni na koji način) jer vjeruju da ih je priroda stvorila onakvima kakve ih želi pa se ne trude biti božanski savršeni već što više u skladu s prirodom.
Božica i Bog:
Božica je podrijetlo svega stvorenoga na Zemlji.
Bog je poznat kao Rogato božanstvo (potječe od keltskog boga Kernunosa).

Najpoznatija je Dijanička Wicca koja se pojavljuje u Kaliforniji 1970-ih. Od svih religijskih pokreta koji su se pojavili tijekom 1960-ih, Wicca je najuspješniji.

Etimologija

Riječ wiccan je pluralni oblik riječi wicce u ženskom, te wicca u muškom rodu, što u staroengleskom jeziku označava vješca ili vješticu. Izraz je 1940-ih prihvatio Gerald Garner kako bi razlučio wiccu od sotonizma i pojedinačnog čarobnjaštva.

Povijest

Wicca na staroengleskom znači šaman ili mudar. Utemeljitelj Wicce britanski je državni službenik Gerald Gardner. Wicca se nakon Engleske brzo širila Europom i Sjevernom Amerikom. Najbitnija knjiga za širenje Wicce nakon 1980-ih je Starhawk: Spiralni ples.

Wicca praznici

Wicca slavi osam glavnih praznika:
Samhain (31.10.)
Beltane (1.5.)
Imbolc (2.2.)
Lammas (1.8.)
Ljetni i zimski solsticij
Proljetni i jesenski ekvinocij

Rituali
U prvobitnoj Wicci nadahnuti su viktorijanskim okultizmom, a duhovni sadržaj temeljio se na starim paganskim religijama. Danas većina sljedbenika Wicce radi samostalno i stvara inovativnu religijsku praksu. Rituali se u biti temelje na psihološkom i prirodnom aspektu.Dakle koriste se ljudskom svijesti i podsvijesti te prirodnom iliti životnom energijom

Simboli
Najpoznatiji simbol Wicce je pentagram. Pet vrhova pentagrama simbolizira pet elemenata (zemlja, zrak, voda, vatra i duh – akaša) ili čovjeka uronjenog u cjelinu postojanja.

Bilješke

Vanjske poveznice

Vještičji Ormar blog

Ezoterija
Vještičarstvo

redpajama_set_name: RedPajamaWikipedia


text:
<!- 2019-07-19 12:00:03am --> <!- 2019-07-18 11:55:01pm --> <!- 2019-07-18 11:50:02pm --> <!- 2019-07-18 11:45:02pm --> <!- 2019-07-18 11:40:03pm -->
Pair of 2nd inning homers push Auburn past Alabama
Auburn beat Alabama 5-2 in the 10th annual Capital City Classic in Montgomery on Tuesday night.
Posted: Mar 27, 2018 10:57 PM
Posted By: Jesse Merrick
The Auburn Tigers continued their dominance against Alabama in the MAX Capital City Classic on Tuesday night with a 5-2 win over the Crimson Tide to push their record in the series to 9-1.
"A win is a win," sophomore infielder Will Holland said. "It's even better when it's Alabama."
Following a 3-run home run from freshman utility player Edouard Julien in the bottom of the second inning, Holland hit the first of his two solo home runs to give the Tigers all they'd need to drop the Crimson Tide.
Center fielder Jay Estes also had a day. The senior started his day off with a spectacular catch against the wall in deep center to rob Chandler Taylor of an extra bases hit, the first of three highlight-reel catches from on the day.
"He definitely changed the ballgame," Auburn coach Butch Thompson said. "He covered territory like you want to see a center fielder do."
Thompson wasn't the only one to take notice of Estes' flashing of the leather on Tuesday night, his former coach also came away impressed.
"I haven't seen Jay make many of those plays. I've seen him field groundballs," said Alabama coach Brad Bohannon, an Auburn assistant last year.
"You could put him behind the plate, you could put him anywhere, and he's do a good job," Bohannon said. "I'm not surprised to see him do well out there."
The win pushes the Tigers to 21-5 on the year and drops the Tide to 16-10.
Next up for Auburn is a three-game home series with the Missouri Tigers while Alabama returns home to Tuscaloosa for a three-game home series of their own against Kentucky.
Lady Bulldogs power past Auburn
Auburn Women Slide Past Alabama In SEC Tourney
Floodwater pushes past manhole covers
Alabama & Auburn Start Bowl Practice
Auburn runs past Indiana State 83-64
Auburn takes down in-state rival Alabama at Auburn Arena
Auburn wins!
Auburn gets past New Mexico State in close game
Williams' three-run homer gives Auburn 6-5 win over Georgia Tech
Blood tests delay any possible charges in deadly boat crash on Wilson Lake
All content © copyright WAAY. Copyright © 2019 Heartland Media, LLC. All Rights Reserved. Generated: 2019-07-19 12:00:03am


VANCOUVER, BRITISH COLUMBIA--(Marketwired - Jan. 20, 2014) - Avanti Mining Inc. (TSX VENTURE:AVT)(PINKSHEETS:AVNMF) and its wholly owned subsidiary Avanti Kitsault Mine Ltd. ("Avanti" or the "Company") is pleased to announce it has signed a Memorandum of Understanding ("MOU") with the Wilp Luxxhon related to its proposed Kitsault Mine Project.
"This understanding with the Wilp Luxxhon is a reflection of our hard work and determination to support First Nations and local communities in meaningful ways," said Avanti's President and CEO, Mark Premo. "We look forward to implementing the components of the MOU which will provide sustainable economic benefits to the Wilp Luxxhon people and will support further development of the Kitsault Mine Project."
Provision of certain road maintenance contracts to Wilp Luxxhon contracting services.
Supporting Wilp Luxxhon efforts to develop a Road Maintenance Contractor business through the provision of funds which will be used to prepare business plans.
Providing mine training opportunities to Wilp Luxxhon people.
Wilp Luxxhon Chief, Don Russell, said, "Avanti is a fair and conscientious mining company. We are looking forward to implementing this MOU in a way that brings multiple benefits to our people."
Avanti is focused on the development of the past-producing Kitsault molybdenum mine located north of Prince Rupert, British Columbia. The Kitsault Mine Project received an environmental assessment certificate from the province of British Columbia in March 2013. A federal environmental assessment decision is expected in the near future.
For further information, please visit www.avantimining.com.
Forward-Looking Statements: This news release contains certain forward-looking information concerning the business of Avanti Mining Inc. All statements, other than statements of historical fact, included herein including, without limitation, the availability and completion of the Facility, the Company's plans to arrange debt and equity financing to build the Kitsault project, and the development of the Kitsault project, are forward-looking statements. These forward-looking statements are based on the opinions of management at the date the statements are made and are based on assumptions and subject to a variety of risks and uncertainties and other factors that could cause actual events to differ materially from those projected in forward-looking statements. Important factors that could cause actual results to differ materially from the Company's expectations include fluctuations in commodity prices and currency exchange rates; uncertainties relating to interpretation of drill results and the geology, continuity and grade of mineral deposits; uncertainty of estimates of capital and operating costs, recovery rates, production estimates and estimated economic return; the need for cooperation of government agencies and native groups in the exploration and development of properties and the issuance of required permits; the need to obtain additional financing to develop properties and uncertainty as to the availability and terms of future financing; the possibility of delay in exploration or development programs or in construction projects and uncertainty of meeting anticipated program milestones; uncertainty as to timely availability of permits and other governmental approvals; results of negotiations with a potential strategic partner and other risks and uncertainties disclosed in the Company's Annual Information Form for the year ended December 31, 2012, which is available at www.sedar.com. The Company is under no obligation to update forward-looking statements if circumstances or management's opinions should change, excepting as required by applicable securities laws. The reader is cautioned not to place undue reliance on forward-looking statements.
About this company Avanti Mining Inc.


Leading Company for Custom Inflatables!
Thank you for visiting the online home of Inflatable Images. For any inquiries you may have regarding our products or services, feel free to use the below contact form.


text:
\section{Introduction}

This paper surveys the state of the art of parallel A* and Best First Search algorithms. We implement several approaches and empirically evaluate the performance of each. Our goal is to survey each of these methods in Rust \cite{rust} - a relatively new language without Parallel A* implementations but with all the tools to create them.

We implemented KPBFS, DPA*, and HDA* in Rust. We overview the research of each of these methods, detail our implementations, and then go into detail on analyzing the results of our experiments. We test each of our implementations using multiple heuristics on 1, 2, 4, 8, and 16 threads.

\section{Background \& Related Work}

\subsection{A*}

A* was first proposed as a solution to finding a minimal cost path through a graph in 1968 \cite{4082128}. Since the details of the algorithm are well known, we will not go into too much detail going over it, however we will present again the concepts utilized in the parallel implementations.

A* computes the minimum-cost path in a graph from the $START$ node to the $END$ node. The core components of A* are in the ordering of the nodes. As nodes are added to the open set to process, they are ordered according to $ f(n) $ where $ f(n) = g(n) + h(n) $. Here, $ g(n) $ is the cost that it takes to get from $START$ to $n$, and $ h(n) $ is the computed heuristic cost. In our setup each node will have Cartesian metadata ($x$ and $y$ coordinates) on which we will compute Manhattan distance between the current node and $END$. The Manhattan distance would be guaranteed to be an admissible heuristic as in our graph setup, movement is only allowed in one of four cardinal directions with some directions being blocked off, resulting in a cost of $c$ from $n$ to $END$, where $c \geq h(n)$.

In addition to Manhattan distance, we may also explore additional heuristics to see how heuristic quality, accuracy, and complexity affects different runtimes.

\subsection{Classification of Methods}

The two different approaches to implementing parallelized A* are centralized and decentralized. The centralized approach ``requires synchronization on every node, expansion, and generation" \cite{survey_p_astar}. The decentralized approach introduces the problem of work distribution. In the literature, the solutions to this problem are hash-based work distribution, structured abstraction, and randomized strategies. The hash-based work distribution is widely explored and divided into synchronous and asynchronous communication. The different implementations use different feature generation methods.

\subsection{Centralized A*}

One of the first methods of parallel A* proposed is Centralized Parallel A* (CPA*) \cite{cen_decen}. Fukunaga et al. proposes Simple Parallel A* (SPA*) as the simplest way to do CPA* \cite{survey_p_astar}. SPA* is implemented in a quite simple derivative of normal A*. By placing a lock on the $OPEN$ list, and making both the $OPEN$ and $CLOSED$ lists shared memory, SPA* just deques nodes across multiple threads until the goal is reached. The problem is that since a lock is used and threads will likely be waiting on one another, SPA* has worse runtimes than single threaded A* (which is why we are not pursuing the implementation of SPA*) \cite{survey_p_astar}. Additionally, given that we are pursuing an implementation of KPBFS (\ref{kpbfs_impl}), the two implementations are incredibily similar and KPBFS has use cases unlike CPA*, which is why we see providing a KPBFS implementation as sufficient.

\subsection{K-Best First Search}
\label{kpbfs_impl}

The K-Best First Search algorithm (KBFS) is an algorithm that expands the top $K$ nodes from the $OPEN$ list. With this it provides better (albeit approximate) results when given inadmissible heuristics \cite{k_bfs}. KBFS most accurately models real world situations where large errors in heuristic calculation can occur.

An extension of KBFS, entitled KPBFS, \textit{P} meaning \textit{P}arallel, was introduced later in an attempt to exploit the increased performance of running many threads at once \cite{kpbfs}. As it is a derivative of KBFS, KPBFS's goal is to find approximate solutions to inadmissible, or sub-optimal, BFS problems. KPBFS has its best performance when the heuristics are computationally expensive, thus utilizing the threads to a greater degree and guaranteeing a coarse-grained approach \cite{kpbfs}. While performance increases were not in the double digits, a better performance was seen when the number of threads was increased (even when using more threads than cores) \cite{survey_p_astar}.

\subsection{Decentralized A*}
A decentralized version of parallel A* reduces the contention caused by the centralized parallel A* \cite{cen_decen}. In particular, it takes advantage of giving each processor its own local $OPEN$ and $CLOSED$ lists. We will be investigating some of the advantages and disadvantages of decentralized parallel A*, as well as some communication methods used to improve its performance \cite{2017arXiv170805296F}.  One option thread communication method is to have a $BUFFER$ list stored on each thread but allow communication across all threads.  This helps threads randomly assign and distribute the work when a node looks at its neighboring nodes.  This we hope will also lead to better performance as more threads in the system will be aware of the optimal solution quicker instead of getting settled on one particular non-optimal path.

HDA* is an extension of DPA* that is supposed to provide greater performance via a hash-based distribution of work in which each processor comes to own a portion of the search space. \cite{survey_p_astar} We hope an implementation of HDA* will improve upon an implementation of DPA*.

\subsection{Massively Parallel A*}

Massively Parallel A* research focuses on how one can use the power
of a GPU to make a graph algorithm such as A* increasingly faster. Proposed in \cite{survey_p_mpastar} the first step to exploiting the parallel processing nature of a GPU is the ability to used parallel data structures and algorithms because most common ones are written sequentially in nature to run on a CPU.  They propose an algorithm GA*.

This algorithm at first glance is not much different than DPA* but differs in a few ways.  While DPA* utilized OPEN and CLOSED Lists to maintain the state of the nodes, GA* to exploit the nature of a GPU utilizes parallel queues.  GPU power is also shown because of just using 1 queue similar to an OPEN list in DPA*, GA* utilizes thousands of queues in parallel to get the best performance.

\subsection{Motivation}

With all these cutting edge methods of creating parallel A*, the results in the simple case are a slight performance increase \cite{survey_p_astar}. However, when the problem becomes more complex or large, certain methods start to shine.

With KPBFS, situations where the heuristic is costly or where it is inadmissible result in KPBFS having performance benefits over KBFS and A* \cite{kpbfs}.

With DPA*, if the graph is especially large, that is $V$ the set of open nodes, grows significantly as the search progresses, DPA* is shown to outperform A* \cite{cen_decen}.

\section{Methodology Overview}

Concurrent programming in Rust is achieved through the \texttt{std::thread} module, which gives us access to native threads. The \texttt{spawn} method, which starts a thread, returns a \texttt{JoinHandle} struct,  giving the main thread control of the other threads for blocking, unblocking, and waiting for termination; that is, when the algorithm finishes on success or failure.

\label{MPSC}
For communication, the standard module allows for the use of channels, atomic shared variables, atomic reference counters (\texttt{Arc}s), locks, and barriers as part of the \texttt{std::sync} module. Shared variables can be implemented with a combination of locks (\texttt{Mutex}) and \texttt{Arc}s which wrap any data structure or variable, or through atomic types, which are only implemented for unsigned and signed integers and booleans. However, this introduces additional overhead as the contention for a variable increases when the number of threads present increases. For this reason, Rust provides asynchronous channels to send data between threads, allowing for communication without blocking, as part of the \textbf{m}ulti-\textbf{p}roducer \textbf{s}ingle-\textbf{c}onsumer (mpsc) strategy - meaning that multiple threads can send messages to the same receiver but only one thread is associated with the receiver. Here, threads can send data to each other, which is added to the receiver's bounded or unbounded buffer, so that it can be received at a later time.

Channels, although useful, can cause issues in a parallelized algorithm when threads need a checkpoint to be forced to wait for all other threads to receive data, since the buffer may get too large. For this, Rust allows the use of barriers (as part of ``thread synchronization") which makes all threads wait at a given point for the specified number of threads to catch up, thus forcing all threads to read the most updated data. A flaw, however, is found when a thread exits on success, but is not able to notify the barrier (given its implementation), forcing all threads to reach the same checkpoint and deadlock since the exited threads will never reach it. For this reason, we implemented our own version of a dynamic barrier.

\section{Centralized A*}

\subsection{SPA*}

As discussed previously in Fukunaga et al. \cite{survey_p_astar}, the most standard CPA* approach, SPA*, has been shown to have worse runtimes than a single-threaded, Best First Search - thus we did not see it as beneficial to provide an implementation in Rust.

\subsection{K-Parallel Best First Search}

KPBFS was the first parallel A* that we created. Following closely the work of Vidal et al. we used their outline to create our implementation of KPBFS. \cite{kpbfs} No psuedocode was provided so some interpretation of the paper had to be done.

At the implementation level, our KPBFS solution in Rust is the easiest to understand as it resembles the traditional A* algorithm the most. KPBFS uses locks in the original implementation so we utilize them here as well.

Our implementation works by starting up a series of search functions each in their own thread - they share Mutex $HashMap$ of explored states and a Mutex $PriorityQueue$ of the elements to be explored next. Within the search function a classic A* is implemented with the main difference just being that any operations that access shared memory (popping off the next state, modifying the closed list, etc) must obtain a lock first. The program terminates when the shared queue is empty - as at that point there are no longer any relevant states left to explore.

\section{Decentralized A*}
As stated in section II, decentralized parallel A* takes advantage of giving each processor its own $OPEN$ and $CLOSED$ lists. The algorithm would begin by having a single processor delegating nodes to each available processor. Then, each processor runs its own localized A* search using its local $OPEN$ list. This removes the concurrency overhead that was generated by the centralized parallel A* implementation. With no communication between the processors, there would be a lot of repeated computation when expanding nodes. For this reason, we discuss two communication strategies and their implementation in Rust, with the goal of reducing redundant expansions.

 \subsection*{The Black Board Communication Strategy}
There are a plethora of communication methods available for us to use to assist in the load balancing for the decentralized parallel A* algorithm. One such method includes The Black Board Communication Strategy, in which we have a shared ``black board" among all processors. The processor looks at its local $OPEN$ list; if its best node is much better than the best node on the black board (meaning it has a much lower $f$-value relative to the threshold we set), we will give the blackboard some of the ``good" nodes from our local $OPEN$ list. If the processor's best node is significantly worse than the best node on the black board, we will move some of the best nodes on the black board to the local $OPEN$ list. The idea is that we want to always be expanding the nodes with the lowest $f$-values\cite{cen_decen}.

\subsection*{The Random Communication Strategy}
The idea for this communication method is when the successor nodes are generated for a specific processor, we distribute these nodes randomly to other available processors' $OPEN$ lists. That way, other processors get a partition of the ``good part" of the search space. An issue with this approach is that duplicate nodes could end up being expanded if they exist in one processor's $CLOSED$ list but go to a different processor's $OPEN$ list. We can implement a search for duplicates, but this would lead to a lot of search overhead.

\subsection*{Implementation Details}
\label{dyn_barrier}
To achieve these strategies, threads communicate through channels, as shown in Section III, which permits us to send the data to the hash selected nodes, who then add the received data to their respective $OPEN$ list. To avoid having threads reading an empty buffer, we introduced a barrier that synchronizes all threads. An issue occurs, as discussed earlier, when one or more threads exit early, causing the other threads to enter a deadlock when executing \texttt{barrier.wait()}. Because the barrier does not detect threads that exited and the count for threads waiting cannot be decremented, we introduce our implementation of a dynamic barrier that can correctly synchronize threads at a checkpoint without deadlock. Its design is modeled after the current barrier, but waiting is implemented through channels, allowing threads to signal when they exited early, thus preventing the deadlock.

A thread terminates either when its amount of sent messages is equal to the amount of received messages or when the early exit flag is set to true. This early exit flag is set to true when the thread finds a better path to the goal node than the one that previously existed.

\section{Hash Distributed A*}

Hash Distributed A* is a decentralized implementation that utilizes hash-based work distribution. This method was a reopened investigation into hash-based work distribution for A* by Kishimoto, Fukunaga, and Botea \cite{survey_p_astar}. The hash function is the key to creating any substantial parallel speedups in this implementation. In HDA*, each thread is given a part of the search space by using the hash function. Both the open and closed lists use a distributed data structure. The way the partitioning works is the thread waits until it has received a message (a new state to potentially expand) and then checks if the state (from the message) is in the closed list. If not, the new state is inserted into the open list. Then, if there are currently no messages, the thread will select the highest priority state from its open list and expand it. Expanding generates new states; for each new state, a hash key is computed based on the state's representation. The thread then sends a message to some other thread who "owns" the new state according to its hash.

Rather than having the open and closed lists shared amongst the threads in a way that requires synchronization, HDA* does not "explicitly" share these lists \cite{survey_p_astar}. HDA* uses message passing, with state-packing as an optimization, to communicate amongst threads.

\subsection{Implementation Details}

For our implementation of HDA* we begin by expanding the start node. After this each thread executes the following steps until the optimal solution is found. First, the thread checks if any states have been received in its message queue. If there are any, then it will check to see if the state is in the closed list which determines whether the state is a duplicate or if it should proceed to be inserted into the open list. Second, if there are no messages in the queue then the thread will grab the highest priority state from the open list and expand it \cite{survey_p_astar}.

One of the biggest differences between this implementation and our DPA* implementation is that here we perform all of the checks previously done in the for loop controlled by the buffer list right when we receive a node. Then once we are done receiving, we expand the root of the open list. In short, there is no buffer list and some of the logic is reordered.

\section{Massively Parallel A*}

Massively Parallel A* is a new concept that primarily focuses on using GPU computing power to increase speed of existing A* algorithms.  GPUs optimize for parallel processing unlike CPUs that are designed to work better for sequential processes.  One of the bigger bottlenecks in A* is computing the heuristic function.  This can be greatly reduced by using GPUs since we can exploit the design of GPUs by paralleling the computation.  Another problem is the fact that when expanding nodes they often only have a very small finite number of states to process while most GPUs have thousands of cores.  These states are often processed using a priority queue which are often sequential in nature and even the lock-free parallel priority queues do not run efficiently on most GPU architectures.  Zhou and Zeng propose a new way of GA* which optimizes the A* algorithm to work on GPUs in the intended manner.  The GA* algorithm uses K priority queues to expand the nodes in the graph.  The larger K is the better we can exploit the parallel nature of GPUs but can not increase infinitely because of the overhead it would create.  Each priority queue would then extract states.  These states would then be expanded and duplicated in order to then compute their corresponding heuristic values.  Theses values would then be pushed back onto the the queues.  The GA* algorithm is then terminated when the queues are empty.  This algorithm showed great speed up over A* algorithms on CPUs and even other MPA* algorithms on GPUs. \cite{survey_p_mpastar}

\section{Evaluation}

\subsection{Timing}

Timing is crucial for evaluating the performance of each implemented method. For timing we will utilize the Rust standard library, superficially \textit{std::time} as it suits our needs perfectly without reinventing the wheel \cite{rust}. We will also utilize Rust's \textit{bench} functionality to create workflows that automatically benchmark our implementations with various flags for thread count and heuristic type.

\textit{bench} provides us with millisecond levels of detail, outliers, and regressions so it is more than powerful enough for our needs. Additionally by programmatically creating a number of test scenarios we can run them from the command line which means we can test without having to make minor changes in our code.

The output produced by \textit{bench} also runs each function a number of times and producing an average ensuring that our metrics are not just one-off runs but rather representative of the performance as a whole.

\subsection{Graph Generation}
In order to test the correctness and runtime of our parallel A* implementations, we will be generating a set of test data. A test case will include a number $n$, representing the length and width of the square grid. The grid will be made up of the characters '.', 'S', 'E', and 'W' which represent a node, the start node, the end node, and a wall, respectively. The goal is to reach the 'E' node starting at the 'S' node by only taking the open paths, '.', and avoiding the walls, 'W'. The test cases consist of bounds where $n = 10, 100, 1000$ and it is guaranteed that there will be a valid path from 'S' to 'E'. We randomly generated the walls so that our A* implementations will be tested against more complicated traversals than a simple breadth first search. The nodes have a 20\% chance of being a wall, and the start and end nodes are also randomly generated.

\subsection{Heuristic}

\subsubsection{Admissibility}

A* is said to be admissible when the heuristic used is also admissible; that is, the heuristic never overestimates the cost of reaching a goal \cite{4082128}. KBFS differs from classical A* in that it is designed to work with inadmissible heuristics and provide approximate solutions in said cases \cite{k_bfs}. As such, with our KPBFS solution, we will simulate inadmissible heuristics by adding random noise to our euclidean distance calculation.

\subsubsection{Cost}

As stated in KPBFS \cite{kpbfs}, the greatest parallelized returns are seen when the heuristic is computationally expensive. When cheap (in a computational context) heuristics are used, Vidal et al. states that less time is spent in a truly parallel setting and more time dequeing and expanding nodes \cite{kpbfs}. As part of our evaluation, we will use computationally cheap heuristics with each implemented method as well as a simulated expensive method for each. This will ensure that if a certain parallel method works well for expensive heuristics or poorly for cheap ones we will have accurate data points for both.

Our cheap heuristic will just be the computation of the 2D Euclidean distance (given the $(x, y)$ metadata for each node). Our expensive heuristic will be a simulated complexity, sleeping the thread for some pseudo-random amount of time greater than the time it takes to compute Euclidean distance but still less than a few seconds.

\subsubsection{Evaluation}

Given the details of admissibility and cost, we have decided to create 5 heuristic types to benchmark our functions. Each of the 5 types are outlined and explained below.

\begin{itemize}
    \item Euclidean - computes the Euclidean distance between two points on the grid defined by $\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}$.
    \item Manhattan - computes the Manhattan distance between two points on the grid defined by $|x_1-x_2| + |y_1-y_2|$.
    \item Inadmissible - computes the Euclidean distance as defined above and then adds a small random delta to make the heuristic and over-estimation and thus inadmissible.
    \item Expensive - computes the Euclidean distance as defined above but the method takes longer to execute by sleeping the thread for a small number of milliseconds thus simulating a computationally expensive heuristic as outlined in different reference papers. \cite{kpbfs}
    \item ExpensiveInadmissible - a combination of the Expensive and Inadmissible methods above. It adds a small random delta to make the Euclidean distance and over-estimation (and thus inadmissible) as well as waits the function for a small amount of time.
\end{itemize}

Our testing mostly made use of the Euclidean heuristic as a baseline and the Expensive heuristic to simulate the conditions specified by the various reference papers. The Inadmissible heuristic was used to test the inadmissibility strength of the KPBFS algorithm compared to other implementations.

\section{Results}

\subsection{KPBFS}

\subsubsection{Background}

As Vidal et al. states in their KPBFS paper - they see the most performance benefit when the heuristic is costly as the algorithm itself is coarse-grained and less benefits when the heuristic is  computationally cheap. \cite{kpbfs} Both of these findings were reflected in the results of our implementation.

\subsubsection{Cheap Heuristic}

In this run the Euclidean heuristic is used as defined previously. A search space of 5000*5000 nodes is used as it was found to be large enough for the algorithm to run in more a few milliseconds while still not taking exceedingly long. Other size search spaces showed the same trend.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.41948 \\
  \hline
  2 & 0.42938 \\
    \hline
  4 & 0.50935 \\
    \hline
  8 & 0.81404 \\
    \hline
  16 & 1.3249 \\
  \hline
\end{tabular}
\caption{KPBFS results with Euclidean heuristic on a 25,000,000 node search space}
\label{table:kpbfs_euc}
\end{table}

As shown in \ref{table:kpbfs_euc} since this is a coarse-grained solution with high amounts of contention increasing the thread count decreases the runtime. This is not to say that the algorithm is completely useless - in fact this was outlined in \cite{kpbfs} as the reality of the algorithm and the places it shines are with expensive heuristics and inadmissible heuristics.

Looking at the results in finer detail the regression isn't too significant when going from 1 to 2 to 4 threads - however when looking at 8 and 16 they are 2 times and 3 times the originally runtime respectively which is a major regression. This would be worrying if this were the intended use case for KPBFS, but as explained above it is not.

\subsubsection{Expensive Heuristic}

In this run the expensive heuristic took 1 millisecond to compute. A smaller 10,000 node search space was used as the increased cost of the heuristic would result in extremely large run-time for larger search spaces. Other size search spaces showed the same trend.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 4.6682 \\
  \hline
  2 & 2.3360 \\
    \hline
  4 & 1.2112 \\
    \hline
  8 & 0.59077 \\
    \hline
  16 & 0.29615 \\
  \hline
\end{tabular}
\caption{KPBFS results with Expensive heuristic on a 10,000 node search space}
\label{table:kpbfs_exp}
\end{table}

The results of \ref{table:kpbfs_exp} show the strength of the KPBFS implementation - real world situations. In situations where the heuristic is more computationally complex than just a square root function (like with self driving car scenarios) KPBFS would provide noticeable performance improvements. By doubling the thread count a roughly 50\% cut in runtime is seen without any slowing - moving from 1 to 2 was a 50.04\% cut and moving from 8 to 16 was a 50.129\% cut. This test was obviously more of a simulation (of a more complex scenario) than a real world scenario but quantitatively confirms the results of Vidal et al. \cite{kpbfs}

\subsubsection{Inadmissible Heuristic}

KPBFS's goal with inadmissibility is that traditional A* algorithms will result in a goal being found with an incorrect cost when an inadmissible heuristic is used while KPBFS will still attempt an approximate answer. \cite{kpbfs}

Using KPBFS with an inadmissible heuristic yields an approximate - albeit higher than correct - cost. Our hypothesis was that KPBFS should provide a better approximation than a more traditional A* (or DPA* or HDA*). This wasn't the case in our testing, the approximate answer on a 1000x1000 node graph was roughly the same between the various implementations with HDA* typically being the closest to the correct answer. We theorize this to be because of HDA's distribution of nodes so a more proper route was still explored. Even though KPBFS approximated similarly to HDA and DPA we additionally theorize its due to the multi-threaded nature of all the algorithms (they share the same advantages) where a comparison to a vanilla single threaded would result in KPBFS having a greater advantage.

\subsection{DPA*}

\subsubsection{Background}

In Fukunaga et al.'s survey of Parallel A* they stated that DPA* provided significantly less overhead than centralized implementations however did not state directly that greater performance than single threaded A* could be directly achieved citing new problems that arise in distributed contexts such as balancing, re-exploration, and work stealing - and since this is still an actively researched topic there is no universal solution to all those problems. \cite{survey_p_astar}

Kumar et al., in their proposal of SPA* and DPA*, discussed the implementation as well as their initial findings. Extreme parameters were used, including a $2^{65}$ search space (significantly reduced by an admissible heuristic) and a 256-core CPU. \cite{cen_decen} The declared that in scenarios where the set of node expands very rapidly the decentralized parallel implementation out performs a single threaded implementation.

The exact settings Kumar et al. used couldn't be replicated (namely the extreme search space and number of CPU cores), all testing was done on a 4-core CPU and specified search space sizes going up to $25,000,000$.

\subsubsection{Cheap Heuristic (Initial Run)}

Initial testing was done using the cheap heuristic as no major mentions of using computationally expensive heuristics were made in related works. Euclidean distance was also used to keep consistency with KPBFS results.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.084029 \\
  \hline
  2 & 0.22357 \\
    \hline
  4 & 0.2279 \\
    \hline

\end{tabular}
\caption{Initial DPA* results with Euclidean heuristic on a 1,000,000 node search space}
\label{table:dpa_euc}
\end{table}

The initial DPA* results we got from Kumar et al.'s outline of DPA* are above. \cite{survey_p_astar} A euclidean heuristic and a 1000 by 1000 graph are used.

You may notice that only 1, 2, and 4 threads are shown here. This is because in the reference DPA* going beyond 4 threads on our machines resulted in our \textit{Buffer}s becoming backlogged and the program to hang with about a $30\%$ rate. We theorize this to be because of the differences in our machines as well as the space size. Another possible cause is that while a euclidean heuristic is admissible it is not 100\% accurate as all our implementations move in the 4 cardinal directions (manhattan movement) - thus the Manhattan heuristic would be more accurate but \textbf{both} would be admissible.

Looking at the results - we can see that 1 thread gives very good performance compared to the 2 and 4 threads - so some contention occurs when more threads are added. However, looking at 2 and 4 threads we can see somewhat promising results that no additional contention is added - over a few hundred runs of both 2 and 4 threads on DPA with the euclidean heuristic both are $~0.22$.

The below table provides the same test as above (DPA*, 1,000,000 node graph) but using the Manhattan heuristic as it provides a more accurate representation of the movement.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.050944 \\
  \hline
  2 & 0.12353 \\
    \hline
  4 & 0.11673 \\
    \hline
  8 & 0.129 \\
    \hline

\end{tabular}
\caption{Initial DPA* results with Manhattan heuristic on a 1,000,000 node search space}
\label{table:dpa_man}
\end{table}

We can see that the usage of the more accurate Manhattan heuristic does give noticeable benefits over the less accurate, but still admissible, Euclidean heuristic. At each thread level the speed is roughly double the speed of the Euclidean test, and in addition to this the 8 thread test is more stable (most likely due to the higher accuracy of the heuristic and not exploring bad states) and thus an averaged sample was able to be created.

\subsubsection{Cheap Heuristic (No Locks)}

This section just serves to provide some updated DPA* results - in our initial runs we used a \textit{Mutex} to keep track of the best solution (what we call the \textit{Incumbent}). We were able to change this to an atomic value with a compare and set loop as it made more sense with the situation and the results subsequently improved as you can see from the above below.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.051331 \\
  \hline
  2 & 0.078279 \\
    \hline
  4 & 0.072629 \\
    \hline
  8 & 0.092850 \\
    \hline

\end{tabular}
\caption{No lock updated DPA* results with Manhattan heuristic on a 1,000,000 node search space}
\label{table:dpa_man_no_lock}
\end{table}

As you can see from the table the results are significantly better when multiple threads are used - it is about a 2x speed up from the solution that uses a \textit{Mutex}.

\subsubsection{Cheap Heuristic (Updated Run)}
\label{update}
In the initial run we were unable to get 8 or 16 threads due to a deadlock issue that occurred. We discovered it to be because of the crossbeam library, specifically the \texttt{unbounded} channels that allow for them to be MPMC (multiple-producer, multiple-consumer), which were utilized in DPA* and HDA* for a simplification of wait and lock-free cross-thread sending and receiving of nodes. This allowed for the cloning of transmitters and receivers, which permitted each thread to have transmitters to all other threads. Following the pattern for MPSC (multiple-producer, single-consumer) from section \ref{MPSC}, it was believed that as soon as a thread exits, causing its receiver to go out of of scope, the receiver would be dropped (killed). However, the library's implementation of unbounded channels does not keep references of cloned channels, causing them to never be dropped. This allowed any completed threads to still ``receive" messages, which broke the terminating condition as they are never able to read them.

The solution was simple, as we could force the terminating thread to drop its receiver before exiting, disallowing any additional threads to send messages to it and continue sending messages to any of the ``live" threads.

We implemented this solution and the results are in the table below. (and also did this solution for the updated run of DPA* with the expensive heuristic and HDA*).

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.050088 \\
  \hline
  2 & 0.086390 \\
    \hline
  4 & 0.077879 \\
    \hline
  8 & 0.089861 \\
    \hline
  16 & 0.21919 \\
  \hline
\end{tabular}
\caption{Final DPA* results with Manhattan heuristic on a 1,000,000 node search space}
\label{table:dpa_man_updated}
\end{table}

\subsubsection{Expensive Heuristic (Initial Run)}

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 1.8387 \\
  \hline
  2 & 2.5358 \\
    \hline
  4 & 1.5934 \\
    \hline
\end{tabular}
\caption{Initial DPA* results with Expensive heuristic on a 10,000 node search space}
\label{table:dpa_exp}
\end{table}

Similar to the initial run of the Euclidean (cheap) heuristic above you may immediately notice the absence of the 8 and 16 threads. This is due to the same reasons discussed above.

Looking at the results from the table above, interesting results are shown to give benefit to more cores. Over the average of hundreds of runs, 1 thread with DPA* on the expensive heuristic gave a roughly $~1.8$ second runtime.

If we move to 2 threads, keeping all other variables the same, the speed gets worse at $~2.5$ seconds. We theorize this to be because of constant overhead in having multiple threads and performing waits on some variables.

Interestingly, if we move to 4 thread we consistently get the best performance clocking in at $~1.6$ seconds. So moving from 1 to 4 threads does show a noticeable and consistent performance increase. Likely because the 2 new threads didn't add any new overhead but just helped more evenly distribute the workload of heuristic calculation and node expansion.

\subsubsection{Expensive Heuristic (Updated Run)}

Using the update described in \ref{update} Cheap Heuristic (Updated Run) we were able to run with 8 and 16 threads here. Below is the result of that run.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 1.6721 \\
  \hline
  2 & 2.5114 \\
    \hline
  4 & 1.5800 \\
    \hline
  8 & 0.80586 \\
    \hline
  16 & 0.43366 \\
  \hline
\end{tabular}
\caption{Final DPA* results with Expensive heuristic on a 10,000 node search space}
\label{table:dpa_exp}
\end{table}

From the addition of the 8 and 16 thread data points we can see that after the initial constant overhead of having multiple threads is surpassed by the increased performance of having multiple threads very good results start to be seen. The 16 thread run is 4 times as fast as the original 1 thread run with the expensive heuristic.

\subsection{HDA*}

\subsubsection{Background}

Previous experimentation on HDA* noted its benefit over DPA* with the idea of state ownership amongst certain processors. Testing was done using HPC clusters of various sizes packing many messages into 16+ CPU machines and less into smaller machines, it was noted that performance was highly dependent on the number of physical CPU cores used and the individual speed of said cores. \cite{survey_p_astar} Again, our testing will be done on various search spaces with 4 physical CPU cores.

\subsubsection{Cheap Heuristic (Initial Run)}

From the table below we can see that HDA* is more performant than DPA* at all thread levels - this holds with our initial hypothesis as well as the results of related work. \cite{survey_p_astar} We can also see that like DPA* with the Euclidean heuristic there is an increase in runtime when adding threads (obviously not ideal) but this time the not as large. We see that moving from 1 to 4 threads is a 1.54x increase, where in DPA* it was a 2.71x increase which is much worse. From this we can see the overhead on HDA* is lower.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.088057 \\
  \hline
  2 & 0.1103 \\
    \hline
  4 & 0.13609 \\
    \hline

\end{tabular}
\caption{Initial HDA* results with Euclidean heuristic on a 1,000,000 node search space}
\label{table:hda_euc}
\end{table}

The below table provides the same test as above (HDA*, 1,000,000 node graph) but using the Manhattan heuristic as it provides a more accurate representation of the movement.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.042079 \\
  \hline
  2 & 0.061875 \\
    \hline
  4 & 0.065989 \\
    \hline
  8 & 0.094115 \\
    \hline

\end{tabular}
\caption{Initial HDA* results with Manhattan heuristic on a 1,000,000 node search space}
\label{table:hda_man}
\end{table}

The same benefits with switching DPA* to the Manhattan heuristic are seen here. We are able to run 8 threads much more consistently on HDA*, and the runtimes are significantly improved.

\subsubsection{Cheap Heuristic (Updated Run)}

Using the update in \ref{update} Cheap Heuristic (Updated Run) the table below has the HDA* result for the 16 thread run on the Manhattan heuristic as well. It also includes changing the one \textit{Mutex} to an atomic.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 0.042384 \\
  \hline
  2 & 0.044140 \\
    \hline
  4 & 0.041139 \\
    \hline
  8 & 0.074064 \\
    \hline
  16 & 0.13072 \\
  \hline
\end{tabular}
\caption{Final HDA* results with Manhattan heuristic on a 1,000,000 node search space}
\label{table:hda_man}
\end{table}

The additional data point above doesn't add too much insight as it follows the trend with HDA* on the Manhattan heuristic from the previous section (where adding more threads slightly decreased performance) however it validates that the program runs properly. However the overall inclusion of atomic showed significant performance gains similar to its inclusion on DPA* (see No Locks section on DPA*).

\subsubsection{Expensive Heuristic (Initial Run)}

Running HDA* with the Expensive heuristic gave results that consistently improved with additional threads as you can see in the table below.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 1.6848 \\
  \hline
  2 & 1.6046 \\
    \hline
  4 & 1.1367 \\
    \hline

\end{tabular}
\caption{Initial HDA* results with Expensive heuristic on a 10,000 node search space}
\label{table:hda_exp}
\end{table}

If we look back at DPA* with the expensive heuristic runtime was worsened when the second thread was added (because of higher overhead) but with HDA* we see a decreased runtime on the addition of the second thread and on the addition of the third/fourth threads.

The runtime between 1 and 2 threads was an improvement of $~5\%$. And going from 2 to 4 threads yielded an improvement of $~41\%$.

\subsubsection{Expensive Heuristic (Final Run)}

Using the updates of removing the lock in favor of a compare and set loop and removing the deadlock case for larger threads the below table is the re-run of the Expensive Heuristic on HDA*. You can note how much the performance increased from the directly proceeding table.

\begin{table}[htb]
  \centering
\begin{tabular}{|c|c|}
  \hline
  Thread Count & Run Time (Seconds) \\
  \hline
  1 & 1.6226 \\
  \hline
  2 & 1.4744 \\
    \hline
  4 & 1.0803 \\
    \hline
  8 & 0.71974 \\
    \hline
  16 & 0.47127 \\
  \hline
\end{tabular}
\caption{Final HDA* results with Expensive heuristic on a 10,000 node search space}
\label{table:hda_exp}
\end{table}

When HDA* on the Expensive heuristic gets to 16 threads the runtime is 4x better than the single threaded implementation. And comparing to the initial run of the HDA* Expensive heuristic better performance at each thread count resulted from the removal of the lock.

\subsection{MPA*}

Throughout our research we quickly began to realize there was not much majorly adopted GPU support within our language of choice Rust.  While there are some self-made libraries out there it was super hard to understand and did not have any official support.  After deliberation with the team we decided to still attempt to write out code in Rust for the GA* algorithm but just test it on a CPU.  This would of course greatly impact our results since the algorithm is meant to be run on a GPU but the lack of overall GPU support with a fairly new language, in Rust, was a roadblock that made GPU support outside the scope of this research. When we began implementing GA* using CPU cores instead, we realized that we didn't allow ourselves enough time to implement it. The details of GA* took far longer to grasp, and only parts of the algorithm are actually parallelized rather than being done completely in parallel. We ultimately found a repository with the algorithm implemented in CUDA, but the code was incredibly difficult to parse. Ultimately, if we'd made GA* our main focus from the start we might've been able to fully implement it, but it was too complex for what we scoped.

\section{Conclusion}

In this project we introduced Rust implementations for various version of parallel A* including KPBFS, DPA*, and HDA*. KPBFS, being the most simple solution, had lots of synchronization overhead and thus had the overall worst performance and in cheap heuristic tests suffered the most contention when adding additional threads. DPA* was a significant jump over KPBFS - it reduced overhead and overall performance increased drastically. HDA* provided a similar jump over DPA* with the introduction of hashing the search space. With cheap heuristics performance remained flat with the addition of more threads (with DPA* and HDA*) or increased (KPBFS). Thought this was expected as shown in previous work. \cite{kpbfs}\cite{cen_decen} When an expensive heuristic was used all algorithms saw great performance increases with the addition of more threads.

One interesting finding made was depending on how accurately the heuristic modeled the movement of the algorithm affected performance. Since A* is just a Breadth-First Search with an additional heuristic if you have inadmissible (over-estimation) you will just get horrible results and runtimes and if you have heuristics that under-estimate too much the algorithm's runtime just turns into that of the size of the search space (like BFS). All the movements of KPBFS, DPA*, and HDA* were cardinal (or manhattan). When we switched from a euclidean heuristic (which would be an underestimation) to a manhattan heuristic (which estimates the movement most accurately) the performance roughly doubled. It is important to note that the manhattan distance heuristic isn't $100\%$ representative of the distance needed to travel because of walls in the graph (if there were no walls the results would be boring) but rather just of the movement.

Overall, the problem of parallelizing A* still remains a very open one as evidenced by the variety of solutions and recent research and we provided implementations of common algorithms in Rust as well as some findings specific to the language and our implementations.

The repository associated with this paper is available at \href{github.com/brettfazio/parallel-astar-rust}{github.com/brettfazio/parallel-astar-rust}.

\bibliographystyle{ieeetr}

redpajama_set_name: RedPajamaArXiv


text:
package com.amazonaws.services.ec2.model;

/**
 *

 * Represents an Amazon EC2 region. EC2 regions are completely isolated
 * from each other.
 *

 */
public class Region {

    /**
     * Name of the region.
     */
    private String regionName;

    /**
     * Region service endpoint.
     */
    private String endpoint;

    /**
     * Name of the region.
     *
     * @return Name of the region.
     */
    public String getRegionName() {
        return regionName;
    }

    /**
     * Name of the region.
     *
     * @param regionName Name of the region.
     */
    public void setRegionName(String regionName) {
        this.regionName = regionName;
    }

    /**
     * Name of the region.
     *

     * Returns a reference to this object so that method calls can be chained together.
     *
     * @param regionName Name of the region.
     *
     * @return A reference to this updated object so that method calls can be chained
     *         together.
     */
    public Region withRegionName(String regionName) {
        this.regionName = regionName;
        return this;
    }

    /**
     * Region service endpoint.
     *
     * @return Region service endpoint.
     */
    public String getEndpoint() {
        return endpoint;
    }

    /**
     * Region service endpoint.
     *
     * @param endpoint Region service endpoint.
     */
    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    /**
     * Region service endpoint.
     *

     * Returns a reference to this object so that method calls can be chained together.
     *
     * @param endpoint Region service endpoint.
     *
     * @return A reference to this updated object so that method calls can be chained
     *         together.
     */
    public Region withEndpoint(String endpoint) {
        this.endpoint = endpoint;
        return this;
    }

    /**
     * Returns a string representation of this object; useful for testing and
     * debugging.
     *
     * @return A string representation of this object.
     *
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        sb.append("RegionName: " + regionName + ", ");
        sb.append("Endpoint: " + endpoint + ", ");
        sb.append("}");
        return sb.toString();
    }

}

redpajama_set_name: RedPajamaGithub