(57)【要約】  本開示は、各プロセッサが個別の再計算エンジンを有し、複数のプロセッサを利用するスプレッドシートアプリケーションのチェーン計算を処理する、方法およびシステムに関する。単一計算チェーンは、支援式および依存式が、子チェーンのツリー階層の中に組織された統一チェーンの中に並び替えることができる。統一チェーンは、各依存レベルのエントリが、並び替えの間に次の依存レベルに移動できる、依存レベルにさらに分けられる。依存レベル内のエントリが、それ自身の子チェーン内に存在しない別のエントリに依存している場合、統一チェーンは、エントリが前の依存レベルのエントリのみに依存するように順序付けされる。さらに、依存レベルは、複数のスレッド処理機能を保持している間、制御スレッドが制御スレッド専用動作を実行できるようにする。
2009536766.tif 000002
【特許請求の範囲】
【請求項１】
スプレッドシートプログラム（１５２０、５００）の式を処理する方法であって、
前記式を、単一計算チェーン（５００、６２６）の中に順序付けること、
前記単一計算チェーン（５００、６２８）の第１式の評価を試みること、
前記第１式が、前記単一計算チェーンの支援式に依存している場合、前記第１式を前記支援式の子の位置（６０４、６３０、６３４）に移動させること、および、
各依存式が、そのそれぞれの支援式の子、および式の結果である１または２以上の子チェーンを有する統一チェーン（６０２、６０４、６４４）の作成が完了するまで、前記単一計算チェーンの全ての式に順序付けを続行すること
を備えたことを特徴とする方法。
【請求項２】
前記方法は、前記統一チェーン（６０２、６０４）を、複数の依存レベル（６１８、６２０）に分けることであって、各依存レベルが、前の依存レベル（６１８）からの式、またはそれら自身の子チェーン（６０８、６１０、６４０、６４２）内の式のみに依存する式（６０８、６１０、６１２、６４２、６４０）を含むことをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項３】
依存式（６１２）は、それが第１支援式（６１０）の子であり、および未計算の第２支援式（６０８、６３６、６４２）に依存している場合、次の依存レベルに移動されることを特徴とする請求項２に記載の方法。
【請求項４】
支援式は、第１依存式ならびに第２依存式を有し、および前記第１ならびに前記第２依存式は、次の依存レベル（６３８、６４０）に移動されることを特徴とする請求項２に記載の方法。
【請求項５】
コンピュータシステム（１５００）によって読み取り可能である、および前記コンピュータシステムによって実行可能なプログラム命令を明白に具体化して、請求項１の方法を実行することを特徴とするコンピュータプログラム製品（１５０８、１５２０）。
【請求項６】
スプレッドシートプログラム（２００、１０００）の式を計算するために、複数のプロセッサを使用する方法であって、
プロセッサ（２０６）の数を判定すること、
再計算エンジンを、各プロセッサ（２０９）に割り当てること、
前記再計算エンジンの処理（１００４）を同期化する制御スレッドを保持すること、
前記式を、単一計算チェーン（７００、６２６）の中に順序付けること、
前記第１再計算エンジン（７０８、６２８、１１２０）により、前記単一計算チェーンの第１式の評価を試みること、
前記第１式が第１支援式に依存している場合、前記第１依存式および前記第１支援式を、前記第１再計算エンジン（７０６、６３６、１１２２）の待ち行列に移動させること、
第２再計算エンジン（７０８、１１２４、１１３８）により、前記単一計算チェーンの第２式の評価を試みること、
前記第２式が第２支援式に依存している場合、前記第２依存式および前記第２支援式を、前記第２再計算エンジン（７１０、１１３８、１１４０）の待ち行列に移動させること、および、
前記チェーン（７０８、７０６、７１０、１１４２、６４４）の最後に到達するまで、前記単一計算チェーンの反復を続行すること
を備えたことを特徴とする計算式。
【請求項７】
前記方法は、並び替えのための各再計算エンジンの待ち行列（１１２２、１１４０）を空にすることであって、前記第１依存式によって、前記第１支援式の子が作成され、および前記第２依存式によって、前記第２支援式の子（８０２、８０４、６３０、６３４）が作成されることをさらに備えたことを特徴とする請求項６に記載の方法。
【請求項８】
前記第２支援式自体が、第３支援式の子（８０４）であることを特徴とする請求項７に記載の方法。
【請求項９】
前記方法は、
前記第１式が、第１支援式に依存している場合、前記第１依存式に表示を付けてその情報を得る（１４２０）こと、
前記第１支援式が、前記第１依存式（１４１４、１４１８）に依存しているかどうかを判定すること、
前記第１支援式が、前記第１依存式に依存している場合、前記第１支援式に表示を付けてその情報を得ること（１４２０）、
前記単一計算チェーンによる反復が終了すると、トラッキングされた式（１４２２、１４２４）を検索すること、
トラッキングされた任意の式が、ダーティー（１４２６）であるかどうかを判定すること、
トラッキングされた任意の式が、ダーティーである場合、前記トラッキングされた式ならびにその１または複数の子を、任意の子チェーンもしくは依存レベル（１４２８）を持たないフラット計算チェーンに移動させること、および、
単一スレッド（１４３２）を使用して、前記フラット計算チェーンを計算すること
をさらに備えたことを特徴とする請求項６に記載の方法。
【請求項１０】
前記方法は、
前記第１依存式が、未計算の第２支援式（８０２、８０４、６１２、６３６）に依存しているかどうかを判定すること、および、
前記第１依存式が、前記第１支援式に依存している、および前記未計算の第２支援式に依存している場合、前記第１依存式を、個別の依存レベル（６１０、６１２、６１８、６２０、６３６、６４２）に移動すること
をさらに備えたことを特徴とする請求項６に記載の方法。
【請求項１１】
前記方法は、
前記第１支援式が、第１依存式と第２依存式（１１３２、６３８）の両方を有するかどうかを判定すること、および、
前記第１支援式が、第１依存式と第２依存式の両方を有する場合、前記第１および第２依存式を、個別の依存レベル（６１２、６２０、６３８、６４０）に移動すること
をさらに備えたことを特徴とする請求項６に記載の方法。
【請求項１２】
前記方法は、
制御スレッド（１２０６）のみによって実行される任意の式が、計算チェーンにあるかどうかを判定すること、および、
制御スレッド専用式を、個別の依存レベル（１２１２）に移動すること
をさらに備えたことを特徴とする請求項６に記載の方法。
【請求項１３】
制御スレッド専用式は、進行中の依存レベル（１１３０）の後に、ただちに依存レベルに移動されることを特徴とする請求項６に記載の方法。
【請求項１４】
第１再計算エンジンのスレッド動作は、前記スレッドが、依存レベル（１１３２、１１
３４）の最後に到達すると、一時停止されることを特徴とする請求項６に記載の方法。
【請求項１５】
前記第１再計算エンジンのスレッド動作は、前記第１再計算エンジンの待ち行列が、満杯になると、一時停止されること（１１３２、１１３４）を特徴とする請求項６に記載の方法。
【請求項１６】
制御スレッド専用式は、そのような式（１１３２、１１３０）の待ち行列に配置されることを特徴とする請求項６に記載の方法。
【請求項１７】
コンピュータシステムによって読み取り可能である、および前記コンピュータシステム（１５００）によって実行可能なプログラム命令を明白に具体化して、請求項６の方法を実行することを特徴とするコンピュータプログラム製品（１５０８、１５２０）。
【請求項１８】
依存レベルの使用によって、スプレッドシートアプリケーションの計算チェーンを並べ替える方法であって、
第１子チェーンおよび第２子チェーン（６１８、６０８、６１０、６４２、６４０）を含む第１依存レベルを作り出すこと、
前記第１子チェーン（６０８、６２８）の各式の評価を試みること、
前記第２子チェーン（６０８、６２８）の各式の評価を試みること、
式が評価できない場合、前記式は、それ自身の子チェーンの第１支援式に依存している、および同じ依存レベル（６１２、６２０、６３０、６３６）内の別の子チェーンの第２支援式に依存しているかどうかを判定すること、
前記第２支援式が未計算（６１２、６２０、６３６）であるかどうかを判定すること、
前記第２支援式が、未計算である場合、前記依存式を、次の依存レベル（６１２、６４２）に移動すること、および、
前記第２支援式が、計算されている場合、進行中の依存レベル（６０４、６３２）の依存式を評価すること
を備えたことを特徴とする方法。
【請求項１９】
前記方法は、
第１依存式が依存する、前記第１支援式が、子（６３０、６３８）としての第２依存式を既に有するかどうかを判定すること、および、
前記第１支援式が、既に子を有する場合、前記第１および第２依存式を、次の依存レベル（６３８、６４０）に移動させること
をさらに備えたことを特徴とする請求項１８に記載の方法。
【請求項２０】
前記方法は、
制御スレッド専用式（１２０６）があるかどうかを判定すること、および、
制御スレッド専用式がある場合、これらの項目を、次の依存レベル（１２０６、１２１２）に移動させること
をさらに備えたことを特徴とする請求項１８に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、依存レベルを用いたマルチスレッドスプレッドシートの処理に関する。
【背景技術】
【０００２】
データ分析のために、スプレッドシートアプリケーションを使用することが、普及している。さらに、企業が、このような複雑なデータ計算のためのアプリケーションにますます依存するので、このようなアプリケーションの処理を、より速く、より効率的に行う必要性が、望まれている。本件特許出願人製のExel（登録商標）は、このようなスプレッドシートアプリケーションの一例である。「依存」式と言われる、１セルの中の式が、「支援」式と言われる、別のセルの中の内容または式に依存することは、スプレッドシートアプリケーションでは典型的である。セルの内容が変更されると、「リカルク」(recalculation)動作をトリガーすることができ、これらの変更に基づいて、プログラムスレッドを使用して式による反復を行い、再計算を必要とする任意の式をリカルクする。計算動作の処理時間は、リカルクプログラムスレッドが、まだ計算されていない支援式に依存している式に行き当たると、すべて中断されないにせよ、かなりの時間、速度が低下する場合がある。複数のプロセッサ、または複数のプログラムスレッドが、そのようなアプリケーションに用いられたとしても、計算およびリカルクの速度性能は、支援式が計算されるのを待っている間、少なくともプロセッサの１つが、計算またはリカルクを完了することができないところでは、改善できない。スプレッドシートアプリケーションの依存式の数が増えるにつれて、問題は悪化する。
【０００３】
背景技術で、具体的な問題を扱ったが、本開示は、そのような具体的な問題を解決するために限定される、いかなる方法のためのものではない。
【発明の概要】
【０００４】
本発明の実施形態は、一般的には、２以上のプロセッサまたは処理エンジンが、利用できる場合、複数のプロセッサ、または複数の並行スレッドを用いた、スプレッドシート計算および再計算の処理に関する。さらに実施形態は、エントリのチェーンを並び替えて、リカルク動作のマルチスレッド処理を実行する際の、ツリー構造および依存レベルの使用に関する。またさらに、一部の実施形態は、リカルク動作のマルチスレッド処理を同期化することに関する。
【０００５】
本明細書に説明されるように、特定の実施形態の態様は、子チェーン（例えば、ツリー階層に組織された、依存式ならびに支援式）および、依存式も支援式も含まないＥＮＴから成る統一リカルクチェーンを作り出すために、エントリまたは「ＥＮＴ」の計算チェーンを並べ替えることに関する。「ＥＮＴ」は、スプレッドシートのセル内に含まれた式を参照する。別の実施形態では、統一チェーンは、個別の依存レベルに分けられ、各依存レベルは、その依存レベル内の子チェーンの支援式に依存しているものとは別に、前の依存レベルのＥＮＴのみに依存する、ＥＮＴを含む。このような実施形態の配置によって、複数のスレッドは、未計算の支援ＥＮＴが計算されるのを待つ必要もなく、依存レベル全体で、ＥＮＴの処理を続行することができる。次の依存レベルに到達するとすぐに、その中に配置されたＥＮＴおよび子チェーン（必要であれば）の処理は、すでにその前の依存レベルにおいて完了した計算に基づいて、効率的に実行される。
【０００６】
さらに実施形態は、システムが、２以上のプロセッサまたは処理エンジンから成る、複数の非同期プログラムスレッドを使用して、このような統一リカルクチェーンの式を評価することに関する。実施形態において、制御スレッドを使用して、このようなマルチスレッド処理の同期化を制御できる。
【０００７】
本発明の概要は、簡略化形式で、概念の一つの選択を紹介するために提供され、以下の詳細な説明において、さらに説明される。本発明の概要は、請求された発明の対象の主要なまたは本質的な機能を、明らかにするためのものでも、請求された発明の対象の範囲を限定する、いかなる方法に使用されるためのものでもない。
【図面の簡単な説明】
【０００８】
【図１】本発明の実施形態に係る、スプレッドシートアプリケーションで使用される「リカルクエンジン」(recalculation engine)の数「Ｎ」を含む、例示的な機能的コンポーネントモジュールの論理的説明を示す図である。
【図２】本発明の実施形態に係る、スプレッドシートアプリケーションのローディング、およびそれとともに使用するプロセッサの数の判定を行う、図１に示されたシステムによって実行される基本動作を表す図である。
【図３】本発明の実施形態に係る、図１に表されたリカルクエンジンを用いて、リカルク動作を実行するために、図１に示されたシステムによって実行される基本動作を示す図である。
【図４】本発明の実施形態に係る、図１に示された機能的コンポーネントモジュールを使用して、スプレッドシートアプリケーションの値および／または複数の式を有するセルエントリを示す、例示的な３×３スプレッドシートを表す図である。
【図５】本発明の実施形態に係る、最初に、単一計算チェーンの中にロードされるものとして、図４に示したスプレッドシートのセルを示す図である。
【図６Ａ】子チェーンの統一リカルクチェーンの中に、並び替えられたものとして、図４および５に示したセルを表す図である。
【図６Ｂ】本発明の実施形態に係る、２つの再計算エンジンにロードされ、依存レベルに分けられて、セルの１つが、第２依存レベルへの移動を完了した、図６Ａの子チェーンを示す図である。
【図６Ｃ】図６Ａならびに６Ｂの例示的な実施形態に表され、本発明の他の実施形態に係る、子チェーンならびに依存レベルの中でセルを並び替えるプロセスの動作特性を示すフロー図である。
【図７】本発明の実施形態に係る、２つに分かれたリカルクエンジン、および各々のリカルクエンジンに対して並び替えられたセルの待ち行列によって、図４に示したセルの処理を示す図である。
【図８】本発明の実施形態に係る、図７の待ち行列に入れられたセルの最適でない並び替えの説明を表す図である。
【図９】本発明の実施形態に係る、図７に示したリカルクエンジンのスレッドを、同期化するプログラムコードを示す図である。
【図１０Ａ】本発明の実施形態に係る、図２に示したセルの値および式の評価を開始するプロセスの動作特性を示すフロー図である。
【図１０Ｂ】本発明の実施形態に係る、図７に示したリカルクエンジンの制御スレッドおよび／または非同期スレッドを、一時停止するまたはトリガーするプロセスの動作特性を示すフロー図である。
【図１１】本発明の実施形態に係る、図７に示したリカルクエンジンの制御スレッドおよび非同期スレッドを用いて、セルを並び替えるプロセスの動作特性を示すフロー図である。
【図１２】本発明の実施形態に係る、制御スレッドが、図７に示した待ち行列のセルの並び替え、制御スレッド専用式への働きかけ、およびセルの再表示を可能にするプロセスの動作特性を示すフロー図である。
【図１３】本発明の実施形態に係る、次の依存レベルに対する、制御スレッド式の並び替えの論理的説明を示す図である。
【図１４】本発明の実施形態に係る、マルチスレッド処理を用いて、循環式の処理を示す図である。
【図１４Ａ】本発明の実施形態に係る、マルチスレッド処理を用いて、循環式の処理を示す図である。
【図１４Ｂ】図１４Ａの例示的な実施形態に表され、本発明の他の実施形態に係る、見込まれる循環参照検出および評価のカルクチェーンを、並び替えるプロセスの動作特性を示すフロー図である。
【図１５】本開示の実施形態を実装できる、例示的な計算システムを表す図である。
【発明を実施するための形態】
【０００９】
本開示は、具体的な実施形態を示した添付図を、参照して、例示的な実施形態を、より完全に説明する。しかし、他の態様も、多くの異なる形式で実施でき、本開示の具体的な実施形態の内容は、本明細書に説明する実施形態に対し、そのような態様を限定するものとして解釈すべきではない。むしろ、図に表された実施形態は、当業者にとって、徹底された、完全な、対象とする範囲を十分に伝える開示を、提供するために含まれている。全体に示した構造および要素などの図に言及する場合は、参照数字などを用いて示される。点線を使用して、選択的コンポーネントまたは動作を示すことができる。点線を使用して、論理的説明またはある配置から別の配置までのセルの動きを示すこともできる。
【００１０】
プロセッサの数「Ｎ」および対応するプログラムスレッドを用いて、スプレッドシート再計算を処理する環境１００を、図１に示す。一実施形態において、システム１００は、各プロセッサが、その上で動作する「リカルクエンジン」(recalculation engine)１０４を有し、オペレーティングシステムに利用できるプロセッサの数「Ｎ」を含む処理モジュール１０２を備える。システム１００は、データベース１１６と、ロード制御モジュール１１２と通信を行うだけでなく、データベース１０６からのデータを送受信する働きもするＩ／Ｏもしくは送受信モジュール１１４とをさらに含む。言い換えると、ロード制御モジュールは、「ダーティー（dirty）」セルの範囲およびドメイン、または別のセルに変更された内容に依存するもしくは支援する理由から、リカルクを要求するセルを判定する境界検出モジュール１１０と通信を行う。一実施形態において、ダーティーセルは、再計算コマンドが、送受信モジュール１１４から受信されるイベントにおいて再計算される。
【００１１】
システム１００のマルチプロセッサ環境を使用する、スプレッドシートアプリケーションにおいて、オペレーティングシステムに利用できるプロセッサの数を、判定することが必要である。図２に、図１に示した、スプレッドシートアプリケーションのロードディングまたは呼び出し、およびそれとともに使用するプロセッサの数を判定するシステムによって実行される動作２００の基本初期化順序を表す。開始動作２０２は、スプレッドシートアプリケーションが、ロードアプリケーション動作２０４においてロードされ、ロード制御モジュール１１２との通信の後に、開始される。複数のプロセッサ、およびこのような複数のプログラムスレッドを使用して、スプレッドシートチェーン計算のエントリもしくは「ＥＮＴ」を評価する実施形態において、複数のプロセッサによって、それらのＥＮＴの評価を同期化することが必要である。従って、判定動作２０６は、オペレーティングシステムにおいて、プロセッサの数、および上記のリカルクエンジン１０４を、判定する。格納動作２０８は、判定されたプロセッサの数およびそれらのアクセス場所を、データベース１１６に格納する。一実施形態において、使用されるプロセッサは、個別のプロセッサであるが、他の実施形態において、それらは、１または２以上が単一チップ上に組み込まれた、共同プロセッサである。言い換えれば、リカルクエンジンは、割り当て動作２０９において、各プロセッサに割り当てられ、次にプロセス２００の制御は、復帰動作２１０に移行する。
【００１２】
図３を参照すると、リカルクプロセス３００は、手動もしくは自動計算または再計算要求に応答して開始され、図１に示した、システム１００上で実行する、スプレッドシート内のチェーン計算を処理する、開始動作３０２から始まる。開始動作３０２から、再計算要求は、送受信モジュール１１４によって受信され、データは、それらの要求によって要求されるときに、データベース１１６から検索される。一実施形態において、開始動作３０２は、ユーザによる手動要求によって、トリガーされ、表示されているスプレッドシートを、再計算する。他の実施形態において、開始動作３０２は、呼び出しルーチンからの要求によって、またはユーザが、ＥＮＴの値もしくは式を変更するか、付加的ＥＮＴを、スプレッドシートに付加した場合、自動的にトリガーされる。具体的なトリガリング構造に関係なく、再計算要求は、動作３０４において、識別または「解決」される。解決動作３０４の後、リカルク要求のドメインおよび範囲は、動作３０６において判定される。一実施形態において、このことは、１ＥＮＴのみを伴う。別の実施形態において、そのことは、例えば、「ダーティー」ＥＮＴなどの変更されたセル内容に依存するまたは支援する、ＥＮＴの配列を伴う。判定動作３０６から、プロセス３００は、本発明の実施形態に従って、ダーティーセルを再計算する、リカルク動作３０８へ進む。再計算が、完了すると、制御は、呼び出しコードまたはユーザインタフェースに復帰させる復帰動作３１０に移る。
【００１３】
図４は、図３について上述したプロセスを利用して、再計算ができるスプレッドシート４００の見本を表す。このような、３×３スプレッドシートの例示的な説明において、行４０２のセルＡ１とＢ１は、例示的な値「＝１」を用いて示す。行４０４のセルＡ２とＢ２は、式＝Ａ１と＝Ｂ１を用いて示し、それぞれが、Ａ１とＢ１に依存している式を表す。同様に、行４０６のセルＡ３とＢ３は、式＝Ａ２と＝Ｂ２を用いて示し、それぞれが、Ａ２とＢ２に依存している式を表す。最後に、セルＣ３は、式＝Ａ３＋Ｂ３を用いて示し、そのことは、Ａ３とＢ３に依存しているという意味である。上記のように、セルＡ１からＣ３までの内容は、計算もしくは再計算されなければならない値または式を含むことができ、このような各セルの内容は、エントリまたは「ＥＮＴ」と呼ばれる。例えば、式「＝Ａ３＋Ｂ３」は、セルＣ３に配置されたＥＮＴである。
【００１４】
図１に示したシステム１００を用いたスプレッドシート４００を、ロードディングまたは呼び出しすると、プロセッサは、ＥＮＴを、スプレッドシート自体へのエントリに基づいて連続した順に、単一計算チェーンの中に順序付けることから開始する。図５に、図４に示したスプレッドシート４００のセルＡ１からＣ３までの順序付けをする、このような単一計算チェーンを示す。ほんの一例として、セルＡ１からＣ３までのＥＮＴは、Ａ１、Ａ２、Ａ３、Ｂ１、Ｂ２、Ｂ３、最後にＣ３の順に、スプレッドシート４００内に入力が完了したとする。このように最初に単一チェーンの中でＥＮＴを順序付けることにおいて、プログラムコードは、カルクチェーンの最も右端に、第１ＥＮＴ(例えば、本明細書に言及した例示的な実施形態において、Ａ１)を配置する。次のＥＮＴは、右から左へ働き、Ｃ３で終了する、連続した順に付加される。
【００１５】
単一計算チェーン５００のＥＮＴを評価する手順において、カルクコードは、Ｃ３から開始し、式Ａ３＋Ｂ３は、セルＡ３およびＢ３の式に依存することを判定する。次に、最初にセルＡ３を検査すると（それは、その式の最初に名付けられたセルのため）、セルＡ３は、「ダーティー」または保留の計算であることが判定される。この実施形態において、ＥＮＴ「Ａ３＋Ｂ３」は、「依存した」式と呼ばれ、セルＡ３の式は、「支援する」式と呼ばれる。本発明の実施形態において、単一計算チェーン５００は、統一チェーン内の子チェーンを利用して、ツリー構造に組織された依存式および支援式の統一チェーンを作り出すために、並び替えられる。一実施形態において、依存式、例えば、Ｃ３は、第１支援式、例えば、Ａ３の子であると判定される。さらに、第１支援式は、第２支援式に依存すると、第２支援式の子を作ることができる。
【００１６】
Ｃ３を移動してＡ３の子になるとすぐに、単一チェーンの次のセル、すなわち図５に示した例示的な実施形態のＢ３が、評価される。Ｂ３の評価を試みると、カルクコードは、Ｂ３が、セルＢ２に依存していること、およびＢ２が、「ダーティー」であることを発見する。このようなＢ３は、Ｂ２の子になる。同様の形式において、コードは、次のセル、例えばＢ２の計算を試み、Ｂ２は、Ｂ１に依存することを判定する。このようなＢ２は、Ｂ１の子になり、Ｂ３はＢ２の子であるため、Ｂ１、Ｂ２、およびＢ３からなるすべての子チェーン（図６Ａのチェーン６００の、子チェーン６０２として示す）が作られる。次にカルクコードは、Ａ３の評価を試み、Ａ３（上記の子Ｃ３を有する）は、Ａ２自体がＡ１に依存している支援式Ａ２に依存していることを判定する。このようにして、子チェーンＡ１、Ａ２、Ａ３、およびＣ３が作られる。このような子チェーンの例示的な説明では、図６Ａの子チェーン６０４として示す。
【００１７】
チェーン６０４に、子チェーンＡ１、Ａ２、Ａ３、およびＣ３を示す一方、図６Ｂに表された本発明の別の例示的な実施形態では、本発明の別の実施形態に従って、Ｃ３がそこから削除された同じ子チェーン６１０を示す。ここで、Ｃ３は、個別の「依存レベル」６２０に配置された自身のチェーン６１２に含まれている。実際に、図６Ｂに、２つの分離した依存レベル、すなわち依存レベル＃１（６１８）および依存レベル＃２（６２０）を示す。各依存レベルは、その依存レベル内の子チェーンの支援式に依存しているものとは別に、前の依存レベルのＥＮＴのみに依存しているＥＮＴを含む。このような実施形態の配置によって、１または２以上のプロセッサは、未計算の支援ＥＮＴが、計算されるのを待つ必要なしに、連続的な形式で、依存レベル全体のＥＮＴを処理できる。
【００１８】
個別の依存レベルの利点は、Ｃ３は、Ａ３の子であり、同様に、Ａ２およびＡ１の子である、計算チェーン６００の例示的な実施形態に明らかにできる。図４００に示したように、Ｃ３は、Ａ３とＢ３の式の和に依存している。このようにＣ３は、Ａ３とＢ３の両方に依存している。カルクコードが子チェーン６０４のＣ３の評価を試みる前に、Ｂ３が計算された場合、カルクコードがＣ３に到達するときの遅延は、なくなるだろう（例えば、Ａ３とＢ３の両方は、既に計算が完了しているので、カルクコードは、ただちにＣ３を計算することができる）。従って、このような実施形態のＣ３は、子チェーン６０４の一部としてとどまることができる。しかし、Ｃ３がカルクコードによって評価される前に、Ｂ３が計算されていないところでは、カルクコードは、Ｃ３を計算することができないだろう。結果として、Ｃ３は、Ｂ３が未計算のままである限り、未計算のままである。従って、子チェーン６０４の処理は、Ｃ３の、Ｂ３への依存性に基づいて中断される、または失速するだろう。このような依存性は、リカルク処理において、非効率性を生む可能性がある。このような実施形態では、図６Ｂの統一カルクチェーンに示したように、Ｃ３（６１２）を与えて、依存レベル＃１（６１８）から依存レベル＃２（６２０）へ移動させる。
【００１９】
複数のプロセッサが利用できる実施形態において、Ｃ３を、新しい依存レベルに移動させることによって、第１プロセッサが、子チェーン６０８の処理を続行している間、子チェーン６１０に働きかけている第２プロセッサは、そのチェーンの処理を完了し、別のＥＮＴまたは依存レベル＃１内の子チェーンの処理に移ることができる。各プロセッサは、それらの上で動作するリカルクエンジンを含むので、このような複数のプロセッサは、図６Ｂのリカルクエンジン＃１および＃２（それぞれ、６１４と６１６）として示す。本発明の実施形態に従って、２つのリカルクエンジンを、図６Ｂに示す一方、図１の楕円１０４に見られるように、プロセッサの任意の数「Ｎ」を、計算およびリカルク動作をするために用いることができる。
【００２０】
本発明の実施形態に従って、図６Ｃに、ＥＮＴの並び替えおよびそれらの移動を実行するプロセス６２２を示し、必要に応じて次の依存レベルまでを示す。開始動作６２４は、スプレッドシートプログラム４００へのセルのローディング、および再計算のための呼び出しに応答して開始される。開始動作６２４から、上記のように、プロセス６２２は、ＥＮＴが、スプレッドシートプログラム４００へのそれらのエントリ順序に基づいて、単一計算チェーンの中に順序付けられる、順序動作６２６へ進む。次に、評価動作６２８は、単一計算チェーンの第１式の評価を試みる。第１式の評価を試みた後、プロセス６２２は、第１式が、支援式に依存しているかどうかを判定するクエリ動作６３０へ進む。第１式が、支援式に依存している場合、フローはＹＥＳへ分岐し、第１依存式を支援式の子の位置に移動させる、移動動作６３４へ進む。第１式が、支援式に依存していない場合、フローはＮＯへ分岐し、評価動作６３２へ進み、第１式が評価される。
【００２１】
移動動作６３４から、プロセス６２２は、第１式が第２の未計算式にも依存しているかどうかを判定する、クエリ動作６３６へ進む。クエリ動作６３６が、第１式が第２の未計算式に依存していると判定した場合、フローはＹＥＳへ分岐し、第１依存式を次の依存レベルに移動させる、移動動作６４２へ進む。次に、クエリ動作６４４は、計算チェーンに、評価する式が他にあるかどうかを判定し、そうである場合、ＹＥＳへ分岐し、評価動作６２８へ進む。クエリ動作６４４が、評価する式が他にないと判定した場合、フローはＮＯへ分岐し、プロセス６２２を終了させる、終了動作６４６へ進む。クエリ動作６３６が、第１依存式が第２の未計算支援式に依存していないと判定した場合、フローはＮＯへ分岐し、第１支援式は、第２依存式も有するかどうかを判定する、クエリ動作６３８へ進む。クエリ動作が、第１支援式が第２依存式を有していないと判断した場合、フローはＮＯへ分岐し、評価動作６３２へ進む。一方、クエリ動作６３８が、第１支援式が第２依存式も有すると判定した場合、フローはＹＥＳへ分岐し、第１および第２依存式が、次の依存レベルに移動される、移動動作６４０へ進む。移動動作６４０から、プロセス６２２は、クエリ動作６４４へ進み、他の式が、評価を必要とするかどうかを判定し、そのプロセスは、上記のように進む。
【００２２】
図６Ａ、６Ｂ、および６Ｃに説明したＥＮＴの並び替えは、一般的には、プロセッサの数を問わない（例えば、１または２以上のプロセッサを使用する）並び替えに関連しているが、図７に、複数のリカルクエンジンおよび非同期スレッドの使用によるスプレッドシート４００からの単一計算チェーンの並び替え７００を具体的に示す。制御スレッド７０２を用いて、さまざまなスレッドおよびリカルクエンジンを同期させる。システム７００の例示的な実施形態において、２つのリカルクエンジン７０４および７０２が用いられるが、他の実施形態では、任意の数のリカルクエンジンおよび対応するマルチスレッド処理動作を伴うことができる。
【００２３】
図７に表した例示的な実施形態に従って、リカルクエンジン１（７０４）からの処理スレッドは、単一計算チェーン７０８のＣ３の評価を試みる。Ｃ３は、まだ計算されていないＡ３およびＢ３に依存しているため、Ｃ３は、まだ計算することができない。結果として、リカルクエンジン１は、Ｃ３を、依存式および支援式の待ち行列７０６に移動させる。Ｃ３は、依存式としてリスト化され、Ａ３は、Ｃ３の支援式としてリスト化される。次に、リカルクエンジン２（７１２）のプログラムスレッドは、Ｂ３の評価を試みる。この依存式を評価できなければ、リカルクエンジン２は、依存Ｂ３およびその支援式Ｂ２を、それ自身の依存式および支援式である待ち行列７１０に移動させる。このようなプロセスは、リカルクエンジンが、単一計算チェーン７０８の各ＥＮＴの評価の試みを完了するまで続行する。
【００２４】
チェーン７０８の各ＥＮＴの評価が完了する、または評価の試みが完了するとすぐに、待ち行列７０６および７１０は、それらの依存支援関係に基づいて、制御スレッド７０２によって、子チェーンの中に並び替えられる。上記の子チェーン６０４と同様、図８に、ＥＮＴ  Ａ１、Ａ２、Ａ３、およびＣ３を有する子チェーン８０４を示す。子チェーン８０２は、ＥＮＴ  Ｂ１，Ｂ２、およびＢ３を示す。これら両方の子チェーンは、最初に、図８の依存レベル＃１（８０６）に配置されているものとして示す。一実施形態において、リカルクエンジン１（７０４）は、Ｂ１，Ｂ２、およびＢ３から成る子チェーン８０２を処理する。次に、リカルクエンジン１は、子チェーン８０２の処理を開始する間に、リカルクエンジン２は、子チェーン８０４の処理を開始する。この例示的な実施形態において、リカルクエンジン１は、リカルクエンジン２が、子チェーン８０４のＣ３に到達する前に、子チェーン８０２のＢ３の処理を終了させることが考えられる。このような場合において、支援式Ａ３とＢ３の両方は、すでに計算が完了しているため、Ｃ３を計算できる。この実施形態において、図８に、Ｃ３は、依存レベル＃１（８０６）に配置されているものとして示し、依存レベル＃２（８０８）は、空として示す。しかし別の実施形態において、リカルクエンジン１は、リカルクエンジン２が、Ｃ３の評価を試みる前に、Ｂ３を評価できないことがあり得る（幾多の理由による）。このような場合において、Ｃ３は、リカルクエンジン１が、Ｂ３の処理を終了させるのを待っている間、未計算のままであり、リカルクエンジン２は、失速したままであるだろう。このような失速によって、リカルクエンジン２は、第１依存レベル内に存在し得る、他のＥＮＴおよび子チェーンの処理ができなくなる（しかし、このような付加的チェーンは、図８の例示的な実施形態に示していない）。失速したリカルクエンジンは、マルチプロセッサシステムのマルチスレッドの処理能力の利用が、非効率的である（例えば、リカルクエンジン２に対して要求されたリカルク動作が、単一リカルクエンジン１の処理速度に依存している場合）。従って、図８に示した実施形態では、セルの並び替えが最適ではない。反対に、最適な並び替えは、図６Ｂに示した例示的な実施形態および上記の参照によって示されるだろう。
【００２５】
図８に、Ｃ３が依存レベル＃１（８０６）にとどまっている、ＥＮＴの最適でない並べ替え８００を示すが、他の実施形態（Ｂ３がＣ３の評価時には、未計算のままであるところ）では、Ｃ３に、依存レベル＃２（８０８）に移動するように要求するだろう。一実施形態において、次の依存レベルへのＥＮＴの移動を統制する公式を示す。
（１）依存式を、支援式の子にするように試みる。
（２）依存式が、すでに別の式の子である場合、その依存式は、次のレベル依存レベルの待ち行列に入れられる、または
依存式が依存する支援式が、すでに子を有する場合、その依存式は、次の依存レベルの待ち行列に入れられる。
（３）式が、制御スレッド上で評価されなければならない関数を含む場合、その式（「制御スレッド式」と呼ばれる）は、次の依存レベルに移動される。ほんの一例として、以下の関数は、制御スレッド上で評価されなければいけない。  
（ａ）INDIRECT関数
（ｂ）GETPIVOTDATA関数
（ｃ）INFO関数
（ｄ）ADDRESS関数
（ｅ）ＵＤＦ(User-Defined Function)
【００２６】
図９を参照して、本発明の実施形態に従って、図７に示したリカルクエンジン１および２の非同期スレッドを、トリガリングするおよび一時停止するプログラムコード９００の例示的な実施形態を示す。制御スレッド９０２は、非同期スレッドのトリガリングを制御する。最初に、カウンタ９０６が、判定動作２０６によって判定されたプロセッサの数に設定される。カウンタ９０６は、どの種類のカウンタでもよい。例示的な実施形態において、カウンタ９０６は、ISpinningと呼ぶことができる。使用されるカウンタの期間または種類に関係なく、「ＣＴ」(control thread)９０２のカウンタ９０６は、マルチスレッド処理に利用できると判定されたプロセッサの数に設定される。図９の例示的な実施形態において、このようなカウンタ９０６は、リカルクエンジン９１０と９２０に対して値「２」に設定される。さらに、制御スレッドインデックス、例えば、int ientNextは、「０」(zero)に設定され、各リカルクエンジンのインデックス９１４および９２４、int iENTは、「０」に設定される。下記のように、これらのインデックスは、ＥＮＴ９１２と９２２のポインタを制御する。インデックス値「０」は、第１セル、例えば、単一計算チェーン９１８の左側にあるＣ３に対するインデックスである。
【００２７】
図１０Ａおよび１０Ｂに、リカルクエンジン１（９１０）および２（９２０）の非同期スレッド動作を、トリガリングおよび一時停止して、単一計算チェーン９１８を評価する、動作ステップ１０００を示す。図１０Ａの計算開始動作１００２は、図４に示したスプレッドシート４００などのスプレッドシートを評価するために、ローディングまたは呼び出しに応答して開始される。カウンタ９０６は、設定動作１００４のリカルクエンジンの数に設定される。次の割り当て動作１００６では、制御スレッド９０２は、リカルクエンジン１と２のインデックス９１４と９２４に、それぞれ「０」を設定して、各スレッドを割り当て、第１ＥＮＴでの評価を開始できるようにする。次に制御スレッド９０２は、各リカルクエンジン上で、イベント９１６と９２６をトリガーして、トリガー動作１００８において、処理するスレッドを起動させる。アプリケーションの呼び出しまたはローディングは、制御スレッド９０２が、リカルクエンジンのイベントをトリガーできる、イベントの例である。トリガーされると、各リカルクエンジンは、スレッドの安全と連動したインクリメント動作１０１０を実行する。例えば、リカルクエンジン９１０は、制御スレッド９０２から復帰した際、「１」を、制御スレッドインデックス９０４に付加すること、およびインデックス９０４の前の値、例えば、この実施形態において「０」を受信することによって、この連動されたインクリメント動作１０１０を開始する。第１リカルクエンジンのインデックス値９１４と、制御スレッド９０２から復帰した制御スレッドインデックス９０４の値との差は、リカルクエンジン１が、単一計算チェーン９１８を反復しなくてはならない値である。この例示的な実施形態において、リカルクエンジン１（９１０）は、制御スレッドインデックス９０４を、値「０」から値「１」にインクリメントする。「０」は、制御スレッドインデックス９０４の前の値だったので、リカルクエンジン１（９１０）は、値「０」を受信し、それを、この例示的な実施形態に従って、それ自身のインデックス９１４、例えば、「０」と比較し、これら２つの値の差、例えば、「０」−「０」＝「０」を判定し、値「０」を受信する。値「０」は、計算チェーン９１８の第１ＥＮＴ（例えば、Ｃ３）を評価するために、リカルクエンジン１（９１０）を必要とする。
【００２８】
同様に、リカルクエンジン２（９２０）は、制御スレッドインデックス９０４を「１」から「２」にインクリメントし、代わって、制御スレッドインデックス９０４の前の値、例えば、この例示的な実施形態において「１」を受信する、スレッドの安全と連動したインクリメント動作を実行する。次にリカルクエンジン２（９２０）は、制御スレッド９０４から復帰した値「１」と、それ自身のインデックスの値、例えば、この例示的な実施形態において「０」とを比較し、これら２つの値間の差である「１」を算出する。このように値「１」は、計算チェーン９１８の第２ＥＮＴ（例えば、Ｂ３）を評価するために、リカルクエンジン２（９２０）を必要とする。
【００２９】
一実施形態において、このスレッドの安全と連動したインクリメンティングは、依存チェーンが終了するまで続行する。連動したインクリメンティング動作１０１０を実行すると、各リカルクエンジンは、動作１０１２において割り当てられたＥＮＴの評価を開始する。チェーン９１８を評価するために、非同期スレッドがトリガーされると、制御スレッド９０２は、ステップ１０１４でのそれ自身の動作を一時停止し、それ自身のイベント９０８が、トリガーされるのを待つ。次にプロセス１０００は、復帰動作１０１６に移行する。
【００３０】
一実施形態において、リカルクエンジンの動作は、リカルクエンジン自身によって、個別に一時停止できる。別の実施形態において、リカルクエンジンは、全ての非同期スレッドが、一時停止することを要求できる。最初の実施形態において、非同期スレッドは、依存レベルの最後に到達すると、それ自身を一時停止する。別の実施形態において、非同期スレッドは、そのスレッドの待ち行列またはバッファが、依存式および支援式で満杯になると、一時停止できる。他の実施形態は、非同期スレッドを一時停止する他の理由を伴う場合がある。本明細書に定められた例は、例示的な実施形態としてのみの目的を果たすためのものである。さらなる実施形態において、非同期スレッドは、全てのスレッドが中断（例えば、制御スレッド式が、非同期スレッドによって検出されるところ）されることを要求できる。
【００３１】
上の図１０Ａに説明した、スレッド動作のトリガリングに続いて、個別の非同期スレッド動作を一時停止または中断する「一時停止」プロセス１０１８を、例示的な実施形態に従って、図１０Ｂに説明する。本発明の実施形態に従って、図１０Ｂに表したフローチャートに、２つのスレッド間の動作の経過を示す。別の実施形態において、それらのスレッドは、同時に動作できる。図１０Ｂに表したフローチャートは、例示的な実施形態としてのみの目的を果たすためのものであり、決してスレッドの動作を限定するものとして解釈すべきではない。上記の図１０Ｂを参照すると、スレッドは、依存レベルの最後に到達したことを検出した場合、その動作を一時停止できる。別の実施形態において、スレッドは、待ち行列またはバッファが満杯であることを検出した場合、その動作を中断できる。このように、開始動作１０２０から、依存レベルの最後に到達したかどうか、またはリカルクエンジン＃１のバッファが満杯であるかどうかを判定する、クエリ動作１０２４へ進む。クエリ動作１０２４が、依存レベルの最後にまだ到着していないこと、およびそのスレッドに対する待ち行列が満杯でないことを判定した場合、フローはＮＯを通過し、スレッドがＥＮＴを評価し、計算チェーンを反復するために続行する、続行動作１０２６へ進む。一方、クエリ動作１０２４が、依存レベルの最後に到達したこと、またはそのスレッドに対するバッファが満杯であることのどちらかを判定した場合、フローはＹＥＳを通過し、デクリメントカウンタ動作１０２８へ進む。デクリメントカウンタ動作は、制御スレッドのカウンタ９０６を、デクリメントする。それ自身の動作を一時停止するには、リカルクエンジンは、他の機能の間で、制御スレッド９０６のカウンタをデクリメントする。カウンタ９０６が、「０」より大きい値を有する場合、スレッドは動作をする、またはずっと一時停止解除を保たなければならない。しかし、カウンタの値が「０」の場合、全てのスレッドは、一時停止され、制御スレッド９０２のイベント９０８は、トリガーされる。制御スレッドカウンタ９０６をデクリメントすると、リカルクエンジン＃１は、スリープ動作１０３０において一時停止され、または換言すれば、スリープモードに入る。次にクエリ動作１０３２は、制御スレッドカウンタ９０６が、「０」に等しいかどうかを判定する。カウンタ９０６が値「０」を有する場合、値「０」は、全ての非同期スレッドが一時停止されていることを示すため、フローはＹＥＳに分岐して、動作１０３４でのトリガー制御スレッドイベント動作９０８へ進む。カウンタ９０６が値「０」を有しない場合、フローはＮＯに分岐して、制御がリカルクエンジン＃２へ通過する、通過動作１０３６へ進む。リカルクエンジン＃２は、上記のリカルクエンジン＃１に対するものと同様である、ステップ１０３８から１０４８までを通って進む。
【００３２】
必要な並べ替えを判定し、必要に応じて制御スレッド式を検出するために、計算チェーンによって反復するプロセス１１００を、本開示の実施形態に従って示す。上記のように、図１１に示した本発明の例示的な実施形態は、２つのスレッド間の動作の経過を表す。別の実施形態において、スレッドは、同時に動作できる。図１１に表されたフローチャートは、例示的な実施形態としてのみの目的を果たすためのものであり、決してスレッドの動作を限定するものとして解釈すべきではない。図１１を参照して、開始動作１１０２は、各リカルクエンジンのイベント１００８のトリガリングの後に開始される。開始動作１１０２から、動作フローは、リカルクエンジン＃１が連動したインクリメント動作１１０４へ進む。次にリカルクエンジン＃１は、スレッドが安全なインクリメント動作１１０４によって割り当てられた、計算されたＥＮＴ値に対する反復動作１１０６の計算チェーンを反復する。割り当てられたＥＮＴが到達すると、フローは、依存レベルの最後に到達したかどうか、または非同期スレッドの待ち行列（またはバッファ）が満杯であるかどうかを判定する、クエリ動作１１１２を通過する。依存レベルの最後が検出された場合、または非同期スレッドの待ち行列が、満杯であると判定された場合、非同期スレッドは、中断動作１１１６において、それ自身の動作を中断する。中断を必要とするこのような項目が存在しない場合、プロセス１１００は、式が制御スレッド式であるかどうかを判定する、クエリ動作１１１４へ進む。制御スレッド式が検出された場合、フローはＹＥＳに分岐して、制御スレッド式を個別のバッファまたはこのような式のみから成る列の待ち行列に入れる、待ち行列動作１１１５へ進む。クエリ動作１１１４が、式が制御スレッド式ではないと判定した場合、フローはＮＯに分岐して、割り当てられたＥＮＴの式が未計算ＥＮＴに依存しているかどうかを判定する、クエリ動作１１２０へ進む。クエリ動作１１２０が、式が未計算ＥＮＴに依存していると判定した場合、フローはＹＥＳに分岐して、依存式および支援式が適切な待ち行列に配置されている、動作１１２２の待ち行列１へ進む。クエリ動作１１２０が、式が未計算ＥＮＴに依存していないと判定した場合、フローはＮＯに分岐して、値を復帰させる、動作１１１８での式の評価へ進む。
【００３３】
評価動作１１１８および／または待ち行列動作１１１８の後に、プロセス１１００は、動作が、リカルクエンジン＃２に移される、動作１１２４へ進む。第２リカルクエンジンは、リカルクエンジン＃１動作１１０４から１１２４までを参照して、上記に対するものと同様である、ステップ１１２６から１１４２までを実行する。
【００３４】
図１２を参照して、計算チェーンを並び替えて、統一され、並び替えられたチェーンにする制御スレッド動作を伴うプロセス１２００を、本発明の実施形態に従って示す。開始動作１２０２が、制御スレッドイベントのトリガーに応答して開始される。開始動作１２０２から、フローは、スプレッドシート４００のセルを再表示する、再表示動作１２０３へ進む。再表示動作１２０３の後に、プロセス１２００は、リカルクエンジンの待ち行列にエントリが他にあるかどうかを判定する、クエリ動作１２０４へ進む。クエリ動作１２０４が、そのようなエントリが存在すると判定した場合。フローはＹＥＳに分岐して、並び替え動作１２１０へ進む。並び替え動作１２１０は、依存式および支援式を、統一チェーン内の子チェーンの中に並び替える。この並び替えが完了するとすぐに、クエリ動作１２１８は、子が作られたかどうかを判定する。子が作られた場合、リカルク動作は、そのような新しい子チェーンを含んでいる依存レベルを、再度通過することが必要である。このように、１または複数の子が作られた場合、フローはＹＥＳに分岐して、その依存レベルの始まりを再度開始するために、リカルクエンジンのインデックスおよびポインタをリセットする、リセット動作１２２４へ進む。そこから、プロセス１２００は、非同期スレッドのイベントをトリガーする、起動動作１２３０へ進む。このようなスレッドは、並び替えられたチェーン上で、リカルク動作を実行する。リカルクエンジンをトリガーすると、制御スレッドは、スリープ動作１２３２において、それ自身の動作を一時停止する。
【００３５】
クエリ動作１２１８が、並べ替えの際に、子が一つも作られなかったと判定した場合、待ち行列の１または複数のエントリは、動作１２２０によって表されたように、次の依存レベルへの移動を完了しなければならない。子が一つも作られなかった場合、進行中の依存レベル内のＥＮＴをリカルクする必要はない。むしろ、非同期スレッドの制御インデックスと同様に、非同期スレッドのインデックスおよびポインタは、次の依存レベルのリセット動作１２２２において、リセットされる。次にフローは、クエリ動作１２２６へ進み、次の依存レベルに、制御スレッド式が他にあるかどうかを判定する。クエリ動作１２２６が、次の依存レベルに、制御スレッド式があると判定した場合、フローはＹＥＳに分岐して、制御スレッドが、それらの式に働きかけができる、実行動作１２２８へ進む。それらの式が評価されるとすぐに、フローは、非同期スレッドのイベントをトリガーする、非同期スレッドを起動させる動作１２３０へ進み、ステップ１２３０と１２３２が、上記のように処理される。クエリ動作１２２６が、そのような式がないと判定した場合、フローは上記のようにＮＯに分岐して、起動動作１２３０へ進み、プロセス１２００は、ステップ１２３０から１２３２まで進む。
【００３６】
クエリ動作１２０４が、リカルク待ち行列にエントリがないと判定した場合、フローはＮＯに分岐して、制御スレッド９０２のリンクされたリストに、制御スレッド式があるかどうかを判定する、クエリ動作１２０６へ進む。上記のように、制御スレッド式は、非同期スレッドの１つによるものとは対照的に、制御スレッドによって評価されなければならない式である。制御スレッド式が、待ち行列に入れられている場合、フローはＹＥＳに分岐して、制御スレッド式が統一チェーンの次の依存レベルに移動される、動作１２１２へ進む。制御スレッド式を、進行中の依存レベルの後に、ただちに新しい依存レベルに移動させることによって、マルチスレッド処理は、制御スレッド式を評価する必要があるにもかかわらず、続行できる。移動動作１２１２から、フローは、制御スレッド式が他にあるかどうかを判定する、クエリ動作１２１６へ進む。待ち行列に入れられた他の制御スレッド式がある場合、フローはＹＥＳに分岐して、クエリ動作１２０６へ進み、上記のステップが反復される。クエリ動作１２１６が、制御スレッド式が他にないと判定した場合、フローはＮＯに分岐して、次の依存レベルに対する非同期スレッド（および対応する制御スレッドの制御インデックス）のインデックスおよびポインタをリセットする、リセット動作１２２２へ進む。
【００３７】
制御スレッドが、その動作を一時停止する前に、最初に、クエリ動作１２２６において次の依存レベルに制御スレッドがあるかどうかを判定し、次に、上記のようにプロセス１２００は、ステップ１２２６から１２３２まで進む。
【００３８】
クエリ動作１２０６が、制御スレッド式はないと判定した場合、フローはＮＯに分岐して、次の依存レベルのインデックスおよびポインタをリセットする、リセット動作１２２２へ進み、上記のようにプロセス１２００は、ステップ１２２２から１２３２まで進む。
【００３９】
図１２のステップ１２０６と１２１２は、制御スレッド式を、進行中の依存レベルの後に、ただちに新しい依存レベルに移動させるのに関係する一方、図１３に、この移動の論理的表示１３００を示す。図１３に、依存レベル＃１（１３０２）、および依存レベル＃２に配置されたＣ３（１３１２）を有する、依存レベル＃２（１３１０）を示す。さらに、制御スレッド式「ＣＴ」（１３０８）を、依存レベル＃１（囲いのあるチェーン１３０４およびチェーン１３０６も同様）に示す。説明したように、制御スレッドが、制御スレッド専用式を実行できるようにするために、本発明の実施形態では、制御スレッド式１３０８を、制御スレッド待ち行列のリンクされたリストに移動する。次に制御スレッドが、トリガーされ、動作および並べ替えの制御を担うと、制御スレッドは、制御スレッド式を、進行中の依存レベルの後に、ただちに新しい依存レベルに移動させる。このように図１３の例示的な実施形態は、依存レベル＃２（１３１６）に移動（１３２０）されている制御スレッド式１３０８、および、囲いのあるＣ３が今度は、個別の依存レベル＃３（１３１８）になっている、依存レベルを示す。１つの制御スレッド式のみを、この実施形態に示す。別の実施形態において、複数の制御スレッド式が、新しい依存レベル１３１６に移動される可能性がある。代替的に、各制御スレッド式は、依存レベル＃１（１３１４）の後に、それ自身の新しい依存レベルに移動され、依存レベル＃３の前に配置される可能性がある。
【００４０】
実施形態において、制御スレッド式は、制御スレッドが、依存レベルの最後に動作するスレッドになるため、次の依存レベルに移動される。非同期スレッドをトリガリングして、次の依存レベルにおいて評価を開始する前に、制御スレッドは、最初に、非同期スレッドのトリガリングの前に実行される必要がある制御スレッド式があるかどうかを判定できる。制御スレッド式を、個別の依存レベルに移動させることによって、複数のスレッド処理が、続行できると同時に、制御スレッド専用動作も続行できる。図１３に、３つの依存レベルを示す一方、このようなレベルの任意の数が存在でき、本明細書に示した例示的な実施形態の本質は、このように実行できる依存レベルの数を、決して限定するためのものではない。
【００４１】
図１４Ａに論理的に表されたように、本発明の実施形態によって、マルチ処理機能を有するスプレッドシートアプリケーションが、統一計算チェーンのマルチスレッド処理内の循環参照計算（例えば、お互いに依存している計算など）を実行することがさらにできる。スプレッドシート１４０２に、循環参照コンティンジェンシーを有する、Ａ１からＡ３までのセルを示す。換言すれば、セルＡ１の式は、Ａ３に依存し、Ａ３は、式Ａ２に依存し、今度はＡ２が、Ａ１自身に依存している。この循環参照の問題を解決するために、本発明の実施形態では、単一スレッドを使用して計算するために、循環参照セルが、統一チェーンから外されるまたは分離されて、単一チェーン計算、例えば、子チェーンまたは依存レベルを持たないカルクチェーンに配置されるようにできる。子の関係および／または依存レベルにかかわる統一されたものとは対照的に、単一チェーン計算を用いることによって、反復機能は、最終値に収束するように、チェーン上で反復計算を実行できる。反復カルク１４１０は、そのような機能の例であるが、本発明の実施形態に従って、循環依存を計算する、任意の種類の反復機能を使用できる。
【００４２】
反復循環計算に対する単一チェーン計算を作成するために、上記のように（例えば、それらのスプレッドシート１４０２へのエントリに基づいて）セルは、最初に、単一計算チェーンに配置される。この例示的な実施形態において、Ｂ１が最初に評価され、他の式に依存していないと判定される。次にチェーンに働きかけ、Ａ３がＡ２に依存していると判定され、「進行中」と表示され、支援式Ａ２の子になるために、カルクチェーンから除かれる。チェーン１４０４を、ＥＮＴ  Ａ２まで移動させると、Ａ２がＡ１に依存していることがわかる。従ってＡ２は、「進行中」と表示され、カルクチェーン１４０４から除かれ、支援式Ａ１の子の位置へ進む。Ａ２をＡ１の子の位置に移動させる際、Ａ２は、Ａ３を連れて行く。次に、チェーン１４０４を、Ａ１に移動させると、Ａ１は、評価されるのを試される。しかし、１４０６での識別された循環依存があることから、Ａ１は、Ａ３に依存していることがわかる。Ａ１は、「進行中」と表示され、カルクチェーン１４０４から除かれる。結果として、並び替えられたチェーン１４０６に示したように、Ａ１、Ａ２、およびＡ３は、カルクチェーン１４０４から完全に分離されている。従って、チェーンによる反復のプロセスにおいて、Ａ１、Ａ２、およびＡ３は、処理されないだろう。結果として、チェーンによる反復を終了させると、チェーンＡ１、Ａ２、およびＡ３は、「進行中」またはダーティーとして、なおも表示されるだろう。このような項目を処理するために、システムは、進行中の再計算プロセスの経過の間、別の式の子が作られる全ての式の情報を得る。次に、プロセスの間に子が作られた全ての式は、それらのうちで、なおもダーティーと表示されていないかどうかをチェックされる。そうである場合、その式およびその子の全ては、フラットカルクチェーン１４０８、例えば、子チェーンまたは依存レベルを持たないカルクチェーンに移動される。図１４Ａの１４０８に示した、このフラットカルクチェーンは次に、単一スレッドを使用して計算される。単一スレッドの計算の間、真の循環参照が検出されると、計算は、たとえば、反復計算機能１４１０によって、反復的に行うことができる。
【００４３】
図１４Ｂを参照して、起こり得る循環参照検出および評価のために、カルクチェーンを、フラットカルクチェーンの中に並び替えるプロセス１４１１を、本発明の実施形態に従って示す。開始動作１４１２は、単一カルクチェーン１４０４を作り出すと、開始される。開始動作１４１２から、フローは、カルクチェーン１４０４の第１式を得る、取得動作１４１４へ進む。次に評価動作１４１６が、この式を評価する。クエリ動作１４１８は、その式が、支援式の子であるかどうかを評価する。その式が、支援式の子である場合、フローはＹＥＳに分岐して、トラック動作１４２０へ進み、その子の式は「進行中」と表示され、システムによって記録が付けられる。その式が、支援式の子でない場合、フローはＮＯに分岐して、処理のためのカルクチェーン１４０４に、式が他にあるかどうかを判定する、クエリ動作へ進む。他に式がある場合、フローはＹＥＳに分岐して、評価のためのカルクチェーン１４０４の次の式に移動させる、取得動作１４１４へ進む。他に式がない場合、フローはＮＯに分岐して、トラック動作１４２０によって記録付けが完了した、第１（または次の）式を検索する、記録が付けられた式動作１４２４へ進む。次に、クエリ動作１４２６は、検索された記録が付いた式が、なおもダーティーと表示されているかどうかを判定する。その式が、なおもダーティーと表示されている場合、本発明の例示的な実施形態に従って、フローはＹＥＳに分岐して、フラットカルクチェーン１４０８に示したように、その式およびその子の全てを、フラットカルクチェーンに付加する、フラットカルクチェーン動作１４２８へ進む。クエリ動作１４２６が、記録が付いた式がもうダーティーではないと判定した場合、フローはＮＯに分岐して、記録付けが完了した（または「進行中」と表示されている）式が他にあるかどうかを判定する、クエリ動作１４３０へ進む。他に記録が付けられた式がある場合、フローはＹＥＳに分岐して、第１または次の記録が付けられた式動作１４２４へ進み、ステップ１４２６から１４３０までが反復される。クエリ動作１４３０が、記録が付いた式が他にないと判定した場合、フローはＮＯに分岐して、復帰動作１４３２へ進む。フラットカルクチェーンが、プロセス１４１１によって作り出されるとすぐに、このフラットカルクチェーン（ステップ１４２８において作り出されたように、フラットカルクチェーン１４０８として示す）は、単一スレッドを使用して計算できる。単一スレッドのカルクの間、真の循環参照が検出されると、式は、反復的に計算できる。トラッキングのための言語である「進行中」を、この例示的な実施形態（および図１４Ａの説明時）において使用してきたが、本発明の実施形態に従って、任意の表示または記録付けの構造を使用できる。
【００４４】
図１５に、本発明によって実施できる、例示的なコンピューティングシステム１５００を示す。少なくとも１つのプロセッサ１５０２、およびその上で動作する、少なくとも１つのリカルクエンジン１５１８を有する、コンピュータシステム１５００を、図２に示す。システム１５００は、スプレッドシートアプリケーション１５２０が配置された、メモリ１５０４を有する。その最も基本的な構成において、コンピューティングシステム１５００を、点線１５０６によって、図１５に示す。さらに、システム１５００は、磁気または光学のディスクもしくはテープを含んだ、付加的な記憶装置（取り外し可能および／または取り外し不能）も含むが、これらに限定されない。このような付加的な記憶装置を、取り外し可能記憶装置１５０８および取り外し不能記憶装置１５１０によって、図１５に示す。コンピュータ記憶媒体は、コンピュータ読み取り可能命令、データ構造、プログラムモジュールまたは他のデータなどの情報を格納する任意の方法または技術において実施される、揮発性ならびに不揮発性、取り外し可能ならびに取り外し不能の媒体を含む。メモリ１５０４、取り外し可能記憶装置１５０８および取り外し不能記憶装置１５１０は、コンピュータ記憶媒体の全ての例である。コンピュータ記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリもしくは他の記憶技術、ＣＤ−ＲＯＭ、ＤＶＤ(digital versatile disk)もしくは他の光学式記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置もしくは他の磁気記憶装置、または、例えば、望ましいスプレッドシート計算情報を格納するために使用できる、ならびにシステム１５００によってアクセスが可能な他の媒体を含むが、これらに限定されない。このような任意のコンピュータ記憶媒体は、システム１５００の一部にできる。構成およびコンピューティング装置の種類に依存することによって、メモリ１５０４は、揮発性、不揮発性、またはそれら２つのある組み合わせにできる。通信媒体は、典型的には、コンピュータ読み取り可能命令、データ構造、プログラムモジュール、または搬送波もしくは他の転送などの変調されたデータ信号の他のデータを実施し、任意の情報送達媒体を含む。用語「変調されたデータ信号」は、その特性セットの１または２以上を有する、または信号の情報を符号化するような方法で変更された信号を意味する。一例として、通信媒体は、有線ネットワークまたは直接有線接続などの有線媒体、音響、ＲＦ、赤外線などの無線媒体および他の無線媒体を含むが、これらに限定されない。上記のどの組み合わせも、コンピュータ読み取り可能媒体の範囲内に含めるべきである。
【００４５】
システム１５００は、装置を、他の装置と通信ができるようにする、通信接続１５１２を含むこともできる。さらに、本発明の実施形態に従って、コンテンツを、スプレッドシート４００のセルに入力するために、システム１５００は、キーボード、マウス、ペン、音声入力装置、タッチ入力装置などの入力装置１５１４を有することができる。本発明の実施形態に従って、ディスプレイ、スピーカ、プリンタなどの出力装置１５１６を含むこともでき、このような装置を使用して、スプレッドシート４００を、ユーザに表示することができる。このような装置の全ては、当技術分野で周知の通りであり、本明細書で詳細に説明する必要はない。
【００４６】
上記の図を参照して、本開示の実施形態を説明してきたが、多くの変更を、本発明に対して行い、それら自身を、容易に当業者に提案し、開示された発明の範囲と精神内において網羅され、添付の請求に定義されたようにできることを認識すべきである。実際に、現在の好適実施形態を、本開示目的として説明してきたが、さまざまな変化および変更は、本発明の範囲内で十分に行うことができる。
【００４７】
同様に、本開示は、構造的機能、方法論的動作、およびそれらの動作を含んだコンピュータ読み取り可能媒体に特有の言語を使用してきたが、当然のことながら、添付の請求に定義された本発明の対象は、本明細書に説明された特定の構造、動作、機能、または媒体を、必ずしも限定するものではない。むしろ、上記の特定の機能および動作は、本請求を実施する例示的形態として開示される。例えば、いくつかの実施形態において、２つのリカルクエンジンを示して説明してきたが、プロセッサの任意の数「Ｎ」およびリカルクエンジンを使用できる。当業者は、本発明の範囲と精神内において、他の実施形態または変更を認識できる。従って、特定の構造、動作、または媒体は、請求される発明を実施する例示的な実施形態として開示される。本発明は、添付の請求によって定義される。
【図１】
2009536766.tif 000003
【図２】
2009536766.tif 000004
【図３】
2009536766.tif 000005
【図４】
2009536766.tif 000006
【図５】
2009536766.tif 000007
【図６Ａ】
2009536766.tif 000008
【図６Ｂ】
2009536766.tif 000009
【図６Ｃ】
2009536766.tif 000010
【図７】
2009536766.tif 000011
【図８】
2009536766.tif 000012
【図９】
2009536766.tif 000013
【図１０Ａ】
2009536766.tif 000014
【図１０Ｂ】
2009536766.tif 000015
【図１１】
2009536766.tif 000016
【図１２】
2009536766.tif 000017
【図１３】
2009536766.tif 000018
【図１４】
2009536766.tif 000019
【図１４Ａ】
2009536766.tif 000020
【図１４Ｂ】
2009536766.tif 000021
【図１５】
2009536766.tif 000022
2009536766.tif 000023
2009536766.tif 000024
2009536766.tif 000025
2009536766.tif 000026
2009536766.tif 000027
2009536766.tif 000028
2009536766.tif 000029
2009536766.tif 000030
2009536766.tif 000031
2009536766.tif 000032
2009536766.tif 000033
2009536766.tif 000034
2009536766.tif 000035
2009536766.tif 000036
2009536766.tif 000037
2009536766.tif 000038
2009536766.tif 000039
【国際調査報告】
2009536766.tif 000040
2009536766.tif 000041