Wednesday, June 15, 2022

Linkedin profile: HR position

 Melissa Jewison

  • Senior Manager, Talent - Enterprise & Commercial
    CiscoOct 2015 - Apr 2018 · 2 yrs 7 mosSan Francisco
      • Led a team of 14 incredibly talented Senior Sales Recruiters who are responsible for hiring all levels within our Enterprise and Commercial space throughout North America and LATAM.
  • Zenefits logo
    Manager, Sales Recruiting
    ZenefitsApr 2015 - Oct 2015 · 7 mosSan Francisco Bay Area
      • My role was focused on leading the recruiting team primarily responsible for the Sales Development and SMB org's within Zenefits. The bulk of my time was spent driving successful output in the SDR space as we were way behind on the hiring objectives when I joined. - started with a team of 5 recruiters; grew team to 21 comprised of leaders, senior and junior level recruiters, sourcers and recruiting coordinators. - presented our attainment to goal and analytics weekly to CEO and SLT to ensure transparency and progress. - built and executed a successful sourcing model for sales recruiting. - traveled between our 2 locations weekly to ensure engagement levels were at their peak. - worked alongside Training, Onboarding, HR, Finance and Sales Op's to partner on expectations and set clear goals. - worked with the business leaders to define a recruiting strategy and create cohesiveness between our groups. - my amazing team was able to triple the size of the SDR org during my tenure.
  • Salesforce logo
    Manager, Sales Recruiting
    SalesforceNov 2009 - Apr 2015 · 5 yrs 6 mosToronto, Canada Area

Tuesday, June 14, 2022

Gas price: the Federal Gas Tax Suspension and Windfall Profits Tax Act

 

Op-Ed: Give drivers a gas tax holiday. Tax windfall profits from oil companies instead

 ADAM B. SCHIFF

At the gas station near my home in Burbank, gas prices this week were an astronomical $6.50 per gallon, much higher than the nationwide average of $4.67, and just above the statewide average of $6.19 per gallon. Filling up the tank can cost a shocking $100. Working families cannot afford this, and it doesn’t have to be this way.

At the gas station near my home in Burbank, gas prices this week were an astronomical $6.50 per gallon, much higher than the nationwide average of $4.67, and just above the statewide average of $6.19 per gallon. Filling up the tank can cost a shocking $100. Working families cannot afford this, and it doesn’t have to be this way.

Nor are the oil companies using these profits to expand production to meet the surging demand of people returning to work and their daily lives. Instead, the corporations are spending the cash on large dividends for shareholders and tens of billions of dollars in stock buybacks for their investors.

It is unconscionable that this industry is taking advantage of the fallout from the horrible war and adding to people’s economic pain. Workers and families need immediate relief.

Some people have proposed that we suspend the federal gas tax — about 18.4 cents per gallon — as a way of alleviating some of the pain at the pump. I support that idea, but there are a couple things we need to keep in mind. First, if we do away with the federal gas tax, oil companies will simply raise their prices and pocket the amount that would have been paid as tax. And that won’t help consumers at all.

And second, the federal gas tax provides the resources for the Highway Trust Fund, which finances the construction and maintenance of roads, highways, bridges and public transit systems nationwide. Every commuter in Los Angeles can name a traffic chokepoint or other much-needed improvements they would like to see fixed. We don’t want to delay any of those projects by taking their funding away, especially if the oil companies are going to keep their prices high regardless of what we do with the gas tax.

That’s why I introduced the Federal Gas Tax Suspension and Windfall Profits Tax Act, to address both of these issues at once.

The bill would suspend the federal gas tax through the end of 2023, which would provide some immediate relief at the pump. To prevent the oil companies from jacking up their prices further, the bill would also impose a new 50% tax on income that is in excess of their reasonably inflated average profit. This windfall profits tax would be used to fund highway and mass transit projects while the gas tax is suspended.

This is not a complete solution, but it’s a start. Oil companies could still choose to increase profits even with the disincentive of losing half of that income. That’s why the anti-price-gouging legislation the House passed last month, which would empower the Federal Trade Commission to crack down on such abusive practices and punish bad actors, is so important.

To get us through the dire impacts of inflation, we need price relief at the pump right away. The combination of a holiday from the gas tax and a windfall profits tax on the oil companies could help.

But at the end of the day, we will remain at the mercy of the oil industry, petro-monarchies and Russian dictators unless we wean ourselves off fossil fuels. Over the longer term, we will destroy our planet if we continue on the present course.

We need to build a green new economy that phases out our reliance on petroleum and dramatically expands the use of renewable sources of energy. Otherwise, future generations will literally pay the price.

Adam B. Schiff, a Democrat, represents California’s 28th Congressional District and is chairman of the House Permanent Select Committee on Intelligence.

Coinbase: 18% of full-time jobs cut

 Coinbase is laying off almost a fifth of its workforce amid a collapse in its stock and crypto prices.

The cryptocurrency exchange will cut 18% of full-time jobs, according to an email sent to employees Tuesday morning. Coinbase has roughly 5,000 full-time workers, translating to a head count reduction of around 1,100 people.

Shares of Coinbase were down about .75% at 12:15 ET on Tuesday.

CEO Brian Armstrong pointed to a possible recession, and a need to manage Coinbase’s burn rate and increase efficiency. He also said the company grew “too quickly” during a bull market.

“We appear to be entering a recession after a 10+ year economic boom. A recession could lead to another crypto winter, and could last for an extended period,” Armstrong said in the email, adding that past crypto winters have resulted in a significant decline in trading activity. “While it’s hard to predict the economy or the markets, we always plan for the worst so we can operate the business through any environment.”

Coinbase had initially said it was pausing hiring. Two weeks later, the crypto giant announced that it was extending the freeze for the “foreseeable future.” Earlier this year, Coinbase said it planned to add 2,000 jobs across product, engineering and design.

“Our employee costs are too high to effectively manage this uncertain market,” Armstrong said. “While we tried our best to get this just right, in this case it is now clear to me that we over-hired.”

The news comes during a deep rout for Coinbase shares. The stock went public via a direct listing last April during a boom in crypto markets and investors clamoring for high-growth tech stocks. Coinbase’s shares are down 79% this year and 85% from the all-time high. Meanwhile, bitcoin has dropped to near $22,000 and has lost 53% of its value this year.


Leetcode discuss: 947. Most Stones Removed with Same Row or Column

 June 13 - 14, 2022

I spent a lot of hours to learn how to write union find algorithms in 2019. Here is the link. After a few years, I think that it is better for me to write something on Leetcode, so I can share my experience with more people.


947. Most Stones Removed with Same Row or Column
C# | Quick learner | Union find | DFS | 8 solutions
C# | Quick learner | Union find with rank and size | Ranking No 40
C# | Quick learn | Union find with rank | Rank No 176
C# | Quick learner | Union find API | Rank 8
C# | Quick learner | DFS | Rank 5
C# | Quick learner | DFS | Rank 16
C# | Quick learner | Union find | Rank 12
C# | Quick learner | Union Find | Find Parent API getRoot | Rank 117
C# | Quick learner | Union Find | With Rank | Player No. 13



Union find algorithm: lecture notes

 Here is the link. 

1.5   Case Study: Union-Find


Dynamic connectivity example

Dynamic connectivity.

 The input is a sequence of pairs of integers, where each integer represents an object of some type and we are to interpret the pair p q as meaning p is connected to q. We assume that "is connected to" is an equivalence relation:

  • symmetric: If p is connected to q, then q is connected to p.

  • transitive: If p is connected to q and q is connected to r, then p is connected to r.

  • reflexive: p is connected to p.
An equivalence relation partitions the objects into equivalence classes or connected components.

Our goal is to write a program to filter out extraneous pairs from the sequence: When the program reads a pair p q from the input, it should write the pair to the output only if the pairs it has seen to that point do not imply that p is connected to q. If the previous pairs do imply that p is connected to q, then the program should ignore the pair p q and proceed to read in the next pair.


Union-Find API.

 The following API encapsulates the basic operations that we need.

Union-find API


To test the utility of the API, the main() in UF.java solves the dynamic connectivity problem. We also prepare test data: the file tinyUF.txt contains the 11 connections used in our small example, the file mediumUF.txt contains 900 connections, and the file largeUF.txt is an example with millions of connections.

Implementations.

 We now consider several different implementations, all based on using a site-indexed array id[] to determine whether two sites are in the same component.
  • Quick-find. QuickFindUF.java maintains the invariant that p and q are connected if and only if id[p] is equal to id[q]. In other words, all sites in a component must have the same value in id[].

    Quick find overview

  • Quick-union. QuickUnionUF.java is based on the same data structure—the site-indexed id[] array—but it uses a different interpretation of the values that leads to more complicated structures. Specifically, the id[] entry for each site will be the name of another site in the same component (possibly itself). To implement find() we start at the given site, follow its link to another site, follow that sites link to yet another site, and so forth, following links until reaching a root, a site that has a link to itself. Two sites are in the same component if and only if this process leads them to the same root. To validate this process, we need union() to maintain this invariant, which is easily arranged: we follow links to find the roots associated with each of the given sites, then rename one of the components by linking one of these roots to the other.


    Quick union overview

  • Weighted quick-union. Rather than arbitrarily connecting the second tree to the first for union() in the quick-union algorithm, we keep track of the size of each tree and always connect the smaller tree to the larger. Program WeightedQuickUnionUF.java implements this approach.


    Weighted quick union overview

  • Weighted quick-union with path compression. There are a number of easy ways to improve the weighted quick-union algorithm further. Ideally, we would like every node to link directly to the root of its tree, but we do not want to pay the price of changing a large number of links. We can approach the ideal simply by making all the nodes that we do examine directly link to the root.

Union-find cost model.

 When studying algorithms for union-find, we count the number of array accesses (number of times an array entry is accessed, for read or write).

Definitions.

 The size of a tree is its number of nodes. The depth of a node in a tree is the number of links on the path from it to the root. The height of a tree is the maximum depth among its nodes.

Proposition.

 The quick-find algorithm uses one array access for each call to find() and between n + 3 and 2n + 1 array accesses for each call to union() that combines two components.

Proposition.

 The number of array accesses used by find() in quick-union is 1 plus twice the depth of the node corresponding to the given site. The number of array accesses used by union() and connected() is the cost of the two find() operations (plus 1 for union() if the given sites are in different trees).

Proposition.

 The depth of any node in a forest built by weighted quick-union for n sites is at most lg n.

Corollary.

 For weighted quick-union with n sites, the worst-case order of growth of the cost of find(), connected(), and union() is log n.
performance of union-find algorithms

Q + A

Q. Is there an efficient data structure that supports both insertion and deletion of edges?

A. Yes. However, the best-known fully dynamic data structure for graph connectivity is substantially more complicated than the incremental version we consider. Moreover, it's not as efficient. See Near-optimal fully-dynamic graph connectivity by Mikkel Thorup.

Exercises

  1. Develop classes QuickUnionUF.java and QuickFindUF.java that implement quick-union and quick-find, respectively.

  2. Give a counterexample that shows why this intuitive implementation of union() for quick-find is not correct:
    public void union(int p, int q) {
       if (connected(p, q)) return;
       for (int i = 0; i < id.length; i++)
          if (id[i] == id[p]) id[i] = id[q];
       count--;
    }
    

    Answer. The value of id[p] changes to id[q] in the for loop. Thus, any object r > p with id[r] equal to id[p] will not be updated to equal id[q].

  3. In the weighted quick-union implementation, suppose we set id[root(p)] to q instead of id[root(q)]. Would the resulting algorithm be correct?

    Answer. Yes. However, it would be increase the tree height, so the performance guarantee would be invalid.

Creative Problems

  1. Quick-union with path compression. Modify QuickUnionUF.java to include path compression, by adding a loop to find() that links every sie on the path from p to the root. Give a sequence of input pairs that causes this method to produce a path of length 4. Note: the amortized cost per operation for this algorithm is known to be logarithmic.

    Solution. QuickUnionPathCompressionUF.java.

  2. Weighted quick-union with path compression. Modify WeightedQuickUnionUF.java to implement path compression, as described in Exercise 1.5.12. Give a sequence of input pairs that causes this method to produce a tree of height 4.

    Note: The amortized cost per operation for this algorithm is known to be bounded by a function known as the inverse Ackermann function and is less than 5 for any conceivable value of n that arises in practice.

    Solution. WeightedQuickUnionPathCompressionUF.java.

  3. Weighted quick-union by height. Develop a implementation WeightedQuickUnionByHeightUF.java that uses the same basic strategy as weighted quick-union but keeps track of tree height and always links the shorter tree to the taller one. Prove a logarithmic upper bound on the height of the trees for n sites with your algorithm.

    Solution. A union operation between elements in different trees either leaves the height unchanged (if the two tree have different heights) or increase the height by one (if the two tree are the same height). You can prove by induction that that the size of the tree is at least 2^height. Therefore, the height can increase at most lg n times.

  4. Random connections. Develop a UF client ErdosRenyi.java that takes an integer command-line argument n, generates random pairs of integers between 0 and n, calling connected() to determine if they are connected and then union() if not (as in our development client), looping until all sites are connected, and printing the number of connections generated. Package your program as a static method count() that takes n as argument and returns the number of connections and a main() that takes n from the command line, calls count(), and prints the returned value.

Web Exercises

  1. True or false. In the quick union implementation, suppose we set parent[p] to parent[root(q)] instead of setting parent[root(p)] to parent[root(q)]. Would the resulting algorithm be correct?

    Answer. No.

  2. Which of the following arrays could not possibly occur during the execution of weighted quick union with path compression:
    1. 0 1 2 3 4 5 6 7 8 9
    2. 7 3 8 3 4 5 6 8 8 1
    3. 6 3 8 0 4 5 6 9 8 1
    4. 0 0 0 0 0 0 0 0 0 0
    5. 9 6 2 6 1 4 5 8 8 9
    6. 9 8 7 6 5 4 3 2 1 0

    Solution. B, C, E, and F.

  3. Recursive path compression. Implement path compression using recursion.

    Solution:

    public int find(int p) {
       if (p != parent[p])
           parent[p] = find(parent[p]);
       return parent[p];
    
  4. Path halving. Write a data type QuickUnionPathHalvingUF.java that implements a simpler strategy known as path halving, which makes every other node on the find path link to its grandparent. Remark: the amortized cost per operation for this algorithm is known to be bounded by a function known as the inverse Ackermann function.
  5. Path splitting. Write a data type WeightedQuickUnionPathSplittingUF.java that implement an alternative strategy known as path splitting, which makes every node on the find path link to its grandparent. Remark: the amortized cost per operation for this algorithm is known to be bounded by a function known as the inverse Ackermann function.
  6. Random quick union. Implement the following version of quick union: Assign the integers 0 through n-1 uniformly at random to the n elements. When linking two roots, always link the root with the smaller label into the root with the larger label. Add in path compression. Remark: the expected cost per operation for the version without path compression is logarithmic; the expected amortized cost per operation for the version with path compression is bounded by a function known as the inverse Ackermann function.
  7. 3D site percolation. Repeat for 3D lattice. Threshold around 0.3117.
  8. Bond percolation. Same as site percolation, but choose edges at random instead of sites. True threshold is exactly 0.5.
  9. Given a set of N elements, create a sequence of N union operations so that weighted quick union has height Theta(log N). Repeat for weighted quick union with path compression.
  10. Hex. The game of Hex is played on a trapezoidal grid of hexagons.... Describe how to detect when white or black has won the game. Use the union-find data structure.
  11. Hex. Prove that the game cannot end in a tie. Hint: consider the set of cells reachable from the left side of the board.
  12. Hex. Prove that the first player can guarantee a win with perfect play. Hint: if the second player had a winning strategy, you could choose a random cell initially, and then just copy the second player's winning strategy. This is called strategy stealing.
  13. Labeling clusters on a grid. Physicists refer to it as the Hoshen–Kopelman algorithm although it is simply union–find on a grid graph with raster-scan order. Applications include modeling percolation and electrical conductance. Plot site occupancy probability vs. number of clusters (say 100-by-100, with p between 0 and 1, number of clusters between 0 and 1500) or distribution of clusters. (seems like DFS would suffice here) Matlab has a function bwlabel in the image processing toolbox that performs cluster labeling.

Monday, June 13, 2022

SABRE debt: 2020 | Seekingalpha.com

 Between August 18th and August 24th, the management team at Sabre initiated a series of changes aimed at improving the company’s chances of survival long term. These changes will ultimately come at the expense of shareholders, but with as much debt as the company currently has, it’s unlikely there were other options available to the firm. The first step worth mentioning here is a common stock offering. Management ended up issuing 35.71 million shares of common stock at a price of $7 per unit. This will result in $250 million of gross proceeds, with net proceeds estimated to total $239.38 million. 

In addition to these shares, management has provided underwriters with the option to buy a further 5.36 million units at the same price. This should result in a further $50 million in gross proceeds, bringing total net proceeds from the raise up to $287.50 million. If shares were still up around $20 per unit, this size of a raise would have cost investors just 5.2% of the business. But with shares priced at $7 a piece, the cost nearly triples to 13%. That alone is a costly move for the firm.

If you thought that dilution stopped here, think again. Management has also announced plans to issue Mandatory Convertible Preferred Stock to investors. Initially, the goal was to make this amount $250 million with an underwriter’s option of $50 million for gross proceeds of up to $300 million and net proceeds of up to $287.50 million just like with the common units offering. However, management has since upsized these units. In all, the firm is issuing $300 million worth of preferred units, plus it’s providing an underwriter’s option of $45 million. Net proceeds should end up being around $330.63 million in all.

During the time that these units remain outstanding, investors are to be paid an annual dividend of 6.50%. The plan is to make this a cash payment, but under certain circumstances, management may pay it with additional stock or a mix of cash and stock. On September 1st of 2023, these units will mandatorily convert, with the firm’s common share price leading up to that point dictating the conversion ratio.

The lower bound set is 11.9048 shares for every $100 liquidation preference unit, and the upper bound is 14.2857 shares. Holders of these units may convert prior to this date, but then it would be done at the minimum conversion ratio. These preferred units will cause between 41.07 million and 49.29 million additional common units to be issued if the business sees them converted. This will increase shareholder dilution from the aforementioned 13% to between 22.9% and 24.7%.

Not every move made by management involves dilution though. The company is also issuing $850 million worth of Senior Secured Notes that will come due in 2025. They bear an annual interest rate of 7.375%. The amount issued is a significant increase over the $300 million initially intended. Management intends to use the proceeds from this issuance to redeem its 5.375% Senior Notes due in 2023 in full. This works out to $530 million in principal value of debt.

It’s unsure how the rest will be allocated, but management did say that they intend to allocate it toward other senior indebtedness. One bad thing about this move is that it will cause annual interest expense to rise. Just on the $530 million notes alone, the difference in interest rate will result in additional annual interest expense of $10.6 million moving forward.

SABRE debt: 4 billion

 The company estimates that it will take several years for travel demand to return to its 2019 levels. In its Q1 2020 earnings call and thereafter, SABR announced that it had initiated cost-cutting measures that would save at least $325 million in costs in 2020. It has frozen the hiring process, furloughed more than one-third of its global workforce, eliminated pay hikes, suspended dividends and share purchases, and reduced consulting spends.   

SABR also drew down $375 million on its revolver facility and issued senior secured notes worth $1.1 billion due 2025. The pricing of these notes is a concern because a good part of these notes ($775 million) was priced at 9.25%, a very high rate. The company also expected that its leverage ratio covenant would be suspended in 2020 because COVID-19 was an extraordinary event.

SABR estimates a monthly cash burn of $80 million in a zero-bookings situation and has shored up liquidity of $1.5 billion, including the notes issue, to gear up for the fall in bookings. For April and May 2020, the company’s travel bookings were down 90% year on year and gross hotel reservations were down 60% for the same period.

For cross-reference’s sake, on July 6, 2020, United Airlines (UAL) disclosed to the SEC that the number of domestic passengers had dropped 69% year on year, while international passenger numbers dropped 87% in the same period.

As of Q1 2020 on a TTM basis, SABR had approximately $3.18 billion worth of goodwill and intangible assets in its balance sheet. The value of its net property and equipment was just $683 million. As of the same date, the company had $3.625 billion in long-term debt, which did not include the new long-term debt of $1.1 billion.

The company has not impaired its goodwill so far even though it was and is operating in an extremely competitive environment. On May 8, 2020, it disclosed in its quarterly results’ SEC filing that as per “its own assumption” goodwill was not impaired. It also added that its Airline Solutions goodwill of $372 million could be subject to impairment going forward.

The company is operating in a competitive environment at a time when the demand has fallen off a cliff. I’m not a goodwill valuation expert but reckon that SABR should be more aggressive in impairing this intangible asset.