
    *}j(                    F   d Z ddlmZ ddlZddlZddlZddlmZ ddlZ	ddl
Zddddd	d
ddddddddddddddddddddddddddd dd!Zd)d"Z	 	 	 	 	 	 	 	 d*d#Zd+d,d$Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-d%Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.d&Zd/d'Zed(k(  r e        yy)0zEIterative guided-normal denoising with shape and ornament safeguards.    )annotationsN)Path         g?g(\?g~jth?gMbP?)outer_iterationsnormal_iterationsvertex_iterationssigmastep	data_pullmax_pct   gQ?gRQ?g~jtX?gMb`?         gQ?=
ףp=?g-C6J?gMbp?
ףp=
?)r   r	   r
   r   r   r   r   ornament_lockH   g{Gz?gQ?g-C6*?gMb?gQ?)zcycle-gentlezcycle-balancedzcycle-strongzcycle-polishc                     t        j                         } | j                  dd       | j                  dd       | j                  ddt        t              t        t                     | j                         S )Nz--inputT)requiredz--outdirz
--variants+)nargsdefaultchoices)argparseArgumentParseradd_argumentlistVARIANTS
parse_args)parsers    0.runtime/model-denoise-research/cyclic_guided.pyr"   r"   :   sg    $$&F
	D1

T2
ChQUV^Q_`    c                   t        j                  | t         j                        }t        d      D ]A  }|t        j                  |d d |f   ||       j                  t         j                        z  }C |t        j                  d      z  S )Ndtyper   weights	minlength      @)npzerosfloat32rangebincountastype)vertex_countfaces
face_areasresultcorners        r$   vertex_area_weightsr8   B   ss     XXl"**5F( "++!V)jL

&
	 BJJsO##r%   c                   | dddf   }t        |j                               t        |j                               }}||z
  t        ||z
  d      z  }|t        j                  dd|      z  j                  t        j                        S )zEProtect the distinctive front knot while still allowing mild cleanup.N   g-q=r   Gz?)floatminmaxdm
smoothstepr2   r-   r/   )verticesstrengthyy_miny_maxnormalized_fronts         r$   ornament_protectionrG   M   sn    AA>5>5E	S%>>r}}T41ABBJJ2::VVr%   c	                   | j                         }	t        j                  |t        |d         z        }
t	        t        |d               D ]   }|	|d d df      |	|d d df      z   |	|d d df      z   t        j                  d      z  }t        j                  |	t        j                        }t	        d      D ]  }|d d |f   }t        j                  d	|||	|   z
        }||d d d f   z  }t	        d      D ]V  }|d d |fxx   t        j                  ||d d |f   t        |	      
      j                  t        j                        z  cc<   X  ||d d d f   z  }|dd|d d d f   z  z
  z  }|	t        j                  |d         |z  z   }||z
  }t        j                  d	||      }||d d d f   z  }||z
  }|t        j                  d      |z  z   }|t        j                  dt        |d         z
        z  }t        j                  j                  |d      }|t        j                  d|
t        j                  |t        j                         z        d d d f   z  }||z   }	# |	j                  t        j                        S )Nr   r
   r   r:      r,   r'   r   zij,ij->ir)         ?r;   r   g?r   axis)copyr-   r/   r<   r0   int
zeros_likeeinsumr1   lenr2   linalgnormminimummaximumr?   EPS)current_verticesoriginal_verticesr4   target_normalsoriginal_vertex_normals
protectioncountsconfigdiagonalrA   trust_	centroids
correctionr7   indicesresidual	projectedrL   proposeddisplacementnormal_amountnormal_parttangent_partlengths                            r$   project_current_verticesrl   V   s|     $$&HJJx%y(9"::;E3v1234 4U1a4[!HU1a4[$99HU1a4[<QQJJsO	 ]]82::>
Ah 		%FAvI&Gyy^YRYIZ=Z[H&!T')::Ia %1d7#r{{%ag.!(m( &$	%#%			% 	fQWo%
cD:ag#6666
bjj8:EE"33		*l<ST-ag0FF#k1"RZZ%5%DD

3vk/B)C#CDD15

3

62660J(JKAtGTT$|3748 ??2::&&r%   c	                ,   | j                         }	t        t        |d               D ]  }
t        j                  |	|      \  }}}t        j
                  |||t        |d         t        |d         |d      }t        |	| |||||||	      }	|
dz   dz  dk(  s|
dz   t        |d         k(  st        j                  j                  |	| z
  d	      }t        d
|
dz   dd|d    dt        j                  |d      dd|j                         d        |	S )Nr   r	   r   g)\(?)fixed_guidanceblendr:   r   r   rK   z  cycle 02d/z: p95=gffffff?z.7fz, max=)rM   r0   rN   r?   face_geometrydiffuse_normalsr<   rl   r-   rR   rS   printquantiler>   )rX   r4   adjacent_facesrn   rZ   r[   r\   r]   r^   rA   outerface_normalsr5   r`   rY   rg   s                   r$   denoise_variantry      sI    !%%'Hs6"4567 &(&6&6x&G#j!++*+,&/")
 ,#

 AI?a519F;M4N0O#O99>>(5F*FQ>OL519S/62D+E*F G{{<6s;6,BRBRBTUXAY[18 Or%   c                 	   t               } t        | j                        j                         }t        | j                        j                         }|j                  dd       t        j                  |      }t        j                  |d   t        j                        }t        j                  |d   t        j                        }t        t        j                  j                  |j                  d      |j                  d      z
              }t!        j"                  |t%        |            }|d   }|d	   }	|d
   }
t!        j&                  ||      \  }}}t!        j(                  ||||      }t!        j*                  |||ddd      }t!        j,                  |||	|
t%        |            \  }}|dk  }t        j.                  t%        |      t        j                        }t1        d      D ]I  }|t        j2                  |d d |f   t%        |            j5                  t        j                        z  }K t        j6                  |d      }t        |j9                  t        j:                              }t=        t!        j>                  ||            }t!        j@                  ||d         }t!        jB                  ||||||||||
      }tE        |      t%        |      t%        |      |d   |d i d}tG        jH                         }| jJ                  D ][  }tL        |   }t        j6                  |tO        |t        |jQ                  dd                        }d||
<   t        t        jR                  |dkD              |d<   tU        d| d       tW        |||||||||	      }t!        jX                  ||||      \  }}|| dz  } t        jZ                  | ||       t!        jB                  ||||||||||
      }!t        dd|!d   |d   z  z
  z        |!d <   t        dd|!d!   |d!   z  z
  z        |!d"<   |tE        |       |!|d#|d$   |<   tU        d| d%|!d"   d&d'|!d(   d)d*|!d+           ^ tG        jH                         |z
  |d,<   |d-z  j]                  t_        j`                  |d./      d01       tU        d2|d,   d3d4       y )5NT)parentsexist_okrA   r'   r4   r   rK   rv   adjacent_edgesboundary_vertices   g(\?r   )ro   g)\(?r   )r+   rJ   unique_edgesstats)inputrA   	trianglestopologybaseline%feature_protected_fraction_over_50pctvariantsr   r   g      ?r   [z
] startingz.npz)rA   r4   g      Y@smooth_region_normal_tv_rmsnormal_tv_improvement_pctreflection_field_rmsreflection_improvement_pct)r]   outputmetrics!reverted_vertices_for_flip_safetyr   z] reflection=z.2fz	% volume=volume_change_pctz.4fz% flips=flipped_faceselapsed_secondszcyclic-metrics.jsonrI   )indentzutf-8)encodingzDone in z.1fs)1r"   r   r   resolveoutdirmkdirr-   loadasarrayr/   int32r<   rR   rS   r>   r=   r?   build_topologyrQ   rr   vertex_normalsrs   feature_protectionr.   r0   r1   r2   rU   sumfloat64abssigned_volumemean_edge_lengthgeometry_metricsstrtimeperf_counterr   r!   rG   getmeanrt   ry   revert_unsafe_facessavez
write_textjsondumps)"argssourcer   datarX   r4   r^   r   rv   r}   r~   original_face_normalsr5   r`   rZ   rn   featureguide_distancesmooth_maskr\   r7   original_areaoriginal_volume	mean_edger   reportstartednamer]   r[   	candidaterevertedr   r   s"                                     r$   mainr      s   <D$**%%'F$++&&(F
LLL-776?D

4
#32::FJJtG}BHH5E
		(,,!,47H7L7LRS7L7TTUH   ,=(>?H./N./N !45+-+;+;<Mu+U(:q //5*.C ''z>2t4N !33G^ !4'KXXc+,BJJ?F( e"++eAvI.#>O:PQXXY[YcYcddeZZ$F*..rzz.:;M"**+<eDEO##$5x7OPI""H V)*ZW%15!F !G 8
$ZZ!5OT)J#K

 ),
$%:?GGJ$%;
67 	$z"###

	 !44y%1F
	8 TF$-'
)59%%!
 05S7#@AHMjDkkkl0
+, 16S7#9:XF\=]]]^1
,- &k19	$
z4  	v]7+G#H"M N1237x@X?Y[	
k8
r !% 1 1 3g =F##//

6!$w 0  
HV-.s31
56r%   __main__)returnzargparse.Namespace)r3   rN   r4   
np.ndarrayr5   r   r   r   )r   )rA   r   rB   r<   r   r   )rW   r   rX   r   r4   r   rY   r   rZ   r   r[   r   r\   r   r]   dict[str, float | int]r^   r<   r   r   )rX   r   r4   r   rv   r   rn   r   rZ   r   r[   r   r\   r   r]   r   r^   r<   r   r   )r   None)__doc__
__future__r   r   r   r   pathlibr   numpyr-   denoise_meshr?   r!   r"   r8   rG   rl   ry   r   __name__ r%   r$   <module>r      s   K "      
   	 	;'T$$($6@$$W)' )'!)' )' 	)'
 ()' )' )' #)' )' )'X(!(( ( 	(
 (( ( ( #( ( (Vx7v zF r%   