Code #1

Đôi khi “niềm vui” của một thằng coder chỉ là nhìn vào code của mình viết 1 năm trước, và thấy nó thật lạc hậu và tệ hại. Chẳng hạn thế này:

<pre>
function phenotypeFactor = constructSigmoidPhenotypeFactor(
        alleleWeights, geneCopyVarOneList, geneCopyVarTwoList, phenotypeVar)

phenotypeFactor = struct('var', [], 'card', [], 'val', []);


numAlleles = length(alleleWeights{1});
numPhenotype = 2;
numGenes = length(geneCopyVarOneList);

if (length(geneCopyVarTwoList) ~= numGenes)
    error('fcked');
end

phenotypeFactor.val = zeros(1, prod(phenotypeFactor.card));
%phenotypeFactor.var = vertcat(phenotypeVar, geneCopyVarOneList, geneCopyVarTwoList);
phenotypeFactor.var = [phenotypeVar, geneCopyVarOneList(:)', geneCopyVarTwoList(:)'];
phenotypeFactor.card = [numPhenotype, ...
    numAlleles*ones(1, 2*numGenes)];

idx = 1;
%s = 0;
for i=1:numAlleles              % alleles of Gene1Copy1  (Parent 1)
    % inherits allele i of gene 1 from parent 1
    for j=1:numAlleles          % alleles of Gene2Copy1  (Parent 1)
        % inherits allele j of gene 2 from parent 1
        for k=1:numAlleles      % alleles of Gene1Copy2  (Parent 2)
            % inherits allele k of gene 1 from parent 2
            for l=1:numAlleles  % alleles of Gene2Copy2  (Parent 2)

                % inherits allele l of gene 2 from parent 2

                % magic code, I don't know why :-s
                v = alleleWeights{2}(i) + alleleWeights{2}(k) + ...
                    alleleWeights{1}(j) + alleleWeights{1}(l);
                %v = alleleWeights{1}(i) + alleleWeights{1}(k) + ...
                %    alleleWeights{2}(j) + alleleWeights{2}(l);

                % prob of having trait
                v = computeSigmoid(v);
                phenotypeFactor.val(idx) = v;
                phenotypeFactor.val(idx+1) = 1-v;
                idx = idx + 2;
            end
        end
    end
end
</pre>

Và đây là code cho cùng mục đích, mới viết cách đây vài hôm. Trong lúc làm quên mất là năm ngoái mình đã  code rồi:

<pre>
function phenotypeFactor = constructSigmoidPhenotypeFactor(
        alleleWeights, geneCopyVarOneList, geneCopyVarTwoList, phenotypeVar)

phenotypeFactor = struct('var', [], 'card', [], 'val', []);

phenotypeFactor.var = [phenotypeVar geneCopyVarOneList(:)' geneCopyVarTwoList(:)'];
phenotypeFactor.card = [2 ...
            arrayfun(@(x) length(cell2mat(x)), alleleWeights) ...
            arrayfun(@(x) length(cell2mat(x)), alleleWeights)];
numGene = length(alleleWeights);
n = prod(phenotypeFactor.card);

A = IndexToAssignment(1:n, phenotypeFactor.card);
weights = arrayfun(@(x) repmat(cell2mat(x), n, 1), alleleWeights, 'UniformOutput', false);

v = computeWeightedSum(weights, A(:, 2:2+numGene-1)) ...
          + computeWeightedSum(weights, A(:, 2+numGene:end));
v = computeSigmoid(v);
v(2:2:end) = 1 - v(1:2:end);
phenotypeFactor.val = v;

end

function v = computeWeightedSum(weights, A)
    assert(length(weights) == size(A, 2));
    v = zeros(1, size(A, 1));
    for i=1:size(A, 2)
        v = v + weights{i}(sub2ind(size(weights{i}), 1:size(A, 1), A(:, i)'));
    end
end
</pre>

Cũng chưa chắc là code nào  tốt hơn, chỉ là code mới có vẻ “matlab-ist” hơn nhiều, và tổng quát hơn, mặc dù còn hơi ẩu và chưa optimize.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s