GNU bug report logs - #42623
fgrep -x -f problem

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: grep; Reported by: Arthur Goldberg <artgoldberg@HIDDEN>; Keywords: moreinfo; dated Thu, 30 Jul 2020 18:00:02 UTC; Maintainer for grep is bug-grep@HIDDEN.
Added tag(s) moreinfo. Request was from Paul Eggert <eggert@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at 42623 <at> debbugs.gnu.org:


Received: (at 42623) by debbugs.gnu.org; 30 Jul 2020 18:48:15 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Jul 30 14:48:15 2020
Received: from localhost ([127.0.0.1]:36719 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1k1DbC-0006mH-VR
	for submit <at> debbugs.gnu.org; Thu, 30 Jul 2020 14:48:15 -0400
Received: from zimbra.cs.ucla.edu ([131.179.128.68]:42418)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eggert@HIDDEN>) id 1k1DbB-0006m4-AV
 for 42623 <at> debbugs.gnu.org; Thu, 30 Jul 2020 14:48:14 -0400
Received: from localhost (localhost [127.0.0.1])
 by zimbra.cs.ucla.edu (Postfix) with ESMTP id 0692B160065;
 Thu, 30 Jul 2020 11:48:07 -0700 (PDT)
Received: from zimbra.cs.ucla.edu ([127.0.0.1])
 by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032)
 with ESMTP id G9pnJNwESae6; Thu, 30 Jul 2020 11:48:06 -0700 (PDT)
Received: from localhost (localhost [127.0.0.1])
 by zimbra.cs.ucla.edu (Postfix) with ESMTP id 51080160084;
 Thu, 30 Jul 2020 11:48:06 -0700 (PDT)
X-Virus-Scanned: amavisd-new at zimbra.cs.ucla.edu
Received: from zimbra.cs.ucla.edu ([127.0.0.1])
 by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026)
 with ESMTP id 1bqJVawk8NwM; Thu, 30 Jul 2020 11:48:06 -0700 (PDT)
Received: from [192.168.1.9] (cpe-75-82-69-226.socal.res.rr.com [75.82.69.226])
 by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id 2B592160065;
 Thu, 30 Jul 2020 11:48:06 -0700 (PDT)
Subject: Re: bug#42623: fgrep -x -f problem
To: Arthur Goldberg <artgoldberg@HIDDEN>
References: <04c685c8-ddf7-52d3-5dcb-46ef67a1fa1a@HIDDEN>
From: Paul Eggert <eggert@HIDDEN>
Autocrypt: addr=eggert@HIDDEN; prefer-encrypt=mutual; keydata=
 LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgptUUlOQkV5QWNtUUJFQURB
 QXlIMnhvVHU3cHBHNUQzYThGTVpFb243NGRDdmM0K3ExWEEySjJ0QnkycHdhVHFmCmhweHhk
 R0E5Smo1MFVKM1BENGJTVUVnTjh0TFowc2FuNDdsNVhUQUZMaTI0NTZjaVNsNW04c0thSGxH
 ZHQ5WG0KQUF0bVhxZVpWSVlYL1VGUzk2ZkR6ZjR4aEVtbS95N0xiWUVQUWRVZHh1NDd4QTVL
 aFRZcDVibHRGM1dZRHoxWQpnZDdneDA3QXV3cDdpdzdlTnZub0RUQWxLQWw4S1lEWnpiRE5D
 UUdFYnBZM2VmWkl2UGRlSStGV1FONFcra2doCnkrUDZhdTZQcklJaFlyYWV1YTdYRGRiMkxT
 MWVuM1NzbUUzUWpxZlJxSS9BMnVlOEpNd3N2WGUvV0szOEV6czYKeDc0aVRhcUkzQUZINmls
 QWhEcXBNbmQvbXNTRVNORnQ3NkRpTzFaS1FNcjlhbVZQa25qZlBtSklTcWRoZ0IxRApsRWR3
 MzRzUk9mNlY4bVp3MHhmcVQ2UEtFNDZMY0ZlZnpzMGtiZzRHT1JmOHZqRzJTZjF0azVlVThN
 Qml5Ti9iClowM2JLTmpOWU1wT0REUVF3dVA4NGtZTGtYMndCeHhNQWhCeHdiRFZadWR6eERa
 SjFDMlZYdWpDT0pWeHEya2wKakJNOUVUWXVVR3FkNzVBVzJMWHJMdzYrTXVJc0hGQVlBZ1Jy
 NytLY3dEZ0JBZndoUEJZWDM0blNTaUhsbUxDKwpLYUhMZUNMRjVaSTJ2S20zSEVlQ1R0bE9n
 N3haRU9OZ3d6TCtmZEtvK0Q2U29DOFJSeEpLczhhM3NWZkk0dDZDCm5yUXp2SmJCbjZneGRn
 Q3U1aTI5SjFRQ1lyQ1l2cWwyVXlGUEFLK2RvOTkvMWpPWFQ0bTI4MzZqMXdBUkFRQUIKdENC
 UVlYVnNJRVZuWjJWeWRDQThaV2RuWlhKMFFHTnpMblZqYkdFdVpXUjFQb2tDUGdRVEFRSUFL
 QVVDVElCeQpaQUliQXdVSkVzd0RBQVlMQ1FnSEF3SUdGUWdDQ1FvTEJCWUNBd0VDSGdFQ0Y0
 QUFDZ2tRN1pmcERtS3FmalJSCkd3LytJajAzZGhZZllsL2dYVlJpdXpWMWdHcmJIayt0bmZy
 SS9DN2ZBZW9GelE1dFZnVmluU2hhUGtabzBIVFAKZjE4eDZJREVkQWlPOE1xbzF5cDBDdEht
 ekdNQ0o1MG80R3JnZmpscjZnLyt2dEVPS2JobGVzek4yWHBKdnB3TQoyUWdHdm4vbGFUTFV1
 OFBIOWFSV1RzN3FKSlpLS0tBYjRzeFljOTJGZWhQdTZGT0QwZERpeWhsREFxNGxPVjJtCmRC
 cHpRYmlvam9aelFMTVF3anBnQ1RLMjU3MmVLOUVPRVF5U1VUaFhyU0l6NkFTZW5wNE5ZVEZI
 czl0dUpRdlgKazlnWkRkUFNsM2JwKzQ3ZEd4bHhFV0xwQklNN3pJT053NGtzNGF6Z1Q4bnZE
 WnhBNUlaSHR2cUJsSkxCT2JZWQowTGU2MVdwMHkzVGxCRGgycWRLOGVZTDQyNlc0c2NFTVN1
 aWc1Z2I4T0F0UWlCVzZrMnNHVXh4ZWl2OG92V3U4CllBWmdLSmZ1b1dJK3VSbk1FZGRydVk4
 SnNvTTU0S2FLdlppa2tLczJiZzFuZHRMVnpIcEo2cUZaQzdRVmplSFUKaDYvQm1ndmRqV1Ba
 WUZUdE4rS0E5Q1dYM0dRS0tnTjN1dTk4OHl6bkQ3TG5COThUNEVVSDFIQS9HbmZCcU1WMQpn
 cHpUdlBjNHFWUWluQ21Ja0VGcDgzemwrRzVmQ2pKSjNXN2l2ekNuWW80S2hLTHBGVW05N29r
 VEtSMkxXM3haCnpFVzRjTFNXTzM4N01USzNDekRPeDVxZTZzNGE5MVp1Wk0vai9UUWRUTERh
 cU5uODNrQTRIcTQ4VUhYWXhjSWgKK05kOGsvM3c2bEZ1b0swd3JPRml5d2pMeCswdXI1am1t
 YmVjQkdIYzF4ZGhBRkc1QWcwRVRJQnlaQUVRQUthRgo2NzhUOXd5SDR3alRyVjFQejNjREVv
 U25WLzBaVXJPVDM3cDFkY0d5ai9JWHExeDY3MEhSVmFoQW1rMHNacFljCjI1UEY5RDVHUFlI
 RldsTmp1UFU5NnJEbmRYQjNoZWRtQlJoTGRDNGJBWGpJNERWK2JtZFZlK3EvSU1ubFpSYVYK
 bG05RWlNQ1ZBUjZ3MTNzUmV1N3FYa1c5cjNSd1kyQXpYc2twL3RBZTRCUktyMVptYnZpMm5i
 blE2ZXBFQzQycgpSYngwQjFFaGpiSVFaNUpIR2syNGlQVDdMZEJnbk5tb3M1d1lqendObGtN
 UUQ1VDBZZHpoazdKK1V4d0E1bTQ2Cm1PaFJEQzJyRlYvQTBnbTVUTHk4RFhqdi9Fc2M0Z1lu
 WWFpNlNRcW5VRVZoNUx1VjhZQ0pCbmlqcytUaXc3MXgKMWljbW42eEdJNDVFdWdKT2dlYyty
 THlwWWdwVnA0eDBISTVUODhxQlJZQ2t4SDNLZzhRbytFV05BOUE0TFJROQpEWDhuam9uYTBn
 ZjBzMDN0b2NLOGtCTjY2VW9xcVB0SEJuYzRlTWdCeW1DZmxLMTJlS2ZkMllZeG55ZzljWmF6
 CldBNVZzbHZUeHBtNzZoYmc1b2lBRUgvVmcvOE14SHlBblBoZnJnd3lQcm1KRWNWQmFmZHNw
 Sm5ZUXhCWU5jbzIKTEZQSWhsT3ZXaDhyNGF0K3MrTTNMYjI2b1VUY3psZ2RXMVNmM1NEQTc3
 Qk1SbkYwRlF5RSs3QXpWNzlNQk40eQpraXFhZXpReHRhRjFGeS90dmtoZmZTbzh1K2R3RzBF
 Z0poK3RlMzhnVGNJU1ZyMEdJUHBsTHo2WWhqcmJIclBSCkYxQ041VXVMOURCR2p4dU4zNVJM
 TlZFZnRhNlJVRmxSNk5jdFRqdnJBQkVCQUFHSkFpVUVHQUVDQUE4RkFreUEKY21RQ0d3d0ZD
 UkxNQXdBQUNna1E3WmZwRG1LcWZqU3JIQS8rS3pBS3ZUeFJoQTlNV05MeEl5SjdTNXVKMTZn
 cwpUM29DalpyQktHRWhLTU9HWDRPMEdBNlZPRXJ5TzdRUkNDWWFoM294U0czOElBbk5laXdK
 WGdVOUJ6a2s4NVVHCmJQRWQ3SEdGL1ZTZUhDUXdXb3U2anFVRFRTRHZuOVloTlRkRzBLWFBN
 NzRhQyt4cjJab3cxTzJtaFhpaGdXS0QKMER3KzBMWVBuVU9zUTBLT0Z4SFhYWUhtUnJTMU9a
 UFU1OUJMdmMrVFJoSWhhZlNIS0x3YlhLKzZja2t4Qng2aAo4ejVjY3BHMFFzNGJGaGRGWW5G
 ckVpZURMb0dtbkUyWUxoZFY2c3dKOVZOQ1M2cExpRW9oVDNmbTdhWG0xNXRaCk9JeXpNWmhI
 UlNBUGJsWHhRMFpTV2pxOG9ScmNZTkZ4YzRXMVVScEFrQkNPWUpvWHZRZkQ1TDNscUFsOFRD
 cUQKVXpZeGhIL3RKaGJEZEhycUhINzY3amFEYVRCMStUYWxwLzJBTUt3Y1hOT2Rpa2xHeGJt
 SFZHNllHbDZnOExyYgpzdTlOWkVJNHlMbEh6dWlrdGhKV2d6KzN2WmhWR3lObHQrSE5Jb0Y2
 Q2pETDJvbXU1Y0VxNFJESE00NFFxUGs2Cmw3TzBwVXZOMW1UNEIrUzFiMDhSS3BxbS9mZjAx
 NUUzN0hOVi9waUl2Smx4R0FZejhQU2Z1R0NCMXRoTVlxbG0KZ2RoZDkvQmFiR0ZiR0dZSEE2
 VTQvVDV6cVUrZjZ4SHkxU3NBUVoxTVNLbEx3ZWtCSVQrNC9jTFJHcUNIam5WMApxNUgvVDZh
 N3Q1bVBrYnpTck9MU280cHVqK0lUb05qWXlZSURCV3pobEExOWF2T2ErcnZVam1IdEQzc0ZO
 N2NYCld0a0dvaThidU5jYnk0VT0KPUFMNm8KLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxP
 Q0stLS0tLQo=
Organization: UCLA Computer Science Department
Message-ID: <39288803-4a20-2aa5-a7da-ad19c9507064@HIDDEN>
Date: Thu, 30 Jul 2020 11:48:05 -0700
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.10.0
MIME-Version: 1.0
In-Reply-To: <04c685c8-ddf7-52d3-5dcb-46ef67a1fa1a@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Spam-Score: -3.1 (---)
X-Debbugs-Envelope-To: 42623
Cc: 42623 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -4.1 (----)

On 7/30/20 9:16 AM, Arthur Goldberg wrote:

> fgrep -x -f dfba.py dfba.py > actual_output.txt

That command works just fine for me with the file you attached. That is, this 
command:

fgrep -x -f dfba.py dfba.py | cmp - dfba.py

outputs nothing, as expected. This is on Ubuntu 18.04.4 which has fgrep 3.1 
(same as what you have).

I noticed that the file actual_output.txt that you attached had trailing CR at 
the end of each line, which would cause 'diff' to report a difference at any 
line. So perhaps the problem has to do with a Microsoft-oriented file system in 
your environment, or something like that.




Information forwarded to bug-grep@HIDDEN:
bug#42623; Package grep. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 30 Jul 2020 17:59:02 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Jul 30 13:59:02 2020
Received: from localhost ([127.0.0.1]:36668 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1k1CpY-0005bC-HJ
	for submit <at> debbugs.gnu.org; Thu, 30 Jul 2020 13:59:02 -0400
Received: from lists.gnu.org ([209.51.188.17]:39816)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <artgoldberg@HIDDEN>) id 1k1BEA-0003At-6F
 for submit <at> debbugs.gnu.org; Thu, 30 Jul 2020 12:16:20 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:35380)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <artgoldberg@HIDDEN>)
 id 1k1BEA-0001vm-0i
 for bug-grep@HIDDEN; Thu, 30 Jul 2020 12:16:18 -0400
Received: from mail-qk1-x72a.google.com ([2607:f8b0:4864:20::72a]:41190)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <artgoldberg@HIDDEN>)
 id 1k1BE7-0001Hl-CG
 for bug-grep@HIDDEN; Thu, 30 Jul 2020 12:16:17 -0400
Received: by mail-qk1-x72a.google.com with SMTP id l64so19308306qkb.8
 for <bug-grep@HIDDEN>; Thu, 30 Jul 2020 09:16:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=to:from:subject:message-id:date:user-agent:mime-version
 :content-language;
 bh=Rs/1rIfYDDbSlkxX2nWkCk73IUADWi33Q6Ez+pWnL80=;
 b=nIgPU+QOou+Au99j+QG6yzyZ/znQdSoaURkZwxWrYjJCWyHyLIA4CuhsHdrEI63Ijp
 ldvUMtIqIos62JtR8PI8DOBz1b4v2460Y7Hha/GB6t+1LWkWGqqRa3BKepHaquO2Rt79
 41foO8eh0SlSJ+7m2mu7KUCtsV3k+BQqxZ42MitlTdWdnRhSZchOxvQTM7icKJq4EzJi
 SbCEFk9lz0DFzMq0Pw0YzGT0weNZM8Up/lDwcDfN/Ee+RDZdGAsEmj19AiM4QiT7BsoC
 r393mDCd+vbT4x9satpZUeBL3GWPVQos92WV7w6Lj0FapMGrF9dVJ+eqXHG2K4DdYObC
 IvKw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:to:from:subject:message-id:date:user-agent
 :mime-version:content-language;
 bh=Rs/1rIfYDDbSlkxX2nWkCk73IUADWi33Q6Ez+pWnL80=;
 b=Cbe7gVgGi9kDtIYvnk6A0RVfIPIFSUkR6b0J/mCUYMBnpvlLa13GyEUJdnQmKCBeyg
 O3WWCujnwcrnFcp278t8izotd9WcBuX6+6fxy4q3TsDk9X7SLqmGB8bkeYcQV9r8NPBO
 2DEfDJRkWhwQ9u5eZ1zbNtE0ktLOiHjVaXO/lpYvcMOaSKnl7i6UEZNDWPQ7HOUPXu+2
 pvvZHD+3n7ZNLjOQ9OGs6As6yrSslmJXF12GkKeWnlRh5oWPDFOtl0ofKh304llBOiNh
 nsprpVIeIppotK8oWfWtZWRN9tRs5Sh0sJX/ncbWkdApWyMoobVqXst1fZGofBrX/z6j
 xmow==
X-Gm-Message-State: AOAM5320mFaDDYs78MsfeZ2LEQVRBOVaeu4/6qV0waztCCi4lXo5+9K/
 DTVymN+/tZeaV9WFj1C7BIhJ5Ifx
X-Google-Smtp-Source: ABdhPJw4PQ8gSWOV9AOxkhCxXgT5HIHCaoCO30Um6ZqaId1jwlIUUvZaHlmhogARPAxdB8usl0ynNQ==
X-Received: by 2002:a37:80c:: with SMTP id 12mr40165734qki.149.1596125773351; 
 Thu, 30 Jul 2020 09:16:13 -0700 (PDT)
Received: from Arthur-Karr-Lab-MBP.local
 (pool-108-27-255-237.nycmny.fios.verizon.net. [108.27.255.237])
 by smtp.gmail.com with ESMTPSA id n33sm4723522qtd.43.2020.07.30.09.16.12
 for <bug-grep@HIDDEN>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Thu, 30 Jul 2020 09:16:12 -0700 (PDT)
To: bug-grep@HIDDEN
From: Arthur Goldberg <artgoldberg@HIDDEN>
Subject: fgrep -x -f problem
Message-ID: <04c685c8-ddf7-52d3-5dcb-46ef67a1fa1a@HIDDEN>
Date: Thu, 30 Jul 2020 12:16:11 -0400
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:68.0)
 Gecko/20100101 Thunderbird/68.6.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------E5D15685A8D8411705950180"
Content-Language: en-US
Received-SPF: pass client-ip=2607:f8b0:4864:20::72a;
 envelope-from=artgoldberg@HIDDEN; helo=mail-qk1-x72a.google.com
X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache.
 That's all we know.
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001,
 URIBL_BLOCKED=0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: submit
X-Mailman-Approved-At: Thu, 30 Jul 2020 13:58:59 -0400
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)

This is a multi-part message in MIME format.
--------------E5D15685A8D8411705950180
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi Gnu grep folks

I believe that

fgrep -x -f file file

should output the contents of `file`. However, it outputs something very 
different for the attached file.

command:

fgrep -x -f dfba.py dfba.py > actual_output.txt

versions:

$ uname -a
Linux 8845f126fe89 4.19.76-linuxkit #1 SMP Thu Oct 17 19:31:58 UTC 2019 
x86_64 x86_64 x86_64 GNU/Linux

$ fgrep --version
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see 
<http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

Thanks

Arthur

-- 
Arthur Goldberg
https://www.linkedin.com/in/arthurgoldberg
artgoldberg@HIDDEN


--------------E5D15685A8D8411705950180
Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0";
 name="actual_output.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="actual_output.txt"

aW1wb3J0IGNvbnZfb3B0DQoNCmZyb20gZGVfc2ltLnNpbXVsYXRpb25fb2JqZWN0IGltcG9y
dCBTaW11bGF0aW9uT2JqZWN0DQpmcm9tIHdjX3NpbSBpbXBvcnQgbWVzc2FnZV90eXBlcw0K
ZnJvbSB3Y19zaW0uY29uZmlnIGltcG9ydCBjb3JlIGFzIGNvbmZpZ19jb3JlX211bHRpYWxn
b3JpdGhtDQpmcm9tIHdjX3NpbS5tdWx0aWFsZ29yaXRobV9lcnJvcnMgaW1wb3J0IER5bmFt
aWNNdWx0aWFsZ29yaXRobUVycm9yLCBNdWx0aWFsZ29yaXRobUVycm9yDQpmcm9tIHdjX3Np
bS5zcGVjaWVzX3BvcHVsYXRpb25zIGltcG9ydCBUZW1wUG9wdWxhdGlvbnNMU1ANCmZyb20g
d2Nfc2ltLnN1Ym1vZGVscy5keW5hbWljX3N1Ym1vZGVsIGltcG9ydCBEeW5hbWljU3VibW9k
ZWwNCmZyb20gd2NfdXRpbHMudXRpbC5saXN0IGltcG9ydCBkZXRfZGVkdXBlDQoNCmNsYXNz
IE9kZVN1Ym1vZGVsKER5bmFtaWNTdWJtb2RlbCk6DQoNCiAgICBtZXNzYWdlc19zZW50ID0g
W21lc3NhZ2VfdHlwZXMuUnVuT2RlXQ0KDQogICAgZXZlbnRfaGFuZGxlcnMgPSBbKG1lc3Nh
Z2VfdHlwZXMuUnVuT2RlLCAnaGFuZGxlX1J1bk9kZV9tc2cnKV0NCg0KICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCBpZCwgZHluYW1pY19tb2RlbCwgcmVhY3Rpb25zLCBzcGVjaWVzLCBkeW5h
bWljX2NvbXBhcnRtZW50cywNCiAgICAgICAgICAgICAgICAgbG9jYWxfc3BlY2llc19wb3B1
bGF0aW9uLCBvZGVfdGltZV9zdGVwLCBvcHRpb25zPU5vbmUpOg0KDQogICAgICAgIGlmIG5v
dCBpc2luc3RhbmNlKG9kZV90aW1lX3N0ZXAsIChmbG9hdCwgaW50KSk6DQogICAgICAgICAg
ICByYWlzZSBNdWx0aWFsZ29yaXRobUVycm9yKGYiT2RlU3VibW9kZWwge3NlbGYuaWR9OiBv
ZGVfdGltZV9zdGVwIG11c3QgYmUgYSBudW1iZXIgYnV0IGlzICINCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZiJ7b2RlX3RpbWVfc3RlcH0iKQ0KICAgICAgICBp
ZiBvZGVfdGltZV9zdGVwIDw9IDA6DQogICAgICAgICAgICByYWlzZSBNdWx0aWFsZ29yaXRo
bUVycm9yKCJvZGVfdGltZV9zdGVwIG11c3QgYmUgcG9zaXRpdmUsIGJ1dCBpcyB7fSIuZm9y
bWF0KG9kZV90aW1lX3N0ZXApKQ0KICAgICAgICBzZWxmLm9kZV90aW1lX3N0ZXAgPSBvZGVf
dGltZV9zdGVwDQogICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMNCg0KICAgICAgICAj
IGxvZyBpbml0aWFsaXphdGlvbiBkYXRhDQogICAgICAgIHNlbGYubG9nX3dpdGhfdGltZSgi
aW5pdDogaWQ6IHt9Ii5mb3JtYXQoaWQpKQ0KICAgICAgICBzZWxmLmxvZ193aXRoX3RpbWUo
ImluaXQ6IHRpbWVfc3RlcDoge30iLmZvcm1hdChzdHIob2RlX3RpbWVfc3RlcCkpKQ0KDQog
ICAgICAgICMjIyBkRkJBIHNwZWNpZmljIGNvZGUgIyMjDQogICAgICAgICMgQUc6IGxldCdz
IHVzZSBsb3dlcl93aXRoX3VuZGVyIG5hbWluZyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzDQog
ICAgICAgICMgQUc6IHNlZSBodHRwczovL2dvb2dsZS5naXRodWIuaW8vc3R5bGVndWlkZS9w
eWd1aWRlLmh0bWwNCiAgICAgICAgc2VsZi5tZXRhYm9saXNtUHJvZHVjdGlvblJlYWN0aW9u
ID0gTm9uZQ0KICAgICAgICBzZWxmLmV4Y2hhbmdlZFNwZWNpZXMgPSBOb25lDQoNCiAgICAg
ICAgc2VsZi50aGVybW9keW5hbWljQm91bmRzID0gTm9uZQ0KICAgICAgICBzZWxmLmV4Y2hh
bmdlUmF0ZUJvdW5kcyA9IE5vbmUNCg0KICAgICAgICBzZWxmLmRlZmF1bHRPZGVCb3VuZCA9
IDFlMTUNCiAgICAgICAgIyMjIEFHOiBzaG91bGQgYmUgc2l6ZSBvZiAjIG9mIHJlYWN0aW9u
cywgSSBiZWxpZXZlDQogICAgICAgIHNlbGYucmVhY3Rpb25GbHV4ZXMgPSBucC56ZXJvcygw
KQ0KDQogICAgICAgIHNlbGYuc2V0X3VwX29kZV9zdWJtb2RlbCgpDQogICAgICAgIHNlbGYu
c2V0X3VwX29wdGltaXphdGlvbnMoKQ0KDQogICAgZGVmIHNldF91cF9vZGVfc3VibW9kZWwo
c2VsZik6DQogICAgICAgICIiIiBTZXQgdXAgYSBERkJBIHN1Ym1vZGVsLCBieSBjb252ZXJ0
aW5nIHRvIGEgbGluZWFyIHByb2dyYW1taW5nIG1hdHJpeCAiIiINCg0KICAgICAgICBvZGVf
c3BlY2llcyA9IFtdDQogICAgICAgIGZvciBpZHgsIHJ4biBpbiBlbnVtZXJhdGUoc2VsZi5y
ZWFjdGlvbnMpOg0KICAgICAgICAgICAgZm9yIHNwZWNpZXNfY29lZmZpY2llbnQgaW4gcnhu
LnBhcnRpY2lwYW50czoNCiAgICAgICAgICAgICAgICBzcGVjaWVzX2lkID0gc3BlY2llc19j
b2VmZmljaWVudC5zcGVjaWVzLmdlbl9pZCgpDQogICAgICAgICAgICAgICAgb2RlX3NwZWNp
ZXMuYXBwZW5kKHNwZWNpZXNfaWQpDQogICAgICAgIHNlbGYub2RlX3NwZWNpZXNfaWRzID0g
ZGV0X2RlZHVwZShvZGVfc3BlY2llcykNCg0KICAgICAgICAjIyMgZEZCQSBzcGVjaWZpYyBj
b2RlICMjIw0KICAgICAgICAjIEFHOiBUT0RPDQogICAgICAgICMgUmV1c2UgbXkgY29kZSB0
byBjb252ZXJ0IHJlYWN0aW9ucyB0byBjb252X29wdCB2YXJpYWJsZXMNCiAgICAgICAgIyBD
cmVhdGUgYSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyB2YXJpYWJsZXMgdG8gcmVhY3Rpb25zDQog
ICAgICAgICMgQ3JlYXRlIGEgZGljdGlvbmFyeSB0aGF0IG1hcHMgc3BlY2llcyB0byBhIGRp
Y3Rpb25hcnkgdGhhdCBtYXBzIHZhcmlhYmxlcyB0byBzcGVjaWVzIHN0b2ljaGlvbWV0cmlj
IGNvZWZmaWNpZW50DQogICAgICAgICMgUmV1c2UgbXkgY29kZSB0byBzZXQgdXAgdGhlIG9i
amVjdGl2ZSBmdW5jdGlvbiBpbiBjb252X29wdCBmb3JtYXQNCg0KICAgICAgICBzZWxmLnNj
aGVkdWxlX25leHRfRkJBX2FuYWx5c2lzKCkNCg0KICAgIGRlZiBzY2hlZHVsZV9uZXh0X29k
ZV9hbmFseXNpcyhzZWxmKToNCiAgICAgICAgIiIiIFNjaGVkdWxlIHRoZSBuZXh0IGFuYWx5
c2lzIGJ5IHRoaXMgRkJBIHN1Ym1vZGVsLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5z
ZW5kX2V2ZW50KHNlbGYub2RlX3RpbWVfc3RlcCwgc2VsZiwgbWVzc2FnZV90eXBlcy5SdW5P
ZGUoKSkNCg0KICAgIGRlZiBzZXRfdXBfb3B0aW1pemF0aW9ucyhzZWxmKToNCiAgICAgICAg
IiIiIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHByZS1jb21wdXRlIGFuZCBwcmUtYWxsb2Nh
dGUgc29tZSBkYXRhIHN0cnVjdHVyZXMgIiIiDQogICAgICAgICMgbWFrZSBmaXhlZCBzZXQg
b2Ygc3BlY2llcyBpZHMgdXNlZCBieSB0aGlzIE9kZVN1Ym1vZGVsDQogICAgICAgIHNlbGYu
b2RlX3NwZWNpZXNfaWRzX3NldCA9IHNldChzZWxmLm9kZV9zcGVjaWVzX2lkcykNCiAgICAg
ICAgIyBwcmUtYWxsb2NhdGUgZGljdCBvZiBhZGp1c3RtZW50cyB1c2VkIHRvIHBhc3MgY2hh
bmdlcyB0byBMb2NhbFNwZWNpZXNQb3B1bGF0aW9uDQogICAgICAgIHNlbGYuYWRqdXN0bWVu
dHMgPSB7c3BlY2llc19pZDogTm9uZSBmb3Igc3BlY2llc19pZCBpbiBzZWxmLm9kZV9zcGVj
aWVzX2lkc30NCiAgICAgICAgIyBwcmUtYWxsb2NhdGUgbnVtcHkgYXJyYXlzIGZvciBwb3B1
bGF0aW9ucw0KICAgICAgICBzZWxmLm51bV9zcGVjaWVzID0gbGVuKHNlbGYub2RlX3NwZWNp
ZXNfaWRzKQ0KICAgICAgICBzZWxmLnBvcHVsYXRpb25zID0gbnAuemVyb3Moc2VsZi5udW1f
c3BlY2llcykNCg0KICAgIGRlZiBjdXJyZW50X3NwZWNpZXNfcG9wdWxhdGlvbnMoc2VsZik6
DQogICAgICAgICIiIiBPYnRhaW4gdGhlIGN1cnJlbnQgcG9wdWxhdGlvbnMgb2Ygc3BlY2ll
cyBtb2RlbGVkIGJ5IHRoaXMgRkJBDQogICAgICAgIFRoZSBjdXJyZW50IHBvcHVsYXRpb25z
IGFyZSB3cml0dGVuIGludG8gYHNlbGYucG9wdWxhdGlvbnNgLg0KICAgICAgICAiIiINCiAg
ICAgICAgcG9wc19kaWN0ID0gc2VsZi5sb2NhbF9zcGVjaWVzX3BvcHVsYXRpb24ucmVhZChz
ZWxmLnRpbWUsIHNlbGYub2RlX3NwZWNpZXNfaWRzX3NldCwgcm91bmQ9RmFsc2UpDQogICAg
ICAgIGZvciBpZHgsIHNwZWNpZXNfaWQgaW4gZW51bWVyYXRlKHNlbGYub2RlX3NwZWNpZXNf
aWRzKToNCiAgICAgICAgICAgIHNlbGYucG9wdWxhdGlvbnNbaWR4XSA9IHBvcHNfZGljdFtz
cGVjaWVzX2lkXQ0KDQogICAgZGVmIHJ1bl9vZGVfc29sdmVyKHNlbGYpOg0KICAgICAgICAi
IiIgUnVuIHRoZSBGQkEgc29sdmVyIGZvciBvbmUgdGltZSBzdGVwICIiIg0KDQogICAgICAg
ICMjIyBkRkJBIHNwZWNpZmljIGNvZGUgIyMjDQogICAgICAgICMgQUc6IFRPRE8NCiAgICAg
ICAgIyBBRzogZG8gdGhlIGJvdW5kcyBjb21lIGZyb20gcmF0ZSBsYXdzPyBJIHRob3VnaHQg
dGhleSB3b3VsZCBjb21lIGZyb20gUmVhY3Rpb24gZmx1eCBib3VuZHMgaW4NCiAgICAgICAg
IyB3Y19sYW5nLmNvcmUuUmVhY3Rpb24uZmx1eF9taW4gYW5kIHdjX2xhbmcuY29yZS5SZWFj
dGlvbi5mbHV4X21heA0KICAgICAgICAjIEV2YWwgcmF0ZSBsYXdzIGFuZCBzZXQgYXMgYm91
bmRzDQogICAgICAgICMgU2V0IGJvdW5kcyBvZiBleGNoYW5nZSByZWFjdGlvbnMNCiAgICAg
ICAgIyBNYXhpbWl6ZSBvYmplY3RpdmUgZnVuY3Rpb24gYW5kIHJldHJpZXZlIHRoZSByZWFj
dGlvbiBmbHV4ZXMNCiAgICAgICAgIyBJZiBubyBzb2x1dGlvbiBpcyBmb3VuZCwgcmFpc2Ug
ZXJyb3INCg0KICAgICAgICBzZWxmLmN1cnJlbnRfc3BlY2llc19wb3B1bGF0aW9ucygpDQog
ICAgICAgICMgQ2FsY3VsYXRlIHRoZSBhZGp1c3RtZW50IGZvciBlYWNoIHNwZWNpZXMgYXMg
c3VtIG92ZXIgcmVhY3Rpb25zIG9mIHJlYWN0aW9uIGZsdXggKiBzdG9pY2hpb21ldHJ5IC8g
b2RlX3RpbWVfc3RlcA0KICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGFkanVzdG1lbnQgd2ls
bCBub3QgY2F1c2UgYSBzcGVjaWVzIHBvcHVsYXRpb24gdG8gYmVjb21lIG5lZ2F0aXZlDQog
ICAgICAgICMgQUc6IEkgdGhpbmsgdGhhdCBuZWdhdGl2ZSBwb3B1bGF0aW9ucyB3aWxsIG5l
ZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3INCiAgICAgICAgIyB0aGUgb25seSBvdGhlciBwb3Nz
aWJpbGl0eSB3b3VsZCBiZSB0byByZWR1Y2UgdGhlIHRpbWUgc3RlcCBzdWNoIHRoYXQgcG9w
dWxhdGlvbnMNCiAgICAgICAgIyBzdGF5IHBvc2l0aXZlLCBzdWJqZWN0IHRvIGEgbWluaW11
bSB0aW1lIHN0ZXANCiAgICAgICAgIyBJZiBpdCBiZWNvbWVzIG5lZ2F0aXZlLCB0aGVuIGNo
YW5nZSB0aGUgYWRqdXN0bWVudCBzbyB0aGF0IHRoZSBzcGVjaWVzIHBvcHVsYXRpb24gaXMg
emVybw0KDQogICAgICAgICMjIyBzdG9yZSByZXN1bHRzIGluIGxvY2FsX3NwZWNpZXNfcG9w
dWxhdGlvbiAjIyMNCiAgICAgICAgc2VsZi5sb2NhbF9zcGVjaWVzX3BvcHVsYXRpb24uYWRq
dXN0X2NvbnRpbnVvdXNseShzZWxmLnRpbWUsIHNlbGYuYWRqdXN0bWVudHMpDQoNCiAgICAg
ICAgIyBmbHVzaCBleHByZXNzaW9ucyB0aGF0IGRlcGVuZCBvbiBzcGVjaWVzIGFuZCByZWFj
dGlvbnMgbW9kZWxlZCBieSB0aGlzIEZCQSBzdWJtb2RlbCBmcm9tIGNhY2hlDQogICAgICAg
ICMgQUc6IHdlIGNhbiByZW5hbWUgIm9kZV9mbHVzaF9hZnRlcl9wb3B1bGF0aW9uc19jaGFu
Z2UiIHRvDQogICAgICAgICMgImNvbnRpbnVvdXNfc3VibW9kZWxfZmx1c2hfYWZ0ZXJfcG9w
dWxhdGlvbnNfY2hhbmdlIiBhbmQgdXNlIGl0IGJvdGggaGVyZSBhbmQgaW4gb2Rlcy5weQ0K
ICAgICAgICBzZWxmLmR5bmFtaWNfbW9kZWwub2RlX2ZsdXNoX2FmdGVyX3BvcHVsYXRpb25z
X2NoYW5nZShzZWxmLmlkKSAjIHdpbGwgYWRkIHRoaXMgbWV0aG9kIHRvIGR5bmFtaWNfY29t
cG9uZW50cy5weQ0KDQogICAgZGVmIGhhbmRsZV9SdW5PZGVfbXNnKHNlbGYpOg0KICAgICAg
ICAiIiIgSGFuZGxlIGFuIGV2ZW50IGNvbnRhaW5pbmcgYSBSdW5PZGUgbWVzc2FnZQ0KDQog
ICAgICAgIEFyZ3M6DQogICAgICAgICAgICBldmVudCAoOm9iajpgRXZlbnRgKTogYSBzaW11
bGF0aW9uIGV2ZW50DQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnJ1bl9vZGVfc29sdmVy
KCkNCiAgICAgICAgc2VsZi5zY2hlZHVsZV9uZXh0X29kZV9hbmFseXNpcygpICAgIA0K
--------------E5D15685A8D8411705950180
Content-Type: text/x-python-script; charset=UTF-8; x-mac-type="0"; x-mac-creator="0";
 name="dfba.py"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="dfba.py"

import conv_opt

from de_sim.simulation_object import SimulationObject
from wc_sim import message_types
from wc_sim.config import core as config_core_multialgorithm
from wc_sim.multialgorithm_errors import DynamicMultialgorithmError, MultialgorithmError
from wc_sim.species_populations import TempPopulationsLSP
from wc_sim.submodels.dynamic_submodel import DynamicSubmodel
from wc_utils.util.list import det_dedupe

class OdeSubmodel(DynamicSubmodel):

    messages_sent = [message_types.RunOde]

    event_handlers = [(message_types.RunOde, 'handle_RunOde_msg')]

    def __init__(self, id, dynamic_model, reactions, species, dynamic_compartments,
                 local_species_population, ode_time_step, options=None):

        if not isinstance(ode_time_step, (float, int)):
            raise MultialgorithmError(f"OdeSubmodel {self.id}: ode_time_step must be a number but is "
                                      f"{ode_time_step}")
        if ode_time_step <= 0:
            raise MultialgorithmError("ode_time_step must be positive, but is {}".format(ode_time_step))
        self.ode_time_step = ode_time_step
        self.options = options

        # log initialization data
        self.log_with_time("init: id: {}".format(id))
        self.log_with_time("init: time_step: {}".format(str(ode_time_step)))

        ### dFBA specific code ###
        # AG: let's use lower_with_under naming for instance variables
        # AG: see https://google.github.io/styleguide/pyguide.html
        self.metabolismProductionReaction = None
        self.exchangedSpecies = None

        self.thermodynamicBounds = None
        self.exchangeRateBounds = None

        self.defaultOdeBound = 1e15
        ### AG: should be size of # of reactions, I believe
        self.reactionFluxes = np.zeros(0)

        self.set_up_ode_submodel()
        self.set_up_optimizations()

    def set_up_ode_submodel(self):
        """ Set up a DFBA submodel, by converting to a linear programming matrix """

        ode_species = []
        for idx, rxn in enumerate(self.reactions):
            for species_coefficient in rxn.participants:
                species_id = species_coefficient.species.gen_id()
                ode_species.append(species_id)
        self.ode_species_ids = det_dedupe(ode_species)

        ### dFBA specific code ###
        # AG: TODO
        # Reuse my code to convert reactions to conv_opt variables
        # Create a dictionary that maps variables to reactions
        # Create a dictionary that maps species to a dictionary that maps variables to species stoichiometric coefficient
        # Reuse my code to set up the objective function in conv_opt format

        self.schedule_next_FBA_analysis()

    def schedule_next_ode_analysis(self):
        """ Schedule the next analysis by this FBA submodel.
        """
        self.send_event(self.ode_time_step, self, message_types.RunOde())

    def set_up_optimizations(self):
        """ To improve performance, pre-compute and pre-allocate some data structures """
        # make fixed set of species ids used by this OdeSubmodel
        self.ode_species_ids_set = set(self.ode_species_ids)
        # pre-allocate dict of adjustments used to pass changes to LocalSpeciesPopulation
        self.adjustments = {species_id: None for species_id in self.ode_species_ids}
        # pre-allocate numpy arrays for populations
        self.num_species = len(self.ode_species_ids)
        self.populations = np.zeros(self.num_species)

    def current_species_populations(self):
        """ Obtain the current populations of species modeled by this FBA
        The current populations are written into `self.populations`.
        """
        pops_dict = self.local_species_population.read(self.time, self.ode_species_ids_set, round=False)
        for idx, species_id in enumerate(self.ode_species_ids):
            self.populations[idx] = pops_dict[species_id]

    def run_ode_solver(self):
        """ Run the FBA solver for one time step """

        ### dFBA specific code ###
        # AG: TODO
        # AG: do the bounds come from rate laws? I thought they would come from Reaction flux bounds in
        # wc_lang.core.Reaction.flux_min and wc_lang.core.Reaction.flux_max
        # Eval rate laws and set as bounds
        # Set bounds of exchange reactions
        # Maximize objective function and retrieve the reaction fluxes
        # If no solution is found, raise error

        self.current_species_populations()
        # Calculate the adjustment for each species as sum over reactions of reaction flux * stoichiometry / ode_time_step
        # Check that the adjustment will not cause a species population to become negative
        # AG: I think that negative populations will need to generate an error
        # the only other possibility would be to reduce the time step such that populations
        # stay positive, subject to a minimum time step
        # If it becomes negative, then change the adjustment so that the species population is zero

        ### store results in local_species_population ###
        self.local_species_population.adjust_continuously(self.time, self.adjustments)

        # flush expressions that depend on species and reactions modeled by this FBA submodel from cache
        # AG: we can rename "ode_flush_after_populations_change" to
        # "continuous_submodel_flush_after_populations_change" and use it both here and in odes.py
        self.dynamic_model.ode_flush_after_populations_change(self.id) # will add this method to dynamic_components.py

    def handle_RunOde_msg(self):
        """ Handle an event containing a RunOde message

        Args:
            event (:obj:`Event`): a simulation event
        """
        self.run_ode_solver()
        self.schedule_next_ode_analysis()    

--------------E5D15685A8D8411705950180--




Acknowledgement sent to Arthur Goldberg <artgoldberg@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-grep@HIDDEN. Full text available.
Report forwarded to bug-grep@HIDDEN:
bug#42623; Package grep. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Mon, 21 Sep 2020 20:00:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.